From 9febc8a8d4ae49209713cb4f1d8b5d41f6416787 Mon Sep 17 00:00:00 2001 From: Laurenz Stampfl Date: Fri, 30 Aug 2024 20:01:58 +0200 Subject: [PATCH] Add support for GIF --- Cargo.lock | 1 + Cargo.toml | 1 + assets/images/rgb8.gif | Bin 0 -> 5027 bytes assets/images/rgba8.gif | Bin 0 -> 5470 bytes assets/refs/image_rgb8_gif_ghostscript.png | Bin 0 -> 774 bytes assets/refs/image_rgb8_gif_mupdf.png | Bin 0 -> 717 bytes assets/refs/image_rgb8_gif_pdfbox.png | Bin 0 -> 717 bytes assets/refs/image_rgb8_gif_pdfium.png | Bin 0 -> 696 bytes assets/refs/image_rgb8_gif_pdfjs.png | Bin 0 -> 709 bytes assets/refs/image_rgb8_gif_poppler.png | Bin 0 -> 795 bytes assets/refs/image_rgb8_gif_quartz.png | Bin 0 -> 777 bytes assets/refs/image_rgba8_gif_ghostscript.png | Bin 0 -> 811 bytes assets/refs/image_rgba8_gif_mupdf.png | Bin 0 -> 754 bytes assets/refs/image_rgba8_gif_pdfbox.png | Bin 0 -> 754 bytes assets/refs/image_rgba8_gif_pdfium.png | Bin 0 -> 733 bytes assets/refs/image_rgba8_gif_pdfjs.png | Bin 0 -> 746 bytes assets/refs/image_rgba8_gif_poppler.png | Bin 0 -> 982 bytes assets/refs/image_rgba8_gif_quartz.png | Bin 0 -> 814 bytes src/object/image.rs | 24 +++++++++++++++++++- src/tests/mod.rs | 4 ++++ src/tests/visreg.rs | 21 ++++++++++++++++- 21 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 assets/images/rgb8.gif create mode 100644 assets/images/rgba8.gif create mode 100644 assets/refs/image_rgb8_gif_ghostscript.png create mode 100644 assets/refs/image_rgb8_gif_mupdf.png create mode 100644 assets/refs/image_rgb8_gif_pdfbox.png create mode 100644 assets/refs/image_rgb8_gif_pdfium.png create mode 100644 assets/refs/image_rgb8_gif_pdfjs.png create mode 100644 assets/refs/image_rgb8_gif_poppler.png create mode 100644 assets/refs/image_rgb8_gif_quartz.png create mode 100644 assets/refs/image_rgba8_gif_ghostscript.png create mode 100644 assets/refs/image_rgba8_gif_mupdf.png create mode 100644 assets/refs/image_rgba8_gif_pdfbox.png create mode 100644 assets/refs/image_rgba8_gif_pdfium.png create mode 100644 assets/refs/image_rgba8_gif_pdfjs.png create mode 100644 assets/refs/image_rgba8_gif_poppler.png create mode 100644 assets/refs/image_rgba8_gif_quartz.png diff --git a/Cargo.lock b/Cargo.lock index 8174ae79..a659abac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -612,6 +612,7 @@ dependencies = [ "flate2", "float-cmp", "fontdb", + "gif", "image 0.25.2", "krilla-macros", "miniz_oxide 0.8.0", diff --git a/Cargo.toml b/Cargo.toml index 242870fd..9f04698f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -67,6 +67,7 @@ yoke = { workspace = true } float-cmp = { workspace = true } zune-png = "0.4.10" zune-jpeg = "0.4.13" +gif = "0.13.1" [dev-dependencies] difference = { workspace = true } diff --git a/assets/images/rgb8.gif b/assets/images/rgb8.gif new file mode 100644 index 0000000000000000000000000000000000000000..b3c47795d2e4ff8d300a11b4125952c3f47d6cb0 GIT binary patch literal 5027 zcmeH^XHyeuw1r=6G!@W;bPFI|kL4iMf_fl;z0t8C(gdWp&`TPGP9PybXlaB%AR(bQ zflviSkfw;#hzdwEYOZJI{)7AVu6bs!J+o(hS=-FqRNvrn7w7^};D2>&dzZ+6tImJp zzYFY-3q^q)(O_2$*b@tc92`IZX(W(A0hvS~p9mC^fFc?w zC4-~M;8+S!Nd>BD;CMPv&j4B(;6xTUfdQv5;7m3+n*(%lKra^<{s9k+^T36Ca48>L zE&!Ja;A$Z-Edr2YU|tL?OThI~aGeNl{ecATQowx*ct8QxWx$38>}bHg95~Ryqd!yt zr%LdY0i3IVYc+6V0(U0xWC1T0c<~1|@MQyk4hXCR!Sx`d0faSz@Foz^2%?%mbPI@W z1#vAPp%uW}0pcYbnT6m!!x?o#ZzjFKMADW~pS^QzK5oW9@E1hl*K+8tCch@$Dzd;^Fe$@S>#7UI?M$i_Bvtjg@Arj4Wz(bsnuc+t6oN_I z4$&VwyKd&6hkpOS_3ONWH}L<|j9BZqu5ixdO|gkz$2GY#PVI3*YcDNjPTEyJZSgHZ zN^9LMz8bySZhlbBGDFqGw;dv-d?jv|&}y5R#9^a9d7n1Zee!3Ywnt5W{8#*t_Pydu zKCM?p52##?1418TVfz)&xxPvfYTGR?t#M6|A}Q3mQ+S`O&aD*CBD8b2$X-cFP%^^L zXht6QI7G8$d9@suaR{6)k$D&)q$c|~;aI7x6WT;g&N=IGshmq*w3@tIDWO!}qr62; z!IL#zs^Hxyq^{`Gag3`ROKk?@V_k<19E%zy{B z9?bOz_I|?wR*qro>sF6qr30;>pmaB^pQhgrw0VXL*syUe$_%u1r!qHepH~eB+IiKj zZ`i$PlMb@??a|$|_kVpq$RTh%VACOZCNsz}l*in3gsu$-rKOrBWIm0&wqxs4)E#+i z=NRiV?AcgH3)yG!PoD(OCAf!!dv1)gip=WEM<9G#m+_Y?| zM!L?>tAmj@UP~lt^h=Ygsx--SovCD0wK%>*tX~(@D z9EI1|FP&_b(HZ(m-rna8+6Qr8d%EP!^{aMxi_u#0?@+&yMh&4_H3#ToelBw`qvFTCr6N)oJ4X9%oLM&+BY_tl~q@ePT=W1UnO?cUm^+ zE%rX#7reAZ^I98$w>6%9mo&29e=LpXSUry6%t3_hOU=S{FYJpALC;k@(p7k256 z)3&gx3e6jV=g*GMc&S%2Z=-|EV(sQ)I;(3#`h#!39$(0EVKx!=hf>my^1Sx2+Fznw zoc(f_V@g@v<$hQ1HpOp(EYq5PX$kj`gZNd-T+QqAH$4W6-tBU;zKBms@~P&_jVWV{ z3YmSrjh5Jnb9%`>$DWaK7W;;UsNvA2M0rC+8_U}?rPZo<6GpTzut==tS_A{{5#&l{;0y_=4FkJ zTgbD;50&V!7R4oR)a2R+2_e~zmDCFO9%H8;_t;nWuvWrPCFUzC*_;=jl8m&OI4m5t z(DZl0&A2P7kK_hmt*Tltl9v6Z4<3_!X<4$G+EIVx5VOYQ@Wue@gE&D_7-G7Hmqdu( zQ{me#vu=L-iqdmYv#RT zt82*Ly(&5<-u3z)`YWa8v#Rbi_tljjX&K}7E_y-_2Ia>jih`le$8!)jVtx;1<>t;A z$+&kpqVM1~GBhqUkZ+Jb_SDQU23d^g*?LE$^NTE+o=iJ+qrZ)3*%pE zxKAEpAIiY4Jl9Z;w6X9KNfVKF>jbruB3UBYCBpJ`j%DjlICZ{8DDVsFTFNPwb358P5qKVi3{*>@t_Wk zGybXh6z^r~T>GXWE0a;Sk9>n@ILh+PVrfb*SrGLcAxnCt7Q@;$>UFj$bN47Q&b((X zsG$P)0Me%C3;oB~H}&ZI49YK!8%6S?O!o&Y_1*3dt}uor@1Ab@6<2{!!PzEH{Y8no z@A1sZV<`WLbY-Udmn5a!nFFZIP9^5zT>HvWo%dJ0Y-<|;@ z3LnI4g1f9u%YzoFkN9V-`(;Yb7KU3otnV0Y)j719nLIwZt+v%Bp7(@sHr(~~4ZQ{d z?He-ox$}&#RintpsU#EV;{7Ac;h}%&k(y;sj#_cp<4Iqmjf|aA-mphLJY_n?PQDi< zZgt*MD-WFZc(lJqmTT{(8qrebW+gs8b|G)|MHPQ)hqr!**_?0M%x7N5>PG#rsZVV@ z%3b=#?Pt67+F=TI~L$m@=pxb+jx5k)xzDQddqIs3lk$U*Z(n)D)Nre+fILk5x$ zuhTHUJVRi1mDz%Rc8FfYM>Ni60DXu_%UoU#J_wzPyTER+Iy{|)F&IeNA3#f=^bD5x z*|&SZpd+a9eclzhfy6z!wA8-kAn}R5n1re!o`r4R*R6ik@9$;F4W2>5^?lLh-wOy0 z-^=xW@sJzUWl6N%UzJ=;HKX-2$^@XGT$$pccla2Xn_AuiQW)i$1D*wBr zj6q)#I)LecU#^r0#~V2CJ>LJGK9(OcNYC47pet<@Wi~7zE@u8Jg8%B za;3$4Rq*Yh!>{m2LbA_xLZUCq1UOj*!7w3IGaoe)?Cvn7U5rn>3;uCb=B@mix{{hML0Y7&?lF)=P- zBd~~VVw3_Y)}kxc4uTSOLA`bjpNB%aM;W5Lg@pq4*ea zS~SKHma6NPNYzj9(}$<)Bd>{s9_WJM;HY5;dQBsxM+D`nfx>8{o0zA+Bq8r=z+yBI zg2lc7VDyG{%GPN1rS0s%#hgeHY~2du9tC&&|3k zntEh0?YwCEcuw9VCohhZb!R)}@Vhi)j?@L4{MO+7SaQ~F(G(?anh`mJw-7t%ns#L| zGsHZnP!xxh!z9Y(ZfwVGxfQH*rD~JY&CRncxo9LQMcq8(AsLftfUV?YSCI)jy9v9+ zGLKNw3=kPkix_8a#ANI-r*k znv|;NmhqU2!PsDP%y9}@*=}w{`w&HDnk5gB#gDa$N+CtgV#zMZbho7vGqECbO3s8R z@untG)12twUi>$baC#~CtVL<~QgUQ>$-jc7LYW^pId_sblJu2Cva={Y;ZA7e<~D1R zqY+sMO39V(Lg_JFPY%9MvmjlJlBq?}wjk7#b4T6s#t?b1Zi0` zQkODl6zail>Ra=?Rnda)Zqznpi3z2!6Pe4E&lixTgqF(kEy_4rG@3bW#*MZ&6#K&( zGsw;RfhageDY`3GdVi@%U5r58&UvGm_iZtMhEj|(FYs|E7l~0DC}ks9sdrjs<6<;T zEy8H$=Zn@LjdA~RX5|-tblsw%fBF2JJ zxkT+j()!#hT)4DBN=2=JTd`@uFt#n+kHw}Sa32=)ev%7RYO5se%CC(Pp4F1FZ7GZ& z)L!|rD1#~y1wvU!)rKMCUuvbXLgn08@nJ(^B9>fgNNu*Io(U_tgsrf$qbplh%kjz; z#;Xp5mEQ<0iW(zfLn+l*%9sVy!-M%<~-VO+I6n zLe(;^>0(_|uo3G9kFgUawcDt9h0>H1)_i@Ou>(gBH7sS@R(V>oabdMp{5ob>gM@vv zln(2lV#P;W#*bQJ#u)7!j}_m;Az9W@c%@mmhHpJhBG+0ppI58Z(V@0wQ%I(_2OE#8 z%~z=3)yod@Xw^Zr?&q~>C$`XxYF~ymuJN11p;G%2n^bz+ANN$>w5Q$fWtxRCe#%oi zYAbBSYhXMM!m{QewOWf$?;5Kx^ys+Q+bZ|DwpgKI!LkYTHt+cSQpvLQx=sfOwd@Gd zsc}G6YmC#&4QcvRrVonk$77n~7{6<&AFx$+ye^l$?I+4w=yi3IxW;vb=1p-rY;T8U z9RrovNhp(ML3`M_J+<{c^%FgfKYN-Lds~fr+wFThpuJtWz1{V_y%W9tKYL#(_6-^L Ty|M3m3+)@t?K>zX35@;+42f{W literal 0 HcmV?d00001 diff --git a/assets/images/rgba8.gif b/assets/images/rgba8.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a25673779e6055f040d69cf5059f955e9f3a6c3 GIT binary patch literal 5470 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 literal 0 HcmV?d00001 diff --git a/assets/refs/image_rgb8_gif_ghostscript.png b/assets/refs/image_rgb8_gif_ghostscript.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f7a2986d515a77af21e406f8d1ca23c550a142 GIT binary patch literal 774 zcmc(c`!Cf27{)&?tDLe_Yc*v%EzQ=&$Xc7Vh8=No=?ocNPZQBrjI+{=+>%R@TcIP7 zBG+82xy9sGt|3Ior6fh7A8I>&{T01?p7+`NZqK`Cd!uCbR@x$65uh!#mN*F7vcfeQ zLQji0Qy_?%pM#Z!+F%ySrW9{k(Yd5V>jWp#}VJTKvx+omIJrq~Z`MP5zvlUx; zdiyE-+rdS~eRO7}D!)3kl2d4kqSnx<$Rr|}aF6TBLuW{m0) zsy|XSO64%mN2nO0>;t6(6c1ALp29xz`^f7jx0jqAvfq)_MP@e{on&;N>?Ez7)OJ$d zlH5jeD~YYdw-DDtY%|eK#5580n#e{X8VIi^tbvevg6jyXC9sZwTCUaLU(J;&6fg08 zfscSnE?07?l8Y61Rp42Udl~0TaVtUo40$o9i#b)q$wFKUaVfw#kK=hb<{`^PmV@0B z>~gSqj5HhTY>qral7&Sk77sDY;BW?q9$=b|sgi?A4&28imHjCg-D97CyX;QFAcB=|NG{6Fv1rSjwJ}?m*_v6ki%!aoGbPOvR3QioUSB2QRg^4 zP_Bp5!yVR>T6&^Kb&^u4jwCKAKd_x|e}(s6@6Y>(_b>15qml*eaTGa=07t2>HkLW6sGTVf1ziB&aZTtX*bjQnWj-%#%LU;VT6WH)Q|FVnCfAw z2C4c;;hl>c(aY)BO9kK#s`S?G^ zKOetGNb~T`V|Ol+9K5sfeu$@*U0QZNz~eq18g^*devfTgY|X^|E}I4JurVFCbT*_R zPGx-x>u%$kj7u_WZ?Pr`=bNk&NMvOK%T+9k$0?qrH*i!Ux{iZ_g$fqLVIPZa3^vic z_LBV-URWWOcm;;{Pjze&;p${pr};5!HOM!Gx{1m|)b1%_X{uPdKj=^CnJ0xVCnHQp jqL$eIH%Wvosp7~X63^Ot%Ki3c3;U7!1V~D}<+1+&m677H literal 0 HcmV?d00001 diff --git a/assets/refs/image_rgb8_gif_pdfbox.png b/assets/refs/image_rgb8_gif_pdfbox.png new file mode 100644 index 0000000000000000000000000000000000000000..34fb66c82cce88bd7c822917de98a1e2291cd2e7 GIT binary patch literal 717 zcmc(c{ZGsR9LHZh3>{6Fv1rSjwJ}?m*_v6ki%!aoGbPOvR3QioUSB2QRg^4 zP_Bp5!yVR>T6&^Kb&^u4jwCKAKd_x|e}(s6@6Y>(_b>15qml*eaTGa=07t2>HkLW6sGTVf1ziB&aZTtX*bjQnWj-%#%LU;VT6WH)Q|FVnCfAw z2C4c;;hl>c(aY)BO9kK#s`S?G^ zKOetGNb~T`V|Ol+9K5sfeu$@*U0QZNz~eq18g^*devfTgY|X^|E}I4JurVFCbT*_R zPGx-x>u%$kj7u_WZ?Pr`=bNk&NMvOK%T+9k$0?qrH*i!Ux{iZ_g$fqLVIPZa3^vic z_LBV-URWWOcm;;{Pjze&;p${pr};5!HOM!Gx{1m|)b1%_X{uPdKj=^CnJ0xVCnHQp jqL$eIH%Wvosp7~X63^Ot%Ki3c3;U7!1V~D}<+1+&m677H literal 0 HcmV?d00001 diff --git a/assets/refs/image_rgb8_gif_pdfium.png b/assets/refs/image_rgb8_gif_pdfium.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca0f33e39505e43053d239eadef484d5c871316 GIT binary patch literal 696 zcmc(c>r2xC6owx!bQwt&L|_R<3!wD(%unq%p-yynbIQ&U%FmS)4z1-LZG_Cy2=r_;%_lNl#JoXpNL@sr6p#^xEH$MK8dX-1|Qm|<{+zDfGO zVxOY-8{MDjnV|CvT@KnEw0@#_l$J4?#<7lI{fK3h7sJ#IV;;o(f!ZNV13VqX*pJ~o z)qPaHL;n_?opL+cUdnnX?WXt*MV%COq3J-=j=BR?8wG9Tzb3DhycTj=P}<0{k=aZ} z6N)C%Uy^1e)j~=m$rchDNoXLxp11~L>$zG-jF~I7Tz<}_XIvC8alyoS6X%SaH4h>k-#4ptDU<$#v`T4ZI&N(n0=td!74NQ((6X6HjBMFbTR z^nd^jJ2Y&+kN-XV)ofF<^)6cq*qo2w9X1NwW_>Qcxva}UoXuJ#Yi{9_g?ARKZ?Y;A zuN$lsP_QC{<>@R-!!wPg*YQY2bdAL+EKFfRGVV#ZCgPI7t3cTw;e|C)Nnk`w|5V2& z5k8)7jq2}nPNRH7w6DkzrSemXrP*TX-pJooryrMlpNQ=}9KXc0#Jhlq26w}S}OwCMF^C&Y*Gwp|h_3f|d<@3JJ!}HSvZ?YoTUo3JJ0b+T8EJRT2 zzg^-aT&?O@u^L-MDJ2Q4>?fkGaH^<~prsf%2V0?jzUkuMM zGQ+?ugR}Ha(f^g6X?nlW^_lKTI=;|3LE8i^pJ*P%Hb&DpjUzOEq+yg7!_*8@JxKKj zs)n!(@N^J!KNasO@1yh`rni*zP}GC5m%?rgUF5$ZuY=r9^zG=|(6ys&C8w3_*JQPj zWh29e#){fXS~Dq4q&AWKlB7md4J6i+&_G;0v311M5?x1BEmv!ZtmaA;m!EU-85aaB zoVRe!!dWwC%tTZYUct$7PL!d1g0hsOr5rJFxP*fx94IEt$bKXHj3^3G7zlbqkb%Gg z z3oGR^-_XeZ>GsVcJY1aWb>HXhX642RPf2BR01_q|H zo-U3d6}R4AxfygTLE`vB@$B;Nyk9R>2i|M#`W+Rm{X{#ygL7t!aCHFxy!3yESvWWk z|1kj?1_KY~N*%Gcu9#1U^7sVCycAA4waeR`>~Uuv?Wo!&7+ zjeccUL)(rSB0r}l3AozrwmQ-7>QdQV*cD>u8yL4a=G5~P*Hw8YC)q0l?aw|Bm)BY5 zeKmR2eXpl`)BG1(8iy`_D!RFN)#ugQcRgS7?9tl%si*RV&c;TCYscr*nyvr)banY+ z%l#g2qp#1;tzG?0>1@B)TJ0mwNBS#fFRj=ebM@iFL$Wf*>UK6a->AR4;a=Unxb)p$ z+pd=V+GcwzAEf8$CC7_f4<+`>x+U_50fP^CIKEuO_M9%eiTvD<&-V{>-HL42g<5Ev$!}A~?8P zS~m!Yac~0#1jK*>3OYam2cURjBT)Ph6CD)}gj+uTJ1o`v=tspvzgKgQynO98cdl>w ztv7qBa>@)}-F*7z+^2O`yVsS^E5Cd*cW-xA`P{qb-*39*oZkO=ch~&d>RI$X?wzwLcqKHdCfbl`hC{Zg_1e-5y8$iUF>|CPSv0@WOeohp$aQBPMt Jmvv4FO#q9xN{0Xd literal 0 HcmV?d00001 diff --git a/assets/refs/image_rgb8_gif_quartz.png b/assets/refs/image_rgb8_gif_quartz.png new file mode 100644 index 0000000000000000000000000000000000000000..d79d8ab415dc21a59551336bd6b2e0fcd84492f8 GIT binary patch literal 777 zcmc(d{ZGsR9LHZhjNCM_nJqP$v$o6@W~`aj?NTS@mb5(IMkyOJ%(7PNNsp4As2o>` za@Cz4?qofwrLO2vB`K92NTQ_tz;?d04MrIkEWpIw6Ir^s=_(Jat zeP8MRM9&nRpXr*UeUjFXG>_3TPSXU9qcnb?VT|V^)QnI)MD=^BhS3l5bO_x5P6j0VGjk}>_g|rq@3?v&!Y9^tH z#3tfj5Z6dd1JU(FH4srxcpYK2gw_#K%e5MUtGQamm1kV4O TR(R~sU3y8GtCv(GQAGX$^v>(! literal 0 HcmV?d00001 diff --git a/assets/refs/image_rgba8_gif_ghostscript.png b/assets/refs/image_rgba8_gif_ghostscript.png new file mode 100644 index 0000000000000000000000000000000000000000..356a17c7c7528b5a39b8c382eed692baf4137adb GIT binary patch literal 811 zcmc(c{ZGsR9LHaWc}UIEJS=QyGGnyrnC+NxyVTLcjZn)&MifKq&SS&HNmo)yR7xJA zTu&;UtS8-4-HkjJosOa+VI}I9w)5>L{sXVQ-=FtBpC3NkXCIx?$HT$S(GGA>c*@rc z*)Z&}BZZn4wJlEwk!rn%Ow?jpbV_K(g?R?3VEmL}i%3hKAq>T8cYpPUgS*v7c7zAx zq4W}agd9|U})uml~M~O?%pOM)}`ZLm= zlKPaCCnTFmHj!i^v4Qvo;_8X1Beo9RW1?$`GNP^FjFHG1G}WA};zTtORUE72Xa$GM zQ9mTSj4(k44j9;PU~eg*rG(rkxP)EB>?|Va9zlg{Eo4gpf%ydF+q!tcOQ9y HEa>zfjz&84 literal 0 HcmV?d00001 diff --git a/assets/refs/image_rgba8_gif_mupdf.png b/assets/refs/image_rgba8_gif_mupdf.png new file mode 100644 index 0000000000000000000000000000000000000000..37c0f1c8839dbcea2a03b8e8e7d1475e299803e6 GIT binary patch literal 754 zcmc(c?N1B<9LGOL(}Qlp$ikM%OqMSTxqdNmo*-sKn`k zay_YZvYvEHb+?{X>U5MINNOeOP20J9#ed+l&-eR%{o7A2_1Y)2vaQ%KLnPpG(|v0<{A*Fr3Zc73?`U1Fk|4Sf!SHce=+f!kvT@^7@KEs znxSb1X3)>jH-YX4J(KiK(e;h)aXP-!IY!$U+OISXqZy%bl!hT1zMvlF?I1OSRO_k! zMAc_h1H9H#p`-jGWqp+NQ~ZIV9twI;_LARCUKhFV$?hPl6Gc0UHZt4EXeGUsv=&me zq-sdkkkm{j3|?xne2Fkb2?6GYt|?o&EYZSYp*+bs$gy(&S#g2LS=pvF1ljyU yqObkclfEy!!xnCY|3~~<%mshxw{yzTT5CiC2bpg57I%r>bg9J6%e7b>82Jb2<0yUr literal 0 HcmV?d00001 diff --git a/assets/refs/image_rgba8_gif_pdfbox.png b/assets/refs/image_rgba8_gif_pdfbox.png new file mode 100644 index 0000000000000000000000000000000000000000..37c0f1c8839dbcea2a03b8e8e7d1475e299803e6 GIT binary patch literal 754 zcmc(c?N1B<9LGOL(}Qlp$ikM%OqMSTxqdNmo*-sKn`k zay_YZvYvEHb+?{X>U5MINNOeOP20J9#ed+l&-eR%{o7A2_1Y)2vaQ%KLnPpG(|v0<{A*Fr3Zc73?`U1Fk|4Sf!SHce=+f!kvT@^7@KEs znxSb1X3)>jH-YX4J(KiK(e;h)aXP-!IY!$U+OISXqZy%bl!hT1zMvlF?I1OSRO_k! zMAc_h1H9H#p`-jGWqp+NQ~ZIV9twI;_LARCUKhFV$?hPl6Gc0UHZt4EXeGUsv=&me zq-sdkkkm{j3|?xne2Fkb2?6GYt|?o&EYZSYp*+bs$gy(&S#g2LS=pvF1ljyU yqObkclfEy!!xnCY|3~~<%mshxw{yzTT5CiC2bpg57I%r>bg9J6%e7b>82Jb2<0yUr literal 0 HcmV?d00001 diff --git a/assets/refs/image_rgba8_gif_pdfium.png b/assets/refs/image_rgba8_gif_pdfium.png new file mode 100644 index 0000000000000000000000000000000000000000..5a5bc5893a9f229eb95dca2d92eba4b4ad6e5a69 GIT binary patch literal 733 zcmc(c{ZGsR9LHZrQ(8B%(H6E$X4=}UnC+P5cBMmgBg*p7hIwerJS`f#>ZB{FR8->h zK)Ie&I$2M;rMg?sDs?(a4`59e5ug#R3DEmlh zFU5TneW0+L{BE>8IttyS<9^&Zq^c3!}V%HtGHIll{Z|f;G&?83p&p0I9JZua?ZTs zR2e5rIZ;CJOM;6zTFj9mf(kiYNMHenv>eoOK#L*|MJ_(i@yTWHGvqmV=irr%EDLES z(x-T6*r{R16C{t3WUwuRt&ea|!!4D~4{;TIfJ-tPli84j^L^GQvMvFqc-F?V<{qo# zaJ-9yU@R+RSfOTlH1^RfyMs6i+uJNvVXb0GBvuhD3P+?Ap2=KL&=#S3FV)-7k**$H!rq6?R6aX_$E~Eh;1ZBi?V@eEs+f<>bY6Rjd~*LxK>Me4OgqV{Dw6U2`ZXR;%c?T>Iv$2E>5?Ggj<2}~i#o-S2LgHB+$0`*oW3h{6#cgb3u)f7|C6-E-MPm`gl1M}fp;G39 zgSQFll}Yymgc~PKWwr`;8;gdpTECrB_9|tfmGeSHl3S=t)!x&RLb03Lpf`uw{X=4) w)0N|aFZ?1Ft}Ff{L9Ldezw|q}=IU*9Vv)1bxMs7b%(VEa%)?h&A_2BR01_tI1 zPZ!6Kid%248Rp$KkZ}L#zFhpolsSv9zkcyK^*kq6iC&Y~wjY0`T^5C`JP{%;`>9UY z^Wvfe`vXcRUzRxSn!7vv`De?{`>p>vUw^%|G1pq4DMS%oPEO3mHyGeAh{KdiHXM6i0~0ic(d9RmTb^ly1n8K7RFGm}#Hh zHrtbCtlLCaIBW}ErJ;}#%X2is#-`@r4y$kS^7%4_d#*5U%f0P4?d9XUk1tPO{$Jo) zb|^o8eC6@-6_(4z>)52$7B-ql`GgDo(p$6rqsgIFs%u`J-_XVPk|EP)YfET!MDi&k zxy0Uh!CSv(UtM9q&?42$k`>9nq|Ee+m{_#)=cUe%6n|$O|FvRCUt(|n`}}I2Y@0tH z+m3JeHKXn0pVz+EG+XXoTx#6lL9&aNZNs7t8S=;@JgxeSmdL~_}40DgV|38nz z@Vp39ud`6&s&%tm#oxc2?*Acj+XewK4(>!n9RaaJP7w+^Ev*|IB7g#oK=DINK=Bq< zpg0x*phDtw(nuk);}BN-;7{abTU%!RXPe(vzZcV9PklXII_32--p{>V#(8t{FL6)) z_pfL6v)Qsab{)|n(ru~xLbnFq*>!8jjWn4{f7Om|o4mm~E?H_)*5)MjpR=w$duVe1 zW?gqd+`C5!({D~I48Ivxc%6Os$@1B6SKqj6b?5($!&WwOdcDj9D=*AH zUVXpyT3zps{v|ikcV5d}{n0&h*1H9Kv(Fw2?y!djDrP8`woi4cm71Bhd8SIIv|H~a bm7i>%KlX7J1mEQYW>f}GS3j3^P6Wq literal 0 HcmV?d00001 diff --git a/assets/refs/image_rgba8_gif_quartz.png b/assets/refs/image_rgba8_gif_quartz.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3f26923607fbea39f5c6abde8492ff61d52f64 GIT binary patch literal 814 zcmc(c`%ldQ7{))Rn$l`wqb-?CX4-64jKwTxr^`W?CCYMXBcw4C7L9c|x=N*@5?v{$ zn@Y*L=`3|l>#kDiP`Z%RO4KiH$M^gq|AA-E^FHtGmv?WJn~S5dp_w6IEOnB&3$E14 zKv#%q;in1(69u?CiYab4pA?EczFyLE&dyi~xdEaGKlHRKg3JVgPNvS^jxtksIoA%W z5;v9z%L=!{9`+h7nAI?+;ircAc_x1`^_#H;#uu1aWO$a5S%&6N&(S}{;17DI>6@YZ z8$FYBey3}K_6b_P(maZ4jHYoKM`-+lVwAVT)DBalrsfmXpQ#+;wVH}S%0E)pPssqq zA1Lajpci=``90)yllz|RPO`el=pdt=^bXS6NNppfmE;zZRV1oNP!gvkwwdTAVw#A0 zM`R=63SoWQ1dEaKP@hxvWh$6|I5 zQ-Lw8jb=?0t0OUqWK{&l;TYa!r3`%;E5gtVMJEJNu=bma-rhR}>yt_jcmxhkt4oc8 z?Tqvq0%~3N&X`8Y;ted9$`fq-t*Q>57Z=#t$lF^q{wDt*-qYgxY0np~K})xS|0BFw i^+n4VFtg5SF;dxzEM Option { + let mut decoder = gif::DecodeOptions::new(); + decoder.set_color_output(gif::ColorOutput::RGBA); + let mut decoder = decoder.read_info(data).ok()?; + let first_frame = decoder.read_next_frame().ok()??; + + let size = Size::from_wh(first_frame.width as f32, first_frame.height as f32)?; + + let (image_data, mask_data, bits_per_component) = + handle_u8_image(first_frame.buffer.to_vec(), ColorSpace::RGBA); + + Some(Self(Arc::new(Prehashed::new(Repr { + image_data, + mask_data, + is_dct_encoded: false, + bits_per_component, + image_color_space: ImageColorspace::Rgb, + size: SizeWrapper(size), + })))) + } + pub fn size(&self) -> Size { self.0.size.0 } @@ -142,7 +164,7 @@ impl Object for Image { let image_stream = if self.0.is_dct_encoded { FilterStream::new_from_dct_encoded(&self.0.image_data, &sc.serialize_settings) - } else { + } else { FilterStream::new_from_binary_data(&self.0.image_data, &sc.serialize_settings) }; diff --git a/src/tests/mod.rs b/src/tests/mod.rs index dee681e6..1711f603 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -92,6 +92,10 @@ pub fn load_jpg_image(name: &str) -> Image { Image::from_jpeg(&std::fs::read(ASSETS_PATH.join("images").join(name)).unwrap()).unwrap() } +pub fn load_gif_image(name: &str) -> Image { + Image::from_gif(&std::fs::read(ASSETS_PATH.join("images").join(name)).unwrap()).unwrap() +} + fn write_snapshot_to_store(name: &str, content: &[u8]) { let mut path = STORE_PATH.clone().join("snapshots"); let _ = std::fs::create_dir_all(&path); diff --git a/src/tests/visreg.rs b/src/tests/visreg.rs index 312c2485..fe6483b5 100644 --- a/src/tests/visreg.rs +++ b/src/tests/visreg.rs @@ -3,7 +3,10 @@ use crate::rgb::Rgb; use crate::stream::Glyph; use crate::surface::Surface; use crate::tests::manual::all_glyphs_to_pdf; -use crate::tests::{load_png_image, COLR_TEST_GLYPHS, NOTO_COLOR_EMOJI, NOTO_SANS, TWITTER_COLOR_EMOJI, load_jpg_image}; +use crate::tests::{ + load_gif_image, load_jpg_image, load_png_image, COLR_TEST_GLYPHS, NOTO_COLOR_EMOJI, NOTO_SANS, + TWITTER_COLOR_EMOJI, +}; use crate::util::SliceExt; use crate::{rgb, Fill, LinearGradient, Paint, SpreadMethod, Stop}; use cosmic_text::{Attrs, Buffer, FontSystem, Metrics, Shaping}; @@ -150,6 +153,12 @@ fn jpg_image_impl(surface: &mut Surface, name: &str) { surface.draw_image(image, size); } +fn gif_image_impl(surface: &mut Surface, name: &str) { + let image = load_gif_image(name); + let size = image.size(); + surface.draw_image(image, size); +} + #[visreg(all)] fn image_luma8_png(surface: &mut Surface) { png_image_impl(surface, "luma8.png"); @@ -189,3 +198,13 @@ fn image_luma8_jpg(surface: &mut Surface) { fn image_rgb8_jpg(surface: &mut Surface) { jpg_image_impl(surface, "rgb8.jpg"); } + +#[visreg(all)] +fn image_rgb8_gif(surface: &mut Surface) { + gif_image_impl(surface, "rgb8.gif"); +} + +#[visreg(all)] +fn image_rgba8_gif(surface: &mut Surface) { + gif_image_impl(surface, "rgba8.gif"); +}