From 7ec530578386ddd40b61bd80574c7f18e76c82b7 Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Sat, 25 Apr 2015 14:33:46 +0200 Subject: [PATCH] better transparent gif support --- lib/gif.jar | Bin 25468 -> 25871 bytes .../flash/exporters/FrameExporter.java | 1 - .../net/weiner/kevin/AnimatedGifEncoder.java | 88 ++++++++++++------ libsrc/gif/src/net/weiner/kevin/NeuQuant.java | 28 +++--- src/com/jpexs/decompiler/flash/gui/Main.java | 7 +- src/com/jpexs/decompiler/flash/gui/View.java | 14 ++- 6 files changed, 87 insertions(+), 51 deletions(-) diff --git a/lib/gif.jar b/lib/gif.jar index ec517a4831ae130ae1f4324dc6230601f77d7cdb..a9b48c4376a647368c6d6e020289befed07748df 100644 GIT binary patch delta 9278 zcmZ`<33ycH)qc;N<<3lQR+#L22!Y8$011L&4FLj*$fgm&1PC-NVHdQOfeKm|1bP(< zXhGV)xZqYGSh1*G&|1^buhne%=3ThDj)bHdlhWXo}} zCQtNuLqGsHxqO?|*LZFDw!wE8?EkS);pe4K2i?-<)+ z4*%q?d_aGF?UX@1?Jb3A(W<$Nn^&$p{>@`Y0SuJd5E^hSi1Bz@!7~ber{K7PXBGTj z!3hP=DfokeKPq@$!3*9|g+K@|;-wJI$IA*{331|81+OVMso-@5Z-kN z%fz4cq_;zO2Y*rUu7bbn*n0}z_l|xB(B20M{uaRBb>D|3{$b*y5c=Tb5X$h04t{Fl zvk)rqxq>eg{8RUQsdJ};_*W~w3gKV)Uj=6r{M#cWgkt@*iL=^%qaYR%h_EL{NIc>- z#TUYG@$(!p0}>#H5;P?gLY*WiutJh3NeYrpNiikWuFkryM`CN+yq2{s^Cq{hZCSih zV9XqS;H#_+V)>VKjx^Y7a!Ty)n?=dS(nTiL=yseXQS3cAH%pq`FSlk=4?$vcTl3

E{dMv1Rg zm+9cu%h>c-v!ZoX%eWQI%f8b(w{F#n#r11f*{yk}qjNCV!bO;5;bKg*Fj>JR3Z`JH zh08J1!WH^COTla%yHY`uf@VxKC2UE$WLT0ZS(aoI;6~hJ;XyoP;dX4d@TlJKn1Wv@ zIH=&Tg2ype>^Ji>22aCuQ_?KS!9q)NIVE{IKLeLqXjCvkFTW5INw9GZW6vMbY~d;V z%C0G>O`L;YS(qdF7B=HnJ6e!GaE=sMQYb~16ibPP%XIHv{KS-=mh|F7rBpHPt)NUn zAIY-MCKMFwF?}tGNVzE$mQ+fWCHU|skb#0++bYZ|X=qzz$$2u!!V_31NSIVV zZED@9$@K%Os`&z`5#-q48=RA^#|^gRe91SZhb2Sws-bd$pv1mAgTKPxNP|7UsJGuY zXL0k~MF(yw8Y#)%J`N|%J~Kx*P=4%ZimRjJX#;>Xc$Ez7d6g1QOSU;JIp?%wp3{U#E$QpDB&gGpBu-1(IxV^Ev}Cl?lGjd4b^}pfNR~STO?5Q!36DDk(AIOBtF8U z47BL|HAv(~3GwJlJ5!D%RH6s^Art+PhYQdf!)QrH@M{#;)^VgBBQXy1xyy2K!UBAU zUxHRFjN@Am4=(@`BRSWnCAB?@Wa8L)D{YQWPJz{jZ`PC2-PQ4vxDSg+1!_1JyJy-` z+Or|3CwLTZqUj-=?T{}>UFkX`)OknrN7FBp>4C-bLld$ftww?}X2@ z-#d(5YbTN;ZA6DQ~87|B$n{ab!D+v4cKlCuL$6&cmJb z4tJpzKc*b)p$zOpve9lfPaju1$*(NsozjCZeRIiS?=( z8>0BWOHh2ueR}S+E@IZY+HnxMDHpUOj}y7=$Y&GU;n1941tiTyo?2I{s9(9NWQ7Wf zx-=+9373K@Dnke1CeU^O?TDH*yFnV^1X|-1THh@E5`{QQ=lldW{F+;y!T|h=R6K?u zcpAg;45|1#`sU;G5YJK>PB?@rB=Q5|v4V4l_9HLn821ySY9e@9IQEZIA z|56^H8`DY>Zr_2VNLq18H~s6bJ+Hx!lSsuI&c&_@rgd^74V!R%{5lULmE9XU^?L@d zaP&LJyB9uhZ6ul#H!JQ1YEXf{lj$FVfeJ0f$K5VT?7SoqKj^MhCNH6bi@)SPUZI>+ zUGVRq0dpkU`$&X$l|*t6p%+I=h(IWk8kLbcco4nZZ+xoLG<#N;mPe?dz!}<(e^bEE zq9?u~n_?)UW$hyds>OrB;zO=yQ1`Sih)oS76Q&h(LS%nuT8 zB|vHU({XKftZ=!?Ra$8~db^4k$-SIbTZJl(_BN+es2oH|aj&GoFFg^EFcKvlX_ARd zI`SOJLat;ZpZ;78Uj*JLa*0oePL+1zTuP;$&I+pHNLxbOdFMN6@FS{4n|+MnqphN>gjfhbf6ed`*;grRzBc9ZK)c=M-x!FJ&;K zFTxTb+T|#bD)g2Llu0G}O23Y0P+huSQQi59YMLaQh#6F+u2=Mg5#u$^Bciyi;}u>o zGIC#GJWB~A)1|Wf=&)S>cZNrD9}iHkkD#KlTO)iE1xJd+XZKuf}vXn_e|S zg<)UV+~ywhWF&?6SG)e%sPTDf{9%9m!fa=cf8b7p!u}fHJ_I-VdGk9QHjdGzE6t5| z^jE)60ju%vLu1%y>_$S^w=JrlR^;axz!f!qPmSrR34{YgxV$_ZsHzEugDIH~dZ}2y z7b#u`#lmnP>?djg-t%(U+`(`m?C1GiIF2z%F8BRze zUXhtNC0F2GnT?O68K24={IASKOy)_Fv`DJVX8<@yiew?f%SBQlZI00FrvdAW%qZ@l zM*0|H_s5Ue^V5^3(Rodz`58k)>(1_=H_@J-Ih%)WO?z*5_F~i_-5bOglrvoypf{zm3`C`51r9qp+fV@5$~zLV<=+JEUy-#C$nPb9r zPvl@DifC$#{R|NX4kI{kIKiMAFU2;krbb1q=xAIf!scEq&DD``fSezwGCQv(sOoUe zNGR;pA$xpfZ!ztql_gG$GlgaYvYNth6@s#s0&z8Z$Ti54@6slH4~23qm3kfeOO&bM zdQ6uMXp!$@tz3t7vJqQk6XoH0+#x@}PPq|x$xRL)Z{u^36tV8@s{aOBUk4M^Z!KGQg3wcCsJBB@p;q4fqOCIJGt|xYV$!!#&+YyrONRd0JygQiP z@5Bh%g$B737s_tTlsyg~rcmh5CyyUyDCT3_pGdMjLc$Q`S)KHqjh{P_nvWTz`b2|_ zn&$XK4}+gcIKVM4^B#|*Cq9RkK^WigW|2}(F;C^Dd6c9+T%=BZjs1SV{2Y(52O&?b zXV^ZN-ddk}{@^ah^9SvM>g*`rK9XZfEM01PxK8`=s7~81+clcFKxjwh9*XF_bes3n z@9amZJb;KigbH~WRq}HTk^>mVNNO9cRj+7QG`M%V1o@Z*`Gmyyl*Z~a6wBu%#upeM|HM%F5~JmGxBKhj1nGW1OD%CS z*oCB$N^XC}fxjYk%SA`qF*?-)?b>GsSxJ=Z+LBt*M5U)L!9e0=Fg*v zQkSDqb^rLqIY`G5N2-)3%r4K;xzItRox>Scdg3U}B3X5R(Gk?e&Bm2ZkX%S~st;q# zh2`upZmU-%amnH&(v-$bBY;99=-}g~0!48wGAT*FWF~X2xUxQ@x7w!%RyuEV&q;=5 zq#(yg?RHLX{2b8WKIy!sJ3(1$ies;dq0%#-87d9h*u9$9BDb9Qj@w4oZZsIBe9)!d zPL5$@AatdXi41n~jO zg54%2YP%3+8?Y7cJswcKm}yJ2-;8WuSPNUh>E#A}eO-A&a3Uc3Ux zs@g>$n1qWh`eOFBV4ar!uD3K7v{)G785VL>+u4noW91+GnPS4czNi;AYsZlP(dTePmKW)KkTH*-J@$qTF?| z`XIN6_5e|NkkQFQJnvx?vh7Vj*@xb6ARXQiTKERmYa3Z4Xyw>as9opZ> z)qjwKACVv*)0%uzOGW#bSAWLqKF9OC{8fC(EvNa#zf9mXd2q&|&oYL70~nAj=41WL zD<7fJX}u(`ugmaDa9w-`%-~%r1-MfwCoDc>aP>o%WJQ%UTagfBbi-h-S*3y=h)s+O zoe^@KB#Vy~bRTm>!VT^IbLF)EXJuv@vuj`Xiz=L(dc@au+#M#0)G1{O!?myYJPlax zw^vSiz4V1FE1c+GTvd}CPSyzBTsu6R?B<&6*LeAna*e%W>I?%@?c-A`43yemO)ZY@ zi&eQMQswdmmYX1cN`i@G7C`g)XPsV>KwoR2QWEL&k{Iy(O)NNUVWHu6$-^GW$30Sr15$(|Qi5aB3(rY!yvU6HWvRd$60KwgSH%pj zAI?a%u)fdCZJ^|_s9!9Dq>82bL9Eo*$^}v{!)3gTkc(ubOqS7dsnp3_86!(Lvr5Lw zH8M`Fl?K@)6Xb5T`?&HxW{#>f$0-m$q};Ah?oqBfdXL(P)6=39!Cx~2$mW|c_We+1%)i#nnEz~1a&QYCMngz3?Z9h z^der1Uq4C~QtY!SJVRwUmRYqTAbdd^H)a#|Xzpx$$)UFp@0600YP_;<8sj&=NV4&`KesDj3z zEJk{CKb*_r*HRW+m|m%wm^NdeYbG9JPz#yG6yi!oY)y>V<{(|>F_dgUxy;9TvVb+S zR;GIkDMd>#iK+QiSxQM-jwV^b^lv5qn6nzonKG`GHCQieDOFeFCZ>$rm@@u|DdU|a z&0eO6`$(*ZWfLAH`JRv;MDbg>8PCWqtPyO+3$g{T%T~N4+bCr=K9t+=IrEw`vYmB; zJH#tHBtdpcn(X4A&F+)}+3QG)=9aazno-i;Puh=Wx~I%MkAZ-iks!_Tg81y~%sk!M zhiRgt?lh#h!>zEVQlx|~cBF^_7kes2%zdasDmz}%$BNr=AN6Jf#{#5XHmlSsCr#w` zE?6;ozJv}&@fbaogJoTV_SnYMistTIWZ)5_Rr~g~7;|GCvqv?iSN-P(O60fh;a%6! zc&l69)L1-Ft%Va%$nuaPLCf_g%GfEE z8{T4}<l~$7hbYAUipx52cW>=b9hwIp)V1bIngF9iW;iKYi}gjyE?^ z;G@gDk%IxI25+(|uBNV%e)DGb63}Ena7D&~PF6d@lNe*nli0y&S8S-*`e%|`&d@Tj zJoaB^)t*@0H>xahjKQD7>+)ICosc2jv6Y`wKE5Ci{>hB(OX~e;hi)3lfKf{a5ym){ zQqOTC870D)P9luyB*K`u4GvIAZ*{!9S0hioms!dN-k8Llr|j6Qw;deTF*t$YgV*pQ zz|$v z{gAUkCpsHpv#UkG*BqOYz{6kSpX#zHoK4*RU6?VdaR-k%qE3YzQ1if`u-VRQ%FK<+ zj60{|fy{7>38=H+lBUcuXF=CyGU9fA8Q4B~q8L3r9sfDU-r6*T|2xNiwrQmPC!ECQ zYHda|57OqU=2~qIHV@Y3qvm1SRLq&0bngGpu{Y0Y(3#ifPL7cOK^lgJHWCkQ62Fhn8+S*0ivARsHUR9sw8(AL55bpcia z4jecGu`PnPgV&(ET_|L44K2KMv!`=WWydCz&@=RA9yu<@`QKP2G^ z<2>FF5Cjg?Zw~jc9762e^hW-!LtgU^A0ZrLU6uhqB4F!Kv@Mb7Zcr<`N>j!Uz@HXC2@UDXQbnSfw zA1L@x!AIT^&j336SixU{_^aaiB!Eu?_*)1ud=^3ve6EXM1n^}Dz3_Jh#}s^}-+Zlm z{|Moq_=eyd{7a|*;}Iw)gYazt|EuG73jQ6!aeS|{A3{h70wN&{6^kgu6BMfAZSe)f zAHqlpC8Mid~U)h2>jdUm7US^)Fqps&VlOfi+``VLO+$qs?LF)X*m1CDQ%x^~$wF`>7+gtPU0{)fD8=6)u zwfE-zD?ShN!x)dBg)tHJVVtR85+;W+6X%36OCK8)%+|Fz3g#+kM14Rq!V-}#Vd*N- zuyiB9RrqBX)9~{!?o+%sC}>fzSHT_y4=8vX=F=I!cGN>Vp$MCqls-Pxi9v%;4o@9q{4X(8h7UcJx zCplrsmAtUzOF9^a_9FX*|6e`t43W^n!NK}w(7vec%7;*l*d5z0QT(q(=EWLRmeg`TidHkr! zlj?>~7}c*=AF?Mo_O*qD(Rsp$zLFh~w6OHk)BDQ+`(WYUWQ4uDsI28^(GanFl=O;^ zrN07Q;Z?Rd^D5_Nq{_@l5t)(NGb0sfM(WUvl&l%46f;tqW~4yPNRgP4vNa>sZboVz zi1R>d-z?Ao%t#wBBhA2!v;>abA)qM{p3A3OU~vYFh&>8QZZE8uwHKb4XD_@8e6b9{ zW8S^+$I=6P5zyVBZY0IH7}8mCEIqV0j_|`oV_^YdKZFTONKy|5g-WENH@cuNGBFfI z7>;t(p(jRhWelq6_NP*23;9LZAq9)Dm`{QwXmZIM1rKopDY2X@BPmV4K`QC%I532` z?oK6!X$Dg_=WQ1gzr%TCo<51C?KpqNcl4`J&Ni}?L%tND$8eC!5%eT49Vv+}q|`Y$ zL+v<2SY~i8*RSG`Bw}Cj)7U*f#=e}`R}lO8KY@K^2X+Vf`MAIp#}Jovf2@KUQ^e$7 zB_A>zT>&4~b;9azr`eASX^kp}Rk+AOCNc8r<+n>J4pE_d;M)qHXScVO)8ws4i&eBD zjlb!w$k5{=u~u~9Z&&VzwxAoQ(O7GolRfZkqlL7hJAX6zo29R8HB0(hwpvSQ7yRQr zwYj@_dKx8rE^=I%&!lMrHj){PQg9P@Z=uY$q8PW*Vt$PZ+(tXvPK#;AVC=vU?4%9d zLHpT-Gvc_LVeuZi&b^EsyBQAeC-R4g{s9W+K?>jzBaj$bT|gmSj7yA)m$Zv!2`=T= zO4LkTMvt+eicLcxS&pNtltsn`uv(oZjy102)PB@XX2$l!+r(Dmc+DQY-Yz4572J|>Z z7T?cT4j>B$QHbADUVq>RPxF(f=#7Uk0Ed|^pQX&6qwhVB)9?c0(~C?ZFVSO;P-L$d z@f4Duey(`bH)guxNoJ-|p@|+5Q!nEjeaxafi<*Fa}wlK;WTlPMzk)kw~yBB3# zDJ20RhR9)YUEG5*=NZRzn*lPp!|7vmPNGJt(8k0=lky@PL?40Fn|n{WYkEw zT@^gNo!DCZ$`Gq-S99jrrw^XA%vA7uCQ_x`ez8YpJV_ljHx?;x#mSDp#d3eaV6K)F zVHnP7w2*=_z)+D>07u44ce z7QuP(P7V}>$Dg3NdIH!Gz($51*J!T6CZ(4WZlxt?0P4e-vkyI{??Y^Q#iQW=J(UZJ zl}=MxtMW|xF*g>|Oj$cO#ae<(WgM3DMpXKc?7k?G0VtDxD3|`|Ayw^cly_pIPdgiZ zuo>5rFpK`v5eB-#O7I+q3A>F6ua->?6LOT+79bNJk=%IE{+b;B;@Vj5V?p}!KJ=Q- z)uJ4N@T2HGK33U^KJ;-BP6@9Dy2ASWhNQW4Ezx$iF(@4GFHaA=2I2KU2XdD4z_Sn=z2$)Nz`eI86CGVqj(ri zE?`zsG#cph;Y$#+k7g<~(c9>$-=X$<_(ZX(^b@$iaVE){cg^DOjT=` zvsHiPEJsvT0i%pMCYS_wlT6Tv-z&}!kYHt)Y8Knp%#LpO5bV4`y1d%jI4T1b$y0zP zN;|@Wrp6i5HM;Zplp*SzrOilJ1(h`;m>1lR-up0!o*Q>Ud+<>V9_-EXw&K*mzASaq zh{q$XsF@baVrYt}dk|G^D~24v&{hm%KJV}oC(vHZ0DB42c5*@{WAOcyqsPcG z3DyrhMWli#*v?TQ47fCJ5B~!e+Nbo*&$gaM$W!B~-GzX+#-{=aZZqjFXfNxV9VfrT zxu$X{bPE~}#}3X$u=0RhL#w=&7I__0#zqv&Ce{a=8E%W(xo;%rwk3+lF$1(V?E@jW~u zsZhGS{62?}y{mF;FYcF>Jv>ILhpUcC-LcGJEM#x*ml+SNIf17#`U2!$@^l|PZ8!P4 zpL{*QT=EbD+asuAi8fO98M?zf4fGqw2{e{?VO5<-2|H^?_Ea9r8NSo!1XALzkTYYBxP#}lt`p=@bJlBb!wv^UcAZ+VhGOpvOWYj78 z^dft2|4i=)Rtxr#{$1lnQtt5`$2u~3nKF5W@_3a|=QZm2b;{!n^pihfu)K*8%!3`B z9D}{-jjqtn{rYs?5ia3x5T4he=CA@86N1|UOXV*1V4x4_n2JXry4%su^;l- z4_GsOY>v~iHIE*m89?o&uX}I~8;Dk8PO26*N8ck)<9Xx+GvV!qOVZhttbSj#4Mx`eRG|56ub76$>@+=DZUyN* zZ8I%toyGM2iGJIuOqPEmbPhY5?wsVw5AEW#=s|7b%x@uo9M^5Ie=R@ zUOy&>fqtT{Y*)}6vU`jvj+$0AfV(~ML?U54DS&%g8ppgTypS0>cA&?aG1gu=wwzD5 zj{TMQmH@`tWvAzd+AiW`kv;YFDR#^02jy=2{Bh?8r(luZUQN_XsFX7?QSa0UCUYgP zKBsU4E(^1;ULR)8B3PzxU!i~@NiW#!oN!jlvifhOd?MNLGEF-pk(g)V;TWRs^?FAz z&E7PAdt5JgMzi+;bDozmJcUPe!$yi^Gc)0Byd2q18*XN+yOVX#?YthjgWuoDD1R5P z3wE&uy@%QKcIMXmcf1H_mwa2ELJPtb0QhZ;rAl z(>iX=;!LlOfT-5Eby@+<4qy(G2Jmk-*Fr8E4doyHY@&GVstE;gUoRGmURu)=6%X-C zkGZj`CL3Uu@iRn+8Jwdui$acNyjMJ#H;VmvwK$0GIF{Fm)9DZkxON_!SY_ZeCjL}f zfKub(TYZ??vdKyXM!FP&vUiyBqsJn8ta7Edo9B{eiwBG)Lj71-VL$VO)(La$;}bGv zT1#|d7coM=jp7CV$kz^&&S%-)KgXA!XL0fZg@1%)&CBe6U*V0^YfLb&QyfQ#_$ZHf zi|Tuu6uiS5p?7)cd%T@`pUU`vtGYfq|7yUAh zCpkHcV?63BqJ0)`ur2)yzQNb{7bX1-1^%rO#!?nt{n#=s=COYEHxC0BPf>YL9 zv#EOis0AdrZB}Rx0kvbZR?vBk%g(B=^Q!yi1ib<*~_OC z#~&tg$2<>HreMz&9pTwTKoPRs0WZylQefMxlVKJ79agvTRdFk+TiLh_! zN^giF&T+kDv5;m_#xA*;UGm-Rl3Umz?~@`Nl486dC*c+8f!8F4KeOoibf)ygx4elC z@Gd$-`bZw{l8bqd+)JwXU$xZ8Kp7>2zOi@)w`O-XtoxsI1ADdUSl0e3!r4?vqI0N1q@~*aWQAfl-@epUVI$g zu$&d_C0tCQC@Fyfdkp#a?<7iqUpPi~k0#FspAKKpu_Sj%6h^>>28@7U@?rnA+X!J6tU z)>JdmO=hv!Yhdv@n}zEf7OstKtL9N&=dyTRz;b;dtz$7}v9)TXL>9_YER$tyx0YiK zTdVc55?9Lw*en;~7FmT`FhIqc35NzLqumjjYdaVV%B}_4y9g=l9E7I3RE1Re1-W$a}Q1cku-{sQnEIic38SCWKE9w1zGTbw zcZP*yMs8Zefb~k75Js9Hs(73lMujl4T?ixFg)q_$&q4a|btdI|>Cq-ev65cP6ZNj? zE&KX&-ZwO?X8KoVyhIqZ_=ii&LYn18w&g>K9Gq=G)Q~yDwHaqmYZ_!m6Ko$~`A<}?$3S=G5pgX3jtz*37BZ;fXnue*Dir3g?d1 wokeqVz26LAi?p#Y$8N6n+h@-W7yn;9l(MNmcdV@$<#ts6nA^>N`7B-h59Zb9l>h($ diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FrameExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FrameExporter.java index 4b70d9108..5dde7f0ae 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FrameExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FrameExporter.java @@ -444,7 +444,6 @@ public class FrameExporter { AnimatedGifEncoder encoder = new AnimatedGifEncoder(); encoder.setRepeat(0); // repeat forever - encoder.setTransparent(new Color(0, 0, 0, 0)); encoder.start(file.getAbsolutePath()); encoder.setDelay(1000 / frameRate); while (images.hasNext()) { diff --git a/libsrc/gif/src/net/weiner/kevin/AnimatedGifEncoder.java b/libsrc/gif/src/net/weiner/kevin/AnimatedGifEncoder.java index 820846dd6..bbc08ca56 100644 --- a/libsrc/gif/src/net/weiner/kevin/AnimatedGifEncoder.java +++ b/libsrc/gif/src/net/weiner/kevin/AnimatedGifEncoder.java @@ -3,7 +3,7 @@ package net.weiner.kevin; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; -import java.awt.image.DataBufferByte; +import java.awt.image.DataBufferInt; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; @@ -40,7 +40,7 @@ public class AnimatedGifEncoder { protected Color transparent = null; // transparent color if given - protected int transIndex; // transparent index in color table + protected int transIndex = -1; // transparent index in color table protected int repeat = -1; // no repeat @@ -50,10 +50,6 @@ public class AnimatedGifEncoder { protected OutputStream out; - protected BufferedImage image; // current frame - - protected byte[] pixels; // BGR byte array from frame - protected byte[] indexedPixels; // converted frame indexed to palette protected int colorDepth; // number of bit planes @@ -153,9 +149,9 @@ public class AnimatedGifEncoder { // use first frame's size setSize(im.getWidth(), im.getHeight()); } - image = im; - getImagePixels(); // convert to correct format if necessary - analyzePixels(); // build color table & map pixels + + int[] pixels = getImagePixels(im); // convert to correct format if necessary + analyzePixels(pixels); // build color table & map pixels if (firstFrame) { writeLSD(); // logical screen descriptior writePalette(); // global color table @@ -199,10 +195,8 @@ public class AnimatedGifEncoder { } // reset for subsequent use - transIndex = 0; + transIndex = -1; out = null; - image = null; - pixels = null; indexedPixels = null; colorTab = null; closeStream = false; @@ -312,33 +306,62 @@ public class AnimatedGifEncoder { /** * Analyzes image colors and creates color map. */ - protected void analyzePixels() { - int len = pixels.length; - int nPix = len / 3; + protected void analyzePixels(int[] pixels) { + int nPix = pixels.length; + int len = nPix * 3; indexedPixels = new byte[nPix]; NeuQuant nq = new NeuQuant(pixels, len, sample); + // initialize quantizer colorTab = nq.process(); // create reduced palette - // convert map from BGR to RGB - for (int i = 0; i < colorTab.length; i += 3) { - byte temp = colorTab[i]; - colorTab[i] = colorTab[i + 2]; - colorTab[i + 2] = temp; - usedEntry[i / 3] = false; + + for (int i = 0; i < usedEntry.length; i++) { + usedEntry[i] = false; } + // map image pixels to new palette - int k = 0; for (int i = 0; i < nPix; i++) { - int index = nq.map(pixels[k++] & 0xff, pixels[k++] & 0xff, pixels[k++] & 0xff); + int pixel = pixels[i]; + int index = nq.map(pixel & 0xff, (pixel >> 8) & 0xff, (pixel >> 16) & 0xff); usedEntry[index] = true; indexedPixels[i] = (byte) index; } - pixels = null; colorDepth = 8; palSize = 7; + + int unusedIndex = -1; + for (int i = 0; i < usedEntry.length; i++) { + if (!usedEntry[i]) { + unusedIndex = i; + break; + } + } + + int transIdx; + // get closest match to transparent color if specified if (transparent != null) { transIndex = findClosest(transparent); + transIdx = transIndex; + } else { + if (unusedIndex != -1) { + transIdx = (byte) unusedIndex; + } else { + transIdx = findClosest(Color.black); + } + + boolean transp = false; + for (int i = 0; i < nPix; i++) { + int pixel = pixels[i]; + if (((pixel >> 24) & 0xff) < 0x80) { + transp = true; + indexedPixels[i] = (byte) transIdx; + } + } + + if (transp) { + transIndex = transIdx; + } } } @@ -373,19 +396,24 @@ public class AnimatedGifEncoder { /** * Extracts image pixels into byte array "pixels" + * + * @param image current frame + * @return ARGB int array from frame */ - protected void getImagePixels() { + protected int[] getImagePixels(BufferedImage image) { int w = image.getWidth(); int h = image.getHeight(); int type = image.getType(); - if ((w != width) || (h != height) || (type != BufferedImage.TYPE_3BYTE_BGR)) { + if ((w != width) || (h != height) || (type != BufferedImage.TYPE_INT_ARGB)) { // create new image with right size/format - BufferedImage temp = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + BufferedImage temp = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = temp.createGraphics(); g.drawImage(image, 0, 0, null); image = temp; } - pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); + + int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); + return pixels; } /** @@ -396,7 +424,7 @@ public class AnimatedGifEncoder { out.write(0xf9); // GCE label out.write(4); // data block size int transp, disp; - if (transparent == null) { + if (transIndex == -1) { transp = 0; disp = 0; // dispose = no action } else { @@ -415,7 +443,7 @@ public class AnimatedGifEncoder { transp); // 8 transparency flag writeShort(delay); // delay x 1/100 sec - out.write(transIndex); // transparent color index + out.write(transIndex == -1 ? 0 : transIndex); // transparent color index out.write(0); // block terminator } diff --git a/libsrc/gif/src/net/weiner/kevin/NeuQuant.java b/libsrc/gif/src/net/weiner/kevin/NeuQuant.java index 0209b4557..6f69f0cc0 100644 --- a/libsrc/gif/src/net/weiner/kevin/NeuQuant.java +++ b/libsrc/gif/src/net/weiner/kevin/NeuQuant.java @@ -120,7 +120,7 @@ public class NeuQuant { /* * Types and Global Variables -------------------------- */ - protected byte[] thepicture; /* the input image itself */ + protected int[] thepicture; /* the input image itself */ protected int lengthcount; /* lengthcount = H*W*3 */ @@ -130,7 +130,6 @@ public class NeuQuant { // typedef int pixel[4]; /* BGRc */ - protected int[][] network; /* the network itself - [netsize][4] */ @@ -150,7 +149,7 @@ public class NeuQuant { * Initialise network in range (0,0,0) to (255,255,255) and set parameters * ----------------------------------------------------------------------- */ - public NeuQuant(byte[] thepic, int len, int sample) { + public NeuQuant(int[] thepic, int len, int sample) { int i; int[] p; @@ -179,9 +178,11 @@ public class NeuQuant { int k = 0; for (int i = 0; i < netsize; i++) { int j = index[i]; - map[k++] = (byte) (network[j][0]); - map[k++] = (byte) (network[j][1]); + + // convert map from BGR to RGB map[k++] = (byte) (network[j][2]); + map[k++] = (byte) (network[j][1]); + map[k++] = (byte) (network[j][0]); } return map; } @@ -244,6 +245,7 @@ public class NeuQuant { netindex[previouscol] = (startpos + maxnetpos) >> 1; for (j = previouscol + 1; j < 256; j++) { netindex[j] = maxnetpos; /* really 256 */ + } } @@ -254,7 +256,7 @@ public class NeuQuant { int i, j, b, g, r; int radius, rad, alpha, step, delta, samplepixels; - byte[] p; + int[] p; int pix, lim; if (lengthcount < minpicturebytes) { @@ -277,7 +279,7 @@ public class NeuQuant { radpower[i] = alpha * (((rad * rad - i * i) * radbias) / (rad * rad)); } - // fprintf(stderr,"beginning 1D learning: initial radius=%d\n", rad); + // fprintf(stderr,"beginning 1D learning: initial radius=%d\n", rad); if (lengthcount < minpicturebytes) { step = 3; } else if ((lengthcount % prime1) != 0) { @@ -296,14 +298,16 @@ public class NeuQuant { i = 0; while (i < samplepixels) { - b = (p[pix + 0] & 0xff) << netbiasshift; - g = (p[pix + 1] & 0xff) << netbiasshift; - r = (p[pix + 2] & 0xff) << netbiasshift; + int pixel = p[pix / 3]; + b = (pixel & 0xff) << netbiasshift; + g = ((pixel >> 8) & 0xff) << netbiasshift; + r = ((pixel >> 16) & 0xff) << netbiasshift; j = contest(b, g, r); altersingle(alpha, j, b, g, r); if (rad != 0) { alterneigh(rad, j, b, g, r); /* alter neighbours */ + } pix += step; @@ -327,7 +331,7 @@ public class NeuQuant { } } } - // fprintf(stderr,"finished 1D learning: final alpha=%f + // fprintf(stderr,"finished 1D learning: final alpha=%f // !\n",((float)alpha)/initalpha); } @@ -356,6 +360,7 @@ public class NeuQuant { if (dist >= bestd) { i = netsize; /* stop iter */ + } else { i++; if (dist < 0) { @@ -385,6 +390,7 @@ public class NeuQuant { if (dist >= bestd) { j = -1; /* stop iter */ + } else { j--; if (dist < 0) { diff --git a/src/com/jpexs/decompiler/flash/gui/Main.java b/src/com/jpexs/decompiler/flash/gui/Main.java index 5646ed290..0e788a588 100644 --- a/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/src/com/jpexs/decompiler/flash/gui/Main.java @@ -32,6 +32,7 @@ import com.jpexs.decompiler.flash.gui.proxy.ProxyFrame; import com.jpexs.decompiler.flash.helpers.SWFDecompilerPlugin; import com.jpexs.decompiler.flash.tags.base.FontTag; import com.jpexs.decompiler.flash.treeitems.SWFList; +import com.jpexs.decompiler.flash.treeitems.TreeItem; import com.jpexs.helpers.Cache; import com.jpexs.helpers.CancellableWorker; import com.jpexs.helpers.Helper; @@ -92,6 +93,7 @@ import javax.swing.SwingWorker; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.filechooser.FileFilter; +import javax.swing.tree.TreePath; /** * Main executable class @@ -1101,7 +1103,10 @@ public class Main { String pathStr = filesToOpen[filesToOpen.length - 1]; if (pathStr.length() > 0) { String[] path = pathStr.split("\\|"); - View.selectTreeNode(mainFrame.getPanel().tagTree, Arrays.asList(path)); + + MainPanel mainPanel = mainFrame.getPanel(); + TreePath tp = View.getTreePathByPathStrings(mainPanel.tagTree, Arrays.asList(path)); + mainPanel.setTagTreeSelectedNode((TreeItem) tp.getLastPathComponent()); } }); } diff --git a/src/com/jpexs/decompiler/flash/gui/View.java b/src/com/jpexs/decompiler/flash/gui/View.java index f893e2941..e931c2955 100644 --- a/src/com/jpexs/decompiler/flash/gui/View.java +++ b/src/com/jpexs/decompiler/flash/gui/View.java @@ -531,6 +531,12 @@ public class View { } private static TreePath expandTreeNode(JTree tree, List pathAsStringList) { + TreePath tp = getTreePathByPathStrings(tree, pathAsStringList); + tree.expandPath(tp); + return tp; + } + + public static TreePath getTreePathByPathStrings(JTree tree, List pathAsStringList) { TreeModel model = tree.getModel(); Object node = model.getRoot(); @@ -558,17 +564,9 @@ public class View { } TreePath tp = new TreePath(path.toArray(new Object[path.size()])); - tree.expandPath(tp); return tp; } - public static void selectTreeNode(JTree tree, List pathAsStringList) { - TreePath tp = expandTreeNode(tree, pathAsStringList); - if (tp != null) { - tree.setSelectionPath(tp); - } - } - public static void expandTreeNodes(JTree tree, TreePath parent, boolean expand) { expandTreeNodesRecursive(tree, parent, expand); }