gmic-1.6.8/0000775000175000017500000000000012632021515012704 5ustar dtschumpdtschumpgmic-1.6.8/man/0000775000175000017500000000000012632021417013460 5ustar dtschumpdtschumpgmic-1.6.8/man/gmic.1.gz0000664000175000017500000016046212632021417015111 0ustar dtschumpdtschump!hVgmic.1kƑ(=3!9,;#5Ď$h!ߺ wd;9ZC?{zϿaœa}0Lҍ 0G&X6MaEKaQgd\Pz\roDq4aWS#ًϿyσ% z_`&.?\'7gZoi\}\G lmu80=|2w_2Z^fċ*Hȧ?c0x L jq-.5v{^q?Kv\ ;xB+X{xfΣ~ 9D8ҷ+`^i| 6*p4 n UlKÌ!"ʶkgDv9\AOnC쉛4gh9Xm: '&د@>A#aM.IlZ )C&jhI~NPEKXO2d]`O$h{c$.Haww]!%&2ᖆ7A)܊xKgo%猴pl(vi?݁pȥ}eU.j ^&Z+Cę-+m `I{`e@w 7-Mn*:TuMpek;J}ݖbtY%'|spBXTa!md&k!SzUY+!=ų >&vq$f1| _Ommma 0xřZ Zhg.G,# &yX8" mNۊ1v,p<͢]p2-0eݬXtEw­oE VnIo@)p;B Š# as.oUW2]taw\E`rw)ݭA#I ;OpaYKliW(f]303wNҙz'c_yM |~ؿ_1g"2{AFf\p4<1" {NLWG; amHvE7ȉ$c5U,>7抐=NWk{8ؕpc̚|*1^<;vqC;pN2jP\pNWK_(v&섭8w0`aO~3C$[[{++$Y3 !+a1&$"Gɒw5򀓊r>Ȍќ#ihgK0B= AA+{,8d<n*VaRͽh*YşT"T*{{,D~Dx@3@$_Cl+ ޼e ,#e3!Hp{7faXWDbv6|7W{૶ HpqNIE9hHǓ(Л eH#mQb"A$ [q>޽gF! $lB1-1m~wܣ 'F,+J5t1̧+`̀U$j$\?@c9B=~` *ڊ j+hpKtkє*O9K ]`Ý !n %"o؆4l4<[)anB]*9`q$eel "\%/eԯ"B 3U\7`r܋ C69I缫f" n^O@}?s4 n5~LX0B\u,2jaI3+_ү:Z 7oEo/}-״`܅ymOz>J@lm5@OF!B;/Tq 1ڎ3MN쉷k=}$ޞ>)֜0r\$[X h{OX}psQmtvԍbD [QKw`AgFV} %eR|_QwM.(Jȉ'8O*<#Ȍv10fX#tlA8kW 3tU^qFqtԑXy%2>G'd?SW8j:x;{fKXVw:,@E$T2E_ɹz%3sr=ѰuZ{hu-Q(_I _y' 2')MnzwX-C9Zd Jp2Go|M=8BөB]L !oKa 6?EqCA3/z*=]>$Od Ӿ4a zB 4ytu5Ydj H-|I/9EQ`HG lv@吿h7A"qm[\7! ͛R,;o!!XDlϒ\l2fq{5;(sDDC7+m˃#MG BXkj(tjn4p/[F"s rv0'uF`*c۱xjPgHp.,ū|>rƊujZ ~D1*&hYQkz'LI-ĭ/ϲ,ǝ"ߗǤۮ^'/h{uحE{%gQ@c7Le!OMH>xbO>)D"5 F.sQMI2A-xrrEGkUDyAZϏ:lBzaK! ePPޥ.le}Z)G+̵/9f,%1ujފe0C}`a%k1D^ ;p@ "cC%,x~i; eЏ Ao5vb&+tv(5U.Yt;fo\o-@f E4?G]JO3㕣KNT*0TѶJi 1p/K!'0zs'AAN- P REv`@| & *4}]Wp tSd\pXA6 +!Gw\JmGflW>EMl ܰ0/`ǁ3܀Cr-ܺoWy7Izti^ŒO.qo([5>\T]tGa&Xt$ F>3ήj˴ ufVCgiuORvO8ڟC`MթvÞ7CiV22.Bȧk5W֨gAkɼ-^OYJe`nqcɪzackʂ? hѹs# m4oTsQحq,џe` p$כ(e驽-* ,Tprm{.+3ndշ1 n鈓`&FC:Eld&4V-ɪ67XZA=<}0ɾ?v,kGM,TٲݔТ'9Z+1/-E[$2%詴Xm[𢒲U3*`z'l **sxL.VK2`Xh.^.$@q'',ra>S\D>uϤI!u18Hlju ghk 1_zx9ϢOUg M;|b}/][F":‚Q-UNb m+m`@jnrYrt8{$6׶F+?dsQ y)En,.%!N(, A}CMja+:NG?// IN(<:ɈbFQ"V.5vX}\qaKybZSAgTY~ms0i5GZ[HTp$!$/ƅ\#G||Ʒ1 *!G mk|M5f;EX&?o ]=jX{GC;$b#onnI; x;z(=%6 ps4{K7&Bh}jy܏ƥ֣m%IYF'`OvW|v%%zؐAmiW7v  A.H)|/v/P|{vMB\Rsnp^qۣ띬e`.8QLgZw$ 2@ J!l+G^(KC@ )9FΧjjE 2,A@˭e5ӠqNno_MCcpؓYFyz:=FL x6E;NV`(ezP038$h^3o>X(? s *} w>|OȽ=+l7H#ezaGc47[bϊt<-V6`U &Y nn$EBYpyfA,mtDgdobԴZN+hPi y^4!ȳEql(KG=0q`.)_xK얫p@9ceľdR#X%p>rc鴌t%@,PES2@&YHȜ:ZkT`#ڻ4J=cɰFTn%S"Di+e{v td+Nuښf~%TUЏ1ʬA ~jbY/F^i63)ʙz4c+])U*`Vʇu&1Z]rc)iGh^p mn*D?r(U=U`P`a>%ornH$DzUII2+` C`Rqt=?1;yMdQ"m:m/qpG|!hGZM8#>+A`[nƧXqj,)Ǟ?{|kE8cӝ9[qG>)1Qv6@r)Yy6d`~TXNP, ]\FL~SD ( Wvt|U$^]F}Ѵ4?*탷u|kf8t Ak6NѢ _@RVZǴ„Sk,Py;I[P+V -l]ˊ3R"#r0^s@w_DK Q?H}uɬL UǴ߽ѣکN/CPǥyxnxY})tbVI2.K5KU i:7Jj9Mkg2V"b6 Ef'K>#/|*&O0A*?lg n}%dTuVNz%yYP}seڃTɨk%ȕCQg]~uQrY=Zz͉AqTi28J2ZXQ%Հuo[ѭ4oY4igۓ^*Hzn4sSF`0"h7"G'QAhyOr"HȞA,o!V-\kW )ϝ&Yq]:(@D#+ج\k 2\A&'Fb{B:=Eg(> kvZ  \~C_;:)ftSUp}ZaV2 ;fVɤ_%iu>./%ۈ/٥aVi::ڊ艭(PJx E׻c3)ۓNHFpNUޔ=Ş e^YޙŢu`\f/CbKKƥ̺VO秎yJ&D+Hd kb8"jdڼn۸ؖp&v|AP"i۰L Pb# S*,N^fb"FλJ>C]o{Փ-nMTpt\W=nQqwhSG$\LT 1s+g@,KJ7mQCTYÉ}^$n&*?wlPIu$C'!~C_9rUy9BU\Ye#=oż.4*DFim,͛e9`Yx'C4)]ܝ{[(]&N[' IgܧR4EĽ+^fh}Êw/Qլy s8 Aijd4[/ƴR@]R>ww$/0qDk:P@.#X:8Y*P3zB8|z?=ugr9qV4n`+4;]DBMVf7zcf>nG?sYV|_4P<ɞ9[Z.vfBu(Nڛ[q.I}栠6}Yxk>ΟwpxWz_VGfX/2)f 6!l|awUUxQLyFRrT ]HÃd".)+5G[P?&o: o7Bv]IzH)`jgT-! c},G?B7|0z<~lүl;H^F^ݱHUWԷ/6۩v˪~nHF2kY9> T˞̞ޫ#Ik.Nv^#dmge $fS͵Q 2MXB;mLzokYK *a(#QI) Z8}+b_ 9=Sb4]O?qwT៊?Q.w%W࠵%8[U ~DeЉݻSVz1 U "*ď/=QoVc%XQ0UyMR\vkl"RC%˥dYnfMw鷫R2rPRTD2㱘_޹Ɏ@B7}lT=Do$ֻۤq'#\?\VN.T!Hio%QWVt2 ̟Ÿ:D{JdM t!fv"L,,̟ ҹyG)rPڥDbg FSg ҂Y1b(j*w;Jy߯9#Mp r2%)(L|KʭeLNJOu ?NG}b#k'"~bלuM)$Д4*`́?L{تg92s{ CطaŜMQ΍kz^2*D*_lCIAr^_޸@e+O 1+_3Q0Y2Bد'b"K}ոJo:)N_^Y+y|0I,d3YC:;%]q)zSMwHDS{LXR)ǂә:;N" a6H[eyg97{dP>IdY SJZ9.ɫ4hcXt9JW7toh%k6E#e\XP&u_9@݊.y;F2hȩsEϢv e`4^Y0h>>Xhcɣukt ySBOUD]F^ G[ ]|=:IރGͿM\=ڊ*,Hm5 ,%M]@y=,Kb<m X3%c2'>S҈-viϒ8OѝZAn\9-q̷ @#"<|Rڗp۶"Hn49%%BhǨUq8͙*7ؖخPzu,DmL_Gb*Y5OͪJ25=bqd^GAH,ù_fҎ|Xщh6JNغ F;BLF8V$q:(.l&[qxX3 uv3%[k+[WFCT F,;В0?Vh7ֱi/'x׎"~n $1$qAmJZomZk) ~Zfvjy&EXLR^=SC R;jlAb j,KtHod0,z9* tu40Fe0z`3ȏA~4 Ĩ`k:DҐ}/pb/<҃_6¥l dqT'3~{K_!A=6%]vFÁd3HDP5G.[3w M<|̧O>GQ猃 %!9&=Yx%Uw G!֡ZYrTocNNa*4Y˃c`6$b!i>ŷySgOGNxzrs^uN7'$,fV99s:zRCLh E )'Q١Sz󸻭erv0K 3a]*e 篟~F90ōԔy7|'N˿ѵ1k}՗p5!f#@ 6'0_GSRZVinSq!or\dMaé%.-42]7Y' 'DKq D [U*@JmJ皢H _{-tK`? PW'˘JH("8?)ŌBd{($ZEđtx{oߥGe.pϚln-*ƪVW+)QllŚsBj!ӮRS5tABĖ%fm-fU,ol}`:5!H#GQ{RT&֒]VBugPm9ֽ$iLj5Ř qe&AڰXMw)ɪeZBLj^M*'DӇS<ӿEF 붮1pnj&nڬpg]:(ۻYmeR./˵ЅrZ İ͹$Ii,IK&cPif) .oᲹNFi8g.B"ʏMT>1jx6ʈf7+U*I! gcXaH0 r%`n2+_UPR$ӳ&d.j`}ݨFέb%z$t/ڸ {6Q5{ M+r8 ;X6x_IfLD1 R+8-ʸ ,/ޡcQ)(|` ),*HAij7ƅa(8y+? ߟj=ULtpebLD Ä{yV f%fƴ6;6ea_MN4"/Pu`n.%dI0cvR^) ; 8\ȾK̝\$΢gjXZz W5:/9/ uF!t3|>(PPᖊ]$R.sr2^Wb`\@&׾įPZ]R)pecX~ o9,ɹSJA], O4 X+Γ\2̱"DER1$14d\t䚢UӺ̫ew.4K-lh9m^M1}vlr`=]vch56^1 Я>.p A 2zɍZFiHY.c>pD:ndV'֌& y8G|MLTJwDT97{ƥGKw'kvۦ|>%ue"'^QTfJ;_dH0D?|Q>QV-ޘ۝$NN46#e3Aʟsup0'hPHUzW׉y zud$bO}5vxi `JCUSrqub #'SSTR!5FX~-$S;uҞ|9<ԹB򹧪7TԐkHPO5v6'Zn[7;Whv̟a)~Tun6$͵Ǫ'v~pU>#bo|LDM,U\gT}QT $):fD,w)Ku َ TyY cvbqvEhP FϼJHr9߻}iZ="*P.z6Ia)]ᒈ<9t HS'Jzl~yߒoZZhةIl:Ev戮I f_zA*6ClrȊOz %L;@)5ђ:q,E뭇B'o(bjKpQ/`zJ# CR28CV0ZQ"xs;xrX",X\%*ʴpJ)4(U`^LU#ShGkHDXM,І(pDI1/ 3iMӊdyB*kc@&nGEir .hGP=.ʁHtH±Pe)Ыx-&ݳr`>yReꐻˊ,9A ֙aYx=11{h]>d(},[%0[ nB.R\x7([:XT R>}X~øK/yAmfcG3d" 6II pd}X&Z%qy:tW,-2L!!(5䡜p;ef@^+ x~%y _?܅M>YNLzRJ8kpg ;o;R] pwEĜݰ-BhdcB}4*mG =ddҊOm%]WV1\&UGU7n#xΊxZ (r#$!h֮,8WJs`ysVh#,5Fn<ia ܿQX-_(}ISE+5/'Iǒw&-FEaR˝ZsqkqJL#J`nJqߐ:@S:Ǹcx0:ΟX`M?GO_[j9 ]e=k'Ûl+yT}4Ք۬{ROs5*:N˨kv FqT$X^GUϳ) +Qq,&L SGR;5E(!(O2o.OeRK+ ÷9V΢1Wx3`$=GY5xzM^} s;mť -<mvv)%]d={s3~g2t)ƺn}އYAB{ŅQ(3-]) A[ .5ebq7\(7L4хV7>%l0kÔQ6I2>O 3z2ȵ9Fq[s>v,őW oJC6G`E9tO{ UT0]\:gW8 ؠg3t͒6Rcpa,s )RRY1g4l%UP/;RwCfIOqf *@&Z(s /IahkHJg>pSOU $Hrn0M nc\4,f!>).:G2DsCs;n[RrIY0ʫ)x7d`ZUJ+j';N}h4訞k^J.~U.n{KuX]P$\\,&F,[QdwxHz?v,kOO\ 玫p. 1':qwӡͪkUk ^nz]3"9Tޣy EmTجY!_5y|E,hJ4 (nEkræU"SC(z B$wc/ũer9.BNXݛl[KE5HdCA;vUPzPQsIAy,x¾ϼ$c'LP7: Yu &]I4Mb!Djٮp'[ޒ 3IޑhcW;v?oszZDv_S%onW2F_mt9(P}K`Hg#zA̅TtGãg˲U*Yk5q~-57ֶK4.24; 쌃vFh6 "&jwg4m3%N~/}sU=w¼eTjE6tw!$w/ﻫϽye_IMacϻJ@v|ڙbVA3lGT^L)cv+A/k齢w|5Zu Õ;gAX<~{ۍ+!#_<]l!>3[ *qJZcnuooϵѽ `^%h: 20ulMMYaXmn2ڶu{SrxJ;KiSZ4IZyrL[y)gyWs[o ev{Gfj_ٵ> ؂D9ߘ{?,/%>ْJEt@T0J`iS*nqb $ۋ' 6q2`@9鸏; zɅ.H-*/P P^`pmod[P^he\<6UmJ+Z2z[Uiږ &ʦ&2A9l*MtK(T%/8?R{A_&d#r{5biN,"eTtVdGjDagNZjygo;e0(=3m(0a# 8='68N'&nN!'sguDۯ T:9 ⪺vp3'%EYk+~ *d*b̀X6DEPB8 eh -8 Yޢu(xye*IKR fW-lm 8cJ# 2J3Iln-^ K`NnNl+(D}*`TYLޘ1kHl ~ahz=b.!RIA2Ƌ({cs719Tԓ;ZL$㑔$BJpY)cAQ$]4YY(3,'j Nw@Fdʳo.H> s gdߩe>{ϡ~PY&u-uOgX͍Th5˨ lW ƽeAZUzjruuCn< E4n.ݍ;nn) [C"}o h͇$I <{IaUcQ/Iկ-}$Q]YR8@:uy7Ús0=8;c bSS!v]$: cr &XT))-%!jv5n Sn.w4$XX_A7 Ob" n%#4{dLuSvWa%TLp""tYvw'w _E-R#Ovy,Ƙ m?_CJ֋Y56W%=ˉuRQЖ8)/Z֠J$G qǶViDlG],Yq{)b&5Q6bZŚ;Qɏ1*)n-5 rR/ip$EIV3pIJj}{PxǜFeQ3ay8T8A4lг9b%h|m\,9T|,TㄍbfuRyZS –G4zf \޴p dGzFC6$R {nBY0A0 V pyt[gNLrmb9zb9z$DS?;7,T|7I\enE+mE]]w$̧sܲS/)*v2wdXtfeީv[y{Gq GHZ9RDO-V;ESGKxXJZuѿlv%[pitvSyJSLI)%ذœQdwaOY[I=yW͕u)IҍK9\.2v,wN21?*IIg _d\Mkma|]hF!R07a罟!yY\eך9$~[oUvMF/v2+|%*)+LL%4Y@غϚrI!׬`x=`9ztήpRߙPu=)Kl-{h'lxBR奠'a,\QyÎ&W TU9mmTz!r?͂CaS5sϞO?}:*|[W7^<{b`Lm F1g3qr d8x8lzQ#S٧ϿGc3ǫ>eJNΟRN1WISf/tIaOo'0}rs7rq-iʨ5O*ܳ+[U/bY;[؀ב;AN`MVs% rԠ;Ȩ}?I}Y }E$.Uۋu=\Q/X`:.frj7+ {͚'Z5/sLJ2#ݔ8i@5e;}hVf\`lui\Bp#U^ T/l$*# t+w_>ԯZAmxPjdn}~yd3N+W_B7_W50bǣSE'z,:t1}´qm}G]6ByᕖNwpyvhWUڠi0h >>s|~^г0Ԭ(cpp#k sm֬yCElpq;P^V#e̡7N%TʐW֛]j?o10ILuQ3f'@i۹9PÅ4Zغ dW KM!26Œ@t9P$՝>Qq%#"Ckauk(-w+_5_5z}WP@kQ<곖ǒ.'r _%#w鰭K5e/.N]T:~+Ry* @iZC}~Gx0 }~:4m.44.sK=AF6G5E7[,O܁-LA NڗfF) QPF?^^ ^iz1)g$TK]G|2Pe:zR1,DfljdmjuAi:ɫamb;l~Fevc^5F(\z y>Y\*̲M.:Q %Zh 5V[C|). ƅLʙB/ɣy> i@9B.[$$+KM|l xI osw}li||uKľ ~cv ǡޟlC'3}ݍF鼂 ~v,[4-Jmѥ]Xpk[YW%ou3ٻV'd7+r,l=EF?L f&!Bvh1zT]svZmUp-U{/3{G͗S6RRňzYtc pm!9W;$C1rP`^RSqGPan`uX]=+OsŅ<-hտ_1gphš0cG0=ˈV[ˣzVjtH^KXBn[`M|8xysM)$0,NU }Q8JA\ zJw09Nn{_h'e! ^N~񇓏SQŻh 0E;c"+/t5K_ES Q5E6aguE%ocah;@o_b߅b*P&Ry`ݗM忏c˖sĹl6W;G%۽LjfÑdtH~"dcQDy'EZKXw\э6!iuFӊ ӘZ=0O r*vwxy)2 wYc F%e΋Ns,ļx&O'&wMۂ)΀L7>FQ݁7ڏ$st 0 (C3 nܝ_gr :\+%UYWz5I93ysRUy3 iY `~-Ktgx׆N 4)}ۙܭ4' 6zp')ITHHefD{tF8sOJ1q_M.;cGS^_RJjJuhƒΆ[yzLrfdp_i Z6䢒eplˆQn8Rd&۹u$U)I`d>Q&Lqo&r1[5 <n*:$0]e܃e9 g}wzxbUnîOL;{L2oV 1%7lv]CF}TlzÑ ai,Ȉ*fQ4 ׁ$CjvSkw/alǸV$-~XYK3*T/8W 3WA֒#\O"ث/N^s.da,eSM7`ֵu_S28n4 (P=F |_iUa.%+pD˕q%~Z#]C=&Bt(Xmp ;2էF#% ڹ`af < D..@b>Z…}E2)ҷz0 U . KkjFY]%8j5$Z̛7״)iqDE< `x֕be,Z]* dyASgPCdcMIeNVI\D z 2(Z 0 ˒W8FX+3CUdLk*>saMɹwe^lBXf9O K@oZ"}  Wo[ٽƞLi*裚4 Jz! z7osiPsׂD _+Mp؎ww򺢢=y绽xe`P4;2,i櫤"tQ09fl0(/ A08['MkBmTgu\'n7aOqNM}5Fou }}EagBLXbMejYQVE1Xp-5j$|vdZ!@N/ڿ)^@_Ǡ^=kT`I( k*PC3MVIV@J\Հȳ3]%*,8j7a/~Jeg2d[¤Ose[B:ۋ!GO^<;[޸V:rƛlz:ۮɚ޻YT'^ 5ϕM@EEHws`񸄬x"O JLQ:o)^̪eño U)*-^&}vеdI`'W>+#}VF~(/w/O; O(M)vF"rҰDk!`riRZXS@a)0OeҼZQc 'Ti1Пeш5E^\bH/xkYl4N M9{d0^BƑ/>Z rC uNeS{= r*WQ?'Pi!~jTօóMmvmZ.A_jߺkVIbuI(i{̖Ʉ $MS Dr[Ca:c|  ܬʥ=8E mTY2C;|QL[DD٘:ת8R!e 4ǞNjsYCMmrޫXP:լv\m> xern)wN~cb_x3;}Oe [PX6MF)v{O$UbR߸"dֹ5YubM?A^bp} }I{Q_ڟܿ}&;dz`]jh9L~sէ`΅aXLipЇS1x{`tCosZCNӀ=gUur|&]zT0'YJFsc!qxU( =E{B?ݪ/-}gehOYqi]5Q>&K7gL(n륟*!>G8+@'Xt+| o W3]j oI8nY#W,bN7Plilw|y(fkLdNP-Ȑ-y -5G͓]nY|`#i6EfLRoxZ)Cʕ.RLx5TXٿƊ7Q1/ DcKF 2>Za<6ֳv#طz&khn}uZ{Yۡz"h+kUF0#R3;HS mɺAmXPyj6I]%G}v^r!ɒ &[(Kx S~~nQuE{VT?q(nn0_})&aDb`]h=ՠh\pH`l$8͚aE!`o!ңy>$B_/iזbYq!cMH$Q4'.ĉ%:)hh6™t_<;7/< /lJ˄iƑ0\*NMʦ_&:{jh5b1EŦgYC= Õoq1LF =8iO^zOw&"{q ]1^&.+^zn2=Or'PObi_p M<:"Xݨ |9/1>+bS -炶sEz"p³0 C@ԸY3Vbe߯;]Wb⮝3tcBR~]}o)E(@nhIّP҇`MFYzR<J;w[P#/bxo4D \(HK$ oR5ŧ~׏~2?)їS"td=G"yrd>bnL" F8UJGW \zAE`x#1"[m,=VGs/!̣dzRYK硎\{]؋evU&x}׀E&Z2f ߨkbfC9pwP)LQl뚇%NZi6Ȋry> 兗hAa?xX`5n@3MrNWINIPҐQ~O̪qS҃fH7ъ@t+&Ҹ`6NA8Pu36k0<.d#CnY@k%{`{ mʿ`_5*Jy53)CW(HS"JW®gb%Gpv01OsM77;:\76'u8ul96Xz[o,sSKRHXְvr8XQ7:ɤNk*w\3cjb:r{dUԖ˫W^E#‰ս\9fcɦd,&Lw2_U;uDאKrAhFN0EGy&j:0ܛ޹Ҁ'y6$`bb'ڙMsלQCx7Ꮪ (VWA[+BP|x?z}KO)ZG4_#n3 Qn01&Hۈ$,@kY8G,Gs&V @V]B\t4MX5e\,+bNff_:Wl{@5ݦzMWLxNYG]pes74|i՜iha-a=XyYa8)6Z wvi4jO䎪xTS>pS /[4 xUSQ"*Vx'!ÝO# Ʊg@PX~YA{Fm`h׸Dtb'"r`h0_7!'WZs/ٴ6io좙X4HH+-B(ѕfr=c64 `h{u va= 5Zy{uSF7}'2B rVeaQirxiaS'Jۆ$\IAm~ŭ5I%0KkC{\T} .axD=pU;pv.皸H`!.Į:[d?Z꧿]C@P BvB6+Tp~ fhy*!ȧA>44Y Dj9glcvNGS-4v#V⎃ W!Z b  {7Y]y&@Wo><yi)IpuQ!~tQS5atV`WCKu@EjFd;dz`x[w+5@w y*JYUNaȋs]/DwS QZP'ܶ䜘{G1#]KL*J2/‰9,tjș!xQ6C&E]>ܪ棟ԇ[>lAeQsM(ԑ TM׭[d DC@6/6={'Ad}a҅ \i x3&|/ek]R$3;~F"D8G]'IC޴qFn)&)5 ;G0ͮY)<~7O0ѣD6'Q'QB%m4z!eU]9 =e8 -δ^A裟>9}uϓs2Stǻy3#k]}Ú. j;K][oKM'so(Kſ_J?ggH!7/\+3 J\ey]颦v$@ a$zr: p4U)y(f8)TQI1T$Ȯ`ς*~JEYR`_q7//^x'߄ KL @ΥTNS,\qI-N0AgŻ')5{BM S-f)ly#Ě '5ʁ5[tUzOwX钵6pѧ[MX8ї/?;CRjeu4\D*={6M'mO,flEjmm7/ ek%ܟvr_(ʧ؞¾]P|{6=cDc3Kz]H$jQEe멇[HjaUWZ+3g D'{pwWNq} " nF8eߣ J}  H´ - _* U. (Z\g5Ḇ D5u!8" W+ٞvcj.¹'aAY:Fmbnzګw dD{fqG.IzhA\3Cu|}OӧrpOO|Q|ƹɫ|FPa:*z1UѬ_oM^MAS.l~fIG}"C!ca\C!~餘яPPD@a'?:G"G6ч#"?>T6l5)󂫭\/P{OpDya2bG3+{X1Di#h@^-dYܢLw*F?SQ$0 0r[ L;P?)g\);,ګ9FDOocg)n>0_ pɬQȨIԐ5 0ekZSCq)ThʳsT8*@baMlJ|t;x#C.-:ɶ%@jWXTsǤy/M4 s] 4dM*ɻPCdln?2*?9[|2 R]Қcu7br~ %'|uG▙9^CYpњ5?%N DÒUW,% iԥSX228e ,_G[ !^6Ol+X.9V{-_wst*IQW*ѣCίi5L{M ^e YV`尛6 ފE#f׳4i0oGwUą n65HF3z׻D'L}T]1 Bx( Ckb |Y zk"BًڜF]>]?#wX@Ol߫PsǡҚd8[<ڬKO=J{ K &jō)S9:SeWbg<؄HV8HN \J}׍닋n1+1i? X'ªe hjJR&-)-::ng;lKR>Im>#E5ct~(\Aދ 7L=!6v4/fL2&dydMdJ)}͕ң p,oa\9G=:Jjd׀M:mͯto$EHIqp-ce< PO@KO̊f6ѷX(9k5B;-H/ь: 7@^/}J'`v!$9I8;qͯ* @~AT͍i:xBQ0AdFʵIvm `0z#,/JÊ:5{ӱw*3!3+'l"L12k93 qfO%#j^&y ^u;T嵀V)1){y8ʞiaaDɖ,.[~s2s y"6SӔ莽NʕnUN,Wr STyt䤧cGKqR ;xhg>R@$yX%;ޫ0T ZS8(==|j+|C[%gc%Y~Q,N\moBo(#6cV/3ԿGF|*_g#){"zq?^#`vų@.6A{3<@N^VaT"tE@jʛ%}tzE&OTGÔ[)1F{米Iƚ#*U`eW{SU d}Lwk"bIIdPk @2͈sx#KV8Rky'O@DEâX- ȴ\آ0{X&Y/V_׋\QFg̿])号P, HV1뛥)U;ȭqǪՙ]r^m Nnl)+cpIgn;r~{eUhaNw?ifĴ8)=B1jcۓL} y}sEG*2fqq|b @t[UԜ!'2RC{*N$#!]7^iL':)s5گndinDD=%߉vE ;)l?nL?Z  Wf=%H?V|lV9'2dh [dQp:t[|o}YRǰp8sSD)ȧ 󂳐3)ʼnk} Z|ñv|c09H*?Sٺ`Pa*CTA$ɆxRC*ҴX5_ VUyH`҈n ҅2 r!=l۟[[Vf^{o}|8n s[̢kC*nks2D71!$3fb=48 )›%|vay̤1-1S^M=PYtdhAAYS( ݒ`Gv#̝Ʈb<|p. N;㳥Ri-&#⺍vNP@UY/vHثjrrQ0պ-zc($̗rL`w'N< _x(Ї;-E-2iqwB)M7 W䨺G tU圯K=#Gom@v$07p}t&prNnZnuJn~KkeS6SUgؕ\eWڌ~NқXH'^py˧CDReLrٲAemdG} 0SPsk,,nZMRlCFȸnɯ++`qG^DJga`'J]Prtߕ8@\$&ܳûhw{{)׻]RYEvftɥ\un+ ƝegFoZU a<{Z\^BQa 02J.K2L\v틉w7wt"TP)?RƏu톕i̭.;F,\nw|8(Iu+3d9Yo|-VY1+iY3Vкbt@P}1>_zdRzi,f(#u=ߺtIۏғ%tK&j/th TgrjZ-QT."m¢5ӒYƀ, lDօQC;_#yHl֔ktmK?JIk mK >B:kq191ܨ Kޟ|0ҍV0ɥLY+`} q68h^IWOuLwi-XXqWM aJosG8fn]tJo.k;BxgN䣾|[U.b TӶN5} '.$2?Tlh(;MJТZR7nAܥGjױ},;MwUql0`fhpMxpk}oFe]^[V/1ۢ5;E}29o1|op| ]1qgUe씪 -|RES>dR+:oU5r2YU!C Q& X\TJj=i!6 v)p 3jѨM8޺CcϝUn9d%_Z*}ȣ>O |\Um4R\5^^e6ci~fPm\@8*~t0|DrBN!Xg[?F7}4N')$x??3xTުsx)?lr(ʨhg'l9$֙O lE'sOV¹/HT96%t%фCh)%0eRJ`rOFdLvD)SR*UC@u^."8 U`~q@=A(Uiƞ[Xݲ+߿YW-`,oGyd` fɻlJfͤ)ն\T(Z '?;nX߀rtFg4-t>[4aj|1bf$00VQ5IOpf| O9Q:r 2 ^hhXZ c:aҨM+"_܉GQa nZ uդ(<#m\Z{DT=i#zstK5-qS(˷hC9ם˜ .MH'FӾHjEY3QVA9oMUFg[O&(KoC(JLڹIi,RS-E!Wer8Ю %*sO:8wmyE g=􈽝^JN&k/T xAoWPRib9:`6LXmVl\cW6S(bTj5m0LvZ1Dh&2R!r.KR \ sRJ2ٽJVQ ΐBY% ?chO0} 0Z_HEOz*J? ġΏz<0;![ׄM<n!|kʝha#4;GmJx\՚,_-<<<8T; DB fpx5wN綔禔綔mb܄>&ŝPs0.Un~@.<^bg>X0N?{>[’/y0|Fn}딻ma V*B`},J9H`'YKhqo:-k{MqsMcMB' qEi6Tx( S1#<I(\uЕ96My]# CPlZnV׭/pfX1 v'>_E+>T!ӷjLMG=9lMGOE81P Me & TO䱲i".eyb0Xcj+;Bc!+9aʵՑk | _ɷ&~VR64l-i͎J``]͉(\DU4|l SYct)~\堸`+)8aoko&[D==>w\SFvcKkE~Lw$$N4ڛq؉N8D(;sl++(Ӂs ,MkSG*y Y=K Y@S^=0UvIx&J2 k P ],}JmY*ҝׅEhuYF' ,:OƟT14[^i om:&:ƤUIJA-ͪ"K^,[xUa*6چ l XiQ$XRMA&B* ʀf*MWzp8U4+xA#8+u"^#nC w'B, 07tA`1ևΛ&\}i5|%7dH<(pzXv {L308SJ _m&LmrecMiKyLJmMCϣM욳]9ܓOm(}2v 8U8j=n 9DYL\nf;`PYLBUκBy/*2Xg ח^tEullN!p[]bp!+κcn^1hQ&R~#Vt]9t]{J(`91!^b%Y%aI ,Gtz}n>ocU &b'lYюGZJ#  _K{:B^INp9ilYA.|N}9VU*NQ2+ؤw,RU"4p)Gs|Mpz+awBU!G$U!GB nutnGk"?0yj|u+8_hiz˯'YOlZ:L>l+?zJi5gp'wy֎1 1Hxh10qt:QJK hY\NovAI̳bmǸsLSm >/lcZb!=Fy0٥pQ&3\br9I5/y/n)x諜ŶU;,,,'}]bk8)R`P|XLVy#L3t]]rKl9;/7?))X:CK[zruv;ag5HmuΖ\BPm3ω5Mefkg:1pmpHFo(rr-In^Z$ –TI #cDhY ğJ2T4luH=ybB^9y5^Y`E wz ~PB`=eN2R*VYb;pS? d8 2'ɘ˛?94d4.q|wPķT,.\F/2~T"}êJU[ Pd@_|#IUm?%gĥU>I՜+(iF=:jG](ؾ)7BpYBMijV} 8nT?Nf$>MTxQf%FPWM缉wÄn슐¬;[-޻f9y5S9,̱l]>dQf'%!;dn9ʔ('q+$^')ۊr Sg[g٩)tC.MkI\Ƹd@: .] ո.ЯK)i|S)E*-1R@=<"'rR @u٘]O]28 O5,tfZհ悓Hv߶Qh9Լ*̀ oM$JѰQHYDIot`,(4p%q8qؿn=qZK"e0^9}ަ5Gll%Z gvNUqCZVrXXL`(Hމ2HUaL5r<.aSTHlMeYiSXm}9JB'}x~Ւ9{J5#8i۲$ͧsU8~CL]W 3dN=J7h$U[D! Pn*8'c>WNvw{nQUT}N: '4v$M].hYuuPſ`pUU66G0S1bJzB(;:y`SyRbN~LPJdߕe(ĩ_Й5"az>y.TaPLEP;iXz`.X]ԦQ&Epo(r(vI*pgkF&-y(-)J*ExEVϠ )YjZZRA3JeɇlbݏEYg`*Td!Nj?Yhg25pc*AQ8y@J/J0= {-&dze%opФ(yGgg777Ƕp QgKtJg1Mfy~i쉳6מ9 SV n9ILjttWXJ B>&l.S.Y6(Y2e;VKh>u6N$`5=WPRfXp7^m6\!?+'d}B{M.?hA)ˁ4^Q(;f+} Kڅ4,䤩.: yEW{aaAYmh|YLoVQB]Z1-zÞIIGt wԸTBMK>wPDm,_Dq\T6YS1d L86>f!L,CA=Q "w^yA"z _HyTY#W?N8ҞF0"6/ԥB-{ӧiYgsM9% bFY3x;մk Yݛ nCvhQe2:_esz^V B#lL^*pfKYp@=W L 7'V2psJ߻ Z3'e_Э&7 ;{庍rPܕ<;D`}8M}b1[6KY;&&INkm&⬵$Eu_wNwiKSKjNNmݷ8(p" Ptkm`UW#6Hh"g8` 6:^T(ܤ cP8w?p.1}.B - 4Q|.Lb얫ng/Ҋu#(2NP4©=vXn*?W!5%A@F[\%NUZg- sZ诺x3WnuSȫ&[06x+ -XDhh 3M nɹ: _i}j$kzn?jԅ`[Obx:]yzD\R*~™4E23ki;'k oj]UrY ʢZڴzpۣ}5ǪxXO$Oܨ*^FѣH1cZY&ՑhϠS)$vzPQH4d껱rk/PyK wZ7~T|vgwSĞT+ɐnu~NTD 7tMȤ9'% 2pRCCR`cPr4gf)WXJAbAD xWɶl4 {QFG8}l'xf'^G7WvL:}*a*2b^̾[eމw0/WYҍ_QfJ]Ӷ .ṳA' lf!̣ɺX ѐ^|e?`VS8ƹKr|w5`bT; 8',ʨIFV{PkbƲy~)xb_r( wku >fzp)s8%ݖifK1 [n'X#k%Y^HN+KGG=VA#h"'&# Qϙ%m@t"!-F!,y&*>5FyjZ) ̰K;sR!8tyvIY= au> ZwjDQ+q'+fvb M~wFD1q +z2e?^PJǙ''oث9o 񥱥 (b7ap[g~Vb C8e4 ᚨ/`FڻIzvp8A$Wd޵i(ǡZ{ݎ&}?O}~i {c?zxFdoE4\KxcdЍH>{hDo9n()_JUj{wR^*ABQigKdI0cb?.7&MHI+`dUFhbJF:isnqy w]v1z07WڡGf!. 5+"_8ݝ& MqoR=N;[ʧa֕_BaAυޕm KJ1pI9:d?vIi _ܰgy^9m΍$5QJu;䜦 hdVM  ;Ћtu&:Z>6 AEOGt5\}R{rȌ ۥq,whM#:>֤7]n" ~Aw"MGKs %.?*H.=ۡGGOہU@rϠ?)2m`0) ]j?bvt+(A .a}cQ¤eX[ȗm :D_*A6y8єI+`vP16` .Am"@rU_Rp-r+u}ļh:YMNWW]lrqb9Jaϖn]}|m!& PF#=9'/)!LL=I`>ڶor6&DƝȠwp Grl JHNe6}ۆAB:5u)}~qfSf FO`]j@4H_30[IæWIYاW6 F)a20*(r\ XID*gۭ3t vzf%oOe9Ω*1aphox}ۯtI\Qaj&O%;I%c^1$BRpK5ihS+ ~Iƥ?DS:ۊcwd.V#c!da3BL;NqM:,AToBEq+%kUo*NΙ+^$x8tͤ؅ tTcAt܎rhatKNsN6_sa1Z肛¿j|IцfaUArd}p&I);a1,CڋIK!̕/ңNw4\Fc"Nb-ESC:bK{b_ϑ$_hf2RDڊm-|!lл+*fkJ(H'Ó`'y[ܼ˻BAwB4=Me7GkƎi'j<a/b*Adb>fpP*eE`j폪QubLD1/?"Dd:_tC ;,xd"UAXdZ X!ʇL/^*YYWUDM -+0*YAtw梉^e F~ut` *@x"3D*"zj( ymb?{J +7hb `8 P2A_2{<#07'% d^'Eux$1' ;z# <{'!+h<5wXYH2J 'R\ZNprAJȇrF8e{1Ir=#c{ Nԝt8*yHѝma?{<Mi3[6R1E?,L :}<,J6Ilaae'wDp|dE"+{ =GhۨqhʐR!hZѯ7򫶺U޽7_F-#]ӡD7  gXoP⣁ K`Vv I`}{,z+ݖX{+hHw@#:὎&GB~bP8^^y[U'?ߌތߜyGoƏ~ifYP?H RO_]j=6xΞb8DvSqz[P+zVq)/8P4u"ùDgm"Df!黾 fHMj3#@eEN;uf[v^"̫ x0LGuXFVK{782@,4&[o{#~gwpo;:)o׌?: twʤޏ#R3)]t'Xif>A›6 Fױ[{31h)E;"D`o('{7_%ѼhTKI%BЦ]؃F"ѓ!G )s"?q ZN]Й3cJ \x:]RartQix@&s]/$~ Z пS 0X,\ |CLJj UUVمU1FЕ?uvaUB:gt Qd`r['BP}Snǰlks'qxbRqKIq[tŽyD*RZs ar |at, n̅w fm68ScU od8()cNz=bT~Pzsmg:Ł pa$ag1UI-n<{n۬(eJdQ" @<#돼Ge y p5fc4kZˑn8<:ڔY{ʹ>3ɣ&In$(KR9A)H> =+ 18S d^sZf2 :x<ͩtKʓ0 }3ev v jmx]a(Yf mz'2T>M"1 VQ9*&BhKcR>HEQ3CV|\k.g538IJ7Úwd(>@ ~D Sy5CHFͪ>~ ==o,t6dqw@Xu\º)WpC­i݀pin0kl.Md941~o^]ϛzpa?9dF"CSJpWՎbGn">xp1Q?xxƆm?NfqoV1Աzԩ[=ϣz),Foڧ{_ GV Yl{Y.(Âhڳ7)'w$^%F){ktyOc:-."}73u>ΛkicA8=JoQ!]-aNL<+\V|hlyP˶|^ߦ#Z&>aVn2O\t;fܱ뗪ꕕy$_= (Xuxx {wh ;H| ȗRFb*бm*Bp1UiFQ(cI+cc.i[P&‘wiOlQIɻozR)y0jHVzlVD' ķAx]rqԂ([ .\dߍR7h֝PBb'.0@&9*TÝ MNiҐ*hQ8OϞ6+ѡ %sa2:?Rm-s[?ĨA͞ZU H`-;x5_mfBj gn߂+nX,R4SDrPmE\` %P|P-iI*utg 7[2tMt7[ V, ʗ7/D?ohRGMV\:@쎷e՘m'JL)t ucJ3:C#{LjrpK+3)pFP2]L&9Ŕ Fi Icb8E"SdL7-yS$?݊0 5uȄteKF8at݊]gib_q̇Xi|{<&ZWhH ?_xYHnp۲ڏ?rOp,d<鸼ʿK+0iJ-)Tv8Q$Nuv8稯-5 _sLƕi'}2XQҴd85ôc7}j#rYܴ/`[P?.SLڂY0$K].Z@;ik\*n.4+0!N@Y < /z v;ᠯKee,m%L馲):ZVKشņqi4q+6M `m"ܳbPJ'9ŶYbN,m[)b~uݬt*ZADW=-LgAlObՇrflU샤jhZJ bTdjV.=`nQVJr6Mg!b^K^Gl!ϱ (E\! m~Qe qY9∆cK.`tzPsRԔ(^vc|@U'?=koIΙ>8h8=(}79d8?d> N}G{^ Z11~??ܿ>!Ș?(hF ~Mj%;n{џ#>,I&x{`NiߟJx%Eqd2KV:]=ĔV5{=qp# ߾p$/pa j:Y&E`,J?{xNKoaE#v]x{T 8߷ZZH&֪D t|&i[ \O2"M5yw/~{KCn?~O1px/=dC`\"xzyq+i0 ݅6fpWAƴ=gcޜHn1!'ۢ6xhAi>sC_ 'G/1!a<GÁOFMŤnwF ,ct(M{wh L@)Ra3Srq.O';('O_~_k=yŷaD̻ȓ\ y=Ogmic-1.6.8/zart/0000775000175000017500000000000012632021514013663 5ustar dtschumpdtschumpgmic-1.6.8/zart/ui/0000775000175000017500000000000012632021514014300 5ustar dtschumpdtschumpgmic-1.6.8/zart/ui/MainWindow.ui0000664000175000017500000006463312632021514016727 0ustar dtschumpdtschump MainWindow 0 0 1036 816 MainWindow Qt::Horizontal 0 0 Qt::Vertical 0 0 0 200 QFrame::StyledPanel QFrame::Raised QLayout::SetDefaultConstraint 0 0 0 0 0 0 G'MIC program 0 0 0 100 Qt::Horizontal 40 20 Apply script modifications (Ctrl+Return) Apply Qt::Horizontal QSizePolicy::MinimumExpanding 40 20 0 0 Qt::Vertical 0 0 Presets Qt::Horizontal 0 0 Source Preview mode Qt::Horizontal 0 0 QTabWidget::Rounded 0 Qt::ElideNone Source params FPS 0 0 30 Qt::Horizontal 30 Open... 0 0 Open... 0 0 Loop FPS 0 0 5 5 30 Qt::Horizontal 0 0 30 Frame skip 0 0 0 Qt::Horizontal 0 0 10 Qt::Vertical 20 10 9 9 9 9 Resolution 0 0 0 25 1 Qt::Horizontal Input Frame skip 10 Refresh resolutions U Filter params true 0 0 80 16 0 0 0 0 0 0 ... :/images/media-playback-start.png:/images/media-playback-start.png 24 24 false Qt::Horizontal Set zoom factor to 1:1 ... :/images/zoom-original.png:/images/zoom-original.png 24 24 Best fit zoom ... :/images/zoom-fit-best.png:/images/zoom-fit-best.png 24 24 Qt::Horizontal 40 20 0 0 Take a snapshot ... :/images/camera.png:/images/camera.png 24 24 0 0 1036 25 ImageView QWidget
ImageView.h
1
CommandEditor QPlainTextEdit
include/CommandEditor.h
CommandParamsWidget QWidget
CommandParamsWidget.h
1
gmic-1.6.8/zart/ui/DialogLicense.ui0000664000175000017500000000374412632021514017351 0ustar dtschumpdtschump DialogLicense 0 0 591 376 License ZArt license true Qt::Horizontal 40 20 &Ok Qt::Horizontal 40 20 _pkOk pressed() DialogLicense accept() 282 343 295 187 gmic-1.6.8/zart/ui/FullScreenWidget.ui0000664000175000017500000000667412632021514020062 0ustar dtschumpdtschump FullScreenWidget 0 0 859 580 Form 0 0 QFrame::StyledPanel QFrame::Raised ... 0 0 Qt::Vertical false 0 0 Presets Qt::Vertical 20 40 ImageView QWidget
include/ImageView.h
1
CommandParamsWidget QWidget
CommandParamsWidget.h
1
gmic-1.6.8/zart/ui/DialogAbout.ui0000664000175000017500000005421212632021514017035 0ustar dtschumpdtschump DialogAbout 0 0 543 415 0 0 Dialog 0 0 150 92 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 :/images/Logo_150_alpha.png Qt::AlignCenter 0 0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ZArt VERSION by the GREYC Image team</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#aa00ff;">Z</span>Art is <span style=" color:#aa00ff;">A</span>lmost <span style=" color:#aa00ff;">r</span>eal <span style=" color:#aa00ff;">t</span>ime</p></body></html> Qt::AlignCenter 0 0 180 56 0 0 0 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 0 0 0 255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 0 0 0 255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 127 127 127 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 127 127 127 255 255 255 127 127 127 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 QFrame::StyledPanel QFrame::Sunken :/images/LogoGreyc.png Qt::AlignCenter Qt::Horizontal 40 20 0 0 Groupe de Recherche en Informatique, Image, Instrumentation et Automatique de Caen Qt::AlignCenter true 0 0 Qt::Horizontal 0 0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ZArt is a GUI powered by G'MIC for almost real time effects on a webcam stream, a video file, or a still image. Its purpose is to demonstrate some classical or funny image processing algorithms. It is developed at the GREYC laboratory Image team (http://www.greyc.fr).</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Developers</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Sébastien Fourey (GUI Programming)</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">David Tschumperlé (G'MIC &amp; G'MIC scripts)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> 0 0 Close pbClose clicked() DialogAbout close() 123 116 123 69 gmic-1.6.8/zart/ui/OutputWindow.ui0000664000175000017500000000434012632021514017330 0ustar dtschumpdtschump OutputWindow 0 0 749 519 Filter output QFrame::StyledPanel QFrame::Raised 3 5 5 5 5 Show fullscreen ... Qt::Horizontal 40 20 Close ImageView QWidget
ImageView.h
1
gmic-1.6.8/zart/presets.xml0000664000175000017500000103555312632021514016106 0ustar dtschumpdtschump -gimp_array_fade_preview $"*" -gimp_array_mirror_preview $"*" -array_random $"*" -gimp_array_color $"*" -gimp_array_preview $"*" -gimp_asciiart_preview $"*" -gimp_chessboard_preview $"*" -gimp_dices $"*" -gimp_imagegrid $"*" -imagegrid_hexagonal $"*" -gimp_imagegrid_triangular $"*" -gimp_make_seamless_preview $"*" -gimp_ministeck_preview $"*" -gimp_puzzle_preview $"*" -gimp_taquin $"*" -gimp_rotate_tileable_preview $"*" -gimp_rotate_tiles $"*" -gimp_normalize_tiles $"*" -gimp_shift_tiles $"*" -gimp_parameterize_tiles $"*" -gimp_isolate_tiles $"*" -gimp_bokeh_preview $"*" -gimp_cartoon_preview $"*" -gimp_circle_abstraction_preview $"*" -gimp_cubism_preview $"*" -gimp_cutout_preview $"*" -gimp_ellipsionism_preview $"*" -gimp_feltpen_preview $"*" -gimp_poster_hope_preview $"*" -gimp_kuwahara_preview $"*" -gimp_lylejk_painting_preview $"*" -gimp_painting_preview $"*" -gimp_pen_drawing_preview $"*" -gimp_delaunay_preview $"*" -gimp_polygonize_preview $"*" -gimp_poster_edges_preview $"*" -gimp_rodilius_preview $"*" -warhol $"*" -gimp_draw_whirl_preview $"*" -gimp_blackandwhite_preview $"*" -gimp_stencilbw_preview $"*" -gimp_charcoal_preview $"*" -gimp_bwrecolorize_preview $"*" -gimp_ditheredbw_preview $"*" -gimp_engrave_preview $"*",0 -gimp_hardsketchbw_preview $"*" -gimp_houghsketchbw_preview $"*" -gimp_ink_wash $"*" -gimp_pencilbw_preview $"*" -gimp_pencil_portraitbw_preview $"*" -gimp_sketchbw_preview $"*" -gimp_stamp_preview $"*" -gimp_color_abstraction_preview $"*" -gimp_boost_fade_preview $"*" -gimp_boost_chroma_preview $"*" -gimp_channel_processing_preview $"*" -gimp_balance_gamma_preview $"*" --r 33%,33% -b[-1] 1 -distribution3d[-1] -circles3d[-1] 3 -o3d[-1] 0.6 -colorcube3d -p3d[-1] 1 -+3d[-2,-1] --3d[-1] 128,128,128 -n3d[-1] -*3d[-1] {0,min(w,h)/2} -r3d[-1] 1,2,0,{$|*20} -*[0] 0.5 -j3d[0] [1],50%,50% -rm[1] -gimp_colormap_preview $"*" -gimp_apply_curve_preview $"*" -gimp_decompose_channels_preview $"*" -gimp_detect_skin_preview $"*" -gimp_hsv_equalizer_preview $"*" time={$|%9} -if {$time<3} -equalize[-1] 256 1,1 -text[-1] "Equalized",2,2,24,1,255,255,255 -image[-2] [-1],10,10,0,0,0.3 -rm[-1] -elif {$time<6} -n[-1] 0,255 1,1 -text[-1] "Normalized",2,2,24,1,255,255,255 -image[-2] [-1],10,10,0,0,0.3 -rm[-1] -endif --s c -histogram[-3--1] 256 -graph[-4] [-3],3,0,0,0,0.3,255,0,0 -graph[-4] [-2],3,0,0,0,0.3,0,255,0 -graph[-4] [-1],3,0,0,0,0.3,0,0,255 -rm[-3--1] -grid[-1] 32,32,0,0,0.1,0xCCCCCCCC,255 -rgb2hsv -sh 0,0 -+[-1] {({*,x}-w/2)*360/w} -mod[-1] 360 -rm[-1] -hsv2rgb --rows {*,y} -s[-1] c -graph[-4] [-3],1,0,255,0,1,255,200,200 -graph[-4] [-2],1,0,255,0,1,200,255,200 -graph[-4] [-1],1,0,255,0,1,200,200,255 -rm[-3--1] -line[-1] 0,{*,y},100%,{*,y},0.3,255 -axes[-1] 0,100,100,0,1,255 -grid[-1] 32,32,0,0,0.1,0xCCCCCCCC,255 -gimp_mix_rgb_preview $"*" -gimp_mix_ycbcr_preview $"*" -gimp_mix_hsv_preview $"*" -gimp_mix_lab_preview $"*" -gimp_mix_cmyk_preview $"*" -gimp_select_color_preview $"*" -r 50%,50% --s c -channels[-2] -1,0 -channels[-1] -2,0 -append_tiles 2,2 -line 0,50%,100%,50%,1,0 -line 50%,0,50%,100%,1,0 -gimp_sepia_preview $"*" -gimp_custom_transform $"*" -gimp_convolve_preview $"*" -gimp_curvature_preview $"*" -gimp_dog_preview $"*" -gimp_distance_preview $"*" -gimp_edges_preview $"*" -gimp_edge_offsets_preview $"*" -gimp_gradient_norm_preview $"*" -gimp_gradient2rgb_preview $"*" -r 50%,50% --hough {w},{h},1 -+[-1] 1 -pow[-1] 0.3 -r[-1] 100%,100%,1,3 -n[-1] 0,255 -if {*,b} x={max(0,{*,x}-w)} y={*,y} rhomax={sqrt(w^2+h^2)/2} theta={$x*2*pi/w} rho={$y*$rhomax/h} x={{-2,w}/2+$rho*cos($theta)} y={{-2,h}/2+$rho*sin($theta)} x0={$x+1000*sin($theta)} y0={$y-1000*cos($theta)} x1={$x-1000*sin($theta)} y1={$y+1000*cos($theta)} -line[-2] $x0,$y0,$x1,$y1,1,0x0F0F0F0F,255 -line[-2] {$x0+1},$y0,$x1,$y1,1,0x0F0F0F0F,255 -line[-2] $x0,{$y0+1},$x1,$y1,1,0x0F0F0F0F,255 -line[-2] $x0,$y0,$x1,$y1,1,0xF0F0F0F0,0 -line[-2] {$x0+1},$y0,$x1,$y1,1,0xF0F0F0F0,0 -line[-2] $x0,{$y0+1},$x1,$y1,1,0xF0F0F0F0,0 -endif -a x -gimp_isophotes_preview $"*" -gimp_laplacian_preview $"*" -gimp_local_orientation_preview $"*" -gimp_morpho_preview $"*" -gimp_segment_watershed_preview $"*" -gimp_skeleton_preview $"*" -gimp_thin_edges_preview $"*" -gimp_custom_deformation $"*" -gimp_circle_transform $"*" -gimp_drop_water_preview $"*" -gimp_euclidean2polar $"*" -fisheye $"*" -gimp_flower $"*" -gimp_rotoidoscope $"*" -gimp_kaleidoscope $"*" -gimp_symmetrizoscope $"*" -gimp_warp_perspective $"*" -gimp_transform_polar $"*" -raindrops $"*" -deform $"*" -ripple $"*" -gimp_reflect $"*" -gimp_seamcarve_preview $"*" -gimp_map_sphere_preview $"*" -gimp_symmetrize_preview $"*" -gimp_textured_glass_preview $"*" -gimp_twirl $"*" -water $"*" -wave $"*" -gimp_wind_preview $"*" -gimp_zoom $"*" -gimp_blur_angular $"*" -gimp_blur_dof $"*" -gimp_gaussian_blur_preview $"*" -gimp_glow_preview $"*" -gimp_blur_linear_preview $"*" -gimp_blur_radial $"*" -gimp_chromatic_aberrations_preview $"*" -gimp_dirty_preview $"*" -gimp_lomo_preview $"*" -gimp_noise_preview $"*" -gimp_spread_preview $"*" -gimp_stripes_y_preview $"*" -gimp_8bits_preview $"*" -gimp_rain_preview $"*" -gimp_shade_stripes_preview $"*" -gimp_scanlines_preview $"*" -gimp_watermark_visible $"*" -gimp_equalize_details_preview $"*" -gimp_freaky_details_preview $"*" -gimp_normalize_local_preview $"*" -gimp_mighty_details_preview $"*" -gimp_deblur_preview $"*" -gimp_unsharp_goldmeinel_preview $"*" -gimp_sharpen_inversediff_preview $"*" -gimp_unsharp_octave_preview $"*" -gimp_unsharp_richardsonlucy_preview $"*" -gimp_sharpen_shock_preview $"*" -gimp_unsharp_preview $"*" -gimp_split_details_alpha_preview $"*" -gimp_split_details_layers_preview $"*" -gimp_map_tones_preview $"*" -gimp_map_tones_fast_preview $"*" -gimp_emulate_grain_preview $"*" -gimp_emulate_film_bw_preview $"*" -gimp_emulate_film_instant_consumer_preview $"*" -gimp_emulate_film_instant_pro_preview $"*" -gimp_emulate_film_negative_color_preview $"*" -gimp_emulate_film_negative_new_preview $"*" -gimp_emulate_film_negative_old_preview $"*" -gimp_emulate_film_print_preview $"*" -gimp_emulate_film_colorslide_preview $"*" -gimp_emulate_film_various_preview $"*" -gimp_droste_preview $"*" -gimp_frame_blur $"*" -frame_cube $"*" -gimp_frame_fuzzy $"*" -gimp_frame_painting_preview $"*" -gimp_frame_pattern_preview $"*" -gimp_frame $"*" -gimp_frame_round $"*" -gimp_old_photo $"*" -gimp_polaroid $"*" -gimp_tunnel $"*" -gimp_vignette $"*" -gimp_bandpass_preview $"*" N=$1 M={1+$2} Q={1.5*$3} -if {narg($_xBlock)==0} _xBlock=0 _yBlock=0 -endif -if {$_b==1} _xBlock=$_x _yBlock=$_y -endif _xBlock={min($_xBlock,w-$N*$M)} _yBlock={min($_yBlock,h-$N*$M)} --crop $_xBlock,$_yBlock,{$_xBlock+$N*$M},{$_yBlock+$N*$M} -rectangle[0] $_xBlock,$_yBlock,{$_xBlock+$N*$M},{$_yBlock+$N*$M},1,0xFFFFFFFF,0,0,0 -rectangle[0] {$_xBlock+1},{$_yBlock+1},{$_xBlock+$N*$M-1},{$_yBlock+$N*$M-1},1,0xFFFFFFFF,255,255,255 -rectangle[0] {$_xBlock+2},{$_yBlock+2},{$_xBlock+$N*$M-2},{$_yBlock+$N*$M-2},0.33,128,128,128 [-1] -local[-1] -split_tiles $M,$M -apply_parallel "-jpeg_action "$Q -append_tiles $M,$M -endl -resize[-2,-1] {0,h},{0,h},1,3,1 -append x jpeg_quantize: -repeat $! -l[$>] [0],[0],1,[0],1+$1*(x+y) -/[0] [1] -round[0] -* -endl -done jpeg_action: -repeat $! -l[$>] -rgb2ycbcr -dct -round -jpeg_quantize $1 -idct -ycbcr2rgb -endl -done -r 50%,50% --fft -a[-2,-1] c -norm[-1] -+[-1] 1 -log[-1] -n[-1] 0,255 -shift[-1] 50%,50%,0,0,2 -r[-1] 100%,100%,1,3 -a x -r[0] 50%,50% -if {$!==1} 100%,100% _rmin=0 _rmax=200 _is_update=1 -endif -if $_is_update -f[1] 0 _rmax={$_rmax+if($_rmin==$_rmax,1,0)} -ellipse[1] 50%,50%,$_rmax,$_rmax,0,1,1 -ellipse[1] 50%,50%,$_rmin,$_rmin,0,1,0 _is_update=0 -endif -if {{*,b}&1} x={{*,x}-3*w/2} y={{*,y}-h/2} rmax={round((($x)^2+($y)^2)^0.5)} _rmin={if($_rmin>$rmax,$rmax,$_rmin)} -if {$rmax!=$_rmax} _is_update=1 _rmax=$rmax -endif -elif {{*,b}&2} x={{*,x}-3*w/2} y={{*,y}-h/2} rmin={round((($x)^2+($y)^2)^0.5)} _rmax={if($rmin>$_rmax,$rmin,$_rmax)} -if {$rmin!=$_rmin} _is_update=1 _rmin=$rmin -endif -elif {{*,b}&4} _rmin=0 _rmax=200 _is_update=1 -endif -fft[0] -shift[0,1] 50%,50%,0,0,2 --a[0,1] c -norm[-1] -+[-1] 1 -log[-1] -n[-1] 0,255 -*[0,1] [2] -shift[0,1] -50%,-50%,0,0,2 -ifft[0,1] -rm[1] -n[0] 0,255 -*[2] [1] -text[-1] "Freq. min : "$_rmin"\nFreq. max : "$_rmax,5,5,13,1,255 -r[-1] 100%,100%,1,3 -a[0,-1] x -r 50%,50% -fft -point {{*,x}/2},{{*,y}/2},0,1,{iM} -ifft -c 0,255 -rm[-1] -gimp_burn_preview $"*" -gimp_drop_shadow $"*" -drgba -gimp_equalize_shadow_preview $"*" -gimp_lightglow_preview $"*" -gimp_light_leaks_preview $"*" -gimp_light_patch $"*" -gimp_lightrays $"*" -gimp_light_relief $"*" -gimp_shadow_patch $"*" -rgb2bayer $"*" -gimp_canvas_preview $"*" -texturize_canvas $"*" -gimp_cracks_preview $"*" -gimp_crystal_preview $"*" -gimp_halftone_preview $"*" -gimp_hearts_preview $"*" -gimp_lava_preview $"*" -gimp_marble $"*" -gimp_maze $"*" -gimp_mineral_mosaic $"*" -gimp_mosaic_preview $"*" -gimp_shapes_preview $"*" -gimp_paper_preview $"*" -gimp_plaid_texture $"*" -gimp_plasma $"*" -gimp_polka_dots $"*" -gimp_color_ellipses $"*" -gimp_syntexturize_preview $"*" -gimp_rorschach $"*" -gimp_seamless_turbulence $"*" -gimp_shockwaves_preview $"*" -gimp_sponge_preview $"*" -gimp_stained_glass_preview $"*" -gimp_stars $"*" -gimp_stencil_preview $"*" -gimp_tetris $"*" -gimp_truchet $"*" -gimp_turbulence $"*" -weave $"*" -gimp_whirls_preview $"*" -red_eye $"*" -gimp_remove_hotpixels_preview $"*" -gimp_anisotropic_smoothing_preview $"*" -gimp_bilateral_preview $"*" -gimp_blur_guided_preview $"*" -gimp_diffusion_smoothing_preview $"*" -gimp_meancurvature_smoothing_preview $"*" -gimp_median_preview $"*" -gimp_nlmeans_preview $"*" -gimp_patch_smoothing_preview $"*" -gimp_peronamalik_smoothing_preview $"*" -gimp_selective_smoothing_preview $"*" -gimp_smooth_skin_preview $"*" -gimp_anisotropic_smoothing $"*" -gimp_tv_smoothing_preview $"*" -gimp_haar_smoothing_preview $"*" -gimp_upscale_smart_preview $"*" -gimp_blocks3d $"*" -gimp_coloredobject3d_preview $"*" -r 50%,50%,1,3,3 -imagecube3d[-1] -*3d 256 -r3d 1,1,2,{$|*30} -r3d 2,1,3,{$|*50} -db3d 0 -m3d 3 (64;128^0;255^128;255) -r[-1] 640,480,1,3,3 -j3d[-1] [-2],{*,x},{*,y} -rm[-2] -gimp_elevation3d_preview $"*" -gimp_extrude3d_preview $"*" -gimp_imageobject3d_preview $"*" -gimp_lathing3d_preview $"*" -gimp_random3d $"*" --r[-1] 128,128,1,3 -blur[-1] 1 -elevation3d[-1] -0.3 -c3d[-1] -*3d[-1] 3 -r3d[-1] 0,0,1,{({*,x}/{-2,w}-0.5)*360} -r3d[-1] 1,0,0,{({*,y}/{-2,h}-0.5)*180} -m3d 2 -j3d[-2] [-1],50%,75%,0,1 -rm[-1] -gimp_ball_preview $"*" -gimp_circle_art $"*" -gimp_cupid $"*" -gimp_equation_parametric $"*" -gimp_equation_plot $"*" -gimp_corner_gradient $"*" -gimp_custom_gradient_preview $"*" -gimp_line_gradient_preview $"*" -gimp_linear_gradient $"*" -gimp_radial_gradient $"*" -gimp_heart_preview $"*" -gimp_lightning_preview $"*" -gimp_lissajous $"*" -gimp_mandelbrot_preview $"*" -gimp_neon_lightning $"*" -gimp_quick_copyright $"*" -gimp_rainbow $"*" -gimp_shadebobs $"*" -gimp_sierpinski $"*" -gimp_snowflake_preview $"*" -gimp_superformula $"*" -gimp_display_histogram $"*" --rgb2hsv[-1] -channels[-1] 0 -inrange[-1] 180,210 -erode[-1] 32 -dilate[-1] 32 -i[-2] ({w-1},0;{w-1},0^0,{w-1};0,{w-1}^{h-1},{h-1};0,0^0,0;{h-1},{h-1}) -r[-2] [-1],[-1],1,4,3 -*[-2,-1] --shared[-1] 0,0 xmin={w-1-iM} -rm[-1] --shared[-1] 1,1 xmax={iM} -rm[-1] --shared[-1] 2,2 ymin={h-1-iM} -rm[-1] --shared[-1] 3,3 ymax={iM} -rm[-1] -rm[-1] -if {$xmin!=w-1" || "$xmax!=0" || "$ymin!=h-1" || "$ymax!=0} -polygon[-1] 4,$xmin,$ymin,$xmax,$ymin,$xmax,$ymax,$xmin,$ymax,1,0xFFFFFFFF,255 -ellipse {($xmin+$xmax)/2},{($ymin+$ymax)/2},8,8,0,1,255,0,255 -else 1,1 -text[-1] "Object not found",2,2,24,1,255,255,255 -image[-2] [-1],10,10,0,0,0.3 -rm[-1] -endif -flood {*,x},{*,y},0,20,1,255,0,255 gmic-1.6.8/zart/include/0000775000175000017500000000000012632021514015306 5ustar dtschumpdtschumpgmic-1.6.8/zart/include/CommandParamsWidget.h0000664000175000017500000000567412632021514021361 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file CommandParamsWidget.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class CommandParamsWidget * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _COMMANDPARAMSWIDGET_H_ #define _COMMANDPARAMSWIDGET_H_ #include #include #include #include class AbstractParameter; class QLabel; class CommandParamsWidget : public QWidget { Q_OBJECT public: CommandParamsWidget(QWidget * parent = 0); void build( QDomNode presetNode ); virtual ~CommandParamsWidget(); const QString & valueString() const; void saveValuesInDOM(); public slots: void updateValueString(bool notify = true); void reset(); signals: void valueChanged(); protected: void clear(); QVector _presetParameters; QString _valueString; QPushButton * _pbReset; QLabel * _labelNoParams; }; #endif // _COMMANDPARAMSWIDGET_H_ gmic-1.6.8/zart/include/FullScreenWidget.h0000664000175000017500000000557212632021514020676 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file FullScreenWidget.h * @author Sebastien Fourey * @date July 2010 * @brief Declaration of the class FullScreenWidget * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _FULLSCREENWIDGET_H_ #define _FULLSCREENWIDGET_H_ #include "ui_FullScreenWidget.h" class ImageView; class MainWindow; class QShowEvent; class QFrame; class QTreeWidget; class FullScreenWidget : public QWidget, public Ui::FullScreenWidget { Q_OBJECT public: FullScreenWidget( MainWindow * ); ~FullScreenWidget(); ImageView * imageView(); QTreeWidget * treeWidget(); CommandParamsWidget * commandParamsWidget(); protected: void showEvent(QShowEvent * event); void mouseMoveEvent(QMouseEvent * event); void keyPressEvent( QKeyEvent * ); signals: void escapePressed(); void spaceBarPressed(); private: MainWindow * _mainWindow; }; #endif gmic-1.6.8/zart/include/OutputWindow.h0000664000175000017500000000560512632021514020155 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file FullScreenWidget.h * @author Sebastien Fourey * @date Nov 2015 * @brief Declaration of the class FullScreenWidget * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _OUTPUTWINDOW_H_ #define _OUTPUTWINDOW_H_ #include "ui_OutputWindow.h" class ImageView; class MainWindow; class QShowEvent; class QFrame; class QTreeWidget; class OutputWindow: public QWidget, public Ui::OutputWindow { Q_OBJECT public: OutputWindow(MainWindow * ); ~OutputWindow(); ImageView * imageView(); protected: void showEvent(QShowEvent * event); void keyPressEvent( QKeyEvent * ); void closeEvent(QCloseEvent * event); public slots: void onCloseClicked(); void onShowFullscreen(bool ); void onToggleFullScreen(); signals: void escapePressed(); void spaceBarPressed(); void aboutToClose(); private: MainWindow * _mainWindow; }; #endif gmic-1.6.8/zart/include/DialogAbout.h0000664000175000017500000000476412632021514017664 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file DialogAbout.h * @author Sebastien Fourey * @date Sep 2010 * @brief Declaration of the class DialogAbout * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _DIALOGABOUT_H_ #define _DIALOGABOUT_H_ #include #include "ui_DialogAbout.h" /** * The DialogAbout class. */ class DialogAbout : public QDialog, public Ui::DialogAbout { public: DialogAbout( QWidget * parent ); protected: private: }; #endif // _DIALOGABOUT_H_ gmic-1.6.8/zart/include/FolderParameter.h0000664000175000017500000000554212632021514020541 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file FolderParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class FolderParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _FOLDERPARAMETER_H_ #define _FOLDERPARAMETER_H_ #include "AbstractParameter.h" #include #include class QLabel; class QPushButton; class FolderParameter : public AbstractParameter { Q_OBJECT public: FolderParameter(QDomNode node, QObject * parent = 0); ~FolderParameter(); void addTo( QWidget *, int row ); QString textValue() const; void reset(); void saveValueInDOM(); public slots: void onButtonPressed(); signals: void valueChanged(); private: QDomNode _node; QString _name; QString _default; QString _value; QLabel * _label; QPushButton * _button; }; #endif // _FOLDERPARAMETER_H_ gmic-1.6.8/zart/include/StillImageSource.h0000664000175000017500000000543612632021514020702 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file StillImageSource.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class StillImageSource * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. * */ #ifndef _STILLIMAGESOURCE_H_ #define _STILLIMAGESOURCE_H_ #if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) #include #include #else #include #include #endif #include "ImageSource.h" #include class StillImageSource : public ImageSource { public: StillImageSource(); ~StillImageSource(); void capture(); bool loadImage(QString filename); const QString & filename() const; const QString & filePath() const; private: QString _filename; QString _filePath; }; #endif gmic-1.6.8/zart/include/ConstParameter.h0000664000175000017500000000525712632021514020417 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file ConstParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class ConstParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _CONSTPARAMETER_H_ #define _CONSTPARAMETER_H_ #include "AbstractParameter.h" class QLabel; class ConstParameter : public AbstractParameter { Q_OBJECT public: ConstParameter(QDomNode node, QObject * parent = 0); ~ConstParameter(); bool isVisible() const; void addTo( QWidget *, int row ); QString textValue() const; void reset(); void saveValueInDOM(); signals: void valueChanged(); private: QString _value; }; #endif // _CONSTPARAMETER_H_ gmic-1.6.8/zart/include/LinkParameter.h0000664000175000017500000000543112632021514020220 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file LinkParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class LinkParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _LINKPARAMETER_H_ #define _LINKPARAMETER_H_ #include "AbstractParameter.h" #include class QLabel; class LinkParameter : public AbstractParameter { Q_OBJECT public: LinkParameter(QDomNode node, QObject * parent = 0); ~LinkParameter(); void addTo( QWidget *, int row ); QString textValue() const; void reset(); void saveValueInDOM(); public slots: void onLinkActivated(const QString & link); signals: void valueChanged(); private: QLabel * _label; QString _text; QString _url; Qt::AlignmentFlag _alignment; }; #endif // _LINKPARAMETER_H_ gmic-1.6.8/zart/include/TextParameter.h0000664000175000017500000000546612632021514020257 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file TextParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class TextParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _TEXTPARAMETER_H_ #define _TEXTPARAMETER_H_ #include "AbstractParameter.h" #include #include class QLineEdit; class QLabel; class TextParameter : public AbstractParameter { Q_OBJECT public: TextParameter(QDomNode node, QObject * parent = 0); ~TextParameter(); void addTo( QWidget *, int row ); QString textValue() const; void reset(); void saveValueInDOM(); public slots: signals: void valueChanged(); private: QDomNode _node; QString _name; QString _default; QString _value; QLabel * _label; QLineEdit * _lineEdit; }; #endif // _TEXTPARAMETER_H_ gmic-1.6.8/zart/include/AbstractParameter.h0000664000175000017500000000544012632021514021066 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file AbstractParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class AbstractParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _ABSTRACTPARAMETER_H_ #define _ABSTRACTPARAMETER_H_ #include #include class AbstractParameter : public QObject { Q_OBJECT public: AbstractParameter(QObject * parent = 0); virtual ~AbstractParameter(); virtual bool isVisible() const; virtual void addTo( QWidget *, int row ) = 0; virtual QString textValue() const = 0; virtual void reset() = 0; virtual void saveValueInDOM() = 0; static AbstractParameter * createFromNode(QDomNode node , QObject * parent = 0); signals: void valueChanged(); }; #endif // _ABSTRACTPARAMETER_H_ gmic-1.6.8/zart/include/MainWindow.h0000664000175000017500000001244312632021514017537 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file MainWindow.h * @author Sebastien Fourey * @date July 2010 * @brief Declaration of the class ImageFilter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _MAINWINDOW_H_ #define _MAINWINDOW_H_ #include #include #include #include #include #include #include #include "ui_MainWindow.h" #include "WebcamSource.h" #include "StillImageSource.h" #include "VideoFileSource.h" #include "FilterThread.h" #include #include #include class QScrollArea; class ImageView; class QSpinBox; class QComboBox; class QNetworkReply; class QNetworkAccessManager; class QMenu; class TreeWidgetPresetItem; class FullScreenWidget; class OutputWindow; class MainWindow : public QMainWindow, public Ui::MainWindow { Q_OBJECT public: MainWindow( QWidget * parent = 0 ); ~MainWindow(); QString getPreset( const QString & name ); enum Source { Webcam, StillImage, Video }; enum DisplayMode { InWindow, FullScreen }; public slots: void play(); void stop(); void onImageAvailable(); void onEndOfSource(); void onPlayAction(bool); void commandModified(); void presetClicked( QTreeWidgetItem * item, int column ); void imageViewMouseEvent( QMouseEvent * ); void snapshot(); void about(); void license(); void visitGMIC(); void setWebcamSkipFrames(int ); void setVideoSkipFrames(int ); void setImageFPS(int ); void setVideoFPS(int ); void setPresetsFile( const QString & = QString() ); void savePresetsFile(); void onWebcamComboChanged( int index ); void onWebcamResolutionComboChanged(int i ); void onUseBuiltinPresets( bool ); void onReloadPresets(); void onPreviewModeChanged( int index ); void onRightPanel( bool ); void onComboSourceChanged( int ); void onOpenImageFile(); void onOpenVideoFile(); void updateWindowTitle(); void onVideoFileLoop(bool); void changePlayButtonAppearence(bool); void onFilterThreadFinished(); void onCommandParametersChanged(); void onCommandParametersChangedFullScreen(); void enterFullScreenMode(); void leaveFullScreenMode(); void onRefreshCameraResolutions(); void onDetectCameras(); void initGUIFromCameraList(const QList & camList); void onOutputWindow(bool); void onOutputWindowClosing(); private: void setPresets( const QDomElement & ); void addPresets( const QDomElement &, TreeWidgetPresetItem *, TreeWidgetPresetItem * ); void setCurrentPreset( QDomNode node ); void showOneSourceImage(); void updateCameraResolutionCombo(); int _firstWebcamIndex; int _secondWebcamIndex; FilterThread * _filterThread; Source _source; WebcamSource _webcam; StillImageSource _stillImage; VideoFileSource _videoFile; ImageSource * _currentSource; QDomDocument _presets; QDomNode _currentPresetNode; QString _currentDir; QString _imageFilters; QButtonGroup * _bgZoom; QString _filtersPath; QAction * _builtInPresetsAction; QAction * _startStopAction; QAction * _outputWindowAction; DisplayMode _displayMode; FullScreenWidget * _fullScreenWidget; OutputWindow * _outputWindow; QSemaphore _filterThreadSemaphore; bool _zeroFPS; int _presetsCount; QVector _cameraDefaultResolutionsIndexes; }; #endif gmic-1.6.8/zart/include/TreeWidgetPresetItem.h0000664000175000017500000000546112632021514021532 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file TreeWidgetPresetItem.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class StillImageSource * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. * */ #ifndef _TREEWIDGETPRESETITEM_H_ #define _TREEWIDGETPRESETITEM_H_ #include #include #include class TreeWidgetPresetItem : public QTreeWidgetItem { public: TreeWidgetPresetItem(const QStringList & strings, QDomNode node = QDomNode() ); TreeWidgetPresetItem(QTreeWidget * parent, const QStringList & strings, QDomNode node = QDomNode() ); TreeWidgetPresetItem(QTreeWidgetItem * parent, const QStringList & strings, QDomNode node = QDomNode() ); ~TreeWidgetPresetItem(); QDomNode node() const; private: QDomNode _presetNode; }; #endif gmic-1.6.8/zart/include/CommandEditor.h0000664000175000017500000000517612632021514020215 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file CommandEditor.h * @author Sebastien Fourey * @date Sep 2010 * @brief Declaration of the class CommandEditor * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _COMMANDEDITOR_H_ #define _COMMANDEDITOR_H_ #include /** * The CommandEditor class. */ class CommandEditor : public QPlainTextEdit { Q_OBJECT public: /** * Constructor with no arguments. */ CommandEditor( QWidget * parent = 0 ); ~CommandEditor(); signals: void commandModified(); protected: void keyPressEvent ( QKeyEvent * event ); private: }; #endif // _COMMANDEDITOR_H_ gmic-1.6.8/zart/include/FileParameter.h0000664000175000017500000000552212632021514020203 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file FileParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class FileParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _FILEPARAMETER_H_ #define _FILEPARAMETER_H_ #include "AbstractParameter.h" #include #include class QLabel; class QPushButton; class FileParameter : public AbstractParameter { Q_OBJECT public: FileParameter(QDomNode node, QObject * parent = 0); ~FileParameter(); void addTo( QWidget *, int row ); QString textValue() const; void reset(); void saveValueInDOM(); public slots: void onButtonPressed(); signals: void valueChanged(); private: QDomNode _node; QString _name; QString _default; QString _value; QLabel * _label; QPushButton * _button; }; #endif // _FILEPARAMETER_H_ gmic-1.6.8/zart/include/ImageView.h0000664000175000017500000000660412632021514017342 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file View2DWidget.h * @author Sebastien Fourey * @date July 2010 * @brief Declaration of the class ImageFilter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _IMAGEVIEW_H_ #define _IMAGEVIEW_H_ #include #include class QPaintEvent; class ImageView : public QWidget { Q_OBJECT; public: ImageView( QWidget * parent = 0 ); inline QImage & image(); inline QMutex & imageMutex(); void setImageSize(int width, int height); public slots: void zoomOriginal(); void zoomFitBest(); void checkSize(); protected: void paintEvent( QPaintEvent * ); void mousePressEvent( QMouseEvent * ); void mouseReleaseEvent( QMouseEvent * ); void mouseDoubleClickEvent(QMouseEvent *); void mouseMoveEvent( QMouseEvent * ); void resizeEvent ( QResizeEvent * ); void keyPressEvent( QKeyEvent * ); void closeEvent( QCloseEvent * ); signals: void mousePress( QMouseEvent * ); void mouseMove( QMouseEvent * ); void mouseDoubleClick( QMouseEvent * ); void aboutToClose(); void spaceBarPressed(); void escapePressed(); private: QMouseEvent mapMousePositionToImage( QMouseEvent * e ); QImage _image; QMutex _imageMutex; QRect _imagePosition; double _scaleFactor; bool _zoomOriginal; }; QImage & ImageView::image() { return _image; } QMutex & ImageView::imageMutex() { return _imageMutex; } #endif gmic-1.6.8/zart/include/WebcamSource.h0000664000175000017500000000652612632021514020047 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file WebcamGrabber.h * @author Sebastien Fourey * @date July 2010 * @brief Declaration of the class ImageFilter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. * */ #ifndef _WEBCAMGRABBER_H_ #define _WEBCAMGRABBER_H_ #if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) #include #include #else #include #include #endif #include #include #include #include "ImageSource.h" class QSplashScreen; class QStatusBar; class WebcamSource : public ImageSource { public: WebcamSource(); ~WebcamSource(); int cameraIndex(); void capture(); void setCameraIndex( int i ); void stop(); void start(); QSize captureSize(); void setCaptureSize(int width, int height); void setCaptureSize(const QSize & size); static const QList & getWebcamList(); static const QList & getCachedWebcamList(); static void retrieveWebcamResolutions(const QList & camList, QSplashScreen * splashScreen = 0, QStatusBar * statusBar = 0); static const QList & webcamResolutions(int index); static void clearSavedSettings(); private: CvCapture *_capture; int _cameraIndex; QSize _captureSize; static QList _webcamList; static QVector< QList > _webcamResolutions; }; #endif gmic-1.6.8/zart/include/ChoiceParameter.h0000664000175000017500000000554112632021514020517 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file ChoiceParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class ChoiceParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _CHOICEPARAMETER_H_ #define _CHOICEPARAMETER_H_ #include "AbstractParameter.h" #include #include class QComboBox; class QLabel; class ChoiceParameter : public AbstractParameter { Q_OBJECT public: ChoiceParameter(QDomNode node, QObject * parent = 0); ~ChoiceParameter(); void addTo( QWidget *, int row ); QString textValue() const; void reset(); void saveValueInDOM(); public slots: void onComboBoxIndexChanged(int); signals: void valueChanged(); private: QDomNode _node; QString _name; int _default; int _value; QLabel * _label; QComboBox* _comboBox; }; #endif // _CHOICEPARAMETER_H_ gmic-1.6.8/zart/include/SeparatorParameter.h0000664000175000017500000000526112632021514021264 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file NoteParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class SeparatorParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _SEPARATORPARAMETER_H_ #define _SEPARATORPARAMETER_H_ #include "AbstractParameter.h" class QFrame; class SeparatorParameter : public AbstractParameter { Q_OBJECT public: SeparatorParameter(QDomNode node, QObject * parent = 0); ~SeparatorParameter(); void addTo( QWidget *, int row ); QString textValue() const; void reset(); void saveValueInDOM(); signals: void valueChanged(); private: QFrame * _frame; }; #endif // _SEPARATORPARAMETER_H_ gmic-1.6.8/zart/include/IntParameter.h0000664000175000017500000000563212632021514020060 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file IntParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class IntParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _INTPARAMETER_H_ #define _INTPARAMETER_H_ #include "AbstractParameter.h" #include #include class QSpinBox; class QSlider; class QLabel; class IntParameter : public AbstractParameter { Q_OBJECT public: IntParameter(QDomNode node, QObject * parent = 0); ~IntParameter(); void addTo( QWidget *, int row ); QString textValue() const; void reset(); void saveValueInDOM(); public slots: void onSliderChanged(int); void onSpinBoxChanged(int); signals: void valueChanged(); private: QDomNode _node; QString _name; int _min; int _max; int _default; int _value; QLabel * _label; QSlider * _slider; QSpinBox * _spinBox; }; #endif // _INTPARAMETER_H_ gmic-1.6.8/zart/include/ImageSource.h0000664000175000017500000000546612632021514017675 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file ImageSource.h * @author Sebastien Fourey * @date July 2010 * @brief Declaration of the ImageSource interface. * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. * */ #ifndef _IMAGESOURCE_H_ #define _IMAGESOURCE_H_ #if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) #include #include #else #include #include #endif #include class ImageSource { public: ImageSource(); virtual ~ImageSource(); IplImage * image() const; int width() const; int height() const; QSize size() const; virtual void capture() = 0; protected: void setWidth(int); void setHeight(int); void setImage(IplImage *image); private: IplImage *_image; int _width; int _height; }; #endif gmic-1.6.8/zart/include/BoolParameter.h0000664000175000017500000000552012632021514020215 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file BoolParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class BoolParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _BOOLPARAMETER_H_ #define _BOOLPARAMETER_H_ #include "AbstractParameter.h" #include #include class QCheckBox; class QLabel; class BoolParameter : public AbstractParameter { Q_OBJECT public: BoolParameter(QDomNode node, QObject * parent = 0); ~BoolParameter(); void addTo( QWidget *, int row ); QString textValue() const; void reset(); void saveValueInDOM(); public slots: void onCheckBoxChanged(bool); signals: void valueChanged(); private: QDomNode _node; QString _name; bool _default; bool _value; QLabel * _label; QCheckBox * _checkBox; }; #endif // _BOOLPARAMETER_H_ gmic-1.6.8/zart/include/DialogLicense.h0000664000175000017500000000503312632021514020162 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file DialogLicense.h * @author Sebastien Fourey * @date Feb. 2012 * @brief Declaration of the class DialogLicense * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "License" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _DIALOGLICENCE_H_ #define _DIALOGLICENCE_H_ #include #include "ui_DialogLicense.h" /** * The DialogLicense class. */ class DialogLicense : public QDialog, public Ui::DialogLicense { public: DialogLicense( QWidget * parent ); protected: private: }; #endif // DIALOGLICENCE_H gmic-1.6.8/zart/include/VideoFileSource.h0000664000175000017500000000557012632021514020515 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file VideoFileSource.h * @author Sebastien Fourey * @date July 2010 * @brief Declaration of the ImageSource interface. * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. * */ #ifndef _VIDEOFILESOURCE_H_ #define _VIDEOFILESOURCE_H_ #if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) #include #include #else #include #include #endif #include #include "ImageSource.h" class VideoFileSource : public ImageSource { public: VideoFileSource(); virtual ~VideoFileSource(); void capture(); bool loadVideoFile(QString filename); const QString & filename() const; const QString & filePath() const; void setLoop(bool); private: CvCapture * _capture; QString _filename; QString _filePath; bool _videoIsReadable; bool _loop; }; #endif gmic-1.6.8/zart/include/NoteParameter.h0000664000175000017500000000523712632021514020234 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file NoteParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class NoteParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _NOTEPARAMETER_H_ #define _NOTEPARAMETER_H_ #include "AbstractParameter.h" class QLabel; class NoteParameter : public AbstractParameter { Q_OBJECT public: NoteParameter(QDomNode node, QObject * parent = 0); ~NoteParameter(); void addTo( QWidget *, int row ); QString textValue() const; void reset(); void saveValueInDOM(); signals: void valueChanged(); private: QLabel * _label; QString _text; }; #endif // _NOTEPARAMETER_H_ gmic-1.6.8/zart/include/CriticalRef.h0000664000175000017500000000574212632021514017656 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file CriticalRef.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the template CriticalRef.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _CRITICALREF_H_ #define _CRITICALREF_H_ #include template class CriticalRef { public: CriticalRef(T * pobject); ~CriticalRef(); T & object(); const T & object() const; void lock(); void unlock(); private: T * _object; QMutex _mutex; }; template CriticalRef::CriticalRef(T * pobject) : _object(pobject) { } template CriticalRef::~CriticalRef() { delete _object; } template T & CriticalRef::object() { return *_object; } template const T & CriticalRef::object() const { return *_object; } template void CriticalRef::lock() { _mutex.lock(); } template void CriticalRef::unlock() { _mutex.unlock(); } #endif // _CRITICALREF_H_ gmic-1.6.8/zart/include/Makefile0000664000175000017500000000004012632021514016740 0ustar dtschumpdtschump.PHONY: all all: cd ..; make gmic-1.6.8/zart/include/ImageConverter.h0000664000175000017500000001042012632021514020366 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file ImageConverter.h * @author Sebastien Fourey * @date Jul 2010 * @brief Declaration of the class ImageFilter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _IMAGECONVERTER_H_ #define _IMAGECONVERTER_H_ #if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) #include #include #else #include #endif #include "gmic.h" #include "CImg.h" #include class QImage; class ImageConverter { public: enum MergeDirection { MergeTop, MergeLeft, MergeBottom, MergeRight, DuplicateVertical, DuplicateHorizontal }; static void convert( const IplImage * in, QImage * out ); static void convert( const QImage & in, IplImage ** out ); static void convert( const IplImage * in, cimg_library::CImg & out ); static void convert( const cimg_library::CImg & in, QImage * out ); static void merge( IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out, QMutex * imageMutex, MergeDirection direction ); static void mergeTop( IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out ); static void mergeLeft( IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out ); static void mergeBottom( IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out, bool shift = false ); static void mergeRight( IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out, bool shift = true ); static void duplicateVertical( IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out ); static void duplicateHorizontal( IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out ); private: static IplImage * _image; }; #endif // _IMAGECONVERTER_H_ gmic-1.6.8/zart/include/FilterThread.h0000664000175000017500000000762412632021514020045 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file FilterThread.h * @author Sebastien Fourey * @date July 2010 * @brief Declaration of the class ImageFilter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. * */ #ifndef _FILTERTHREAD_H_ #define _FILTERTHREAD_H_ #include #include "Common.h" #include "gmic.h" #include "CImg.h" #include "CriticalRef.h" class ImageSource; class QMutex; class QImage; class QSemaphore; class FilterThread : public QThread { Q_OBJECT public: enum PreviewMode { Full, TopHalf, LeftHalf, BottomHalf, RightHalf, DuplicateVertical, DuplicateHorizontal, Original }; FilterThread( ImageSource & webcam, const QString & command, QImage * outputImageA, QMutex * imageMutexA, QImage * outputImageB, QMutex * imageMutexB, PreviewMode previewMode, int frameSkip, int fps, QSemaphore * blockingSemaphore ); virtual ~FilterThread(); void run(); void setMousePosition( int x, int y, int buttons ); void setArguments(const QString & ); public slots: void setFrameSkip( int ); void setFPS( int ); void setPreviewMode( PreviewMode ); void stop(); signals: void imageAvailable(); void endOfCapture(); private: void setCommand( const QString & command ); ImageSource & _imageSource; QString _command; CriticalRef _arguments; bool _commandUpdated; QImage * _outputImageA; QMutex * _imageMutexA; QImage * _outputImageB; QMutex * _imageMutexB; QSemaphore * _blockingSemaphore; PreviewMode _previewMode; int _frameSkip; unsigned long _frameInterval; int _fps; bool _continue; int _xMouse; int _yMouse; int _buttonsMouse; // G'MIC related members cimg_library::CImgList _gmic_images; cimg_library::CImgList _gmic_images_names; gmic * _gmic; }; #endif // _FILTERTHREAD_H_ gmic-1.6.8/zart/include/ColorParameter.h0000664000175000017500000000607112632021514020402 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file ColorParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class ColorParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _COLORPARAMETER_H_ #define _COLORPARAMETER_H_ #include "AbstractParameter.h" #include #include #include #include #include class QSpinBox; class QSlider; class QLabel; class QToolButton; class ColorParameter : public AbstractParameter { Q_OBJECT public: ColorParameter(QDomNode node, QObject * parent = 0); ~ColorParameter(); void addTo( QWidget *, int row ); QString textValue() const; void reset(); void saveValueInDOM(); public slots: void onButtonPressed(); void colorChanged(const QColor &); signals: void valueChanged(); private: void updateButtonColor(); QDomNode _node; QString _name; QColor _default; QColor _value; bool _alphaChannel; QLabel * _label; QToolButton * _button; QPixmap _pixmap; QColorDialog * _dialog; }; #endif // _COLORPARAMETER_H_ gmic-1.6.8/zart/include/FloatParameter.h0000664000175000017500000000571512632021514020375 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file FloatParameter.h * @author Sebastien Fourey * @date Nov 2014 * @brief Declaration of the class AbstractParameter.h * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #ifndef _FLOATPARAMETER_H_ #define _FLOATPARAMETER_H_ #include "AbstractParameter.h" #include #include class QDoubleSpinBox; class QSlider; class QLabel; class FloatParameter : public AbstractParameter { Q_OBJECT public: FloatParameter(QDomNode node, QObject * parent = 0); ~FloatParameter(); void addTo( QWidget *, int row ); QString textValue() const; void reset(); void saveValueInDOM(); public slots: void onSliderChanged(int); void onSpinBoxChanged(double); signals: void valueChanged(); private: QDomNode _node; QString _name; float _min; float _max; float _default; float _value; QLabel * _label; QSlider * _slider; QDoubleSpinBox * _spinBox; }; #endif // _FLOATPARAMETERPARAMETER_H_ gmic-1.6.8/zart/include/Common.h0000664000175000017500000000530312632021514016710 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file Common.h * @author Sebastien Fourey * @date July 2010 * @brief Global declarations/definitions * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. * */ #ifndef _COMMON_H_ #define _COMMON_H_ #include #ifdef _ZART_DEBUG_ #define SHOW( V ) std::cerr << " " #V " = " << ( V ) << std::endl << std::flush #define QSHOW( V ) std::cerr << " " #V " = " << ( QString("%1").arg( V ).toLatin1().constData() ) << std::endl << std::flush #define CERR std::cerr #else #define SHOW( V ) if ( false ) std::cerr << std::endl #define QSHOW( V ) if ( false ) std::cerr << std::endl #define CERR if ( false ) std::cerr #endif #define ZART_VERSION "3.0.1" #endif gmic-1.6.8/zart/README0000664000175000017500000000460012632021514014543 0ustar dtschumpdtschump-------------------------------------------------------------------------------- ________ ______ __ /\_____ \ /\ _ \ /\ \__ \/____//'/'\ \ \L\ \ _ __ \ \ ,_\ //'/' \ \ __ \ /\`'__\\ \ \/ //'/'___ \ \ \/\ \\ \ \/ \ \ \_ /\_______\\ \_\ \_\\ \_\ \ \__\ \/_______/ \/_/\/_/ \/_/ \/__/ -------------------------------------------------------------------------------- # Summary #--------- ZArt is a computer program whose purpose is to demonstrate the possibilities of the G'MIC image processing language by offering the choice of several manipulations on a video stream acquired from a webcam. In other words, ZArt is a GUI for G'MIC real-time manipulations on the output of a webcam. # Developers #----------- - Sebastien Fourey ( http://foureys.users.greyc.fr/ ) Project manager / GUI Programming - David Tschumperle ( http://tschumperle.users.greyc.fr/ ) G'MIC scripts # Institution #------------- GREYC Image / CNRS UMR 6072 / FRANCE Team web page : https://www.greyc.fr/image # Licenses #---------- The C++ source code of ZArt is distributed under the CECILL v.2.0 license (file 'Licence_CeCILL_V2-en.txt'). This License is a Free-Software license, compatible with the GPL (using those files in a distributed closed-source project is then forbidden). The CeCiLL v.2.0 license ( http://www.cecill.info/index.en.html ) have been created under the supervision of the three biggest research institutions on computer sciences in France : - CNRS ( http://www.cnrs.fr/ ) - CEA ( http://www.cea.fr/ ) - INRIA ( http://www.inria.fr/ ) # Dependencies #------------- The following libraries are required to compile/run ZArt: - libqt4-dev - libcv2.1 - libcvaux2.1 - libcvaux-dev - libcv-dev - libhighgui2.1 - libhighgui-dev - libfftw3-3 - libfftw3-dev - gtsreamer-ffmpeg plugin is required in order to read video files. # Qt5/Fedora issue #----------------- You should update to the latest version available of libxkbcommon. Otherwise, the application might exit at any time with the error below. zart: symbol lookup error: /usr/lib64/qt5/plugins/platforms/libqxcb.so: \ undefined symbol: xkb_state_key_get_utf8 -------------------------------------------------------------------------------- gmic-1.6.8/zart/zart.qrc0000664000175000017500000000117412632021514015355 0ustar dtschumpdtschump images/transparency.png images/camera.png images/LogoGreyc.png images/gmic_hat.png images/application-exit.png presets.xml images/zoom-original.png images/zoom-fit-best.png images/media-playback-start.png images/media-playback-stop.png Licence_CeCILL_V2-en.html images/Logo_150_alpha.png images/splash.png gmic-1.6.8/zart/zart.pro0000664000175000017500000000712612632021514015373 0ustar dtschumpdtschumpTEMPLATE = app QT += xml network widgets CONFIG += qt CONFIG += warn_on QT_CONFIG -= no-pkg-config CONFIG += link_pkgconfig PKGCONFIG += opencv fftw3 zlib LIBS += -lfftw3_threads DEFINES += cimg_use_fftw3 cimg_use_zlib # enable OpenMP by default on with g++, except on OS X !macx:*g++* { CONFIG += openmp } # use qmake CONFIG+=openmp ... to force using openmp # For example, on OS X with GCC 4.8 installed: # qmake -spec unsupported/macx-clang QMAKE_CXX=g++-4.8 QMAKE_LINK=g++-4.8 CONFIG+=openmp # Notes: # - the compiler name is g++-4.8 on Homebrew and g++-mp-4.8 on MacPorts # - we use the unsupported/macx-clang config because macx-g++ uses arch flags that are not recognized by GNU GCC openmp { DEFINES += cimg_use_openmp QMAKE_CXXFLAGS += -fopenmp QMAKE_LFLAGS += -fopenmp } # compile our own version of gmic, with the same cimg_* flags as zart #LIBS += ../src/libgmic.a SOURCES += ../src/gmic.cpp \ src/OutputWindow.cpp DEFINES += gmic_build gmic_is_parallel cimg_use_abort INCLUDEPATH += $$PWD $$PWD/include $$PWD/../src/ DEPENDPATH += $$PWD/include HEADERS += ../src/gmic.h \ ../src/gmic_stdlib.h \ ../src/CImg.h \ include/ImageView.h \ include/MainWindow.h \ include/FilterThread.h \ include/CommandEditor.h \ include/DialogAbout.h \ include/ImageConverter.h \ include/DialogLicense.h \ include/ImageSource.h \ include/WebcamSource.h \ include/StillImageSource.h \ include/VideoFileSource.h \ include/Common.h \ include/TreeWidgetPresetItem.h \ include/AbstractParameter.h \ include/IntParameter.h \ include/CommandParamsWidget.h \ include/SeparatorParameter.h \ include/NoteParameter.h \ include/FloatParameter.h \ include/BoolParameter.h \ include/ChoiceParameter.h \ include/ColorParameter.h \ include/CriticalRef.h \ include/FullScreenWidget.h \ include/FileParameter.h \ include/FolderParameter.h \ include/TextParameter.h \ include/LinkParameter.h \ include/ConstParameter.h \ include/OutputWindow.h SOURCES += \ src/ImageView.cpp \ src/MainWindow.cpp \ src/ZArt.cpp \ src/FilterThread.cpp \ src/DialogAbout.cpp \ src/CommandEditor.cpp \ src/ImageConverter.cpp \ src/DialogLicense.cpp \ src/ImageSource.cpp \ src/WebcamSource.cpp \ src/StillImageSource.cpp \ src/VideoFileSource.cpp \ src/TreeWidgetPresetItem.cpp \ src/AbstractParameter.cpp \ src/IntParameter.cpp \ src/CommandParamsWidget.cpp \ src/SeparatorParameter.cpp \ src/NoteParameter.cpp \ src/FloatParameter.cpp \ src/BoolParameter.cpp \ src/ChoiceParameter.cpp \ src/ColorParameter.cpp \ src/FullScreenWidget.cpp \ src/FileParameter.cpp \ src/FolderParameter.cpp \ src/TextParameter.cpp \ src/LinkParameter.cpp \ src/ConstParameter.cpp RESOURCES = zart.qrc DEPENDPATH += $$PWD/images FORMS = ui/MainWindow.ui ui/DialogAbout.ui ui/DialogLicense.ui \ ui/FullScreenWidget.ui \ ui/OutputWindow.ui PRE_TARGETDEPS += debug { DEFINES += _ZART_DEBUG_ QMAKE_CXXFLAGS_DEBUG += -fsanitize=address -Dcimg_verbosity=3 QMAKE_LFLAGS_DEBUG += -fsanitize=address } release { QMAKE_CXXFLAGS += -ffast-math } UI_DIR = .ui MOC_DIR = .moc RCC_DIR = .qrc OBJECTS_DIR = .obj unix:!macx { DEFINES += _IS_UNIX_ } macx { DEFINES += _IS_MACOS_ } DEFINES += cimg_display=0 #QMAKE_LIBS = #QMAKE_LFLAGS_DEBUG = -lcxcore -lcv -lhighgui -lml #QMAKE_LFLAGS_RELEASE = -lcxcore -lcv -lhighgui -lml gmic-1.6.8/zart/src/0000775000175000017500000000000012632021514014452 5ustar dtschumpdtschumpgmic-1.6.8/zart/src/WebcamSource.cpp0000664000175000017500000002264512632021514017546 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file WebcamGrabber.cpp * @author Sebastien Fourey * @date July 2010 * @brief Definition of methods of the class WebcamGrabber * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "Common.h" #include "WebcamSource.h" #include #include #include #include #include #include #include #include #include using namespace std; QVector< QList > WebcamSource::_webcamResolutions; QList WebcamSource::_webcamList; namespace { class QSizeCompare { public: bool operator()(const QSize & a, const QSize & b) { if ( a.width() < b.width() ) return true; if ( a.width() == b.width() ) return a.height() < b.height(); return false; } }; } WebcamSource::WebcamSource() : _capture(0), _cameraIndex(-1), _captureSize(640,480) { } WebcamSource::~WebcamSource() { cvReleaseCapture( &_capture ); } void WebcamSource::capture() { setImage(cvQueryFrame( _capture )); } const QList & WebcamSource::getWebcamList() { _webcamList.clear(); #if defined(_IS_UNIX_) int i = 0; for ( i = 0; i < 6 ; ++i ) { QFile file(QString("/dev/video%1").arg(i)); if ( file.open(QFile::ReadOnly) ) { file.close(); _webcamList.push_back(i); } } #else CvCapture *capture = 0; int i = 0; for ( i = 0; i < 6 ; ++i ) { capture = cvCaptureFromCAM( i ); if ( capture ) { cvReleaseCapture( &capture ); _webcamList.push_back(i); } } #endif return _webcamList; } const QList & WebcamSource::getCachedWebcamList() { return _webcamList; } void WebcamSource::setCameraIndex( int i ) { _cameraIndex = i; } void WebcamSource::stop() { if ( _capture ) { cvReleaseCapture( &_capture ); _capture = 0; } } void WebcamSource::start() { if ( !_capture && _cameraIndex != -1 ) { _capture = cvCaptureFromCAM( _cameraIndex ); setImage(cvQueryFrame( _capture )); if ( image() ) { QSize imageSize(image()->width,image()->height); if ( imageSize != _captureSize ) { cvSetCaptureProperty(_capture,CV_CAP_PROP_FRAME_WIDTH,_captureSize.width()); cvSetCaptureProperty(_capture,CV_CAP_PROP_FRAME_HEIGHT,_captureSize.height()); setImage(cvQueryFrame( _capture )); setImage(cvQueryFrame( _capture )); } setWidth(image()->width); setHeight(image()->height); } } } void WebcamSource::setCaptureSize(int width, int height) { setCaptureSize(QSize(width,height)); } void WebcamSource::setCaptureSize(const QSize & size) { _captureSize = size; if ( _capture ) { stop(); start(); } } QSize WebcamSource::captureSize() { return _captureSize; } int WebcamSource::cameraIndex() { return _cameraIndex; } void WebcamSource::retrieveWebcamResolutions(const QList & camList, QSplashScreen * splashScreen, QStatusBar * statusBar ) { QSettings settings; CvCapture * capture; QList::const_iterator it = camList.begin(); QList< std::set > resolutions; int iCam = 0; while ( it != camList.end() ) { capture = cvCaptureFromCAM(*it); resolutions.push_back(std::set()); QStringList resolutionsStrList = settings.value(QString("WebcamSource/ResolutionsListForCam%1").arg(camList[iCam])).toStringList(); bool settingsAreFine = !resolutionsStrList.isEmpty(); for ( int i = 0; i < resolutionsStrList.size() && settingsAreFine; ++i ) { QStringList str = resolutionsStrList.at(i).split(QChar('x')); int w = str[0].toInt(); int h = str[1].toInt(); cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH,w); cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT,h); QSize size((int) cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),(int) cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT)); if ( size == QSize(w,h) ) { resolutions.back().insert(size); } else { settingsAreFine = false; } } if ( ! settingsAreFine ) { if ( splashScreen ) { splashScreen->showMessage(QString("Retrieving webcam #%1 resolutions...\n(almost-brute-force checking!)\nResult will be saved.").arg(iCam+1),Qt::AlignBottom); qApp->processEvents(); } if ( statusBar ) { statusBar->showMessage(QString("Retrieving webcam #%1 resolutions...").arg(iCam+1),Qt::AlignBottom); qApp->processEvents(); } resolutions.back().clear(); int ratioWidth[] = { 16, 11, 8, 5, 4 }; int ratioHeight[] = { 9, 9, 5, 4, 3 }; int widths[] = { 100, 120, 140, 160, 180, 200, 220, 240, 280, 300, 320, 360, 400, 600, 640, 700, 720, 800, 900, 1100, 1200, 1300, 1500, 1800, 2000, 2100, 0 }; for ( int i = 0; widths[i]; ++i ) { int w = widths[i]; for ( int ratio = 0; ratio < 5; ++ratio ) { int h = w * ratioHeight[ratio] / ratioWidth[ratio]; cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH,w); cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT,h); QSize size((int) cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),(int) cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT)); if ( ( splashScreen || statusBar )&& resolutions.back().find(size) == resolutions.back().end() ) { if ( splashScreen ) { splashScreen->showMessage( QString("Retrieving webcam #%1 resolutions... %2x%3\n(brute-force checking!)\nResult will be saved.") .arg(iCam+1) .arg(size.width()) .arg(size.height()), Qt::AlignBottom ); } if ( statusBar ) { statusBar->showMessage( QString("Retrieving webcam #%1 resolutions... %2x%3") .arg(iCam+1) .arg(size.width()) .arg(size.height()) ); } qApp->processEvents(); } resolutions.back().insert(size); } } } cvReleaseCapture(&capture); ++it; ++iCam; } _webcamResolutions.clear(); _webcamResolutions.resize(camList.size()); iCam = 0; QList< std::set >::iterator itCam = resolutions.begin(); while ( itCam != resolutions.end() ) { QStringList resolutionsList; std::set::iterator itRes = itCam->begin(); while ( itRes != itCam->end() ) { _webcamResolutions[iCam].push_back(*itRes); resolutionsList << QString("%1x%2").arg(itRes->width()).arg(itRes->height()); ++itRes; } if ( _webcamResolutions[iCam].isEmpty() ) { _webcamResolutions[iCam].push_back(QSize(640,480)); } settings.setValue(QString("WebcamSource/ResolutionsListForCam%1").arg(camList[iCam]),resolutionsList); ++itCam; ++iCam; } } const QList & WebcamSource::webcamResolutions(int index) { return _webcamResolutions[index]; } void WebcamSource::clearSavedSettings() { QSettings settings; for ( int i = 0 ; i < 50; ++i ) { QStringList resolutionsStrList = settings.value(QString("WebcamSource/ResolutionsListForCam%1").arg(i)).toStringList(); if ( ! resolutionsStrList.isEmpty() ) { settings.setValue(QString("WebcamSource/ResolutionsListForCam%1").arg(i),QStringList()); } } } gmic-1.6.8/zart/src/TreeWidgetPresetItem.cpp0000664000175000017500000000611712632021514021230 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file TreeWidgetPresetItem.cpp * @author Sebastien Fourey * @date Oct 2014 * @brief Definition of the methods of the class StillImageSource * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include TreeWidgetPresetItem::TreeWidgetPresetItem(const QStringList &strings, QDomNode node ) : QTreeWidgetItem(strings), _presetNode(node) { } TreeWidgetPresetItem::TreeWidgetPresetItem(QTreeWidget * parent, const QStringList &strings, QDomNode node ) : QTreeWidgetItem(parent,strings), _presetNode(node) { } TreeWidgetPresetItem::TreeWidgetPresetItem(QTreeWidgetItem * parent, const QStringList &strings, QDomNode node ) : QTreeWidgetItem(parent,strings), _presetNode(node) { } TreeWidgetPresetItem::~TreeWidgetPresetItem() { } QDomNode TreeWidgetPresetItem::node() const { return _presetNode; } gmic-1.6.8/zart/src/FloatParameter.cpp0000664000175000017500000001121212632021514020061 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file FloatParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class FloatParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "FloatParameter.h" #include "Common.h" #include #include #include #include #include #include FloatParameter::FloatParameter(QDomNode node, QObject *parent) : AbstractParameter(parent), _node(node), _label(0), _slider(0), _spinBox(0) { _name = node.attributes().namedItem( "name" ).nodeValue(); QString min = node.attributes().namedItem( "min" ).nodeValue(); QString max = node.attributes().namedItem( "max" ).nodeValue(); QString def = node.attributes().namedItem( "default" ).nodeValue(); QString value = node.toElement().attribute("savedValue",def); _min = min.toFloat(); _max = max.toFloat(); _default = def.toFloat(); _value = value.toFloat(); } FloatParameter::~FloatParameter() { delete _spinBox; delete _slider; delete _label; } void FloatParameter::addTo(QWidget * widget, int row) { QGridLayout * grid = dynamic_cast( widget->layout() ); if ( ! grid ) return; delete _spinBox; delete _slider; delete _label; _slider = new QSlider(Qt::Horizontal,widget); _slider->setRange(0,1000); _slider->setValue(static_cast(1000*(_value-_min)/(_max-_min))); _spinBox = new QDoubleSpinBox(widget); _spinBox->setRange(_min,_max); _spinBox->setValue(_value); _spinBox->setDecimals(2); _spinBox->setSingleStep((_max-_min)/100.0); grid->addWidget(_label = new QLabel(_name,widget),row,0,1,1); grid->addWidget(_slider,row,1,1,1); grid->addWidget(_spinBox,row,2,1,1); connect( _slider, SIGNAL(valueChanged(int)), this, SLOT(onSliderChanged(int))); connect( _spinBox, SIGNAL(valueChanged(double)), this, SLOT(onSpinBoxChanged(double))); } QString FloatParameter::textValue() const { QLocale currentLocale; QLocale::setDefault(QLocale::c()); QString value = QString("%1").arg(_spinBox->value()); QLocale::setDefault(currentLocale); return value; } void FloatParameter::reset() { _slider->setValue(_default); _spinBox->setValue(_default); _value = _default; } void FloatParameter::saveValueInDOM() { _node.toElement().setAttribute("savedValue",_spinBox->value()); } void FloatParameter::onSliderChanged(int i) { _value = _min+(i/1000.0)*(_max-_min); _spinBox->setValue(_value); emit valueChanged(); } void FloatParameter::onSpinBoxChanged(double x) { _value = x; _slider->setValue(static_cast(1000*(_value-_min)/(_max-_min))); emit valueChanged(); } gmic-1.6.8/zart/src/IntParameter.cpp0000664000175000017500000001036312632021514017554 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file IntParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class AbstractParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "IntParameter.h" #include "Common.h" #include #include #include #include #include IntParameter::IntParameter(QDomNode node, QObject *parent) : AbstractParameter(parent), _node(node), _label(0), _slider(0), _spinBox(0) { _name = node.attributes().namedItem( "name" ).nodeValue(); QString min = node.attributes().namedItem( "min" ).nodeValue(); QString max = node.attributes().namedItem( "max" ).nodeValue(); QString def = node.attributes().namedItem( "default" ).nodeValue(); QString value = node.toElement().attribute("savedValue",def); _min = min.toInt(); _max = max.toInt(); _default = def.toInt(); _value = value.toInt(); } IntParameter::~IntParameter() { delete _spinBox; delete _slider; delete _label; } void IntParameter::addTo(QWidget * widget, int row) { QGridLayout * grid = dynamic_cast( widget->layout() ); if ( ! grid ) return; delete _spinBox; delete _slider; delete _label; _slider = new QSlider(Qt::Horizontal,widget); _slider->setRange(_min,_max); _slider->setValue(_value); _spinBox = new QSpinBox(widget); _spinBox->setRange(_min,_max); _spinBox->setValue(_value); grid->addWidget(_label = new QLabel(_name,widget),row,0,1,1); grid->addWidget(_slider,row,1,1,1); grid->addWidget(_spinBox,row,2,1,1); connect( _slider, SIGNAL(valueChanged(int)), this, SLOT(onSliderChanged(int))); connect( _spinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxChanged(int))); } QString IntParameter::textValue() const { return _spinBox->text(); } void IntParameter::reset() { _slider->setValue(_default); _spinBox->setValue(_default); _value = _default; } void IntParameter::saveValueInDOM() { _node.toElement().setAttribute("savedValue",_slider->value()); } void IntParameter::onSliderChanged(int i) { _value = i; _spinBox->setValue(i); emit valueChanged(); } void IntParameter::onSpinBoxChanged(int i) { _value= i; _slider->setValue(i); emit valueChanged(); } gmic-1.6.8/zart/src/DialogAbout.cpp0000664000175000017500000000501212632021514017346 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file DialogAbout.cpp * @author Sebastien Fourey * @date Sep 2010 * @brief Definition of the methods of the class DialogAbout. * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "DialogAbout.h" #include "Common.h" /** * Constructor */ DialogAbout::DialogAbout( QWidget * parent ) :QDialog( parent ) { setupUi( this ); setWindowTitle("About ZArt"); QString str = _topLabel->text(); str.replace( "VERSION", ZART_VERSION ); _topLabel->setText( str ); } gmic-1.6.8/zart/src/ImageConverter.cpp0000664000175000017500000003146012632021514020074 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file ImageConverter.cpp * @author Sebastien Fourey * @date Jul 2010 * @brief Definition of the methods of the class ImageConverter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include #include #include #include #include "ImageConverter.h" #include #include "Common.h" IplImage * ImageConverter::_image = 0; void ImageConverter::convert( const IplImage * in, QImage * out ) { if ( !in || !out ) return; assert(in->depth== IPL_DEPTH_8U); assert(in->nChannels == 3); const unsigned int w3 = 3 * in->width; const unsigned int qiOffset = (w3%4)?(4-(w3%4)):0; const unsigned int iplOffset = in->widthStep - w3; unsigned char * src = reinterpret_cast( in->imageData ); unsigned char * dst = reinterpret_cast( out->scanLine( 0 ) ); unsigned char * endSrc; unsigned int line = in->height; while ( line-- ) { endSrc = src + w3; while ( src != endSrc ) { *dst++ = src[2]; *dst++ = src[1]; *dst++ = src[0]; src += 3; } dst += qiOffset; src += iplOffset; } return; } void ImageConverter::convert(const QImage & in, IplImage **out) { if ( !out ) return; *out = cvCreateImage(cvSize(in.width(),in.height()),IPL_DEPTH_8U,3); const unsigned int w3 = 3 * in.width(); const unsigned int qiOffset = (w3%4)?(4-(w3%4)):0; const unsigned int iplOffset = (*out)->widthStep - w3; unsigned char * dst = reinterpret_cast( (*out)->imageData ); const unsigned char * src = reinterpret_cast( in.scanLine( 0 ) ); const unsigned char * endSrc; unsigned int line = in.height(); while ( line-- ) { endSrc = src + w3; while ( src != endSrc ) { *dst++ = src[2]; *dst++ = src[1]; *dst++ = src[0]; src += 3; } src += qiOffset; dst += iplOffset; } } void ImageConverter::convert( const cimg_library::CImg & in, QImage * out ) { if ( !out ) return; const int spectrum = in.spectrum(); unsigned char * dst = out->scanLine(0); const float *srcR = in.data( 0,0,0,0 ); const float * endSrcR = srcR; const float *srcG = in.data( 0,0,0,(spectrum>=2)?1:0 ); const float *srcB = in.data( 0,0,0,(spectrum>=3)?2:0 ); unsigned int height = out->height(); const unsigned int width = out->width(); const unsigned int offset = ((width*3)%4)?(4-((width*3)%4)):0; while ( height-- ) { endSrcR += width; while ( srcR != endSrcR ) { *dst++ = static_cast( *srcR++ ); *dst++ = static_cast( *srcG++ ); *dst++ = static_cast( *srcB++ ); } dst += offset; } } void ImageConverter::merge( IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out, QMutex * imageMutex, MergeDirection direction ) { if ( !iplImage || !out ) return; IplImage * cameraImage = iplImage; if ( iplImage->width != cimgImage.width() || iplImage->height != cimgImage.height() ) { if ( _image ) cvReleaseImage(&_image); _image = cvCreateImage(cvSize(cimgImage.width(),cimgImage.height()),IPL_DEPTH_8U,3); cvResize(iplImage,_image,CV_INTER_LINEAR); cameraImage = _image; } QSize size( cimgImage.width(), cimgImage.height()); if ( out->size() != size ) { imageMutex->lock(); *out = QImage( size, QImage::Format_RGB888 ); imageMutex->unlock(); } switch (direction) { case MergeTop: mergeTop( cameraImage, cimgImage, out ); break; case MergeLeft: mergeLeft( cameraImage, cimgImage, out ); break; case MergeBottom: mergeBottom( cameraImage, cimgImage, out ); break; case MergeRight: mergeRight( cameraImage, cimgImage, out ); break; case DuplicateVertical: mergeBottom(cameraImage, cimgImage, out, false ); break; case DuplicateHorizontal: mergeRight(cameraImage, cimgImage, out, false ); break; } } void ImageConverter::mergeTop( IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out ) { const int height = iplImage->height; const int width = iplImage->width; const int spectrum = cimgImage.spectrum(); const float *srcR = cimgImage.data( 0,0,0,0 ); const float *srcG = cimgImage.data( 0,0,0,(spectrum>=2)?1:0 ); const float *srcB = cimgImage.data( 0,0,0,(spectrum>=3)?2:0 ); unsigned char * dst = out->scanLine(0); unsigned char * endDst; const unsigned int qiOffset = ((width*3)%4)?(4-((width*3)%4)):0; const unsigned int iplOffset = iplImage->widthStep - 3 * width; // Copy from cimgImage unsigned int lines = height/2; while ( lines-- ) { endDst= dst + 3 * width; while ( dst != endDst ) { *dst++ = static_cast( *srcR++ ); *dst++ = static_cast( *srcG++ ); *dst++ = static_cast( *srcB++ ); } dst += qiOffset; } // Copy from iplImage unsigned char * srcIpl = reinterpret_cast( iplImage->imageData ); srcIpl += (height/2) * iplImage->widthStep; lines = height - height/2; while ( lines-- ) { endDst= dst + 3 * width; while ( dst != endDst ) { *dst++ = srcIpl[2]; *dst++ = srcIpl[1]; *dst++ = srcIpl[0]; srcIpl += 3; } dst += qiOffset; srcIpl += iplOffset; } } void ImageConverter::mergeLeft( IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out ) { const int width = iplImage->width; const int spectrum = cimgImage.spectrum(); const float *srcR = cimgImage.data( 0,0,0,0 ); const float *srcG = cimgImage.data( 0,0,0,(spectrum>=2)?1:0 ); const float *srcB = cimgImage.data( 0,0,0,(spectrum>=3)?2:0 ); unsigned char * srcIpl = reinterpret_cast( iplImage->imageData ); unsigned char * dst = out->scanLine(0); unsigned char * endDst; const unsigned int qiOffset = ((width*3)%4)?(4-((width*3)%4)):0; const unsigned int iplOffset = iplImage->widthStep - 3 * width; const unsigned int firstHalf = width/2; const unsigned int secondHalf = width - width/2; int height = iplImage->height; while ( height-- ) { endDst= dst + 3 * firstHalf; while ( dst != endDst ) { *dst++ = static_cast( *srcR++ ); *dst++ = static_cast( *srcG++ ); *dst++ = static_cast( *srcB++ ); } srcR += secondHalf; srcG += secondHalf; srcB += secondHalf; srcIpl += 3 * firstHalf; endDst= dst + 3 * secondHalf; while ( dst != endDst ) { *dst++ = srcIpl[2]; *dst++ = srcIpl[1]; *dst++ = srcIpl[0]; srcIpl += 3; } srcIpl += iplOffset; dst += qiOffset; } } void ImageConverter::mergeBottom(IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out , bool shift) { const int height = iplImage->height; const int width = iplImage->width; unsigned char * dst = out->scanLine(0); unsigned char * endDst; const unsigned int qiOffset = ((width*3)%4)?(4-((width*3)%4)):0; const unsigned int iplOffset = iplImage->widthStep - 3 * width; // Copy from iplImage unsigned char * srcIpl = reinterpret_cast( iplImage->imageData ); unsigned int lines = height/2; while ( lines-- ) { endDst= dst + 3 * width; while ( dst != endDst ) { *dst++ = srcIpl[2]; *dst++ = srcIpl[1]; *dst++ = srcIpl[0]; srcIpl += 3; } dst += qiOffset; srcIpl += iplOffset; } // Copy from cimgImage const unsigned int cimgOffset = (shift ? (width * (height/2)) : 0); const int spectrum = cimgImage.spectrum(); const float *srcR = cimgImage.data( 0,0,0,0 ) + cimgOffset; const float *srcG = cimgImage.data( 0,0,0,(spectrum>=2)?1:0 ) + cimgOffset; const float *srcB = cimgImage.data( 0,0,0,(spectrum>=3)?2:0 ) + cimgOffset; lines = height - height/2; while ( lines-- ) { endDst= dst + 3 * width; while ( dst != endDst ) { *dst++ = static_cast( *srcR++ ); *dst++ = static_cast( *srcG++ ); *dst++ = static_cast( *srcB++ ); } dst += qiOffset; } } void ImageConverter::mergeRight(IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out , bool shift) { const int width = iplImage->width; const unsigned int firstHalf = width/2; const unsigned int secondHalf = width - width/2; const int spectrum = cimgImage.spectrum(); const float *srcR = cimgImage.data( 0,0,0,0 ) + (shift?firstHalf:0); const float *srcG = cimgImage.data( 0,0,0,(spectrum>=2)?1:0 ) + (shift?firstHalf:0); const float *srcB = cimgImage.data( 0,0,0,(spectrum>=3)?2:0 ) + (shift?firstHalf:0); unsigned char * srcIpl = reinterpret_cast( iplImage->imageData ); const unsigned int iplOffset = iplImage->widthStep - 3 * width; const unsigned int iplShift = 3 * secondHalf + iplOffset; unsigned char * dst = out->scanLine(0); unsigned char * endDst; const unsigned int qiOffset = ((width*3)%4)?(4-((width*3)%4)):0; int height = iplImage->height; while ( height-- ) { // First half from iplImage endDst= dst + 3 * firstHalf; while ( dst != endDst ) { *dst++ = srcIpl[2]; // TODO : Invalid write *dst++ = srcIpl[1]; // *dst++ = srcIpl[0]; // srcIpl += 3; } srcIpl += iplShift; // Second half from cimgImage endDst= dst + 3 * secondHalf; while ( dst != endDst ) { *dst++ = static_cast( *srcR++ ); // TODO : Invalid write *dst++ = static_cast( *srcG++ ); // *dst++ = static_cast( *srcB++ ); // } srcR += firstHalf; srcG += firstHalf; srcB += firstHalf; dst += qiOffset; } } void ImageConverter::convert( const IplImage * in, cimg_library::CImg & out ) { assert(in->depth== IPL_DEPTH_8U); assert(in->nChannels == 3); assert(in); const int spectrum = out.spectrum(); float * dstR = out.data( 0,0,0,0 ); float * dstG = out.data( 0,0,0,(spectrum>=2)?1:0 ); float * dstB = out.data( 0,0,0,(spectrum>=3)?2:0 ); const unsigned char * src = reinterpret_cast(in->imageData ); const unsigned char * endSrc; const unsigned int w3 = in->width * 3; const unsigned int iplOffset = in->widthStep - w3; unsigned int height = in->height; while ( height-- ) { endSrc = src + w3; while ( src != endSrc ) { *dstB++ = static_cast(*src++); *dstG++ = static_cast(*src++); *dstR++ = static_cast(*src++); } src += iplOffset; } } gmic-1.6.8/zart/src/SeparatorParameter.cpp0000664000175000017500000000640012632021514020757 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file SeparatorParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class SeparatorParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "SeparatorParameter.h" #include "Common.h" #include #include #include SeparatorParameter::SeparatorParameter(QDomNode, QObject *parent) : AbstractParameter(parent), _frame(0) { } SeparatorParameter::~SeparatorParameter() { delete _frame; } void SeparatorParameter::addTo(QWidget * widget, int row) { QGridLayout * grid = dynamic_cast( widget->layout() ); if ( ! grid ) return; delete _frame; _frame = new QFrame(widget); QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); sizePolicy.setHeightForWidth(_frame->sizePolicy().hasHeightForWidth()); _frame->setSizePolicy(sizePolicy); _frame->setFrameShape(QFrame::HLine); _frame->setFrameShadow(QFrame::Sunken); grid->addWidget(_frame,row,0,1,3); } QString SeparatorParameter::textValue() const { return QString::null; } void SeparatorParameter::reset() { } void SeparatorParameter::saveValueInDOM() { } gmic-1.6.8/zart/src/ImageView.cpp0000664000175000017500000001327112632021514017037 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file ImageView.cpp * @author Sebastien Fourey * @date July 2010 * @brief Definition of the methods of the class ImageView. * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. * */ #include "ImageView.h" #include #include #include #include #include #include #include #include #include "Common.h" ImageView::ImageView( QWidget * parent ) : QWidget( parent ) { setAutoFillBackground( false ); _image = QImage( 640, 480, QImage::Format_RGB888 ); _image.fill( 0 ); setMinimumSize(320,200); setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); _imagePosition = geometry(); _scaleFactor = 1.0; _zoomOriginal= false; } void ImageView::setImageSize(int width, int height) { _image = _image.scaled(width,height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation); } void ImageView::paintEvent( QPaintEvent * ) { QPainter painter( this ); QMutexLocker locker(&_imageMutex); if ( _image.size() == size() ) { painter.drawImage( 0, 0, _image ); _imagePosition = rect(); _scaleFactor = 1.0; return; } QImage scaled; const double imageRatio = _image.width() / static_cast(_image.height() ); const double widgetRatio = width() / static_cast( height() ); if ( imageRatio > widgetRatio ) { scaled = _image.scaledToWidth(width()); _imagePosition = QRect(0,(height()-scaled.height())/2,scaled.width(),scaled.height()); _scaleFactor = scaled.width()/static_cast(_image.width()); painter.drawImage( _imagePosition.topLeft(), scaled ); } else { scaled = _image.scaledToHeight(height()); _imagePosition = QRect((width()-scaled.width())/2,0,scaled.width(),scaled.height()); _scaleFactor = scaled.height()/static_cast(_image.height()); painter.drawImage( _imagePosition.topLeft(), scaled ); } } void ImageView::mousePressEvent( QMouseEvent * e ) { if ( !_imagePosition.contains(e->pos()) ) return; *e = mapMousePositionToImage( e ); emit mousePress( e ); } void ImageView::mouseReleaseEvent( QMouseEvent * ) { } void ImageView::mouseDoubleClickEvent(QMouseEvent * e) { emit mouseDoubleClick(e); } void ImageView::mouseMoveEvent( QMouseEvent * e ) { if ( !_imagePosition.contains(e->pos()) ) return; *e = mapMousePositionToImage( e ); emit mouseMove( e ); } void ImageView::resizeEvent( QResizeEvent * ) { } void ImageView::zoomOriginal() { _zoomOriginal = true; setMinimumSize(_image.size()); resize(_image.size()); setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); } void ImageView::zoomFitBest() { _zoomOriginal = false; QFrame * frame = dynamic_cast(parent()); if ( frame ) { setMinimumSize(320,200); QRect rect = frame->layout()->contentsRect(); setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); resize(rect.width(),rect.height()); } } void ImageView::checkSize() { if ( !_zoomOriginal ) return; if ( size() != _image.size() ) { setMinimumSize(_image.size()); resize(_image.size()); setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); } } QMouseEvent ImageView::mapMousePositionToImage( QMouseEvent * e ) { int x = (e->pos().x()-_imagePosition.left()) / _scaleFactor; int y = (e->pos().y()-_imagePosition.top()) / _scaleFactor; return QMouseEvent(e->type(),QPoint(x,y),e->button(),e->buttons(),e->modifiers()); } void ImageView::keyPressEvent( QKeyEvent * e ) { if ( e->key() == Qt::Key_Space ) { e->accept(); emit spaceBarPressed(); } if ( e->key() == Qt::Key_Escape) { emit escapePressed(); e->accept(); } } void ImageView::closeEvent( QCloseEvent * e ) { emit aboutToClose(); e->accept(); } gmic-1.6.8/zart/src/FolderParameter.cpp0000664000175000017500000001032712632021514020235 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file FolderParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class AbstractParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "FolderParameter.h" #include "Common.h" #include #include #include #include #include #include #include FolderParameter::FolderParameter(QDomNode node, QObject *parent) : AbstractParameter(parent), _node(node), _label(0), _button(0) { _name = node.attributes().namedItem( "name" ).nodeValue(); _default = node.toElement().attribute("default",QString()); _value = node.toElement().attribute("savedValue",_default); } FolderParameter::~FolderParameter() { delete _label; delete _button; } void FolderParameter::addTo(QWidget * widget, int row) { QGridLayout * grid = dynamic_cast( widget->layout() ); if ( ! grid ) return; delete _label; delete _button; QString buttonText; if ( _value.isEmpty() ) { buttonText = "..."; } else { int w = widget->contentsRect().width()/3; QFontMetrics fm(widget->font()); buttonText = fm.elidedText(QFileInfo(_value).fileName(),Qt::ElideRight,w); } _button = new QPushButton(buttonText,widget); grid->addWidget(_label = new QLabel(_name,widget),row,0,1,1); grid->addWidget(_button,row,1,1,2); connect( _button, SIGNAL(clicked()), this, SLOT(onButtonPressed()) ); } QString FolderParameter::textValue() const { if ( _value.isEmpty() ) return QString("\"\\\"\\\"\""); else return QString("\"%1\"").arg(_value); } void FolderParameter::reset() { _value = _default; } void FolderParameter::saveValueInDOM() { _node.toElement().setAttribute("savedValue",_value); } void FolderParameter::onButtonPressed() { QString filename = QFileDialog::getExistingDirectory(0,"Select a directory",_value); if ( filename.isNull() ) { _value = ""; _button->setText("..."); } else { _value = filename; int w = _button->contentsRect().width()-10; QFontMetrics fm(_button->font()); _button->setText(fm.elidedText(QFileInfo(_value).fileName(),Qt::ElideRight,w)); } emit valueChanged(); } gmic-1.6.8/zart/src/AbstractParameter.cpp0000664000175000017500000000751312632021514020570 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file AbstractParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class AbstractParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "AbstractParameter.h" #include "IntParameter.h" #include "FloatParameter.h" #include "BoolParameter.h" #include "ChoiceParameter.h" #include "ColorParameter.h" #include "SeparatorParameter.h" #include "NoteParameter.h" #include "FileParameter.h" #include "FolderParameter.h" #include "TextParameter.h" #include "LinkParameter.h" #include "ConstParameter.h" AbstractParameter::AbstractParameter(QObject *parent) : QObject(parent) { } AbstractParameter::~AbstractParameter() { } bool AbstractParameter::isVisible() const { return true; } AbstractParameter * AbstractParameter::createFromNode(QDomNode node, QObject * parent ) { QString name = node.nodeName(); if ( name == "int" ) { return new IntParameter(node,parent); } if ( name == "float" ) { return new FloatParameter(node,parent); } if ( name == "bool" ) { return new BoolParameter(node,parent); } if ( name == "choice" ) { return new ChoiceParameter(node,parent); } if ( name == "color" ) { return new ColorParameter(node,parent); } if ( name == "separator" ) { return new SeparatorParameter(node,parent); } if ( name == "note" ) { return new NoteParameter(node,parent); } if ( name == "file" ) { return new FileParameter(node,parent); } if ( name == "folder" ) { return new FolderParameter(node,parent); } if ( name == "text" ) { return new TextParameter(node,parent); } if ( name == "link" ) { return new LinkParameter(node,parent); } if ( name == "const" ) { return new ConstParameter(node,parent); } return 0; } gmic-1.6.8/zart/src/CommandEditor.cpp0000664000175000017500000000532712632021514017712 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file CommandEditor.cpp * @author Sebastien Fourey * @date Sep 2010 * @brief Definition of the methods of the class CommandEditor * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "CommandEditor.h" /** * Constructor */ CommandEditor::CommandEditor( QWidget * parent ) : QPlainTextEdit( parent ) { } CommandEditor::~CommandEditor() { } void CommandEditor::keyPressEvent ( QKeyEvent * event ) { if ( ( event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return ) && ( event->modifiers() & Qt::ControlModifier ) ) { event->accept(); emit commandModified(); } else { QPlainTextEdit::keyPressEvent( event ); } } gmic-1.6.8/zart/src/FilterThread.cpp0000664000175000017500000002623312632021514017541 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file FilterThread.cpp * @author Sebastien Fourey * @date July 2010 * @brief Definition of the methods of the class FilterThread. * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "FilterThread.h" #include "ImageConverter.h" #include "WebcamSource.h" #include #include #include #include #include #include #include #include #include #include using namespace cimg_library; FilterThread::FilterThread(ImageSource & imageSource, const QString & command, QImage * outputImageA, QMutex * imageMutexA, QImage * outputImageB, QMutex * imageMutexB, PreviewMode previewMode, int frameSkip, int fps, QSemaphore * blockingSemaphore ) : _imageSource( imageSource ), _arguments(new QString("")), _commandUpdated(true), _outputImageA( outputImageA ), _imageMutexA( imageMutexA ), _outputImageB( outputImageB ), _imageMutexB( imageMutexB ), _blockingSemaphore( blockingSemaphore ), _previewMode( previewMode ), _frameSkip( frameSkip ), _continue( true ), _xMouse( -1 ), _yMouse( -1 ), _buttonsMouse( 0 ), _gmic_images(), _gmic(0) { setCommand(command); setFPS(fps); #ifdef _IS_MACOS_ setStackSize(8*1024*1024); #endif } FilterThread::~FilterThread() { delete _gmic; } void FilterThread::setMousePosition( int x, int y, int buttons ) { _xMouse = x; _yMouse = y; _buttonsMouse = buttons; } void FilterThread::setArguments(const QString & str) { _arguments.lock(); _arguments.object() = str; _arguments.unlock(); } void FilterThread::setPreviewMode( PreviewMode pm ) { _previewMode = pm; } void FilterThread::setFrameSkip( int n ) { _frameSkip = n; } void FilterThread::setFPS(int fps) { _fps = fps; _frameInterval = 0; if ( fps > 0 ) { _frameInterval = 1000/fps; } } void FilterThread::stop() { _continue = false; _fps = 1; _frameInterval = 0; } void FilterThread::run() { QTime timeMeasure; unsigned int lastCommandDuration = 0; timeMeasure.start(); int n; while ( _continue ) { // Delay (minus last command duration) if ( _frameInterval && lastCommandDuration < _frameInterval ) msleep(_frameInterval-lastCommandDuration); // Skip some frames and grab an image from the webcam n = _frameSkip + 1; while ( n-- ) { _imageSource.capture(); } // Abort if no image is provided by the source if ( ! _imageSource.image() ) { emit endOfCapture(); return; } if ( !_gmic_images ) _gmic_images.assign(1); if ( !_gmic_images[0].is_sameXYZC(_imageSource.width(),_imageSource.height(),1,3) ) _gmic_images[0].assign(_imageSource.width(),_imageSource.height(),1,3); ImageConverter::convert( _imageSource.image(), _gmic_images[0] ); // Call the G'MIC interpreter. try { timeMeasure.restart(); if ( _commandUpdated ) { delete _gmic; QString c = QString("foo: -skip $\"*\" ") + _command; _gmic = new gmic( "", c.toLatin1().constData() ); _commandUpdated = false; } _gmic->run("-v -"); QString c; c += QString("_x=") + QString("%1").arg( _xMouse ); c += QString(" _y=") + QString("%1").arg( _yMouse ); c += QString(" _b=") + QString("%1").arg( _buttonsMouse ); QString call; _arguments.lock(); if ( _arguments.object().isEmpty() ) call = QString(" -foo 0"); else call = QString(" -foo %1").arg(_arguments.object()); _arguments.unlock(); c += call; // QSHOW( call ); _gmic->run( c.toLatin1().constData(),_gmic_images,_gmic_images_names ); lastCommandDuration = timeMeasure.elapsed(); switch ( _previewMode ) { case Full: if (_gmic_images && _gmic_images[0]) { QSize size( _gmic_images[0].width(), _gmic_images[0].height() ); _imageMutexA->lock(); if ( _outputImageA->size() != size ) { *_outputImageA = QImage( size, QImage::Format_RGB888 ); } _imageMutexA->unlock(); ImageConverter::convert( _gmic_images[0], _outputImageA ); if ( _outputImageB ) { _imageMutexB->lock(); if ( _outputImageB->size() != size ) { *_outputImageB = QImage( size, QImage::Format_RGB888 ); } _imageMutexB->unlock(); ImageConverter::convert( _gmic_images[0], _outputImageB ); } } break; case Original: { _imageMutexA->lock(); QSize size( _imageSource.width(), _imageSource.height() ); if ( _outputImageA->size() != size ) { *_outputImageA = QImage( size, QImage::Format_RGB888 ); } _imageMutexA->unlock(); if ( _outputImageB ) { if ( _outputImageB->size() != size ) { *_outputImageB = QImage( size, QImage::Format_RGB888 ); } _imageMutexB->unlock(); } ImageConverter::convert( _imageSource.image(), _outputImageA ); ImageConverter::convert( _imageSource.image(), _outputImageB ); } break; case LeftHalf: ImageConverter::merge( _imageSource.image(),_gmic_images[0], _outputImageA, _imageMutexA, ImageConverter::MergeLeft ); ImageConverter::merge( _imageSource.image(),_gmic_images[0], _outputImageB, _imageMutexB, ImageConverter::MergeLeft ); break; case TopHalf: ImageConverter::merge( _imageSource.image(), _gmic_images[0], _outputImageA, _imageMutexA, ImageConverter::MergeTop ); ImageConverter::merge( _imageSource.image(), _gmic_images[0], _outputImageB, _imageMutexB, ImageConverter::MergeTop ); break; case BottomHalf: ImageConverter::merge( _imageSource.image(), _gmic_images[0], _outputImageA, _imageMutexA, ImageConverter::MergeBottom ); ImageConverter::merge( _imageSource.image(), _gmic_images[0], _outputImageB, _imageMutexB, ImageConverter::MergeBottom ); break; case RightHalf: ImageConverter::merge( _imageSource.image(), _gmic_images[0], _outputImageA, _imageMutexB, ImageConverter::MergeRight ); ImageConverter::merge( _imageSource.image(), _gmic_images[0], _outputImageB, _imageMutexB, ImageConverter::MergeRight ); break; case DuplicateHorizontal: ImageConverter::merge( _imageSource.image(), _gmic_images[0], _outputImageA, _imageMutexA, ImageConverter::DuplicateHorizontal); ImageConverter::merge( _imageSource.image(), _gmic_images[0], _outputImageB, _imageMutexB, ImageConverter::DuplicateHorizontal); break; case DuplicateVertical: ImageConverter::merge( _imageSource.image(), _gmic_images[0], _outputImageA, _imageMutexA, ImageConverter::DuplicateVertical); ImageConverter::merge( _imageSource.image(), _gmic_images[0], _outputImageB, _imageMutexB, ImageConverter::DuplicateVertical); break; default: _outputImageA->fill( QColor(255,255,255).rgb() ); if ( _outputImageB ) { _outputImageB->fill( QColor(255,255,255).rgb() ); } break; } } catch (gmic_exception & e) { CImg src( reinterpret_cast(_imageSource.image()->imageData), 3, _imageSource.width(), _imageSource.height(), 1, true ); _gmic_images = src.get_permute_axes("yzcx"); QString errorCommand = QString("-gimp_error_preview \"%1\"").arg(e.what()); try { _gmic->run(errorCommand.toLatin1().constData(),_gmic_images,_gmic_images_names); } catch (gmic_exception &e) { const unsigned char color1[] = { 0,255,0 }, color2[] = { 0,0,0 }; _gmic_images = src.get_permute_axes("yzcx").channel(0).resize(-100,-100,1,3).draw_text(10,10,"Syntax Error",color1,color2,0.5,57); } std::cerr << e.what() << std::endl; QSize size( _imageSource.image()->width, _imageSource.image()->height ); if ( _outputImageA->size() != size ) { _imageMutexA->lock(); *_outputImageA = QImage( size, QImage::Format_RGB888 ); _imageMutexA->unlock(); } if ( _outputImageB->size() != size ) { _imageMutexB->lock(); *_outputImageB = QImage( size, QImage::Format_RGB888 ); _imageMutexB->unlock(); } ImageConverter::convert( _gmic_images[0], _outputImageA ); ImageConverter::convert( _gmic_images[0], _outputImageB ); } emit imageAvailable(); if ( !_fps && _blockingSemaphore ) { _blockingSemaphore->acquire(_blockingSemaphore->available()+1); } } } /* * Private methods */ void FilterThread::setCommand( const QString & command ) { QByteArray str = command.toLatin1(); _command = str.constData(); _command.replace( "{*,x}", "$_x" ) .replace( "{*,y}", "$_y" ) .replace( "{*,b}", "$_b" ); _commandUpdated = true; } gmic-1.6.8/zart/src/CommandParamsWidget.cpp0000664000175000017500000001174612632021514021055 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file CommandParamsWidget.cpp * @author Sebastien Fourey * @date Nov 2014 * @brief Definition of the class CommandParamsWidget * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "Common.h" #include "CommandParamsWidget.h" #include "AbstractParameter.h" #include #include CommandParamsWidget::CommandParamsWidget(QWidget * parent) :QWidget(parent), _valueString(""), _pbReset(0), _labelNoParams(0) { delete layout(); QGridLayout * grid = new QGridLayout; grid->setRowStretch(1,2); setLayout(grid); _labelNoParams = new QLabel("No parameters",this); _labelNoParams->setAlignment(Qt::AlignHCenter|Qt::AlignCenter); grid->addWidget(_labelNoParams,0,0,4,3); } void CommandParamsWidget::build(QDomNode presetNode) { clear(); delete layout(); QGridLayout * grid = new QGridLayout; grid->setRowStretch(1,2); setLayout(grid); int row = 0; QDomNode child = presetNode.firstChild(); while ( ! child.isNull() ) { AbstractParameter * parameter = AbstractParameter::createFromNode( child, this ); if ( parameter ) { _presetParameters.push_back(parameter); if ( parameter->isVisible() ) { parameter->addTo(this,row++); } connect(parameter,SIGNAL(valueChanged()), this,SLOT(updateValueString())); } child = child.nextSibling(); } if ( row ) { _pbReset = new QPushButton("Reset",this); grid->addWidget(_pbReset,row,0,1,3); connect(_pbReset,SIGNAL(clicked()), this,SLOT(reset())); delete _labelNoParams; _labelNoParams = 0; } else { _labelNoParams = new QLabel("No parameters",this); _labelNoParams->setAlignment(Qt::AlignHCenter|Qt::AlignCenter); grid->addWidget(_labelNoParams,0,0,4,3); } updateValueString(false); } CommandParamsWidget::~CommandParamsWidget() { clear(); } const QString & CommandParamsWidget::valueString() const { return _valueString; } void CommandParamsWidget::saveValuesInDOM() { for ( int i = 0; i < _presetParameters.size(); ++i ) { _presetParameters[i]->saveValueInDOM(); } } void CommandParamsWidget::updateValueString(bool notify) { _valueString.clear(); bool firstParameter = true; for ( int i = 0; i < _presetParameters.size(); ++i ) { QString str = _presetParameters[i]->textValue(); if ( !str.isNull() ) { if ( !firstParameter ) { _valueString += ","; } _valueString += str; firstParameter = false; } } if ( notify ) emit valueChanged(); } void CommandParamsWidget::reset() { for ( int i = 0; i < _presetParameters.size(); ++i ) { _presetParameters[i]->reset(); } updateValueString(true); } void CommandParamsWidget::clear() { QVector::iterator it = _presetParameters.begin(); while (it != _presetParameters.end() ) { delete *it; ++it; } _presetParameters.clear(); delete _pbReset; _pbReset = 0; delete _labelNoParams; _labelNoParams = 0; } gmic-1.6.8/zart/src/OutputWindow.cpp0000664000175000017500000001110412632021514017643 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file OutputWindow.cpp * @author Sebastien Fourey * @date Nov 2015 * @brief Declaration of the class OutputWindow * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include #include "OutputWindow.h" #include "ImageView.h" #include #include #include #include #include #include "MainWindow.h" OutputWindow::OutputWindow(MainWindow * mainwindow) : QWidget(0), _mainWindow(mainwindow) { setupUi(this); #if QT_VERSION >= 0x040600 _tbFullScreen->setIcon(QIcon::fromTheme("view-fullscreen")); #else _tbFullScreen->setText("Fullscreen"); _tbFullScreen->setToolButtonStyle(Qt::ToolButtonTextOnly); #endif _pbClose->setCheckable(false); _tbFullScreen->setCheckable(true); connect( _tbFullScreen, SIGNAL(toggled(bool)), this, SLOT(onShowFullscreen(bool)) ); connect( _pbClose, SIGNAL(clicked(bool)), this, SLOT(onCloseClicked()) ); connect( _imageView, SIGNAL(escapePressed()), this, SIGNAL(escapePressed()) ); connect( _imageView, SIGNAL(spaceBarPressed()), this, SIGNAL(spaceBarPressed()) ); connect( _imageView, SIGNAL( mousePress( QMouseEvent * ) ), _mainWindow, SLOT( imageViewMouseEvent( QMouseEvent * ) ) ); connect( _imageView, SIGNAL( mouseMove( QMouseEvent * ) ), _mainWindow, SLOT( imageViewMouseEvent( QMouseEvent * ) ) ); connect( _imageView, SIGNAL(mouseDoubleClick(QMouseEvent*)), this, SLOT(onToggleFullScreen()) ); _imageView->setMouseTracking( true ); setMouseTracking(true); layout()->setContentsMargins(1,0,1,0); } OutputWindow::~OutputWindow() { } void OutputWindow::keyPressEvent( QKeyEvent * e ) { if ( isFullScreen() && (e->key() == Qt::Key_Escape || e->key() == Qt::Key_F5) ) { onShowFullscreen(false); emit escapePressed(); e->accept(); } if ( e->key() == Qt::Key_Space ) { emit spaceBarPressed(); e->accept(); } } void OutputWindow::closeEvent(QCloseEvent * e) { emit aboutToClose(); e->accept(); } void OutputWindow::onCloseClicked() { close(); } void OutputWindow::onShowFullscreen(bool on) { if (on) { _buttonsFrame->hide(); showFullScreen(); setFocus(); } else { _buttonsFrame->show(); _pbClose->show(); _tbFullScreen->setChecked(false); showNormal(); } } void OutputWindow::onToggleFullScreen() { _tbFullScreen->setChecked(!isFullScreen()); } ImageView * OutputWindow::imageView() { return _imageView; } void OutputWindow::showEvent(QShowEvent *) { _imageView->setFocus(); } gmic-1.6.8/zart/src/ColorParameter.cpp0000664000175000017500000001216112632021514020076 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file ColorParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class ColorParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "ColorParameter.h" #include "Common.h" #include #include #include #include #include #include #include #include #include ColorParameter::ColorParameter(QDomNode node, QObject *parent) : AbstractParameter(parent), _node(node), _alphaChannel(false), _label(0), _button(0), _dialog(0) { _name = node.attributes().namedItem( "name" ).nodeValue(); QString def = node.attributes().namedItem( "default" ).nodeValue(); QString value = node.toElement().attribute("savedValue",def); int r,g,b,a; char str[100] = {0}; strcpy(str,value.toLatin1().constData()); int n = sscanf(str,"%d,%d,%d,%d",&r,&g,&b,&a); if ( n == 4 ) { _default = _value = QColor(r,g,b,a); _alphaChannel = true; } else { _default = _value = QColor(r,g,b); } } ColorParameter::~ColorParameter() { delete _button; delete _label; delete _dialog; } void ColorParameter::addTo(QWidget * widget, int row) { QGridLayout * grid = dynamic_cast( widget->layout() ); if ( ! grid ) return; delete _button; delete _label; _button = new QToolButton(widget); _button->setText("Color"); QFontMetrics fm(widget->font()); QRect r = fm.boundingRect("COLOR"); _pixmap = QPixmap(r.width(),r.height()*2); updateButtonColor(); grid->addWidget(_label = new QLabel(_name,widget),row,0,1,1); grid->addWidget(_button,row,1,1,1); connect( _button, SIGNAL(clicked()), this, SLOT(onButtonPressed())); } QString ColorParameter::textValue() const { const QColor & c = _value; if ( _alphaChannel ) return QString("%1,%2,%3,%4").arg(c.red()).arg(c.green()).arg(c.blue()).arg(c.alpha()); else return QString("%1,%2,%3").arg(c.red()).arg(c.green()).arg(c.blue()); } void ColorParameter::reset() { _value = _default; } void ColorParameter::saveValueInDOM() { _node.toElement().setAttribute("savedValue",textValue()); } void ColorParameter::onButtonPressed() { QColor color = _value; if ( !_dialog ) { _dialog = new QColorDialog(color,0); connect(_dialog,SIGNAL(currentColorChanged(QColor)), this, SLOT(colorChanged(QColor))); } else { _dialog->setCurrentColor(color); } if ( _alphaChannel ) { _dialog->setOptions(QColorDialog::ShowAlphaChannel|QColorDialog::NoButtons); } else { _dialog->setOptions(QColorDialog::NoButtons); } _dialog->exec(); } void ColorParameter::colorChanged(const QColor & color) { if ( color.isValid() ) { _value = color; updateButtonColor(); emit valueChanged(); } } void ColorParameter::updateButtonColor() { QPainter painter(&_pixmap); QColor color(_value); if ( _alphaChannel ) painter.drawImage(0,0,QImage(":images/transparency.png")); painter.setBrush(color); painter.setPen(Qt::black); painter.drawRect(0,0,_pixmap.width()-1,_pixmap.height()-1); _button->setIcon(_pixmap); } gmic-1.6.8/zart/src/DialogLicense.cpp0000664000175000017500000000500612632021514017661 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file DialogLicense.cpp * @author Sebastien Fourey * @date Feb. 2012 * @brief Definition of methods of DialogLicense. * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "License" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "DialogLicense.h" #include "Common.h" #include /** * Constructor */ DialogLicense::DialogLicense( QWidget * parent ) :QDialog( parent ) { setupUi( this ); QFile license(":/Licence_CeCILL_V2-en.html"); license.open(QFile::ReadOnly); _text->setText(license.readAll()); } gmic-1.6.8/zart/src/LinkParameter.cpp0000664000175000017500000000721212632021514017716 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file LinkParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class LinkParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "LinkParameter.h" #include "Common.h" #include #include #include #include #include LinkParameter::LinkParameter(QDomNode node, QObject *parent) : AbstractParameter(parent), _label(0) { _text = node.attributes().namedItem( "name" ).nodeValue(); _url = node.attributes().namedItem( "url" ).nodeValue(); QString align = node.toElement().attribute("align",QString("left")); if ( align == "left" ) _alignment = Qt::AlignLeft; if ( align == "center" ) _alignment = Qt::AlignHCenter; if ( align == "right" ) _alignment = Qt::AlignRight; } LinkParameter::~LinkParameter() { delete _label; } void LinkParameter::addTo(QWidget * widget, int row) { QGridLayout * grid = dynamic_cast( widget->layout() ); if ( ! grid ) return; delete _label; _label = new QLabel(QString("%1").arg(_text).arg(_url),widget); _label->setAlignment(_alignment); _label->setTextFormat(Qt::RichText); _label->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed); connect(_label, SIGNAL(linkActivated(QString)), this, SLOT(onLinkActivated(QString)) ); grid->addWidget(_label,row,0,1,3); } QString LinkParameter::textValue() const { return QString::null; } void LinkParameter::reset() { } void LinkParameter::saveValueInDOM() { } void LinkParameter::onLinkActivated(const QString &link) { QDesktopServices::openUrl(QUrl(link)); } gmic-1.6.8/zart/src/ConstParameter.cpp0000664000175000017500000000540312632021514020107 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file ConstParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class ConstParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "ConstParameter.h" #include "Common.h" #include ConstParameter::ConstParameter(QDomNode node, QObject *parent) : AbstractParameter(parent) { _value = node.attributes().namedItem( "value" ).nodeValue(); } ConstParameter::~ConstParameter() { } bool ConstParameter::isVisible() const { return false; } void ConstParameter::addTo(QWidget *, int) { } QString ConstParameter::textValue() const { return QString("%1").arg(_value); } void ConstParameter::reset() { } void ConstParameter::saveValueInDOM() { } gmic-1.6.8/zart/src/ChoiceParameter.cpp0000664000175000017500000001001612632021514020207 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file ChoiceParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class AbstractParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "ChoiceParameter.h" #include "Common.h" #include #include #include #include #include ChoiceParameter::ChoiceParameter(QDomNode node, QObject *parent) : AbstractParameter(parent), _node(node), _label(0), _comboBox(0) { _name = node.attributes().namedItem( "name" ).nodeValue(); QString def = node.toElement().attribute("default","0"); QString value = node.toElement().attribute("savedValue",def); _default = def.toInt(); _value = value.toInt(); } ChoiceParameter::~ChoiceParameter() { delete _comboBox; delete _label; } void ChoiceParameter::addTo(QWidget * widget, int row) { QGridLayout * grid = dynamic_cast( widget->layout() ); if ( ! grid ) return; delete _comboBox; delete _label; _comboBox = new QComboBox(widget); QDomNamedNodeMap attributes = _node.attributes(); bool done = false; for ( int i = 0; i < 50 && !done; ++i ) { QDomAttr attr = attributes.namedItem(QString("choice%1").arg(i)).toAttr(); if ( attr.isNull() ) { done = true; } else { _comboBox->addItem(attr.nodeValue(),QVariant(i)); } } _comboBox->setCurrentIndex(_value); grid->addWidget(_label = new QLabel(_name,widget),row,0,1,1); grid->addWidget(_comboBox,row,1,1,2); connect( _comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onComboBoxIndexChanged(int))); } QString ChoiceParameter::textValue() const { return QString("%1").arg(_comboBox->currentIndex()); } void ChoiceParameter::reset() { _comboBox->setCurrentIndex(_default); _value = _default; } void ChoiceParameter::saveValueInDOM() { _node.toElement().setAttribute("savedValue",_comboBox->currentIndex()); } void ChoiceParameter::onComboBoxIndexChanged(int i) { _value = i; emit valueChanged(); } gmic-1.6.8/zart/src/Makefile0000664000175000017500000000004012632021514016104 0ustar dtschumpdtschump.PHONY: all all: cd ..; make gmic-1.6.8/zart/src/FileParameter.cpp0000664000175000017500000001055712632021514017706 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file FileParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class AbstractParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "FileParameter.h" #include "Common.h" #include #include #include #include #include #include #include FileParameter::FileParameter(QDomNode node, QObject *parent) : AbstractParameter(parent), _node(node), _label(0), _button(0) { _name = node.attributes().namedItem( "name" ).nodeValue(); _default = node.toElement().attribute("default",QString()); _value = node.toElement().attribute("savedValue",_default); } FileParameter::~FileParameter() { delete _label; delete _button; } void FileParameter::addTo(QWidget * widget, int row) { QGridLayout * grid = dynamic_cast( widget->layout() ); if ( ! grid ) return; delete _label; delete _button; QString buttonText; if ( _value.isEmpty() ) { buttonText = "..."; } else { int w = widget->contentsRect().width()/3; QFontMetrics fm(widget->font()); buttonText = fm.elidedText(QFileInfo(_value).fileName(),Qt::ElideRight,w); } _button = new QPushButton(buttonText,widget); grid->addWidget(_label = new QLabel(_name,widget),row,0,1,1); grid->addWidget(_button,row,1,1,2); connect( _button, SIGNAL(clicked()), this, SLOT(onButtonPressed()) ); } QString FileParameter::textValue() const { if ( _value.isEmpty() ) return QString("\"\\\"\\\"\""); else return QString("\"%1\"").arg(_value); } void FileParameter::reset() { _value = _default; } void FileParameter::saveValueInDOM() { _node.toElement().setAttribute("savedValue",_value); } void FileParameter::onButtonPressed() { QString folder; if ( !_value.isEmpty() ) { folder = QFileInfo(_value).path(); } QString filename = QFileDialog::getSaveFileName(0,"Select a file",folder,QString(),0, QFileDialog::DontConfirmOverwrite); if ( filename.isNull() ) { _value = ""; _button->setText("..."); } else { _value = filename; int w = _button->contentsRect().width()-10; QFontMetrics fm(_button->font()); _button->setText(fm.elidedText(QFileInfo(_value).fileName(),Qt::ElideRight,w)); } emit valueChanged(); } gmic-1.6.8/zart/src/StillImageSource.cpp0000664000175000017500000000631612632021514020377 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file StillImageSource.cpp * @author Sebastien Fourey * @date Oct 2014 * @brief Definition of the methods of the class StillImageSource * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "StillImageSource.h" #include #include #include "ImageConverter.h" StillImageSource::StillImageSource() { _filename = ""; } StillImageSource::~StillImageSource() { if ( image() ) { IplImage * iplImage = image(); cvReleaseImage(&iplImage); } } void StillImageSource::capture() { } bool StillImageSource::loadImage(QString filename) { QImage qimage; QFileInfo info(filename); if ( ! info.isReadable() ) { return false; } if ( ! qimage.load(filename) ) { return false; } QImage rgb = qimage.convertToFormat(QImage::Format_RGB888); _filename = info.fileName(); _filePath = info.absolutePath(); IplImage * iplImage = image(); if ( iplImage ) cvReleaseImage(&iplImage); iplImage = 0; ImageConverter::convert(rgb,&iplImage); setImage(iplImage); return true; } const QString & StillImageSource::filename() const { return _filename; } const QString & StillImageSource::filePath() const { return _filePath; } gmic-1.6.8/zart/src/ImageSource.cpp0000664000175000017500000000561512632021514017370 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file ImageSource.cpp * @author Sebastien Fourey * @date Oct 2014 * @brief Definition of the methods of the class ImageSource * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "ImageSource.h" ImageSource::ImageSource() { _width = 0; _height = 0; _image = 0; } ImageSource::~ImageSource() { } IplImage * ImageSource::image() const { return _image; } void ImageSource::setWidth(int width) { _width = width; } void ImageSource::setHeight(int height) { _height = height; } void ImageSource::setImage(IplImage *image) { _image = image; if ( _image ) { _width = image->width; _height = image->height; } else { _width = 0; _height = 0; } } int ImageSource::width() const { return _width; } int ImageSource::height() const { return _height; } QSize ImageSource::size() const { return QSize(_width,_height); } gmic-1.6.8/zart/src/VideoFileSource.cpp0000664000175000017500000000733412632021514020214 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file VideoFileSource.cpp * @author Sebastien Fourey * @date Oct 2014 * @brief Definition of the methods of the class VideoFileSource * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "VideoFileSource.h" #include #include #include #include "Common.h" VideoFileSource::VideoFileSource() { _capture = 0; _filename = ""; _videoIsReadable = false; _loop = true; } VideoFileSource::~VideoFileSource() { cvReleaseCapture(&_capture); } void VideoFileSource::capture() { if ( !_videoIsReadable ) return; IplImage * newImage = cvQueryFrame(_capture); if ( ! newImage ) { cvReleaseCapture(&_capture); loadVideoFile(_filename); if ( _loop ) newImage = cvQueryFrame(_capture); } setImage(newImage); } bool VideoFileSource::loadVideoFile(QString filename) { QFileInfo info(filename); if ( ! info.isReadable() ) return false; _capture = cvCaptureFromFile(filename.toLatin1().constData()); if ( _capture ) { IplImage * iplImage = cvQueryFrame(_capture); if ( iplImage ) { _filename = filename; _filePath = info.absolutePath(); _videoIsReadable = true; setWidth(iplImage->width); setHeight(iplImage->height); } else { _filename.clear(); _videoIsReadable = false; setWidth(0); setHeight(0); setImage(0); QMessageBox::critical(0,"Error","Could not decode video file.\nTry to install gstreamer-ffmpeg..."); } } return _videoIsReadable; } const QString & VideoFileSource::filename() const { return _filename; } const QString & VideoFileSource::filePath() const { return _filePath; } void VideoFileSource::setLoop(bool on) { _loop = on; } gmic-1.6.8/zart/src/TextParameter.cpp0000664000175000017500000000722512632021514017751 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file TextParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class TextParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "TextParameter.h" #include "Common.h" #include #include #include #include TextParameter::TextParameter(QDomNode node, QObject *parent) : AbstractParameter(parent), _node(node), _label(0), _lineEdit(0) { _name = node.attributes().namedItem( "name" ).nodeValue(); QString def = node.attributes().namedItem( "default" ).nodeValue(); _default = node.toElement().attribute("default",QString()); _value = node.toElement().attribute("savedValue",_default); } TextParameter::~TextParameter() { delete _lineEdit; delete _label; } void TextParameter::addTo(QWidget * widget, int row) { QGridLayout * grid = dynamic_cast( widget->layout() ); if ( ! grid ) return; delete _label; delete _lineEdit; _lineEdit = new QLineEdit(_value,widget); grid->addWidget(_label = new QLabel(_name,widget),row,0,1,1); grid->addWidget(_lineEdit,row,1,1,2); connect(_lineEdit,SIGNAL(editingFinished()), this,SIGNAL(valueChanged())); } QString TextParameter::textValue() const { QString text = _lineEdit->text(); text.replace(QChar('"'),QString("\\\"")); if ( _lineEdit->text().isEmpty()) return QString("\"\\\"\\\"\""); else return QString("\"%1\"").arg(text); } void TextParameter::reset() { _lineEdit->setText(_default); _value = _default; } void TextParameter::saveValueInDOM() { _node.toElement().setAttribute("savedValue",_lineEdit->text()); } gmic-1.6.8/zart/src/FullScreenWidget.cpp0000664000175000017500000001042112632021514020362 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file FullScreenWidget.cpp * @author Sebastien Fourey * @date July 2010 * @brief Declaration of the class FullScreenWidget * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include #include "FullScreenWidget.h" #include "ImageView.h" #include #include #include #include #include "MainWindow.h" FullScreenWidget::FullScreenWidget(MainWindow * mainwindow) : QWidget(0), _mainWindow(mainwindow) { setupUi(this); #if QT_VERSION >= 0x040600 _tbFoldRightPanel->setIcon( QIcon::fromTheme( "window-close") ); #else _tbFoldRightPanel->setText("Hide >>"); #endif connect(_tbFoldRightPanel,SIGNAL(clicked()), _rightFrame, SLOT(hide())); connect(_tbFoldRightPanel,SIGNAL(clicked()), _imageView, SLOT(setFocus())); connect( _imageView, SIGNAL(escapePressed()), this, SIGNAL(escapePressed()) ); connect( _imageView, SIGNAL(spaceBarPressed()), this, SIGNAL(spaceBarPressed()) ); connect( _imageView, SIGNAL( mousePress( QMouseEvent * ) ), _mainWindow, SLOT( imageViewMouseEvent( QMouseEvent * ) ) ); connect( _imageView, SIGNAL( mouseMove( QMouseEvent * ) ), _mainWindow, SLOT( imageViewMouseEvent( QMouseEvent * ) ) ); _imageView->setMouseTracking( true ); setMouseTracking(true); _rightFrame->setVisible(false); _splitter->setChildrenCollapsible(false); layout()->setContentsMargins(1,0,1,0); } FullScreenWidget::~FullScreenWidget() { } void FullScreenWidget::keyPressEvent( QKeyEvent * e ) { if ( e->key() == Qt::Key_Escape || e->key() == Qt::Key_F5) { emit escapePressed(); e->accept(); } if ( e->key() == Qt::Key_Space && !_rightFrame->isVisible() ) { emit spaceBarPressed(); e->accept(); } } ImageView * FullScreenWidget::imageView() { return _imageView; } QTreeWidget * FullScreenWidget::treeWidget() { return _treePresetsFullScreen; } CommandParamsWidget * FullScreenWidget::commandParamsWidget() { return _commandParamsWidget; } void FullScreenWidget::showEvent(QShowEvent *) { _imageView->setFocus(); } void FullScreenWidget::mouseMoveEvent(QMouseEvent *event) { if ( event->x() == width() - 1 && !_rightFrame->isVisible() ) { _rightFrame->setVisible(true); } } gmic-1.6.8/zart/src/ZArt.cpp0000664000175000017500000000772312632021514016047 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file ZArt.cpp * @author Sebastien Fourey * @date July 2010 * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include using namespace std; #include #include #include #include "WebcamSource.h" #include "Common.h" #include "MainWindow.h" #include "gmic.h" #ifdef _IS_UNIX_ #include void onSigQuit(int) { std::cout << "Got a Quit/Interrupt signal from keyboard.\n"; qApp->closeAllWindows(); exit(0); } #endif int main( int argc, char *argv[] ) { #ifdef _IS_UNIX_ signal(SIGQUIT,onSigQuit); signal(SIGINT,onSigQuit); #endif QApplication app( argc, argv ); app.setWindowIcon( QIcon(":images/gmic_hat.png") ); QCoreApplication::setOrganizationName("GREYC"); QCoreApplication::setOrganizationDomain("greyc.fr"); QCoreApplication::setApplicationName("ZArt"); QCoreApplication::setAttribute(Qt::AA_DontUseNativeMenuBar); QStringList args = app.arguments(); QStringList::iterator it = args.begin(); while (it != args.end()) { if ( it->startsWith("-h") || it->startsWith("--help") ) { cout << "Usage:" << endl << " " << QFileInfo(argv[0]).baseName().toLatin1().constData() << " [options]" << endl << " " << "Options: " << endl << " --help | -h : print this help." << endl << endl; exit(EXIT_SUCCESS); } ++it; } QSplashScreen splashScreen(QPixmap(":/images/splash.png")); splashScreen.show(); app.processEvents(); WebcamSource::retrieveWebcamResolutions(WebcamSource::getWebcamList(), &splashScreen); if ( ! gmic::init_rc() ) { cerr << "[ZArt] Warning: Could not create resources directory.\n"; } MainWindow mainWindow; mainWindow.show(); splashScreen.finish(&mainWindow); return app.exec(); } gmic-1.6.8/zart/src/NoteParameter.cpp0000664000175000017500000000601312632021514017724 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file NoteParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class NoteParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "NoteParameter.h" #include "Common.h" #include #include NoteParameter::NoteParameter(QDomNode node, QObject *parent) : AbstractParameter(parent), _label(0) { _text = node.attributes().namedItem( "text" ).nodeValue(); } NoteParameter::~NoteParameter() { delete _label; } void NoteParameter::addTo(QWidget * widget, int row) { QGridLayout * grid = dynamic_cast( widget->layout() ); if ( ! grid ) return; delete _label; _label = new QLabel(_text,widget); _label->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed); _label->setWordWrap(true); grid->addWidget(_label,row,0,1,3); } QString NoteParameter::textValue() const { return QString::null; } void NoteParameter::reset() { } void NoteParameter::saveValueInDOM() { } gmic-1.6.8/zart/src/BoolParameter.cpp0000664000175000017500000000705412632021514017720 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file BoolParameter.cpp * @author Sebastien Fourey * @date Nov 2014 * * @brief Declaration of the class AbstractParameter * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include "BoolParameter.h" #include "Common.h" #include #include #include #include BoolParameter::BoolParameter(QDomNode node, QObject *parent) : AbstractParameter(parent), _node(node), _label(0), _checkBox(0) { _name = node.attributes().namedItem( "name" ).nodeValue(); QString def = node.attributes().namedItem( "default" ).nodeValue(); QString value = node.toElement().attribute("savedValue",def); _default = def.toInt(); _value = value.toInt(); } BoolParameter::~BoolParameter() { delete _checkBox; delete _label; } void BoolParameter::addTo(QWidget * widget, int row) { QGridLayout * grid = dynamic_cast( widget->layout() ); if ( ! grid ) return; delete _checkBox; delete _label; _checkBox = new QCheckBox(_name,widget); _checkBox->setChecked(_value); grid->addWidget(_checkBox,row,0,1,3); connect( _checkBox, SIGNAL(toggled(bool)), this, SLOT(onCheckBoxChanged(bool))); } QString BoolParameter::textValue() const { return _value?"1":"0"; } void BoolParameter::reset() { _checkBox->setChecked(_default); _value = _default; } void BoolParameter::onCheckBoxChanged(bool on) { _value = on; emit valueChanged(); } void BoolParameter::saveValueInDOM() { _node.toElement().setAttribute("savedValue",_checkBox->isChecked()); } gmic-1.6.8/zart/src/MainWindow.cpp0000664000175000017500000011407412632021514017241 0ustar dtschumpdtschump/** -*- mode: c++ ; c-basic-offset: 2 -*- * @file MainWindow.cpp * @author Sebastien Fourey * @date July 2010 * @brief Declaration of the class MainWindow * * This file is part of the ZArt software's source code. * * Copyright Sebastien Fourey / GREYC Ensicaen (2010-...) * * https://foureys.users.greyc.fr/ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the * choice of several manipulations on a video stream aquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". See also the directory "Licence" which comes * with this source code for the full text of the CeCILL license. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Common.h" #include "DialogAbout.h" #include "DialogLicense.h" #include "ImageConverter.h" #include "ImageView.h" #include "MainWindow.h" #include "WebcamSource.h" #include "FilterThread.h" #include "TreeWidgetPresetItem.h" #include "OutputWindow.h" #include "FullScreenWidget.h" #if QT_VERSION >= 0x050201 #define CURRENTDATA( CBOX ) ( CBOX -> currentData() ) #else #define CURRENTDATA( CBOX ) ( CBOX -> itemData( CBOX -> currentIndex() ) ) #endif MainWindow::MainWindow( QWidget * parent ) : QMainWindow( parent ), _filterThread(0), _source( Webcam ), _currentSource( &_webcam ), _currentDir( "." ), _zeroFPS( false ), _presetsCount(0) { setupUi(this); _outputWindow = 0; delete _frameImageView->layout(); _frameImageView->setLayout(new QGridLayout); _frameImageView->layout()->addWidget(_imageView); QMargins margins = _rightPanel->layout()->contentsMargins(); margins.setTop(0); margins.setBottom(0); _rightPanel->layout()->setContentsMargins(margins); _rightPanelSplitter->setCollapsible(0,false); _verticalSplitter->setCollapsible(0,false); _verticalSplitter->setCollapsible(1,true); _fullScreenWidget = new FullScreenWidget(this); connect( _fullScreenWidget, SIGNAL(escapePressed()), this, SLOT( leaveFullScreenMode()) ); _displayMode = InWindow; QSettings settings; // Menu and actions QMenu * menu; menu = menuBar()->addMenu( "&File" ); QAction * action = new QAction( "&Save presets...", this ); action->setShortcut( QKeySequence::SaveAs ); #if QT_VERSION >= 0x040600 action->setIcon( QIcon::fromTheme( "document-save-as" ) ); #endif menu->addAction( action ); connect( action, SIGNAL( triggered() ), this, SLOT( savePresetsFile() ) ); action = new QAction( "&Quit", this ); action->setShortcut( QKeySequence::Quit ); #if QT_VERSION >= 0x040600 action->setIcon( QIcon::fromTheme( "application-exit", QIcon(":/images/application-exit.png") ) ); #else action->setIcon( QIcon(":/images/application-exit.png") ); #endif connect( action, SIGNAL( triggered() ), qApp, SLOT( closeAllWindows() ) ); menu->addAction( action ); #if QT_VERSION >= 0x040600 _tbZoomOriginal->setIcon( QIcon::fromTheme("zoom-original", QIcon(":/images/zoom-original.png") )); _tbZoomFit->setIcon( QIcon::fromTheme("zoom-fit-best", QIcon(":/images/zoom-fit-best.png") )); _tbCamResolutionsRefresh->setIcon( QIcon::fromTheme("view-refresh" ) ); #else _tbZoomOriginal->setIcon( QIcon(":/images/zoom-original.png") ); _tbZoomFit->setIcon( QIcon(":/images/zoom-fit-best.png") ); #endif connect(_tbCamResolutionsRefresh,SIGNAL(clicked(bool)), this,SLOT(onRefreshCameraResolutions())); // Find available cameras, and setup the default one QList cameras = WebcamSource::getWebcamList(); initGUIFromCameraList(cameras); QSize cameraSize = CURRENTDATA(_comboCamResolution).toSize(); if ( ! cameraSize.isValid() ) { _imageView->resize( QSize(640,480) ); } else { _imageView->resize( cameraSize ); } _frameImageView->resize( _imageView->size() ); // Options menu menu = menuBar()->addMenu( "&Options" ); action = menu->addAction("Show right &panel",this,SLOT(onRightPanel(bool)),QKeySequence("Ctrl+F")); action->setCheckable(true); action->setChecked(settings.value("showRightPanel",true).toBool()); action = menu->addAction("&Full screen",this,SLOT( enterFullScreenMode() ), QKeySequence( Qt::Key_F5 ) ); action->setShortcutContext( Qt::ApplicationShortcut ); _outputWindowAction = new QAction("&Secondary window",this); _outputWindowAction->setCheckable(true); connect( _outputWindowAction, SIGNAL(toggled(bool)), this, SLOT(onOutputWindow(bool)) ); menu->addAction(_outputWindowAction); menu->addSeparator(); action = menu->addAction("Detect &cameras", this,SLOT(onDetectCameras()) ); menu->addSeparator(); // Presets QString presetsConfig = settings.value("Presets",QString("Built-in")).toString(); QActionGroup * group = new QActionGroup(menu); group->setExclusive(true); // Built-in _builtInPresetsAction = new QAction( "&Built-in presets", menu ); _builtInPresetsAction->setCheckable( true ); connect( _builtInPresetsAction, SIGNAL( toggled(bool) ), this, SLOT( onUseBuiltinPresets(bool) ) ); group->addAction( _builtInPresetsAction ); menu->addAction( _builtInPresetsAction ); _builtInPresetsAction->setChecked(true); // Default to Built-in presets // File action = menu->addAction("&Presets file...",this,SLOT( setPresetsFile() )); action->setCheckable( true ); group->addAction( action ); QString filename = settings.value("PresetsFile",QString()).toString(); if ( presetsConfig == "File" && !filename.isEmpty() ) { setPresetsFile(filename); action->setChecked(true); } // Refresh menu->addSeparator(); action = menu->addAction("&Reload presets",this,SLOT(onReloadPresets()),QKeySequence("Ctrl+R")); action->setShortcutContext(Qt::ApplicationShortcut); // Help menu menu = menuBar()->addMenu( "&Help" ); action = menu->addAction("&Visit G'MIC website", this, SLOT( visitGMIC() ) ); action->setIcon( QIcon(":/images/gmic_hat.png") ); action = menu->addAction("&License...", this, SLOT(license()) ); action = menu->addAction("&About...", this, SLOT(about())); _imageView->QWidget::resize( _webcam.width(), _webcam.height() ); _bgZoom = new QButtonGroup(this); _bgZoom->setExclusive(true); _tbZoomFit->setCheckable(true); _tbZoomFit->setChecked(true); _tbZoomOriginal->setCheckable(true); _bgZoom->addButton(_tbZoomOriginal); _bgZoom->addButton(_tbZoomFit); _cbPreviewMode->addItem("Full",FilterThread::Full); _cbPreviewMode->addItem("Top",FilterThread::TopHalf); _cbPreviewMode->addItem("Left",FilterThread::LeftHalf); _cbPreviewMode->addItem("Bottom",FilterThread::BottomHalf); _cbPreviewMode->addItem("Right",FilterThread::RightHalf); _cbPreviewMode->addItem("Duplicate horizontal",FilterThread::DuplicateHorizontal); _cbPreviewMode->addItem("Duplicate vertical",FilterThread::DuplicateVertical); _cbPreviewMode->addItem("Original",FilterThread::Original); #if ( QT_VERSION >= 0x040600 ) _cbPreviewMode->setItemIcon(0,QIcon::fromTheme("view-fullscreen")); _cbPreviewMode->setItemIcon(1,QIcon::fromTheme("go-up")); _cbPreviewMode->setItemIcon(2,QIcon::fromTheme("go-previous")); _cbPreviewMode->setItemIcon(3,QIcon::fromTheme("go-down")); _cbPreviewMode->setItemIcon(4,QIcon::fromTheme("go-next")); _cbPreviewMode->setItemIcon(5,QIcon::fromTheme("edit-copy")); _cbPreviewMode->setItemIcon(6,QIcon::fromTheme("edit-copy")); _cbPreviewMode->setItemIcon(7,QIcon::fromTheme("go-home")); _tbCamera->setIcon(QIcon::fromTheme("camera-photo",QIcon(":/images/camera.png"))); #else _tbCamera->setIcon(QIcon(":images/camera.png"); #endif connect( _cbPreviewMode, SIGNAL(activated(int)), this, SLOT(onPreviewModeChanged(int))); connect( _tbZoomOriginal, SIGNAL( clicked() ), _imageView, SLOT( zoomOriginal() ) ); connect( _tbZoomFit, SIGNAL( clicked() ), _imageView, SLOT( zoomFitBest() ) ); connect( _pbApply, SIGNAL( clicked() ), this, SLOT( commandModified() ) ); connect( _tbCamera, SIGNAL( clicked() ), this, SLOT( snapshot() ) ); _imageView->setMouseTracking( true ); connect( _imageView, SIGNAL( mousePress( QMouseEvent * ) ), this, SLOT( imageViewMouseEvent( QMouseEvent * ) ) ); connect( _imageView, SIGNAL( mouseMove( QMouseEvent * ) ), this, SLOT( imageViewMouseEvent( QMouseEvent * ) ) ); connect( _treeGPresets, SIGNAL( itemClicked( QTreeWidgetItem *, int )), this, SLOT( presetClicked( QTreeWidgetItem *, int ) ) ); connect( _fullScreenWidget->treeWidget(), SIGNAL( itemClicked( QTreeWidgetItem *, int )), this, SLOT( presetClicked( QTreeWidgetItem *, int ) ) ); connect( _commandEditor, SIGNAL( commandModified() ), this, SLOT( commandModified() ) ); _sliderWebcamSkipFrames->setRange(0,10); connect( _sliderWebcamSkipFrames, SIGNAL( valueChanged(int) ), this, SLOT( setWebcamSkipFrames(int ) ) ); _sliderVideoSkipFrames->setRange(0,10); connect( _sliderVideoSkipFrames, SIGNAL( valueChanged(int) ), this, SLOT( setVideoSkipFrames(int ) ) ); _sliderImageFPS->setValue(24); _sliderImageFPS->setToolTip("24 fps"); connect( _sliderImageFPS, SIGNAL(valueChanged(int)), this, SLOT(setImageFPS(int))); _zeroFPS = false; _sliderVideoFPS->setValue(24); _sliderVideoFPS->setToolTip("24 fps"); connect( _sliderVideoFPS, SIGNAL(valueChanged(int)), this, SLOT(setVideoFPS(int))); _cbVideoFileLoop->setChecked(true); _videoFile.setLoop(true); connect( _cbVideoFileLoop, SIGNAL(toggled(bool)), this, SLOT(onVideoFileLoop(bool))); _webcamParamsWidget->setVisible( _source == Webcam ); _imageParamsWidget->setVisible( _source == StillImage ); _videoParamsWidget->setVisible( _source == Video ); connect( _pbOpenImageFile, SIGNAL(clicked()), this, SLOT(onOpenImageFile()) ); connect( _pbOpenVideoFile, SIGNAL(clicked()), this, SLOT(onOpenVideoFile()) ); // Image filter for the "Save as..." dialog QList formats = QImageWriter::supportedImageFormats(); QList::iterator it = formats.begin(); QList::iterator end = formats.end(); _imageFilters = "Image file ("; while ( it != end ) { _imageFilters += QString("*.") + QString(*it).toLower() + " "; ++it; } _imageFilters.chop(1); _imageFilters += ")"; _startStopAction = new QAction(this); _startStopAction->setToolTip("Launch processing (Ctrl+P)"); _startStopAction->setShortcut(QKeySequence("Ctrl+P")); _startStopAction->setShortcutContext(Qt::ApplicationShortcut); _startStopAction->setCheckable(true); _tbPlay->setDefaultAction(_startStopAction); changePlayButtonAppearence(false); connect( _fullScreenWidget,SIGNAL(spaceBarPressed()), _startStopAction, SLOT(toggle())); connect( _startStopAction, SIGNAL(toggled(bool)), this, SLOT(changePlayButtonAppearence(bool))); connect( _startStopAction, SIGNAL(toggled(bool)), this, SLOT(onPlayAction(bool))); connect(_commandParamsWidget,SIGNAL(valueChanged()), this,SLOT(onCommandParametersChanged())); connect(_fullScreenWidget->commandParamsWidget(),SIGNAL(valueChanged()), this,SLOT(onCommandParametersChangedFullScreen())); if ( ! settings.value("showRightPanel",true).toBool() ) _rightPanel->hide(); if ( _comboWebcam->count() ) { _webcam.setCameraIndex( CURRENTDATA(_comboWebcam).toInt()); // Update actual source capture size _webcam.start(); _webcam.stop(); } updateWindowTitle(); } MainWindow::~MainWindow() { QSettings settings; for ( int i = 0; i < _cameraDefaultResolutionsIndexes.size(); ++i ) { settings.setValue(QString("WebcamSource/DefaultResolutionCam%1").arg(i), WebcamSource::webcamResolutions(i).at(_cameraDefaultResolutionsIndexes[i])); } if ( _filterThread ) { _filterThread->stop(); _filterThreadSemaphore.release(); _filterThread->wait(); delete _filterThread; } delete _fullScreenWidget; } void MainWindow::setCurrentPreset(QDomNode node) { QDomNode command = node.namedItem("command"); _commandEditor->setPlainText( command.firstChild().toText().data().trimmed() ); _currentPresetNode = node; if ( _displayMode == FullScreen ) { _fullScreenWidget->commandParamsWidget()->saveValuesInDOM(); _fullScreenWidget->commandParamsWidget()->build(node); _commandParamsWidget->build(node); } else { _commandParamsWidget->saveValuesInDOM(); _commandParamsWidget->build(node); } } void MainWindow::showOneSourceImage() { _currentSource->capture(); IplImage * image = _currentSource->image(); if ( image ) { _imageView->imageMutex().lock(); QSize size( image->width, image->height ); if ( _imageView->image().size() != size ) { _imageView->image() = QImage( size, QImage::Format_RGB888 ); } ImageConverter::convert( image, &(_imageView->image()) ); _imageView->imageMutex().unlock(); _imageView->checkSize(); _imageView->repaint(); } } void MainWindow::about() { DialogAbout * d = new DialogAbout( this ); d->exec(); delete d; } void MainWindow::visitGMIC() { QDesktopServices::openUrl(QUrl("http://gmic.eu/")); } void MainWindow::license() { DialogLicense * d = new DialogLicense( this ); d->exec(); delete d; } QString MainWindow::getPreset( const QString & name ) { QDomNodeList list = _presets.elementsByTagName("preset"); for ( int i = 0; i < list.count(); ++i ) { QDomNode n = list.at(i); if ( n.attributes().namedItem( "name" ).nodeValue() == name ) { QDomNode command= n.namedItem("command"); return command.firstChild().toText().data().trimmed(); } } return QString(); } void MainWindow::onImageAvailable() { if ( _displayMode == InWindow ) { _imageView->checkSize(); _imageView->repaint(); } if ( _displayMode == FullScreen) { _fullScreenWidget->imageView()->checkSize(); _fullScreenWidget->imageView()->repaint(); } if ( _outputWindow && _outputWindow->isVisible() && _outputWindowAction->isChecked() ) { _outputWindow->imageView()->checkSize(); _outputWindow->imageView()->repaint(); } } void MainWindow::play() { int pm = _cbPreviewMode->itemData(_cbPreviewMode->currentIndex()).toInt(); FilterThread::PreviewMode previewMode = static_cast(pm); ImageView * viewA = (_displayMode==InWindow)?_imageView:_fullScreenWidget->imageView(); ImageView * viewB = 0; if ( _outputWindow && _outputWindow->isVisible() && _outputWindowAction->isChecked() ) { viewB = _outputWindow->imageView(); } switch (_source) { case Webcam: _filterThread = new FilterThread( _webcam, _commandEditor->toPlainText(), &viewA->image(), &viewA->imageMutex(), (viewB)?&viewB->image():0, (viewB)?&viewB->imageMutex():0, previewMode, _sliderWebcamSkipFrames->value(), -1, 0 ); break; case StillImage: _filterThread = new FilterThread( _stillImage, _commandEditor->toPlainText(), &viewA->image(), &viewA->imageMutex(), (viewB)?&viewB->image():0, (viewB)?&viewB->imageMutex():0, previewMode, 0, _sliderImageFPS->value(), &_filterThreadSemaphore ); break; case Video: _filterThread = new FilterThread( _videoFile, _commandEditor->toPlainText(), &viewA->image(), &viewA->imageMutex(), (viewB)?&viewB->image():0, (viewB)?&viewB->imageMutex():0, previewMode, _sliderVideoSkipFrames->value(), _sliderVideoFPS->value(), 0 ); break; } connect( _filterThread, SIGNAL( imageAvailable() ), this, SLOT( onImageAvailable() ) ); connect( _filterThread, SIGNAL( finished()), this, SLOT( onFilterThreadFinished()) ); connect( _filterThread, SIGNAL( endOfCapture()), this, SLOT( onEndOfSource()) ); if ( _displayMode == FullScreen ) _filterThread->setArguments(_fullScreenWidget->commandParamsWidget()->valueString()); else _filterThread->setArguments(_commandParamsWidget->valueString()); if ( _source == StillImage ) _filterThreadSemaphore.release(); _filterThread->start(); } void MainWindow::stop() { if ( _filterThread ) { _filterThread->stop(); _filterThreadSemaphore.release(); _filterThread->wait(); _filterThread = 0; } } void MainWindow::onEndOfSource() { _startStopAction->setChecked(false); } void MainWindow::onFilterThreadFinished() { delete sender(); } void MainWindow::onCommandParametersChanged() { if ( _filterThread ) { _filterThread->setArguments(_commandParamsWidget->valueString()); if ( _source == StillImage && _zeroFPS ) _filterThreadSemaphore.release(); } } void MainWindow::onCommandParametersChangedFullScreen() { if ( _filterThread ) { if (_displayMode == FullScreen ) { _filterThread->setArguments(_fullScreenWidget->commandParamsWidget()->valueString()); if ( _source == StillImage && _zeroFPS ) _filterThreadSemaphore.release(); } } } void MainWindow::enterFullScreenMode() { if ( _displayMode == FullScreen ) { // F5 shortcut while already fullscreen leaveFullScreenMode(); return; } _displayMode = FullScreen; bool running = _filterThread && _filterThread->isRunning(); stop(); _commandParamsWidget->saveValuesInDOM(); _fullScreenWidget->imageView()->image() = _imageView->image(); _fullScreenWidget->imageView()->zoomFitBest(); _fullScreenWidget->commandParamsWidget()->build(_currentPresetNode); _fullScreenWidget->showFullScreen(); if ( running ) { play(); } } void MainWindow::leaveFullScreenMode() { _fullScreenWidget->close(); _displayMode = InWindow; bool running = _filterThread && _filterThread->isRunning(); stop(); _fullScreenWidget->commandParamsWidget()->saveValuesInDOM(); _commandParamsWidget->build(_currentPresetNode); if ( running ) { play(); } } void MainWindow::onPlayAction(bool on) { if ( !on && _filterThread ) { stop(); if ( _source == Webcam ) { _webcam.stop(); } changePlayButtonAppearence(false); return; } if ( on && !_filterThread ){ if ( (_source == Video && _videoFile.filename().isEmpty()) || (_source == StillImage && _stillImage.filename().isEmpty() ) ) { QMessageBox::information(this,"Information","No input file.\nPlease select one first."); _tabParams->setCurrentIndex(0); _startStopAction->setChecked(false); } else { if ( _source == Webcam ) { _webcam.start(); } play(); changePlayButtonAppearence(true); } return; } } void MainWindow::onComboSourceChanged(int i) { static bool firstRun = true; bool running = _filterThread && _filterThread->isRunning(); if ( running ) { stop(); } _source = static_cast(_comboSource->itemData(i).toInt()); switch (_source) { case Webcam: _currentSource = &_webcam; break; case StillImage: _currentSource = &_stillImage; _webcam.stop(); break; case Video: _currentSource = &_videoFile; _webcam.stop(); break; } _webcamParamsWidget->setVisible( _source == Webcam ); _imageParamsWidget->setVisible( _source == StillImage); _videoParamsWidget->setVisible( _source == Video ); updateWindowTitle(); if ( _source == StillImage && _stillImage.filename().isEmpty() && ( ! firstRun || WebcamSource::getCachedWebcamList().size() ) ) { onOpenImageFile(); } if ( _source == Video && _videoFile.filename().isEmpty() ) onOpenVideoFile(); if ( running ) { if ( _source == Webcam ) { _webcam.start(); } play(); } else { showOneSourceImage(); } firstRun = false; } void MainWindow::onOpenImageFile() { QString filename; filename = QFileDialog::getOpenFileName(this, "Select an image file", _stillImage.filePath().isEmpty()?_videoFile.filePath():_stillImage.filePath(), "Image files (*.bmp *.gif *.jpg *.png *.pbm *.pgm *.ppm *.xbm *.xpm *.svg)"); if (filename.isEmpty()) { return; } if ( _source == StillImage && _filterThread ) { stop(); if (_stillImage.loadImage(filename) ) { updateWindowTitle(); } play(); } else { if (_stillImage.loadImage(filename) ) { updateWindowTitle(); showOneSourceImage(); } } } void MainWindow::onOpenVideoFile() { QString filename; filename = QFileDialog::getOpenFileName(this,"Select a video file", _videoFile.filePath().isEmpty()?_stillImage.filePath():_videoFile.filePath(), "Video files (*.avi *.mpg)"); if (filename.isEmpty()) return; if ( _source == Video && _filterThread ) { stop(); if (_videoFile.loadVideoFile(filename) ) { updateWindowTitle(); play(); } } else { if (_videoFile.loadVideoFile(filename) ) { updateWindowTitle(); showOneSourceImage(); } } } void MainWindow::updateWindowTitle() { QString name; switch (_source) { case Webcam: setWindowTitle( QString("ZArt %1 (Webcam %2x%3)") .arg((ZART_VERSION)) .arg(_currentSource->width()) .arg(_currentSource->height())); break; case StillImage: name = QFileInfo(_stillImage.filename()).fileName(); if ( name.isEmpty() ) setWindowTitle( QString("ZArt %1 (No input file)") .arg((ZART_VERSION)) ); else setWindowTitle( QString("ZArt %1 (%2 %3x%4)") .arg((ZART_VERSION)) .arg(name) .arg(_currentSource->width()) .arg(_currentSource->height()) ); break; case Video: name = QFileInfo(_videoFile.filename()).fileName(); if ( name.isEmpty() ) setWindowTitle( QString("ZArt %1 (No input file)") .arg((ZART_VERSION)) ); else setWindowTitle( QString("ZArt %1 (%2 %3x%4)") .arg((ZART_VERSION)) .arg(name) .arg(_currentSource->width()) .arg(_currentSource->height()) ); break; } } void MainWindow::onVideoFileLoop(bool on) { _videoFile.setLoop(on); } void MainWindow::changePlayButtonAppearence(bool on) { if ( on ) { #if QT_VERSION >= 0x040600 _startStopAction->setIcon( QIcon::fromTheme("media-playback-stop", QIcon(":/images/media-playback-stop.png")) ); #else _startStopAction->setIcon( QIcon(":/images/media-playback-stop.png") ); #endif _startStopAction->setToolTip("Stop processing (Ctrl+P)"); } else { #if QT_VERSION >= 0x040600 _startStopAction->setIcon( QIcon::fromTheme("media-playback-start", QIcon(":/images/media-playback-start.png")) ); #else _startStopAction->setIcon( QIcon(":/images/media-playback-start.png") ); #endif _startStopAction->setToolTip("Launch processing (Ctrl+P)"); } } void MainWindow::imageViewMouseEvent( QMouseEvent * event ) { int buttons = 0; if ( event->buttons() & Qt::LeftButton ) buttons |= 1; if ( event->buttons() & Qt::RightButton ) buttons |= 2; if ( event->buttons() & Qt::MidButton ) buttons |= 4; if (_filterThread) _filterThread->setMousePosition( event->x(), event->y(), buttons ); if ( _source == StillImage && _zeroFPS ) _filterThreadSemaphore.release(); } void MainWindow::commandModified() { if ( _filterThread && _filterThread->isRunning() ) { stop(); play(); } } void MainWindow::presetClicked( QTreeWidgetItem * item, int ) { if ( item->childCount() ) return; TreeWidgetPresetItem * presetItem = dynamic_cast(item); if ( presetItem ) setCurrentPreset( presetItem->node() ); _tabParams->setCurrentIndex(1); int previewMode = _cbPreviewMode->itemData(_cbPreviewMode->currentIndex()).toInt(); if ( previewMode == FilterThread::Original ) { _cbPreviewMode->setCurrentIndex(0); onPreviewModeChanged(0); } commandModified(); } void MainWindow::snapshot() { if ( _filterThread ) _startStopAction->setChecked(false); QString filename = QFileDialog::getSaveFileName( this, "Save image as...", _currentDir, _imageFilters, 0, 0 ); if ( ! filename.isEmpty() ) { QFileInfo info( filename ); _currentDir = info.filePath(); QImageWriter writer( filename ); _imageView->imageMutex().lock(); writer.write( _imageView->image() ); _imageView->imageMutex().unlock(); } } void MainWindow::setWebcamSkipFrames(int i) { _sliderWebcamSkipFrames->setToolTip(QString("%1").arg(i)); QToolTip::showText(_sliderWebcamSkipFrames->mapToGlobal(QPoint(0,0)),QString("%1").arg(i),_sliderWebcamSkipFrames); if ( _filterThread ) { _filterThread->setFrameSkip( i ); } } void MainWindow::setVideoSkipFrames(int i) { _sliderVideoSkipFrames->setToolTip(QString("%1").arg(i)); QToolTip::showText(_sliderVideoSkipFrames->mapToGlobal(QPoint(0,0)),QString("%1").arg(i),_sliderVideoSkipFrames); if ( _filterThread ) { _filterThread->setFrameSkip( i ); } } void MainWindow::setImageFPS(int fps) { _sliderImageFPS->setToolTip(QString("%1 fps").arg(fps)); QToolTip::showText(_sliderImageFPS->mapToGlobal(QPoint(0,0)),QString("%1 fps").arg(fps),_sliderImageFPS); if ( _filterThread ) { _filterThread->setFPS(fps); } if ( _source == StillImage && _zeroFPS ) { _filterThreadSemaphore.release(); } _zeroFPS = !fps; } void MainWindow::setVideoFPS(int fps) { _sliderVideoFPS->setToolTip(QString("%1 fps").arg(fps)); QToolTip::showText(_sliderVideoFPS->mapToGlobal(QPoint(0,0)),QString("%1 fps").arg(fps),_sliderVideoFPS); if ( _filterThread ) { _filterThread->setFPS(fps); } } void MainWindow::onWebcamComboChanged( int index ) { index = _comboWebcam->itemData(index).toInt(); if ( _source == Webcam && _filterThread && _filterThread->isRunning() ) { stop(); _webcam.stop(); updateCameraResolutionCombo(); _webcam.setCaptureSize(CURRENTDATA(_comboCamResolution).toSize()); _webcam.setCameraIndex( index ); _webcam.start(); play(); } else { updateCameraResolutionCombo(); _webcam.setCaptureSize(CURRENTDATA(_comboCamResolution).toSize()); _webcam.setCameraIndex( index ); } } void MainWindow::onWebcamResolutionComboChanged( int i ) { int currentCam = _comboWebcam->currentIndex(); _cameraDefaultResolutionsIndexes[currentCam] = i; QSize resolution = CURRENTDATA(_comboCamResolution).toSize(); if ( _source == Webcam && _filterThread && _filterThread->isRunning() ) { stop(); _webcam.setCaptureSize(resolution); play(); } else { _webcam.setCaptureSize(resolution); // Update actual source capture size _webcam.start(); _webcam.stop(); } updateWindowTitle(); } void MainWindow::setPresets(const QDomElement & domE) { _treeGPresets->clear(); _fullScreenWidget->treeWidget()->clear(); _presetsCount = 0; addPresets( domE, 0 , 0); _treeGPresets->setHeaderLabel(QString("Presets (%1)").arg(_presetsCount)); _fullScreenWidget->treeWidget()->setHeaderLabel(QString("Presets (%1)").arg(_presetsCount)); } void MainWindow::addPresets( const QDomElement & domE, TreeWidgetPresetItem * parentRegular, TreeWidgetPresetItem * parentFullscreen ) { for( QDomNode node = domE.firstChild(); !node.isNull(); node = node.nextSibling() ) { QString name = node.attributes().namedItem( "name" ).nodeValue(); if ( node.nodeName() == QString("preset") ) { // QString text = n.firstChild().toText().data(); QStringList strList; strList << name; if ( ! parentRegular ) { Q_ASSERT( ! parentFullscreen ); _treeGPresets->addTopLevelItem( new TreeWidgetPresetItem( strList, node ) ); _fullScreenWidget->treeWidget()->addTopLevelItem( new TreeWidgetPresetItem( strList, node ) ); } else { new TreeWidgetPresetItem( parentRegular, strList, node ); new TreeWidgetPresetItem( parentFullscreen, strList, node ); } ++_presetsCount; } else if ( node.nodeName() == QString("preset_group") ) { QStringList strList; strList << name; TreeWidgetPresetItem * parent1 = new TreeWidgetPresetItem( strList ); TreeWidgetPresetItem * parent2 = new TreeWidgetPresetItem( strList ); _treeGPresets->addTopLevelItem( parent1 ); _fullScreenWidget->treeWidget()->addTopLevelItem( parent2 ); addPresets( node.toElement(), parent1, parent2 ); } } } void MainWindow::setPresetsFile( const QString & file ) { QString filename = file; if ( filename.isEmpty() ) { QSettings settings; QString s = settings.value("PresetsFile").toString(); QString dir = "."; if ( QFileInfo(s).exists() ) dir = QFileInfo(s).absolutePath(); filename = QFileDialog::getOpenFileName( this, "Open a presets file", dir, "Preset files (*.xml)" ); } if ( ! filename.isEmpty() ) { QSettings settings; settings.setValue( "PresetsFile", filename ); settings.setValue( "Presets", "File" ); QFile presetsTreeFile( filename ); QString error; presetsTreeFile.open( QIODevice::ReadOnly ); _presets.setContent( &presetsTreeFile, false, &error ); presetsTreeFile.close(); setPresets(_presets.elementsByTagName("document").at(0).toElement()); } else { _builtInPresetsAction->setChecked( true ); } } void MainWindow::onUseBuiltinPresets(bool on) { if ( on ) { QFile presetsTreeFile( ":/presets.xml" ); QString error; presetsTreeFile.open( QIODevice::ReadOnly ); _presets.setContent( &presetsTreeFile, false, &error ); presetsTreeFile.close(); setPresets(_presets.elementsByTagName("document").at(0).toElement()); QSettings().setValue( "Presets", "Built-in" ); } } void MainWindow::onReloadPresets() { if ( _builtInPresetsAction->isChecked() ) { onUseBuiltinPresets(true); return; } QSettings settings; QString filename = settings.value( "PresetsFile" ).toString(); setPresetsFile(filename); } void MainWindow::savePresetsFile() { QString filename = QFileDialog::getSaveFileName( this, "Save presets file", ".", "Preset files (*.xml)" ); if ( ! filename.isEmpty() ) { QFile presetsFile( filename ); presetsFile.open( QIODevice::WriteOnly ); presetsFile.write( _presets.toByteArray() ); presetsFile.close(); } } void MainWindow::onPreviewModeChanged( int index ) { int mode = _cbPreviewMode->itemData(index).toInt(); if ( _filterThread ) _filterThread->setPreviewMode(static_cast(mode)); } void MainWindow::onRightPanel( bool on ) { if ( on && !_rightPanel->isVisible()) { _rightPanel->show(); QSettings().setValue("showRightPanel",true); return; } if ( !on && _rightPanel->isVisible()) { _rightPanel->hide(); QSettings().setValue("showRightPanel",false); return; } } void MainWindow::updateCameraResolutionCombo() { disconnect(_comboCamResolution,SIGNAL(currentIndexChanged(int)), this, 0); int index = _comboWebcam->currentIndex(); _comboCamResolution->clear(); const QList & resolutions = WebcamSource::webcamResolutions(index); QList::const_iterator it = resolutions.begin(); while ( it != resolutions.end() ) { _comboCamResolution->addItem(QString("%1 x %2").arg(it->width()).arg(it->height()),*it); ++it; } _comboCamResolution->setCurrentIndex(_cameraDefaultResolutionsIndexes[index]); connect(_comboCamResolution,SIGNAL(currentIndexChanged(int)), this,SLOT(onWebcamResolutionComboChanged(int))); } void MainWindow::onRefreshCameraResolutions() { WebcamSource::clearSavedSettings(); onDetectCameras(); } void MainWindow::onDetectCameras() { if ( _source == Webcam && _filterThread ) { _webcam.stop(); stop(); } centralWidget()->setEnabled(false); statusBar()->showMessage("Updating camera resolutions list..."); menuBar()->setEnabled(false); QList camList = WebcamSource::getWebcamList(); WebcamSource::retrieveWebcamResolutions(camList,0,statusBar()); initGUIFromCameraList(camList); statusBar()->showMessage(QString()); centralWidget()->setEnabled(true); menuBar()->setEnabled(true); } void MainWindow::initGUIFromCameraList(const QList & camList) { disconnect(_comboWebcam,SIGNAL(currentIndexChanged(int)),this, 0); disconnect( _comboSource, SIGNAL(currentIndexChanged(int)),this, 0); QSettings settings; _comboSource->clear(); _comboWebcam->clear(); if ( camList.size() == 0 ) { _tabParams->setCurrentIndex(0); _comboSource->addItem("Image",QVariant(StillImage)); _comboSource->addItem("Video file",QVariant(Video)); #if QT_VERSION >= 0x040600 _comboSource->setItemIcon(0,QIcon::fromTheme("image-x-generic")); _comboSource->setItemIcon(1,QIcon::fromTheme("video-x-generic")); #endif if ( _source == Webcam ) { _source = StillImage; _currentSource = &_stillImage; } } else { _tabParams->setCurrentIndex(0); _comboSource->addItem("Webcam",QVariant(Webcam)); _comboSource->addItem("Image",QVariant(StillImage)); _comboSource->addItem("Video file",QVariant(Video)); #if QT_VERSION >= 0x040600 _comboSource->setItemIcon(0,QIcon::fromTheme("camera-web")); _comboSource->setItemIcon(1,QIcon::fromTheme("image-x-generic")); _comboSource->setItemIcon(2,QIcon::fromTheme("video-x-generic")); #endif _comboWebcam->setEnabled(camList.size() > 1); _cameraDefaultResolutionsIndexes.clear(); for ( int iCam = 0; iCam < camList.size(); ++iCam ) { _comboWebcam->addItem( QString("Webcam %1").arg(camList[iCam]),QVariant(camList[iCam]) ); QSize size = settings.value(QString("WebcamSource/DefaultResolutionCam%1").arg(iCam),QSize()).toSize(); if ( size.isValid() && WebcamSource::webcamResolutions(iCam).contains(size) ) { _cameraDefaultResolutionsIndexes.push_back(WebcamSource::webcamResolutions(iCam).indexOf(size)); } else { _cameraDefaultResolutionsIndexes.push_back(WebcamSource::webcamResolutions(iCam).size()-1); } } _comboWebcam->setCurrentIndex(0); connect(_comboWebcam,SIGNAL(currentIndexChanged(int)), this, SLOT(onWebcamComboChanged(int))); onWebcamComboChanged(0); } connect( _comboSource, SIGNAL(currentIndexChanged(int)), this, SLOT(onComboSourceChanged(int))); onComboSourceChanged(0); } void MainWindow::onOutputWindow(bool on) { if ( on && !_outputWindow ) { _outputWindow = new OutputWindow(this); connect( _outputWindow, SIGNAL(aboutToClose()), this, SLOT(onOutputWindowClosing()) ); } if ( !on && _outputWindow && _outputWindow->isVisible() ) { _outputWindow->close(); } if ( on && !_outputWindow->isVisible() ) { bool running = _filterThread && _filterThread->isRunning(); stop(); _outputWindow->show(); if ( running ) { play(); } } } void MainWindow::onOutputWindowClosing() { _outputWindowAction->setChecked(false); } gmic-1.6.8/zart/images/0000775000175000017500000000000012632021514015130 5ustar dtschumpdtschumpgmic-1.6.8/zart/images/LogoGreyc.png0000664000175000017500000002432712632021514017540 0ustar dtschumpdtschumpPNG  IHDR8EsRGBbKGD pHYs  tIME :@L IDATx}i\WuZܪ[-uKVklI<x SB^xNBs|@!$`lYlIe[j%]U~{Kr8?xݪu}Y{hf8}^ 0e0 5 RS\rz~mn bdvYO/5 0Uk 9HL$0PPa(҄'$'?؞#ˮ=kƂ 0/;78F !6"@ /خs[*dK2a2q߀PX6 \;-=/<SjnF0 IK4 uGfr|g{zywhwѝ=VRuR @j3o\ә7 HH&/lہͻw jD`;j[|e"sOofl i!b&?̃JJI(c8!U}Q̲X`ڱ׾B+્ӥkA a,_-@<{=}aIC:ZbDLc6%I=} ;9~B`XLx-^:|d3<=6ÿsfeg30\uN!wT"J= &^,"QCSm33=F@9~b#5-EFb lܽ=, ‹;3f9$(y-{= &0jN$Q7kUs/^w}#f> 13%̬<0qf$x -PB(#J,yf;߽uQ{&3#$.B*YLU_}e&RJbT%ҷ9뚿#`(e,'b3Ga%Ng_+!q3#,x5'}ϦP.}p}#)\ы^{G=G13`  U"""{5;xͶ113j(FtUŌfDbxsn;_s<m 6,jhmښsuW\P4EL=T P-g׭xEd \Cc k+[fFH<DGr 3_ \j $]BUk@A>O LIQ !wҘTcIpƕ:y@ ϘZL,Q 8&j6sĐ*&e+W KՃ.yy)!d@OFŋ <hl%f::щ8.KjpvY]zq;~bcDKF+,kQ"OK@X9%" '\f g\L#7!@ QQAF&Q5h*q /aX% hsYlΜ5Ɔ \y穔LVk{w( &CLԹΦ3gmݯO7~K/=b۟{gn?7RPoOSˮZ߶h:;53E %S$qf8UiX*Joep2T6ɔ&t [ |F PSS06I)Eg35Y%?iRRhyHIf@Ig0ӘFjG 8 t1-XLWMQ̛6seׂ u`d|?o=3w%;~CC1+4SxS+O4ͻh~߳hzd\M랞({ZS0$Kh־M}䲿pɃ1ndl+t0_سFG #LJ^Oi]KSMMMˬiWz'o~4gjت߸ی/+Zg7߱~)Қ2IH`ZLJőCo ;]6U%&p KP [R!:2V2(xqbќ- ML f8wC/Mb(!Uʖtukl8àb4x'Ž*^7A|WvCm l6_c^* ȑ}[v=z; -KYrfH(ѫ]"bJ @2?zx뮍?~lȁ;n7,HiܮkιJL !%7Y׵Okh7|=_}?~b Um2~x,Vز]?'л?Cn˺seXqT.m?'eҝ+<{yH' tM& I$ZQ>cF!T-#~6_ڷcrA)Jl޶5-]bKB' .?cig9xK]FKpϜuKdOQ2l;z,{ÚΖ0FVaqgu]/`O۽k 4 _}պ &+f>! I6[u_Oǣ=mg~@B[f\׿ =Rx ?EpF׀I 35Hìi5M91?{EW˯Z5gvnݿotd#F(I5:S.#Q޾nfT-Qr4%vݿş=s FD, iw`6G^wM->!2" Ya A}អc||C:&.j sV_dž?{Ш4A&r;E-x#& #ڿ|˴V狷[^F0ٽqϿt䢥|bG\ѕpB)ÁJd@U  ;}{ǥVA]! PQ'淼xÿu_xǒ+|\(3"bj"޾I7J(0n/XN5B 6ccE8w!|vٺ1S 7hsET?9qI D's5HzOY |}&kܫnP۶=||d)o $d޺[zz4^ HX]ECqQ M(G[̋3\-hISGkżPmjWbL=d=6 @<hMCfnqT"<p$8\;>2ߘ϶ԥ+Մ>peGG b//ALbDSY̦)OPW^V?G 4z}ܱ-ywms- d%M1##=l(̏ zl[_?N(R.ofb*1Uh! ɂ),jfO#TSg`f&>J|u,4QU'k%"N"L) L]glXy\vg~owϸlU0B/yŃFz|"#hԣQ!݃&m'IR-Zc?]1I?^(x\(NjV@@5hC2(jno]0mټl@~X,/|lׁv۸g8I"hR%`mO~۹/ZQEWsbN+6^u׃'@HB!H+j2VpͨB.7rrP#dܦx"\~gVPSC[]*ODIE DJ!"JV ceiL[ *cU<сٳf̛:%e+`r孷?OxQ;yB \ $-d|x~~ϜWDJSeɛR=&>H^,%=1aJVf? 2Q뼶*fڷ7H'ޔ85u3[2PYk?r gz[~qgj߿|c5ȩFTTTa-QS-$5 0ofSfZ,3Rü1yhYiz {%h};@Q` DD8їbJ.{.`F,J-;bDPfJJc i~ {dW]u29!N]Z 2hX%&'duw5@()IGgA:) tN͗|i(ԖH2A=cĴy3ϟjLWb:kTg%7]3F2?ekr.8dl`HrmݗxNDD^ED)T*cK[r.cЊǟTP f P-D!,W헜u9<,&Y7Ldfa7I`yr'yWt7>E$k=.+)G|*2hd>*\SG™“n|hl0%|+\ Utg}.e3Θs-q J:d<ĩOA(e̓:RIဧ0HPr씖Jh2gܝ ej\UNq9eDBWw°`ʗ4 "djj^wX*-MʣzѢT= לwA =)DqtÇ{?7Kmp|Oę|w^YP1PUVȂj3,H-XN)G lMRdeDQY"\%tHߐբ(0g1 CcY18Waއw(:8?"S]̜AP犃zyw&kƥؗ).1@a>0M!4x?0 Rcx@v@ F3{BHB b.W?sь~t9m{һ@'ժ05jd+RMǁI'Lԣq s%Doȿ%7SIA~i="I `HWu (nA)njT)4 ׎g̝U `f& +MTzXdL0,Qj%jʄLXӬ[Ls:whpBO]er=)֘tk!| OE⩁IiR:LBЗΞp0<,J06PLpԬ,Br!8p8R|5g̝6sO$O@;U(AD䲹Ζ.xݲO,ezH\0i :Դ(QBƇG1t8$v_V9CzcP5vu^5))e x6*~ FA`*T3 LP'}_!i}I6 JjSa*YL,xx(NpЀhnhh[tM=Ztb[|{eU]s.X~FI_1P7um=\wNKt [s# j^ƏXeB'X/ ~u3BIpU硱X F8SKάa50gYR >EaѠL I0:>?\M.'L; Z(U5XP@Js],l^ҍU,T:wƬ5]ݫui}YLKIDATMbZKgmV=_\ $& A@[x ciE@ QsU9*1]BdE(p0Zڿ8tι}F 5:W^3%G,G 9 6h$ZcWAF&J/?78]$B^eIn$wCG4dQOe5ⱲDȢ~օ3fqV笕]涥HQ st1+> #_{KcgK&- bggu߳Ĵcl&qJ?M2i %|IX'4Q6SB'NKi$ȠR2L06Q/18h4w6*Фp"{Ο~"Z5 =PO ]G6h$r / EygXٵb^벎sYɒ`;Q_\a/|lY+[:59GLlP>n٥:?yδΜAɉD [ۄIDjFi=w}.d!#boQ,:#4dN5MU(j)*)GcΚym]ٺ'Ȍ)Ǐ=t`]pa]}|H}Z8yB2[9"'$68^cΖ(U{D%|:C(|x0zjMe)F5:+69\θ( bZV'n LfnfCP+՛;:طDRLFX 8ug̹=4zAơ18KԔĐGoǿ 1vFTFJor Qan\A;~NHG/;8=.]DbYҙI̪7Ysk-T@SJZ˟rRSB:twlӏG{3rdXT'LL0i5N}7kIIйiLCkS.3Ć1Qy[ --|T岙Ǝ aS{yHK5}TnjWƎxVO:O@Od}{{嗮Ç=w_GiB33Lad[_t{.]qQNar俿hrXG7*}"nF#p`ZWh\}UToڑ_5.5AhP* ǵT$|Y!omz= >4X+Fi,u8XÃc(47 Jʼn#*V{cI[cfȩ( X[TـO8I 1P ˥XIDfnP .#Q]>wHKĭ=O:J@NDdk6+f.mi^`= `8AN}2&iI&_k;|ROSaVsԙdѕ|z5Μ8`1es_N=t6PJof6,lZ9gvU(TIz>%L|cFOC[w{g:kL_4Ӌj˛yK^Ok=„(A5tӶs%w6Zܤ  KU5aPضvO_~ꮵ]MkZgRDTr*ekϟ UmcGKu:]@ViˡVy?Ou֠Nq&2Ul7pTI,1,:gNk]浻/]AhQIENDB`gmic-1.6.8/zart/images/gmic_hat.png0000664000175000017500000001012212632021514017405 0ustar dtschumpdtschumpPNG  IHDR@@% sRGB pHYs  tIME' H=`IDATh޵Zkt\u9Νdɒmٖ%?e ~`<$٧Y `! + )cyJ ) ""1Tnψ\2ːRJ@X^0 Xxŀ|7w,ԝ% dJHH34spᥫ a&ʗi+?{N%\@n0ũ"Z xq_GHڜ˄Ť,_0Z#D`u'SǏŷ?;=Ay&l$: 82CyxI8οh),zwخ^~`kܱx0 %z0?rkp;AAOjfgWke>D^jIE2i_@ {|_t7 6ñ̙=㗞~䓒HPtb,'$%6{Wĩ>vEm_`7(ꇷávL|FE̺hwǽAR5p,@:u^mcE57e3atM5e?!H$l[ݼXrT+)X &lx[oNd:U` ҒY_Xv}m*&bsFy|e'uuuWLe _f˖eѫoZo[-6吜LMd_>P 4}",, EuDM5S6D@oW}$>}H˰rV"1YVakH׭⺵/zt_,b &*жmYѨ-R':چ]uȴ,P:sڰymK?zv;,h8ЀX3&d^ouvŇ"2>Ҝ)mZbyW\{vݺ*^Տ"R8O߻*9Q Ң|'~v968`Dq>tUEff/ld:0V6@fo䪕Lx N͚h09ǽKk|+/Aמ01 ܟn?x#{/y Kv&[|O6ͯ,B 9Ȑ#eIAhӌe|ƀ0HQL0ϩl`Zs64eLUkljmm?}5zkV26X(-)Vƪk+זW-* DlEpg5y#㰩L Kwo`ԎKD(-^ˮ^7Y3C]x쥫ʾύ0C)=&3n:h?ol#QZYVRjYݜ/ZYVQ:9?x^,ʂNp9oו;AR6 J|&[핐( f=5ջW[sÐֶd3dH`՚ܱ[#I"u*VbB,`xA(|ۦ뿼~Qmyhę2h){d|7)Mc#n'}w:y@<ضR @ ! Z+]| _UBfJbdX]yֹkWT/-[(RV^RRjKK8%StK&?<񁱁t_XOo L4lVPJisq6BJR9[~il$՛^N۶AL?lC -;$-E Z+U=Obm0E"4cҵkW-_YYU= tkkhm_P1NJ8ߵp}ԀR|a?(AJH'J J%i bb  $,a5gnn˶̩SZ9flhVZc;o dIm-7d%248Kd+YFl={MPָ8uA*oqC:B*\fuukծ^ZV< 3>R^a/[ЌiygYp-(,m=pcAq? fʉ(\`d(5`v."B>^H dFӳc?R>0T(Y7<ЛN9 pB:TY9 hlWDDD[GT_up3﵄Ĭ]DpC0۪b9@DO )ff<}o:]lf)$H6w  #1Ѣ3v;"JՋ4ssC<1::.f/9"/YN@Ƒbqvoy`w[ogBd҄K"m"Bv lZ4L'"|[H"ԳBi?q<0Mଥ3@RJڦBĀ,{Bc/kђi^ /_^Sx&ҹE,U0i_EKs|43‘3/}eN*8+g,AR'j67 Ln[WtՍ Z=- 2MR_ :uIENDB`gmic-1.6.8/zart/images/Logo_150_alpha.png0000664000175000017500000002535612632021514020303 0ustar dtschumpdtschumpPNG  IHDR[w|bKGD pHYs  tIME $,y<iTXtCommentCreated with GIMPd.e IDATxw^U>ez/$I!$$T.Kd k,֟]ue6du\$!B&eI&ӟy=?\&Ra5yʽ9[ιZ1|#{c̾6 c`ZcL1&T=FMJtx>h`/@UƘzHmƘBk퀾=faXcL2'e@7b be%[y00+ՊzMr X['1Zx ¯ M$c'`t`bjR *:_٫@6aYkM"ClL `

,Hj@\]$xJ,^ֶ8`ĞMS}8X{5oNj1gB(9V @K~S<#Pg{2IcL\*ZXGIbbf\`T/$Ol=xFnX 1`p?o<j߯ {G&}$.&Fkc$vxTl@d+ MƘ3Ԯm.Zcy]T$G^`F1#5tRQHv#1d/%u:@V0R?I $1cT4BLgz$0A&n1\1/SA.[LC&i ^`4%yfҽ%ņ2%@v:MaiLV䱝$(Tq&-}T XZ"PHZ`x0v?˞Wa,c\s%P \!f&6VS.((+B{Y.kVؠDvbyqxm.6qs2s,o#z4R~Q|hI+p@X/[.+0%5p$z?4v$*u~C&svǡd+~Sk5Ƙ"xyP LHi 𐼶PO( I/ T=E P_\:7[,*ߓ=l_dM%K7\bSֿ8 ,'2mb.}g .ͲM3bFT:Qw .2|GKUhZ(RiE!qdV=ேPyGݛXyʈDuvgpFmW_V"V' bJNx+EiywFT+6ƕ \[eFVv:X5of=`JK< Sف^Pj&TVLaV>m:g{,'%'q"hDn^>Z˛N2Ɣcڔv.._ʜ5&i \`XW"I~T&B¼X.="`@fm>$U8" 0K|ZB=O}XJ#*=XVlCjX;|n8&11I\4.8M2gF u,+sSڤqx⠍E-zvQ(M֮:W`rCTk?<5ȓPFZ*yW!ӗ9߾QT HOՀV54w*(d^X\0YXbRv+ic"g&o~KfIiDu>a}.*>5 ]75H}V&A?& >iE䲟FMZc6Ykb<li D{sƏ=~h-#϶>qPLG B u1Gg4۳nE(c;%/ }b_˽C4Ƽ .g * ^OP}^ 7\ jJbkm⽣@O1ӭOuP+iVO(.Y(Q'W}iB1:W:4T5!V VK|ϔ٭\˜,;`Q VT}bTA M HT@ e- FBcLBHJ)@5$EA ?d`chǀC(י+aI'P4L6VqT_i{P;{'Ӏ{ľ gҮhLfҩ?YXq!J8Ĺ2 6z0}yALɇ`}ëk %%es.JA@Z ,Vĉ?cݺ>S[c,/c&\iZk3z?#3+JOlHj̓H,6̕R~Z43p9bVգZ;?F/e0ilq hIXp]xŢj+y.jl,tʔ2| _A.h=Ztx3 Ax#\1:eEYoD_RԖ{`rKbH_0gPaTvV]"@UkUK4ځM(L!ӵ/2Bf5e{[?v`\1QU|Hys"XO29]/՘c\<H[k5z Tq}\O<N;.*Xy5 Ė)9:RcBjЛvkA.)'/p$> !]N7 O}%l^c8=y27[QK ({jR㤑p7$DZkS!.rSݺRu)Kd&>pSJ $Oksb#o6NonEN& f#fB8h;~GQQ'< dMƘͲeƘLT1Dqa+q pa7Ơ(vN*9Y&/k(@ɄU 4 h,&xvC*]X长UqN7Ƀ٭ RGkvآv߱~c(X]lv.>Y^:˾ss؇ h)QP'Gd2Ƙ%I҇YNWJGFm'鿅j.`681{$Nۿ@ԁG pNK 1Ϸe.Ml^tp` t {ڐ{}ffD|nOf\rբ`}C8Ft)L6fŰGTRrOvh/vCFY*6~4c2V{\>G2gYwX+>Vq` mgzk WBջ0W=8'\^V8],mZJG I귯ePdTLS]+s>Y^I==J`;)Ɂ~6ؚLB( @KԁE诼LJ296h<6AË}+Tyqq!sȼZ9RX}MA!'{2+Pv<<:AaMwZ?SlMCI z }Cqz/˹?~sG;k1N-0c$5O6j=q6`v^Y߷:7⍞F&:@[r\[fҔKȽCB~nx"T0&}rٹ=v[~jfO0cqHΫZT| \ %uӷ; vG1''uR ?;`uANN*x24I*U,O{&'t՛ݗt4`u쨆(1 bG{6LFƥRVlY(8X\+ffŠ<> l%@l%(R~H7Y%= @U*0"42wSNk'\ Jh 2PGv1i lW?J&"l@MԙYH`;`7RF}`ʋ*xj(`y+Fv('*#x R95FrE{$<ϓ[xX ),K?{1VxUU>-Mf1QW>PP)1\mX[.W1? IAi7U 6xTyg diNKò]f4YSjE[ViǷF|L֋G!PyxH$#F|늝d9:C&03!%+]x}*a(~242Zko;PI] n\%i:-@ppgIxzRh_`V)Ip&h-{AY=j{mki }زcmL}2W&t}BWg+uusځJ||gn( [XyhEmb34LT\)ZkC1fbc)Z$'?c'fᾈc~ (CX诃P=?Lt3w]iqδO)})?zpJq.FE>jfUtB֝ D"ԗai4b= 2BuQ}Tn8!lxN)].e0P:&FQ .f25xtz9N 0q+̎1 h10V!;E~Y}(pk,NKDƐ͞WXsr+x`$lhe+OҔT{ r2(([ LXeRač#XAc^V埩Z@n5+p~+?W2<5dJFYBqdjcairT{Aa7t2>v]e|HSq7H3u8l͎I;# RyB|02x$@U$ZJnm&h"{ +c깊uc?PGև 1u~`[4 ekxWq@ǘ/ry(w@c9<fB VOv@6meoh'XDwb) gk̵ީ[(vQk:OP-J% g $B'x q?` @}Wx ^uRV(TS%,JsNrd\%DgM:=/Q3}h`V\ ;  gCr'ÈbX92Xe{WQ[fPt]Fd.2Zdr [g=oUTU=5x`B1HwwP9iά7fq3 sA*ףAzݚU]JoLT&w;e[Q|$wQ&jܢt~x*7l;쫐~ ]L6[+OXXSyg7Oaɀ,q<~L&ړ*1c`dH p:ުU6cL55}Otl+^^1KNS>9o_61%P;r-3}֐[R7\*CzEuEb~Fۥy ˿Fz\롦*&!wL 1ݗy aJM=>T~/"|k dJږ ␃iýkg+P .њx2˄ 3 P$=#S5)1eRub/li FIDAT8~[vge)0&sHnR[{(#j?ܒL^537GmxXܶ@w v_v^y\x< O3KPYj}nYF\+e>n;Yb I릂_!/Fb|k(?|Uf'¾^ĐòzXsW@ҿqc~|93 S2 :ҹ_1X<%v(O_xTtB aI5\*Mf.{^}<KPW~9{JU?6αQ"9ky$Zi Ѧ ?sҌ]"sS^3= ? S&CEHG`i3Fd/ފҩDC3}_fq'/J=t],VsK:}ӵSȂ]\/;CsvSS%ƉMEWRKp2W $+uS瀯 zuU!쨄.w-%[=<ީ@Z}](>*P,3[y UNm̰gU%@VBi.ncH?0~AQ D"&y%!qj;ؕi=r{r~|?snOD"f_g BQ To@+ z`nD9SNnb]A𨮝9܌5KvE*nnf[I[T{W8C^c-6(uHg5؈+.g~6 v1F"6^,߁Mo}U]ST|B$W>Cm df7HU)oZ 6-՘B7 &ZInۂC Yݍ[: .I -vS?d*`PgirRDbOGVn2m!uJgձ`gW_ [,Ĉmk-QtJ߭f=RMD._#pu6W#q+`w@IY+olu(pצ+yy&h2+,yɾPU[D$+Vn>:BpC|B"eb_IėBO0,2 zArk<+!-@m,yd2yz'R~V3G8f6 t#N yb$wn9vmG&"p^fq%f&tIІ :7PkKZdЎD8Z&2ٝp5{!f~n<[^`~ ʾU ;&"#߈.`(UmoyA4PS? 2yv}L"9t0BnQz)n1Ao[ ֎```ċVG^jǕ_WReZ=8<5؞bC}AXq dV^'gQ˪AU`#@Q,!u RSs9V<0y[=abuЄ: +(3͊OP.ci3난U=jXTzM"pxf֡Jpp՚v۟ RŢNT otd]tX4jcJc5(W|* "fM! [k_<H$BBiTAR\nL r \ۊ [X}I=kvc2k}hlp+Uf)<`1:Rxs%L\Լ WK(o!7XNW47႞5%z l%ܳ{>j\T| 7e, z}{C8NJU/߾ p%D߯"Wy?|@G0c$.rY\]j駉zO@Uu0c ,\R3l*y`gD Õ/Tk < (rOh@~?IuV>eFKC(0Gfq%m@yg@ꦺ$ O@hb^à>,;2}K}E a` XNjڭ[Œ6 a`(ΐ{ں}Co`IDp -vkz=>ބ[y:Tf( X1y{{57 c٢fV+IENDB`gmic-1.6.8/zart/images/zoom-fit-best.png0000664000175000017500000000251612632021514020341 0ustar dtschumpdtschumpPNG  IHDR szzsBIT|d pHYs|4ktEXtSoftwarewww.inkscape.org<IDATXŗOlG3 4%jRDơ.pq .\@HDjTvHqƉlٱcxwMЄ~Hݷ潙oRDgXVJYB)I)Mm{UJBlRض6;' EpX(9d#pRU gљmakkgW\ܵkDb9,߹sg E. h@q {yՃNju]ׯ|>}Νӧ3O5Hd#= 0/^8{l{4UgΜmÇ>vȓ'ORGi;TB8/֕{zƍѨ˗/@x x@`irdddJcV Ν;h׮]s~~~ȭ˗绺 Rhll4Jك!  ݻwر>%bs[+_ srr2e&555Fz|>o |>O&>Dj)0ƒkP---uH$DU X7փ^iu]wZg*T({o+w[MiNFBлҥK?~|RX,]SS㪯B,BJD… x P-Auj^WӴ-P(700wd*RG?yX,TF%^"p^q^ۭ-//Lfy!MMMRʼy@R.Jil6lR%FGGs:t!Lfpl fuc@%d0\wvv6&ɥDL%-R/7Eb0\joo麾 RJR@]!NR/^Hn E!PJM&RvٶpS(L(NRJa/w-Y;P%Q(vtVJ>#-peeY !Ngp8!emʲ,²,e6eR 4Rf '>ͿNρߕRiQ:zB 0(D(-mLIENDB`gmic-1.6.8/zart/images/Logo_150.png0000664000175000017500000004015012632021514017123 0ustar dtschumpdtschumpPNG  IHDR[w|sRGBbKGD pHYs  tIME 2O?tEXtCommentCreated with GIMPW IDATxwx[?G[ְ,/yoǎ;N KҖU(Ji_Ze.F)P(eu@IXY$!;ĉWxK-K$kPtބ纸bB:{+0!v t?SoIN'~ yoopp^/NBd2x^T*R·1c}AAdǏɓj4 n`0HBB݄a"==߀M`sJH$RYYIuu5*lJJJ@ee%`4ә7oJ Xڷ/R(BưX,с磡A:::H8fhhݎZ&..Tf͚EJJ zNYYXt:ZNZG.cQwv1N'رv<@ۍ^gppt:$Zhiis9~8ӦMcʔ)LSWӉMշcѣGcǎر.B^(`O8VZĉ`0P(d(Ǐ_ X<A@RRP*|>BNX^/ZD-p@iool6SUUEWWp8Rdll ͆ h4RRRˣٳgV)**.J˹Xd 111t:!&&p8,&f_,`|8NF#<ݻ ÄaN'D\._=R IJJ" }lmlܸm۶100@vv6h4Jll,ccc(oyP`0N D7k.{90b4Q$$$}49`AALJBG8APv 7Th`E bu+}}}Nww7>{E"P(! h$99̙ôijdff"ؼy3?}VN)p8prQFVxWxkkiiǓKuu5f۶mbXp8b +//5\VvƏOjj*CCCFرcW^y%{O}Z)++̙3H$X@}c- TTTo2gRSSټy3vÁr 3m4222(..&//6fΜI8F";p9`6IOOgddg}nA=~^/E0vM}}=3f -- \.gƌ2Xl6:Ď;PTdddfvPA1&++'r饗T* R`@ /aʕioo=r,H ӂ n###T4 Ǐ'99 W2|_ 8z(ׯg׮] b-H$."/^… CTD) zKK H$f3ZVR{wTzn3qD\.imڵ<$''STTDYY\rɿe_x(O=VR~c}8 a*++yg8t6 Nrr2/D"cikkaB2n8es1NJvv6bdZٷo^\.vKwyznV~ӧO~_Ʉh$ {nñcNjR VXEf„ FUIIIXhV矒K$Jtuuq!JJJرc<@QQ뮻2(qgzlšVᡇ:;;;)//SsLJB*brqV+III۷M6a6ONF̙3Yz5K,h4VH]iӦQRRBnn4"++ ׋CV3ydBZ|BT*[nj4 lٲH(" }-z`3wܯ+ x^4 *4~?O<7o&%%N#<՗Q.+ aZH$hZv;Dӱ}vz{{zOΪUXp!e_{w-ZDRRyyy& RIMM zu֑ ;v젦A4 K,_?%z N%H% F555<$$$Vٲe oj9z(*!PAoo/:}}}B!@"\7Hzz)4Ƨ /ݻ⮻!.28|0w`QъJR|A"}vr9'OF >|\F~x(j`E35k0<"'xW>}:2uTDJ{{;))) o'>>s1b ~pw0q cbb7?./òB!~iQuO{^>LKK YYYL&IMM3O>$]]]\.7//O,YRIcc#HR zqq 7j*t4ęƍ1ͼdff2~x,Xjv344dڴi8pzrrrhmmA, CCCA SN嬳bʕjn p  *QdzzeDVV*"JĠhTzOg4h0dee}n?#`AjjjhlldԩPT{q%qƑG]]f*++uVOtL:+W䴬gA|Iy駙2e dr%bJvɁ( , 3fSRRyw*L F#@b"às[oE_3\t;&huttL&ٰa nTzhmi!S4aj񐙙IZZ}NYkǎYtFR455qP(̤7xNGAAtuuJoo"Mw9sDS(^L&K.1uTsgc08x _|1:~Y0mELOM7Qx_~97o/>cBB8cQ 0j6#_yASP/'^#%%Tg P2gΜSQ<5Z%\ƍ0aǏjnQs2oFGG)((`ԩu]g mٸ;q:ر~,X@GG}}} ~8ģ۷S__mFOOD֮]+>|R  *hPW߻!7ī"`X 55UX| ;]*QKhZ:::!..NffK J%^L' (/qxq0~,ɒh5D?TP z=qqq\.T*bllRMŋYlr뭷t:gΜ9#`Zl6q000-dbѢE<|w"(cbbD z nhFRq]]8ٽ{7 , 99^T*nxYQ8FJ%Z~|>fXz!bccYt^P{seΜ9x<1ƃ>rssinn{ Srsw~d',Άf 06j%lp Es3G%QaakۑJ477c6=znZ[[20;6Ơ*C! 3ܢ Z8N MMM] &pgRB0Vn NUUիWe3k,)**GܹBٳ?qFǗ^vÇEB!8pSm܈hDB%l2!=t呟W\ALL ###($Ap\H$?iFU @Tel ۔)ZSí@b8LLWe^0HXX pJR@'p`pq4|XJbQ(0hZ:]G\\111DD},p"GMaR)@@~}ד[o1k,~Ezfʛ6mɏU8fttuVZ|vX$JSQAM'DEuE0{ 7JllXt̑#G1Kٳ.1Xlgۿv'|uZ-}UUhRAbIDAT98pzjҾ>.ILD3m?Z)%(qb6iiiDc$ILLd|Eb|ŲenNGL ;wCV{5 |>cc v3pOJ"W#Ɖ tc?zVGଳPWV\ϿEFÑ#G? [/t|twwMزe ꫯ.MW|>DMXv؊~W_}3wne ;gd#Xq W]y%QxFξj6hk)**nݻq,_I# ʂw3Յ_l (rdYYdt$t2p:2qؽ!//¿%'G1A`?:Nu\9Z+ĭ@~R[[3<#T333麟rrrXnb``@|d2?7xgTTWWCʭwGQZs^j5 W^J%)))`٘0a߽rϸ-=͆tBYY- n:(^k1̝KByy$; "֥Me%Պhdʔ)7(^NXL脢L U7D;N.,g^/^v=ʣ>Yg\.G(Z_sq, @iӦQWW~_~jP~x9p{jr)YH\xN/oGx\̝Ν;P+n\@~>„ bl.|ǃjeHRz{{#8H5g^/1:\IBB$S* 473܌)&FZ$\Q^p9r9Bֆ.gddVJJJNY#2g)Blb¡C(OptQ'e>Dˆ D9s"jo|-:;)9ū|3d}e_QQ륵E]-܂㡽ZMKK 999TWWs aʔ)KTWW|E85OEEk֬an:;;3fpM7aXj^q?DJ >JL1lڄY*%Cla{edfvfώD&;"yfwwwSu PGG>h2E\--ʨFCll($KT*pryD)FI\;E+Y/bE\!~ +222 ==yw+?nWg|yʤI>}:'O1rssٶm--ܾukD"g6R™=v4&]^/GQMHM7䥗H<|ϝI5599\h?EŀB pD @00[ZP=a`qM~WLqӃL|sVzd_ŊWn7]]]\bXDZSSSV`0 B444p?Vl.qÇٽ{7o6vv;̟? &0k,|8Xa%%ETmmdf./ۋfRvV*JƼy8RHC!0@ǚ5/(!#5ly!uqu >R)xPE.0oYS}I~tħۻUUkJ% -hZq>lt׏*xt:nF<GeÆ hZB8m۶1aqWٳgGWWaQq)d޽ڵ N]] ƍ%dSTTf@ ymCCK8# 792n(3J%vb,v@WT㨫CvbLju"\z5qqq`0BmBÉ B'Q󓒤a1dfص ԩBt(є!oo; ++C-e^JH0db bΓŠ_ :;;tsM7-QkZ1 SUUEll, 0LT*9x\>ec W]u#!!L& br110rq-b!8w.]ɣr9'cZX,HA(Jbf ##l6TGx(*)!IB7i̚'ky}J Ge޼y@ & %|P*H$tjhmUpY1AZZQbY5hKKI}1BK2t<)s`Oֲ}eitl3߶ L͆|d P;u*MMr ->:7--$Pr476FLTSCΝH] .`U(ؾ};s̉4J D⫨EB*\əh҂+//z N..pI [n׿t:O/=Y+z?0;wD,X7,qх"66SӟR(**b׮]RpݨjrrrIOO]|T*% a4;w.bjxn /o^[A9l63G#),,D*|XlTZZDn dT*P3G&Q(x_ϟOXBԓ&# $=>477T*屢zgYv-fW_?9. ݄B!j5`EJ̮]Dbww7.2V\)bbbHNNl6!r=Q 9sxG5kz 멯G;zA lf OF=}:)Zb.BN>A-!hpNNOJ"Y7_g#TDOJJKr?~x| fGb`0R7.*BX yYNlzinn&??ceU/#ܶm/2ƍW^aӦMjJ%d2RSSimme֭ֆnSTTDZZj***d7A999g3f3111a25رctL KL$g܈i|<)))Lq;w8ȹMMd,^ rjGm8 ](ǍfJ$bbbNKJÒ `x^`NQ3"V1>b#٫\j52kkX,̘1'(ʾhKg|ttt_=Pmnn'\r%rvɆ ɡZڈcƌd2188А{7Bd21~x<ǏGrrrJ\1oy^/J%˖Qp+"fCP`0(((?FL25װ'71._D"ABR䢋8r(."$Tºuس 3 xn}=lr9 fNr\Cĸ.ʢAlllLdɣT'XJyHg'V5։kj$&&Cna…|O O*~?H$>B  66V@ je̙w}$''l2ˊ+ػw/AJ8NOJ"''FGGٻw/ w^vA[[(1cVK.wTMMME.˖-[X,$''륻V+kwCO&F#P yyyx^#(d2rN읨jZ,$&&ۋ\.OUJ( Z--;vD=CCx<q"4 fvcRd_"-- ^NCC)//'&&F 577`V+!De"ڜNBج|O>i'o >N_h0zVFL&bl2 ?6kiii@dh[ N8ǃ'''B!Ndya۶m7!== /KI q:0}P%}iџ;}3e tFll ~SUN Fw୷sϥD8o֭[͖$ ̛7/(]SEg2'z"s-Ioo/*׿`0|,qL&###L4!qzJEEEׯg~9PNA'/?V7G9~n7ӦM;!#Z*hjjd2.:={./--%K" Kek>8866KydGSRLuu5mmmW`EB޽ÁhdΜ9┺O2ƨrq9( jE]ĵ^Kyyzj|>ٸq#?8#P9N ꫔STTwAGG*,&Mĝwɓ+9_í`EBl6jkkTTTϞ rشi/&!!Dmm-wqiHNNfÆ WtǧOe~SRRؾ}; zBdĐ㡡w*DQ9QUG4 h(6@">Y)``ႚ ͐C &38nWú ̏s}9==X,200 +++y`#z{{,}FFFp]7e ZE(z6Mlf{{[8$ f]suNٻR@ m4M.//;6j`mmsIRq677En DQ*Y.}3 ut] 2==*?U*gonnmcE.FRr\XX_{&եmhIENDB`gmic-1.6.8/zart/images/transparency.png0000664000175000017500000000036512632021514020353 0ustar dtschumpdtschumpPNG  IHDR\<dyJU pHYs  tIME 7 |IDATx1 Q ^rV&Wb982=3۳8j Pޭ.^ }@?SN)EStN)ESt }@1SN)EStBPtN(:E_n ~9tIENDB`gmic-1.6.8/zart/images/Logo_200.png0000664000175000017500000006463212632021514017132 0ustar dtschumpdtschumpPNG  IHDR0ۖsRGB pHYs  tIME 2tEXtCommentCreated with GIMPW IDATxyt[YeYűq9!qFBI e 22\˅2r)\(B[Rf &!uǎcYVdْ,ɲ`'(ﵼ;>{?$J)/ĤSoMlʦ7eS6eS)ܔ}5сh4:&z luuuԄZjI& Q('餠` =$Sew^ 77 /Ŝ9sH$ddd Jٻw/Hp8lfXVL&yyySoবRT*%raN'6cǎD(..FT2{lf̘A[[YYYD" HRL&V"sgLS!唹nvIWWR@ @kk+CCC~r9j$---DQvRDVOee%UUUh4tuuсjh4RXXL&CR>)}5fþ}hmmeppD"#L&hHR8RD\.@RPPT*Eѐa4)..l6SYY9!L_M麟v6 J0P("1::J,=W8^l999QRR"JTra:;;h4]Bt,_|Øp_MX,۷Fcc#vH$L&R)>OE%1gK7dPՓBimm^2;Fuu5o6MS6/mٲۍbN @*T*H$B!pX% `kRZZV*18F%IT**5kP^^_OVV֭#;;x hhhFz=MMMtuuD`f6%wd"h(..IF}}=7nDL ?K&H$hnn+322B8FPPSS3MlٲILoo/]]]\.Hx<DXq]r%z1 ̜9G}bZ-'DxQTl'H1[ZZh4a Blذٌ&LNT80|q޽[ |"d2~x<>XxXZt).JR !,Z|>ZD"A4sϊ[0$?KR^z)&2d27x#v&S6>w}\.N;40uuu[orH&B!bHD"A,;7hSOEXt)X,6n܈N=T bPSSCee%>Of$<#رߏT*ad0  hړפL&Z}~ 1,[||>UUUSD> l߾NǢEX|9;vW^! 9X<' 9:k׮+^` ^zzz8sD6Q*EpBFGG|L&x7yٿs{<R'DZl:::Ya8T~bޥR)_f 6l`ɒ%266L&CO{{;ӧO'#H V 477jTWWZ߿Lƚ5kg֬Y q뭷J@ՊuhZ^/&`0C&T*b`0J( 9Bnn'9Lv;۶m`…ddd 7:)D۷ՅRcccR)R)X38׳`z=:NAA:H$B  Lb4vc6Q*⬘餪X,Ƌ/H2$// oj s饗L&9SB~z@ @~~>B!z{{)..&''x~]v0grssYj֭Kw68N֭[9x ^WTTH$P9M̉ L&1$I~?V1f̘A,Cp8Ħ&֯_f^/7|3<z\~kO{  iiiaP(pҸL&'[olw444@VEE\n)LNPRT<䓼yX(O~֮]+( h4 SZZ:2x< q8z~?ۍL&C.u]GVV`0ȼyhkkh4… y(//fǩLFyy9:ӉdEEOϥ3LƮ][۹袋~O=o&ҥKٸq#2}c{9N'TJܡ]͛7#pݢJBfFQTarssQ(4442z{CSSz477S]]-N\;_.Z }}} ڳfb…jf3* / 0cccVxH$"~CTP(hkkSUUT*%xhmmG?8ZTTDAA˖-nkBmݺJHRb1qnlÆ |gΜ9dee p8d2Db^^DRfCPF1 Fp:l۶ TJww738Jba̙d2v܉` ??łf4 vlw*PYY)`###bSp"@TT*IRbWuufJRZ-w b8[ZZhxdWLLC̴w馛7qgdʫ}q߿{t:k_x>Qog=|dłnE@ @ `0NVV_Jdd2B`t:4LSG8F.366s=Ǿ}&=Fv}q)L!8M8GϋLD:NHR\xlذaR'ZcD/ֆD"appOt*˩&??J%[n8!h7n$9]+GQz{{)--e֬YN1􈽗iϖ.\sIc:_3'{O;pرcdggDӟn'vEꫯ+ 9DaHZ~?xP*Hg̞=%K`2D h4ʲe8| _YhFQabD+,,X,f /=Z3gr5p 7|-B/=_((w !~_k.R)n^B^{-W\qH{wA5L{P(ıc]:IV+bbneddP(P*zfϞͥ^ʕ+EObT DYbŤxEa,]TT3NkO;_ LF8|ڊNFUVq׳f͚M43V.JOk]A~yf . N\.GӡjſKR)vQ* 288Hss3{9)SP(~e˖q90wiCqwRw?H&af̘JfDAӉJ%B0dΝhZZ-pX~Z[FCii)wu\p1%1<꫔Vijjvӟs=|==.KQ@ D"addv:r9M6y U"+ 䢋.֬Y#/6K Xxz˖-̜9Rn{!**~߰hѢ%ؾGTd^z%:::w駟.NH@+ @Ex҅t7E8v<rssłW_- |Z/СCv+SO=f@ s=G*7'L`gz-V`PlJ#-ݛrJnf/^`,ȑ#ٳ:R?ϨgӦM]]]l߾ܹsQ*nQ8=c t{\r%x<z~***HRF֯_W0mzh_F}(((JMM O=spb1DUa@OOXq0z?a޼ylܸK.ӧnU*7xI&2<c\.,X 2o<./_w-6|>v;Z^vH$cǎT*|tvvn{2>t9|Jo~T>lB}}=o&֭###bUUU[nLFqq1> 0prR^^.zV%//o|}Tv}QV+[n%3k,1L,XAFXv:&n:V6nᆏm6 ,Y_TUUMډu(w|t:1T*ǡ ,p|>᫺~g6ַXPYɼyPՓe -GFFQff(z+\hTHcf&Px2Ii23p(Yhģ&%P?#g:===.T*%77ZvIKK ̞=TyꩧFw3g2|.\3ymo6T?M6Q\\o-ݻw/UUUztb1Qմr뭷pdffr 7pw "Z[[%@u ^F#H` 0[(xqZė<:i^ߞ=wp;'ܻ^wil={6arrrPT:t:;;gŊ̝;~h4,^N^UUg+s-x^T* 4#_uU(Jn̙3hZf͚D"aa֬YCKK nB\x'sv3ψmZ^x!X,I)//l6sm}>Jww7*xuq7~:,JJJhmmoghhHss3z^TWQ IDATZ\r%XVvOBJy饗jBORhu #ClB 55/ B{;j:LA-oyݿ ؆<F d]ޑ#B04,sӇqbJd˂ N/^ݯˊ $b/`FFXڴi\~d??p\(JxR)g}6ׯgpp+V3wk֬!CWWccc( ${aڵAx ¢.bn馿Z'#8:jlR.IXtRG|>EBx.…HC曄ǥg͚%6%+Ns\\NǴi8r29s戋vc2J\ ./M d466ϪUXb[nof֬Yl6T*# tvv(++NGqq17oP*Yn6HMM 2׋륱´ihjjG  h;8RS[#F:hXSYI{W()e``3f`p\ƨii!`@كqQ]L{[c-Fl6sQ~?K.Nus\ά,t:;wd۶mf|A?6<2ϫ(;vrn:."V+ͣ` &6 L8C0k,.~}2v|>ۿ!hQJi@"ٹԒ%DDΝBP!6)MT\ZI͛7c0DНoq!ZMdxDPP( 4T2J"A |9z=spL@VM,v K$ |>@>PHI@,$Hd1qK+Jr9:r,^@@?>sy<N'RWW /@aa(et>KOO]]]\.x ~`0ȪUD"DQJ%---\r%>|G-kuuutttL1o޼O'~[}Uom90s&XIFb1X,v`شIx: @sOLVd2E ؘ(o4 TUUV^#P :f_,nG\ |j =K$|>{^ƀ?~%0 /5T ܪTntw (4]@ihֽ6 IP_3F^ul6XzI7=z ΂ hll󑗗ǜ9sj<Baa!v^z_~yh2袋x0Ǿ $}>|G8ࠐbR)bؽ[ W !녯~RKpN'x^z= B|~FCffE600jH$€X4J_b)*aw7ի &<Ȍ&߸$3S(X ,a}!/^` IF&SO%kz!jev2]@ ]:z؝RЀ# )++T6=\WWoӦM> JxghllGpI GXd .KYPM~~>d;w("T*n;ΧS'R O$\r @0 aFb #!t0ۦO'g@&(/OhfXl6$0ZE;vdQJFVZ%x^N'|nv\.bD^JˁbAƍ.fޯNn2XǃInm6{ 1WU1}NXL&~Hl{z5\sPA"4VVS# F`~?\{\~Zj|ŎDDu/4l6s-bT_WtttTUUQWW'# E>hmmeǎCRq)Ctҿ=ćy?PHJX>Y`F)ںɌc^{M[ VTq1nx(ob1===n Ó^s.̏ Bi N9n >v-"L ɠE(KW "F$d bhn S[+XP]N: Hh~4z=l  `TJ<6=R8r``N.]%ANfP{p8̑#G8rˌdX,z=x^ ddd`Xd{?f3guOGGZ{\*\dӦ! IΘ|@ɸnm(o܀fH@(++cƍTUUrFRI?TTT}x\:;l 5Qhk#UYj%e0 q8o$<\DK% im xQ2e28E'M&[UTr5ACCʰ67Sr5Bp0WTӧattD"WK%0> ] vh4ʻヒ/;G Xr3e2mmm׿&//窭{W_}gRCfP_/IWn.18:ʓK3f ղh"f/^':D}4J}$Bwת6l  r}곲СCL6}zjn-jׯgۖ-n  כ+p F_CnGTJ1N0nE 73mn.ʡ!^J1& J$R$FQSBI ٤ƉdO[I\$$b&2, ?!]RfttNGkk+opjv>3p{r뮻[c0D"e~GP/ME2228y)--:f҄~;d$.s75AQXAIZ,rR)J%YYYv.6QP0߱1$&_ix^o3<Ýw 70ZVbrHC+0_,BVl}8BpBF|{xad2LR)230CFÓgI8vYr׋b4O \jjĜ2iғɟFF9}:"r ed=ÇYv-V+ҁ32R)3g'K}}}mmm477O?-%I&`0:tÇz'W\ɯ~lÔg~|>]]]tww>I?3K{@ @8:].08ޕQ8ޕ110>vꩧR]]͊+\N9E(+z4RiFF@@i0o|ݎT*ZM[[2 BA{{;@S !oJoPb+ qC!YiPVųZ-rF#o#xp gu`x Շ6YbUUUx>Gy9;я?C¬Yl,FQ:Onhh`ܹ8Ntg`;ֆodyx(ӑ-!NCӉaJl6:1nDI\M/PiapXNfstB<#LT*Zbbr>KdQv }%722"Jys=ttt`Xx< t:q,$=ɠh8f̘A"`0淋]vMz j{lNj%^qU,0ˊu M%c|A rss9yP(sZ$uupPq#uuXg}UVH$dggEK#8n=h\%pni)XLZMNN:NT* Bj2336mtrXy !6T`}>둘LdO/[ZѣfeeEX,իŦfJ5IkSfܹlٲP(|륩 j% RXX(/$v\ܹsٽ{9u]mb8yގ,}vѳk?UD~6l0,^'IHVhs!QނK:_4ʹuu@z뭷PTj;'mq[Eq\#oj5;Qh4̞=+V` =T~OL&ŒK" Hyo".GT|>f3ґMCHnVzD"AII F.غH$HR( kg\l/999slh/[otR:::0 Ν;ltvvb'^gRc;gs^#QlbKD* `4O*E3.b zzz8묳p\ 3w.^/r¢ܸQX@,Y噙rtHss3+WoI0r q̈F!;ʙ3vDRT=!p(RIGGGfw`CAX!}ѨZC8j6S6}:hNQANNEEE "pzSF E 20q`0 _W_(CRKuu5ׯg??$݊$}s}EբT*hT.gp`zm۷_~pn&I6U>M/,ݸa]+W"KhkN.a~DmWs,yu:(m2I ΝI*N9#|kVߥz4,F#f ;vH!(%-^J\lz=OVV6q]1FhTz&D! %mY%%ՅNSRR"֏م{yzbΖ-['u**VUUHǃnJII UUUDCCr}?lQ IDATPɓ:uh4JooR I %{n.&j<n&DmA%ըAe6hi G$0A Z[q&'8i2a)+c̝;skFr_zSv<αd8)o |#GDcI'%O#^>ω(ߏdBR ޹6ټy38Nzzzկ~E<g„ n^/H&fvaJKKtt:w˦Mhjj`„ Y>)/r߾}+455O{{, &B{$ TI1q鿶6HxiFa )JJ,#*;v uغĖ-xkjk>LMzLIի;MexxX+.bbvfQV% HۺHfX* t nk1Iun 岀 Z-ʩS lFBl63a„Km5p%t4VZEQQX3gjb d2qQǩQh43uO~ߊz`WWBJ顸Áo&qM("1&z-Era tV Їe.,~ 9 NEHH";E(ŠnI96?;Z9L?; :Daq1;vC @\rRܟx\zo٫ IתEz6'1feOIKK#==] }ښW<ʢ{{wP(RDh4J?v"z-!ؿ?wy'7o楗^1c T{9mON^%ʕ+EMg޼ydggn:*%(iJY +F'$o񓟈0~);wℴjj8+ś,>OQ2zHbI%wz=^q:444^?o#z%KA S)ܳ9 T2Ru!9sV+F`%o{8BբKN c2W_ ~FKKhYl|FéSgZŬ={0gz!tO&Qzz$Py<**$й\⪩9 t޴}Tsq?&@]XHN, Dz/yĜ'Rr&GC8fܹB,Vx"A(>׹Ix\{'^O,C.,x"!y26l ๹g͓Ei)&!FEmtӪ^qm_`׮]a~ 52T*4iNL(244{=۶m{Xp%* ^y~188H4vsiwͣ| 8멫rH$O#gI$"u"lH[Ǐ~|>FaeR*lFKP^a@WU%e mmgc}>PHpY1<̀͡C6Z(*H0yS^cyy@_RIooЍt]N'DvIeZ^RݳUrjgu+?&12^^Q{~_/V`0;#n' q8Bd2 i…(JvIii)PzF9$y<V^֭[ /p Y`J`0H<g``3gb8|0*+@$\.&˔/\(-޶6?ޱz 9f3eR+OF66Jɗ`L&2O78+I| p=Pq4?`0ȶmۨUDH4z֛\R:zOR^G!2ГMR 0q3!q2YQ3M<Xw̅+ piiiYf}}}lڴ|B \sss BH6MJJJ8q"CCCM];?755ºuRlZe0F 9sxX,ȈlHm۶RV $%==!I 2@'~7*+>*fA ]]R<zEA ػw/^^vG"J>g"!\CKd^*2}rB3gPtU*WK_ OIQ@s4Jχ$wDDR\x2۲Sx'X, si~PUU%(7Y,(l6l6h" \hrGTt:뮻꫙5k`;B!af3_)//'// ߇^׋>2łN#---[0 lL"ѫzz$O&C'O¾}(NB!nfjNIֿJR`@΄SQi4:rLBMu5 vf׋A% I gCP, 7s1tر[oUh4J^l6 (р3PS`T*|>y /&hR!RM(!z8 PfgfɫA uG@T/w|+L8`0HCCz+EEEVX!T*ˣF># @Tߏh_dƍώ&rUWqz),,DAAuuun u1㗦M館ݻwSTTğP=Gn^G x(F?-a ǃRDף7C<gF]4FT*`ut6 S:?zB!`t:YYRH{ŌD9gkxL"`hhsg͚ų_TkI"B*+Qݤ%=j詬2GFȈz~?9pW]u|>l":GJGkk+D`0bj7"_QQAww%?fͥfn(8p2f͚%^YYIAAmmm~\q:t:V& w.]$.e5) l^A }n0D('' ,z(X|FFF@Tb$SgOJFeq1xYeee\.A:}Zh)`|`6[ZZll6f̘'$H$oVj9pᰘV$}G֮EDnA6NPܹ7VLXx񘬡|ȗX,F8{zz8y$ 2\.tnfɕJR)M&u: pz^$"+Ě5kBuV-ZĊ+"rD"zrssEc}0dsAEQUUEww7ׯ'= ~"\h4XfYHzZ t:,Zn|>{vv^]\%+o}I:ap4A ZA/74K?Cz:äSau5 &RhPh4Yu:FI&ŸPFnڴiڵ\>5;Laۍw{7~;Yē3ӧxHD^  onfFMzC=jN0'tM8qB V*tRNjgPr4ZeeeBvVE(_G~|Mb4 F#Z_ 0Gy4@͌Y0e72ԩSm\⥞z"Wdf$3+J2T*Lj Gi)~^v;|##/ТE4& j4 c2vvO$++tz=PNGţQ$̘5bOѐ3i  HjYB)S"{nl6CCC޽[}_kAPt:y, QTT$.K C^'j2oeFh8z(h4K)͟痢RIzic28q"iii|>Z-YV+n7]]]N8A~4"~>^Wj5~V+IURd1"Hގ$DcLjbzzS@w"fbR7&==R5Cp\ RWW':j5%%%*3>n>={6˗SUUţ>*{ f̘EQ> `hkkFaa!fYx`0Hyy9^Oww7B1:9swAuuXOf ٺH$B8FT2sLp:ctlVVX0r89.jt:`JEGGo9"l=s)*JjjjhOeff1co2||FF( 5K˲jZv;d̙|_ecfB }ɒ%3zjkk9|0d2" ɓٵk(kdee6FxgRrvPV3k,m+{''' &022"d "6M۶m*[~\"c4bڴi蒝S>wQa۩cǎR8sfJbddD<_{d)S0k,d/{/ú__0ݻX,ڵkXQPH$"հ aڵTUU `˅b#tRv-&TVV v Z-{:"Tq8cEl|K_bժU"Q᜼D" p ŎH$DF6??s璝=ƻ]>u^N.ԄAǤIc0'PYYIee%=Vd2|'Ch4nnN:E(뮣r@7^,KSS P(DWWeeeBv3i$&L#RVV&:{D" /@0)(&gf89NZ-EEEDQҥK>}:Knn..K̙#x]b C~?yhjP(VjhF#\"'wjrssL&N2"csrbCO'N$;;[Ȅ :ȋ5SZZJ]]*J|z>ZW eDFF̚5H$2{SM7?NH!N:;;477o} gð-9oLn(xY禋%->qҋ-0CzJ~|R¥\+JӤ^{M(#\(@3nߜA6p8L QYYɑ#GlbV7H("F(⭷M gfٲe|,k|ZISMn:Z[[˗cZZV1BFt>tR<vfp{wE9M멪;w}7)x) ~X,?wc<\3x<zeYn8/ڗ{v;7grŘ\KgpO?4###nF##''gܡJ8)Njp\n2?v_0xwLj$j[=иՙR83o ={p1{)**$y:+r +f F#=OE[;v0<f̘ǜՌF#f,X/RѣGimm%;;RWW'z6y }~3hj9*f %c>~(>O(j԰o>n6V 'G4ٻaT**&l6 wq/RYǔ}^`Μ9l۶ ǢE.ؼ^/. ZMii)JA~?ռ<yR]]-D{>mn^Rܑ#Gj0a<ThT|>Njǒ%KJ l6G?bҥf,eW4vI]]< 444`Ih_V& RZZ:hYYYL>ŋ㏧ǔnFmm-ddd&KTqٳGtL: /s禀? ԩSٰa7x#o&/_rc //~ 19TTJ%%̞=o/~)pL4!cʹiXf {媫:5T*LO?իǼj%//kZV\)KNt)ϟ磸Z͊+??1}ti(k"YGydBSLfҥ)+jLFOΙ3g罹Vapp.{9JKK),,}v1eXTTTdnR`KY p ICt:hkkc޼yBz|dr}vV^-䌣h$33iӦqSWWGqqq h)K"< ,^dș3gr7c2p8Z ]HYRerB-r?ӧ %Ჲ26m]w],R^uuuF]lٲ;wrH$v1Q$ugRpjxLzzSOJuuuTWWsUWFRS* @qFZZ,R~Jw^:::D".\xP3e)K2v/RYYIIIIJ6-e)5yױX,̟?g,O`{e„ ~[SW5e)kNopKYRvaS.AR\R[ IENDB`gmic-1.6.8/zart/images/splash.png0000664000175000017500000007770112632021514017144 0ustar dtschumpdtschumpPNG  IHDRclw pHYs  tIME,+iTXtCommentCreated with GIMPd.e IDATxixͲ,YvQY'qBI BHY aiiNOpq8(KߖR8lRBqE^dEjIG3'R.0HOF^…2!QUJ! (RJ! (RJ! (RJ! (RJ! (RJ! (RJ! (RJ! (RJ! (RJ! (RJ! (RJ! (RJ! (?%Xl`` %-\388٩P(l6[]]J8.j<JT (.. grrСC]]]l Νb1EQJRdjչ\.b4 HPo---2L&sر@ vO821];?pW^^~%<#MMMPh4~\&JKKIP p?lkk{YeY6' JH$x|Gׯ_,ngYl6+\.q˲䃟(EQ\jj4 8<<\QQ```T*A&044?Ӂ@ RT*}m۶"Ӄ)GJe2liiI$ׯZP8A& W_ ,˾v+ 8p~4%At,cY6 `ѢE$aҥG'Ɉ.\XVVFU*U.d2X{yg1e"g2N)(^|믿|4D,BW O;d2[oAD6MR\.Nm0V^ҥKjذaF!60nWWWGQT*uر~x޽XtxÇKKKjJ+WqA)GOOOssZnn[,sJȓ]?Ϛ5B,r9Fq\<'q155E (izz^+X,f2<SO=߿cHdR.4M~7HP(zo RVg͚%Ԇ J!Y B;w<|霜T NNN,dXJSSSohh袋h t:H@ Ȋ=4VD"z]]]v}…NbxޟT{Q*,ȂǴT*Bi: _D@!Y^+PPPP^^/_~Wovuu?eYƲ,qx'[MMMׯ_xqQQQ:iZӍϘ1aX,f4sMd*d2եRbXmm-0.ȑ#4M755̞={||nyo*! TH$bh4JtQQEQCS%J?^TTD;%$޽{P__/Fu]zj"}|VZZZzzz388I8LNy(*͞q֭[`Nh4XѤR)a83 N3 YVLF>l6/rg4,XoT*a/%K$=кuFGGI&0&IV'VXXȲl$(884MF"o[nDQC߿ܹsV\vZA&2!tHa 8tЮ]"#_믿NJJJ-jY8jr\.W:9sf6h4^8֭sݕHnW^}饗!O~```bb*t:fY*`lW4M:V577;Λn"oPbUUUEEE+V~P^^.RJ \O$@6 jO5k Ґd^o2,//o=p8l6^NbJ2 4-HkFՆx<>ޑL&S__{UVVnev+++5M X, .dYPl4 M7m۶ . b^z7(Jպt 6|n! -ݻ}@ 2رc~? rt:m۶^S|X'8n@z<8^zd Myy`FpibzB#1~hM6 o3g}OS,ˆB#G:t(4eGGGDgyT4pp8<O,#M 0 Z|066U/rbX,ǑJVh4vb!;mlh2H$tzJT{,Y"oRBd2iyb@ 088-[֯_oi)A>fEBD"u/&tQA!Hḱx<xR4 j4DhT*y?09EMMMy< L~WW?H)Xl93o޼*Y뮻Hcnd29sL\vSnh4S$r[A*۷ORTd2IN駟&oV*wy//&:+4˲?ZQQP(:;;C~s=d2:KHuF0$]Z-YHE:taH499 D")..l?O6nHB,KH+x\V_pSSAl2Hՙ^z$3JVl6K;v5kL&x<@Ƒ< . Gզؾ}?//^K/ |{;I_)RT*w%K$1$w!&"CuUWƳ|D:::}g}oqll`0tvv666.\p$ɼc"J I(Mnhh ^w%t2lw}U>~zSSSj;M$! >Stj2 }vwIaNCCC i3A*D U*zx$neRsbŊnaѢE㜏?~fo7={ydP(DzDBќ{]tQ8fFeynݺO CCCA&|ݔK.)...n?Ss}:`& eA2hKg#GLMMI$#+|d׳p6l袋f̘x{{{w*㊊&&&jjjH-F"صkW}}D"!e$I (ꬳκ{Z[[YݳgO"%ϟW7Yj_ϟ;_O/b% ?#>h0\`=;swuFGRt`0 rqO<)ɢѨ$]BT.,,+oYxݱcGKKovZXl۳lMMMd"4Mlh4ZUUL&d[[֭[+++e߅QTF[]wgOu ? 980PUU58"?XMg"hܗ}|bpppΝ\pAwwD" Brp{D"p#0 DYYT*M$EÇ~^2݈D2Lkv˖-_G=of+))YpyH+d4{zzY ؿ?1.FFFN'>rXR0VXX8gΜ+WR_j2./J$RT.UT&j\JT'ܜyCIIIIl6L eYa0,dX,.kH&JoWґT08_mѢEW^ye*#*'?t\blr<4JǡCHx,#`0Vwqǚ5k %ģ>J̙3'H̜9jΛ7/ \.r~*ッJDNAAN;7o޼hѢ\.㏛ 6MM]ydBhHɤ(ǻek5J$B!J{mڵkIm?D&Dߺu+/ "p\4/D[\oAL&oI8#HRmM~ N+++koo߿GEEEZ3ϼ+,Yjoy睷qFodСCjjjL&S$h4lf)nii뮻o'9{zzn^ : P<Z&<Hxc;\.2l=xV0Paan{/|zfΜIzv|&BqhF44'OB*mv_hQ&D"h7K)|>_II_ h4p{luuu B< I޲eKKK϶Z7|l?#CCCrv믿ȑ#guVYYYOO϶m CWWN#\.E]r8lQ]]][[K/}b'gM֮X {{aeAPU Z3sG n!+T:D.Ǐ/-DDbe $ x_" /'>[ZZnHUUqB,l7644\z_uL??L&):׭[I&a T*8k֬FR IDAT;wv /~qh|jtP@Q`N J%FGx_^sq#2Mphg_y> <xœ9t)jjPVQYQRRJJJ S<_DR|cH*"G<bC*χB"AY0 G"*;OjVR| 2(,P(062: Z-Q>7dǺ"ȷm4,NFH$d7СCH&EaaZ˗/߸quTίf=\055qFTooQ2I8 hty_r>'6 Ў666ds'yB:1x_ŗ(($Krg >|쵳"H.z4Mϙ3g{=JJh[kk"91  iSx#JRٳgB;'#l~"&IFSZZzqΝK[(X,EXohh+xki}lllʕvfϞvry{{fH$xtFъFc6oޜ?ZEEEEE}WA|i*Fq݈@Ӂ#jM# Ԏ^u}]m&S,yt.Z(W?Jp$'h4FFFHU2VX,>OfcqqR^"`A"ErccÉ9nbbbݺuDBgb-L |=<5V(Zpx^պaÆp8|=|^e2ivڍ7;vaD"!go>vM&UTLfyjOd Vk___,[t)I$ &7K)RԱcǴZFٷoݻVaFA,qJfkhhhnn~f3a}=Ã`/(( %x|ʕT*d.رc}}}$߼y`` d͟?Mw#.וh6;0k\.&Ǫ` `FPT$bl~UbI&dDNɘE0LMMBטCj1 dR?d. @:dhrCiV@@$9 <_34t|h(P @zJ5[\\\HBL|C`0 _vg٧z#BOx≾V^ ,hooFFqܹ,˒Q=,˖9ټ^z_?,\u /~oS8~?fdjmmMR`0: 2^R  ch[*uoUc#QHVdp۽O/wq'^"CGǩRuTr9r:&N 67E)zGygioo&ٟd2){OӋ/gT:44d28۷oY1B2o>ME\NtE<Èh4!#D"N;{ƌXG%F#L80< [Lbʊ#G<ɕd+WD~ @:ME"MGE6lH18qtӝ/|8,DEEvfC4 񸵦fƾ}hjž8fX W_ D"!(vh0`2!֭p8p@Cf 89]R8qbttjx3yW\SSHa,t䙜dٻwoPr|ɒ%>ҥK?}nx؉X&JA.8Q9a6]h4vg2%vf8^{ nXnܻ@$((oF<'m>CP<ȟFpZ}*׫, ,Yhk몓'/.,\s(M ( t:r2VDt}Kb1 aP_ih4hn!qRî]8\ 4χB!JEʋr`M|9ΥK'H}dǏ~嗧$MCUWWG"ɔL&biOVYgﵙ `A,  0Xl 疔t.xuJs8tJ%/ڵE"'RTxX<œVUYV29mQ(Xhۑ ģy᷾uO~Z> [vx(f3~e烢R \1< ͆JzLNbѣxG 55hnFu5,@ R*=O(ZlVA,Jqe˖},ﯔzaCdA̘h&''r'n |@=c=d}`0x饗~H$faz{{WXAMӽ~lhhUWoߴ;eEvu-HPQFK l6EEOM= 4sD,fU Y㒎L%d@p;`Ç_hچÇZd2y<cnݺ;vDC!=fٌf׋ /qFGq QP{#P<<]("jH6> E8/իE, ( "0 x&7<9(J ?ZR\^)FSYY 67hL(2~oL&: oqxx8T*Ӄ?wŤR/Hj}b駟c gw9!DC:;QRQ8}%),iZdzw}nL;i&X(,D:-X=|*-D"{yg뮻nbbBRtRp8`+V@L&1kntv"I|v.)q|44mjT*]XحT>yIáPhA&se$"--O TVv;p.װZ}3f%%z}X̙=vl5C. WP<9w\uFGG?vuu>$a8a,K<mqرH$B6M 2lŊկ>Lg~@QV+ p0IbSS[&fN3H~mhlDŠP Dq1L& .Yt[1Tj޼y:ld20 ˜dݛ`"˅pR)h hD~~:hZ<>N@F&8h(NLrN*bSbq, >u2l0N5ڠ(曩hT"Dc1\. d2l6K j2D~vww=gyNcAV(Eh4:88844ߟ@P["cA0L2 PW'zp7€PlXիW666|_}5%KDVFq1d2crRlmm-[(ZP4-J95===$CruK,EbTP(ebzg].?$X T }]*UUQŤ[GQQQ#6oF(ITRnP}ٕ+Wt:HTPPL&dƥK>X1J^&rM6V* EaaF!IyyyeeL&K$ BVΟ??AN`&l Bk+Qt"E=6(e˖544;EՒTl6j*R3&۱cG"#Hgg^w\xl6d<D"7oށno?`kL]_9bZQZNCo3;aJ2dlll-zZZxUb [oaRE̹G[o`0(J Ekk+IE%@V;09 hj> 0LכT ,T*̙ظ` YǑ\.'O#jh%EAC4 ۋZNʔJ%ir( A^^;x^&͜9LՒ^"8rNPu.(ŗw3<<F{zzju"Lf||bY6$={#x4ɈK/O>900p'O$/.Fc#zd20Q\Lap}VkŌLt###^ (,TUtfy^nWp8\^TTT[[nݺ͛7_%?PS̩+0ع3QU%h4*dݒ KR'"H}161!r:Q_acj (*+Z0~DPTeYLFQT~UA&2IR~D^{aInST*JS[[Kzm) v C&p?_P&Z[[?vuu)-n8,bpJ%fT ^o4%ۺÕq<6@.EEp:E9@,rN]d7߼b ҈}|Jըӡ CJd®]P(*U2(,,4L#R+r)HE2>XB+We+ؘ\.O$đK@_۷8pa2}׮]MLLٵl6q2bw>ĉN x<~Wqhal6קH~xx7ߜ5kVIIx<]wotO$an7s\yPQ*p8CC9 LdǑE]2vIu:dܹrNWZZ'K#=P\.rL&S(,F"FQ%%%'Nhhh&2Rn喹s裏>J6FFFHWk2Un gg% C./"Ǐ QS\ǎ*ܷjdu*;yT(*86m3 CCCs'+Ɲӧhld2)H>=8d2rh2?vx IDAT1taH@T`eYTVI݂R+qW:nkIE/e-KYYYss3pg6#H[[\; P , v>AsϑE:\nJ^|j@~ٌ˞[ wM#Bo/N̛~Xl`e۶A&C0LK`L|!4(_j2 b3 ~d2P(@6N&10î.%I" )e2PzSՁ ;vL, HL& (ŗɞHR?ϝN'޲eˏc#qNt,]txx^Ν;o~*~={?.HFGGGFFȫ&9---K.ݶmLA,`YB1oީeVcكNp\[5ms9u[Smmpa4 f3X1,qrˆg2Ǐ/_ "'|:E8JFpMMxᅪٳwu)\.'H$ϲ 0`&6mBqZ͚%#cX%|PS^ JeB'^}W^yE>|8tM^gQk㣪'Ifd'*.RwR-TڪuZ\jXQ@6B$! !{d2~}xO!Q~>͝ͽ{y9LJJn@vz[n7ܾ}[<6vܹ7Ax7zzzAp:'O$={jMLLZf͛ Gii{#$ ֭`2A||׸*غ;_2 aw߅ݻ!!!ͅK..@ >v:=JT2RqO2 G3!SR1 AtD7gIn% ptvB?pCW!A`9N.;}@F^RJ-!%'^x{L;wX,(fzO~=w\aٓÇGoVMrmذ/|d~') ^ziFF$I]t0~_)SL2:i@n7\ ցs@]Ձ %%}v8 ̼^:=nNNIJd,#IA:BԴn:w?$`0A(**iYY^7oBn#jve˦O^PP@=w{zz- z㬬JE:'JT0 B.o۶m"@%0~<ˡ N"d& 2Q1TF4a+u˕z}B\F,/ϙݽ[8@r9a"6w덋*v꫉R ^2ݠT XHՐ8~\,x0_'b&$dQq! bcP(zi}1;8Gg<@ҥ ,uQ*7]w]rr?rW_z /$IԎ2y4 Ĭ[voݺlj…_}US~J8A^/y Fq޼yfw\]]]n^OII!/j5qEEE*k`ZP!5`(-n_s'11#r9^!\O's8xG #`_iP0Y׭l6HKp!IB|k}X>?>E$ F!.R0 B Ǐd2ґ8 Av86…('RS 67um_54'O`e20ٶ>o%%1^v:% T)Jcc?je2Yyy\_l6GZ.ñ@ PZZj{{{Y5MMMK.^z-[H{hAp.Q71c)c{L4IPh4L{Ҵ(ݻłfW_`}\pv\p .N+ 1&jzL&y`0{zzJПjۧfdPT\yy X]tQluuV+O>of&wxd[X"&C\rL&O'\2ǣY ,- !5<装C)3flc^1{ߣW_=wLCXzxrrS.<99 99~w{{FO;*7+..:ujIIٶmx<co Rt\ c٭wߝfszzzuu$#řDrrrVk]]%NݮP(n6{7m*|`PLJRVT*tV(Jb bbbbCC0]})\k$0a`>˱ʤ]r}I:]iii @uuwJ8ՃBl6BAfk3#]&r: YpV4!7iK_"b@*7`vl?(*W$Xl.+33p$'OFR'nPR~_y>ɓg o͆4P(`d8rB!X`8v Ҡή5 ԬJ1&8p=򾾾իW7N&Đ! Z[[nBؼyZf~~>0n,#7n{ŊSNʒ$UjjNSŞ㲳ڪA0 l޼f Z %D:4z|azA׫FcbbbJJʜ9s, j1)aleǎNͅ`$ p?6HMU^nݛ8b c||M[[RL5T*"j5HB(!!a|nn6l0,]f 1LF@V1\.bBwunVK?jVP8`[oҾyXP Jl&[8yl6ÇL̛7/77uƍOJL\LFtAדrnh4vwwvIVk{{{OOht:HNg]]]t6 (}1<cR\z)\~9\ &w 2X7B8nĉ[{zȸ W^RzՆ30aZRRr:P ̗_ŋó,pn$ 00 cg9sfeeeBx~gVUNӦ!Q`s;;`{RR}1d s%-{ٵkWEEErr~=CZu~ 444tttOJLL4 \rIzzzII oٲE.?~݉$BYXXx-dffܹsļ'sVksssff j:!!̉'gdd,_<66>z#-wV&K]{]\VVf;~>S_p5ْ$Mrp0(Qbd2B ]ՓIL&Cҟx #SSS:xJesso4ICccc0?s+JP(0LBB¢E&L`4IL!pG^ԤBdff&t:9#$RWTvvv^s5K.=eGlVVVZZL&Ө/l'ObtN.(Ч+gWΎO Hz'd1zh@T#b{ccLllvNe.'śL^b|Wg%$;>s/8u:ߑ#se2_Oj>bHjdAXFT*@ccK&x~xrAAZZqr,>%1j c&4*--?~| U!Lۻ~Rl⦛n Bv @jj*p8***`OO1{18{v\$IZpc=eL&4EV.rHiii%%%&)!!!++^#/iӦϟ?O>MgoomchP §}V~?BM&;vjd2r$cE)3dddƓ'hd\xx5{Ζ`($S*OtP|&nrzy's=$̲… IWq}}#Sf0ƥ(*JRI~ "cxDQKNNU!GEpMǥXɤ;θiӦ577/]477$ PCCɓÇ 6Luuu&fzbzG+?@ 1c_|gɓ&)YjP( 2 3eʔ^AlbccɓC\3j%;8NP~eZb!UKKK(zA$555ye&??^;yVK-t:2P:rq3gδX,jZ@dl)d}}}YYY HiiP>ɤj?SqSSӃ>hXH%~`z>O$25#66v„ >駟/rϧjU*Uwwwnnh˥RZmll(NSRit: Cll޽{IrUTT֒h$3eʔK.%W… uT*gΜ_ `Z~bbqBrt677~YfE ArpFvvv?~r<ٙK ׫RBPNNNNN?vZV =OIIVb bkkkSSS X`AVVVQ,"Ḟ`0Hrutt?~!ZZZ233IәxA$uâcP-ݦao~nfD&H_דny>55U.ZhҤI2vfAb3f ABB錋 2 . $'\.͛;;;hFILL׬Y3:9!$~Ff <ϓ[ d2=hqlf=,˒G>'''ő~*jDc)IRFFFaa!˲cAiD$t:VPP "G˲lĘԪ mAilllll$g?j%lQ2TAbf&iϞ=ƍlZG!uZmBBŽ;IKdǩj۽i&w0 C^;Q]RQ( x%#MC6NT*#*GF"HL*&-#3XAs$ $>JER2RJ1ꫯBJʕ+IdAy#e)jjjVlVյ6NR5773 sVUUs>i$8N:cݾo߾yD|ͫVcw bЇa7zɖGJO2_~U}Ö0Pf؃&-fCbx>3wuu}'/^t"f3qɄX(//24%/`0X\\ BmmmۢL<)S,\p͚5c  8~#c6; )c9o䔗L&㪪.@ B]]] غu+)GyWTӦM[d|;t:|`eJqvtttuu-]h4%8^OS\.A ɰXh"Eדw޹sgIrrssn<ġP_5(>sQ^O:D>wwwwvv\?hs̉D%jubb^袋6nHՁ- Om87^rѥYZO xReyӼJYu1F0F" R رcqqq.,,$$( @FUU*zn+SXX(TDNpgyjfF +pZpE5+&"?;Y[]sWIUݓ4ҁw%8.0S^SYYxF`}}=)$AAe?~l2T*յ^sщ`Kkm'݀D, ` @"B a0f>}H!, o샿U pTZpQ!c xF)͘1cg޼ypzrLnq\FF0===^7//=Ch46-//T(g)x% @"iF1UB$Bm6os/IOotÕ1mLt 3e(Trۓ\.WFF(Vd $ F~KɔC-Zh,>)1Z0=G 0(Sr4(Œ SFDm>/Ar ڞ>a.'e !ctlvgϞLa  L֦0 ÐR~?##cٲeD#F={\veݠM^Ǐ! ДIJ BPV1FAc`q `8~~s' CF1R߿l6͜9t:)3z88۽/'Tӧr-O?#B t:[Ogwvy?$IjV+7'&MO5#]|샟J1#$$q=R* J9go<#D5ݢISSg[m8zx]&H͌)ф߇W(---uuug&}WZpرcÆ ajuLLĉ/´4o! !0@wdhwx|!10 zV;rFΣƃUmٲ93gʹOJ{HR D7 .cG[*J[*JN_xaYA 1X$~pfQ)NoN+S7-F{B"pBz1'?ޖ7%*1Vr -EB{Po;:|v0Xr,2$3$DQ8l0,bD14aZ¯~3K~GaΜ9Cʹ5m8DA&,YYC1H’(`QĢ( J%2JP$ΤB`H CZv$[>-hNqr;:jj]e%m'O:MΨCDoƍ~]KQj\YH)QW1t#A ;GB0F@ cdb8yYfۦ^UHd#$N5L؛z|0s):zW򟂌;nk/8PTa-~NcIX@#1b5V[̤iSfX'M8SC3A3'_{0S)q N_?+p5+}q9B!$@dVd&fҍI)R٢+&V@ aE21>լH@SP(Q#$H"<*$W4K0Xb$AC!I &hJ6:e՜R򼜘ngu%EmGZ{xgtɢO :fLgGB9K&0B;>vD!%I$1ABE=e]Cd 0 "~+S2#g[($E @HbjDz,D)ɦ(uJA;H?|kW`BH2,JYp$a@&F0aHKEBbtvƽ"jEd6CӪXaART=%2)Y?UQ(e T6)G"ZU 4sڦ1`9H2bF|C  <ƀHB6(Hv `,bqB#~1JRP(Vgi&rP=O*_,pntuy⿡Yw?hٽ70 ,M>|_0`apްB`iмO~˯_xGF[59[{dwwmv=~~Opv n!PTW\'|nm BqwK _|;SPD4 ^h4&$$w)IҺubccoVC/!!!!! Cw}ĉ%KF^5tuuEkT*g͚uرя!;v(7|36ml кu CbbFͶgϞO$\ " fh뮻`d /LtAxSRR ƍGЋ6k2o4);w{|ꩧ֮]j*ŢP(fϞkjs}w-[7L7O=ŋ5MFF_Qn!W8gf$|y)Njժwyr;V^g9qDYYYqq֭[5e׮];w B?xVTT=3C{u׭^n777'%%=Щ"۶m۵kWWWעEя!+V<#{9p@䥄1.ou-_'G?u555رm_|EIIIYYYuu>Y{#]ݻwΝv}h#-fhS n_~^{Feׯ'K~_{C?tW\1P z}.hʰLeiUCn$V\ay+WnܸǏ)))szzzxT\.j촭|xED+0tFɵ68~h.<##И%G/袏>h,[[`|^z+L>O?=`atϜOlܸqƍ<п._|͚5------w_dʕ+o`0X^^tR|ٲe{n{eˆnt:ZtG:h-[VYY `:UUUlYl jr95k?|7|w]__t:׬YskEv锣:us=x{g}7:::^G`eeeeeHoGy߼ys]]ݰc;&=bTU\8a֬YfKwy`0Ld,E_7n}Ynl6͖-[rrrd2f{Gywrrr Ŕ)SvInܸ1&&fؑ#?S2l6hׯ7LaʕxСt?lZ ??~h.sLB+D{1>p~#ZRΝcǎѣ'}˖-&M$b őMp9SAs1M1j6HeWpsgyШ$L8ӕǐ Ed1d2>x86-xĮg69_^ gwˆ Ah^A0W@m|pi.[xҜEN$=v0R&_ ӟU?N=Ͳ ҫ|vzO$3+ \C0ިu,7!fggV}.@= j$y{79 ϼj=r2,:PEx[BbMgϰБ [Dmf2P2Bٱ)roߔuD!d؀^!q+C]HԒ29-ZMVcܪ˓k}/ؑ?]н;_fkj].ls~Ҥ ܖџ`ܼTNJKwrLl;m`Ŏ{ׇ2gI+cfwV}ցKd˳IENDB`gmic-1.6.8/zart/images/Logo.png0000664000175000017500000022720612632021514016547 0ustar dtschumpdtschumpPNG  IHDR1asRGB pHYs  tIME ftEXtCommentCreated with GIMPW IDATx}P+*+ Td[9Baڦ~%I̱LL.c;suz녔53,Ҟ %{,6DJ*jI@W!(+EveeghD?a_<}^g@@@@@@@A r. ]@@@@@@ ". w{׭['. wD䕕~l6 /p#LT_a6aZVhV֭cKA@KK V/&-\@Ʉa$%% , ;;ɁN i}OlNcPM„/ ]@@@ f34 v塼@x)oXi@y%/=ggKjEyyJ]@M&J'Ot: R4 OM&,Y[V* ]@@UDbAcc"!55yyyT*ݻKu{9m#f|SlFjj*oR. p߁n3Nx_4a100Bv|FF9@RRrX,LWWWڐtz}>Z-kb. p_63Җ*f"M(v;bccp8˗#..6mnRdpRD❝Cww7j5.]ªUHMMeRL ȼ/Ln|Cˀ wυ)7o([d@rr2S066twwc LMMahhnׯ_DDD`ɒ%P*p\BLL vڅ$GO 5K_pJFxRfC__#fp݈Bvv60 9LOOvCP >>P*p8y>Xve7N' BT2wMt:{ rXTJ\0U8-p8j*|'LMM!** +WRB@oo/SXr%bbbVZ'ҝ|ٳgUpt"55q˙@?Zx;AwY8uvvbjj ^|*ZXd n7bbbd3%`TߩٝzzzR<0.. ]@@%oއLǎcɔR95GFF2w݈DDD"## =,, ˖-CZZ?.g@nn@WWZ-donn8p* vl?U 1 Ƣ0F0668:u˜R0>>qn25sƍ xEբJvݻ:Çg!'?s sC3s;ou}‡/p..&v 6p8pI~!Kǃq,YlˡP(RRpi?~]]]xC&vVzz###b$.]qZ޽UUU8z({RׯGXXڠ鐑 466l6!\z-G& vz`v8NXV8Nraff~:Y9_zXb&''Y\ 櫪`4Յf@9>nLr|={AB 0UXYY RTWW3b:y$L&yxw`Xp%\.#&&˖-CRR 3_|]]]N>=/bgbA)\ѣG@UU3ɫjtvvjt Șy0\- ;/bJ-B cDNEOwN%Xo~%vx<affEGEE!"" ATXd Ν;7o5`"omme;`0_]]Jʩm\@@(w X]] Ʉ0Lñcݍ?xى .իv.] Je˖!++ \pΝq]B׳%{]]Z[[!Բ+hoL)ˑ5.U} vr95<ALLL 33NΝbԮ^"IGFF"66ϝN'fffX(s"VrF&U(z,U]ԥۤmbrX;#e}vL&tt"..SSShooǩS0<r)z= "*T4_} VŎ;qSy.UQΟjuRn҇bAii)z!aʕ0ͰlDRR"׍6 v}ށp$_:ǟr5 ^&Q{ohh`ɢA&z9PSS}~~>ˍ9ɋ|wRG@gg'aUS(n%Kχȩ +uB5 qaeeehnn׀oll޽{4^ZNuÔFIy4ͨƮ]}kxWq !..Á!Fr \C%r_|R )w~UGףuKK 4 4 f38~ݻ&Z'dB[[ . `&:dłF@NN `6}jj ccc,Z8\r QQQ!ש"P__7=Hw?zX~?FSSӜ'/o]@@Rkd2AӅDf۷oGii)ۇ'OUUUC{{;V+, ^ ظq#>n3b'u~ʕy[N+H_@}F IiYWW2 x饗`2`4w^$%%jh4B`޽[ vB dE"M <)m6)YwXX<NlF|̥Ed@*Wءvz-!!!uss3ZZZ000rXV:Ϋ;* h4hiia7};'z_؈lٲV;N|'X,r rt:v"tw KkK_R_s"tIa>|AB\I .c d2l{{{;T*:NHNP7@=srr҂lYB'( 4::hKOLLĩS̚ѣvUpʕy)sjyG6&WFѫƻXotmDvv6999,&uIt|]@Ra ycc#100n455dn7q;r 3arrA%BPyWW ZJ9O]ͩb'+v>NVʣkCعs'85550 0^YYԺB W S&###999hhh'|qDEEyP(GDD&&&033`S<***`6M6yyy(//WPif8pl6o`ZY/ł۷#-- hooGll, |A\x˖-ӧaټߊ-%H'(@>`VHH{aa!YSKÇ pQƠj*2Bׅ G?b߹s'^{5uV+{9TTT0B .@L===GSS&''~n7l2( LLL`jj 2\մZ߈PV ĬuRb=S OB_hNt]`>)lٲ%(l%}r#!%΃deXXш]vp`tt GCCñtR<FLL lr ]RGzcdduA.X#)Y_JJEIr)SMxrFhZ,KSwJ㿯*I_ybu= L}Pd}Ϟ=PThooB]PSS#|w)E]Vf媺uW#uCCCG\\j5N'#P(1R\D{<оRީ/*%2%s`O x%)SN=Yx_vkW3?T+4͛7cժUtDZk.`-]:](wEX,0LLSǵ'O⡇BCC>col6+(b \.>}Øĕ+W>j 2+BYN>cE쭭xRF+*'WRT'S:^@׷}v9KM|YRDΒ@o۶ V0_ EEE܄r]ޘfh4F(JtvvḟӉp,[ ׯ_ǵkטBςT'[Qkx~|m`ԽyHS_ݗF*Wg5>w3,~@xJYrʵ5@VkkѿUe>{L1 viܘ@rr2.^W^y---*P(wnd21llF[[ߏÈ\~cccp:p\bEf;uQe&W`y0x_D- 8k} MLz'$$zFr9&|RXlB*P3&W|o@O?Egg'#v.P fsHձL&XeXp8tvvp`jj  Án <<AU>_5gNU<#OZp,,8'G}|ļn*v412N;;1 ցوxGYYh]@(&)hb7LFyy9t:Kakjj» ՊiDDD`rr6 .sN*:})P?E+iR|TS@k"߲2f&Lr]7]PP1 'Bҩzaa!|WUUFuuuhmmR9.Wry(wyew4?^O^7oa IDAT`@__mrX Pd2!??Loll+qbbbX` ΃QQ|`K/+A{F/ũ/&?<9DC/K L'S?{L{\/oѐ|,!==jvxgR7L(//Ȓ)"~\\;C*ok^nG?F#y\.x<,]nn ׯ_&&&0>>.###ظq#^xX,p]~%mo155HOOGkk+w?xOMMbxmOOOzJtww#==}$KOOGee%~a͚5xa4+`xx5ko>T*|M<55O?Çxł2~7Tںu+j5o`6GEG_B/~UkjZj---b LNNbbbSRBCb-*RR4[BU&uWWSR9E2.Uܾ?EO]sR仜EA7 w宗MR.&iQ< >T,j9[JR4*~e}W"u>:^ iPBߗj~fYYY'D~~IP>8srϞ=͛7{=[n{V^INN$''{RSS=͛7{ 722/^xZG{Z-zGKjzi?V|rߟ]/2(wz]Tؼy^yFD]]B&u.|?x p`||)))p166p(J(J<#hnnpn/vw9E(W7WJ͝n>?o𥤃߭O.ޟRRt-h֎^J!46؀@^X~=6 / | D洤M&vڅ۷d2!11}''zJJ Z-r|_B.᤾tޔ*E칹bӭg~s9yrKS<@GG˱/((H/W./޷?_>,Uнc#{VV&&&011{ < zzz/>往φ(J88Ntbll p+WGa|yBq{?9O7}Dk[}}}PTK/P$/R~Gd}+6{o/f|UךpXl}Y #))I}Q@%o i[ZZpynٲӟ+7d9'NN엸t,N8ysrrPZZ^\xno֬Y5kxovE,++Jo/__yt~SSSsOy555R=91b߰aXRR&(;vy!YФP (]jN"a6ݍxLNNp 997nDoo//} p9JnK՟?G*P^u*ŀ`?c|P{S|}{z7onAXXT*E'~{ |`0XuA1RAcc#ZZZpAXVt˗)))Zxen5P[ʥnQ=uN.g^'s/Rc%Z-sYF-| >Xl@A`||SSSt~RA9:;;EΪsi)~Il6( ɓLɫj&&&`0==L}[^%k!6zć'f92zt2V]/Xh4\~. 7%%%B >ۅHq n~F>򽽽NHMMŦMΝCVV/_H}ǎ08}OR@?%f-ʔEy===(**F&qV5$ "c*/_zJ:-Љ@߇_YYYW")) iii޽{CGVbdrΩۚ/ld¦M`ۑF1˸tl6LMMAV_=w>P"4MD dddIIIaap8T*vs/c̗؉*y2yS<鄗R Պ$!//O(49>AΥfvA}}}Zrt}jbrrJP(0::˗4y]襯O!}yNNٳJ%:'}E\4 D6l$<233#|ơ WFyyyhoo dqD.q[Rꡪ0)h'o|M"m۶AP ..:`uF+ڝ^'j=XkY iTh-A,= 2Sz~;V}֭ĪUUt_4KOx:::Ve*Gze-nѣGa0X^ O###| cB jݺu]& <@NVQ*A^^ORߥjZNߎQx|)Q_Bܹl-L@^^p'Ty@N0PoՐn^s:\:q񗐐*d#PmTnncPPt;m:`0 ??8~8&''<?NyW셪o)^XXB$$$I3x2 سgmۆm۶abb)))(**BFFP^^{yt:dggU)x"|>沿Vox:db'.,,dĞ ؓ.\8~%v&]B R)`0@Rnvdff⥗^¾}d#ƊrRA|gB*tvvbjj v* 7n\TPk׮HﹴW(FٗZ{nUrĒ, ܃點+Vʕ+Xbz뭠gB @(wt"0!::X|9z-`sNU TiFƈ\xR'FۍF#F#%t****jm6P(ظq#z-v5 >Smzޫ#偷2~UU QVVƔ-2UzyKOMMeOd),,D]]W;&$$x5VX,DEEa||<~_Dւ8  f: ̜J=P;I;I.5B л144B<C|ڵhnnFIIɜk媸[D(\T)gL?w_QU[ةLp+V@LL \..][Pr'uNd2bGSSzzzGGGa6vZ/b!)P!M`#oYY]WUUqTܟB͛7cÆ jxqFzF֢v{JJ >SرC1 ]o']?D4 n'G}u/ݏzSTwL744ǒ%K^W/8<^ԋ{!|Էt^qQ'-$jRBAVV"## RDt[*s!-- GΝ;qܹ9Ηp`[89??KLqBky7,=Q[[ Nw5E70܅r~˄hpHNNFtt4'dy=QG0UW Ƚ!_NI 11ξʈZ tطoW&5Kd>UפAnR+̍xUȣAiBqARA#''ǫíX)hr'* r7 }](Jl6lܸrrrRӟԯʅ墙InqKrr2j5rrr088Ȋ-緋w܉_׬ ?ABtRw1!EˍxI}yf8LOO#,, W^ҥKjzA]JrXXkGee%/<f<  ~ӟ2&5ÇG=.4?h4g~tKk 6`۶mx衇j*K/CU M.]£>gz;/"3>GQ4WҥΏ/.%v`6`0`]r6EEEXt)޾żNG[[s=ollDCCJ%pI:tR@II*>RrQ xdxr'bү111Z{Ə k4f<8~5Vj TR|n{05.'''ؿ?`ӦMHJJZpr߬Po,/PQYYO>$166]va׮]JBmmT1N.]* DDUUUѣGߜW湹j-EK R-[ ?|PbommK칹^dI@5>dYEQTWDkk+ՀT:N6l@jj*n7T*JJJԄr455!66Yo}[DsssP ,~P܅rS]]( #'':rߏ9R=r(|ޔJ 'WLNv>R{rԎs͚5PHMMYx^[[ӧ#ߵ``r+$ s[iP눈@FFP\\'}DJJ rrr裏x| b>0/cǎ^$n6Ld~ ܝXUN7`0`hhhO>^z {ŋ/JV_Hr9&i̩DFꏎ3L!'_49XߺVFa]q!TTTW>ΔǪUߏGs=77kEeB*@ #Nj.Υrʞd\:(S"==099 ZUVj)j߿n999XukjY?8B+W199>kիqe"%%زe_R`4Ͽ/߻wHMXT zzz'|fQjEEEhkkCOO:j$%%[wN+E,/]'+t_U)?Kg?~J?˵ݳB4&( zV;W}/,,dlwFaa!8Wx!j^y4Crr2N'@T.]Fš166H9s 6mB__ַ/u͚5^ * m0 Ξ={WF||<Μ9={3QVV0lݺϟguRngϞźu Ee[Vc4L ,<CѝY>XYd21\yy9S& ===*a6aZV6"lSkԖrj_y3{nnnhooGbb"|I ;;KoHII Nכ?,*rOyˎܱҚbՈe{1)Rb x0<<x)~333'N 11L;9}}}P(V@jʕ^ǣNzj8qCFFJ%֮]9鑑x?<<&a"| Y74G#_aaasyWNwrDoo/233HT8ipX,aXiz=KgVtPy NW<#%=I߰a2331::A<!}W\˗/{q%5]o,*b9onB"55cccDrr2233 Aii)+ꔒW\ƅ?rxSGdP 3>kun.kt!g7]]iܸt;nXկt>^u|{û ^CٳX~?NKhI]yngr#-}QJI$_}Ulݺ1 =ɃPiFwIlڴ+d2axx+'RK?j/t c$V|}E*ȜT կ~fz!{!??st%I{, 2Ï'sMU'==> ׿@NNrO=sN>lg`/]Y9~m"kZ_֛FXF/">3屇txx8"##{۷mL&:tfuV|WŋaXGLL &''qFtwwڵk:d!+fd-=IIIRC"=fyC2Ohkk*I& QϜ%N)S+r IDATRn Z ͆)$7j*w] QISO|@B,$''ܹsx衇XRss3V+vh^>;t*Hwܽ{V- G}o7f .wc O`OE^ub۶mhmm?? ,, ሊRt<  dghggI,&e__+T*100x477#++ .\@NN[f9r6l@JJ \>؍pLOOqI$&&zqzz:ׯu.&]A^w9{ eB&"0/ru.Ub'Ru._OG6BEEN'p%@VСC$CO=,*XHջ󞔨ju/ZdHܹpؼysP0ͳ>}]%jެ7>r%$Z-L]]A#@W_SO=H[ш {xPZZr444gΜAVVKyf]8vX~=._=t̙3Ctt4V\k׮aHHH`0?116 IIID`x,F]D)/L{ͫ}+OFEj)ZĀ+,,dftr]yˀUo0ľyf6MJJŽ;#f& xᇑ;Ƥx|)@yeo055ފHH]`XjqTTTҥKXv-{xS}xx8""" rJKA¤c_**pORx<%wˑ g[rci^xRV62$ل~XX6l؀6fhb- BSiN<f}Jtz'#-%_ʋ7޶ml6P(-H?30sIV.h4ΩZ(U|>R.7 صZ-^ ǃ|>mJ ;POOS<0uu7MA"##V ??FGGG#,, >z;T;=Ol쭯Ykۆ2 xٙ쳿mznLML{aɒ%IJe˼N133#k_cVFii)j5jkk"f3;ǯNRhllNc9|Y(B{z/NJUZ{U~۶mضmL455 bc牝}!Ori̇NލFWw^Y4QZy'[n(T*i^>/^fի6<* KD%Y>|m?|>1[nŪU8s 1>>I֪'??hgcg- wrW}@|!T K]EGgAlذ]]]?OO+WbŊ@DD$wǃW_}%D&v_J~81qա@ DDDرcHKKCvv6z{{/} p\acfQ.1s[dBii)rrr)u%P}UL&jjjP]]͂T1I=Z Le jQ{Ν;8 v?9` O:n扝*Ki:G?!]Nߊb߼y3t:g6߇lFoolש)B1=lIRڡ.هq0 {###x"x|Gشi^uB@xx8Ewf3܌gʥ`+M'۾gJOLL 6l'puDEEazzn333}1ۢ)0矿cirAvdh4())aJ\j*H})tTΧQɩy_عs'FGGVi&{^+W/K/ŮdS >w>MT\")RJqZ^x^~6m^D~?Oo 77qjš۩us].7?7ֆ<ĠO?4VZazzK,a)pv`ֿSOO]͸`zzx \t EEEGgg'q|Gزe $_mې}all 999؃xX!vRڠRoviv9EN5~9M#h"a0kZ߿W^EQQt:ݜNU'NҥKq]MÓ?.]_P \zzvYF±c0=={^]ZN>-̷$׮]xtb6(Lf[[g-@q55Q :1[n͚5x .`ttSSSaYXd &bh4WSlZenp,UB'H/ZCL>dddJ|P+W2 E/[l=:M+BNK'KbĠ|A M&g~c*'B:S]>q\FQRRcҥ Sas|wH 6/N'f9r===x?٨x~n$<9JU\FY_w]DEE _l6 l6mۆ8f鉊mU?o{uu5Q[[rB@i]yy9:;;ֆ~6,h42NۉԉF#NRVV6֭[:NC{p㬸؋?Ch4l߾}=(++CUU1ӽݽ{7|DPO~wU_طn݊n]ܤf[-Q1(N NI4>_S| G1::}kx뭷wzu/?VEEEiD5FTeeκ2rEG7&:8vΞ= Rg"!!x0>> \.LLLԩSpl|U;$i?>_"SM|rCYY8r帑^P0~[U7/ LlACᣏ>† P(P(K"##[lҥKYC5L}EyAjoY}W_MTU͒fM&Iˍ#ߘwӉ/bժU;;v =}]8xSIVϟݗ8Q Y";;gϞE|| o}Mo0Tg488)"hRy|T: $$&l#  RlQR֧օL,VQXZl, D IBvL=?ιO9̄`Պ~:3gΜs>xZ_܍B>}`fϞ͔)S4K~acʕ,[n<z!6lʕ+YxP cMΙ(..vʐe֮g>XuWi~L&l߾  &cx}v]gbufJ}|x!=ainn&**^zzzx'ח@pYE31љbʝv,^~3[)]4Ǡ6 l6~{1}Y~_R__Ozz:o&\s j9k_[EhgihL]fիIKK#77B˝2QnZZoe˖qvZq] 7x#^B_@x\l6EE_.e-y1xW r^/]TKj2ydL&-BE>E-L0%;^~}XX)މl}q4_[/8 00"<<<qss3EEEV-tEF[g Q=}]"UPPng֭a61c迓̓]4oQ+.VRfS]jѬ~W^IZZ:3gΤ^c BOOV'%зc,9^_Ș?>x{{y-Z1K㳏kozH+w{g w*r$dve-yZ:w}81 JTT,Y MO?ӧp (n-.v!1ul ~ qeqA233<Qn#((H~VX\vi&&MY](Y{xx1gxsLYY>f3qk"iV痫Lya8q&LԩS\wuDRR S#y'/H Ӷ ZAA$&&׿UsNXlL&F#fvڰa#++ ә7oF/???aڄxطo|q?d֬Y_s!++zl~_ahlS_z%oSO=鞑-[r0乕ʕ+ퟟOQQ餤eRRRϧjz{{W\Ivvng-f>C>Ѐ}N_konn^&Xjy,99p_χXĉݮWKlj{͘BBhmmehhl67|3VEa2eKwq5\_ dݺutuuQQQAFFknlܸݻwꫯCJJ &Ǐk /P__&d´޹s'<9rD[G}}}IKKLJ6jjjXxn ]bQ!*2-((:N}???bbbA__>>>6118´v%Y())Y#Y%%%̚5zNn+w<55-̑x!\:voG),x[9y$L03fp)͛Gqq1&L. a2[ ,9ڀ?tW&Hj#66M6ƾ}4i:tFn)))<PWW/?.wuV}9_Ң3OBtt4:u @MM ǏWv9IZv;k֬ѣiĉ]f޽W^yŋ'&&}O8A[[$&&:m`qqqTTThf???.rp8Ɖ'Eo cbb  wy'?4V+55҅bmUz |qtNtl6[nAdd$Ol6388M7Ď;odڴiݻ뮻NǏrK^v˱yws ۢ"vޭYN4ݻwS^^Npp0Nsssn֋jb]vߙ7oz+6m ׯ[Vσ~b첺Xo9BXXgϾXڷnʓO>I{{;qvb |´isϜϥ{'b7P"##iii!""^RRR[^^^Z/ow/:t۷dZëzmM&@)܀F#>>>tvvb2$@McLJ`zzzhooٳ###ud2DOO!!!xboiiph I9s&ٳRNX_~WLTPO6\rL^}`W ҈' R&Mu]d" v|}}ѣ?3yd ܷmx*^9Cy @sUlڴe˖5лH'L@JJ Zͭv)Q SL'--Mcs _^sz0uVe3yq<ժ5!1l!} _?^鮨X2#w2޵Ka2x8`eҥ,*86' HIKK|||~, pי:'p>y$8Lkw͋PaSSFPLO8ABBNd2i̻Ls755a6X aܹtvv2yd~ߎ򓟰yfL&GttOSS}}}ɓ'9qG}8{ mC(l /@[0yj@x=ɓ'9s 8hi IDATiaŊ,_FLµ^ˉ'HLL`0pei: hk~o={0o< Zb>q| k?cccy稨d2 \b_HHH`̛֭7 6heoYRy/ȊBw\[eV*;^hC[z0EGtwwafq}\]xh˖z[]m:fbCz~{fWS#44:;;Φ9sh]˗S\\c=]wݥ)fn۶MZZttth턋áDہř3g.0K{uy; 0 ```>L&ZΞ=KOODGGSUUgy Mw Ǒ./'L 226d2퍿?IGGSLӓC@vv6Ǐ`0o}[\veq7e>v99C_V*R>a dȋMbt?XB7|kVGn" J/狵 ` 7kz. ?߸+E}럧K^ٳxhL]L\<꽗sU  ,]%wƜ}Z7 cǴdK}v:::dɒ%lڴҝ`TGvKnyy `rJ > EEEP\\̲e!((jMh„ x{{內'v+R36oLTT)))|L4ZZZHII @DDL4YfyzuB~tQ^;~ZK8;?OYd ,X@__,cuYYYN sz<-]ݕ^4vvߕb^f,+ ))'xj,DnӧOEx_aug\XC$Tk?\uURWWG@@O>$=&M?1~~~F<==XX`]-uV ػw/jk N$ffVem*EvySF5[$UsSCit}T5>1$|r7?UGaҹ N~Yta 5o;z!Daj9Ɵ Ѩg1 ?~iӦ144{Ғ99E*.~h˛(X<;CbbVk*D 5Påx^~eKVX~ˆ>"[]fgg;w2X˟#k[VԿoX~IsBZ[[ cS05VƮg2t)5EE;FoH)]4YyW[,%_m8p@&MD?1~;Əς 򢦦Nxı|ii)SL&22){=,,?XcAAA1=ʙ3g0444.TT,hAusE3UUpZꕡE8Kq"rB, 6O׺8eIJ -ō20ы"Rq4Pj w@*{fgx~lyy+16f@X(ٸ[!Z}n 9:`(nTI`ڵDDD+B{{Ve ٳgS__OSSr UUU\{rN-/ "%>>~[+2E#S^b_>YGy_dggڪe`peJts׽k+҉cr=''ժyΗ87|NѣG;w o6:;;ꢧ nV_(kMIN;?>-kUUBbc %%a4iӦՅn{+F)N #`lڴݻw: KU, $صrNrj%b.EɨfcMuW5-Uyy#}ץܯz,Ȃ_@%xV]YF=c7(fs=PDVXNbH}Bթok2~x<<<ꫩw%22,\YY'Or>ϛ{\L Yv\ȉ'x~ʂ˲ƗgM0*nyjj`.݋][w}E7k]h `lXj=/p TTTf͚^Qwy/0Yyytyxg4P!z.zKl# 6SSk+]]]QWWnc6O.굋5Gt[~g4wP}*X@}boU=Ru  YY @;oBLbؾ~=[[Z݁v}хMɝ;G C R0MX4`.ME?Bb?EnYYffbn͋s7OZT IM 52da`~>v)s!'SNC||<{/+VfCOOqw_ĸD5k`^کRLF ƍgqvܝùte.3tW]}W]<>ֱ|rMlذAiiy,%% krBx)59ZUBNQ_{TeƇ'Mtt4CCC2c >Xh_=̘1ILjv{ xBСCDFFK]]zYSSCgg'ݼG%Y-Ne2d$,w7(>V+Ъ"bFɺטX`EU!S\@v6wVEP 1 W jؔ $ɞbP(LyJyHv9l}{=/BհhMd}뫰_vM6F\\3RrK㋿2h]1ܳt]N k.-&.X+7+P/~rwBncxݻ+ ڻ+?AH ;?Y݂!K (+ݥkIMMtc6ioogpp~O?6SNXCCC$''k.RYU oV4}n/9*FH"4 B°…l?l#nm8 p #+~Q,ȅ'3 :99#׊_\Lx`Vy+{帾7!(ʍb~+ރd֫UW]EQQ^{- jEi7H(Ȁ'JW K_x%IHHॗ^bʕ{.PM}ҥf'U]5ya,(sR[[KFFWYYYؙmHMhOQNm9]?1~>|0SKeY;wj-64ϘAOO$$$Kyy9DFFa4j===),,$!!ݻwȉ'XlF.{뭷t/n׺DhW:`lL#FSt.Az}`U!U vMgUQd/8g9ƮBmD<2MZιg 444QQQPZZɓ 5AidE1w/kx+0W\ɦMXd 3gΤxMK^nzi|y.w&>>}-Sқ ܮ8//OŰZdggAɈ+ xǕݴVW'\&#qU}[,ddd[OMo< o67NʟJʞS#6+ RS񃃴Ggg'ǎ* a֬YkC+PPP@||U cNybzP!VYYkv Vrm6E0\~ijvjłhȑ#AAAO\\ ٩l_t_e8֭[TMn;%@jsssYz5&L`۶m,^-c?0w.٣1v_(;Dm",,ۉhmUjG'3}Tw?b޼ys{;`+v⭅=rʜ\6E ۛptCCC扉s)<<<ؿ?iii466jn?𘯷}dYcغZwl6c6Ѫܱy=Kk4Gb{3rO969z>Z>ПhTƗD>@:_ņAVTnϏSYYW_fc̙ Ãa߁pY_b/gY呗ǒ%K2e Wq }#99fϞ{zz:۶ms "qvuˌ^[rc9o.'O`ѢE_i`c =l]`1KkbX0 [OOOعs'Wt Tbص ffR`.lZXm62,_,YY pBj* @ٳvwՅCkk+gΜ^{{/466I~?L^^ޘbBjj*RHGV]B(%Cd>jXEa@0~xz{{'""f'%%.^}1_Saʊs4FFr=(Il ~ees |9k^<ؐ^V&QF]n),X%U\u FdM}% ✬VgYhdĉlذ~G}Iɤ%u+?kL]w~,%`ꁺ`셅۷[jꫯb0vc \Xv:'''G[☙y'yg/aq8z$*иL|u<ٻw/iiio}:rss9;gGQbM[(6RW,b:/OuTI@&`V8ZZZ̙3 SXX?O^|badeeiakb6EhGTs,R`j| C r`"7!3s$t~@1-r , `޿kClqu؋Zn~0cecnB<sG-ߪ t "ju ׮uv;vp1%..3g0}t>̉'hnnfppnTN2B.E;ܹsyٱcS,+vgڭ :swoKMMؾlv\}WhI\Ҵw/iˣն#rR\\UW]oi⭷ޢ0Acꂁg3HIU4E7U^Ȑ/cF^j *jA[w/VS >O;sgnfFȧ$d/Bf@vpVsWî1v׭ 3^^UN6``ѢEZmOOZdbڴijB6W!T_ԅ_QQV.==v3H_ww\y1{t?]ss޽tvv2~xNe;7jW__3f`%SN^㭷ޢDvLlRA:fcz@ *Z,mh Mvȹck1ן#$ì, ZkX,N9#zCt Jsrr*SWyks) rL]e*>GfywR@P-%W,Z[_PUheBx"2|!ٱ,vl9^f&w)k}GGNΈ"cq1L4JBCCINN& Vf͚E\\7nd2JTocd`/^pONN&''7rsqI'S6:]96غ;.ekl]SWW$dr o{XX؋g;7~Pq1W]{{SQQy?s w!حVe/1\ժEꀳ(mHGs A$}WAynG !%qk>Mo(J_w^d9>,cwv2/ l3 ewXǭV2,SSY>>e/:._FF+أ=,mƍddd?;v8MHre,wUfb[lfQ\\oBKzzz.Z`׀~d[}]`Efd6naZ?{ZZZhmmAHH\q,R]eM"nZIFiqwV @Nf&X>IZHĩƂCsd͜sJ1.\RwUi  k'g}u5ө]M- j7 =fe[*FBf(ZD]~sPG g,{+8_@ Cҥ5pU ѫ"}„ cX|VZŞ={Ph`$~uR- չyn& ),,tc[;.i׫Թc yۅ˩c ŪU ,,#c]fsz*YfsBTM@*P}qۛՔhhhחH,+m"#U:B=8m@}R4\3R.σ^Q@L IDAT$9}C}Hh+:Sds>M ?v[.#}URr4џbHHHJ20ItfKkT餄UkiB`bmS l օUƼ.ƍlݺ+O>ŋSWWGoo/ǎ'? ۶m;`ݍRe%`Ve파 rssyGxGv9Hf:t}{ffSvwuw jBkǏOvv6GGb4.2@-t1O E5XwArv`cOO1477@UU!!!:uUVj*ƏsM#ˋlhq 'DٳUPr,֊i#>w@nЁzC@f)..fΝN r?7OQAOT$zYqlQUn7Z]@^@խl&'3\@5Vg,QaYiN5f$ No|R 7-V?Cc PN`.ϗ!X\s-ٔ^@OMy}[@CC'O.xxxAPPV=ᠧGӕw՝b&0;^;SV+6ǺLjl]f\:&NȚ5kȁ.'mojjϏ}D`c#y[uhC$퇺%&Sy{sh$((OOOF#&L`ܸqju":::c*,xW},RܳOEwT{ˌ\0Q"KQr(/bOq1ol4~ {l6,~5/FzkolTg'Ofpp___Ù;w.eeeh:CIHH^ppU~>fcmgn կ馛ҥKٴiUx믿^shL?窫R<<<>}:ǎW_eҥTVVj5큁øqlfhh 1Q2Kzw`"y; 77;3'Od[ˎ?fh .ԄCCeKI.|EEV>NHQIj oZW--*@]]H)*>>$$$ٳ3ge׿u裏_| Μ9C #I ֨( rv0ZҤk#D1w٬{KK5=M7xO>Dk̙3iiin?oˋJ|}}ٱcs=_2~;PYYǎcԩxyyeٱc| }kzGA$]bboYnyW2vŐ^;!`#˥2wh.:w|RRYYYlڴv3^r% J>O?Z`tno)3buQCĴC N]qg;;  />bf1|dLTȈxI{51G"j؝*%sJ+Y}NVf7%#!bC2vc41 DEEpF#v;iс` ''Z=_Α#Ghkka6m䓞Tƚػ'|Byy9UUUZxqʕl޼ol޼{o jkk0a6LtwwMgg'@?HUUf޽{3gcڴiF<<<ӎyg_p;5|__?OyOk=2!W[9qI οk㥦:%]HҜXWX;s]{NN%%%f1@,;^zMܶ"s%ѪHu65@ pˋ` >>> \I@pWCƖ.n6> v]PC*+d 7MY$i-\ܪU~A0nvifozT2V<.^   44 pBz-ZZZ0L966cǎiJ3gç#!}_wi˅nzf͚<@hh(턇S^^NRR555ߏhdĉrSWWGZZ#GB\\ xxxP[[ewww̤Ihhh`deeOJhh(wu'Og?&by7 {n'\CCY|9ٵk9]_쎵Ukf uWݷ2xyپ}؇Yd aaaPZM,jUF,Xl#RBL}Oԍ.E,&8#$P K!Y܁Ns]X'V+]qNE{^^&ˤggff~z:? p[`竩PeZg3q_Vc111`8>}:۶m ^^^DEEߏ`ԩS9~8rJ{9 ^N0x#JJJ0LMEE<k׮9siӦ1|ٳg9u111L6Mj߄<<<&<<Nmm-W^y%>>>r BBBQL…2WSAb$PKTCTmx݈dxxɄ`ܸqGoo/L[[\oo/$$$PYYIDDfY|9>}T}]}*++ill$==[?]]H^B2zt]VխP:;;iooghh8q"mmmtuu1yd Z;Fss3ӦMӧc03fghooӧ燯/۷ɓ's]wc0###s4>?D bʕˬX 682qwcWӗм<'~?OQQѨ9#:::uo15EI}98oVgTne-閏iRSjeןNXyF%D$ O9]-/j+V+sn%Qn?~###d2i=g͚ũS 88&8y$hc6iiil6sItwwۋhԶDGGc47#^w`~>Ʈؕօ+!88 BBBp8Itt4p l۶orhjj`00}tJKKi߽_>>>,^~ -Kv_w9.ϭ[˲e((P&8/~ OSNCFF[l!%%i+7nHLL~|o///fjeժU 9շ_bBlhh(qA^|E^|Eh`,c+W$&&_[HڵzzHOO'??_GoP[6,_RR~]7x*y}=1nK lmh 0o3W䗩@Tc*J>X\'2w\¨fڵN =??jC# j֬YCVV%%%B)5uv]1='22ƍ$FEajhְs-h MMMK\<-qJ}]vQTTDIIg)aa׬!l`K/)Vu**`z**hnh C7 A=IIl,~=""~%?00@\\G?PƏOkk+Zgĉq5o}믿t|}}1LȎ;8rǏ LJ3gb28{,L#iޱO*OaD\t-;+B%LV+X8dgg;%(Qw咗,^?Ы&'t,bafsR'cڵKmC^^FqӠ%.OєlhX8Yl}sU`YgebLAHHk1>x'Ϗ^, ˗/'? >(>(k׮cŊ,YS)..fÆ OÔRSS'|Bii)1~!ٳgPmA/u"N߯]P(ޫ*h$00___|}} #!![nDF#555|駴c0h4@tt4ABB^^^x{{s<==ӓ Ã/1)xj#swӟ~W+g5baJXXE 2Rs5o /|-cz.(zT| B} 2[&9+3F֖*xu,{a\jeqYdAX>2 33(Ź+펵ˏpNh*qeg*>:Iؗ6,JqC{k*m^k^_Zmbck+WbaP H$D2=L~y0o,:>^D^{67n@%3' 99"E1@j%?;[;UsSG$Eo?o87Z~A_@],?DbV:=",rĪ%yA͕ϟ!:DGG 6PBBB8}4W\qqqqL:f͚EXXv!V#Hy<>%Baaa+((H U bEDVz^u1oee>|ƎKWWAAAttt0m4 a„ 9gyrUhd㼀W_}5իWsWocW?v%s$׮:Pmu\{lڴI*}G~~>c$$$qF tH40 MU^I!wU[4/0@biଗ=нlf>/xs/x}X:#Gѭ[6mr) ^{-Geʔ)\}DFF(U*U 8* 3EA~\.q:ŪUxG_^"1WUUX g:Ny"##=z4& &Edd$'$$p .@[uPeG>ܿ! od^n&Ŏ HKK U_KJJu0b:"}'| XF{18v---9r?F"mW$EˣK(*xY@"ox \z_*v gСCx7).l޲n &!! &44 uk\+w4MH EϺC}B:22`~{h;~8ַdqM;w7 y M؅d?mƌ3h]SB/pлx^H3\#77`zq_@SZZvEll,3gd۶mHS /7U?KawUS\Z73+J H q #:EVޗ=i@oYK@Tn>ZUzZ)Jzb1`C&Nkk+ p 477K/o(+App<~xԮb{|rrUUU:u (ɢ<55KQѮv1*9wqȐ!* 'm/'G$hllhCT׉k>`/֭[G]][n~ zWtIIɀmUK5.BEV+V|=??|m뉍e֭XV1c~^7Fo"]|Uvlv{o?v^wAA wii>[v64"'k-^R,.Z.]642'Ǜ۩Ze1^V<ͩUת*"""{xIJJѧ*_N:hool6xH W .LÇ fĉIOaÆƾ}HNN $H!c> "~2j~n͙8q,^UW]EKK qqqCd㢱v,_\.rٿ?OVZ@1y[_E!`z?m!bhXkc`466zC{Egg'}Fbԩ]6>z_}&8N8~)EHT+[@O%.Tn~nn.[K#"~Pi׈_ɐ-ReeTh R{HQ# %%hۍ"26ǃO?v3b=*ݿ*ރ *8ػ0}#$_UFTVVEUU7eRS#%cn72 .Zx|2yQl(}"C;_P8Ow쀌 , p!n*$J-DhhOu 2W԰~zV+կ(,,dƌ0v/WM@ԅΖdVZc=Ov r۷;wuV`0pM7vڀ..כKԋwO]O&_ɩ9`o*ud:fWk]YhzR\sr 'YޛZ!X 9sViϹk.Ǝǩ~U\N<7c Ҥ9m}ؚͽ 6M8777|'Ot:7naaa@jf0E4`^YY)WTTPWW˹d͚5,ZP|߸q_/7W& %%%2w.`MTËq.GUVS c9rQFQ__ORR?0 K2_̩HY#xb ? U$lIjsm\駥 /Иvb:ɚ!4y EM2AbggS̙P̟?zFOO,/G0ޛB8s3U}]}fNݿ˗/V7q\FTT_sWlqP3vRQ%"\ϼȷ ap _(\Vo٨d̟?)S;}] \1z=Ыb!##C`".f((( ##ç=g+V/ wɟgjjj={6}v,] Aqq]>!(f2tg*S凮2!UXn$w `U*f{B:JzX ^&yLv*%O). M^mq=,,~?xBWW'N񐘘ȉ'+())Q=O> %%^@y@[Rzt) Z[[#11Q;Ї_*KII+)) ÁhMRVַ]WQv{x7 )N'd2Ԅl51?*s:`ׄvZL&q D}N/_yuN}NH-@:קduuu2sN:;;eOh$**V6o|ȟHcc.L{WsmVڅVTѷ'EVz*( w4۲YA]w~>O.P}ȳ۩I"99СCq:\}դp rqm+dʧ>ϻjs #9-C= 77y ~G~~>~1y„ l6׿rIl-p*)œIД c6mĕW^IYYW^w>( O</ `0H]y_*A a$WTTǫʘ1c8}4wq/[\\Cֳ%;˓-iii0L+W=l6EEE1j(;{Ν;`0H͛7v~=''GJ{uo@BP HE] \u+.⾌>#!~nebk>Ck]2>oK\BF}_$Ώ4 fB4着*n7qqq={*\.Wܻ>'`p`0j%\F_SAAAkaaaFssW{zz|~ϟ9&X p*S7Bk_NSS>}H}}=Æ F2w1/"q; :ׯ+++yWYd dff/ݱcGU큶YYY0v=V7BAzz Ixj^Ws/娫c<Ô˨Q͛-]jnn.2!]ՅZh+#szA;vx/;vxb^JxD(RNֿ.ЦoO-n^;5.Ggճ>srX mln7uuu4773|^xYHj#v>Э}.\pݘfeXd2#(_5pЄ(|Dѣ~ŝ7n=?c.---=z;ǪV ,Q#g?$==u1j(}?I=cVeCk \vAvv(f ]*,X\6mٳg%Fjjj`. BɎuU&-vu_aR}X|TXT-˴X{_Fyq18BBBhjj򪿕N5 'O2|pj,N=>E>/WG302r!~---ǻ}5s=s' 3f r V(N']w/|}qq9P[mUO\Mש}Dj8|}}F\ !yϋZ U~)Q/U_$wMoWU|sTX'JZ\˟4vB2O.XZ/g~[Ջ]zzz:iiiJJJ0͔aZ}[eY\y,駟ؼy3۷ojq[e`}.Jjz"}h?F]]>";7W1pUZinYY\x~> dZ,l\W쇾ZUSsnyV@|UѸnN>l̙3x<9ᠩIx ^QQlp0wVyPVƛo)H_R'NHZ9 ӡ~+nommc6ꪫx׽ wߕn[dcY\OY¿[fnak999|}q.(**b׮]477SSSCDD̡\lbա;T^oWێϗlsWڱPaR´FѾ%Pݫ䦜۲?>sX ud IDATlo`v`ĉr-q8~y7x<ۼGJՊ/a߿ >S˙={6GkcŊJغn:ĿۿaX(y@MMsF</v$%%$kƍGgg''N'2m4 tb/څ9̒%K蠶VW{qq1ʡWLܺ0z`@qZ+**$K_d ׯ3SNF&o~N`l]!f9b\ HOO@;.G.fz9}U]e<*M4n'bk.r)Zx5%' B]CWݵ0>%%Iʠ ]xb?igd ,&Yn7---n>sZ"""CsOO'NTqjX2wuaZ"##eÏWٶm&M"22{ 8R! ?-{L<_LLL 'O} R.555 6M@#nz 2ч/A)SP^^kŋ}X@|ؿ9 vɜjbK/tAF:DrYN88oTWWx(..汏>i`KeJij3gƳ>K[[ӧOEInxҜ{PP. FAA=/;;{&4u!":q.]ʼE`466bܸq0m47ox<^QQ)Si}UL>^ZZʺu8}4s̡]v{ o;\ 9jƍeY ]_pv.6Ex߶mO?46msRSSݻ9t~!v&رc+oEDD?b&^T>JWZEm[ۥhUyAj2bW,v</\8xC,hDV~ퟪ5(ҡƷlm%>>:n7n'|g}FOO]]]y0rH  ׵p[9 !y>ѣGS__OTT_i]#;.,X@OX<?ovw[nr"SVxa!I=& Fgg'}۶mNDDF)1,eҤIuVI,^-lC͵l6~arss?~<ǎʘD|>ʽ]|'5W2uq_]ϸq0ydΞ=+nORRK.܋/Ȉ#/ ?lk"L~!JymS[[K]]&33=X… 1a2hkk#66e˖I@B:G ^?555q1Y'ݫ? @ 1_f|y Ej F刜zNǀ c7uT8z('N$88NTTǏgtvvrwe+qj2cΜ9nsݺu|ttt`4IHH`ܸqxu/\X8[l!998 ߁0(egĉ&$SRR8r]]]넄*%YYY|\iq xb0wޏ?&""-[hٳgS]]ͬY8u?8#GJ{OO`ժU}qKu5Qi;}] g Khl,LD'$0f8;}{DD===}vƎɓ}/88X Z_on/6| GQQTaϧ ---,_]v{qq1!٪>O6xU@kQnn.;wİaÈk:!K~_zm~uas~ѷ1#۸ܭpcS{u! ]k99hy)s̙DGG3aˉJJss3|9R~h ֠*ƌ@rr2v yyZZZxGx7Yl̜9J?~8 c*@#nz=w/)!K{;O@MM ƍ"##3f ;wd޼yXAJJ D#ނ>-;c܌d̙3ҳ`0t:P˥,af3f£X{/۔,2fV.QZW|`*z 9r0XfPdfH}3fsZ͛dž 5kq8|yyfod_. Į]Xh> $1cj>.Y,F/o_Ꮹ7j,~ ]NTOK/|z+Q45 6f &O>$~)"88rf̘ݻill$""8>Lhh(#GDFF3"((PS \., aaa{ʙjvvr/.^6p g棏>bʔ)tvv2e~&}E<O<>HUUxU{Uޟmn򱱱`0HHHYfqa?u>L4 ~i\?<oMǁ@f25kdt@JN6k^|"^eeԀ~%ۧ[o%,,۷pBy^O. sQ5s Y{JJ >#GB{{; :zۉM&& >p%d2\x`1ak4iooh4b2H`UWܕӏzcgݻw3bFnn.C =,[ 6j*Yfꙻ{e|dd$vvĉTVV2n8Y-T.s[áCXt)k׮%''GGƱipOuu|ƨJHHL|Şo̹e}ʕ⋼$%%w^֬YömۈgWA|rK+/>]>J_uHedd䜫|z7CF^j^͵o\ 1[̓E";୞aWU[e/YS&5SNd>#f3b0$#$$$fFq-})29a(줧H<$&&se)Un羔9wDB{{;sV6ֈƗ?J ii^eDw%^DɴAEg[[",,'϶m۸륌g}FjjlS>cW0mF]]$$$0aN:Ӧw|_^Xo a .UjoZݮW:wihz*mv;5*%"{c8#rɿN㥋Vww7&MӧOĔ)S`0СCUMMM(<M$(>@]M&plfڴi>|ƌCDD7`0Kpp0x,X7w+[/lˆ#hll$--re/^/jdB_~ҤI<׿ӦpK \H_|/=cW+ge#8DQiiic&GaaÓ />dVAş|ʜ{VV>.pZOEoF7lB!pJANj.= $kl. _QxgZ *?ĉtuuΩS9r$F. u]u]ٳIMMkaѢEYG}m6 )..??~СC7o#55FESSηhq,pNNVGPߋfTS_V j.^ͱ V\L̩SaM \.gΜad2ľ}!&&I{{;]\A8.@N(ѣG1̚5N$E]O.[W111`0믳pr2Z,q#u®R]Nj$G=.9rjkk=z4|#G__/)klȿys>/뮻1c6Cb2x'j~.@}r^vТb~.tU__?W??yOb>U>#0 PezZ=n'Xin'xAcv;ǀ9[[zJHr0ܹ4h#F+O>N<ȑ#IJJzf̘AHH1qD9{ іinnP$=z|:%@N4 ٌ!>>6=WݾZMz'ܷGZFfeaLE9s .KF{1BBBϘ:u*{/?<-yꦛ鏹oAg.MFEEK.ٌ;d֬Yҳ\P#jK.={jj_4^-ld{]\ "j()&֗RYYIRR;wdDDDPYYIDD \wun{2o˓mE6Yf^իW@2M_D\UjpUIM [XX؋e2rrr(,,QS^ϰUF,lqKJJΖg[ w=Z'r1&Ws@gd`3YhgS y-':ۙ >^-fk9|LXh&'Or &{nJn?ݻwc0X,3f/^} 7@NNw}=6"@tQY>EtٹpϥL^}(w#l_Q1wvh,`۾orq&}^?h[('{wO+[hW^wW\;CDDbڴi9Ӊ`00zh5j3g.cp8 KPPǏ^ȟ*Ç'66&bcr/ .dϞ= :aÆo>, #F 11'N07mGG _ ^,1gϖbp=,,!CK|| 퇹j.^?J-+4W}B ^mx4`.s99,f_\ׯ'$$2dNѣa4ٹs'---]gyysNq򗿰eΜ9Ù3g?>cݺu[۷}v֭[ǦMӟ#ߪۋEBI \IlS=== : D{WGG---: j)1 v.RSSihh`ܹrab1u]`ȑL8Vx;WvR,}]&O?jjj줮KMUUO+$= Į] -A<@wU_E Ësyϋjvϫ>P?]x Z̅z_E}S^92vG7pd(0x Z`~x۽J5158[Z ɓ's10 :|;TVVR[[Kxx8{/ǏkH F^Dn>**J2~!~zN<ҥK f֭xM44yw aYpݴɓٳg ,G?F5kpWC[nSq,E{6\s 7ofռ,seȐ!<# ;M\(Uz[Wǿ dddB{UVvNCmmm_YTTN0Jե,++KlŊQXXHYYYb`Z*u$b>*;2x~T:bH_cWfggK6/^~bϼ᭮NҘ >h9 htWj6{ۊkab^٤lhh(466 ȑ#s=rJIKKCz{<i_tIbb"ݲg;,,6j9q=;;/+{.ݿJN:drIvN8̙3IJJ"226"""|ڻ~!LGf&L@VVg+)SzsjTͿχfd~ ӧŒ3㏉of~믿WyM)/U~w^x'{シz̝;0bbb>йb[nZ-[sM7KiI #{ '32i9q.cĉ{\s59r}{4440g\.5N- ܿF zj&N(WHHHvj|@^` Pv8=R0l`|O `L^*jո.}yRcWm+LZf222$ `O_?S_WQ˻+;_.| {(>NE]LB}}=aaa̘1Cs9sqqUWɓILL$88vBBBӕ! Fz'9r$EEElܶɓ9w{ֻ %8%gC`6Okx/cwYp!MMM@ss3/IO^=?'7U͟z>7.rqQ?PF骕?kՁo=Bx,^dqhk`^-1xjN-ޅR~`j4@V+,ٔGlذ}1~xܣ[oV"##뉎(BBBߥ|CEױcǨH|5""Ꮹ / <~5T%w?>\{'?/W^xMvɅ`AAAL>kr7s??}H&MkâMf T0ނ5`ln%6 V&vm1l#iɯjhL%ѤT1kԠ"JC@P08܌伞gp9ߙy|׿&Mģ>ʯk~䄇tusIHH`$''AggMSSUak1䅋\$|:ﯿ766J,Ȑ҈Sґj{5r ,s>[V&:˗+J' /r/jW 0ir]5s}ǴiD= o# 1cpUiiiaJRR<:6Eeǫ[!ՕHt:gΜ!ut+Yޯ g\OL}/*%/ ___\3L0Z.]${졳͛736kF|Wzzz 44*z=tuuIāo5 u~~~9s/ryѣGc󩩩^''';| '\ZwX_s9sؾ}O>aѢE͛;w.NNN={vz{{r-b$''={,Y /۷o`9s!Zרc!ȃUS:{XB2{ƞD}b7ӽk[fdffʭq1ߝ>}ո[_͵$J֮ !G={ooOF Lssl*:fY6:[%l)**bo~ç{^'}Y/p3fH """x9pIII,X ךǤ\b];˭Om}!:'OOj*^y>ck1j(۷kK/ʘ1cdxٻw/L:G2}t9իWiooGyVZ?G%p lfl6+casdsssYbu eZ8^vj?1̜9Jp'On%@+:Cx8q*33y|X~2{6/^oEOʉ#7*#|)Z~;>-/Ir2?4Wv?8?>k֬2-Zϟ磏>ёqơhnnKvnݹb &KQ>Ύ'~FNf&-Û61ӓ./`h(CBī7]c#W~\qyboޓ'iիNW{ǏOQQ-s I'O[o_8?~sț/8=o'Ǐ7ˣޞ}N̜9llldXP:;;e̷Ϫ˝PSSseꨭe9sF$''̄ 7n7of{{ߴ7mO[ҦӱIZs}kK|;mh~.?=q{{G%..:FIAA/_ŋqNr&MıcHNN&;;[֏7 8::퍇6ln9~-kɀơa\?^tĮî3m&XQ~ܻeܲ]p!twwlϏjRSSy(,,$$$2fN<)x{{1[}cǎQTTĞ={z*QRR³>KCC'NՕSYY)<<<$c{B$ptwwsq:::dMᚂ;v,ٴFGGӧOri/zDUUUŸq8z(طok׮Օx5k?d…ڊrXRRC}YOOOYYO;9]1w駟gar{= a…ٳ1ԐG58 .\HooQ)..رc0c >cpuue`,XGGGܵ7{~_Ja2xxWٰa8q}@CCx ::Z.L&)f|ᇘL&RSS),,uApp~̙7aȑ=^<7nC ƍٵk?'NGoAUU֭c֭<:tCc6m{\MGG<߿UV{|eee$%%7nHRR7ndժU]{)Cdd$&I fΜIpp0eee}&"7nNjט6m|Cu'''f3s裏ݍt:z嫂3,Xh^xvMss3|ĉ/{=Ο?ϕ+Wc՘f DRRL&Lk}[ԟjۆt::::x";vO__r BBBpwwO&??*kjjسg]]]ݻXo#Gd2_) >1b===a0xz*3'}Gkk+uuu۷q1m4BBB(++>L>jkkq1i$ߏ%%%t: 9~8cƌ7ࡇ";;~xzzJרjvv?q'NdL2`(**bʕw^>Lkk+AAA$''S]]MPP7of߾}8;;SYYIOO&Mbʔ)pa}8}4ݻ.CLL yyy{y y뭷gLJgR]]ͨQ8vO>$TWWS__OBBz;;;L&#Ge㮜\?x ,Y$222زepQO?0>P|}8_l?\7]%MEr߷pb2 ^CoÚ>ru[l2>8YcN=&&Ff<==1ɪz~Nc.]-[#GԩS777=z4RPPlf?#ƍӧ/7nUUU:u All,NbԨQxbggg8qZ tpmmmg?7779^OwwweMѣG'z9ʨ!((GJQvtt?477cggG||<&Ld2iӦpBv5k(//gۄ ;v젭v)//LJSNرcILL$66wyRlmmޞ .]oͫʿo|r~_uVx dvIRRXpp7`ҤI\pAq=w FŌ3%??0 4777hkk+ *o6 3fJ s Zee;DPPuuuٳg'22RVX_:t)1-ZDVVQZZJFF۶mۛrZZZ5jTx!얱c˭`D2[RLE\ز1S|U, E|_U+"2q[]ľKkϩ-vc=NOrKRYY#@e>m?|6mt~!ӦM֖e˖N㣏>>|ŋs … lܸСC=hnn&66VlAqMFYY>tIII`4 3mr]kk+yyyRPPC233yioogܹ'|rN???***ꢫz.BCC),,dܹzN:/^ݝ^1455Ԅ;f.]laSHJkk+Eyy9SNI8qz{{dҥ9s& .`oo/'TI$''f<(8322hhh`Νtuu|rlr]·Gus{g͚%;YvHՇڵv}?~ZTٳ\z׮!III}\lOfzJƐ{zzz?s .\ dr[ww!>}:?j>3jjj1c%%%2WXX cǎܹsR0LrbOPUUرc?N3ښ{իW1ͼ w'?&881b555 6ŋR)// ooorssޞJ1b(K@@/xG;_ IDATxx饗'22ӧcoo֭[2e s#FSOqa9q/^GN0t:L|cǎۋh ///rss7n;wۋ'mmmfduEш`˗//TUU1zh(,,,^lmm򢥥zqwwg̙\rhiia„ 444鈎[b$==דĉc֭^'2c vލ+R0L򃭍Zj}8fͺ.FIzzu#W]X{ZZVb֬YtwwuVo!?X]dN-[ظq#}bK1[\ڵUVs/.TO.]L vEYYY܃`/_.; 5tR|}} & e˖'E=,,LjѣGFOOԪJTT> 8::GhhLrpp&ijjb̘19s#""0Z[[9r\¬!""'|I&ȨQq>)b/t;99<3;vuϜ9êUݝN._,`}}=W\jΜ9CUUnnnL2X\]]={69ggg._Lss3L0Ammm9p&M$&&Mvv6cggnj3eƌxxxOgg'&LOeee:tooo8p舃3f̠Xjjjz*ϟgٳH-E"ݝ8 97|SN GɅ 1bG__%%%LSS>,...~+D~HH%%%rpݻ޽{9u OKK ӦM[[[\]]9wtWWWGkk+2ɮ[D9a ua׮]$&&BDDFbb"6m̙3Z5oK'kԵ1x˘e8mYfYf7_6XwX[ ֧~0ԩS)**h420L&.\@pp0w}HQ? gϞO>nZZZB4k,eԨQ`4IJJ"//b eN`DFF憭fccӧˬ3gNQQ===/Cf/_ &8b{{{ҥKqyjjj󣦦.]ĕ+W֖j9w``\xF|}}dΜ9|<#tR쨯wybƏOWWz^V///ƍGXXfp9|Ahw1rL+//g֬Y{F&~0f0Ll߾sc)..ի?l;;;eOqss#$$qƱo>z=LCC444`ccCcc#quuӓgŔ)S/8q"ӦMAf۷P"##$*qK],gggDzCC,dv@kƆoR۶|bZni.[[}E;S;d߸ho,+&>EhA8̙#%7H@@@H1ܹѣGKww7݄ڊ W\ΎW_}peFndd$ܹ ͛ӧeG0صk>>>r SRQQ^'66g2a 8q"_~%<QQQ()q e={n}zzz1b#G󔕕MOO~~~ر^O}}=b)&E```1liiƆ#FXxzzb0(,,$((n?L~~>/5kVz*666ŭX~.--ԩSrZ...%9BXXFX:Yz56l`ƌ>}ڵ'2fxᇯ-Zɖݤ?:qk@3QVV/;wZˣGJwo6///YG^ի :cggǁ &&/boo˗'jjjVގJ܇@FFW ''O 5++"z-O2EodP@1{czuIp[*eZrV9wkcMVqsuDJ{ط-3g͑#G0aLYf`bbb@*++ܹs;w777).",88___FNc޼y]ڇ3v[ebӦMK^^G󫲥W\)Ixw^/'s|ӧOz=UUUL4I7oϟgŤzjY]?ĕ+Wpuu' ?QFQ]]ɓ:u*[n%((?K.acc#? G%,,O?SRRٳ9x od5}ݺuVϫ2ȍ8''z{{پ} aimmYN}||hii_Vf͚ߏ,#innuݹzLΎӧ鈊, ܪqW򃐕Gؓs7Lձm6|||HIIg[ pvl{Kg뉉%Y1q g/^'g'gG].݇֗.]JKK Fȑ#Gl}YW%h%L&lhkkKxxH֮]Kii)/_&** .›o)$EKRTT`O>֖899ngg'V݄cHII?'l___թ˗/k.MƑ#G3f .]bǎCġCxX~=>('NÄ@WWlc4e8f߾}2rq\\\8uW\ ~ߓȶm0899;C[[G``L;wg9ײNhhۤUc6iooOoo/߉ɓL4O>&<<< СC8;;|o >Ǐx.]?.]O[[[:u*8::)u]m[9ʹs%דC^^۷oe˖m۶>{ͨ{>{^_rဵq[sցÍ, V\Iuu5 p܈K{#|h\Bqq1!!!Kٳg(2f<@@@HOOr''')mb?صsNf͚EOO~)>t~c6ef1c83 .P]]͂ dn &0b˖-<+L8yIq4i^׿ˮ.9m}rY=ʲeÃ6Ξ= 'OL->/?yy'tN$鐧Ћ5߁ptt쳧ggg:;;1|nj=cǎdFYd %%%}kkkYlNNNgpSLYzuuuaccCaalDwwԆ@n`2x*++ihh vu >eք-kk7k,bbbns}{mk׉.k…tpkˋb%BC/Xr%͸Y~Mڸβٳg嶞Xqww'66k&#&&Ξ=c='O ;;;I^Zklq ~X͛ 3GGG8@ii)zDXXz'''yfMutteK {nܹs lmmtt:\]]qpp]t:W^N<;...8::sGɤ1GGGprrGBƁ-ѝny,ZB?\LL&]]]r,llld ZQYqɒ%DGG3ɓ';v,< 3|?>< O>Ca06mPt:yzzz7nvvvgYݎvQT@-b+ջ˖-[`8vʌ dUyJuڇ?`-֭[d3{l(..ۛ5kܒuZ/t:ٶS_0vX\ =l޼Y^ܹDu'&w{"Z҅۵"u,҉[d7B*0Ϙ17믳vZlyn;;;#t:N.nqe~#1u;cǎN'..nH w_:.={c+k^p7ńHpTc@X:lm'6mqx-1V?_x駇<~!jA8f%M8~zͻ|܇sa$mԆxρkťV/`}oǸ+RسL&F#999?~ d!rUڥg{ڵ wݫ93sOOO'33^/Exkn}0Q'$$Pݻ︰ˮa:۴?\}2$CuZֺ<풭|>b-ݣ,w}) hϕ8F1ڭm{|vXKt}v^X/KP[ܮqWνnYd2QZZڵkijjbܹ>Fo2ߍsڕ@ȌeK[ּ.}ԩ_kqcѹpXw":GZy3si{󙕕u|W0ʹkɑns---e۶m(Ν; n9^,ׯX.K7׸e_kc9-k[:XΝ;ǘ1cnh,-ϥޭ糮k~;9>C,ܩqW±4~7ޜ8@ɇڵkqh헮^;v,Lt tcb ˭>{|~~7mܕs8vY7oʕ+QYYk=2ۭ̎,=׷,)}㵱vjpiiiRE^^^8880qD|I1dggnNno"wz2|~=~7mܿ]Ŵgdd}v#FpiYfNgk-zﹹ7Onkk;TWWc4$9B8wŝqf]uk^Gd A̴O{yy` &&x_V®PR r׹'H755qqy~3\PP\CӁ t:̞=jv~W(s oڇ)##BFESS%%%RkNF/.DZm_C̔&O|퍯/L4H ^ o-"I-fddג8y$}ʝK}8p]@ݿxd!`|}}k3f //VU.--M B9wB9 Urrra˖-DGGS__Oww7 +]{\ff&y9s˗K؅KGՕ{ >>>n@g͡k_ˮlXFfΜɺud&~~~mmmc)P(ʹ~UĒ͛蠡3fPXXg}v׺v;J=]DUGGGBCC cԩJ  IDAT RSSY~rKM&lLR^^NUUIab,EZzzzõ6mF?Tacʕ888Ԅh$11+aW( ,b9>''kP__ԩS)..{7mtWvmUk 7?yؾ};:0,Y)0PEB9LBB&,)..fٲeʽ111%݉Kk]8y=334>?$Z/M}tJ1 jʹ.DX|2}bwkϥ:Qenn@F/C9sPRRBOO#FÃ_|Q B1L222Xzr7eddܹs _|BFaU$} ]ME\fΜɓ$s!**zquu%33*aW(n5 ok;w.MMM̞=Ç x'K^[YΚKы᭱tR9ޔ3(ǡP|MD~B-t999ҵ{{{NSSpeq.bBˎ:uKavq`Ο?ԩSinn&,, .(aW(njʹ 5kְd+Vܱ r_^?c%%%5k0rH; MD*ʹnΝ;IIIw@ީ=~w?111b K~QZZ]AP(~gFHLLdڵ cʔ.}N]yسg?U@BPu1{ʢ:Cv3qkȩ[sCqBԗ.]yyy,YSN)aW( m.b[Yrr2---F >>>Kݐ)3… UYNP(s1LRSRR !!,hjj"..˽ҥK777Te9BP!.%%%Arr2,Ym۶1uT7opUSXr%2IuR( ܿ9DDD/CZZ=b:44JŞ;Xp!8;;S]]hT®P(ʹs{DDYYY򺄄ړdqW^y_~R͛NJ+e߾}S/,[* B9ock QZZd"00#GhdÆ frss{ʕ+IKKX۽{7۷oW®P(ʹ3c u;]Xn999ujZZmǩϙ3&<==qvv͍lZP( 7ʹ:Q]؅RYYI]]uG吐 (((tvٳqvvfŤ]P(l瞕EBB6l ׈-~/")))rXll,pzxx8\K jkBP(]:"""˓ӥ@~p:өGEE1gfϞ-뉈P®P(osȸ])-*ꓒ0Lv{{{-ĊBP(Z.#""v8Nڅ'\,ӋDdddWأ ˴鉷7}Ӫmm B֋eㅀ;pY8y׋CqFDttΦL( Bu}ӄ]8v!)ZM8g+E^^ F̙@XXSNȑ#8pWWW<==._,E><<5k QK BP]벵Z+k絮^\D<؋YGehjj">>@***8y$SXXȕ+W=z4#F}ʁr BP>ڎpք?n9iK!!!ξ,}BP(bnloޅ;UV^}]]Z% BP~o2 D=55OOO]NP({{|BB֓,Z^~e}]Y=##>N]P( o3`-\S7rK 544r!PZ* Bk`EiΝKXXX֪)))䐗) B(\X~ LJ'5WP( ;@B \~.&D]P( %wkԵ\uW Bp+W( V,HNND3W( ^6oL]]$%% ڳ]P(o#IJ|FF$!!8 Bלhǚ Cޗ) B]DNN&ZC?+ ],/zJJLS"P( D=++ku߭ {NN:c BPܭ][`Z/vBP(7m[7l BP(">Nn BP(%.b7**֮P( ] BPܣ]$mϥP( r BP(9?tIENDB`gmic-1.6.8/zart/images/media-playback-stop.png0000664000175000017500000000275112632021514021471 0ustar dtschumpdtschumpPNG  IHDR szzsBIT|d pHYs|4ktEXtSoftwarewww.inkscape.org<fIDATXWG=[=ӋW`ę3>Μ AJLĉ倄djzgqlv,› VTչ{Ep@8L#E$OHW^Ivsc J){}#sǑ$#"B✃^by'?@۷o1~ARۭJ)sF]"0 nv^ !{8;t,Ţ0 ✓"Hr,3E$aZkR^II >ޛs9::B)$l`q5JVf>A4(@S/'({ZkaE!`RZ+ou5H{)9zH圣VUta@r2L#'R ڶ^HN&TU X,X))%1RtQX֊9gcr)K`fQD`r4Z!#bR}S״f)`5ƔOb0?KՔ,!ٳg#3p=S{&Mv4|{S#猻wOfCܴ$F0Uc6Ms9I{k-kFVCMdιp1`{:`@daJ7nz}jqmZk齯R1zDS$c 3wܙQ/,8\\s[p'ZaJV9Ks8 ֚]0$(޻0*ܠwbRbRBJv;eF(vZ")%㈜1#J)1X=uzgYf9~a0qqJY!"hvb`~TQD=RJw^9==M36 18>>:>zHgx4Zv{gQ XABx1Fszzry Dj*tRBZI&dGԂk()%uڶe)Esf̀3h~Ps'n6]b899[`2=RJSŧnRJ@Ji~*&8hvnBdQ~t4];#RDSJ.1F|k`EqՎF&ROOm羉1 u+o ٓ@mUϹ{5=a+,B'j%]q^K=\\\|[kBPM1s۶\, !pXi@֒$s(93Vŋ{is [w "r9uB$= `ЋHNe>mIENDB`gmic-1.6.8/zart/images/camera.png0000664000175000017500000000366612632021514017101 0ustar dtschumpdtschumpPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<HIDATxb?@bb`@pЀ; X@q*Ï?~JJRRY<-Ą\MzAPHE-?`)*%R.W081X^>P^Q^<`nnpEI IhA%@&&Vav (>Te`9{>8{p3ܽsXd=>P^X "!$99~/OT"@gx1۟ų?`jj. Ii'0'WxQQOٳ{RP H(|"!! ,EV/O:66V۷o&Ԑ@5rr7(8a 5 :N Hh`eeFk`AFF  !,D+z@iQ ԁݻ w<VR4  Z1*lU0r THJ*ȑ ϟ?\0t@z201Xepk biR@y +*JT1+#)jC0q?%ϞFA[[_%?gX Ϡhh$RRzvrռܲfV"@*(Po!=%R~~!P3hŐd3~k|i@1B-IK(F*@1t c@pNƙ2IENDB`gmic-1.6.8/zart/images/zoom-original.png0000664000175000017500000000265612632021514020435 0ustar dtschumpdtschumpPNG  IHDR szzsBIT|d pHYs|4ktEXtSoftwarewww.inkscape.org<+IDATXŗQLSW4vX &1UYKY<|2/c1x2QjV3ɤ11a-Xt\[Jkvrs}~9!s2B@*^$V89!FR ayqΗ `1f5Q5GyMha 2-gY7~$C!e4liiz%wCCnˉDb%,޾}{@iE*Ģ :ǏH$*MOOlR}}$IQĉ$J! i\7gϞmmbVowww:42<

ɓ'W~kXL?Xkݫ-Ң(Z8P{ȑ`0~id2}d{M?BQ@)< >J@`IŪDbp_雰RȎ|ШPJ cg[|wbzPE i,(,4ɂcepwiȲ,B C$BR1aTLgh  6 χqY~i(6wfʱf' 1"Pi-ԜB'r?r?39r6x@G߱H->jET !"wpO/2͕Tʔ1P}c]Kgu1#/Ijk|ԙW߳ȟ`eS:dFXƑcҲ- \U4F$Ԭź84<1ڽ-0:33 3BI[Ӿ="!/)uQNm*{ %I,. `) ln~Tnfp1{5g)c=9X6: P0XDT,b%d҇fu!P}qDtqn­#][B;ho/$R4q(fu!6DsgDjwp3HǺ;v7+I7̫u'`^ҾyW+!ϋ֟B 48cOE-.,y[EP~EЙT  M4ul,h.}K>`U4z_Lk9:bu/ fi,q4f)%ԢV}2yoAKKF` ΋Wp8?:AFҁ;z#LTf] MH*@tyE^"&YؑeH' B4`h*jP]{[޹$iD\Ol{9rv7ϟ? XJ(i@m~ ʯuܡ!Îͻ#Յun\)N螀HD0.mǧj I]$%U3ǖR%T;WDsuX"'HR1g-"5A%"374МRS~hBLcLq)upOQl`89o|Or#Cs)T?RBe:w\b甦Âso[\zy'BY*yI%J1Bu%c "̿{[+%4 sTToGr. MV8X,pgit=~}pHkb4qt~'\JT@D/>dۧ@.rWܳnٝkL xkca~Y}?#`ΥcKp_=[Lcs+TD4vÞG^oQB*E@# @d"cݰpON"RdCg"50ǘ.^ow;S^f+<]TkjkCo9) ˿wd ,m޲XD4Մ@XG%%7cϖ);ݹÏo|xWR)2)L aj HA~]7zUSWik3TRI)ͻn@{e)eh(`;?yCs3!&mƸ/ *s"fR2m "Dbx 0Smc=D+Ju!] 5 *XV2e`!")_'"qtR ]~O ixS5iFMM[aAu>_=t@P#oV9ڑY@Hiש:kjEɍ^_O 0 u}MIҒp̌ĭ 9 oZq  ˇD8no"{笭Yu$~ߟdH(_A@yE+Yg톡 +[u5E K$LX̲&-yk*PWeŭKe%cյ~es9N7o8 )"sβ(D8dY3ϻki&I ŧ ڃe$JU%VZ~:7uLAD Tsm?V[s @㕯?2_w;-2" .ͥ#" tmνzqA[VI F9dMvcO]JH(%,յs3hpöO Keg='; H\t)M%)+A`P|8/-'P _Q6|z tY%KN~+>scJ c}ld\+-LARM 14 ILHRdC^i9æP6CcPO O,5>{90d!"2F@pa+_3v?Z3Edl;Ϸ˥)d z@*[UIr slȄPJeڿhnf(qf?~7bs;(0w88l1'aQ[]#:9;2 wGVaE9ٸ >p$- mƸaO2%&֍W۾x(|/J:z9p kxgъv?]9)-Be8eˤWў,bV-8#|&8/I32sPK9*ȇowL@Kݗ%+;UV 7>پrCak>o@?u7Di~?viڏ\Y~H)֋ ATJTL췲d, vuS;Q_i`k?rm_cnMWmlΥuIΞ:T`Vv$MFo>,SjzȢȃZ&yV] &DdÝg?+[ S mY9HOe+*C}՗onyj{o6Ҡj+TDa<>#I1IlUWָK#cnZZ%j8gty帍1g*DZ(M7~SL*]PlwrRC y{GH2eӞS qJ' 쇌Ef81cHe5UD}R5_h6 Gm۞݉˓S A֧_Xolx.9;-]e$Nk= Ln/ ݴkp ^n"i7W4 @OBeUvWޖm'UJQ%޿pcF _xwɧV < AKCiɴZRJ 8#M)PIdk\XƮ)H;}]Eh{] Fksø%8eA̴ dz\Dl|Dن|dhF=-{X/}K/fS0,UyiW9S-T,AҊڔ~ݺ!tɜwͤ5GzCǶc9$_bR=HS BD\c oZqTCD`\Ygluʔў5SjQo[o6m 7:<5BQbMmڻL8[U)%~Ow_B^SwbZYS穦1 ΑߠN:emS1SY*JJiEvf,DDy f;͹NZw 'l:(S@>us4)i u3L$;юlcN>ؓS TNL`17xVȯ+^r%8599 .(Ȓɕ_QӰݙЬ?ޟi냧k(hhںHr'_~r;^h"ͩ۳ MMWe_v Kߵ&h#ĽwErqz!8"RB)SJΒ~-[ӔR Jrς"")6i-֔5C1 aК"OV38!ƙ4qgc wdAo{1>K 򺺺ۗkr$@k|%9CtwQ E8M$jӜN By6C2+Bީfd"L�4t v֖TB.((Z]^$0??&*K- +$Iy5ECɗ2n0ot t_i sR )*W2RC4xpAi6X r;Ks߽PPcwNkleNrәW}š[8%O"$cf6՗kvi<-΁,D8o;`gF-TBk+Ɇf/I;3XV+}ղҊDܼ PBBq2<{Yߺ?nup~+ϓ_WhԨ12nEzBͽ{ p@Nq^,LZt WSW|@eyL_?o!`?dR׿0KPnӢuh^ d2A8w^Wy̕09Ї7-0 Ɯ5"-i9{ưOL/޲di_:^``<8X(PvLJڕ7X *s}SusYYL? vo;5oEMHta ];[PWT&D^W|(J_ܢlT]GZ% PL" ۴fes! 􇻂DJg/pCCtj q31ܕu{ W'~?7'6 =3 pLQ1s05g cNœ(܄!rTsJH'Ţ~vk5g}wJSh9`MsXx OW ,{.ZK 6LO͐t,-HI bPtoCχWWsƶo2߻~nў<㺥rTY6zH%mTĞH<&,e#ܗz/l -'<ƅri+JRCOS+\YV`y I=-ROs_8U\::pxy?\KJ30n<.M7 cP2lh@V ]RVLguϩGZTfPߕqK):,usƤi0TR7ȘJЙ#-M˫i]w[:>J=uX6BXYUKHq{B^]ʬ(q6,Jr\gͽ"?hRmItZ .Sc>gZT> $%CurC: 3$gw}Wp]_c_8Ruưm`ء\)-k[l gKG*z±ؖ6y$2?$Y`4!ժ =+*ǏcGp;suc/OD ,mEA4 sS<;Mo7j H/H)>ٶsQSDclZ92j_k44 sFymwbty}0qIt WV .-r*4C(jwr=رHX~QU%X;3Ԙ`mmюGQE:.]3b~dhqYX@4!oYUtOS_1V[si]BQ3LUyB1}tBDh+cFĤ?1?`GQ1DRchCFcd gl#"f]E, Qf#S!DF ᩗѬb)4.V^?C}i?ʨIENDB`gmic-1.6.8/zart/images/media-playback-start.png0000664000175000017500000000326212632021514021637 0ustar dtschumpdtschumpPNG  IHDR szzsBIT|d pHYs|4ktEXtSoftwarewww.inkscape.org</IDATXW=I}YU]13ƹVHX ~& H s`Yg C =e*?(ERKU/^xE"rX!"P t"{DT~hbbAJ {O1Ft]G1"";cVpΉ>LDOE%/I4""H)Iy}DmۢiZFtnYpZ+ZXk\v~hҶXk{/5#RBDDcLBsNIID,4ߵsSQH)prrf4J((!*Q:'{ (9bf03VʲD۶H) 3KJXqzCac0gYkU\I7iDԋLDhRJp ) !l0H _!F#шx$D @ՍAffFƘaIR`J&1u]lf&q+g""ʂ(tDB1 5@Y= 11F#Nϟ?/_x!n 7oތ sIY0ƈ')C9e!BTamWUEϟgQa۷oݻ~>`2HUUjH>T c Ykw0PspΡk4Mc={VyEt khZK92u]SY} p᥌WBɓ'ŧOHE\f45ٌөL&U@IїҘ˴mZxǏׯhf&\&Y1l~j|͖64yѭQ޽{Ǐ=2O>UBVU jm8;^ f-Y#Q@ug'Bz-+AQܹsGY{j=߾}dBH{iFNy=Çr… {4qFX,RCQ7EJ !!a?m1FU_1ʠxCGGGI'm៽4M9ж-._l6_~EJ)pEsjZ)#jBqcTrƍOGGG ̌r4%ʲԟ2\VP׳~^oSUUwZ|"mRYRrcܜ;wu]o6dr 4,SMӠm[=u] 1FY.BfooRJC=NslzQ~P&=Snr{LSr !l#w/цI+BUE0iʀ16l:sΝDcS^T-ƒܰӳ.Ѝ^H8Ֆ젪rc<O5zPZmnTDSrj ߯\rkmU13EAƘ~<h4,i4QUUZ1bX4/_Ǐ w ?v*"NV  yëIENDB`gmic-1.6.8/zart/Licence_CeCILL_V2-en.html0000664000175000017500000007451612632021514020152 0ustar dtschumpdtschump CeCILL FREE SOFTWARE LICENSE AGREEMENT

CeCILL FREE SOFTWARE LICENSE AGREEMENT

Notice

This Agreement is a Free Software license agreement that is the result of discussions between its authors in order to ensure compliance with the two main principles guiding its drafting:

  • firstly, compliance with the principles governing the distribution of Free Software: access to source code, broad rights granted to users,
  • secondly, the election of a governing law, French law, with which it is conformant, both as regards the law of torts and intellectual property law, and the protection that it offers to both authors and holders of the economic rights over software.

The authors of the CeCILL1 license are:

Commissariat à l'Energie Atomique - CEA, a public scientific, technical and industrial research establishment, having its principal place of business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France.

Centre National de la Recherche Scientifique - CNRS, a public scientific and technological establishment, having its principal place of business at 3 rue Michel-Ange, 75794 Paris cedex 16, France.

Institut National de Recherche en Informatique et en Automatique - INRIA, a public scientific and technological establishment, having its principal place of business at Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex, France.

Preamble

The purpose of this Free Software license agreement is to grant users the right to modify and redistribute the software governed by this license within the framework of an open source distribution model.

The exercising of these rights is conditional upon certain obligations for users so as to preserve this status for all subsequent redistributions.

In consideration of access to the source code and the rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the successive licensors only have limited liability.

In this respect, the risks associated with loading, using, modifying and/or developing or reproducing the software by the user are brought to the user's attention, given its Free Software status, which may make it complicated to use, with the result that its use is reserved for developers and experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the suitability of the software as regards their requirements in conditions enabling the security of their systems and/or data to be ensured and, more generally, to use and operate it in the same conditions of security. This Agreement may be freely reproduced and published, provided it is not altered, and that no provisions are either added or removed herefrom.

This Agreement may apply to any or all software for which the holder of the economic rights decides to submit the use thereof to its provisions.

Article 1 - DEFINITIONS

For the purpose of this Agreement, when the following expressions commence with a capital letter, they shall have the following meaning:

Agreement: means this license agreement, and its possible subsequent versions and annexes.

Software: means the software in its Object Code and/or Source Code form and, where applicable, its documentation, "as is" when the Licensee accepts the Agreement.

Initial Software: means the Software in its Source Code and possibly its Object Code form and, where applicable, its documentation, "as is" when it is first distributed under the terms and conditions of the Agreement.

Modified Software: means the Software modified by at least one Contribution.

Source Code: means all the Software's instructions and program lines to which access is required so as to modify the Software.

Object Code: means the binary files originating from the compilation of the Source Code.

Holder: means the holder(s) of the economic rights over the Initial Software.

Licensee: means the Software user(s) having accepted the Agreement.

Contributor: means a Licensee having made at least one Contribution.

Licensor: means the Holder, or any other individual or legal entity, who distributes the Software under the Agreement.

Contribution: means any or all modifications, corrections, translations, adaptations and/or new functions integrated into the Software by any or all Contributors, as well as any or all Internal Modules.

Module: means a set of sources files including their documentation that enables supplementary functions or services in addition to those offered by the Software.

External Module: means any or all Modules, not derived from the Software, so that this Module and the Software run in separate address spaces, with one calling the other when they are run.

Internal Module: means any or all Module, connected to the Software so that they both execute in the same address space.

GNU GPL: means the GNU General Public License version 2 or any subsequent version, as published by the Free Software Foundation Inc.

Parties: mean both the Licensee and the Licensor.

These expressions may be used both in singular and plural form.

Article 2 - PURPOSE

The purpose of the Agreement is the grant by the Licensor to the Licensee of a non-exclusive, transferable and worldwide license for the Software as set forth in Article 5 hereinafter for the whole term of the protection granted by the rights over said Software.

Article 3 - ACCEPTANCE

3.1 The Licensee shall be deemed as having accepted the terms and conditions of this Agreement upon the occurrence of the first of the following events:

  • (i) loading the Software by any or all means, notably, by downloading from a remote server, or by loading from a physical medium;
  • (ii) the first time the Licensee exercises any of the rights granted hereunder.

3.2 One copy of the Agreement, containing a notice relating to the characteristics of the Software, to the limited warranty, and to the fact that its use is restricted to experienced users has been provided to the Licensee prior to its acceptance as set forth in Article 3.1 hereinabove, and the Licensee hereby acknowledges that it has read and understood it.

Article 4 - EFFECTIVE DATE AND TERM

4.1 EFFECTIVE DATE

The Agreement shall become effective on the date when it is accepted by the Licensee as set forth in Article 3.1.

4.2 TERM

The Agreement shall remain in force for the entire legal term of protection of the economic rights over the Software.

Article 5 - SCOPE OF RIGHTS GRANTED

The Licensor hereby grants to the Licensee, who accepts, the following rights over the Software for any or all use, and for the term of the Agreement, on the basis of the terms and conditions set forth hereinafter.

Besides, if the Licensor owns or comes to own one or more patents protecting all or part of the functions of the Software or of its components, the Licensor undertakes not to enforce the rights granted by these patents against successive Licensees using, exploiting or modifying the Software. If these patents are transferred, the Licensor undertakes to have the transferees subscribe to the obligations set forth in this paragraph.

5.1 RIGHT OF USE

The Licensee is authorized to use the Software, without any limitation as to its fields of application, with it being hereinafter specified that this comprises:

  1. permanent or temporary reproduction of all or part of the Software by any or all means and in any or all form.

  2. loading, displaying, running, or storing the Software on any or all medium.

  3. entitlement to observe, study or test its operation so as to determine the ideas and principles behind any or all constituent elements of said Software. This shall apply when the Licensee carries out any or all loading, displaying, running, transmission or storage operation as regards the Software, that it is entitled to carry out hereunder.

5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS

The right to make Contributions includes the right to translate, adapt, arrange, or make any or all modifications to the Software, and the right to reproduce the resulting software.

The Licensee is authorized to make any or all Contributions to the Software provided that it includes an explicit notice that it is the author of said Contribution and indicates the date of the creation thereof.

5.3 RIGHT OF DISTRIBUTION

In particular, the right of distribution includes the right to publish, transmit and communicate the Software to the general public on any or all medium, and by any or all means, and the right to market, either in consideration of a fee, or free of charge, one or more copies of the Software by any means.

The Licensee is further authorized to distribute copies of the modified or unmodified Software to third parties according to the terms and conditions set forth hereinafter.

5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION

The Licensee is authorized to distribute true copies of the Software in Source Code or Object Code form, provided that said distribution complies with all the provisions of the Agreement and is accompanied by:

  1. a copy of the Agreement,

  2. a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9,

and that, in the event that only the Object Code of the Software is redistributed, the Licensee allows future Licensees unhindered access to the full Source Code of the Software by indicating how to access it, it being understood that the additional cost of acquiring the Source Code shall not exceed the cost of transferring the data.

5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE

When the Licensee makes a Contribution to the Software, the terms and conditions for the distribution of the resulting Modified Software become subject to all the provisions of this Agreement.

The Licensee is authorized to distribute the Modified Software, in source code or object code form, provided that said distribution complies with all the provisions of the Agreement and is accompanied by:

  1. a copy of the Agreement,

  2. a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9,

and that, in the event that only the object code of the Modified Software is redistributed, the Licensee allows future Licensees unhindered access to the full source code of the Modified Software by indicating how to access it, it being understood that the additional cost of acquiring the source code shall not exceed the cost of transferring the data.

5.3.3 DISTRIBUTION OF EXTERNAL MODULES

When the Licensee has developed an External Module, the terms and conditions of this Agreement do not apply to said External Module, that may be distributed under a separate license agreement.

5.3.4 COMPATIBILITY WITH THE GNU GPL

The Licensee can include a code that is subject to the provisions of one of the versions of the GNU GPL in the Modified or unmodified Software, and distribute that entire code under the terms of the same version of the GNU GPL.

The Licensee can include the Modified or unmodified Software in a code that is subject to the provisions of one of the versions of the GNU GPL, and distribute that entire code under the terms of the same version of the GNU GPL.

Article 6 - INTELLECTUAL PROPERTY

6.1 OVER THE INITIAL SOFTWARE

The Holder owns the economic rights over the Initial Software. Any or all use of the Initial Software is subject to compliance with the terms and conditions under which the Holder has elected to distribute its work and no one shall be entitled to modify the terms and conditions for the distribution of said Initial Software.

The Holder undertakes that the Initial Software will remain ruled at least by this Agreement, for the duration set forth in Article 4.2.

6.2 OVER THE CONTRIBUTIONS

The Licensee who develops a Contribution is the owner of the intellectual property rights over this Contribution as defined by applicable law.

6.3 OVER THE EXTERNAL MODULES

The Licensee who develops an External Module is the owner of the intellectual property rights over this External Module as defined by applicable law and is free to choose the type of agreement that shall govern its distribution.

6.4 JOINT PROVISIONS

The Licensee expressly undertakes:

  1. not to remove, or modify, in any manner, the intellectual property notices attached to the Software;

  2. to reproduce said notices, in an identical manner, in the copies of the Software modified or not.

The Licensee undertakes not to directly or indirectly infringe the intellectual property rights of the Holder and/or Contributors on the Software and to take, where applicable, vis--vis its staff, any and all measures required to ensure respect of said intellectual property rights of the Holder and/or Contributors.

Article 7 - RELATED SERVICES

7.1 Under no circumstances shall the Agreement oblige the Licensor to provide technical assistance or maintenance services for the Software.

However, the Licensor is entitled to offer this type of services. The terms and conditions of such technical assistance, and/or such maintenance, shall be set forth in a separate instrument. Only the Licensor offering said maintenance and/or technical assistance services shall incur liability therefor.

7.2 Similarly, any Licensor is entitled to offer to its licensees, under its sole responsibility, a warranty, that shall only be binding upon itself, for the redistribution of the Software and/or the Modified Software, under terms and conditions that it is free to decide. Said warranty, and the financial terms and conditions of its application, shall be subject of a separate instrument executed between the Licensor and the Licensee.

Article 8 - LIABILITY

8.1 Subject to the provisions of Article 8.2, the Licensee shall be entitled to claim compensation for any direct loss it may have suffered from the Software as a result of a fault on the part of the relevant Licensor, subject to providing evidence thereof.

8.2 The Licensor's liability is limited to the commitments made under this Agreement and shall not be incurred as a result of in particular: (i) loss due the Licensee's total or partial failure to fulfill its obligations, (ii) direct or consequential loss that is suffered by the Licensee due to the use or performance of the Software, and (iii) more generally, any consequential loss. In particular the Parties expressly agree that any or all pecuniary or business loss (i.e. loss of data, loss of profits, operating loss, loss of customers or orders, opportunity cost, any disturbance to business activities) or any or all legal proceedings instituted against the Licensee by a third party, shall constitute consequential loss and shall not provide entitlement to any or all compensation from the Licensor.

Article 9 - WARRANTY

9.1 The Licensee acknowledges that the scientific and technical state-of-the-art when the Software was distributed did not enable all possible uses to be tested and verified, nor for the presence of possible defects to be detected. In this respect, the Licensee's attention has been drawn to the risks associated with loading, using, modifying and/or developing and reproducing the Software which are reserved for experienced users.

The Licensee shall be responsible for verifying, by any or all means, the suitability of the product for its requirements, its good working order, and for ensuring that it shall not cause damage to either persons or properties.

9.2 The Licensor hereby represents, in good faith, that it is entitled to grant all the rights over the Software (including in particular the rights set forth in Article 5).

9.3 The Licensee acknowledges that the Software is supplied "as is" by the Licensor without any other express or tacit warranty, other than that provided for in Article 9.2 and, in particular, without any warranty as to its commercial value, its secured, safe, innovative or relevant nature.

Specifically, the Licensor does not warrant that the Software is free from any error, that it will operate without interruption, that it will be compatible with the Licensee's own equipment and software configuration, nor that it will meet the Licensee's requirements.

9.4 The Licensor does not either expressly or tacitly warrant that the Software does not infringe any third party intellectual property right relating to a patent, software or any other property right. Therefore, the Licensor disclaims any and all liability towards the Licensee arising out of any or all proceedings for infringement that may be instituted in respect of the use, modification and redistribution of the Software. Nevertheless, should such proceedings be instituted against the Licensee, the Licensor shall provide it with technical and legal assistance for its defense. Such technical and legal assistance shall be decided on a case-by-case basis between the relevant Licensor and the Licensee pursuant to a memorandum of understanding. The Licensor disclaims any and all liability as regards the Licensee's use of the name of the Software. No warranty is given as regards the existence of prior rights over the name of the Software or as regards the existence of a trademark.

Article 10 - TERMINATION

10.1 In the event of a breach by the Licensee of its obligations hereunder, the Licensor may automatically terminate this Agreement thirty (30) days after notice has been sent to the Licensee and has remained ineffective.

10.2 A Licensee whose Agreement is terminated shall no longer be authorized to use, modify or distribute the Software. However, any licenses that it may have granted prior to termination of the Agreement shall remain valid subject to their having been granted in compliance with the terms and conditions hereof.

Article 11 - MISCELLANEOUS

11.1 EXCUSABLE EVENTS

Neither Party shall be liable for any or all delay, or failure to perform the Agreement, that may be attributable to an event of force majeure, an act of God or an outside cause, such as defective functioning or interruptions of the electricity or telecommunications networks, network paralysis following a virus attack, intervention by government authorities, natural disasters, water damage, earthquakes, fire, explosions, strikes and labor unrest, war, etc.

11.2 Any failure by either Party, on one or more occasions, to invoke one or more of the provisions hereof, shall under no circumstances be interpreted as being a waiver by the interested Party of its right to invoke said provision(s) subsequently.

11.3 The Agreement cancels and replaces any or all previous agreements, whether written or oral, between the Parties and having the same purpose, and constitutes the entirety of the agreement between said Parties concerning said purpose. No supplement or modification to the terms and conditions hereof shall be effective as between the Parties unless it is made in writing and signed by their duly authorized representatives.

11.4 In the event that one or more of the provisions hereof were to conflict with a current or future applicable act or legislative text, said act or legislative text shall prevail, and the Parties shall make the necessary amendments so as to comply with said act or legislative text. All other provisions shall remain effective. Similarly, invalidity of a provision of the Agreement, for any reason whatsoever, shall not cause the Agreement as a whole to be invalid.

11.5 LANGUAGE

The Agreement is drafted in both French and English and both versions are deemed authentic.

Article 12 - NEW VERSIONS OF THE AGREEMENT

12.1 Any person is authorized to duplicate and distribute copies of this Agreement.

12.2 So as to ensure coherence, the wording of this Agreement is protected and may only be modified by the authors of the License, who reserve the right to periodically publish updates or new versions of the Agreement, each with a separate number. These subsequent versions may address new issues encountered by Free Software.

12.3 Any Software distributed under a given version of the Agreement may only be subsequently distributed under the same version of the Agreement or a subsequent version, subject to the provisions of Article 5.3.4.

Article 13 - GOVERNING LAW AND JURISDICTION

13.1 The Agreement is governed by French law. The Parties agree to endeavor to seek an amicable solution to any disagreements or disputes that may arise during the performance of the Agreement.

13.2 Failing an amicable solution within two (2) months as from their occurrence, and unless emergency proceedings are necessary, the disagreements or disputes shall be referred to the Paris Courts having jurisdiction, by the more diligent Party.

Version 2.0 dated 2006-09-05.
gmic-1.6.8/resources/0000775000175000017500000000000012632021514014715 5ustar dtschumpdtschumpgmic-1.6.8/resources/gmic_bashcompletion.sh0000664000175000017500000036344712632021514021300 0ustar dtschumpdtschump# # Bash completion rules for 'gmic'. # # This file has been generated automatically. # Do not edit! # # This file should be copied/renamed in '/etc/bash_completion.d/gmic'. # _gmic_stdlib() { local cur prev opts coms COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts="\ -debug --debug\ -h --h\ -help --help\ -version --version\ -camera --camera\ -m --m\ -command --command\ -cursor --cursor\ -d --d\ -display --display\ -d0 --d0\ -display0 --display0\ -d3d --d3d\ -display3d --display3d\ -da --da\ -display_array --display_array\ -dfft --dfft\ -display_fft --display_fft\ -dg --dg\ -display_graph --display_graph\ -dh --dh\ -display_histogram --display_histogram\ -display_parametric --display_parametric\ -dp --dp\ -display_polar --display_polar\ -drgba --drgba\ -display_rgba --display_rgba\ -dt --dt\ -display_tensors --display_tensors\ -dw --dw\ -display_warp --display_warp\ -document_gmic --document_gmic\ -e --e\ -echo --echo\ -echo_file --echo_file\ -echo_stdout --echo_stdout\ -function1d --function1d\ -gmicky --gmicky\ -gmicky_wilber --gmicky_wilber\ -i --i\ -input --input\ -ig --ig\ -input_glob --input_glob\ -input_gpl --input_gpl\ -o --o\ -output --output\ -output_ggr --output_ggr\ -on --on\ -outputn --outputn\ -op --op\ -outputp --outputp\ -ow --ow\ -outputw --outputw\ -ox --ox\ -outputx --outputx\ -pass --pass\ -plot --plot\ -p --p\ -print --print\ -rainbow_lut --rainbow_lut\ -roddy --roddy\ -select --select\ -serialize --serialize\ -shape_heart --shape_heart\ -shape_circle --shape_circle\ -shape_cupid --shape_cupid\ -shape_diamond --shape_diamond\ -shape_polygon --shape_polygon\ -shape_star --shape_star\ -sh --sh\ -shared --shared\ -srand --srand\ -testimage2d --testimage2d\ -uncommand --uncommand\ -uniform_distribution --uniform_distribution\ -unserialize --unserialize\ -up --up\ -update --update\ -v --v\ -verbose --verbose\ -wait --wait\ -warn --warn\ -w --w\ -window --window\ -k --k\ -keep --keep\ -mv --mv\ -move --move\ -nm --nm\ -name --name\ -nms --nms\ -names --names\ -rm --rm\ -remove --remove\ -remove_duplicates --remove_duplicates\ -remove_empty --remove_empty\ -rv --rv\ -reverse --reverse\ -sort_list --sort_list\ -sort_str --sort_str\ -abs --abs\ -acos --acos\ -+ --+\ -add --add\ -& --&\ -and --and\ -asin --asin\ -atan --atan\ -atan2 --atan2\ -<< --<<\ -bsl --bsl\ ->> -->>\ -bsr --bsr\ -cos --cos\ -cosh --cosh\ -/ --/\ -div --div\ -div_complex --div_complex\ -== --==\ -eq --eq\ -exp --exp\ ->= -->=\ -ge --ge\ -> -->\ -gt --gt\ -<= --<=\ -le --le\ -< --<\ -lt --lt\ -log --log\ -log10 --log10\ -log2 --log2\ -max --max\ -// --//\ -mdiv --mdiv\ -min --min\ -% --%\ -mod --mod\ -** --**\ -mmul --mmul\ -* --*\ -mul --mul\ -mul_channels --mul_channels\ -mul_complex --mul_complex\ -!= --!=\ -neq --neq\ -| --|\ -or --or\ -^ --^\ -pow --pow\ -rol --rol\ -ror --ror\ -sign --sign\ -sin --sin\ -sinc --sinc\ -sinh --sinh\ -sqr --sqr\ -sqrt --sqrt\ -- ---\ -sub --sub\ -tan --tan\ -tanh --tanh\ -xor --xor\ -apply_curve --apply_curve\ -apply_gamma --apply_gamma\ -balance_gamma --balance_gamma\ -complex2polar --complex2polar\ -compress_rle --compress_rle\ -cumulate --cumulate\ -c --c\ -cut --cut\ -discard --discard\ -eigen2tensor --eigen2tensor\ -endian --endian\ -equalize --equalize\ -f --f\ -fill --fill\ -float2int8 --float2int8\ -int82float --int82float\ -index --index\ -ir --ir\ -inrange --inrange\ -map --map\ -map_clut --map_clut\ -mix_channels --mix_channels\ -negative --negative\ -noise --noise\ -normlp --normlp\ -norm --norm\ -n --n\ -normalize --normalize\ -normalize_sum --normalize_sum\ -not --not\ -orientation --orientation\ -oneminus --oneminus\ -otsu --otsu\ -polar2complex --polar2complex\ -quantize --quantize\ -rand --rand\ -replace --replace\ -replace_inf --replace_inf\ -replace_nan --replace_nan\ -replace_seq --replace_seq\ -replace_str --replace_str\ -round --round\ -roundify --roundify\ -= --=\ -set --set\ -threshold --threshold\ -uncompress_rle --uncompress_rle\ -unrepeat --unrepeat\ -vector2tensor --vector2tensor\ -ac --ac\ -apply_channels --apply_channels\ -autoindex --autoindex\ -bayer2rgb --bayer2rgb\ -cmy2rgb --cmy2rgb\ -cmyk2rgb --cmyk2rgb\ -colormap --colormap\ -compose_channels --compose_channels\ -direction2rgb --direction2rgb\ -ditheredbw --ditheredbw\ -fc --fc\ -fill_color --fill_color\ -gradient2rgb --gradient2rgb\ -hsi2rgb --hsi2rgb\ -hsi82rgb --hsi82rgb\ -hsl2rgb --hsl2rgb\ -hsl82rgb --hsl82rgb\ -hsv2rgb --hsv2rgb\ -hsv82rgb --hsv82rgb\ -int2rgb --int2rgb\ -lab2lch --lab2lch\ -lab2rgb --lab2rgb\ -lab82rgb --lab82rgb\ -lch2lab --lch2lab\ -lch2rgb --lch2rgb\ -lch82rgb --lch82rgb\ -luminance --luminance\ -mix_rgb --mix_rgb\ -pseudogray --pseudogray\ -replace_color --replace_color\ -rgb2bayer --rgb2bayer\ -rgb2cmy --rgb2cmy\ -rgb2cmyk --rgb2cmyk\ -rgb2hsi --rgb2hsi\ -rgb2hsi8 --rgb2hsi8\ -rgb2hsl --rgb2hsl\ -rgb2hsl8 --rgb2hsl8\ -rgb2hsv --rgb2hsv\ -rgb2hsv8 --rgb2hsv8\ -rgb2lab --rgb2lab\ -rgb2lab8 --rgb2lab8\ -rgb2lch --rgb2lch\ -rgb2lch8 --rgb2lch8\ -rgb2luv --rgb2luv\ -rgb2int --rgb2int\ -rgb2srgb --rgb2srgb\ -rgb2xyz --rgb2xyz\ -rgb2xyz8 --rgb2xyz8\ -rgb2yiq --rgb2yiq\ -rgb2yiq8 --rgb2yiq8\ -rgb2ycbcr --rgb2ycbcr\ -rgb2yuv --rgb2yuv\ -rgb2yuv8 --rgb2yuv8\ -remove_opacity --remove_opacity\ -select_color --select_color\ -sepia --sepia\ -solarize --solarize\ -split_colors --split_colors\ -split_opacity --split_opacity\ -srgb2rgb --srgb2rgb\ -to_a --to_a\ -to_color --to_color\ -to_colormode --to_colormode\ -to_gray --to_gray\ -to_graya --to_graya\ -to_pseudogray --to_pseudogray\ -to_rgb --to_rgb\ -to_rgba --to_rgba\ -transfer_colors --transfer_colors\ -transfer_rgb --transfer_rgb\ -xyz2rgb --xyz2rgb\ -xyz82rgb --xyz82rgb\ -ycbcr2rgb --ycbcr2rgb\ -yiq2rgb --yiq2rgb\ -yiq82rgb --yiq82rgb\ -yuv2rgb --yuv2rgb\ -yuv82rgb --yuv82rgb\ -a --a\ -append --append\ -append_tiles --append_tiles\ -autocrop --autocrop\ -autocrop_components --autocrop_components\ -autocrop_seq --autocrop_seq\ -channels --channels\ -columns --columns\ -z --z\ -crop --crop\ -diagonal --diagonal\ -elevate --elevate\ -expand_x --expand_x\ -expand_xy --expand_xy\ -expand_xyz --expand_xyz\ -expand_y --expand_y\ -expand_z --expand_z\ -montage --montage\ -mirror --mirror\ -permute --permute\ -r --r\ -resize --resize\ -resize_pow2 --resize_pow2\ -rr2d --rr2d\ -resize_ratio2d --resize_ratio2d\ -r2dx --r2dx\ -resize2dx --resize2dx\ -r2dy --r2dy\ -resize2dy --resize2dy\ -r3dx --r3dx\ -resize3dx --resize3dx\ -r3dy --r3dy\ -resize3dy --resize3dy\ -r3dz --r3dz\ -resize3dz --resize3dz\ -rotate --rotate\ -rotate_tileable --rotate_tileable\ -rows --rows\ -scale2x --scale2x\ -scale3x --scale3x\ -scale_dcci2x --scale_dcci2x\ -seamcarve --seamcarve\ -shift --shift\ -shrink_x --shrink_x\ -shrink_xy --shrink_xy\ -shrink_xyz --shrink_xyz\ -shrink_y --shrink_y\ -shrink_z --shrink_z\ -slices --slices\ -sort --sort\ -s --s\ -split --split\ -split_tiles --split_tiles\ -y --y\ -unroll --unroll\ -upscale_smart --upscale_smart\ -warp --warp\ -bandpass --bandpass\ -bilateral --bilateral\ -b --b\ -blur --blur\ -blur_angular --blur_angular\ -blur_linear --blur_linear\ -blur_radial --blur_radial\ -blur_selective --blur_selective\ -blur_x --blur_x\ -blur_xy --blur_xy\ -blur_xyz --blur_xyz\ -blur_y --blur_y\ -blur_z --blur_z\ -boxfilter --boxfilter\ -compose_freq --compose_freq\ -convolve --convolve\ -convolve_fft --convolve_fft\ -correlate --correlate\ -cross_correlation --cross_correlation\ -curvature --curvature\ -dct --dct\ -deblur --deblur\ -deblur_goldmeinel --deblur_goldmeinel\ -deblur_richardsonlucy --deblur_richardsonlucy\ -deconvolve_fft --deconvolve_fft\ -deinterlace --deinterlace\ -denoise --denoise\ -denoise_haar --denoise_haar\ -deriche --deriche\ -dilate --dilate\ -dilate_circ --dilate_circ\ -dilate_oct --dilate_oct\ -dilate_threshold --dilate_threshold\ -divergence --divergence\ -dog --dog\ -diffusiontensors --diffusiontensors\ -edges --edges\ -erode --erode\ -erode_circ --erode_circ\ -erode_oct --erode_oct\ -erode_threshold --erode_threshold\ -fft --fft\ -g --g\ -gradient --gradient\ -gradient_norm --gradient_norm\ -gradient_orientation --gradient_orientation\ -guided --guided\ -haar --haar\ -heat_flow --heat_flow\ -hessian --hessian\ -idct --idct\ -iee --iee\ -ifft --ifft\ -ihaar --ihaar\ -inn --inn\ -inpaint --inpaint\ -inpaint_flow --inpaint_flow\ -inpaint_gaussian --inpaint_gaussian\ -inpaint_holes --inpaint_holes\ -inpaint_morpho --inpaint_morpho\ -inpaint_patchmatch --inpaint_patchmatch\ -kuwahara --kuwahara\ -laplacian --laplacian\ -lic --lic\ -map_tones --map_tones\ -map_tones_fast --map_tones_fast\ -meancurvature_flow --meancurvature_flow\ -median --median\ -nlmeans --nlmeans\ -nlmeans_core --nlmeans_core\ -normalize_local --normalize_local\ -normalized_cross_correlation --normalized_cross_correlation\ -peronamalik_flow --peronamalik_flow\ -phase_correlation --phase_correlation\ -pde_flow --pde_flow\ -periodize_poisson --periodize_poisson\ -red_eye --red_eye\ -remove_hotpixels --remove_hotpixels\ -remove_pixels --remove_pixels\ -sharpen --sharpen\ -smooth --smooth\ -split_freq --split_freq\ -solve_poisson --solve_poisson\ -split_details --split_details\ -structuretensors --structuretensors\ -syntexturize --syntexturize\ -syntexturize_patchmatch --syntexturize_patchmatch\ -tv_flow --tv_flow\ -unsharp --unsharp\ -unsharp_octave --unsharp_octave\ -vanvliet --vanvliet\ -watermark_fourier --watermark_fourier\ -watershed --watershed\ -area --area\ -area_fg --area_fg\ -at_line --at_line\ -barycenter --barycenter\ -detect_skin --detect_skin\ -displacement --displacement\ -distance --distance\ -float2fft8 --float2fft8\ -fft82float --fft82float\ -fftpolar --fftpolar\ -histogram --histogram\ -histogram_nd --histogram_nd\ -histogram_cumul --histogram_cumul\ -histogram_pointwise --histogram_pointwise\ -hough --hough\ -ifftpolar --ifftpolar\ -isophotes --isophotes\ -label --label\ -label_fg --label_fg\ -max_patch --max_patch\ -min_patch --min_patch\ -minimal_path --minimal_path\ -mse --mse\ -patches --patches\ -patchmatch --patchmatch\ -plot2value --plot2value\ -pointcloud --pointcloud\ -psnr --psnr\ -segment_watershed --segment_watershed\ -skeleton --skeleton\ -ssd_patch --ssd_patch\ -thinning --thinning\ -tones --tones\ -topographic_map --topographic_map\ -variance_patch --variance_patch\ -axes --axes\ -ball --ball\ -chessboard --chessboard\ -cie1931 --cie1931\ -circle --circle\ -ellipse --ellipse\ -flood --flood\ -gaussian --gaussian\ -graph --graph\ -grid --grid\ -j --j\ -image --image\ -line --line\ -mandelbrot --mandelbrot\ -marble --marble\ -maze --maze\ -maze_mask --maze_mask\ -j3d --j3d\ -object3d --object3d\ -pack_sprites --pack_sprites\ -piechart --piechart\ -plasma --plasma\ -point --point\ -polka_dots --polka_dots\ -polygon --polygon\ -quiver --quiver\ -rectangle --rectangle\ -rorschach --rorschach\ -sierpinski --sierpinski\ -snowflake --snowflake\ -spiralbw --spiralbw\ -spline --spline\ -tetraedron_shade --tetraedron_shade\ -t --t\ -text --text\ -text_outline --text_outline\ -triangle_shade --triangle_shade\ -truchet --truchet\ -turbulence --turbulence\ -yinyang --yinyang\ -dijkstra --dijkstra\ -eigen --eigen\ -invert --invert\ -solve --solve\ -svd --svd\ -transpose --transpose\ -trisolve --trisolve\ -+3d --+3d\ -add3d --add3d\ -animate3d --animate3d\ -apply_camera3d --apply_camera3d\ -array3d --array3d\ -arrow3d --arrow3d\ -axes3d --axes3d\ -box3d --box3d\ -c3d --c3d\ -center3d --center3d\ -circle3d --circle3d\ -circles3d --circles3d\ -col3d --col3d\ -color3d --color3d\ -colorcube3d --colorcube3d\ -cone3d --cone3d\ -cubes3d --cubes3d\ -cup3d --cup3d\ -cylinder3d --cylinder3d\ -delaunay3d --delaunay3d\ -distribution3d --distribution3d\ -/3d --/3d\ -div3d --div3d\ -db3d --db3d\ -double3d --double3d\ -elevation3d --elevation3d\ -empty3d --empty3d\ -extrude3d --extrude3d\ -f3d --f3d\ -focale3d --focale3d\ -gaussians3d --gaussians3d\ -gmic3d --gmic3d\ -gyroid3d --gyroid3d\ -histogram3d --histogram3d\ -image6cube3d --image6cube3d\ -imageblocks3d --imageblocks3d\ -imagecube3d --imagecube3d\ -imageplane3d --imageplane3d\ -imagepyramid3d --imagepyramid3d\ -imagerubik3d --imagerubik3d\ -imagesphere3d --imagesphere3d\ -isoline3d --isoline3d\ -isosurface3d --isosurface3d\ -label3d --label3d\ -label_points3d --label_points3d\ -lathe3d --lathe3d\ -l3d --l3d\ -light3d --light3d\ -line3d --line3d\ -lissajous3d --lissajous3d\ -m3d --m3d\ -mode3d --mode3d\ -md3d --md3d\ -moded3d --moded3d\ -*3d --*3d\ -mul3d --mul3d\ -n3d --n3d\ -normalize3d --normalize3d\ -o3d --o3d\ -opacity3d --opacity3d\ -parametric3d --parametric3d\ -pca_patch3d --pca_patch3d\ -plane3d --plane3d\ -point3d --point3d\ -pointcloud3d --pointcloud3d\ -pose3d --pose3d\ -p3d --p3d\ -primitives3d --primitives3d\ -projections3d --projections3d\ -pyramid3d --pyramid3d\ -quadrangle3d --quadrangle3d\ -random3d --random3d\ -rv3d --rv3d\ -reverse3d --reverse3d\ -r3d --r3d\ -rotate3d --rotate3d\ -rotation3d --rotation3d\ -sierpinski3d --sierpinski3d\ -size3d --size3d\ -skeleton3d --skeleton3d\ -snapshot3d --snapshot3d\ -sl3d --sl3d\ -specl3d --specl3d\ -ss3d --ss3d\ -specs3d --specs3d\ -sphere3d --sphere3d\ -spherical3d --spherical3d\ -spline3d --spline3d\ -s3d --s3d\ -split3d --split3d\ -sprite3d --sprite3d\ -sprites3d --sprites3d\ -star3d --star3d\ -streamline3d --streamline3d\ --3d ---3d\ -sub3d --sub3d\ -superformula3d --superformula3d\ -text_pointcloud3d --text_pointcloud3d\ -text3d --text3d\ -t3d --t3d\ -texturize3d --texturize3d\ -torus3d --torus3d\ -triangle3d --triangle3d\ -volume3d --volume3d\ -weird3d --weird3d\ -ap --ap\ -apply_parallel --apply_parallel\ -apc --apc\ -apply_parallel_channels --apply_parallel_channels\ -apo --apo\ -apply_parallel_overlap --apply_parallel_overlap\ -apply_timeout --apply_timeout\ -check --check\ -check3d --check3d\ -continue --continue\ -break --break\ -do --do\ -done --done\ -elif --elif\ -else --else\ -endif --endif\ -endl --endl\ -endlocal --endlocal\ -error --error\ -x --x\ -exec --exec\ -if --if\ -l --l\ -local --local\ -mutex --mutex\ -noarg --noarg\ -onfail --onfail\ -parallel --parallel\ -progress --progress\ -q --q\ -quit --quit\ -repeat --repeat\ -return --return\ -rprogress --rprogress\ -skip --skip\ -u --u\ -status --status\ -_u --_u\ -_status --_status\ -while --while\ -array --array\ -array_fade --array_fade\ -array_mirror --array_mirror\ -array_random --array_random\ -frame --frame\ -frame_blur --frame_blur\ -frame_cube --frame_cube\ -frame_fuzzy --frame_fuzzy\ -frame_painting --frame_painting\ -frame_pattern --frame_pattern\ -frame_round --frame_round\ -frame_x --frame_x\ -frame_xy --frame_xy\ -frame_xyz --frame_xyz\ -frame_y --frame_y\ -img2ascii --img2ascii\ -imagegrid --imagegrid\ -imagegrid_hexagonal --imagegrid_hexagonal\ -imagegrid_triangular --imagegrid_triangular\ -linearize_tiles --linearize_tiles\ -map_sprites --map_sprites\ -pack --pack\ -puzzle --puzzle\ -quadratize_tiles --quadratize_tiles\ -rotate_tiles --rotate_tiles\ -shift_tiles --shift_tiles\ -taquin --taquin\ -tunnel --tunnel\ -boxfitting --boxfitting\ -cartoon --cartoon\ -color_ellipses --color_ellipses\ -cubism --cubism\ -draw_whirl --draw_whirl\ -drawing --drawing\ -drop_shadow --drop_shadow\ -ellipsionism --ellipsionism\ -fire_edges --fire_edges\ -fractalize --fractalize\ -glow --glow\ -halftone --halftone\ -hardsketchbw --hardsketchbw\ -hearts --hearts\ -houghsketchbw --houghsketchbw\ -lightrays --lightrays\ -light_relief --light_relief\ -mosaic --mosaic\ -old_photo --old_photo\ -pencilbw --pencilbw\ -polaroid --polaroid\ -polygonize --polygonize\ -poster_edges --poster_edges\ -poster_hope --poster_hope\ -rodilius --rodilius\ -stained_glass --stained_glass\ -stars --stars\ -sketchbw --sketchbw\ -sponge --sponge\ -stencil --stencil\ -stencilbw --stencilbw\ -tetris --tetris\ -warhol --warhol\ -weave --weave\ -whirls --whirls\ -euclidean2polar --euclidean2polar\ -deform --deform\ -fisheye --fisheye\ -flower --flower\ -kaleidoscope --kaleidoscope\ -map_sphere --map_sphere\ -polar2euclidean --polar2euclidean\ -raindrops --raindrops\ -ripple --ripple\ -rotoidoscope --rotoidoscope\ -symmetrize --symmetrize\ -transform_polar --transform_polar\ -twirl --twirl\ -warp_perspective --warp_perspective\ -water --water\ -wave --wave\ -wind --wind\ -zoom --zoom\ -cracks --cracks\ -light_patch --light_patch\ -noise_hurl --noise_hurl\ -pixelize --pixelize\ -scanlines --scanlines\ -shade_stripes --shade_stripes\ -shadow_patch --shadow_patch\ -spread --spread\ -stripes_y --stripes_y\ -texturize_canvas --texturize_canvas\ -texturize_paper --texturize_paper\ -vignette --vignette\ -watermark_visible --watermark_visible\ -blend --blend\ -blend_edges --blend_edges\ -blend_fade --blend_fade\ -blend_median --blend_median\ -blend_seamless --blend_seamless\ -fade_diamond --fade_diamond\ -fade_linear --fade_linear\ -fade_radial --fade_radial\ -fade_x --fade_x\ -fade_y --fade_y\ -fade_z --fade_z\ -sub_alpha --sub_alpha\ -animate --animate\ -apply_camera --apply_camera\ -apply_files --apply_files\ -apply_video --apply_video\ -average_video --average_video\ -files2video --files2video\ -morph --morph\ -register_nonrigid --register_nonrigid\ -register_rigid --register_rigid\ -transition --transition\ -transition3d --transition3d\ -video2files --video2files\ -output_pink3d --output_pink3d\ -pink --pink\ -pink_grayskel --pink_grayskel\ -pink_heightmaxima --pink_heightmaxima\ -pink_heightminima --pink_heightminima\ -pink_htkern --pink_htkern\ -pink_lvkern --pink_lvkern\ -pink_reg_minima --pink_reg_minima\ -pink_skelcurv --pink_skelcurv\ -pink_skelend --pink_skelend\ -pink_skeleton --pink_skeleton\ -pink_skelpar --pink_skelpar\ -pink_wshed --pink_wshed\ -alert --alert\ -arg --arg\ -arg2var --arg2var\ -at --at\ -autocrop_coords --autocrop_coords\ -average_color --average_color\ -basename --basename\ -bin --bin\ -bin2dec --bin2dec\ -dec --dec\ -dec2str --dec2str\ -dec2bin --dec2bin\ -dec2hex --dec2hex\ -dec2oct --dec2oct\ -fact --fact\ -fibonacci --fibonacci\ -file_mv --file_mv\ -file_rand --file_rand\ -file_rm --file_rm\ -filename --filename\ -files --files\ -fitratio_wh --fitratio_wh\ -fitscreen --fitscreen\ -fps --fps\ -gcd --gcd\ -head --head\ -hex --hex\ -hex2dec --hex2dec\ -hex2str --hex2str\ -img2str --img2str\ -img2text --img2text\ -img82hex --img82hex\ -hex2img8 --hex2img8\ -is_3d --is_3d\ -is_image_arg --is_image_arg\ -is_percent --is_percent\ -is_windows --is_windows\ -mad --mad\ -max_w --max_w\ -max_h --max_h\ -max_d --max_d\ -max_s --max_s\ -max_wh --max_wh\ -max_whd --max_whd\ -max_whds --max_whds\ -med --med\ -color_med --color_med\ -min_w --min_w\ -min_h --min_h\ -min_d --min_d\ -min_s --min_s\ -min_wh --min_wh\ -min_whd --min_whd\ -min_whds --min_whds\ -normalize_filename --normalize_filename\ -oct --oct\ -oct2dec --oct2dec\ -padint --padint\ -path_gimp --path_gimp\ -path_tmp --path_tmp\ -path_rc --path_rc\ -quote --quote\ -region_feature --region_feature\ -reset --reset\ -RGB --RGB\ -RGBA --RGBA\ -str --str\ -str2hex --str2hex\ -stresc --stresc\ -strcat --strcat\ -strcmp --strcmp\ -strcontains --strcontains\ -strlen --strlen\ -strreplace --strreplace\ -struncase --struncase\ -strver --strver\ -tic --tic\ -toc --toc\ -std_noise --std_noise\ -demo --demo\ -x_2048 --x_2048\ -x_blobs --x_blobs\ -x_bouncing --x_bouncing\ -x_color_curves --x_color_curves\ -x_colorize --x_colorize\ -x_fire --x_fire\ -x_fireworks --x_fireworks\ -x_fisheye --x_fisheye\ -x_fourier --x_fourier\ -x_histogram --x_histogram\ -x_hough --x_hough\ -x_jawbreaker --x_jawbreaker\ -x_landscape --x_landscape\ -x_life --x_life\ -x_light --x_light\ -x_mandelbrot --x_mandelbrot\ -x_metaballs3d --x_metaballs3d\ -x_minesweeper --x_minesweeper\ -x_minimal_path --x_minimal_path\ -x_pacman --x_pacman\ -x_paint --x_paint\ -x_plasma --x_plasma\ -x_quantize_rgb --x_quantize_rgb\ -x_reflection3d --x_reflection3d\ -x_rubber3d --x_rubber3d\ -x_segment --x_segment\ -x_select_color --x_select_color\ -x_select_function1d --x_select_function1d\ -x_select_palette --x_select_palette\ -x_shadebobs --x_shadebobs\ -x_spline --x_spline\ -x_tetris --x_tetris\ -x_tictactoe --x_tictactoe\ -x_waves --x_waves\ -x_whirl --x_whirl\ " coms="\ debug\ h\ help\ version\ camera\ m\ command\ cursor\ d\ display\ d0\ display0\ d3d\ display3d\ da\ display_array\ dfft\ display_fft\ dg\ display_graph\ dh\ display_histogram\ display_parametric\ dp\ display_polar\ drgba\ display_rgba\ dt\ display_tensors\ dw\ display_warp\ document_gmic\ e\ echo\ echo_file\ echo_stdout\ function1d\ gmicky\ gmicky_wilber\ i\ input\ ig\ input_glob\ input_gpl\ o\ output\ output_ggr\ on\ outputn\ op\ outputp\ ow\ outputw\ ox\ outputx\ pass\ plot\ p\ print\ rainbow_lut\ roddy\ select\ serialize\ shape_heart\ shape_circle\ shape_cupid\ shape_diamond\ shape_polygon\ shape_star\ sh\ shared\ srand\ testimage2d\ uncommand\ uniform_distribution\ unserialize\ up\ update\ v\ verbose\ wait\ warn\ w\ window\ k\ keep\ mv\ move\ nm\ name\ nms\ names\ rm\ remove\ remove_duplicates\ remove_empty\ rv\ reverse\ sort_list\ sort_str\ abs\ acos\ +\ add\ &\ and\ asin\ atan\ atan2\ <<\ bsl\ >>\ bsr\ cos\ cosh\ /\ div\ div_complex\ ==\ eq\ exp\ >=\ ge\ >\ gt\ <=\ le\ <\ lt\ log\ log10\ log2\ max\ //\ mdiv\ min\ %\ mod\ **\ mmul\ *\ mul\ mul_channels\ mul_complex\ !=\ neq\ |\ or\ ^\ pow\ rol\ ror\ sign\ sin\ sinc\ sinh\ sqr\ sqrt\ -\ sub\ tan\ tanh\ xor\ apply_curve\ apply_gamma\ balance_gamma\ complex2polar\ compress_rle\ cumulate\ c\ cut\ discard\ eigen2tensor\ endian\ equalize\ f\ fill\ float2int8\ int82float\ index\ ir\ inrange\ map\ map_clut\ mix_channels\ negative\ noise\ normlp\ norm\ n\ normalize\ normalize_sum\ not\ orientation\ oneminus\ otsu\ polar2complex\ quantize\ rand\ replace\ replace_inf\ replace_nan\ replace_seq\ replace_str\ round\ roundify\ =\ set\ threshold\ uncompress_rle\ unrepeat\ vector2tensor\ ac\ apply_channels\ autoindex\ bayer2rgb\ cmy2rgb\ cmyk2rgb\ colormap\ compose_channels\ direction2rgb\ ditheredbw\ fc\ fill_color\ gradient2rgb\ hsi2rgb\ hsi82rgb\ hsl2rgb\ hsl82rgb\ hsv2rgb\ hsv82rgb\ int2rgb\ lab2lch\ lab2rgb\ lab82rgb\ lch2lab\ lch2rgb\ lch82rgb\ luminance\ mix_rgb\ pseudogray\ replace_color\ rgb2bayer\ rgb2cmy\ rgb2cmyk\ rgb2hsi\ rgb2hsi8\ rgb2hsl\ rgb2hsl8\ rgb2hsv\ rgb2hsv8\ rgb2lab\ rgb2lab8\ rgb2lch\ rgb2lch8\ rgb2luv\ rgb2int\ rgb2srgb\ rgb2xyz\ rgb2xyz8\ rgb2yiq\ rgb2yiq8\ rgb2ycbcr\ rgb2yuv\ rgb2yuv8\ remove_opacity\ select_color\ sepia\ solarize\ split_colors\ split_opacity\ srgb2rgb\ to_a\ to_color\ to_colormode\ to_gray\ to_graya\ to_pseudogray\ to_rgb\ to_rgba\ transfer_colors\ transfer_rgb\ xyz2rgb\ xyz82rgb\ ycbcr2rgb\ yiq2rgb\ yiq82rgb\ yuv2rgb\ yuv82rgb\ a\ append\ append_tiles\ autocrop\ autocrop_components\ autocrop_seq\ channels\ columns\ z\ crop\ diagonal\ elevate\ expand_x\ expand_xy\ expand_xyz\ expand_y\ expand_z\ montage\ mirror\ permute\ r\ resize\ resize_pow2\ rr2d\ resize_ratio2d\ r2dx\ resize2dx\ r2dy\ resize2dy\ r3dx\ resize3dx\ r3dy\ resize3dy\ r3dz\ resize3dz\ rotate\ rotate_tileable\ rows\ scale2x\ scale3x\ scale_dcci2x\ seamcarve\ shift\ shrink_x\ shrink_xy\ shrink_xyz\ shrink_y\ shrink_z\ slices\ sort\ s\ split\ split_tiles\ y\ unroll\ upscale_smart\ warp\ bandpass\ bilateral\ b\ blur\ blur_angular\ blur_linear\ blur_radial\ blur_selective\ blur_x\ blur_xy\ blur_xyz\ blur_y\ blur_z\ boxfilter\ compose_freq\ convolve\ convolve_fft\ correlate\ cross_correlation\ curvature\ dct\ deblur\ deblur_goldmeinel\ deblur_richardsonlucy\ deconvolve_fft\ deinterlace\ denoise\ denoise_haar\ deriche\ dilate\ dilate_circ\ dilate_oct\ dilate_threshold\ divergence\ dog\ diffusiontensors\ edges\ erode\ erode_circ\ erode_oct\ erode_threshold\ fft\ g\ gradient\ gradient_norm\ gradient_orientation\ guided\ haar\ heat_flow\ hessian\ idct\ iee\ ifft\ ihaar\ inn\ inpaint\ inpaint_flow\ inpaint_gaussian\ inpaint_holes\ inpaint_morpho\ inpaint_patchmatch\ kuwahara\ laplacian\ lic\ map_tones\ map_tones_fast\ meancurvature_flow\ median\ nlmeans\ nlmeans_core\ normalize_local\ normalized_cross_correlation\ peronamalik_flow\ phase_correlation\ pde_flow\ periodize_poisson\ red_eye\ remove_hotpixels\ remove_pixels\ sharpen\ smooth\ split_freq\ solve_poisson\ split_details\ structuretensors\ syntexturize\ syntexturize_patchmatch\ tv_flow\ unsharp\ unsharp_octave\ vanvliet\ watermark_fourier\ watershed\ area\ area_fg\ at_line\ barycenter\ detect_skin\ displacement\ distance\ float2fft8\ fft82float\ fftpolar\ histogram\ histogram_nd\ histogram_cumul\ histogram_pointwise\ hough\ ifftpolar\ isophotes\ label\ label_fg\ max_patch\ min_patch\ minimal_path\ mse\ patches\ patchmatch\ plot2value\ pointcloud\ psnr\ segment_watershed\ skeleton\ ssd_patch\ thinning\ tones\ topographic_map\ variance_patch\ axes\ ball\ chessboard\ cie1931\ circle\ ellipse\ flood\ gaussian\ graph\ grid\ j\ image\ line\ mandelbrot\ marble\ maze\ maze_mask\ j3d\ object3d\ pack_sprites\ piechart\ plasma\ point\ polka_dots\ polygon\ quiver\ rectangle\ rorschach\ sierpinski\ snowflake\ spiralbw\ spline\ tetraedron_shade\ t\ text\ text_outline\ triangle_shade\ truchet\ turbulence\ yinyang\ dijkstra\ eigen\ invert\ solve\ svd\ transpose\ trisolve\ +3d\ add3d\ animate3d\ apply_camera3d\ array3d\ arrow3d\ axes3d\ box3d\ c3d\ center3d\ circle3d\ circles3d\ col3d\ color3d\ colorcube3d\ cone3d\ cubes3d\ cup3d\ cylinder3d\ delaunay3d\ distribution3d\ /3d\ div3d\ db3d\ double3d\ elevation3d\ empty3d\ extrude3d\ f3d\ focale3d\ gaussians3d\ gmic3d\ gyroid3d\ histogram3d\ image6cube3d\ imageblocks3d\ imagecube3d\ imageplane3d\ imagepyramid3d\ imagerubik3d\ imagesphere3d\ isoline3d\ isosurface3d\ label3d\ label_points3d\ lathe3d\ l3d\ light3d\ line3d\ lissajous3d\ m3d\ mode3d\ md3d\ moded3d\ *3d\ mul3d\ n3d\ normalize3d\ o3d\ opacity3d\ parametric3d\ pca_patch3d\ plane3d\ point3d\ pointcloud3d\ pose3d\ p3d\ primitives3d\ projections3d\ pyramid3d\ quadrangle3d\ random3d\ rv3d\ reverse3d\ r3d\ rotate3d\ rotation3d\ sierpinski3d\ size3d\ skeleton3d\ snapshot3d\ sl3d\ specl3d\ ss3d\ specs3d\ sphere3d\ spherical3d\ spline3d\ s3d\ split3d\ sprite3d\ sprites3d\ star3d\ streamline3d\ -3d\ sub3d\ superformula3d\ text_pointcloud3d\ text3d\ t3d\ texturize3d\ torus3d\ triangle3d\ volume3d\ weird3d\ ap\ apply_parallel\ apc\ apply_parallel_channels\ apo\ apply_parallel_overlap\ apply_timeout\ check\ check3d\ continue\ break\ do\ done\ elif\ else\ endif\ endl\ endlocal\ error\ x\ exec\ if\ l\ local\ mutex\ noarg\ onfail\ parallel\ progress\ q\ quit\ repeat\ return\ rprogress\ skip\ u\ status\ _u\ _status\ while\ array\ array_fade\ array_mirror\ array_random\ frame\ frame_blur\ frame_cube\ frame_fuzzy\ frame_painting\ frame_pattern\ frame_round\ frame_x\ frame_xy\ frame_xyz\ frame_y\ img2ascii\ imagegrid\ imagegrid_hexagonal\ imagegrid_triangular\ linearize_tiles\ map_sprites\ pack\ puzzle\ quadratize_tiles\ rotate_tiles\ shift_tiles\ taquin\ tunnel\ boxfitting\ cartoon\ color_ellipses\ cubism\ draw_whirl\ drawing\ drop_shadow\ ellipsionism\ fire_edges\ fractalize\ glow\ halftone\ hardsketchbw\ hearts\ houghsketchbw\ lightrays\ light_relief\ mosaic\ old_photo\ pencilbw\ polaroid\ polygonize\ poster_edges\ poster_hope\ rodilius\ stained_glass\ stars\ sketchbw\ sponge\ stencil\ stencilbw\ tetris\ warhol\ weave\ whirls\ euclidean2polar\ deform\ fisheye\ flower\ kaleidoscope\ map_sphere\ polar2euclidean\ raindrops\ ripple\ rotoidoscope\ symmetrize\ transform_polar\ twirl\ warp_perspective\ water\ wave\ wind\ zoom\ cracks\ light_patch\ noise_hurl\ pixelize\ scanlines\ shade_stripes\ shadow_patch\ spread\ stripes_y\ texturize_canvas\ texturize_paper\ vignette\ watermark_visible\ blend\ blend_edges\ blend_fade\ blend_median\ blend_seamless\ fade_diamond\ fade_linear\ fade_radial\ fade_x\ fade_y\ fade_z\ sub_alpha\ animate\ apply_camera\ apply_files\ apply_video\ average_video\ files2video\ morph\ register_nonrigid\ register_rigid\ transition\ transition3d\ video2files\ output_pink3d\ pink\ pink_grayskel\ pink_heightmaxima\ pink_heightminima\ pink_htkern\ pink_lvkern\ pink_reg_minima\ pink_skelcurv\ pink_skelend\ pink_skeleton\ pink_skelpar\ pink_wshed\ alert\ arg\ arg2var\ at\ autocrop_coords\ average_color\ basename\ bin\ bin2dec\ dec\ dec2str\ dec2bin\ dec2hex\ dec2oct\ fact\ fibonacci\ file_mv\ file_rand\ file_rm\ filename\ files\ fitratio_wh\ fitscreen\ fps\ gcd\ head\ hex\ hex2dec\ hex2str\ img2str\ img2text\ img82hex\ hex2img8\ is_3d\ is_image_arg\ is_percent\ is_windows\ mad\ max_w\ max_h\ max_d\ max_s\ max_wh\ max_whd\ max_whds\ med\ color_med\ min_w\ min_h\ min_d\ min_s\ min_wh\ min_whd\ min_whds\ normalize_filename\ oct\ oct2dec\ padint\ path_gimp\ path_tmp\ path_rc\ quote\ region_feature\ reset\ RGB\ RGBA\ str\ str2hex\ stresc\ strcat\ strcmp\ strcontains\ strlen\ strreplace\ struncase\ strver\ tic\ toc\ std_noise\ demo\ x_2048\ x_blobs\ x_bouncing\ x_color_curves\ x_colorize\ x_fire\ x_fireworks\ x_fisheye\ x_fourier\ x_histogram\ x_hough\ x_jawbreaker\ x_landscape\ x_life\ x_light\ x_mandelbrot\ x_metaballs3d\ x_minesweeper\ x_minimal_path\ x_pacman\ x_paint\ x_plasma\ x_quantize_rgb\ x_reflection3d\ x_rubber3d\ x_segment\ x_select_color\ x_select_function1d\ x_select_palette\ x_shadebobs\ x_spline\ x_tetris\ x_tictactoe\ x_waves\ x_whirl\ " case "${prev}" in "-help" | "--help") COMPREPLY=( $(compgen -W "$coms" -- "$cur") ) return 0 ;; "-camera" | "--camera") COMPREPLY=( $(compgen -W "_camera_index>=0,_nb_frames>0,_skip_frames>=0,_capture_width>=0,_capture_height>=0 >") ) return 0 ;; "-cursor" | "--cursor") COMPREPLY=( $(compgen -W "_mode={0=hide|1=show} >") ) return 0 ;; "-display" | "--display") COMPREPLY=( $(compgen -W "_X>=0,_Y>=0,_Z>=0,_exit_on_anykey={0|1} >") ) return 0 ;; "-display3d" | "--display3d") COMPREPLY=( $(compgen -W "_[background_image],_exit_on_anykey={0|1} _exit_on_anykey={0|1}") ) return 0 ;; "-display_array" | "--display_array") COMPREPLY=( $(compgen -W "_width>0,_height>0 >") ) return 0 ;; "-display_graph" | "--display_graph") COMPREPLY=( $(compgen -W "_width>32,_height>32,_plot_type,_vertex_type,_xmin,_xmax,_ymin,_ymax,_xlabel,_ylabel >") ) return 0 ;; "-display_histogram" | "--display_histogram") COMPREPLY=( $(compgen -W "_width>0,_height>0,_clusters>0,_min_value[%],_max_value[%],_show_axes={0|1},_expression. >") ) return 0 ;; "-display_parametric" | "--display_parametric") COMPREPLY=( $(compgen -W "_width>0,_height>0,_outline_opacity,_vertex_radius>=0,_is_antialiased={0|1},_is_decorated={0|1},_xlabel,_ylabel >") ) return 0 ;; "-display_polar" | "--display_polar") COMPREPLY=( $(compgen -W "_width>32,_height>32,_outline_type,_fill_R,_fill_G,_fill_B,_theta_start,_theta_end,_xlabel,_ylabel >") ) return 0 ;; "-display_tensors" | "--display_tensors") COMPREPLY=( $(compgen -W "_size_factor>0,_ellipse_factor>=0,_colored_mode={0|1} >") ) return 0 ;; "-display_warp" | "--display_warp") COMPREPLY=( $(compgen -W "_cell_size>0 >") ) return 0 ;; "-document_gmic" | "--document_gmic") COMPREPLY=( $(compgen -W "_format={ascii|bash|html|images|latex},_image_path,_write_wrapper={0|1} >") ) return 0 ;; "-echo" | "--echo") COMPREPLY=( $(compgen -W "message >") ) return 0 ;; "-echo_file" | "--echo_file") COMPREPLY=( $(compgen -W "filename,message >") ) return 0 ;; "-echo_stdout" | "--echo_stdout") COMPREPLY=( $(compgen -W "message >") ) return 0 ;; "-function1d" | "--function1d") COMPREPLY=( $(compgen -W "0<=smoothness<=1,x0>=0,y0,x1>=0,y1,...,xn>=0,yn >") ) return 0 ;; "-input_glob" | "--input_glob") COMPREPLY=( $(compgen -W "pattern >") ) return 0 ;; "-input_gpl" | "--input_gpl") COMPREPLY=( $(compgen -W "filename >") ) return 0 ;; "-output_ggr" | "--output_ggr") COMPREPLY=( $(compgen -W "filename,_gradient_name >") ) return 0 ;; "-outputn" | "--outputn") COMPREPLY=( $(compgen -W "filename >") ) return 0 ;; "-outputp" | "--outputp") COMPREPLY=( $(compgen -W "prefix >") ) return 0 ;; "-outputx" | "--outputx") COMPREPLY=( $(compgen -W "extension1,_extension2,_...,_extensionN,_output_at_same_location={0|1} >") ) return 0 ;; "-pass" | "--pass") COMPREPLY=( $(compgen -W "_shared_state={0=non-shared(copy)|1=shared|2=adaptive} >") ) return 0 ;; "-plot" | "--plot") COMPREPLY=( $(compgen -W "_plot_type,_vertex_type,_xmin,_xmax,_ymin,_ymax,_exit_on_anykey={0|1} 'formula',_resolution>=0,_plot_type,_vertex_type,_xmin,xmax,_ymin,_ymax,_exit_on_anykey={0|1}") ) return 0 ;; "-select" | "--select") COMPREPLY=( $(compgen -W "feature_type,_X,_Y,_Z,_exit_on_anykey={0|1} >") ) return 0 ;; "-serialize" | "--serialize") COMPREPLY=( $(compgen -W "_datatype,_is_compressed={0|1},_store_names={0|1} >") ) return 0 ;; "-shape_heart" | "--shape_heart") COMPREPLY=( $(compgen -W "_size>=0 >") ) return 0 ;; "-shape_circle" | "--shape_circle") COMPREPLY=( $(compgen -W "_size>=0 >") ) return 0 ;; "-shape_cupid" | "--shape_cupid") COMPREPLY=( $(compgen -W "_size>=0 >") ) return 0 ;; "-shape_diamond" | "--shape_diamond") COMPREPLY=( $(compgen -W "_size>=0 >") ) return 0 ;; "-shape_polygon" | "--shape_polygon") COMPREPLY=( $(compgen -W "_size>=0,_nb_vertices>=3,_angle >") ) return 0 ;; "-shape_star" | "--shape_star") COMPREPLY=( $(compgen -W "_size>=0,_nb_branches>0,0<=_thickness<=1 >") ) return 0 ;; "-shared" | "--shared") COMPREPLY=( $(compgen -W "x0[%],x1[%],y[%],z[%],v[%] y0[%],y1[%],z[%],v[%] z0[%],z1[%],v[%] v0[%],v1[%] v0[%] (noarg)") ) return 0 ;; "-srand" | "--srand") COMPREPLY=( $(compgen -W "value (noarg)") ) return 0 ;; "-testimage2d" | "--testimage2d") COMPREPLY=( $(compgen -W "_width>0,_height>0,_spectrum>0 >") ) return 0 ;; "-uncommand" | "--uncommand") COMPREPLY=( $(compgen -W "command_name[,_command_name2,...] *") ) return 0 ;; "-uniform_distribution" | "--uniform_distribution") COMPREPLY=( $(compgen -W "nb_levels>=1,spectrum>=1 >") ) return 0 ;; "-verbose" | "--verbose") COMPREPLY=( $(compgen -W "level {+|-}") ) return 0 ;; "-wait" | "--wait") COMPREPLY=( $(compgen -W "delay (noarg)") ) return 0 ;; "-warn" | "--warn") COMPREPLY=( $(compgen -W "_force_visible={0|1},_message >") ) return 0 ;; "-window" | "--window") COMPREPLY=( $(compgen -W "_width[%]>=-1,_height[%]>=-1,_normalization,_fullscreen,_pos_x[%],_pos_y[%],_title >") ) return 0 ;; "-move" | "--move") COMPREPLY=( $(compgen -W "position[%] >") ) return 0 ;; "-name" | "--name") COMPREPLY=( $(compgen -W ""name" >") ) return 0 ;; "-names" | "--names") COMPREPLY=( $(compgen -W "name1,name2,...,nameN >") ) return 0 ;; "-sort_list" | "--sort_list") COMPREPLY=( $(compgen -W "_ordering={+|-},_criterion >") ) return 0 ;; "-add" | "--add") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-and" | "--and") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-atan2" | "--atan2") COMPREPLY=( $(compgen -W "[x_argument] >") ) return 0 ;; "-bsl" | "--bsl") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-bsr" | "--bsr") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-div" | "--div") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-div_complex" | "--div_complex") COMPREPLY=( $(compgen -W "[divider_real,divider_imag],_epsilon>=0 >") ) return 0 ;; "-eq" | "--eq") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-ge" | "--ge") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-gt" | "--gt") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-le" | "--le") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-lt" | "--lt") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-max" | "--max") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-mdiv" | "--mdiv") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-min" | "--min") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-mod" | "--mod") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-mmul" | "--mmul") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-mul" | "--mul") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-mul_channels" | "--mul_channels") COMPREPLY=( $(compgen -W "value1,_value2,...,_valueN >") ) return 0 ;; "-mul_complex" | "--mul_complex") COMPREPLY=( $(compgen -W "[multiplier_real,multiplier_imag] >") ) return 0 ;; "-neq" | "--neq") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-or" | "--or") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-pow" | "--pow") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-rol" | "--rol") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-ror" | "--ror") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-sub" | "--sub") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-xor" | "--xor") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-apply_curve" | "--apply_curve") COMPREPLY=( $(compgen -W "0<=smoothness<=1,x0,y0,x1,y1,x2,y2,...,xN,yN >") ) return 0 ;; "-apply_gamma" | "--apply_gamma") COMPREPLY=( $(compgen -W "gamma>=0 >") ) return 0 ;; "-balance_gamma" | "--balance_gamma") COMPREPLY=( $(compgen -W "_ref_color1,... >") ) return 0 ;; "-compress_rle" | "--compress_rle") COMPREPLY=( $(compgen -W "_is_binary_data={0|1},_maximum_sequence_length>=0 >") ) return 0 ;; "-cumulate" | "--cumulate") COMPREPLY=( $(compgen -W "{x|y|z|c}..{x|y|z|c} (noarg)") ) return 0 ;; "-cut" | "--cut") COMPREPLY=( $(compgen -W "{value0[%]|[image0]},{value1[%]|[image1]} [image] (noarg)") ) return 0 ;; "-discard" | "--discard") COMPREPLY=( $(compgen -W "_value1,_value2,... {x|y|z|c}..{x|y|z|c},_value1,_value2,... (noargs)") ) return 0 ;; "-endian" | "--endian") COMPREPLY=( $(compgen -W "_datatype >") ) return 0 ;; "-equalize" | "--equalize") COMPREPLY=( $(compgen -W "_nb_levels>0[%],_value_min[%],_value_max[%] >") ) return 0 ;; "-fill" | "--fill") COMPREPLY=( $(compgen -W "value1,_value2,.. [image] 'formula'") ) return 0 ;; "-index" | "--index") COMPREPLY=( $(compgen -W "{[palette]|predefined_palette},0<=_dithering<=1,_map_palette={0|1} >") ) return 0 ;; "-inrange" | "--inrange") COMPREPLY=( $(compgen -W "min[%],max[%] >") ) return 0 ;; "-map" | "--map") COMPREPLY=( $(compgen -W "[palette],_boundary predefined_palette,_boundary") ) return 0 ;; "-map_clut" | "--map_clut") COMPREPLY=( $(compgen -W "[clut] >") ) return 0 ;; "-mix_channels" | "--mix_channels") COMPREPLY=( $(compgen -W "(a00,...,aMN) >") ) return 0 ;; "-noise" | "--noise") COMPREPLY=( $(compgen -W "std_variation>=0[%],_noise_type >") ) return 0 ;; "-normlp" | "--normlp") COMPREPLY=( $(compgen -W "p>=0 >") ) return 0 ;; "-normalize" | "--normalize") COMPREPLY=( $(compgen -W "{value0[%]|[image0]},{value1[%]|[image1]} [image]") ) return 0 ;; "-otsu" | "--otsu") COMPREPLY=( $(compgen -W "_nb_levels>0 >") ) return 0 ;; "-quantize" | "--quantize") COMPREPLY=( $(compgen -W "nb_levels>=1,_keep_values={0|1},_is_uniform={0|1} >") ) return 0 ;; "-rand" | "--rand") COMPREPLY=( $(compgen -W "{value0[%]|[image0]},_{value1[%]|[image1]} [image]") ) return 0 ;; "-replace" | "--replace") COMPREPLY=( $(compgen -W "value_src,value_dest >") ) return 0 ;; "-replace_inf" | "--replace_inf") COMPREPLY=( $(compgen -W "_expression >") ) return 0 ;; "-replace_nan" | "--replace_nan") COMPREPLY=( $(compgen -W "_expression >") ) return 0 ;; "-replace_seq" | "--replace_seq") COMPREPLY=( $(compgen -W ""search_seq","replace_seq" >") ) return 0 ;; "-replace_str" | "--replace_str") COMPREPLY=( $(compgen -W ""search_str","replace_str" >") ) return 0 ;; "-round" | "--round") COMPREPLY=( $(compgen -W "rounding_value>=0,_rounding_type (noarg)") ) return 0 ;; "-roundify" | "--roundify") COMPREPLY=( $(compgen -W "gamma>=0 >") ) return 0 ;; "-set" | "--set") COMPREPLY=( $(compgen -W "value,_x[%],_y[%],_z[%],_c[%] >") ) return 0 ;; "-threshold" | "--threshold") COMPREPLY=( $(compgen -W "value[%],_is_soft={0|1} (noarg)") ) return 0 ;; "-apply_channels" | "--apply_channels") COMPREPLY=( $(compgen -W ""command",channels,_value_action={0=none|1=cut|2=normalize} >") ) return 0 ;; "-autoindex" | "--autoindex") COMPREPLY=( $(compgen -W "nb_colors>0,0<=_dithering<=1,_method={0=median-cut|1=k-means} >") ) return 0 ;; "-bayer2rgb" | "--bayer2rgb") COMPREPLY=( $(compgen -W "_GM_smoothness,_RB_smoothness1,_RB_smoothness2 >") ) return 0 ;; "-colormap" | "--colormap") COMPREPLY=( $(compgen -W "nb_levels>=0,_method={0=median-cut|1=k-means},_sort_vectors={0|1} >") ) return 0 ;; "-fill_color" | "--fill_color") COMPREPLY=( $(compgen -W "col1,...,colN >") ) return 0 ;; "-gradient2rgb" | "--gradient2rgb") COMPREPLY=( $(compgen -W "_is_orientation={0|1} >") ) return 0 ;; "-mix_rgb" | "--mix_rgb") COMPREPLY=( $(compgen -W "a11,a12,a13,a21,a22,a23,a31,a32,a33 >") ) return 0 ;; "-pseudogray" | "--pseudogray") COMPREPLY=( $(compgen -W "_max_increment>=0,_JND_threshold>=0,_bits_depth>0 >") ) return 0 ;; "-replace_color" | "--replace_color") COMPREPLY=( $(compgen -W "tolerance[%]>=0,smoothness[%]>=0,src1,src2,...,dest1,dest2,... >") ) return 0 ;; "-rgb2bayer" | "--rgb2bayer") COMPREPLY=( $(compgen -W "_start_pattern=0,_color_grid=0 >") ) return 0 ;; "-select_color" | "--select_color") COMPREPLY=( $(compgen -W "tolerance[%]>=0,col1,..,colN >") ) return 0 ;; "-split_colors" | "--split_colors") COMPREPLY=( $(compgen -W "_tolerance>=0,_max_nb_outputs>0,_min_area>0 >") ) return 0 ;; "-to_colormode" | "--to_colormode") COMPREPLY=( $(compgen -W "mode={0=adaptive|1=G|2=GA|3=RGB|4=RGBA} >") ) return 0 ;; "-to_pseudogray" | "--to_pseudogray") COMPREPLY=( $(compgen -W "_max_step>=0,_is_perceptual_constraint={0|1},_bits_depth>0 >") ) return 0 ;; "-transfer_colors" | "--transfer_colors") COMPREPLY=( $(compgen -W "[reference_image],_transfer_brightness={0|1} >") ) return 0 ;; "-transfer_rgb" | "--transfer_rgb") COMPREPLY=( $(compgen -W "[target],_gamma>=0,_regularization>=0,_luminosity_constraints>=0,_rgb_resolution>=0,_is_constraints={0|1} >") ) return 0 ;; "-append" | "--append") COMPREPLY=( $(compgen -W "[image],axis,_centering axis,_centering") ) return 0 ;; "-append_tiles" | "--append_tiles") COMPREPLY=( $(compgen -W "_M>=0,_N>=0,0<=_centering_x<=1,0<=_centering_y<=1 >") ) return 0 ;; "-autocrop" | "--autocrop") COMPREPLY=( $(compgen -W "value1,value2,... (noarg)") ) return 0 ;; "-autocrop_components" | "--autocrop_components") COMPREPLY=( $(compgen -W "_threshold[%],_min_area[%]>=0,_is_high_connectivity={0|1},_output_type={0=crop|1=segmentation|2=coordinates} >") ) return 0 ;; "-autocrop_seq" | "--autocrop_seq") COMPREPLY=( $(compgen -W "value1,value2,...|auto >") ) return 0 ;; "-channels" | "--channels") COMPREPLY=( $(compgen -W "{[image0]|c0[%]},_{[image1]|c1[%]} >") ) return 0 ;; "-columns" | "--columns") COMPREPLY=( $(compgen -W "{[image0]|x0[%]},_{[image1]|x1[%]} >") ) return 0 ;; "-crop" | "--crop") COMPREPLY=( $(compgen -W "x0[%],x1[%],_boundary x0[%],y0[%],x1[%],y1[%],_boundary x0[%],y0[%],z0[%],x1[%],y1[%],z1[%],_boundary x0[%],y0[%],z0[%],c0[%],x1[%],y1[%],z1[%],c1[%],_boundary (noarg)") ) return 0 ;; "-elevate" | "--elevate") COMPREPLY=( $(compgen -W "_depth,_is_plain={0|1},_is_colored={0|1} >") ) return 0 ;; "-expand_x" | "--expand_x") COMPREPLY=( $(compgen -W "size_x>=0,_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-expand_xy" | "--expand_xy") COMPREPLY=( $(compgen -W "size>=0,_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-expand_xyz" | "--expand_xyz") COMPREPLY=( $(compgen -W "size>=0,_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-expand_y" | "--expand_y") COMPREPLY=( $(compgen -W "size_y>=0,_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-expand_z" | "--expand_z") COMPREPLY=( $(compgen -W "size_z>=0,_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-montage" | "--montage") COMPREPLY=( $(compgen -W ""_layout_code",_montage_mode={0<=centering<=1|2<=scale+2<=3},_output_mode={0=singlelayer|1=multiplelayers},"_processing_command" >") ) return 0 ;; "-mirror" | "--mirror") COMPREPLY=( $(compgen -W "{x|y|z}..{x|y|z} >") ) return 0 ;; "-permute" | "--permute") COMPREPLY=( $(compgen -W "permutation_string >") ) return 0 ;; "-resize" | "--resize") COMPREPLY=( $(compgen -W "[image],_interpolation,_boundary,_ax,_ay,_az,_ac {[image_w]|width>0[%]},_{[image_h]|height>0[%]},_{[image_d]|depth>0[%]},_{[image_s]|spectrum>0[%]},_interpolation,_boundary,_ax,_ay,_az,_ac (noarg)") ) return 0 ;; "-resize_pow2" | "--resize_pow2") COMPREPLY=( $(compgen -W "_interpolation,_boundary,_ax,_ay,_az,_ac >") ) return 0 ;; "-resize_ratio2d" | "--resize_ratio2d") COMPREPLY=( $(compgen -W "width>0,height>0,_mode={0=inside|1=outside|2=padded},0=<_interpolation<=6 >") ) return 0 ;; "-resize2dx" | "--resize2dx") COMPREPLY=( $(compgen -W "width[%]>0,_interpolation,_boundary,_ax,_ay,_az,_ac >") ) return 0 ;; "-resize2dy" | "--resize2dy") COMPREPLY=( $(compgen -W "height[%]>=0,_interpolation,_boundary,_ax,_ay,_az,_ac >") ) return 0 ;; "-resize3dx" | "--resize3dx") COMPREPLY=( $(compgen -W "width[%]>0,_interpolation,_boundary,_ax,_ay,_az,_ac >") ) return 0 ;; "-resize3dy" | "--resize3dy") COMPREPLY=( $(compgen -W "height[%]>0,_interpolation,_boundary,_ax,_ay,_az,_ac >") ) return 0 ;; "-resize3dz" | "--resize3dz") COMPREPLY=( $(compgen -W "depth[%]>0,_interpolation,_boundary,_ax,_ay,_az,_ac >") ) return 0 ;; "-rotate" | "--rotate") COMPREPLY=( $(compgen -W "angle,_interpolation,_boundary,_center_x[%],_center_y[%],_zoom >") ) return 0 ;; "-rotate_tileable" | "--rotate_tileable") COMPREPLY=( $(compgen -W "angle,_max_size_factor>=0 >") ) return 0 ;; "-rows" | "--rows") COMPREPLY=( $(compgen -W "{[image0]|y0[%]},_{[image1]|y1[%]} >") ) return 0 ;; "-scale_dcci2x" | "--scale_dcci2x") COMPREPLY=( $(compgen -W "_edge_threshold>=0,_exponent>0,_extend_1px={0=false|1=true} >") ) return 0 ;; "-seamcarve" | "--seamcarve") COMPREPLY=( $(compgen -W "_width[%]>=0,_height[%]>=0,_is_priority_channel={0|1},_is_antialiasing={0|1},_maximum_seams[%]>=0 >") ) return 0 ;; "-shift" | "--shift") COMPREPLY=( $(compgen -W "vx[%],_vy[%],_vz[%],_vc[%],_boundary >") ) return 0 ;; "-shrink_x" | "--shrink_x") COMPREPLY=( $(compgen -W "size_x>=0 >") ) return 0 ;; "-shrink_xy" | "--shrink_xy") COMPREPLY=( $(compgen -W "size>=0 >") ) return 0 ;; "-shrink_xyz" | "--shrink_xyz") COMPREPLY=( $(compgen -W "size>=0 >") ) return 0 ;; "-shrink_y" | "--shrink_y") COMPREPLY=( $(compgen -W "size_y>=0 >") ) return 0 ;; "-shrink_z" | "--shrink_z") COMPREPLY=( $(compgen -W "size_z>=0 >") ) return 0 ;; "-slices" | "--slices") COMPREPLY=( $(compgen -W "{[image0]|z0[%]},_{[image1]|z1[%]} >") ) return 0 ;; "-sort" | "--sort") COMPREPLY=( $(compgen -W "_ordering={+|-},_axis={x|y|z|c} >") ) return 0 ;; "-split" | "--split") COMPREPLY=( $(compgen -W "{x|y|z|c}..{x|y|z|c},_split_mode keep_splitting_values={+|-},_{x|y|z|c}..{x|y|z|c},value1,_value2,... (noargs)") ) return 0 ;; "-split_tiles" | "--split_tiles") COMPREPLY=( $(compgen -W "M!=0,_N!=0,_is_homogeneous={0|1} >") ) return 0 ;; "-unroll" | "--unroll") COMPREPLY=( $(compgen -W "_axis={x|y|z|c} >") ) return 0 ;; "-upscale_smart" | "--upscale_smart") COMPREPLY=( $(compgen -W "width[%],_height[%],_depth,_smoothness>=0,_anisotropy=[0,1],sharpening>=0 >") ) return 0 ;; "-warp" | "--warp") COMPREPLY=( $(compgen -W "[warping_field],_mode,_interpolation,_boundary,_nb_frames>0 >") ) return 0 ;; "-bandpass" | "--bandpass") COMPREPLY=( $(compgen -W "_min_freq[%],_max_freq[%] >") ) return 0 ;; "-bilateral" | "--bilateral") COMPREPLY=( $(compgen -W "[guide],std_variation_s>0[%],std_variation_r[%]>0,_sampling_s>=0,_sampling_r>=0 std_variation_s>0[%],std_variation_r[%]>0,_sampling_s>=0,_sampling_r>=0") ) return 0 ;; "-blur" | "--blur") COMPREPLY=( $(compgen -W "std_variation>=0[%],_boundary,_kernel axes,std_variation>=0[%],_boundary,_kernel") ) return 0 ;; "-blur_angular" | "--blur_angular") COMPREPLY=( $(compgen -W "amplitude[%],_center_x[%],_center_y[%] >") ) return 0 ;; "-blur_linear" | "--blur_linear") COMPREPLY=( $(compgen -W "amplitude1[%],_amplitude2[%],_angle,_boundary={0=dirichlet|1=neumann} >") ) return 0 ;; "-blur_radial" | "--blur_radial") COMPREPLY=( $(compgen -W "amplitude[%],_center_x[%],_center_y[%] >") ) return 0 ;; "-blur_selective" | "--blur_selective") COMPREPLY=( $(compgen -W "sigma>=0,_edges>0,_nb_scales>0 >") ) return 0 ;; "-blur_x" | "--blur_x") COMPREPLY=( $(compgen -W "amplitude[%]>=0,_boundary={0=dirichlet|1=neumann} >") ) return 0 ;; "-blur_xy" | "--blur_xy") COMPREPLY=( $(compgen -W "amplitude_x[%],amplitude_y[%],_boundary={0=dirichlet|1=neumann} >") ) return 0 ;; "-blur_xyz" | "--blur_xyz") COMPREPLY=( $(compgen -W "amplitude_x[%],amplitude_y[%],amplitude_z,_boundary={0=dirichlet|1=neumann} >") ) return 0 ;; "-blur_y" | "--blur_y") COMPREPLY=( $(compgen -W "amplitude[%]>=0,_boundary={0=dirichlet|1=neumann} >") ) return 0 ;; "-blur_z" | "--blur_z") COMPREPLY=( $(compgen -W "amplitude[%]>=0,_boundary={0=dirichlet|1=neumann} >") ) return 0 ;; "-boxfilter" | "--boxfilter") COMPREPLY=( $(compgen -W "size>=0[%],_order,_boundary axes,size>=0[%],_order,_boundary") ) return 0 ;; "-convolve" | "--convolve") COMPREPLY=( $(compgen -W "[mask],_boundary,_is_normalized={0|1} >") ) return 0 ;; "-convolve_fft" | "--convolve_fft") COMPREPLY=( $(compgen -W "[mask] >") ) return 0 ;; "-correlate" | "--correlate") COMPREPLY=( $(compgen -W "[mask],_boundary,_is_normalized={0|1} >") ) return 0 ;; "-cross_correlation" | "--cross_correlation") COMPREPLY=( $(compgen -W "[mask] >") ) return 0 ;; "-dct" | "--dct") COMPREPLY=( $(compgen -W "_{x|y|z}..{x|y|z} (noarg)") ) return 0 ;; "-deblur" | "--deblur") COMPREPLY=( $(compgen -W "amplitude[%]>=0,_nb_iter>=0,_dt>=0,_regul>=0,_regul_type={0=Tikhonov|1=meancurv.|2=TV} >") ) return 0 ;; "-deblur_goldmeinel" | "--deblur_goldmeinel") COMPREPLY=( $(compgen -W "sigma>=0,_nb_iter>=0,_acceleration>=0,_kernel_type={0=quasi-gaussian(faster)|1=gaussian}. >") ) return 0 ;; "-deblur_richardsonlucy" | "--deblur_richardsonlucy") COMPREPLY=( $(compgen -W "sigma>=0,nb_iter>=0,_kernel_type={0=quasi-gaussian(faster)|1=gaussian}. >") ) return 0 ;; "-deconvolve_fft" | "--deconvolve_fft") COMPREPLY=( $(compgen -W "[kernel],_regularization>=0 >") ) return 0 ;; "-deinterlace" | "--deinterlace") COMPREPLY=( $(compgen -W "_method={0|1} >") ) return 0 ;; "-denoise" | "--denoise") COMPREPLY=( $(compgen -W "std_variation_s>=0,_std_variation_p>=0,_patch_size>=0,_lookup_size>=0,_smoothness,_fast_approx={0|1} >") ) return 0 ;; "-denoise_haar" | "--denoise_haar") COMPREPLY=( $(compgen -W "_threshold>=0,_nb_scales>=0,_cycle_spinning>0 >") ) return 0 ;; "-deriche" | "--deriche") COMPREPLY=( $(compgen -W "std_variation>=0[%],order={0|1|2},axis={x|y|z|c},_boundary >") ) return 0 ;; "-dilate" | "--dilate") COMPREPLY=( $(compgen -W "size>=0 size_x>=0,size_y>=0,size_z>=0 [mask],_boundary,_is_normalized={0|1}") ) return 0 ;; "-dilate_circ" | "--dilate_circ") COMPREPLY=( $(compgen -W "_size>=0,_boundary,_is_normalized={0|1} >") ) return 0 ;; "-dilate_oct" | "--dilate_oct") COMPREPLY=( $(compgen -W "_size>=0,_boundary,_is_normalized={0|1} >") ) return 0 ;; "-dilate_threshold" | "--dilate_threshold") COMPREPLY=( $(compgen -W "size_x>=1,size_y>=1,size_z>=1,_threshold>=0,_boundary >") ) return 0 ;; "-dog" | "--dog") COMPREPLY=( $(compgen -W "_sigma1>=0[%],_sigma2>=0[%] >") ) return 0 ;; "-diffusiontensors" | "--diffusiontensors") COMPREPLY=( $(compgen -W "_sharpness>=0,0<=_anisotropy<=1,_alpha[%],_sigma[%],is_sqrt={0|1} >") ) return 0 ;; "-edges" | "--edges") COMPREPLY=( $(compgen -W "_threshold[%]>=0 >") ) return 0 ;; "-erode" | "--erode") COMPREPLY=( $(compgen -W "size>=0 size_x>=0,size_y>=0,_size_z>=0 [mask],_boundary,_is_normalized={0|1}") ) return 0 ;; "-erode_circ" | "--erode_circ") COMPREPLY=( $(compgen -W "_size>=0,_boundary,_is_normalized={0|1} >") ) return 0 ;; "-erode_oct" | "--erode_oct") COMPREPLY=( $(compgen -W "_size>=0,_boundary,_is_normalized={0|1} >") ) return 0 ;; "-erode_threshold" | "--erode_threshold") COMPREPLY=( $(compgen -W "size_x>=1,size_y>=1,size_z>=1,_threshold>=0,_boundary >") ) return 0 ;; "-fft" | "--fft") COMPREPLY=( $(compgen -W "_{x|y|z}..{x|y|z} >") ) return 0 ;; "-gradient" | "--gradient") COMPREPLY=( $(compgen -W "{x|y|z}..{x|y|z},_scheme (noarg)") ) return 0 ;; "-gradient_orientation" | "--gradient_orientation") COMPREPLY=( $(compgen -W "_dimension={1,2,3} >") ) return 0 ;; "-guided" | "--guided") COMPREPLY=( $(compgen -W "[guide],radius[%]>0,regularization>0 radius[%]>0,regularization>0") ) return 0 ;; "-haar" | "--haar") COMPREPLY=( $(compgen -W "scale>0 >") ) return 0 ;; "-heat_flow" | "--heat_flow") COMPREPLY=( $(compgen -W "_nb_iter>=0,_dt,_keep_sequence={0|1} >") ) return 0 ;; "-hessian" | "--hessian") COMPREPLY=( $(compgen -W "{xx|xy|xz|yy|yz|zz}..{xx|xy|xz|yy|yz|zz} (noarg)") ) return 0 ;; "-idct" | "--idct") COMPREPLY=( $(compgen -W "_{x|y|z}..{x|y|z} (noarg)") ) return 0 ;; "-ifft" | "--ifft") COMPREPLY=( $(compgen -W "_{x|y|z}..{x|y|z} >") ) return 0 ;; "-ihaar" | "--ihaar") COMPREPLY=( $(compgen -W "scale>0 >") ) return 0 ;; "-inpaint" | "--inpaint") COMPREPLY=( $(compgen -W "[mask] [mask],0,_fast_method [mask],_patch_size>=1,_lookup_size>=1,_lookup_factor>=0,_lookup_increment!=0,_blend_size>=0,0<=_blend_threshold<=1,_blend_decay>=0,_blend_scales>=1,_is_blend_outer={0|1}") ) return 0 ;; "-inpaint_flow" | "--inpaint_flow") COMPREPLY=( $(compgen -W "[mask],_nb_global_iter>=0,_nb_local_iter>=0,_dt>0,_alpha>=0,_sigma>=0 >") ) return 0 ;; "-inpaint_gaussian" | "--inpaint_gaussian") COMPREPLY=( $(compgen -W "[mask],_smoothness[%]>=0,_iter_length>0,_iter_smoothness_power>0,_feathering>=0 >") ) return 0 ;; "-inpaint_holes" | "--inpaint_holes") COMPREPLY=( $(compgen -W "maximal_area[%]>=0,_tolerance>=0,_is_high_connectivity={0|1} >") ) return 0 ;; "-inpaint_morpho" | "--inpaint_morpho") COMPREPLY=( $(compgen -W "[mask] >") ) return 0 ;; "-inpaint_patchmatch" | "--inpaint_patchmatch") COMPREPLY=( $(compgen -W "[mask],_nb_scales={0=auto|>0},_patch_size>0,_nb_iterations_per_scale>0,_blend_size>=0,_allow_outer_blending={0|1},_is_already_initialized={0|1} >") ) return 0 ;; "-kuwahara" | "--kuwahara") COMPREPLY=( $(compgen -W "size>0 >") ) return 0 ;; "-lic" | "--lic") COMPREPLY=( $(compgen -W "_amplitude>0,_channels>0 >") ) return 0 ;; "-map_tones" | "--map_tones") COMPREPLY=( $(compgen -W "_threshold>=0,_gamma>=0,_smoothness>=0,nb_iter>=0 >") ) return 0 ;; "-map_tones_fast" | "--map_tones_fast") COMPREPLY=( $(compgen -W "_radius[%]>=0,_power>=0 >") ) return 0 ;; "-meancurvature_flow" | "--meancurvature_flow") COMPREPLY=( $(compgen -W "_nb_iter>=0,_dt,_keep_sequence={0|1} >") ) return 0 ;; "-median" | "--median") COMPREPLY=( $(compgen -W "size>=0,_threshold>0 >") ) return 0 ;; "-nlmeans" | "--nlmeans") COMPREPLY=( $(compgen -W "_patch_radius>0,_spatial_bandwidth>0,_tonal_bandwidth>0,_patch_measure_command >") ) return 0 ;; "-nlmeans_core" | "--nlmeans_core") COMPREPLY=( $(compgen -W "_reference_image,_scaling_map,_patch_radius>0,_spatial_bandwidth>0 >") ) return 0 ;; "-normalize_local" | "--normalize_local") COMPREPLY=( $(compgen -W "_amplitude>=0,_radius>0,_n_smooth>=0[%],_a_smooth>=0[%],_is_cut={0|1},_min=0,_max=255 >") ) return 0 ;; "-normalized_cross_correlation" | "--normalized_cross_correlation") COMPREPLY=( $(compgen -W "[mask] >") ) return 0 ;; "-peronamalik_flow" | "--peronamalik_flow") COMPREPLY=( $(compgen -W "K_factor>0,_nb_iter>=0,_dt,_keep_sequence={0|1} >") ) return 0 ;; "-phase_correlation" | "--phase_correlation") COMPREPLY=( $(compgen -W "[destination] >") ) return 0 ;; "-pde_flow" | "--pde_flow") COMPREPLY=( $(compgen -W "_nb_iter>=0,_dt,_velocity_command,_keep_sequence={0|1} >") ) return 0 ;; "-red_eye" | "--red_eye") COMPREPLY=( $(compgen -W "0<=_threshold<=100,_smoothness>=0,0<=attenuation<=1 >") ) return 0 ;; "-remove_hotpixels" | "--remove_hotpixels") COMPREPLY=( $(compgen -W "_mask_size>0,_threshold[%]>0 >") ) return 0 ;; "-remove_pixels" | "--remove_pixels") COMPREPLY=( $(compgen -W "number_of_pixels[%]>=0 >") ) return 0 ;; "-sharpen" | "--sharpen") COMPREPLY=( $(compgen -W "amplitude>=0 amplitude>=0,edge>=0,_alpha,_sigma") ) return 0 ;; "-smooth" | "--smooth") COMPREPLY=( $(compgen -W "amplitude>=0,_sharpness>=0,_anisotropy,_alpha,_sigma,_dl>0,_da>0,_precision>0,interpolation,_fast_approx={0|1} nb_iterations>=0,_sharpness>=0,_anisotropy,_alpha,_sigma,_dt>0,0 [tensor_field],_amplitude>=0,_dl>0,_da>0,_precision>0,_interpolation,_fast_approx={0|1} [tensor_field],_nb_iters>=0,_dt>0,0") ) return 0 ;; "-split_freq" | "--split_freq") COMPREPLY=( $(compgen -W "smoothness>0[%] >") ) return 0 ;; "-solve_poisson" | "--solve_poisson") COMPREPLY=( $(compgen -W ""laplacian_command",_nb_iterations>=0,_time_step>0,_nb_scales>=0 >") ) return 0 ;; "-split_details" | "--split_details") COMPREPLY=( $(compgen -W "_nb_scales>0,_base_scale[%]>=0,_detail_scale[%]>=0 >") ) return 0 ;; "-structuretensors" | "--structuretensors") COMPREPLY=( $(compgen -W "_scheme >") ) return 0 ;; "-syntexturize" | "--syntexturize") COMPREPLY=( $(compgen -W "_width[%]>0,_height[%]>0 >") ) return 0 ;; "-syntexturize_patchmatch" | "--syntexturize_patchmatch") COMPREPLY=( $(compgen -W "_width[%]>0,_height[%]>0,_nb_scales>=0,_patch_size>0,_blending_size>=0,_precision>=0 >") ) return 0 ;; "-tv_flow" | "--tv_flow") COMPREPLY=( $(compgen -W "_nb_iter>=0,_dt,_keep_sequence={0|1} >") ) return 0 ;; "-unsharp" | "--unsharp") COMPREPLY=( $(compgen -W "radius[%]>=0,_amount>=0,_threshold[%]>=0 >") ) return 0 ;; "-unsharp_octave" | "--unsharp_octave") COMPREPLY=( $(compgen -W "_nb_scales>0,_radius[%]>=0,_amount>=0,threshold[%]>=0 >") ) return 0 ;; "-vanvliet" | "--vanvliet") COMPREPLY=( $(compgen -W "std_variation>=0[%],order={0|1|2|3},axis={x|y|z|c},_boundary >") ) return 0 ;; "-watermark_fourier" | "--watermark_fourier") COMPREPLY=( $(compgen -W "text,_size>0 >") ) return 0 ;; "-watershed" | "--watershed") COMPREPLY=( $(compgen -W "[priority_image],_fill_lines={0|1} >") ) return 0 ;; "-area" | "--area") COMPREPLY=( $(compgen -W "tolerance>=0,is_high_connectivity={0|1} >") ) return 0 ;; "-area_fg" | "--area_fg") COMPREPLY=( $(compgen -W "tolerance>=0,is_high_connectivity={0|1} >") ) return 0 ;; "-at_line" | "--at_line") COMPREPLY=( $(compgen -W "x0[%],y0[%],z0[%],x1[%],y1[%],z1[%] >") ) return 0 ;; "-detect_skin" | "--detect_skin") COMPREPLY=( $(compgen -W "0<=tolerance<=1,_skin_x,_skin_y,_skin_radius>=0 >") ) return 0 ;; "-displacement" | "--displacement") COMPREPLY=( $(compgen -W "[source_image],_smoothness,_precision>=0,_nb_scales>=0,_iteration_max>=0,is_backward={0|1},_[guide] >") ) return 0 ;; "-distance" | "--distance") COMPREPLY=( $(compgen -W "isovalue[%],_metric isovalue[%],[metric],_method") ) return 0 ;; "-histogram" | "--histogram") COMPREPLY=( $(compgen -W "_nb_levels>0[%],_value0[%],_value1[%] >") ) return 0 ;; "-histogram_nd" | "--histogram_nd") COMPREPLY=( $(compgen -W "nb_levels>0[%],_value0[%],_value1[%] >") ) return 0 ;; "-histogram_cumul" | "--histogram_cumul") COMPREPLY=( $(compgen -W "_nb_levels>0,_is_normalized={0|1},_val0[%],_val1[%] >") ) return 0 ;; "-histogram_pointwise" | "--histogram_pointwise") COMPREPLY=( $(compgen -W "nb_levels>0[%],_value0[%],_value1[%] >") ) return 0 ;; "-hough" | "--hough") COMPREPLY=( $(compgen -W "_width>0,_height>0,gradient_norm_voting={0|1} >") ) return 0 ;; "-isophotes" | "--isophotes") COMPREPLY=( $(compgen -W "_nb_levels>0 >") ) return 0 ;; "-label" | "--label") COMPREPLY=( $(compgen -W "_tolerance>=0,is_high_connectivity={0|1} >") ) return 0 ;; "-label_fg" | "--label_fg") COMPREPLY=( $(compgen -W "tolerance>=0,is_high_connectivity={0|1} >") ) return 0 ;; "-max_patch" | "--max_patch") COMPREPLY=( $(compgen -W "_patch_size>=1 >") ) return 0 ;; "-min_patch" | "--min_patch") COMPREPLY=( $(compgen -W "_patch_size>=1 >") ) return 0 ;; "-minimal_path" | "--minimal_path") COMPREPLY=( $(compgen -W "x0[%]>=0,y0[%]>=0,z0[%]>=0,x1[%]>=0,y1[%]>=0,z1[%]>=0,_is_high_connectivity={0|1} >") ) return 0 ;; "-patches" | "--patches") COMPREPLY=( $(compgen -W "patch_width>0,patch_height>0,patch_depth>0,x0,y0,z0,_x1,_y1,_z1,...,_xN,_yN,_zN >") ) return 0 ;; "-patchmatch" | "--patchmatch") COMPREPLY=( $(compgen -W "[patch_image],patch_width>=1,_patch_height>=1,_patch_depth>=1,_nb_iterations>=0,_nb_randoms>=0,_output_score={0|1},_[guide] >") ) return 0 ;; "-pointcloud" | "--pointcloud") COMPREPLY=( $(compgen -W "_type={-X=-X-opacity|0=binary|1=cumulative|2=label},_width,_height>0,_depth>0 >") ) return 0 ;; "-psnr" | "--psnr") COMPREPLY=( $(compgen -W "_max_value >") ) return 0 ;; "-segment_watershed" | "--segment_watershed") COMPREPLY=( $(compgen -W "_threshold>=0,_fill_lines={0|1} >") ) return 0 ;; "-skeleton" | "--skeleton") COMPREPLY=( $(compgen -W "_smoothness[%]>=0 >") ) return 0 ;; "-ssd_patch" | "--ssd_patch") COMPREPLY=( $(compgen -W "[patch],_use_fourier={0|1},_boundary_conditions={0=dirichlet|1=neumann} >") ) return 0 ;; "-tones" | "--tones") COMPREPLY=( $(compgen -W "N>0 >") ) return 0 ;; "-topographic_map" | "--topographic_map") COMPREPLY=( $(compgen -W "_nb_levels>0,_smoothness >") ) return 0 ;; "-variance_patch" | "--variance_patch") COMPREPLY=( $(compgen -W "_patch_size>=1 >") ) return 0 ;; "-axes" | "--axes") COMPREPLY=( $(compgen -W "x0,x1,y0,y1,_font_height>=0,_opacity,_pattern,_color1,... >") ) return 0 ;; "-ball" | "--ball") COMPREPLY=( $(compgen -W "_size>0,_R,_G,_B,0<=_specular_light<=8,0<=_specular_size<=8,_shadow>=0 >") ) return 0 ;; "-chessboard" | "--chessboard") COMPREPLY=( $(compgen -W "size1>0,_size2>0,_offset1,_offset2,_angle,_opacity,_color1,..,_color2,.. >") ) return 0 ;; "-circle" | "--circle") COMPREPLY=( $(compgen -W "x[%],y[%],R[%],_opacity,_pattern,_color1,.. >") ) return 0 ;; "-ellipse" | "--ellipse") COMPREPLY=( $(compgen -W "x[%],y[%],R[%],r[%],_angle,_opacity,_pattern,_color1,.. >") ) return 0 ;; "-flood" | "--flood") COMPREPLY=( $(compgen -W "x[%],_y[%],_z[%],_tolerance>=0,_is_high_connectivity={0|1},_opacity,_color1,.. >") ) return 0 ;; "-gaussian" | "--gaussian") COMPREPLY=( $(compgen -W "_sigma1[%],_sigma2[%],_angle >") ) return 0 ;; "-graph" | "--graph") COMPREPLY=( $(compgen -W "[function_image],_plot_type,_vertex_type,_ymin,_ymax,_opacity,_pattern,_color1,.. 'formula',_resolution>=0,_plot_type,_vertex_type,_xmin,xmax,_ymin,_ymax,_opacity,_pattern,_color1,..") ) return 0 ;; "-grid" | "--grid") COMPREPLY=( $(compgen -W "size_x[%]>=0,size_y[%]>=0,_offset_x[%],_offset_y[%],_opacity,_pattern,_color1,.. >") ) return 0 ;; "-image" | "--image") COMPREPLY=( $(compgen -W "[sprite],_x[%],_y[%],_z[%],_c[%],_opacity,_[sprite_mask],_max_opacity_mask >") ) return 0 ;; "-line" | "--line") COMPREPLY=( $(compgen -W "x0[%],y0[%],x1[%],y1[%],_opacity,_pattern,_color1,.. >") ) return 0 ;; "-mandelbrot" | "--mandelbrot") COMPREPLY=( $(compgen -W "z0r,z0i,z1r,z1i,_iteration_max>=0,_is_julia={0|1},_c0r,_c0i,_opacity >") ) return 0 ;; "-marble" | "--marble") COMPREPLY=( $(compgen -W "_image_weight,_pattern_weight,_angle,_amplitude,_sharpness>=0,_anisotropy>=0,_alpha,_sigma,_cut_low>=0,_cut_high>=0 >") ) return 0 ;; "-maze" | "--maze") COMPREPLY=( $(compgen -W "_width>0,_height>0,_cell_size>0 >") ) return 0 ;; "-maze_mask" | "--maze_mask") COMPREPLY=( $(compgen -W "_cellsize>0 >") ) return 0 ;; "-object3d" | "--object3d") COMPREPLY=( $(compgen -W "[object3d],_x[%],_y[%],_z,_opacity,_rendering_mode,_is_double_sided={0|1},_is_zbuffer={0|1},_focale,_light_x,_light_y,_light_z,_specular_lightness,_specular_shininess >") ) return 0 ;; "-pack_sprites" | "--pack_sprites") COMPREPLY=( $(compgen -W "_nb_scales>=0,0<=_min_scale<=100,_allow_rotation={0=0deg.|1=180deg.|2=90deg.|3=any},_spacing,_precision>=0,max_iterations>=0 >") ) return 0 ;; "-piechart" | "--piechart") COMPREPLY=( $(compgen -W "label_height>=0,label_R,label_G,label_B,"label1",value1,R1,G1,B1,...,"labelN",valueN,RN,GN,BN >") ) return 0 ;; "-plasma" | "--plasma") COMPREPLY=( $(compgen -W "_alpha,_beta,_scale>=0 >") ) return 0 ;; "-point" | "--point") COMPREPLY=( $(compgen -W "x[%],y[%],_z[%],_opacity,_color1,.. >") ) return 0 ;; "-polka_dots" | "--polka_dots") COMPREPLY=( $(compgen -W "diameter>=0,_density,_offset1,_offset2,_angle,_aliasing,_shading,_opacity,_color,... >") ) return 0 ;; "-polygon" | "--polygon") COMPREPLY=( $(compgen -W "N>=1,x1[%],y1[%],..,xN[%],yN[%],_opacity,_pattern,_color1,.. >") ) return 0 ;; "-quiver" | "--quiver") COMPREPLY=( $(compgen -W "[function_image],_sampling>0,_factor,_is_arrow={0|1},_opacity,_pattern,_color1,.. >") ) return 0 ;; "-rectangle" | "--rectangle") COMPREPLY=( $(compgen -W "x0[%],y0[%],x1[%],y1[%],_opacity,_pattern,_color1,.. >") ) return 0 ;; "-rorschach" | "--rorschach") COMPREPLY=( $(compgen -W "'smoothness[%]>=0','mirroring={0=none|1=x|2=y|3=xy} >") ) return 0 ;; "-sierpinski" | "--sierpinski") COMPREPLY=( $(compgen -W "recursion_level>=0 >") ) return 0 ;; "-snowflake" | "--snowflake") COMPREPLY=( $(compgen -W "_recursion>=0,_x0,_y0,_x1,_y1,_x2,_y2,_opacity,_col1,..._colN >") ) return 0 ;; "-spline" | "--spline") COMPREPLY=( $(compgen -W "x0[%],y0[%],u0[%],v0[%],x1[%],y1[%],u1[%],v1[%],_nb_vertices>=2,_opacity,_color1,.. >") ) return 0 ;; "-tetraedron_shade" | "--tetraedron_shade") COMPREPLY=( $(compgen -W "x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3,R0,G0,B0,...,R1,G1,B1,...,R2,G2,B2,...,R3,G3,B3,... >") ) return 0 ;; "-text" | "--text") COMPREPLY=( $(compgen -W "text,_x[%],_y[%],_font_height[%]>=0,_opacity,_color1,.. >") ) return 0 ;; "-text_outline" | "--text_outline") COMPREPLY=( $(compgen -W "text,_x[%],_y[%],_font_height>0,_outline>=0,_opacity,_color1,.. >") ) return 0 ;; "-triangle_shade" | "--triangle_shade") COMPREPLY=( $(compgen -W "x0,y0,x1,y1,x2,y2,R0,G0,B0,...,R1,G1,B1,...,R2,G2,B2,.... >") ) return 0 ;; "-truchet" | "--truchet") COMPREPLY=( $(compgen -W "_scale>0,_radius>=0,_pattern_type={0=straight|1=curved} >") ) return 0 ;; "-turbulence" | "--turbulence") COMPREPLY=( $(compgen -W "_radius>0,_octaves={1,2,3...,12},_alpha>0,_difference={-10,10},_mode={0,1,2,3} >") ) return 0 ;; "-dijkstra" | "--dijkstra") COMPREPLY=( $(compgen -W "starting_node>=0,ending_node>=0 >") ) return 0 ;; "-solve" | "--solve") COMPREPLY=( $(compgen -W "[image] >") ) return 0 ;; "-trisolve" | "--trisolve") COMPREPLY=( $(compgen -W "[image] >") ) return 0 ;; "-add3d" | "--add3d") COMPREPLY=( $(compgen -W "tx,_ty,_tz [object3d] (noarg)") ) return 0 ;; "-animate3d" | "--animate3d") COMPREPLY=( $(compgen -W "_width>0,_height>0,_angle_dx,_angle_dy,_angle_dz,_zoom_factor>=0,_filename >") ) return 0 ;; "-apply_camera3d" | "--apply_camera3d") COMPREPLY=( $(compgen -W "pos_x,pos_y,pos_z,target_x,target_y,target_z,up_x,up_y,up_z >") ) return 0 ;; "-array3d" | "--array3d") COMPREPLY=( $(compgen -W "size_x>=1,_size_y>=1,_size_z>=1,_offset_x[%],_offset_y[%],_offset_y[%] >") ) return 0 ;; "-arrow3d" | "--arrow3d") COMPREPLY=( $(compgen -W "x0,y0,z0,x1,y1,z1,_radius[%]>=0,_head_length[%]>=0,_head_radius[%]>=0 >") ) return 0 ;; "-axes3d" | "--axes3d") COMPREPLY=( $(compgen -W "_size_x,_size_y,_size_z,_font_size>0,_label_x,_label_y,_label_z >") ) return 0 ;; "-box3d" | "--box3d") COMPREPLY=( $(compgen -W "_size_x,_size_y,_size_z >") ) return 0 ;; "-circle3d" | "--circle3d") COMPREPLY=( $(compgen -W "_x0,_y0,_z0,_radius>=0 >") ) return 0 ;; "-circles3d" | "--circles3d") COMPREPLY=( $(compgen -W "_radius>=0,_is_filled={0|1} >") ) return 0 ;; "-color3d" | "--color3d") COMPREPLY=( $(compgen -W "R,_G,_B,_opacity >") ) return 0 ;; "-cone3d" | "--cone3d") COMPREPLY=( $(compgen -W "_radius,_height,_nb_subdivisions>0 >") ) return 0 ;; "-cubes3d" | "--cubes3d") COMPREPLY=( $(compgen -W "_size>=0 >") ) return 0 ;; "-cup3d" | "--cup3d") COMPREPLY=( $(compgen -W "_resolution>0 >") ) return 0 ;; "-cylinder3d" | "--cylinder3d") COMPREPLY=( $(compgen -W "_radius,_height,_nb_subdivisions>0 >") ) return 0 ;; "-div3d" | "--div3d") COMPREPLY=( $(compgen -W "factor factor_x,factor_y,_factor_z") ) return 0 ;; "-double3d" | "--double3d") COMPREPLY=( $(compgen -W "_is_double_sided={0|1} >") ) return 0 ;; "-elevation3d" | "--elevation3d") COMPREPLY=( $(compgen -W "z-factor [elevation_map] 'formula' (noarg)") ) return 0 ;; "-extrude3d" | "--extrude3d") COMPREPLY=( $(compgen -W "_depth>0,_resolution>0,_smoothness[%]>=0 >") ) return 0 ;; "-focale3d" | "--focale3d") COMPREPLY=( $(compgen -W "focale >") ) return 0 ;; "-gaussians3d" | "--gaussians3d") COMPREPLY=( $(compgen -W "_size>0,_opacity >") ) return 0 ;; "-gyroid3d" | "--gyroid3d") COMPREPLY=( $(compgen -W "_resolution>0,_zoom >") ) return 0 ;; "-imageblocks3d" | "--imageblocks3d") COMPREPLY=( $(compgen -W "_maximum_elevation,_smoothness[%]>=0 >") ) return 0 ;; "-imagerubik3d" | "--imagerubik3d") COMPREPLY=( $(compgen -W "_xy_tiles>=1,0<=xy_shift<=100,0<=z_shift<=100 >") ) return 0 ;; "-imagesphere3d" | "--imagesphere3d") COMPREPLY=( $(compgen -W "_resolution1>=3,_resolution2>=3 >") ) return 0 ;; "-isoline3d" | "--isoline3d") COMPREPLY=( $(compgen -W "isovalue[%] 'formula',value,_x0,_y0,_x1,_y1,_size_x>0[%],_size_y>0[%]") ) return 0 ;; "-isosurface3d" | "--isosurface3d") COMPREPLY=( $(compgen -W "isovalue[%] 'formula',value,_x0,_y0,_z0,_x1,_y1,_z1,_size_x>0[%],_size_y>0[%],_size_z>0[%]") ) return 0 ;; "-label3d" | "--label3d") COMPREPLY=( $(compgen -W ""text",font_height>=0,_opacity,_color1,... >") ) return 0 ;; "-label_points3d" | "--label_points3d") COMPREPLY=( $(compgen -W "_label_size>0,_opacity >") ) return 0 ;; "-lathe3d" | "--lathe3d") COMPREPLY=( $(compgen -W "_resolution>0,_smoothness[%]>=0,_max_angle>=0 >") ) return 0 ;; "-light3d" | "--light3d") COMPREPLY=( $(compgen -W "position_x,position_y,position_z [texture] (noarg)") ) return 0 ;; "-line3d" | "--line3d") COMPREPLY=( $(compgen -W "x0,y0,z0,x1,y1,z1 >") ) return 0 ;; "-lissajous3d" | "--lissajous3d") COMPREPLY=( $(compgen -W "resolution>1,a,A,b,B,c,C >") ) return 0 ;; "-mode3d" | "--mode3d") COMPREPLY=( $(compgen -W "_mode >") ) return 0 ;; "-moded3d" | "--moded3d") COMPREPLY=( $(compgen -W "_mode >") ) return 0 ;; "-mul3d" | "--mul3d") COMPREPLY=( $(compgen -W "factor factor_x,factor_y,_factor_z") ) return 0 ;; "-opacity3d" | "--opacity3d") COMPREPLY=( $(compgen -W "_opacity >") ) return 0 ;; "-parametric3d" | "--parametric3d") COMPREPLY=( $(compgen -W "_x(a,b),_y(a,b),_z(a,b),_amin,_amax,_bmin,_bmax,_res_a>0,_res_b>0,_res_x>0,_res_y>0,_res_z>0,_smoothness>=0,_isovalue>=0 >") ) return 0 ;; "-pca_patch3d" | "--pca_patch3d") COMPREPLY=( $(compgen -W "_patch_size>0,_M>0,_N>0,_normalize_input={0|1},_normalize_output={0|1},_lambda_xy >") ) return 0 ;; "-plane3d" | "--plane3d") COMPREPLY=( $(compgen -W "_size_x,_size_y,_nb_subdivisions_x>0,_nb_subdisivions_y>0 >") ) return 0 ;; "-point3d" | "--point3d") COMPREPLY=( $(compgen -W "x0,y0,z0 >") ) return 0 ;; "-pose3d" | "--pose3d") COMPREPLY=( $(compgen -W "p1,..,p12 >") ) return 0 ;; "-primitives3d" | "--primitives3d") COMPREPLY=( $(compgen -W "mode >") ) return 0 ;; "-projections3d" | "--projections3d") COMPREPLY=( $(compgen -W "_x[%],_y[%],_z[%],_is_bounding_box={0|1} >") ) return 0 ;; "-pyramid3d" | "--pyramid3d") COMPREPLY=( $(compgen -W "width,height >") ) return 0 ;; "-quadrangle3d" | "--quadrangle3d") COMPREPLY=( $(compgen -W "x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3 >") ) return 0 ;; "-random3d" | "--random3d") COMPREPLY=( $(compgen -W "nb_points>=0 >") ) return 0 ;; "-rotate3d" | "--rotate3d") COMPREPLY=( $(compgen -W "u,v,w,angle >") ) return 0 ;; "-rotation3d" | "--rotation3d") COMPREPLY=( $(compgen -W "u,v,w,angle >") ) return 0 ;; "-sierpinski3d" | "--sierpinski3d") COMPREPLY=( $(compgen -W "_recursion_level>=0,_width,_height >") ) return 0 ;; "-skeleton3d" | "--skeleton3d") COMPREPLY=( $(compgen -W "_metric,_frame_type={0=squares|1=diamonds|2=circles|3=auto},_skeleton_opacity,_frame_opacity,_is_frame_wireframe={0|1} >") ) return 0 ;; "-snapshot3d" | "--snapshot3d") COMPREPLY=( $(compgen -W "_size>0,_zoom>=0,_backgroundR,_backgroundG,_backgroundB,_backgroundA [background_image],zoom>=0") ) return 0 ;; "-specl3d" | "--specl3d") COMPREPLY=( $(compgen -W "value>=0 >") ) return 0 ;; "-specs3d" | "--specs3d") COMPREPLY=( $(compgen -W "value>=0 >") ) return 0 ;; "-sphere3d" | "--sphere3d") COMPREPLY=( $(compgen -W "radius,_nb_recursions>=0 >") ) return 0 ;; "-spherical3d" | "--spherical3d") COMPREPLY=( $(compgen -W "_nb_azimuth>=3,_nb_zenith>=3,_radius_function(phi,theta) >") ) return 0 ;; "-spline3d" | "--spline3d") COMPREPLY=( $(compgen -W "x0[%],y0[%],z0[%],u0[%],v0[%],w0[%],x1[%],y1[%],z1[%],u1[%],v1[%],w1[%],_nb_vertices>=2 >") ) return 0 ;; "-split3d" | "--split3d") COMPREPLY=( $(compgen -W "_keep_shared_data={0|1} >") ) return 0 ;; "-sprites3d" | "--sprites3d") COMPREPLY=( $(compgen -W "[sprite],_sprite_has_alpha_channel={0|1} >") ) return 0 ;; "-star3d" | "--star3d") COMPREPLY=( $(compgen -W "_nb_branches>0,0<=_thickness<=1 >") ) return 0 ;; "-streamline3d" | "--streamline3d") COMPREPLY=( $(compgen -W "x[%],y[%],z[%],_L>=0,_dl>0,_interpolation,_is_backward={0|1},_is_oriented={0|1} 'formula',x,y,z,_L>=0,_dl>0,_interpolation,_is_backward={0|1},_is_oriented={0|1}") ) return 0 ;; "-sub3d" | "--sub3d") COMPREPLY=( $(compgen -W "tx,_ty,_tz >") ) return 0 ;; "-superformula3d" | "--superformula3d") COMPREPLY=( $(compgen -W "resolution>1,m>=1,n1,n2,n3 >") ) return 0 ;; "-text_pointcloud3d" | "--text_pointcloud3d") COMPREPLY=( $(compgen -W "_"text1",_"text2",_smoothness >") ) return 0 ;; "-text3d" | "--text3d") COMPREPLY=( $(compgen -W "text,_font_height>0,_depth>0,_smoothness >") ) return 0 ;; "-texturize3d" | "--texturize3d") COMPREPLY=( $(compgen -W "[ind_texture],_[ind_coords] >") ) return 0 ;; "-torus3d" | "--torus3d") COMPREPLY=( $(compgen -W "_radius1,_radius2,_nb_subdivisions1>2,_nb_subdivisions2>2 >") ) return 0 ;; "-triangle3d" | "--triangle3d") COMPREPLY=( $(compgen -W "x0,y0,z0,x1,y1,z1,x2,y2,z2 >") ) return 0 ;; "-weird3d" | "--weird3d") COMPREPLY=( $(compgen -W "_resolution>0 >") ) return 0 ;; "-apply_parallel" | "--apply_parallel") COMPREPLY=( $(compgen -W ""command" >") ) return 0 ;; "-apply_parallel_channels" | "--apply_parallel_channels") COMPREPLY=( $(compgen -W ""command" >") ) return 0 ;; "-apply_parallel_overlap" | "--apply_parallel_overlap") COMPREPLY=( $(compgen -W ""command",overlap[%],nb_threads={0=auto|1|2|4|8|16} >") ) return 0 ;; "-apply_timeout" | "--apply_timeout") COMPREPLY=( $(compgen -W ""command",_timeout={0=notimeout|>0=withspecifiedtimeout(inseconds)} >") ) return 0 ;; "-check" | "--check") COMPREPLY=( $(compgen -W "expression >") ) return 0 ;; "-check3d" | "--check3d") COMPREPLY=( $(compgen -W "_is_full_check={0|1} >") ) return 0 ;; "-elif" | "--elif") COMPREPLY=( $(compgen -W "boolean filename") ) return 0 ;; "-error" | "--error") COMPREPLY=( $(compgen -W "message >") ) return 0 ;; "-exec" | "--exec") COMPREPLY=( $(compgen -W "command >") ) return 0 ;; "-if" | "--if") COMPREPLY=( $(compgen -W "boolean filename") ) return 0 ;; "-mutex" | "--mutex") COMPREPLY=( $(compgen -W "indice,_action={0=unlock|1=lock} >") ) return 0 ;; "-parallel" | "--parallel") COMPREPLY=( $(compgen -W "_wait_threads,"command1","command2",... >") ) return 0 ;; "-progress" | "--progress") COMPREPLY=( $(compgen -W "0<=value<=100 -1") ) return 0 ;; "-repeat" | "--repeat") COMPREPLY=( $(compgen -W "nb_iterations,_variable_name >") ) return 0 ;; "-rprogress" | "--rprogress") COMPREPLY=( $(compgen -W "0<=value<=100|-1|"command",0<=value_min<=100,0<=value_max<=100 >") ) return 0 ;; "-skip" | "--skip") COMPREPLY=( $(compgen -W "item >") ) return 0 ;; "-status" | "--status") COMPREPLY=( $(compgen -W "status_string >") ) return 0 ;; "-_status" | "--_status") COMPREPLY=( $(compgen -W "status_string >") ) return 0 ;; "-while" | "--while") COMPREPLY=( $(compgen -W "boolean filename") ) return 0 ;; "-array" | "--array") COMPREPLY=( $(compgen -W "M>0,_N>0,_expand_type={0=min|1=max|2=all} >") ) return 0 ;; "-array_fade" | "--array_fade") COMPREPLY=( $(compgen -W "M>0,_N>0,0<=_fade_start<=100,0<=_fade_end<=100,_expand_type={0=min|1=max|2=all} >") ) return 0 ;; "-array_mirror" | "--array_mirror") COMPREPLY=( $(compgen -W "N>=0,_dir={0=x|1=y|2=xy|3=tri-xy},_expand_type={0|1} >") ) return 0 ;; "-array_random" | "--array_random") COMPREPLY=( $(compgen -W "Ms>0,_Ns>0,_Md>0,_Nd>0 >") ) return 0 ;; "-frame_blur" | "--frame_blur") COMPREPLY=( $(compgen -W "_sharpness>0,_size>=0,_smoothness,_shading,_blur >") ) return 0 ;; "-frame_cube" | "--frame_cube") COMPREPLY=( $(compgen -W "_depth>=0,_centering_x,_centering_y,_left_side={0=normal|1=mirror-x|2=mirror-y|3=mirror-xy},_right_side,_lower_side,_upper_side >") ) return 0 ;; "-frame_fuzzy" | "--frame_fuzzy") COMPREPLY=( $(compgen -W "size_x[%]>=0,_size_y[%]>=0,_fuzzyness>=0,_smoothness[%]>=0,_R,_G,_B,_A >") ) return 0 ;; "-frame_painting" | "--frame_painting") COMPREPLY=( $(compgen -W "_size[%]>=0,0<=_contrast<=1,_profile_smoothness[%]>=0,_R,_G,_B,_vignette_size[%]>=0,_vignette_contrast>=0,_defects_contrast>=0,0<=_defects_density<=100,_defects_size>=0,_defects_smoothness[%]>=0,_serial_number >") ) return 0 ;; "-frame_pattern" | "--frame_pattern") COMPREPLY=( $(compgen -W "M>=3,_constrain_size={0|1} M>=3,_[frame_image],_constrain_size={0|1}") ) return 0 ;; "-frame_round" | "--frame_round") COMPREPLY=( $(compgen -W "_sharpness>0,_size>=0,_smoothness,_shading,_R,_G,_B,_A >") ) return 0 ;; "-frame_x" | "--frame_x") COMPREPLY=( $(compgen -W "size_x[%],_col1,...,_colN >") ) return 0 ;; "-frame_xy" | "--frame_xy") COMPREPLY=( $(compgen -W "size_x[%],_size_y[%],_col1,...,_colN >") ) return 0 ;; "-frame_xyz" | "--frame_xyz") COMPREPLY=( $(compgen -W "size_x[%],_size_y[%],_size_z[%]_col1,...,_colN >") ) return 0 ;; "-frame_y" | "--frame_y") COMPREPLY=( $(compgen -W "size_y[%],_col1,...,_colN >") ) return 0 ;; "-img2ascii" | "--img2ascii") COMPREPLY=( $(compgen -W "_charset,_analysis_scale>0,_analysis_smoothness[%]>=0,_synthesis_scale>0,_output_ascii_filename >") ) return 0 ;; "-imagegrid" | "--imagegrid") COMPREPLY=( $(compgen -W "M>0,_N>0 >") ) return 0 ;; "-imagegrid_hexagonal" | "--imagegrid_hexagonal") COMPREPLY=( $(compgen -W "_resolution>0,0<=_outline<=1 >") ) return 0 ;; "-imagegrid_triangular" | "--imagegrid_triangular") COMPREPLY=( $(compgen -W "pattern_width>=1,_pattern_height>=1,_pattern_type,0<=_outline_opacity<=1,_outline_color1,... >") ) return 0 ;; "-linearize_tiles" | "--linearize_tiles") COMPREPLY=( $(compgen -W "M>0,_N>0 >") ) return 0 ;; "-map_sprites" | "--map_sprites") COMPREPLY=( $(compgen -W "_nb_sprites>=1,_allow_rotation={0=none|1=90deg.|2=180deg.} >") ) return 0 ;; "-pack" | "--pack") COMPREPLY=( $(compgen -W "is_ratio_constraint={0|1},_sort_criterion >") ) return 0 ;; "-puzzle" | "--puzzle") COMPREPLY=( $(compgen -W "_width>0,_height>0,_M>=1,_N>=1,_curvature,_centering,_connectors_variability,_resolution>=1 >") ) return 0 ;; "-quadratize_tiles" | "--quadratize_tiles") COMPREPLY=( $(compgen -W "M>0,_N>0 >") ) return 0 ;; "-rotate_tiles" | "--rotate_tiles") COMPREPLY=( $(compgen -W "angle,_M>0,N>0 >") ) return 0 ;; "-shift_tiles" | "--shift_tiles") COMPREPLY=( $(compgen -W "M>0,_N>0,_amplitude >") ) return 0 ;; "-taquin" | "--taquin") COMPREPLY=( $(compgen -W "M>0,_N>0,_remove_tile={0=none|1=first|2=last|3=random},_relief,_border_thickness[%],_border_outline[%],_outline_color >") ) return 0 ;; "-tunnel" | "--tunnel") COMPREPLY=( $(compgen -W "_level>=0,_factor>0,_centering_x,_centering_y,_opacity,_angle >") ) return 0 ;; "-boxfitting" | "--boxfitting") COMPREPLY=( $(compgen -W "_min_box_size>=1,_max_box_size>=0,_initial_density>=0,_nb_attempts>=1 >") ) return 0 ;; "-cartoon" | "--cartoon") COMPREPLY=( $(compgen -W "_smoothness,_sharpening,_threshold>=0,_thickness>=0,_color>=0,quantization>0 >") ) return 0 ;; "-color_ellipses" | "--color_ellipses") COMPREPLY=( $(compgen -W "_count>0,_radius>=0,_opacity>=0 >") ) return 0 ;; "-cubism" | "--cubism") COMPREPLY=( $(compgen -W "_density>=0,0<=_thickness<=50,_max_angle,_opacity,_smoothness>=0 >") ) return 0 ;; "-draw_whirl" | "--draw_whirl") COMPREPLY=( $(compgen -W "_amplitude>=0 >") ) return 0 ;; "-drawing" | "--drawing") COMPREPLY=( $(compgen -W "_amplitude>=0 >") ) return 0 ;; "-drop_shadow" | "--drop_shadow") COMPREPLY=( $(compgen -W "_offset_x[%],_offset_y[%],_smoothness[%]>=0,0<=_curvature<=1,_expand_size={0|1} >") ) return 0 ;; "-ellipsionism" | "--ellipsionism") COMPREPLY=( $(compgen -W "_R>0[%],_r>0[%],_smoothness>=0[%],_opacity,_outline>0,_density>0 >") ) return 0 ;; "-fire_edges" | "--fire_edges") COMPREPLY=( $(compgen -W "_edges>=0,0<=_attenuation<=1,_smoothness>=0,_threshold>=0,_nb_frames>0,_starting_frame>=0,frame_skip>=0 >") ) return 0 ;; "-fractalize" | "--fractalize") COMPREPLY=( $(compgen -W "0<=detail_level<=1 >") ) return 0 ;; "-glow" | "--glow") COMPREPLY=( $(compgen -W "_amplitude>=0 >") ) return 0 ;; "-halftone" | "--halftone") COMPREPLY=( $(compgen -W "nb_levels>=2,_size_dark>=2,_size_bright>=2,_shape={0=square|1=diamond|2=circle|3=inv-square|4=inv-diamond|5=inv-circle},_smoothness[%]>=0 >") ) return 0 ;; "-hardsketchbw" | "--hardsketchbw") COMPREPLY=( $(compgen -W "_amplitude>=0,_density>=0,_opacity,0<=_edge_threshold<=100,_is_fast={0|1} >") ) return 0 ;; "-hearts" | "--hearts") COMPREPLY=( $(compgen -W "_density>=0 >") ) return 0 ;; "-houghsketchbw" | "--houghsketchbw") COMPREPLY=( $(compgen -W "_density>=0,_radius>0,0<=_threshold<=100,0<=_opacity<=1,_votesize[%]>0 >") ) return 0 ;; "-lightrays" | "--lightrays") COMPREPLY=( $(compgen -W "100<=_density<=0,_center_x[%],_center_y[%],_ray_length>=0,_ray_attenuation>=0 >") ) return 0 ;; "-light_relief" | "--light_relief") COMPREPLY=( $(compgen -W "_ambient_light,_specular_lightness,_specular_size,_light_smoothness,_darkness,_xl,_yl,_zl,_zscale,_opacity_is_heightmap={0|1} >") ) return 0 ;; "-mosaic" | "--mosaic") COMPREPLY=( $(compgen -W "_density>=0,_edges={0|1} >") ) return 0 ;; "-pencilbw" | "--pencilbw") COMPREPLY=( $(compgen -W "_size>=0,_amplitude>=0 >") ) return 0 ;; "-polaroid" | "--polaroid") COMPREPLY=( $(compgen -W "_size1>=0,_size2>=0 >") ) return 0 ;; "-polygonize" | "--polygonize") COMPREPLY=( $(compgen -W "_warp_amplitude>=0,_smoothness[%]>=0,_min_area[%]>=0,_resolution_x[%]>0,_resolution_y[%]>0 >") ) return 0 ;; "-poster_edges" | "--poster_edges") COMPREPLY=( $(compgen -W "0<=_edge_threshold<=100,0<=_edge_shade<=100,_edge_thickness>=0,_edge_antialiasing>=0,0<=_posterization_level<=15,_posterization_antialiasing>=0 >") ) return 0 ;; "-poster_hope" | "--poster_hope") COMPREPLY=( $(compgen -W "_smoothness>=0 >") ) return 0 ;; "-rodilius" | "--rodilius") COMPREPLY=( $(compgen -W "0<=_amplitude<=100,_0<=thickness<=100,_sharpness>=0,_nb_orientations>0,_offset,_color_mode={0=darker|1=brighter} >") ) return 0 ;; "-stained_glass" | "--stained_glass") COMPREPLY=( $(compgen -W "_edges[%]>=0,shading>=0,is_thin_separators={0|1} >") ) return 0 ;; "-stars" | "--stars") COMPREPLY=( $(compgen -W "_density[%]>=0,_depth>=0,_size>0,_nb_branches>=1,0<=_thickness<=1,_smoothness[%]>=0,_R,_G,_B,_opacity >") ) return 0 ;; "-sketchbw" | "--sketchbw") COMPREPLY=( $(compgen -W "_nb_orients>0,_start_angle,_angle_range>=0,_length>=0,_threshold>=0,_opacity,_bgfactor>=0,_density>0,_sharpness>=0,_anisotropy>=0,_smoothness>=0,_coherence>=0,_is_boost={0|1},_is_curved={0|1} >") ) return 0 ;; "-sponge" | "--sponge") COMPREPLY=( $(compgen -W "_size>0 >") ) return 0 ;; "-stencil" | "--stencil") COMPREPLY=( $(compgen -W "_radius[%]>=0,_smoothness>=0,_iterations>=0 >") ) return 0 ;; "-stencilbw" | "--stencilbw") COMPREPLY=( $(compgen -W "_edges>=0,_smoothness>=0 >") ) return 0 ;; "-tetris" | "--tetris") COMPREPLY=( $(compgen -W "_scale>0 >") ) return 0 ;; "-warhol" | "--warhol") COMPREPLY=( $(compgen -W "_M>0,_N>0,_smoothness>=0,_color>=0 >") ) return 0 ;; "-weave" | "--weave") COMPREPLY=( $(compgen -W "_density>=0,0<=_thickness<=100,0<=_shadow<=100,_shading>=0,_fibers_amplitude>=0,_fibers_smoothness>=0,_angle,-1<=_x_curvature<=1,-1<=_y_curvature<=1 >") ) return 0 ;; "-whirls" | "--whirls") COMPREPLY=( $(compgen -W "_texture>=0,_smoothness>=0,_darkness>=0,_lightness>=0 >") ) return 0 ;; "-euclidean2polar" | "--euclidean2polar") COMPREPLY=( $(compgen -W "_center_x[%],_center_y[%],_stretch_factor>0,_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-deform" | "--deform") COMPREPLY=( $(compgen -W "_amplitude>=0 >") ) return 0 ;; "-fisheye" | "--fisheye") COMPREPLY=( $(compgen -W "_center_x,_center_y,0<=_radius<=100,_amplitude>=0 >") ) return 0 ;; "-flower" | "--flower") COMPREPLY=( $(compgen -W "_amplitude,_frequency,_offset_r[%],_angle,_center_x[%],_center_y[%],_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-kaleidoscope" | "--kaleidoscope") COMPREPLY=( $(compgen -W "_center_x[%],_center_y[%],_radius,_angle,_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-map_sphere" | "--map_sphere") COMPREPLY=( $(compgen -W "_width>0,_height>0,_radius,_dilation>0,_fading>=0,_fading_power>=0 >") ) return 0 ;; "-polar2euclidean" | "--polar2euclidean") COMPREPLY=( $(compgen -W "_center_x[%],_center_y[%],_stretch_factor>0,_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-raindrops" | "--raindrops") COMPREPLY=( $(compgen -W "_amplitude,_density>=0,_wavelength>=0,_merging_steps>=0 >") ) return 0 ;; "-ripple" | "--ripple") COMPREPLY=( $(compgen -W "_amplitude,_bandwidth,_shape={0=bloc|1=triangle|2=sine|3=sine+|4=random},_angle,_offset >") ) return 0 ;; "-rotoidoscope" | "--rotoidoscope") COMPREPLY=( $(compgen -W "_center_x[%],_center_y[%],_tiles>0,_smoothness[%]>=0,_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-symmetrize" | "--symmetrize") COMPREPLY=( $(compgen -W "_x[%],_y[%],_angle,_boundary={0=dirichlet|1=neumann|2=periodic},_is_antisymmetry={0|1},_swap_sides={0|1} >") ) return 0 ;; "-transform_polar" | "--transform_polar") COMPREPLY=( $(compgen -W ""expr_radius",_"expr_angle",_center_x[%],_center_y[%],_boundary={0=dirichlet|1=neumann} >") ) return 0 ;; "-twirl" | "--twirl") COMPREPLY=( $(compgen -W "_amplitude,_center_x[%],_center_y[%],_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-warp_perspective" | "--warp_perspective") COMPREPLY=( $(compgen -W "_x-angle,_y-angle,_zoom>0,_x-center,_y-center,_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-water" | "--water") COMPREPLY=( $(compgen -W "_amplitude>=0,_smoothness>=0 >") ) return 0 ;; "-wave" | "--wave") COMPREPLY=( $(compgen -W "_amplitude>=0,_frequency>=0,_center_x,_center_y >") ) return 0 ;; "-wind" | "--wind") COMPREPLY=( $(compgen -W "_amplitude>=0,_angle,0<=_attenuation<=1,_threshold >") ) return 0 ;; "-zoom" | "--zoom") COMPREPLY=( $(compgen -W "_factor,_cx,_cy,_cz,_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-cracks" | "--cracks") COMPREPLY=( $(compgen -W "_density>=0,_amplitude,_relief={0|1} >") ) return 0 ;; "-light_patch" | "--light_patch") COMPREPLY=( $(compgen -W "_density>0,_darkness>=0,_lightness>=0 >") ) return 0 ;; "-noise_hurl" | "--noise_hurl") COMPREPLY=( $(compgen -W "_amplitude>=0 >") ) return 0 ;; "-pixelize" | "--pixelize") COMPREPLY=( $(compgen -W "_scale_x>0,_scale_y>0,_scale_z>0 >") ) return 0 ;; "-scanlines" | "--scanlines") COMPREPLY=( $(compgen -W "_amplitude,_bandwidth,_shape={0=bloc|1=triangle|2=sine|3=sine+|4=random},_angle,_offset >") ) return 0 ;; "-shade_stripes" | "--shade_stripes") COMPREPLY=( $(compgen -W "_frequency>=0,_direction={0=horizontal|1=vertical},_darkness>=0,_lightness>=0 >") ) return 0 ;; "-shadow_patch" | "--shadow_patch") COMPREPLY=( $(compgen -W "_opacity>=0 >") ) return 0 ;; "-spread" | "--spread") COMPREPLY=( $(compgen -W "_dx>=0,_dy>=0,_dz>=0 >") ) return 0 ;; "-stripes_y" | "--stripes_y") COMPREPLY=( $(compgen -W "_frequency>=0 >") ) return 0 ;; "-texturize_canvas" | "--texturize_canvas") COMPREPLY=( $(compgen -W "_amplitude>=0,_fibrousness>=0,_emboss_level>=0 >") ) return 0 ;; "-vignette" | "--vignette") COMPREPLY=( $(compgen -W "_strength>=0,0<=_radius_min<=100,0<=_radius_max<=100 >") ) return 0 ;; "-watermark_visible" | "--watermark_visible") COMPREPLY=( $(compgen -W "_text,0<_opacity<1,_size>0,_angle,_mode={0=remove|1=add},_smoothness>=0 >") ) return 0 ;; "-blend" | "--blend") COMPREPLY=( $(compgen -W "[layer],blending_mode,0<=_opacity<=1,_selection_is={0=base-layers|1=top-layers} blending_mode,0<=_opacity<=1") ) return 0 ;; "-blend_edges" | "--blend_edges") COMPREPLY=( $(compgen -W "smoothness[%]>=0 >") ) return 0 ;; "-blend_fade" | "--blend_fade") COMPREPLY=( $(compgen -W "[fading_shape] >") ) return 0 ;; "-blend_seamless" | "--blend_seamless") COMPREPLY=( $(compgen -W "_is_mixed_mode={0|1},_inner_fading[%]>=0,_outer_fading[%]>=0 >") ) return 0 ;; "-fade_diamond" | "--fade_diamond") COMPREPLY=( $(compgen -W "0<=_start<=100,0<=_end<=100 >") ) return 0 ;; "-fade_linear" | "--fade_linear") COMPREPLY=( $(compgen -W "_angle,0<=_start<=100,0<=_end<=100 >") ) return 0 ;; "-fade_radial" | "--fade_radial") COMPREPLY=( $(compgen -W "0<=_start<=100,0<=_end<=100 >") ) return 0 ;; "-fade_x" | "--fade_x") COMPREPLY=( $(compgen -W "0<=_start<=100,0<=_end<=100 >") ) return 0 ;; "-fade_y" | "--fade_y") COMPREPLY=( $(compgen -W "0<=_start<=100,0<=_end<=100 >") ) return 0 ;; "-fade_z" | "--fade_z") COMPREPLY=( $(compgen -W "0<=_start<=100,0<=_end<=100 >") ) return 0 ;; "-sub_alpha" | "--sub_alpha") COMPREPLY=( $(compgen -W "[base_image],_opacity_gain>=1 >") ) return 0 ;; "-animate" | "--animate") COMPREPLY=( $(compgen -W "filter_name,"param1_start,..,paramN_start","param1_end,..,paramN_end",nb_frames>=0,_output_frames={0|1},_output_filename delay>0") ) return 0 ;; "-apply_camera" | "--apply_camera") COMPREPLY=( $(compgen -W "_command,_camera_index>=0,_skip_frames>=0,_output_filename >") ) return 0 ;; "-apply_files" | "--apply_files") COMPREPLY=( $(compgen -W ""command","filename_pattern",_output_prefix,_output_extension,_view_window={0|1} >") ) return 0 ;; "-apply_video" | "--apply_video") COMPREPLY=( $(compgen -W "_command,_input_filename,_output_filename,_first_frame>=0,_last_frame={>=0|-1=last},_frame_step>=1 >") ) return 0 ;; "-average_video" | "--average_video") COMPREPLY=( $(compgen -W "input_filename,_first_frame>=0,_last_frame={>=0|-1=last},_frame_step>=1,_output_filename >") ) return 0 ;; "-files2video" | "--files2video") COMPREPLY=( $(compgen -W ""filename_pattern",_output_filename,_fps>0,_codec >") ) return 0 ;; "-morph" | "--morph") COMPREPLY=( $(compgen -W "nb_frames>0,_smoothness>=0,_precision>=0 >") ) return 0 ;; "-register_nonrigid" | "--register_nonrigid") COMPREPLY=( $(compgen -W "[destination],_smoothness>=0,_precision>0,_nb_scale>=0 >") ) return 0 ;; "-register_rigid" | "--register_rigid") COMPREPLY=( $(compgen -W "[destination],_smoothness>=0,_boundary={0=dirichlet|1=neumann|2=periodic} >") ) return 0 ;; "-transition" | "--transition") COMPREPLY=( $(compgen -W "[transition_shape],nb_added_frames>=0,100>=shading>=0,_single_frame_only={-1=disabled|>=0} >") ) return 0 ;; "-transition3d" | "--transition3d") COMPREPLY=( $(compgen -W "_nb_frames>=2,_nb_xtiles>0,_nb_ytiles>0,_axis_x,_axis_y,_axis_z,_is_antialias={0|1} >") ) return 0 ;; "-video2files" | "--video2files") COMPREPLY=( $(compgen -W "input_filename,_output_filename,_first_frame>=0,_last_frame={>=0|-1=last},_frame_step>=1 >") ) return 0 ;; "-output_pink3d" | "--output_pink3d") COMPREPLY=( $(compgen -W "filename >") ) return 0 ;; "-pink_grayskel" | "--pink_grayskel") COMPREPLY=( $(compgen -W "_connectivity={4|8|6|26},_lambda=0 >") ) return 0 ;; "-pink_heightmaxima" | "--pink_heightmaxima") COMPREPLY=( $(compgen -W "_connectivity={4|8|6|26},_height=1 >") ) return 0 ;; "-pink_heightminima" | "--pink_heightminima") COMPREPLY=( $(compgen -W "_connectivity={4|8|6|26},_height=1 >") ) return 0 ;; "-pink_htkern" | "--pink_htkern") COMPREPLY=( $(compgen -W "_connectivity={4|8|6|26},_type={""|u} >") ) return 0 ;; "-pink_lvkern" | "--pink_lvkern") COMPREPLY=( $(compgen -W "_connectivity={4|8|6|26},_type={""|u} >") ) return 0 ;; "-pink_reg_minima" | "--pink_reg_minima") COMPREPLY=( $(compgen -W "_connectivity={4|8|6|26} >") ) return 0 ;; "-pink_skelcurv" | "--pink_skelcurv") COMPREPLY=( $(compgen -W "_prio={0|1|2|3|4|8|6|26},_connectivity={4|8|6|26},_inhibit={""} >") ) return 0 ;; "-pink_skelend" | "--pink_skelend") COMPREPLY=( $(compgen -W "_connectivity={4|8|6|26},_n=0 >") ) return 0 ;; "-pink_skeleton" | "--pink_skeleton") COMPREPLY=( $(compgen -W "_prio={0|1|2|3|4|8|6|26},_connectivity={4|8|6|26},_inhibit={""} >") ) return 0 ;; "-pink_skelpar" | "--pink_skelpar") COMPREPLY=( $(compgen -W "_algorithm={0..29},_nsteps=_1,_inhibit="" >") ) return 0 ;; "-pink_wshed" | "--pink_wshed") COMPREPLY=( $(compgen -W "_connectivity={4|8|6|26},_inverse={0|1},_height=0 >") ) return 0 ;; "-alert" | "--alert") COMPREPLY=( $(compgen -W "_title,_message,_label_button1,_label_button2,... >") ) return 0 ;; "-arg" | "--arg") COMPREPLY=( $(compgen -W "n>=1,_arg1,...,_argN >") ) return 0 ;; "-arg2var" | "--arg2var") COMPREPLY=( $(compgen -W "variable_name,argument_1,...,argument_N >") ) return 0 ;; "-at" | "--at") COMPREPLY=( $(compgen -W "_x,_y,_z >") ) return 0 ;; "-autocrop_coords" | "--autocrop_coords") COMPREPLY=( $(compgen -W "value1,value2,...|auto >") ) return 0 ;; "-basename" | "--basename") COMPREPLY=( $(compgen -W "file_path,_variable_name_for_folder >") ) return 0 ;; "-bin" | "--bin") COMPREPLY=( $(compgen -W "binary_int1,... >") ) return 0 ;; "-bin2dec" | "--bin2dec") COMPREPLY=( $(compgen -W "binary_int1,... >") ) return 0 ;; "-dec" | "--dec") COMPREPLY=( $(compgen -W "decimal_int1,... >") ) return 0 ;; "-dec2str" | "--dec2str") COMPREPLY=( $(compgen -W "decimal_int1,... >") ) return 0 ;; "-dec2bin" | "--dec2bin") COMPREPLY=( $(compgen -W "decimal_int1,... >") ) return 0 ;; "-dec2hex" | "--dec2hex") COMPREPLY=( $(compgen -W "decimal_int1,... >") ) return 0 ;; "-dec2oct" | "--dec2oct") COMPREPLY=( $(compgen -W "decimal_int1,... >") ) return 0 ;; "-fact" | "--fact") COMPREPLY=( $(compgen -W "value >") ) return 0 ;; "-fibonacci" | "--fibonacci") COMPREPLY=( $(compgen -W "N>=0 >") ) return 0 ;; "-file_mv" | "--file_mv") COMPREPLY=( $(compgen -W "filename_src,filename_dest >") ) return 0 ;; "-file_rm" | "--file_rm") COMPREPLY=( $(compgen -W "filename >") ) return 0 ;; "-filename" | "--filename") COMPREPLY=( $(compgen -W "filename,_number1,_number2,...,_numberN >") ) return 0 ;; "-files" | "--files") COMPREPLY=( $(compgen -W "_mode,path >") ) return 0 ;; "-fitratio_wh" | "--fitratio_wh") COMPREPLY=( $(compgen -W "min_width,min_height,ratio_wh >") ) return 0 ;; "-fitscreen" | "--fitscreen") COMPREPLY=( $(compgen -W "width,height,_depth,_minimal_size[%],_maximal_size[%] >") ) return 0 ;; "-gcd" | "--gcd") COMPREPLY=( $(compgen -W "a,b >") ) return 0 ;; "-head" | "--head") COMPREPLY=( $(compgen -W "length>=0 >") ) return 0 ;; "-hex" | "--hex") COMPREPLY=( $(compgen -W "hexadecimal_int1,... >") ) return 0 ;; "-hex2dec" | "--hex2dec") COMPREPLY=( $(compgen -W "hexadecimal_int1,... >") ) return 0 ;; "-hex2str" | "--hex2str") COMPREPLY=( $(compgen -W "hexadecimal_string >") ) return 0 ;; "-img2text" | "--img2text") COMPREPLY=( $(compgen -W "_line_separator >") ) return 0 ;; "-is_image_arg" | "--is_image_arg") COMPREPLY=( $(compgen -W "string >") ) return 0 ;; "-is_percent" | "--is_percent") COMPREPLY=( $(compgen -W "string >") ) return 0 ;; "-normalize_filename" | "--normalize_filename") COMPREPLY=( $(compgen -W "filename >") ) return 0 ;; "-oct" | "--oct") COMPREPLY=( $(compgen -W "octal_int1,... >") ) return 0 ;; "-oct2dec" | "--oct2dec") COMPREPLY=( $(compgen -W "octal_int1,... >") ) return 0 ;; "-padint" | "--padint") COMPREPLY=( $(compgen -W "number,_size>0 >") ) return 0 ;; "-quote" | "--quote") COMPREPLY=( $(compgen -W "string >") ) return 0 ;; "-region_feature" | "--region_feature") COMPREPLY=( $(compgen -W "region_label,feature,_default_value >") ) return 0 ;; "-str" | "--str") COMPREPLY=( $(compgen -W "string >") ) return 0 ;; "-str2hex" | "--str2hex") COMPREPLY=( $(compgen -W "string >") ) return 0 ;; "-stresc" | "--stresc") COMPREPLY=( $(compgen -W "val1,...,valN >") ) return 0 ;; "-strcat" | "--strcat") COMPREPLY=( $(compgen -W "string1,string2,... >") ) return 0 ;; "-strcmp" | "--strcmp") COMPREPLY=( $(compgen -W "string1,string2 >") ) return 0 ;; "-strcontains" | "--strcontains") COMPREPLY=( $(compgen -W "string1,string2 >") ) return 0 ;; "-strlen" | "--strlen") COMPREPLY=( $(compgen -W "string1 >") ) return 0 ;; "-strreplace" | "--strreplace") COMPREPLY=( $(compgen -W "string,search,replace >") ) return 0 ;; "-struncase" | "--struncase") COMPREPLY=( $(compgen -W "string >") ) return 0 ;; "-strver" | "--strver") COMPREPLY=( $(compgen -W "_version >") ) return 0 ;; "-demo" | "--demo") COMPREPLY=( $(compgen -W "_run_in_parallel={0=no|1=yes|2=auto} >") ) return 0 ;; "-x_color_curves" | "--x_color_curves") COMPREPLY=( $(compgen -W "_colorspace={rgb|cmy|cmyk|hsi|hsl|hsv|lab|lch|ycbcr|last} >") ) return 0 ;; "-x_colorize" | "--x_colorize") COMPREPLY=( $(compgen -W "_is_lineart={0|1},_max_resolution={0|>=128},_multichannels_output={0|1},_[palette1],_[palette2] >") ) return 0 ;; "-x_jawbreaker" | "--x_jawbreaker") COMPREPLY=( $(compgen -W "0<_width<20,0<_height<20,0<_balls<=8 >") ) return 0 ;; "-x_mandelbrot" | "--x_mandelbrot") COMPREPLY=( $(compgen -W "_julia={0|1},_c0r,_c0i >") ) return 0 ;; "-x_minesweeper" | "--x_minesweeper") COMPREPLY=( $(compgen -W "8<=_width=<20,8<=_height<=20 >") ) return 0 ;; "-x_quantize_rgb" | "--x_quantize_rgb") COMPREPLY=( $(compgen -W "_nbcolors>=2 >") ) return 0 ;; "-x_segment" | "--x_segment") COMPREPLY=( $(compgen -W "_max_resolution={0|>=128} >") ) return 0 ;; "-x_select_color" | "--x_select_color") COMPREPLY=( $(compgen -W "_variable_name >") ) return 0 ;; "-x_select_function1d" | "--x_select_function1d") COMPREPLY=( $(compgen -W "_variable_name,_background_curve_R,_background_curve_G,_background_curve_B >") ) return 0 ;; "-x_select_palette" | "--x_select_palette") COMPREPLY=( $(compgen -W "_variable_name,_number_of_columns={0=auto|>0} >") ) return 0 ;; "-x_whirl" | "--x_whirl") COMPREPLY=( $(compgen -W "_opacity>=0 >") ) return 0 ;; "-h" | "--h") COMPREPLY=( $(compgen -W "$coms" -- "$cur") ) return 0 ;; "-d" | "--d") COMPREPLY=( $(compgen -W "_X>=0,_Y>=0,_Z>=0,_exit_on_anykey={0|1} >") ) return 0 ;; "-d3d" | "--d3d") COMPREPLY=( $(compgen -W "_[background_image],_exit_on_anykey={0|1} _exit_on_anykey={0|1}") ) return 0 ;; "-da" | "--da") COMPREPLY=( $(compgen -W "_width>0,_height>0 >") ) return 0 ;; "-dg" | "--dg") COMPREPLY=( $(compgen -W "_width>32,_height>32,_plot_type,_vertex_type,_xmin,_xmax,_ymin,_ymax,_xlabel,_ylabel >") ) return 0 ;; "-dh" | "--dh") COMPREPLY=( $(compgen -W "_width>0,_height>0,_clusters>0,_min_value[%],_max_value[%],_show_axes={0|1},_expression. >") ) return 0 ;; "-dp" | "--dp") COMPREPLY=( $(compgen -W "_width>32,_height>32,_outline_type,_fill_R,_fill_G,_fill_B,_theta_start,_theta_end,_xlabel,_ylabel >") ) return 0 ;; "-dt" | "--dt") COMPREPLY=( $(compgen -W "_size_factor>0,_ellipse_factor>=0,_colored_mode={0|1} >") ) return 0 ;; "-dw" | "--dw") COMPREPLY=( $(compgen -W "_cell_size>0 >") ) return 0 ;; "-e" | "--e") COMPREPLY=( $(compgen -W "message >") ) return 0 ;; "-on" | "--on") COMPREPLY=( $(compgen -W "filename >") ) return 0 ;; "-op" | "--op") COMPREPLY=( $(compgen -W "prefix >") ) return 0 ;; "-ox" | "--ox") COMPREPLY=( $(compgen -W "extension1,_extension2,_...,_extensionN,_output_at_same_location={0|1} >") ) return 0 ;; "-sh" | "--sh") COMPREPLY=( $(compgen -W "x0[%],x1[%],y[%],z[%],v[%] y0[%],y1[%],z[%],v[%] z0[%],z1[%],v[%] v0[%],v1[%] v0[%] (noarg)") ) return 0 ;; "-v" | "--v") COMPREPLY=( $(compgen -W "level {+|-}") ) return 0 ;; "-w" | "--w") COMPREPLY=( $(compgen -W "_width[%]>=-1,_height[%]>=-1,_normalization,_fullscreen,_pos_x[%],_pos_y[%],_title >") ) return 0 ;; "-mv" | "--mv") COMPREPLY=( $(compgen -W "position[%] >") ) return 0 ;; "-nm" | "--nm") COMPREPLY=( $(compgen -W ""name" >") ) return 0 ;; "-nms" | "--nms") COMPREPLY=( $(compgen -W "name1,name2,...,nameN >") ) return 0 ;; "-+" | "--+") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-&" | "--&") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-<<" | "--<<") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "->>" | "-->>") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-/" | "--/") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-==" | "--==") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "->=" | "-->=") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "->" | "-->") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-<=" | "--<=") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-<" | "--<") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-//" | "--//") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-%" | "--%") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-**" | "--**") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-*" | "--*") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-!=" | "--!=") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-|" | "--|") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-^" | "--^") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "--" | "---") COMPREPLY=( $(compgen -W "value[%] [image] 'formula' (noarg)") ) return 0 ;; "-c" | "--c") COMPREPLY=( $(compgen -W "{value0[%]|[image0]},{value1[%]|[image1]} [image] (noarg)") ) return 0 ;; "-f" | "--f") COMPREPLY=( $(compgen -W "value1,_value2,.. [image] 'formula'") ) return 0 ;; "-ir" | "--ir") COMPREPLY=( $(compgen -W "min[%],max[%] >") ) return 0 ;; "-n" | "--n") COMPREPLY=( $(compgen -W "{value0[%]|[image0]},{value1[%]|[image1]} [image]") ) return 0 ;; "-=" | "--=") COMPREPLY=( $(compgen -W "value,_x[%],_y[%],_z[%],_c[%] >") ) return 0 ;; "-ac" | "--ac") COMPREPLY=( $(compgen -W ""command",channels,_value_action={0=none|1=cut|2=normalize} >") ) return 0 ;; "-fc" | "--fc") COMPREPLY=( $(compgen -W "col1,...,colN >") ) return 0 ;; "-a" | "--a") COMPREPLY=( $(compgen -W "[image],axis,_centering axis,_centering") ) return 0 ;; "-z" | "--z") COMPREPLY=( $(compgen -W "x0[%],x1[%],_boundary x0[%],y0[%],x1[%],y1[%],_boundary x0[%],y0[%],z0[%],x1[%],y1[%],z1[%],_boundary x0[%],y0[%],z0[%],c0[%],x1[%],y1[%],z1[%],c1[%],_boundary (noarg)") ) return 0 ;; "-r" | "--r") COMPREPLY=( $(compgen -W "[image],_interpolation,_boundary,_ax,_ay,_az,_ac {[image_w]|width>0[%]},_{[image_h]|height>0[%]},_{[image_d]|depth>0[%]},_{[image_s]|spectrum>0[%]},_interpolation,_boundary,_ax,_ay,_az,_ac (noarg)") ) return 0 ;; "-rr2d" | "--rr2d") COMPREPLY=( $(compgen -W "width>0,height>0,_mode={0=inside|1=outside|2=padded},0=<_interpolation<=6 >") ) return 0 ;; "-r2dx" | "--r2dx") COMPREPLY=( $(compgen -W "width[%]>0,_interpolation,_boundary,_ax,_ay,_az,_ac >") ) return 0 ;; "-r2dy" | "--r2dy") COMPREPLY=( $(compgen -W "height[%]>=0,_interpolation,_boundary,_ax,_ay,_az,_ac >") ) return 0 ;; "-r3dx" | "--r3dx") COMPREPLY=( $(compgen -W "width[%]>0,_interpolation,_boundary,_ax,_ay,_az,_ac >") ) return 0 ;; "-r3dy" | "--r3dy") COMPREPLY=( $(compgen -W "height[%]>0,_interpolation,_boundary,_ax,_ay,_az,_ac >") ) return 0 ;; "-r3dz" | "--r3dz") COMPREPLY=( $(compgen -W "depth[%]>0,_interpolation,_boundary,_ax,_ay,_az,_ac >") ) return 0 ;; "-s" | "--s") COMPREPLY=( $(compgen -W "{x|y|z|c}..{x|y|z|c},_split_mode keep_splitting_values={+|-},_{x|y|z|c}..{x|y|z|c},value1,_value2,... (noargs)") ) return 0 ;; "-y" | "--y") COMPREPLY=( $(compgen -W "_axis={x|y|z|c} >") ) return 0 ;; "-b" | "--b") COMPREPLY=( $(compgen -W "std_variation>=0[%],_boundary,_kernel axes,std_variation>=0[%],_boundary,_kernel") ) return 0 ;; "-g" | "--g") COMPREPLY=( $(compgen -W "{x|y|z}..{x|y|z},_scheme (noarg)") ) return 0 ;; "-j" | "--j") COMPREPLY=( $(compgen -W "[sprite],_x[%],_y[%],_z[%],_c[%],_opacity,_[sprite_mask],_max_opacity_mask >") ) return 0 ;; "-j3d" | "--j3d") COMPREPLY=( $(compgen -W "[object3d],_x[%],_y[%],_z,_opacity,_rendering_mode,_is_double_sided={0|1},_is_zbuffer={0|1},_focale,_light_x,_light_y,_light_z,_specular_lightness,_specular_shininess >") ) return 0 ;; "-t" | "--t") COMPREPLY=( $(compgen -W "text,_x[%],_y[%],_font_height[%]>=0,_opacity,_color1,.. >") ) return 0 ;; "-+3d" | "--+3d") COMPREPLY=( $(compgen -W "tx,_ty,_tz [object3d] (noarg)") ) return 0 ;; "-col3d" | "--col3d") COMPREPLY=( $(compgen -W "R,_G,_B,_opacity >") ) return 0 ;; "-/3d" | "--/3d") COMPREPLY=( $(compgen -W "factor factor_x,factor_y,_factor_z") ) return 0 ;; "-db3d" | "--db3d") COMPREPLY=( $(compgen -W "_is_double_sided={0|1} >") ) return 0 ;; "-f3d" | "--f3d") COMPREPLY=( $(compgen -W "focale >") ) return 0 ;; "-l3d" | "--l3d") COMPREPLY=( $(compgen -W "position_x,position_y,position_z [texture] (noarg)") ) return 0 ;; "-m3d" | "--m3d") COMPREPLY=( $(compgen -W "_mode >") ) return 0 ;; "-md3d" | "--md3d") COMPREPLY=( $(compgen -W "_mode >") ) return 0 ;; "-*3d" | "--*3d") COMPREPLY=( $(compgen -W "factor factor_x,factor_y,_factor_z") ) return 0 ;; "-o3d" | "--o3d") COMPREPLY=( $(compgen -W "_opacity >") ) return 0 ;; "-p3d" | "--p3d") COMPREPLY=( $(compgen -W "mode >") ) return 0 ;; "-r3d" | "--r3d") COMPREPLY=( $(compgen -W "u,v,w,angle >") ) return 0 ;; "-sl3d" | "--sl3d") COMPREPLY=( $(compgen -W "value>=0 >") ) return 0 ;; "-ss3d" | "--ss3d") COMPREPLY=( $(compgen -W "value>=0 >") ) return 0 ;; "-s3d" | "--s3d") COMPREPLY=( $(compgen -W "_keep_shared_data={0|1} >") ) return 0 ;; "--3d" | "---3d") COMPREPLY=( $(compgen -W "tx,_ty,_tz >") ) return 0 ;; "-t3d" | "--t3d") COMPREPLY=( $(compgen -W "[ind_texture],_[ind_coords] >") ) return 0 ;; "-ap" | "--ap") COMPREPLY=( $(compgen -W ""command" >") ) return 0 ;; "-apc" | "--apc") COMPREPLY=( $(compgen -W ""command" >") ) return 0 ;; "-apo" | "--apo") COMPREPLY=( $(compgen -W ""command",overlap[%],nb_threads={0=auto|1|2|4|8|16} >") ) return 0 ;; "-x" | "--x") COMPREPLY=( $(compgen -W "command >") ) return 0 ;; "-u" | "--u") COMPREPLY=( $(compgen -W "status_string >") ) return 0 ;; "-_u" | "--_u") COMPREPLY=( $(compgen -W "status_string >") ) return 0 ;; "-frame" | "--frame") COMPREPLY=( $(compgen -W "size_x[%],_size_y[%],_col1,...,_colN >") ) return 0 ;; esac if [[ "$cur" == -* ]] ; then COMPREPLY=( $(compgen -W "$opts" -- "$cur") ) else _filedir fi } complete -F _gmic_stdlib -o filenames gmicgmic-1.6.8/resources/cli_update168.gmic0000664000175000017500000605322412632021514020142 0ustar dtschumpdtschump#@gmic # # File : update168.gmic # ( G'MIC command file ) # # Description : Update file for G'MIC commands and filters (for version 1.6.8). # ( http://gmic.eu ) # # License : CeCILL v2.0 # ( http://www.cecill.info/licences/Licence_CeCILL_V2-en.html ) # #@gmic :: Global options cli_noarg : -version -v + -e[] "\n[gmic] No commands, options or data provided (type 'gmic -h' to get help)." -if {{*,u}>0} -e[] "[gmic] Running in demo mode." -v - -demo , -e[] "" -else -e[] "\n" -endif -v - cli_start : #@gmic debug : (+) #@gmic : Activate debug mode. #@gmic : When activated, the G'MIC interpreter becomes very verbose and outputs additionnal log #@gmic : messages about its internal state on the standard output (stdout). #@gmic : This option is useful for developers or to report possible bugs of the interpreter. #@gmic h : eq. to '-help'. h : -help $* #@gmic help : command : (no arg) #@gmic : Display help (optionally for specified command only) and exit. #@gmic : (eq. to '-h'). help : -skip ${1=""},${2=1} -if {!$!} -return -endif -y -a y --_help $1,$2 -k[0] -if {narg(${})} -_help[0] ${},0 -endif -rm _help : -skip ${1=""} -v -1 -use_vt100 -if {!narg("$1")} _is_example=0 -__help ascii -v + -e[] "" -v - -rm -u "" -return -endif ({'"$1"'}) -autocrop. {'-'} -if {{[100%]}=={']'}" && "i!={'['}} -l. -s -,{'['} -k[0] -endl -endif command={t} -rm. ks0="0" ks1="-k[0]" -if $2 -__help_header_ascii[] -endif -r 1,{h+1},1,1,0,0,0,1 -s +,{'"#@gmic "$command" :"'} -s +,{'"#@gmic "$command":"'} -s +,{'"#@gmic "$command"\n"'} -if {$!==1} -l[] -m "foo : -"$command -repeat 16 -uncommand $command -done -foo -uncommand foo -onfail ({'${}'}) -s -,{'" (did you mean "'} -if {$!>1} -s[1] -,39 -k[1] misspelling={t} -endif -rm -endl -if {narg($misspelling)} misspelling=" (did you mean '"$misspelling"' ?)" -endif -v + -e[] "\n[gmic] Command '"$command"' has no description"$misspelling". Try 'gmic -h' for global help.\n\n" -v - -rm -u "" -return -endif -rm[0] -a y -s -,10 stopflag=0 _is_example=0 -_document_gmic_header_ascii[] 0 -repeat $! -l[$>] -if {h>7" && "{${-head\ 6}'=='{'"#@gmic"'}}} -rows 7,100% -autocrop {'" "'} -if {i!={':'}} -s -,{'": "'} -autocrop {'" "'} -autocrop {':'} -autocrop {'" "'} -if {{0,t}'=='$command} -_document_gmic_declaration_ascii -if $_shortcut -v + -e[] "\n "$_gmic_m$_gmic_b"-"$command":"$_gmic_n$_gmic_m" Equivalent to '"$_gmic_b$_shortcutlink0$_gmic_n"'." -v - -u $_shortcutlink0 -return -endif -else stopflag=1 -endif -else -rows 1,100% -if {i=={':'}} stopflag=1 -else _is_tutorial= -autocrop {'" "'} -if {i=={'$'}} -rows 1,100% -autocrop {'" "'} -if {i=={'$'}} -v + -e[] "" -v - -if {h==1&&i=={'$'}} tuturl=http://gmic.eu/tutorial/_$command.shtml -else -autocrop {'$'} -autocrop {'" "'} tuturl=http://gmic.eu/tutorial/{0,t}.shtml -endif -rm ({'$_gmic_c${_gmic_b}"Tutorial:"$_gmic_n$_gmic_c" "$tuturl'}) -y _is_tutorial=1 -else -if $_is_example -i[0] ({'" "'}) -else -i[0] ({'"\n "$_gmic_c${_gmic_b}"Example: "$_gmic_n$_gmic_c'}) _is_example=1 -endif -y[0] -a y -endif -endif -_document_gmic_description_ascii -endif -endif -else stopflag=1 -endif ${ks{$!!=0}} -endl -if $stopflag -break -endif -done -v + -e[] $_gmic_n"\n" -v - -rm -u "" __help : -m "_help_section : -_help_section_$1 \"$""1\"" -m "_help_paragraph : -_help_paragraph_$1 \"$""1\"" -_help_header_$1[] -_help_usage[] -s -,{'__help_end\ :'} -k[0] -document_gmic $1,"img/",0 -_help_examples[] -_help_footer_$1[] _help_usage : -m "GMIC : -u ${_gmic_g}G\47MIC$_gmic_n" g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r -_help_paragraph " "$c${b}"gmic [-command1 [arg1_1,arg1_2,..]] .. [-commandN [argN_1,argN_2,..]]"$n" \n \n '"${g}"gmic"$n"' is the open-source interpreter of the "${-GMIC}" language, a script-based programming \n language dedicated to the design of possibly complex image processing pipelines. \n It can be used to convert, manipulate, filter and visualize image datasets made of one \n or several 1d/2d or 3d multi-spectral images. \n \n This reference documentation describes the rules and technical aspects of the "${-GMIC}" language. \n You may be also interested by our detailed tutorial pages, at: "${r}"http://gmic.eu/tutorial/"$n -_help_section "Overall context" -_help_paragraph " - At any time, "${-GMIC}" manages one list of numbered (and optionally named) pixel-based \n images, entirely stored in computer memory. \n \n - The first image of the list has indice '"${g}"0"$n"' and is denoted by '"$c"[0]"$n"'. The second image of \n the list is denoted by '"$c"[1]"$n"', the third by '"$c"[2]"$n"' and so on. \n \n - Negative indices are treated in a periodic way: '"$c"[-1]"$n"' refers to the last image of the \n list, '"$c"[-2]"$n"' to the penultimate one, etc. Thus, if the list has 4 images, '"$c"[1]"$n"' and '"$c"[-3]"$n"' \n both designate the second image of the list. \n \n - A named image may be indicated by '"$c"[name]"$n"', if '"${g}"name"$n"' uses the character set "$g"[a-zA-Z0-9_]"$n" \n and does not start with a number. Image names can be set or reassigned at any moment \n during the processing pipeline (see commands '"$c"-name"$n"' and '"$c"-input"$n"' for this purpose). \n \n - "${-GMIC}" defines a set of various commands and substitution mechanisms to allow the design \n of complex pipelines managing this list of images, in a very flexible way: \n You can insert or remove images in the list, rearrange image indices, process images \n (individually or grouped), merge image data together, display and output image files, etc. \n \n - Such a pipeline can be written itself as a custom "${-GMIC}" command storable in a user \n command file, and can be re-used afterwards in another pipeline if necessary." -_help_section "Image definition and terminology" -_help_paragraph " - In "${-GMIC}", each image is modeled as a 1d, 2d, 3d or 4d array of scalar values, uniformly \n discretized on a rectangular/parallelepipedic domain. \n \n - The four dimensions of this array are respectively denoted by: \n \n . '"${g}"width"$n"', the number of image columns (size along the "$g"'x'-axis"$n"). \n . '"${g}"height"$n"', the number of image rows (size along the "$g"'y'-axis"$n"). \n . '"${g}"depth"$n"', the number of image slices (size along the "$g"'z'-axis"$n"). \n The depth is equal to 1 for usual color or grayscale 2d images. \n . '"${g}"spectrum"$n"', the number of image channels (size along the "$g"'c'-axis"$n"). \n The spectrum is respectively equal to 3 and 4 for usual RGB and RGBA color images. \n \n - There are no limitations on the size of each image dimension. For instance, the number of \n image slices or channels can be of arbitrary size within the limits of available memory. \n \n - The "${g}"width, height"$n" and "${g}"depth"$n" of an image are considered as spatial dimensions, while the \n "${g}"spectrum"$n" has a multi-spectral meaning. Thus, a 4d image in "${-GMIC}" should be most often \n regarded as a 3d dataset of multi-spectral voxels. Most of the "${-GMIC}" commands will stick \n with this idea (e.g. command '"$c"-blur"$n"' blurs images only along the spatial '"${g}"xyz"$n"'-axes). \n \n - "${-GMIC}" stores all the image data as buffers of '"${g}"float"$n"' values (32 bits, \n value range "$g"[-3.4E38,+3.4E38]"$n"). It performs all its image processing operations with \n floating point numbers. Each image pixel takes then 32bits/channel (except if double- \n precision buffers have been enabled during the compilation of the software, in which case \n 64bits/channel is the default). \n \n - Considering '"${g}"float"$n"'-valued pixels ensure to keep the numerical precision when executing \n image processing pipelines. For image input/output operations, you may want to prescribe \n the image datatype to be different than '"${g}"float"$n"' (like '"${g}"bool"$n"', '"${g}"char"$n"', '"${g}"int"$n"', etc...). \n This is possible by specifying it as a file option when using I/O commands. \n (see section '"${c}"Input/output properties"$n"' to learn more about file options)." -_help_section "Items of a processing pipeline" -_help_paragraph " - In "${-GMIC}", an image processing pipeline is described as a sequence of items separated by \n the space character ' '. Such items are interpreted and executed from the left to the \n right. For instance, the expression: \n \n "${c}"filename.jpg -blur 3,0 -sharpen 10 -resize 200%,200% -output output.jpg"$n" \n \n defines a valid pipeline composed of nine "${-GMIC}" items. \n \n - Each "${-GMIC}" item is a string that is either a command, a list of command arguments, \n a filename, or a special input string. \n \n - Escape characters '"$g"\\"$n"' and double quotes '"$g"\""$n"' can be used to define items containing \n spaces or other special characters. For instance, the two strings \n '"${c}"single\\ item"$n"' and '"${c}"\"single item\""$n"' define the same single item, with a space in it." -_help_section "Input data items" -_help_paragraph " - If a specified "${-GMIC}" item appears to be an existing filename, the corresponding image \n data are loaded and inserted at the end of the image list (which is equivalent to the \n use of '"$c"-input filename"$n"'). \n \n - Special filenames '"$c"-"$n"' and '"$c"-.ext"$n"' stand for the standard input/output streams, optionally \n forced to be in a specific '"${g}"ext"$n"' file format (e.g. '"$c"-.jpg"$n"' or '"$c"-.png"$n"'). \n \n - The following special input strings may be used as "${-GMIC}" items to create and insert new \n images with prescribed values, at the end of the image list: \n \n . '"$c"[selection]"$n"' or '"$c"[selection]xN"$n"': Insert 1 or N copies of already existing images. \n '"${g}"selection"$n"' may represent one or several images \n (see section '"${c}"Command items and selections"$n"' to learn more about selections). \n \n . '"${c}"width[%],_height[%],_depth[%],_spectrum[%],_values"$n"': Insert a new image with \n specified size and values (adding '"$g"%"$n"' to a dimension means 'percentage of the size \n along the same axis, taken from the last image '"$g"[-1]"$n"''). Any specified dimension \n can be also written as '"$c"[image]"$n"', and is then set to the size (along the same axis) \n of the existing specified image "$g"[image]"$n". '"${g}"values"$n"' can be either a sequence of numbers \n separated by commas '"$g","$n"', or a mathematical expression, as e.g. in input item \n '"${c}"256,256,1,3,if(c==0,x,if(c==1,y,0))"$n"' which creates a 256x256 RGB color image with a \n spatial shading on the red and green channels. \n (see section '"${c}"Mathematical expressions"$n"' to learn more about mathematical expressions). \n \n . '"$c"(v1,v2,..)"$n"': Insert a new image from specified prescribed values. \n Value separator inside parentheses can be '"$g","$n"' (column separator), '"$g";"$n"' (row separator), \n '"$g"/"$n"' (slice separator) or '"$g"^"$n"' (channel separator). For instance, expression \n '"$c"(1,2,3;4,5,6;7,8,9)"$n"' creates a 3x3 matrix (scalar image), with values running from 1 to 9. \n \n . '"${c}"0"$n"': Insert a new '"${g}"empty"$n"' image, containing no pixel data. Empty images are used only \n in rare occasions. \n \n - Input item '"${c}"name=value"$n"' declares a new local or global variable '"${g}"name"$n"', or assign a new \n value to an existing variable. Variable names must use the character set "$g"[a-zA-Z0-9_]"$n" and \n cannot start with a number. \n \n - A variable definition is always local to the current command except when it starts by the \n underscore character '"${g}"_"$n"'. In that case, it becomes also accessible by any command invoked \n outside the current command scope (global variable). \n \n - If a variable name starts with two underscores '"${g}"__"$n"', the global variable is also shared \n among different threads and can be read/set by commands running in parallel (see command \n '"${c}"-parallel"$n"' for this purpose). Otherwise, it remains local to the thread that defined it. \n \n - Numerical variables can be updated with the use of these special operators: \n '"${g}"+="$n"' (addition), '"${g}"-="$n"' (subtraction), '"${g}"*="$n"' (multiplication), '"${g}"/="$n"' (division), '"${g}"%="$n"' (modulo), \n '"${g}"&="$n"' (bitwise and), '"${g}"|="$n"' (bitwise or), '"${g}"^="$n"' (power), '"${g}"<<="$n"' and '"${g}">>="$n"' (bitwise left \n and right shifts). As in: '"${c}"foo=1 foo+=3"$n"'. " -_help_section "Command items and selections" -_help_paragraph " - A "${-GMIC}" item starting by a hyphen '"$g"-"$n"' designates a "${g}"command"$n", most of the time. Generally, \n commands perform image processing operations on one or several available images of the list. \n \n - Reccurent commands have two equivalent names ("${g}"regular"$n" and "${g}"short"$n"). For instance, command \n names '"$c"-resize"$n"' and '"$c"-r"$n"' refer to the same image resizing action. \n \n - A "${-GMIC}" command may have mandatory or optional "${g}"arguments"$n". Command arguments must be \n specified in the next item on the command line. Commas '"$g","$n"' are used to separate multiple \n arguments of a single command, when required. \n \n - The execution of a "${-GMIC}" command may be restricted only to a "${g}"subset"$n" of the image list, by \n appending '"$c"[selection]"$n"' to the command name. Examples of valid syntaxes for '"${g}"selection"$n"' are: \n \n . '"$c"-command[-2]"$n"': Apply command only on the penultimate image "$g"[-2]"$n" of the list. \n . '"$c"-command[0,1,3]"$n"': Apply command only on images "$g"[0],[1]"$n" and "$g"[3]"$n". \n . '"$c"-command[3-6]"$n"': Apply command only on images "$g"[3]"$n" to "$g"[6]"$n" (i.e, "$g"[3],[4],[5]"$n" and "$g"[6]"$n"). \n . '"$c"-command[50%-100%]"$n"': Apply command only on the second half of the image list. \n . '"$c"-command[0,-4--1]"$n"': Apply command only on the first image and the last four images. \n . '"$c"-command[0-9:3]"$n"': Apply command only on images "$g"[0]"$n" to "$g"[9]"$n", with a step of 3 \n (i.e. on images "$g"[0], [3], [6]"$n" and "$g"[9]"$n"). \n . '"$c"-command[0--1:2]"$n"': Apply command only on images of the list with even indices. \n . '"$c"-command[0,2-4,50%--1]"$n"': Apply command on images "$g"[0],[2],[3],[4]"$n" and on the second half \n of the image list. \n . '"$c"-command[^0,1]"$n"': Apply command on all images except the two first. \n . '"$c"-command[name1,name2]"$n"': Apply command on named images '"${g}"name1"$n"' and '"${g}"name2"$n"'. \n \n - Indices in selections are always sorted in increasing order, and duplicate indices are \n discarded. For instance, selections '"$c"[3-1,1-3]"$n"' and '"$c"[1,1,1,3,2]"$n"' are both equivalent to \n '"$c"[1-3]"$n"'. If you want to repeat a single command multiple times on an image, use a \n '"$c"-repeat..-done"$n"' loop instead. Inverting the order of images for a command is achieved by \n explicitly inverting the order of the images in the list, with command '"$c"-reverse[selection]"$n"'. \n \n - Command selections '"$c"[-1]"$n"','"$c"[-2]"$n"' and '"$c"[-3]"$n"' are so often used that they have their own shortcuts, \n respectively '"$c"."$n"', '"$c".."$n"' and '"$c"..."$n"'. For instance, command '"$c"-blur.."$n"' is equivalent to '"$c"-blur[-2]"$n"'. \n These shortcuts work only for command selections, not for command arguments. \n \n - "${-GMIC}" commands invoked without '"$c"[selection]"$n"' are applied on all images of the list, i.e. the \n default selection is '"$c"[0--1]"$n"' (except for command '"$c"-input"$n"' whose default selection is '"$c"[-1]"$n"'). \n \n - A "${-GMIC}" command starting with a double hyphen '"$g"--"$n"' (instead of a single hyphen '"$g"-"$n"') does not act \n 'in-place' but inserts its result as one or several new images at the end of the image list. \n \n - There are two different types of commands that can be run by the "${-GMIC}" interpreter: \n \n . "${g}"Native commands"$n", are the hard-coded functionalities in the interpreter core. \n They are thus compiled as binary code and run fast, most of the time. \n Omitting an argument when invoking a native command is not permitted, except if all \n following arguments are also omitted. For instance, call to '"$c"-plasma 10,,5"$n"' is invalid \n but '"$c"-plasma 10"$n"' is correct. \n . "${g}"Custom commands"$n", are defined as "${-GMIC}" pipelines of native or custom commands. \n They are interpreted by the "${-GMIC}" interpreter, and thus run a bit slower than native commands. \n Omitting arguments when invoking a custom command is permitted. For instance, \n expressions '"$c"-flower ,,,100,,2"$n"' or '"$c"-flower ,"$n"' are correct. \n \n - Most of the existing commands in "${-GMIC}" are actually defined as "${g}"custom commands"$n". \n \n - A user can easily add its own custom commands to the "${-GMIC}" interpreter (see section \n "${c}"'Adding custom commands"$n"' for more details). New native commands cannot be added \n (unless you modify the "${-GMIC}" interpreter source code and recompile it, of course!)." -_help_section "Input/output properties" -_help_paragraph " - "${-GMIC}" is able to read/write most of the classical image file formats, including: \n \n . 2d grayscale/color files: "$c".png, .jpeg, .gif, .pnm, .tif, .bmp, .."$n" \n . 3d volumetric files: "$c".dcm, .hdr, .nii, .pan, .inr, .pnk, .."$n" \n . video files: "$c".mpeg, .avi, .mov, .ogg, .flv, .."$n" \n . Generic ascii or binary data files: "$c".gmz, .cimg, .cimgz, .dlm, .asc, .pfm, .raw, .txt, .h."$n" \n . 3d object files: "$c".off."$n" \n \n - When dealing with color images, "${-GMIC}" generally reads, writes and displays data using the \n usual sRGB color space. \n \n - "${-GMIC}" is able to manage "${g}"3d objects"$n" that may be read from files or generated by "${-GMIC}" \n commands. A 3d object is stored as a one-column scalar image containing the object data, \n in the following order: "$g"{ magic_number; sizes; vertices; primitives; colors; opacities }"$n". \n These 3d representations can be processed as regular images. \n (see command '"$c"-split3d"$n"' for accessing each of these 3d object data separately). \n \n - Be aware that usual file formats may be sometimes not adapted to store all the available \n image data, since "${-GMIC}" uses float-valued image buffers. For instance, saving an image \n that was initially loaded as a 16bits/channel image, as a "$c".jpg"$n" file will result in a \n loss of information. Use the "${-GMIC}"-specific file extensions "$c".cimgz"$n" or "$c".gmz"$n" to ensure \n that all data precision are preserved when saving images. \n \n - Sometimes, file options may/must be set for file formats: \n \n . "${g}"Video files:"$n" Only sub-frames of an image sequence may be loaded, using the input \n expression '"${c}"filename.ext,[first_frame[,last_frame[,step]]]"$n"'. \n Set '"${g}"last_frame==-1"$n"' to tell it must be the last frame of the video. \n Set '"${g}"step"$n"' to 0 to force an opened video file to be opened/closed. \n Output framerate and codec can be also set by using the output expression \n '"${c}"filename.avi,_fps,_codec,_keep_open={ 0 | 1 }"$n"'. \n '"${g}"codec"$n"' is a 4-char string (see "${r}"http://www.fourcc.org/codecs.php"$n") or '"${g}"0"$n"' for the default codec. \n '"${g}"keep_open"$$n"' tells if the output video file must be kept open for appending new frames afterwards. \n \n . "$g".cimg[z] files:"$n" Only crops and sub-images of .cimg files can be loaded, using the input \n expressions '"${c}"filename.cimg,N0,N1"$n"', '"${c}"filename.cimg,N0,N1,x0,x1"$n"', \n '"${c}"filename.cimg,N0,N1,x0,y0,x1,y1"$n"', '"${c}"filename.cimg,N0,N1,x0,y0,z0,x1,y1,z1"$n"' or \n '"${c}"filename.cimg,N0,N1,x0,y0,z0,c0,x1,y1,z1,c1"$n"'. \n Specifying '"${g}"-1"$n"' for one coordinates stands for the maximum possible value. \n Output expression '"${c}"filename.cimg[z][,datatype]"$n"' can be used to force the output pixel type. \n '"${g}"datatype"$n"' can be "$g"{ uchar | char | ushort | short | uint | int | ulong | long | float | double }"$n". \n \n . "$g".raw binary files:"$n" Image dimensions and input pixel type may be specified when loading \n "$g".raw"$n" files with input expresssion '"${c}"filename.raw[,datatype][,width][,height[,depth[,dim]]]]"$n"'. \n If no dimensions are specified, the resulting image is a one-column vector with \n maximum possible height. Pixel type can also be specified with the output \n expression '"${c}"filename.raw[,datatype]"$n"'. \n '"${g}"datatype"$n"' can be "$g"{ uchar | char | ushort | short | uint | int | ulong | long | float | double }"$n". \n \n . "$g".yuv files:"$n" Image dimensions must be specified, and only sub-frames of an image \n sequence may be loaded, using the input expression \n '"${c}"filename.yuv,width,height[,first_frame[,last_frame[,step]]]"$n"'. \n \n . "$g".tiff files:"$n" Only sub-images of multi-pages tiff files can be loaded, using the input \n expression '"${c}"filename.tif,[first_frame,[last_frame,[step]]]"$n"'. \n Output expression '"${c}"filename.tiff,[datatype[,compression[,force_multipage]]"$n"' can be used to \n specify the output pixel type, as well as the compression method. \n '"${g}"datatype"$n"' can be "$g"{ uchar | char | ushort | short | uint | int | ulong | long | float | double }"$n". \n '"${g}"compression"$n"' can be "$g"{ none | lzw | jpeg }"$n" and '"${g}"force_multipage"$n" can be "$g"{ 0=no | 1=yes }"$n". \n \n . "$g".gif files:"$n" Animated gif files can be saved, using the input expression \n '"${c}"filename.gif,fps>0,nb_loops"$n"'. \n Specify '"${g}"nb_loops=0"$n"' to get an infinite number of animation loops (default). \n \n . "$g".jpeg files:"$n" The output quality may be specified (in %), using the output expression \n '"${c}"filename.jpg,30"$n"' (here, to get a 30% quality output). '"${g}"100%"$n"' is the default. \n \n . "$g".mnc files:"$n" The output header can set from another file, using the output expression \n '"${c}"filename.mnc,header_template.mnc"$n"'. \n \n . "$g".pan, .cpp, .hpp, .c and .h files:"$n" The output datatype can be selected with output expression \n '"${c}"filename[,datatype]"$n"'. \n '"${g}"datatype"$n"' can be "$g"{ uchar | char | ushort | short | uint | int | ulong | long | float | double }"$n". \n \n . "$g".gmic files:"$n" These filenames are assumed to be "${-GMIC}" custom commands files. Loading \n such a file will add the commands it defines to the interpreter. Debug information can be \n enabled/disabled by the input expression '"${c}"filename.gmic,add_debug_info={ 0 | 1 }"$n"'. \n \n . Inserting '"${c}"ext:"$n"' on the beginning of a filename (e.g. '"${c}"jpg:filename"$n"') forces "${-GMIC}" to \n read/write the file as it would have been done if it had the specified extension '"${g}".ext"$n"'. \n \n - Some input/output formats and options may not be supported, depending on the configuration flags \n set during the build of the "${-GMIC}" software." -_help_section "Substitution rules" -_help_paragraph " - "${-GMIC}" items containing '"$g"$"$n"' or '"$g"{}"$n"' are substituted before being interpreted. \n Use these substituting expressions to access various data from the interpreter environment. \n \n - '"$c"$name"$n"' and '"$c"${name}"$n"' are both substituted by the value of the specified named "${g}"variable"$n" \n (set previously by the item '"${c}"name=value"$n"'). If this variable has not been already set, \n the expression is substituted by the highest positive "${g}"indice"$n" of the named image '"${g}"[name]"$n"'. \n If no image has this name, the expression is substituted by the value of the \n "${g}"OS environment variable"$n" with same name (it may be thus an empty string). \n The following reserved variables are predefined by the "${-GMIC}" interpreter: \n \n . '"$c"$!"$n"': The current number of images in the list. \n . '"$c"$>"$n"' and '"$c"$<"$n"': The increasing/decreasing indice of the latest (currently running) \n '"${c}"repeat..done"$n"' loop. \n . '"$c"$/"$n"': The current call stack. Stack items are separated by slashes '"$g"/"$n"'. \n . '"$c"$|"$n"': The current value (expressed in seconds) of a millisecond precision timer. \n . '"$c"$^"$n"': The current verbosity level. \n . '"$c"$_cpus"$n"': The number of computation cores available on your machine. \n . '"$c"$_pid"$n"': The current process identifier, as an integer. \n . '"$c"$_prerelease"$n"': For pre-releases only, the date of the pre-release as '"${g}"mmddyy"$n"'. \n For stable releases, this variable is not defined. \n . '"$c"$_version"$n"': A 3-digits number telling about the current version of the "${-GMIC}" interpreter. \n (currently '"$g$_version$n"'). \n . '"$c"$_vt100"$n"': Set to "${g}"1"$n" (default value) if colored text output is allowed on the console. \n . '"$c"$_path_rc"$n"': The path to the "${-GMIC}" folder used to store resources and configuration files \n (its value is OS-dependent). \n . '"$c"$_path_user"$n"': The path to the "${-GMIC}" user file .gmic (its value is OS-dependent). \n \n - '"$c"${\"command line\"}"$n"' is substituted by the "${g}"status value"$n" set by the execution of the \n specified command line (see command '"$c"-status"$n"' to learn more about status). \n Expression '"$c"${}"$n"' thus stands for the "${g}"current status value"$n". \n \n - '"$c"{'string'}"$n"' (single quotes) is substituted by the "${g}"sequence of ascii codes"$n" that compose \n the specified string, separated by commas '"$g","$n"'. For instance, item '"$c"{'foo'}"$n"' is substituted \n by '"${c}"102,111,111"$n"'. \n \n - '"$c"{`value1,...,valueN`}"$n"' (backquotes) is substituted by the string whose ascii sequence \n corresponds to the list of values specified between the backquotes. \n For instance, item '"$c"{`102,111,111`}"$n"' is substituted by '"${c}"foo"$n"'. \n \n - '"$c"{string1'=='string2}"$n"' is substituted by "${c}"0"$n" or "${c}"1"$n", whether the two specified strings coincide \n or not (test is case-sensitive). \n \n - '"$c"{string1'!='string2}"$n"' is substituted by "${c}"0"$n" or "${c}"a non-null integer"$n", whether the two strings \n beside the operator are different or not (test is case-sensitive). For instance, \n item '"$c"{foo'!='foo}"$n"' is substituted by '"${c}"0"$n"' and '"$c"{foo'!='FOO}"$n"' by '"${c}"32"$n"'. \n \n - '"$c"{image,feature}"$n"' is substituted by a specific feature of the image "$c"[image]"$n". \n '"${g}"image"$n"' can be either an image number or an image name. It can be also eluded. \n In which case, the last image '"$c"[-1]"$n"' of the list is considered for the requested feature. \n Specified '"${g}"feature"$n"' can be one of: \n \n . '"${c}"b"$n"': The image basename (i.e. filename without the folder path nor extension). \n . '"${c}"c"$n"': The (x,y,z,c) coordinates of the minimum value, separated by commas ','. \n . '"${c}"C"$n"': The (x,y,z,c) coordinates of the maximum value, separated by commas ','. \n . '"${c}"f"$n"': The image folder name. \n . '"${c}"n"$n"': The image name or filename (if the image has been read from a file). \n . '"${c}"t"$n"': The text string from the image values regarded as ascii codes. \n . '"${c}"x"$n"': The image extension (i.e last characters after the last '.' in the image name). \n . '"${c}"^"$n" : The sequence of all image values, separated by commas ','. \n . '"${c}"[subset]"$n"': The sequence of image values corresponding to the specified subset, \n and separated by commas ','. \n . Any other '"${c}"feature"$n"' is considered as a "${g}"mathematical expression"$n" associated to \n the image "$c"[image]"$n" and is substituted by the result of its evaluation (float value). \n For instance, expression '"$c"{0,w+h}"$n"' is substituted by the sum of the width and height \n of the first image (see section '"${c}"Mathematical expressions"$n"' for more details). \n If a mathematical expression starts with an underscore '"${g}"_"$n"', the resulting value is \n truncated to a readable format. For instance, item '"$c"{_pi}"$n"' is substituted by '"${g}"3.14159"$n"' \n (while '"$c"{pi}"$n"' is '"${g}"3.141592653589793"$n"'). \n \n - '"$c"{*}"$n"' is substituted by the "${g}"visibility state"$n" of the instant display window "$c"[0]"$n" \n (can be "$g"{ 0=closed | 1=visible }"$n"). \n \n - '"$c"{*,feature}"$n"' or '"$c"{*indice,feature}"$n"' is substituted by a specific feature of the \n instant display window "$c"#0"$n" (or "$c"#indice"$n", if specified). Requested '"${g}"feature"$n"' can be: \n \n . '"${c}"w"$n"': display width (i.e. width of the display area managed by the window). \n . '"${c}"h"$n"': display height (i.e. height of the display area managed by the window). \n . '"${c}"wh"$n"': display width x display height. \n . '"${c}"d"$n"': window width (i.e. width of the window widget). \n . '"${c}"e"$n"': window height (i.e. height of the window widget). \n . '"${c}"de"$n"': window width x window height. \n . '"${c}"u"$n"': screen width (actually independent on the window size). \n .' "${c}"v"$n"': screen height (actually independent on the window size). \n . '"${c}"uv"$n"': screen width x screen height. \n . '"${c}"n"$n"': current normalization type of the instant display. \n . '"${c}"t"$n"': window title of the instant display. \n . '"${c}"x"$n"': X-coordinate of the mouse position (or -1, if outside the display area). \n . '"${c}"y"$n"': Y-coordinate of the mouse position (or -1, if outside the display area). \n . '"${c}"b"$n"': state of the mouse buttons { 1=left-but. | 2=right-but. | 4=middle-but. }. \n . '"${c}"o"$n"': state of the mouse wheel. \n . '"${c}"k"$n"': decimal code of the pressed key if any, 0 otherwise. \n . '"${c}"c"$n"': boolean (0 or 1) telling if the instant display has been closed recently. \n . '"${c}"r"$n"': boolean telling if the instant display has been resized recently. \n . '"${c}"m"$n"': boolean telling if the instant display has been moved recently. \n . Any other '"${c}"feature"$n"' stands for a "${g}"keycode name"$n" (in capital letters), and is substituted \n by a boolean describing the current key state "$g"{ 0=pressed | 1=released }"$n". \n . You can also prepend a hyphen '"$c"-"$n"' to a '"${g}"feature"$n"' (that supports it) to flush the \n corresponding event immediately after reading its state (works for keys, mouse \n and window events). \n \n - Item substitution is "${g}"never performed in items between double quotes"$n". One must break the quotes \n to enable substitution if needed, as in "$c"\"3+8 kg = \"{3+8}\" kg\""$n". Using double quotes \n is then a convenient way to disable the substitutions mechanism in items, when necessary. \n \n - One can also disable the substitution mechanism on items outside double quotes, by \n escaping the '"$g"{"$n"','"$g"}"$n"' or '"$g"$"$n"' characters, as in '"$c"\\{3+4\\}\\ doesn\47t\\ evaluate"$n"'." -_help_section "Mathematical expressions" -_help_paragraph " - "${-GMIC}" has an embedded "${g}"mathematical parser"$n". It is used to evaluate expressions inside \n braces '"$g"{}"$n"', or formulas in commands that may take one as an argument (e.g. '"$c"-fill"$n"'). \n \n - When used as a command argument, a formula is evaluated "${g}"for each pixel"$n" of the selected images. \n \n - The mathematical parser understands the following set of functions, operators and variables: \n \n _ "${g}"Usual operators:"$n" "$c"||"$n" (logical or), "$c"&&"$n" (logical and), "$c"|"$n" (bitwise or), "$c"&"$n" (bitwise and), \n "$c"!=, ==, <=, >=, <, >, <<"$n" (left bitwise shift), "$c">>"$n" (right bitwise shift), "$c"-, +, *, /, \n %"$n" (modulo), "$c"^"$n" (power), "$c"!"$n" (logical not), "$c"~"$n" (bitwise not), \n "$c"++"$n", "$c"--"$n", "$c"+="$n", "$c"-="$n", "$c"*="$n", "$c"/="$n", "$c"%="$n", "$c"&="$n", "$c"|="$n", "$c"^="$n", "$c">>="$n", "$c"<<="$n" (in-place operators). \n \n _ "${g}"Usual functions:"$n" "${c}"sin(), cos(), tan(), asin(), acos(), atan(), atan2(), sinh(), cosh(), tanh(), \n sinc(), hypoth(), gauss(), abs(), sign(), log(), log2(), log10(), exp(), sqrt(), cbrt(), cut(), \n narg(), arg(), isval(), isnan(), isinf(), isint(), isbool(), isfile(), isdir(), isin(), \n rol()"$n" (left bit rotation), "${c}"ror()"$n" (right bit rotation), "${c}"min(), max(), argmin(), argmax(), \n med(), kth(), round(), int()"$n". \n \n . '"${c}"atan2(x,y)"$n"' is the version of '"${c}"atan()"$n"' with two arguments '"${g}"y"$n"' and '"${g}"x"$n"' (as in C/C++). \n . '"${c}"hypoth(x,y)"$n"' computes the square root of the sum of the squares of x and y. \n . '"${c}"gauss(x,_sigma)"$n"' returns '"${g}"exp(-x^2/(2*s^2))/sqrt(2*pi*sigma^2)'"$n". \n . '"${c}"cut(value,min,max)"$n"' returns value if it is in range "${g}"[min,max]"$n", or "${g}"min"$n" or "${g}"max"$n" otherwise. \n . '"${c}"narg(a_1,...,a_N)"$n"' returns the number of specified arguments (here, "${g}"N"$n"). \n . '"${c}"arg(i,a_1,..,a_N)"$n"' returns the ith argument "${g}"a_i"$n". \n . '"${c}"isval()"$n"', '"${c}"isnan()"$n"', '"${c}"isinf()"$n"', '"${c}"isint()"$n"', '"${c}"isbool()"$n"' test the type of \n the given number or expression, and return "${g}"0 (false)"$n" or "${g}"1 (true)"$n". \n . '"${c}"isfile()"$n"' (resp. '"${c}"isdir()"$n"') returns "${g}"0 (false)"$n" or "${g}"1 (true)"$n" whether its argument \n is a valid path to a file (resp. to a directory) or not. \n . '"${c}"isin(v,a_1,...,a_n)"$n"' returns "${g}"0 (false)"$n" or "${g}"1 (true)"$n" whether the first value '"${g}"v"$n"' appears \n in the set of other values 'a_i'. \n . '"${c}"min()"$n"', '"${c}"max()"$n"', '"${c}"argmin()"$n"', '"${c}"argmax()"$n"', '"${c}"med()"$n"' and '"${c}"kth()"$n"' can be called with \n an arbitrary number of arguments. \n . '"${c}"round(value,rounding_value,direction)"$n"' returns a rounded value. \n '"${g}"direction"$n"' can be "${g}"{ -1=to-lowest | 0=to-nearest | 1=to-highest }"$n". \n \n _ "${g}"Variable names"$n" below are pre-defined. They can be overloaded. \n \n . '"${c}"w"$n"': width of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"h"$n"': height of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"d"$n"': depth of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"s"$n"': spectrum of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"r"$n"': shared state of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"wh"$n"': shortcut for width x height. \n . '"${c}"whd"$n"': shortcut for width x height x depth. \n . '"${c}"whds"$n"': shortcut for width x height x depth x spectrum (i.e. total number of pixel values). \n . '"${c}"i"$n"': current processed pixel value (i.e. value located at "$g"(x,y,z,c)"$n") in the \n associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"iN"$n"': Nth channel value of current processed pixel (i.e. value located at "$g"(x,y,z,N)"$n") in \n the associated image, if any ("${g}"0"$n" otherwise). '"${g}"N"$n"' must be an integer in range "$g"[0,7]"$n". \n . '"${c}"R"$n"','"${c}"G"$n"','"${c}"B"$n"' and '"${c}"A"$n"' are equivalent to '"${c}"i0"$n"', '"${c}"i1"$n"', '"${c}"i2"$n"' and '"${c}"i3"$n"' respectively. \n . '"${c}"im"$n"','"${c}"iM"$n"','"${c}"ia"$n"','"${c}"iv"$n"','"${c}"is"$n"','"${c}"ip"$n"','"${c}"ic"$n"': Respectively the minimum, maximum, average values, \n variance, sum, product and median value of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"xm"$n"','"${c}"ym"$n"','"${c}"zm"$n"','"${c}"cm"$n"': The pixel coordinates of the minimum value in the associated \n image, if any ("${g}"0"$n" otherwise). \n . '"${c}"xM"$n"','"${c}"yM"$n"','"${c}"zM"$n"','"${c}"cM"$n"': The pixel coordinates of the maximum value in the associated \n image, if any ("${g}"0"$n" otherwise). \n . You may add '"${c}"#ind"$n"' to any of the variable name above to retrieve the information for any \n numbered image "${g}"[ind]"$n" of the list (when this makes sense). For instance '"${c}"ia#0"$n"' denotes the \n average value of the first image). \n . '"${c}"x"$n"': current processed column of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"y"$n"': current processed row of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"z"$n"': current processed slice of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"c"$n"': current processed channel of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"t"$n"': thread id when an expression is evaluated with multiple threads ("${g}"0"$n" means 'master thread'). \n . '"${c}"e"$n"': value of e, i.e. "${g}"2.71828.."$n" \n . '"${c}"pi"$n"': value of pi, i.e. "${g}"3.1415926.."$n" \n . '"${c}"u"$n"': a random value between "${g}"[0,1]"$n", following a uniform distribution. \n . '"${c}"g"$n"': a random value, following a gaussian distribution of variance 1 \n (roughly in "${g}"[-6,6]"$n"). \n . '"${c}"interpolation"$n"': value of the default interpolation mode used when reading pixel values with \n the pixel access operators (i.e. when the interpolation argument is not explicitly specified, \n see below for more details on pixel access operators). \n . '"${c}"boundary"$n"': value of the default boundary conditions used when reading pixel values with \n the pixel access operators (i.e. when the boundary condition argument is not explicitly specified, \n see below for more details on pixel access operators). \n \n _ "${g}"Special operators"$n" can be used: \n \n . '"$c";"$n"': expression separator. The returned value is always the last encountered \n expression. For instance expression '"${c}"1;2;pi"$n"' is evaluated as '"${c}"pi"$n"'. \n . '"$c"="$n"': variable assignment. Variables in mathematical parser can only refer to \n numerical values. Variable names are case-sensitive. Use this operator in \n conjunction with '"$c";"$n"' to define more complex evaluable expressions, such as \n '"${c}"t=cos(x);3*t^2+2*t+1"$n"'. \n These variables remain "${g}"local"$n" to the mathematical parser and cannot be accessed \n outside the evaluated expression. \n \n _ The following "${g}"specific functions"$n" are also defined: \n \n . '"${c}"normP(u1,...,un)"$n"' computes the LP-norm of the specified vector \n (P being an "${g}"unsigned integer"$n" or '"${g}"inf"$n"'). \n . '"${c}"u(max)"$n"' or '"${c}"u(min,max)"$n"': return a random value between "$g"[0,max]"$n" or "$g"[min,max]"$n", \n following a uniform distribution. \n . '"${c}"i(_a,_b,_c,_d,_interpolation_type,_boundary_conditions)"$n"': return the value of the pixel \n located at position "$g"(a,b,c,d)"$n" in the associated image, if any ("${g}"0"$n" otherwise). \n '"${g}"interpolation_type"$n"' can be "$g"{ 0=nearest neighbor | other=linear }"$n". \n '"${g}"boundary_conditions"$n"' can be "$g"{ 0=dirichlet | 1=neumann | 2=periodic }"$n". \n Omitted coordinates are replaced by their default values which are respectively \n "${c}"x, y, z, c, interpolation"$n" and "${c}"boundary"$n". \n For instance command '"${c}"-fill 0.5*(i(x+1)-i(x-1))"$n"' will estimate the X-derivative \n of an image with a classical finite difference scheme. \n . '"${c}"j(_dx,_dy,_dz,_dc,_interpolation_type,_boundary_conditions)"$n"' does the same for the pixel \n located at position "$g"(x+dx,y+dy,z+dz,c+dc)"$n" (pixel access relative to the current coordinates). \n . '"${c}"i[offset,_boundary_conditions]"$n"' returns the value of the pixel located at specified '"${g}"offset"$n"' \n in the associated image buffer (or "${g}"0"$n" if offset is out-of-bounds). \n . '"${c}"j[offset,_boundary_conditions]"$n"' does the same for an offset relative to the current pixel "$g"(x,y,z,c)"$n". \n . '"${c}"i(#ind,_a,_b,_c,_d,_interpolation,_boundary)"$n"', '"${c}"j(#ind,_dx,_dy,_dz,_dc,_interpolation,_boundary)"$n"', \n '"${c}"i[#ind,offset,_boundary]"$n"' and '"${c}"i[offset,_boundary]"$n"' are similar expressions used to access \n pixel values for any numbered image "${g}"[ind]"$n" of the list. \n . '"${c}"if(condition,expr_then,_expr_else)"$n"': return value of '"${c}"expr_then"$n"' or '"${c}"expr_else"$n"', \n depending on the value of '"${c}"condition"$n"' "${g}"(0=false, other=true)"$n". '"${c}"expr_else"$n"' can be \n omitted in which case "${g}"0"$n" is returned if the condition does not hold. Using the ternary operator \n '"${c}"condition?expr_then[:expr_else]"$n"' gives an equivalent expression. \n For instance, "${-GMIC}" commands '"${c}"-fill if(x%10==0,255,i)"$n"' and '"${c}"-fill x%10?i:255"$n"' both draw blank \n vertical lines on every 10th column of an image. \n . '"${c}"dowhile(expression,_condition)"$n"' repeats the evaluation of '"${c}"expression"$n"' until '"${c}"condition"$n"' \n vanishes (or until '"${c}"expression"$n"' vanishes if no '"${c}"condition"$n"' is specified). For instance, \n the expression: '"${c}"if(N<2,N,n=N-1;F0=0;F1=1;dowhile(F2=F0+F1;F0=F1;F1=F2,n=n-1))"$n"' returns \n the Nth value of the Fibonacci sequence, for "${g}"N>=0"$n" (e.g., "${g}"46368"$n" for "${g}"N=24"$n"). \n '"${c}"dowhile(expression,condition)"$n"' always evaluates the specified expression at least once, \n then check for the nullity condition. When done, it returns the last value of '"${c}"expression"$n"'. \n . '"${c}"for(init,condition,_procedure,body)"$n"' first evaluates the expression '"${c}"init"$n"', then iteratively \n evaluates '"${c}"body"$n"' (followed by '"${c}"procedure"$n"' if specified) while '"${c}"condition"$n"' is verified \n (i.e. not zero). It may happen that no iteration is done, in which case the function \n returns "${g}"0"$n". Otherwise, it returns the last value of '"${c}"body"$n"'. \n For instance, the expression: '"${c}"if(N<2,N,for(n=N;F0=0;F1=1,n=n-1,F2=F0+F1;F0=F1;F1=F2))"$n"' \n returns the Nth value of the Fibonacci sequence, for "${g}"N>=0"$n" (e.g., "${g}"46368"$n" for "${g}"N=24"$n"). \n . '"${c}"whiledo(condition,expression)"$n"' is exactly the same as '"${c}"for(init,condition,expression)"$n"' \n without the specification of an initializing expression. \n . '"${c}"date(attr,path)"$n"' returns the date attribute for the given 'path' (file or directory), \n with '"${g}"attr"$n"' being "$g"{ 0=year | 1=month | 2=day | 3=day of week | 4=hour | 5=minute | 6=second }"$n". \n . '"${c}"date(_attr)"$n" returns the specified attribute for the current (locale) date. \n . '"${c}"print(expression)"$n" prints the value of the specified expression on the console \n (and returns its value). \n . '"${c}"debug(expression)"$n" prints detailed debug information about the sequence of operations \n done by the math parser to evaluate the expression (and returns its value). \n . '"${c}"init(expression)"$n" evaluates the specified expression only once, even when multiple \n evaluations are required (e.g. in '"${c}"-fill init(foo=0);++foo"$n"'). \n \n - "${g}"Multi-threaded"$n" and "${g}"in-place"$n" evaluation: \n \n . If your image data are large enough and you have several CPUs available, it is likely that \n the math expression passed to a '"$c"-fill"$n"' or '"$c"-input"$n"' command is evaluated in parallel, using \n multiple computation threads. \n \n . Starting an expression with '"$c"*"$n"' forces the evaluations required for an image to be run in \n parallel, even if the amount of data to process is small (beware, it may be slower to evaluate!). \n \n . If the specified expression starts with '"$c">"$n"' or '"$c"<"$n"', the pixel access operators \n '"${c}"i(), i[], j()"$n"' and '"${c}"j[]"$n"' return values of the image being currently modified, \n in forward ('"$c">"$n"') or backward ('"$c"<"$n"') order. The multi-threading evaluation of the expression is \n also disabled in this case. \n \n _ Expressions '"${c}"i(_#ind,x,_y,_z,_c)=value"$n"', '"${c}"j(_#ind,x,_y,_z,_c)=value"$n"', '"${c}"i[_#ind,offset]=value"$n"' and \n '"${c}"j[_#ind,offset]=value"$n"' set a pixel value at a different location than the running one in the \n image "${g}"[ind]"$n" (or in the associated image if argument '"${c}"#ind"$n"' is omitted), either with global \n coordinates/offsets (with '"${c}"i(...)"$n"' and '"${c}"i[...]"$n"'), or relatively to the current position "${g}"(x,y,z,c)"$n" \n (with '"${c}"j(...)"$n"' and '"${c}"j[...]"$n"'). These expressions always return '"${c}"value"$n"'. \n \n - The last image of the list is always associated to the evaluations of '"$c"{expressions}"$n"', \n e.g. "${-GMIC}" sequence '"${c}"256,128 -f {w}"$n"' will create a 256x128 image filled with value 256." -_help_section "Image and data viewers" -_help_paragraph " - "${-GMIC}" has some very handy embedded "${g}"visualization modules"$n", for 1d signals \n (command '"$c"-plot"$n"'), 1d/2d/3d images (command '"$c"-display"$n"') and 3d objects \n (command '"$c"-display3d"$n"'). It manages interactive views of the selected image data. \n \n - The following keyboard shortcuts are available in the interactive viewers: \n \n . "${g}"(mousewheel)"$n": Zoom in/out. \n . "${g}"CTRL+D"$n": Increase window size. \n . "${g}"CTRL+C"$n": Decrease window size. \n . "${g}"CTRL+R"$n": Reset window size. \n . "${g}"CTRL+W"$n": Close window. \n . "${g}"CTRL+F"$n": Toggle fullscreen mode. \n . "${g}"CTRL+S"$n": Save current window snapshot as numbered file 'gmic_xxxx.bmp'. \n . "${g}"CTRL+O"$n": Save current instance of the viewed data, as numbered file 'gmic_xxxx.cimgz'. \n \n - Shortcuts specific to the 1d/2d/3d image viewer (command '"$c"-display"$n"') are: \n \n . "${g}"CTRL+A"$n": Switch cursor mode. \n . "${g}"CTRL+P"$n": Play z-stack of frames as a movie (for volumetric 3d images). \n . "${g}"CTRL+V"$n": Show/hide 3D view (for volumetric 3d images). \n . "${g}"CTRL+(mousewheel)"$n": Go up/down. \n . "${g}"SHIFT+(mousewheel)"$n": Go left/right. \n . "${g}"Numeric PAD"$n": Zoom in/out (+/-) and move through zoomed image (digits). \n . "${g}"BACKSPACE"$n": Reset zoom scale. \n \n - Shortcuts specific to the 3d object viewer (command '"$c"-display3d"$n"') are: \n \n . "$g"(mouse)+(left mouse button)"$n": Rotate 3d object. \n . "$g"(mouse)+(right mouse button)"$n": Zoom 3d object. \n . "$g"(mouse)+(middle mouse button)"$n": Shift 3d object. \n . "${g}"CTRL+F1 .. CTRL+F6"$n": Toggle between different 3d rendering modes. \n . "${g}"CTRL+Z"$n": Enable/disable z-buffered rendering. \n . "${g}"CTRL+A"$n": Show/hide 3d axes. \n . "${g}"CTRL+G"$n": Save 3d object, as numbered file 'gmic_xxxx.off'. \n . "${g}"CTRL+T"$n": Switch between single/double-sided 3d modes." -_help_section "Adding custom commands" -_help_paragraph " - New custom commands can be added by the user, through the use of "${-GMIC}" "${g}"custom commands files"$n". \n \n - A command file is a simple ascii text file, where each line starts either by \n '"${c}"command_name: command_definition"$n"' or '"${c}"command_definition (continuation)"$n"'. \n \n - At startup, "${-GMIC}" automatically includes user's command file "$g"$HOME/.gmic"$n" (on Unix) or \n "$g"%APPDATA%/user.gmic"$n" (on Windows). The CLI tool '"${g}"gmic"$n"' automatically runs the command \n '"${c}"-cli_start"$n"' if defined. \n \n - Custom command names must use character set "$g"[a-zA-Z0-9_]"$n" and cannot start with a number. \n \n - Any '"$c" ""# comment"$n"' expression found in a custom commands file is discarded by the "${-GMIC}" \n parser, wherever it is located in a line. \n \n - In a custom command, the following "$g"$-expressions"$n" are recognized and substituted: \n \n . '"$c"$""\*"$n"' is substituted by a copy of the specified string of arguments. \n . '"$c"$\"*\""$n"' is substituted by a copy of the specified string of arguments, each being double-quoted. \n . '"$c"$""#"$n"' is substituted by the maximum indice of known arguments (either specified by the \n user or set to a default value in the custom command). \n . '"$c"$""?"$n"' is substituted by a string telling about the command subset restriction (only \n useful when custom commands need to output descriptive messages). \n . '"$c"$i"$n"' and '"$c"${i}"$n"' are both substituted by the "${g}"i^th"$n" specified argument. Negative indices \n such as '"$c"${-j}"$n"' are allowed and refer to the "${g}"j^th"$n" latest argument. '"$c"$""0"$n"' is substituted \n by the custom command name. \n . '"$c"${i=default}"$n"' is substituted by the value of "$c"$i"$n" (if defined) or by its new value set \n to '"${g}"default"$n"' otherwise ('"${g}"default"$n"' may be a $-expression as well). \n . '"$c"${subset}"$n"' is substituted by the argument values (separated by commas '"$g","$n"') of a \n specified argument subset. For instance expression '"$c"$""{2--2}"$n"' is substitued by all \n specified command arguments except the first and the last one. Expression '"$c"$""{^0}"$n"' is \n then substituted by all arguments of the invoked command (eq. to '"$c"$""*"$n"' if all specified \n arguments have indeed a value). \n . '"$c"$""=var"$n"' is substituted by the set of instructions that will assign each argument "$c"$i"$n" \n to the named variable '"${c}"var$i"$n"' (for i in "$g"[0..$""#]"$n"). This is particularly useful when a \n custom command want to manage variable numbers of arguments. Variables names must \n use character set "$g"[a-zA-Z0-9_]"$n" and cannot start with a number. \n \n - These particular "$g"$-expressions"$n" for custom commands are "${g}"always substituted"$n", even in double quoted \n items or when the dollar sign '"$g"$"$n"' is escaped with a backslash '"$g"\\"$n"'. To avoid substitution, \n place an empty double quoted string just after the '"$g"$"$n"' (as in '"$c"$\"\"1"$n"'). \n \n - Specifying arguments may be skipped when invoking a custom command, by replacing them by \n commas '"$g","$n"' as in expression '"${c}"-flower ,,3"$n"'. Omitted arguments are set to their default \n values, which must be thus explicitly defined in the code of the corresponding custom \n command (using default argument expressions as '"$c"$""{1=default}"$n"'). \n \n - If one numbered argument required by a custom command misses a value, an error is \n thrown by the "${-GMIC}" interpreter." -_help_section "List of commands" -_help_paragraph " All available "${-GMIC}" commands are listed below, classified by themes. \n When several choices of command arguments are possible, they appear separated by '"$g"|"$n"'. \n An argument specified inside '"$g"[]"$n"' or starting by '"${g}"_"$n"' is optional except when standing for an \n existing image "$c"[image]"$n", where '"${g}"image'"$n"' can be either an indice number or an image name. \n In this case, the '"$g"[]"$n"' characters are mandatory when writing the item. \n A command marked with '"$g"(+)"$n"' is one of the "${g}"native"$n" commands. \n Note also that all images that serve as illustrations in this reference documentation are normalized \n in "$g"[0,255]"$n" before being displayed. You may need to do this explicitly (command '"$c"-normalize 0,255"$n"') \n if you want to save and view images with the same aspect than those illustrated in the example codes." _help_examples : g=$_gmic_g c=$_gmic_c n=$_gmic_n -_help_section "Examples of use" -_help_paragraph " '"${g}"gmic"$n"' is a generic image processing tool which can be used in a wide variety of situations. \n The few examples below illustrate possible uses of this tool: \n \n - View a list of images: \n "${c}"gmic file1.bmp file2.jpeg"$n" \n \n - Convert an image file: \n "${c}"gmic input.bmp -o output.jpg"$n" \n \n - Create a volumetric image from a movie sequence: \n "${c}"gmic input.mpg -a z -o output.hdr"$n" \n \n - Compute image gradient norm: \n "${c}"gmic input.bmp -gradient_norm"$n" \n \n - Denoise a color image: \n "${c}"gmic image.jpg -denoise 30,10 -o denoised.jpg"$n" \n \n - Compose two images using overlay layer blending: \n "${c}"gmic image1.jpg image2.jpg -blend overlay -o blended.jpg"$n" \n \n - Evaluate a mathematical expression: \n "${c}"gmic -e \"cos(pi/4)^2+sin(pi/4)^2={cos(pi/4)^2+sin(pi/4)^2}\""$n" \n \n - Plot a 2d function: \n "${c}"gmic 1000,1,1,2 -f \"X=3*(x-500)/500;X^2*sin(3*X^2)+if(c==0,u(0,-1),cos(X*10))\" -plot"$n" \n \n - Plot a 3d elevated function in random colors: \n "${c}"gmic 128,128,1,3,\"u(0,255)\" -plasma 10,3 -blur 4 -sharpen 10000 \\\ \n -elevation3d. \"'X=(x-64)/6;Y=(y-64)/6;100*exp(-(X^2+Y^2)/30)*abs(cos(X)*sin(Y))'\""$n" \n \n - Plot the isosurface of a 3d volume: \n "${c}"gmic -m3d 5 -md3d 5 -db3d 0 -isosurface3d \"'x^2+y^2+abs(z)^abs(4*cos(x*y*z*3))'\",3"$n" \n \n - Render a "${-GMIC}" 3d logo: \n "${c}"gmic 0 -text G\\\47MIC,0,0,53,1,1,1,1 -expand_xy 10,0 -blur 1 -n 0,100 --plasma 0.4 -+ \\\ \n -blur 1 -elevation3d -0.1 -md3d 4"$n" \n \n - Generate a 3d ring of torii: \n "${c}"gmic -repeat 20 -torus3d 15,2 -color3d. \"{u(60,255)},{u(60,255)},{u(60,255)}\" \\\ \n -*3d. 0.5,1 -if \"{$>%2}\" -r3d. 0,1,0,90 -endif -+3d. 70 -+3d \\\ \n -r3d 0,0,1,18 -done -md3d 3 -m3d 5 -db3d 0"$n" \n \n - Create a vase from a 3d isosurface: \n "${c}"gmic -md3d 4 -isosurface3d \"'x^2+2*abs(y/2)*sin(2*y)^2+z^2-3',0\" -sphere3d 1.5 \\\ \n --3d. 0,5 -plane3d 15,15 -r3d. 1,0,0,90 -center3d. -+3d. 0,3.2 \\\ \n -color3d. 180,150,255 -color3d.. 128,255,0 -color3d... 255,128,0 -+3d"$n" \n \n - Display filtered webcam stream: \n "${c}"gmic -apply_camera \\\"--mirror x --mirror y -+ -/ 4\\\""$n" \n \n - Launch a set of "${-GMIC}" interactive demos: \n "${c}"gmic -demo"$n" \n" _help_header_ascii : -__help_header_ascii _section=0 _space1="" _space2=" " -_help_section "Usage" __help_header_ascii : -if {narg($_prerelease)} strprerelease=" (pre-release ""#"$_prerelease")" -else strprerelease="" -endif str=" "${_gmic_b}"gmic: GREYC's Magic for Image Computing."$_gmic_n" \n \n "$_gmic_r${_gmic_b}"Version "${-strver}$strprerelease$_gmic_n", Copyright (c) 2008-2015, David Tschumperle. \n "$_gmic_r"(http://gmic.eu)"$_gmic_n -l[] -_e[] "" -onfail -m "_e : -e[] \"$""*\"" -endl -v + -_e[] $str -v - _help_section_ascii : _section+=1 {narg({'"$1"'})},1,1,1,{'-'} -v + -e[] "\n "$_gmic_m$_gmic_b$_section". $1" -e[] " "${_space{narg({'$_section'})}}{t}$_gmic_n"\n" -v - -rm. _help_paragraph_ascii : -v + -e[] "$*" -v - _help_footer_ascii : -v + -e[] " "$_gmic_r$_gmic_b"** G\47MIC comes with ABSOLUTELY NO WARRANTY; for details visit: http://gmic.eu **"$_gmic_n -v - _help_header_html : _section=0 -if {narg($_prerelease)} strprerelease=" (pre-release ""#"$_prerelease")" -else strprerelease="" -endif _gmic_n="" _gmic_r="" _gmic_g="" _gmic_m="" _gmic_c="" -v + -e[] " \n \n
\n
Reference
\n
\n

Preamble

\n \n

Table of contents

\n \n

Version

\n
gmic: GREYC's Magic for Image Computing.
\n
\n       Version "${-strver}$strprerelease", Copyright (c) 2008-2015, David Tschumperle
\n       (http://gmic.eu)
\n
" -v - -_help_section "Usage" _help_section_html : _section+=1 -v + -e[] "

\"\"  $1

" -v - _help_paragraph_html : -v + -e[] "
$*
" -v - _help_footer_html : -v + -e[] " \n
** G\47MIC comes with ABSOLUTELY NO WARRANTY; for details visit: http://gmic.eu ** \n \n
\n
\n
\"\"
\n
\n \n " -v - _help_header_latex : strver=${-strver} -if {narg($_prerelease)} strprerelease=" (pre-release \\#"$_prerelease")" -else strprerelease="" -endif _gmic_n="§\\aftergroup\\Ccn§" _gmic_b="§\\aftergroup\\Ccb§" _gmic_r="§\\aftergroup\\Ccr§" _gmic_g="§\\aftergroup\\Ccg§" _gmic_c="§\\aftergroup\\Ccb§" _gmic_m="" -v + -e[] "\\documentclass[a4paper,10.5pt,twoside]{book} \n\\usepackage{hyperref,fancyhdr,graphicx,amssymb,amsmath,times,makeidx,listings,color} \n\\graphicspath{{img/}} \n\\pagestyle{fancyplain} \n\\lhead[\\fancyplain{}{\\textbf\\thepage}]{\\fancyplain{}{\\rightmark}} \n\\rhead[\\fancyplain{}{\\leftmark}]{\\fancyplain{}{\\textbf\\thepage}} \n\\cfoot{} \n\\setlength{\\textwidth}{6in} \n\\setlength{\\parindent}{0pc} \n\\setlength{\\oddsidemargin}{15.5pt} \n\\setlength{\\evensidemargin}{15.5pt} \n\\setcounter{tocdepth}{1} \n\\sloppy{} \n\\definecolor{ca}{rgb}{0.8,0,0} \n\\definecolor{cb}{rgb}{0,0.2,0.6} \n\\definecolor{cc}{rgb}{0,0.5,0} \n\\definecolor{cd}{rgb}{0.6,0.6,0.6} \n\\def\\Ccr{\\color{ca}} \n\\def\\Ccb{\\color{cb}} \n\\def\\Ccg{\\color{cc}} \n\\def\\Ccc{\\color{cd}} \n\\def\\Ccn{\\color{black}} \n\\def\\comma{\\discretionary{,}{}{,}} \n\\newcommand{\\Ca}[1]{\\textcolor{ca}{#1}} \n\\newcommand{\\Cb}[1]{\\textcolor{cb}{#1}} \n\\newcommand{\\Cc}[1]{\\textcolor{cc}{#1}} \n\\newcommand{\\Cd}[1]{\\textcolor{cd}{#1}} \n\\title{\\fbox{\\parbox{\\textwidth}{\\begin{center}\\vspace*{2cm}\\includegraphics[width=12cm]{logo4.jpg}\\\\\\vspace*{1cm}{\\Huge \\textbf{The Handbook}\\\\{\\small Version "$strver$strprerelease"}\\\\\\vspace*{1cm}}\\end{center}}}} \n\\author{\\Large \\bf David Tschumperl\\'e} \n\\renewcommand\\indexname{Index of commands} \n\\makeindex \n\\lstset{columns=fullflexible,basicstyle=\\normalfont} \n\\begin{document} \n\\maketitle \n\\tableofcontents \n\\chapter*{Preamble} \n\\section*{License} \nThis document is distributed under the \\textbf{GNU Free Documentation License}, version 1.3.\\\\ \nRead the full license terms at \\url{http://www.gnu.org/licenses/fdl-1.3.txt}.\\\\~\\\\ \nAn online version of this documentation is available at:\\\\\\url{http://gmic.eu/reference.shtml}. \n\\section*{Motivations} \n\\Cc{G\47MIC} is a full-featured open-source framework for image processing, providing several different user interfaces to \nconvert/manipulate/filter/visualize generic image datasets, from 1d scalar signales to 3d+t sequences of multi-spectral volumetric images. \nTechnically speaking, what it does is: \n\\begin{itemize} \n\\item Define a lightweight but powerful script language (the \\Cc{G\47MIC} language) dedicated to the design of image processing pipelines. \n\\item Provide several user interfaces embedding the corresponding interpreter: \n\\begin{itemize} \n\\item A command-line executable '\\texttt{gmic}', to use the \\Cc{G\47MIC} framework from a shell. \nIn this setting, \\Cc{G\47MIC} may be seen as a direct (and friendly) competitor of the ImageMagick or GraphicsMagick software suites. \n\\item A plug-in '\\texttt{gmic\\_gimp}', to bring \\Cc{G\47MIC} capabilities to the GIMP image retouching software. \n\\item A web-service '\\texttt{\\Cc{G\47MIC} Online}', to allow users applying image processing algorithms directly in a web brower. \n\\item A Qt-based interface '\\texttt{ZArt}', for real-time manipulation of webcam images. \n\\item A C++ library '\\texttt{libgmic}', to be linked with third-party applications. \n\\end{itemize} \n\\end{itemize} \n\\Cc{G\47MIC} is focused on the design of possibly complex pipelines for converting, manipulating, filtering and visualizing generic 1d/2d/3d multi-spectral image datasets. This includes of course color images, but also more complex data as image sequences or 3d(+t) volumetric float-valued datasets.\\\\ \n \n\\Cc{G\47MIC} is an open framework: the default language can be extended with custom \\Cc{G\47MIC}-written commands, defining thus new available image filters or effects. By the way, \\Cc{G\47MIC} already contains a substantial set of pre-defined image processing algorithms and pipelines (more than 1000).\\\\ \n \n\\Cc{G\47MIC} has been designed with portability in mind and runs on different platforms (Windows, Unix, MacOSX). It is distributed under the CeCILL license (GPL-compatible). Since 2008, it is developed in the Image Team of the GREYC laboratory, in Caen/France, by permanent researchers working in the field of image processing on a daily basis. \n\\section*{Version} \n \n \\Ca{\\textbf{gmic:} GREYC's Magic for Image Computing.}\\\\ \n \n \\Cb{Version \\textbf{"$strver$strprerelease"}, Copyright (c) 2008-2015, David Tschumperl\\'e}\\\\ \n \\Cb{(\\url{http://gmic.eu})} \n\\chapter{Usage} " -v - _help_section_latex : -skip "$1" -v + -e[] "~\\\\\\section{$1}" -v - _help_paragraph_latex : -skip "$1" -v + -e[] "\\small" -e[] "\\begin{lstlisting}[escapechar=§]" -e[] "$1" -e[] "\\end{lstlisting}" -e[] "\\normalsize" -v - _help_footer_latex : -v + -e[] " \n\\printindex \n~\\\\$\\square$~End of document. \n\n\\end{document}" -v - _help_header_man : -v + -e[] ".TH G\47MIC 1\n\ .SH NAME\n\ gmic \\- Perform generic image processing operations, through the G\47MIC language interpreter.\n\ \n\ .SH HELP\n" -v - _gmic_n="\\fR" _gmic_b="\\fB" _gmic_r="" _gmic_g="" _gmic_c="\\fB" _gmic_m="" _prerelease= -__help_header_ascii _gmic_n="__N" _gmic_b="__B" _gmic_r="__B" _gmic_c="__B" _section=0 _space1="" _space2=" " -_help_section "Usage" _help_section_man : _section+=1 {narg({'"$1"'})},1,1,1,{'-'} -v + -e[] "\n \\fB"$_section". $1" -e[] " "${_space{narg({'$_section'})}}{t}"\\fR\n" -v - -rm. _help_paragraph_man : -l[] ({'"$*"'}) -replace_str "\\fR","__N" -replace_str "\\fB","__B" -replace_str "\\","\\\\\\\\" -replace_str "__N","\\\\fR" -replace_str "__B","\\\\fB" -v + -e[] {0,t} -v - -rm -endl _help_footer_man : -_help_footer_ascii $"*" use_vt100 : -v - -if {0$_vt100>0} _gmic_n="\33[0;0;0m" _gmic_r="\33[0;31;59m" _gmic_g="\33[0;32;59m" _gmic_m="\33[0;35;59m" _gmic_c="\33[0;36;59m" _gmic_b="\33[1m" -endif -v + #@gmic version #@gmic : Display current version number on stdout. version : -v - -m "_e : -echo_stdout[] \"$""*\"" -if {$^==-1} -_e[] "" -endif -__help_header_ascii[] -uncommand _e -v + v : -version #@gmic :: Input/output #@gmic camera : _camera_index>=0,_nb_frames>0,_skip_frames>=0,_capture_width>=0,_capture_height>=0 : (+) #@gmic : Insert one or several frames from specified camera. #@gmic : When 'nb_frames==0', the camera stream is released instead of capturing new images. #@gmic : Default values: 'camera_index=0' (default camera), 'nb_frames=1', 'skip_frames=0' and 'capture_width=capture_height=0' (default size). #@gmic m : eq. to '-command'. : (+) #@gmic command : _add_debug_info={ 0 | 1 },{ filename | http[s]://URL | "string" } : (+) #@gmic : Import G'MIC custom commands from specified file, URL or string. #@gmic : (eq. to '-m'). #@gmic : Imported commands are available directly after the '-command' invocation. #@gmic : Default value: 'add_debug_info=1'. #@gmic : $ image.jpg -command "foo : -mirror y -deform $""1" --foo[0] 5 --foo[0] 15 #@gmic cursor : _mode = { 0=hide | 1=show } : (+) #@gmic : Show or hide mouse cursor for selected instant display windows. #@gmic : Command selection (if any) stands for instant display window indices instead of image indices. #@gmic : Default value: 'mode=1'. #@gmic d : eq. to '-display'. : (+) #@gmic display : _X>=0,_Y>=0,_Z>=0,_exit_on_anykey={ 0 | 1 } : (+) #@gmic : Display selected images in an interactive viewer (use the instant display window [0] if opened). #@gmic : (eq. to '-d'). #@gmic : Arguments 'X','Y','Z' determine the initial selection view, for 3d volumetric images. #@gmic : Default value: 'X=Y=Z=0' and 'exit_on_anykey=0'. #@gmic : $$ #@gmic d0 : eq. to '-display0'. d0 : -_display0 #@gmic display0 #@gmic : Display selected images without value normalization. #@gmic : (eq. to '-d0'). display0 : -_$0 _display0 : -v - w=0 h=0 d=0 s=0 -repeat $! -l[$>] w+={w} h={max($h,h)} d={max($d,d)} s={max($s,s)} -endl -done -if {$!==1} -w -1,-1,0,0,-1,-1,{0,n}\ ($wx$hx$dx$s) -elif {$!==2} -w -1,-1,0,0,-1,-1,{0,n},{n}\ ($wx$hx$dx$s) -else -w -1,-1,0,0,-1,-1,{0,n},..,{n}\ ($wx$hx$dx$s) -endif -v + -d -v - -w[] 0 -v + #@gmic d3d : eq. to '-display3d'. : (+) #@gmic display3d : _[background_image],_exit_on_anykey={ 0 | 1 } : _exit_on_anykey={ 0 | 1 } : (+) #@gmic : Display selected 3d objects in an interactive viewer (use the instant display window [0] if opened). #@gmic : (eq. to '-d3d'). #@gmic : Default values: '[background_image]=(default)' and 'exit_on_anykey=0'. #@gmic da : eq. to '-display_array'. da : -v - _gmic_s="$?" -v + -_display_array $* #@gmic display_array : _width>0,_height>0 #@gmic : Display images in interactive windows where pixel neighborhoods can be explored. #@gmic : Default values: 'width=13' and 'height=width'. display_array : -v - _gmic_s="$?" -v + -_$0 $* _display_array : -check ${1=13}>0" && "${2=$1}>0 -e[0--3] "Display $1x$2 array of pixel values for image"$_gmic_s"." -v - dxb={round($1/2,1,1)} dxf={$1-1-$dxb} dyb={round($2/2,1,1)} dyf={$2-1-$dyb} -repeat $! -l[$>] -if {w<128" && "h<128} -r 128,128,100%,100%,0,0,0.5,0.5 -endif x0=0 y0=0 w={w} h={h} wmax={0.9*{*,u}} hmax={0.9*{*,v}} -do -if {w>=$wmax||h>=$hmax} n={n} -nm. "Image "'{b}.{x}'" is too large, please select a sub-image." --select. 2 x0={i[0]} y0={i[1]} w={1+i[3]-i[0]} h={1+i[4]-i[1]} -rm. -nm. $n -endif --z. $x0,$y0,0,{$x0+$w-1},{$y0+$h-1},0 -round. 1 -n. 0,255 -while {w>=$wmax||h>=$hmax} x1=-1 y1=-1 c1=0 ox1=-1 oy1=-1 oc1=-1 x2=-1 y2=-1 c2=0 ox2=-1 oy2=-1 oc2=-1 x3=-1 y3=-1 c3=0 ox3=-1 oy3=-1 oc3=-1 c0=0 oxm=-1 oym=-1 -w. -1,-1,0,0,-1,-1,{-2,b}.{-2,x} -do -wait[0-3] oc0=$c0 -repeat 4 -if {$>" && "!{*$>}" && "${x$>}>=0} -w$> 0 x$>=-1 y$>=-1 c$>=0 -endif -if {*$>,o} c$>={(${c$>}+sign({*$>,o}))%s} -wait[$>] -1 -endif -if {{*$>,SPACE}" || "{*$>,ENTER}" || "{*$>,ARROWRIGHT}" || "{*$>,ARROWDOWN}} c$>={(${c$>}+1)%s} -wait[$>] -1 -endif -if {{*$>,BACKSPACE}" || "{*$>,ARROWLEFT}" || "{*$>,ARROWUP}} c$>={(${c$>}-1)%s} -wait[$>] -1 -endif -done -if {$oc0!=$c0} c1=$c0 c2=$c0 c3=$c0 -endif xm={*,x} ym={*,y} -if {$xm>=0" && "{*,b}&1} x1=$xm y1=$ym -endif -if {$xm>=0" && "{*,b}&2} x2=$xm y2=$ym -endif -if {$xm>=0" && "{*,b}&4} x3=$xm y3=$ym -endif -if {$xm>=0" && "($oxm!=$xm" || "$oym!=$ym)} -w[] -1,-1,-1,-1,-1,-1,{-2,b}.{-2,x}" - ("$xm,$ym")" -endif -if {$x1!=$ox1" || "$y1!=$oy1" || "$x2!=$ox2" || "$y2!=$oy2" || "$x3!=$ox3" || "$y3!=$oy3} [-1] -if {$x1>=0} xb={$x1-$dxb} yb={$y1-$dyb} xe={$x1+$dxf} ye={$y1+$dyf} -rectangle. $xb,$yb,$xe,$ye,0.2,0,255,255 -rectangle. $xb,$yb,$xe,$ye,1,0xFFFFFFFF,0,255,255 -endif -if {$x2>=0} xb={$x2-$dxb} yb={$y2-$dyb} xe={$x2+$dxf} ye={$y2+$dyf} -rectangle. $xb,$yb,$xe,$ye,0.2,255,32,255 -rectangle. $xb,$yb,$xe,$ye,1,0xFFFFFFFF,255,32,255 -endif -if {$x3>=0} xb={$x3-$dxb} yb={$y3-$dyb} xe={$x3+$dxf} ye={$y3+$dyf} -rectangle. $xb,$yb,$xe,$ye,0.2,255,255,0 -rectangle. $xb,$yb,$xe,$ye,1,0xFFFFFFFF,255,255,0 -endif -w. {-2,w},{-2,h} -rm. oxm=$xm oym=$ym -endif -if {$x1>=0" && "($ox1!=$x1" || "$oy1!=$y1" || "$oc1!=$c1)} --z.. {$x1-$dxb},{$y1-$dyb},0,$c1,{$x1+$dxf},{$y1+$dyf},0,$c1 --z.. {$x1-$dxb},{$y1-$dyb},0,{$x1+$dxf},{$y1+$dyf},0 -__display_array[-2,-1] $1,$2,0,255,255 -w1. {w},{h},0,0,-1,-1,{-3,b}" - ("$x1,$y1,c=$c1")" -rm. ox1=$x1 oy1=$y1 oc1=$c1 -endif -if {$x2>=0" && "($ox2!=$x2" || "$oy2!=$y2" || "$oc2!=$c2)} --z.. {$x2-$dxb},{$y2-$dyb},0,$c2,{$x2+$dxf},{$y2+$dyf},0,$c2 --z.. {$x2-$dxb},{$y2-$dyb},0,{$x2+$dxf},{$y2+$dyf},0 -__display_array[-2,-1] $1,$2,255,32,255 -w2. {w},{h},0,0,-1,-1,{-3,b}" - ("$x2,$y2,c=$c2")" -rm. ox2=$x2 oy2=$y2 oc2=$c2 -endif -if {$x3>=0" && "($ox3!=$x3" || "$oy3!=$y3" || "$oc3!=$c3)} --z.. {$x3-$dxb},{$y3-$dyb},0,$c3,{$x3+$dxf},{$y3+$dyf},0,$c3 --z.. {$x3-$dxb},{$y3-$dyb},0,{$x3+$dxf},{$y3+$dyf},0 -__display_array[-2,-1] $1,$2,255,255,0 -w3. {w},{h},0,0,-1,-1,{-3,b}" - ("$x3,$y3,c=$c3")" -rm. ox3=$x3 oy3=$y3 oc3=$c3 -endif -while {{*}" && "\ !{*,ESC}" && "!{*,Q}" && "\ !{*1,ESC}" && "!{*1,Q}" && "\ !{*2,ESC}" && "!{*2,Q}" && "\ !{*3,ESC}" && "!{*3,Q}} -k[0] -w 0 -w1 0 -w2 0 -w3 0 -endl -done -v + __display_array : -round.. 1 -c.. 0,999 -r. 100%,100%,1,3,{s==1} --luminance. -r.. {$1*24},{$2*24} -grid.. {100/$1}%,{100/$2}%,0,0,1,0 xb={24*int($1/2)} yb={24*int($2/2)} xe={$xb+24} ye={$yb+24} -rectangle.. $xb,$yb,$xe,$ye,1,0xFFFFFFFF,$3,$4,$5 -repeat $2 yg=$> -repeat $1 xg=$> -t.. {-3,i($xg,$yg)},{5+$xg*24},{5+$yg*24},13,0.8,{if(i($xg,$yg)>128,0,255)} -done -done -rm[-3,-1] #@gmic dfft : eq. to '-display_fft'. dfft : -_display_fft #@gmic display_fft #@gmic : Display fourier transform of selected images, with centered log-module and argument. #@gmic : (eq. to '-dfft'). #@gmic : $ image.jpg --display_fft display_fft : -_$0 _display_fft : -e[0--3] "Render fourier transform of image$? with centered log-module and argument." -v - -repeat $! -l[$>] -fftpolar -+.. 1 -log.. -n 0,255 -a x -endl -done -s x,2 -v + #@gmic dg : eq. to '-display_graph'. dg : -check "${1=640}>32 && ${2=480}>32" -skip ${3=1},${4=0},${5=0},${6=0},${7=0},${8=0},"${9=x-axis}","${10=y-axis}" -_display_graph ${1-8},"$9","$10" #@gmic display_graph : _width>32,_height>32,_plot_type,_vertex_type,_xmin,_xmax,_ymin,_ymax,_xlabel,_ylabel #@gmic : Render graph plot from selected image data. #@gmic : 'plot_type' can be { 0=none | 1=lines | 2=splines | 3=bar }. #@gmic : 'vertex_type' can be { 0=none | 1=points | 2,3=crosses | 4,5=circles | 6,7=squares }. #@gmic : 'xmin','xmax','ymin','ymax' set the coordinates of the displayed xy-axes. #@gmic : Default values: 'width=640', 'height=480', 'plot_type=1', 'vertex_type=1', 'xmin=xmax=ymin=ymax=0 (auto)', 'xlabel="x-axis"' and 'ylabel="y-axis"'. #@gmic : $ 128,1,1,1,'cos(x/10+u)' --display_graph 400,300,3 display_graph : -check "${1=640}>32 && ${2=480}>32" -skip ${3=1},${4=0},${5=0},${6=0},${7=0},${8=0},"${9=x-axis}","${10=y-axis}" -_display_graph ${1-8},"$9","$10" _display_graph : -check "${1=640}>32 && ${2=480}>32" -skip ${3=1},${4=0},${5=0},${6=0},${7=0},${8=0},"${9=x-axis}","${10=y-axis}" -e[0--3] "Render $1x$2 graph plot from data of image$?." -v - -repeat $! -l[$>] nm={0,n} one={$3!=3} siz={w*h*d} -if {$5==$6} xmin=0 xmax={$siz-$one} -else xmin={min($5,$6)} xmax={max($5,$6)} -endif -if {$7==$8} ymin={im-(iM-im)/20} ymax={iM+(iM-im)/20} -else ymin={min($7,$8)} ymax={max($7,$8)} -endif dx={$xmax-$xmin} dy={$ymax-$ymin} u=${"-_axes[] "$xmin,$xmax",{0.3*$1/14}"} offx={arg(1,$u)} deltax={arg(2,$u)} u=${"-_axes[] "$ymin,$ymax",{0.3*$2/14}"} offy={arg(1,$u)} deltay={arg(2,$u)} gw={$1-32} gh={$2-32} gg={($gw-$one)/($siz-$one)} $gw,$gh,1,3,255 -grid. {$deltax*$gw/$dx},{$deltay*$gh/$dy},{($offx-$xmin)*$gw/$dx},{$gh-($offy-$ymin)*$gh/$dy},0.25,0xCCCCCCCC,0 -if {{-2,s}==1} (120,120,200) -elif {{-2,s}<=3} (220,10,10;10,220,10;10,10,220) -else (0,255) -r. 256,1,1,1,3 -map. 2 -z. 2,100% -permute. cxyz -r. 3,{-3,max(3,s)},1,1,0,2 -sh. 0,2,0,0 -f. 255,0,0,0,255,0,0,0,255 -rm. -endif -repeat {-3,s} -sh... $> -graph... [-1],$3,$4,$ymax,$ymin,1,{-2,[0-2]} -rm. -shift. 0,-1 -done -rm[-3,-1] -line. 0,0,100%,0,1,110 -line. 100%,0,100%,100%,1,110 -line. 100%,100%,0,100%,1,255 -line. 0,100%,0,0,1,255 100%,100%,1,1,255 -axes. $xmin,$xmax,$ymax,$ymin,14,1,0 -if {$xmin>0} -axes. 0,0,$ymax,$ymin,14,1,160 -endif -if {$xmax<0} -axes. {w-1},{w-1},$ymax,$ymin,14,1,160 -endif -if {$ymin>0} -axes. $xmin,$xmax,{h-1},{h-1},14,1,160 -endif -if {$ymax<0} -axes. $xmin,$xmax,0,0,14,1,160 -endif --erode. 3 -!=. 255 -r.. 100%,100%,1,3 -j... [-2],0,0,0,0,1,[-1],1 -rm[-2,-1] -frame. 16,16,220 0 -t. "$9",0,0,14,1,-220,-220,-220 -j.. [-1],{({-2,w}-w)/2},{{-2,h}-16},0,0,-1 -rm. 0 -t. "$10",0,0,14,1,-220,-220,-220 -rotate. -90 -j.. [-1],2,{({-2,h}-h)/2},0,0,-1 -rm. -nm $nm -endl -done -c 0,255 -v + #@gmic dh : eq. to '-display_histogram'. dh : -v - _gmic_s="$?" -v + -_display_histogram $"*" #@gmic display_histogram : _width>0,_height>0,_clusters>0,_min_value[%],_max_value[%],_show_axes={ 0 | 1 },_expression. #@gmic : Render a channel-by-channel histogram. #@gmic : If selected image has several slices, the rendering is performed for all input slices. #@gmic : 'expression' is a mathematical expression used to transform the histogram data for visualization purpose. #@gmic : (eq. to '-dh'). #@gmic : Default values: 'width=512', 'height=300', 'clusters=256', 'min_value=0%', 'max_value=100%', 'show_axes=1' and 'expression=i'. #@gmic : $ image.jpg --display_histogram 512,300 display_histogram : -v - _gmic_s="$?" -v + -_$0 $"*" _display_histogram : -check "${1=512}>0 && ${2=300}>0 && ${3=256}>0" -skip ${4=0%},${5=100%},${6=1},"${7=i}" -e[0--3] "Render $1x$2 channel-by-channel histogram of image"$_gmic_s", with $3 clusters, minimum value $4 and maximum value $5." -v - -repeat $! -l[$>] nm={0,n} -if ${-is_percent\ $4} m={im+(iM-im)*$4} -else m=$4 -endif -if ${-is_percent\ $5} M={im+(iM-im)*$5} -else M=$5 -endif s={s} -s c -repeat $s -l[{-1-$>}] -s z -histogram $3,$m,$M -a z -endl -done -a c -f '"$7"' vM={iM} -s z -repeat $! -l[$>] $1,$2,1,{s},-255 -repeat {s} -sh[-2,-1] $> -graph. [-2],3,0,$vM,0,1,0 -rm[-2,-1] -done -rm.. -+ 255 -if $6 100%,100% -axes. $m,$M,$vM,0,14,1,255 -if {$m>0} -axes. 0,0,$vM,0,14,1,200 -endif -if {$M<0} -axes. {w-1},{w-1},$vM,0,14,1,200 -endif --dilate. 3 -r.. [-3] -j... [-2],0,0,0,0,1,[-1],255 -rm[-2,-1] -endif -endl -done -a z -nm $nm -endl -done -v + #@gmic display_parametric : _width>0,_height>0,_outline_opacity,_vertex_radius>=0,_is_antialiased={ 0 | 1 },_is_decorated={ 0 | 1 },_xlabel,_ylabel #@gmic : Render 2d or 3d parametric curve or point clouds from selected image data. #@gmic : Curve points are defined as pixels of a 2 or 3-channel image. #@gmic : If the point image contains more than 3 channels, additional channels define the (R,G,B) color for each vertex. #@gmic : If 'outline_opacity>1', the outline is colored according to the specified vertex colors and 'outline_opacity-1' is used #@gmic : as the actual drawing opacity. #@gmic : Default values: 'width=512', 'height=width', 'outline_opacity=3', 'vertex_radius=0', 'is_antialiased=1', 'is_decorated=1', 'xlabel="x-axis"' and 'ylabel="y-axis"'. #@gmic : $ 1024,1,1,2,'t=x/40;if(c==0,sin(t),cos(t))*(exp(cos(t))-2*cos(4*t)-sin(t/12)^5)' -display_parametric 512,512 #@gmic : $ 1000,1,1,2,u(-100,100) -quantize 4,1 -noise 12 -channels 0,2 --normalize 0,255 -append c -display_parametric 512,512,0.1,8 display_parametric : -check "${1=512}>0 && ${2=$1}>0 && ${4=0}>=0" -skip ${3=3},${5=1},${6=1},"${7=x-axis}","${8=y-axis}" -v - s0="no " s1="" o0="" o1="colored " -v + -e[^-1] "Render $1x$2 parametric graph plot from data of image$?, with "${o{$3>1}}"outline opacity "{if($3>1,$3-1,$3)}\ ", vertex radius $4, "${s{$5!=0}}"antialiasing and "${s{$6!=0}}"decoration." -v - -repeat $! -l[$>] nm={0,n} N={w*h*d} -i[0] ({'CImg3d'}) -+[0] 0.5 -i[1] ($N;$N) -if {s==4} --channels. 3,3 -r. 100%,100%,1,2 -a[-2,-1] c is_grayscale=1 -else is_grayscale={s<4} -channels. 0,5 -endif -sh. 0 xm={im} xM={iM} -rm. -sh. 1 ym={im} yM={iM} -rm. -sh. 2 zm={im} zM={iM} -rm. -permute. cxyz -s. x,2 -i.. (1,0;1,{$N-1}) -r.. 2,$N,1,1,3 -round.. 1,$N,1,1,1 -y -a y -c3d -n3d -*3d 1,-1,1 {if($6,max(1,$1-32),$1)},{if($6,max(1,$2-32),$2)},1,{if($is_grayscale,1,3)},255 -*3d[0] {0.96*min(w,h)} -if $6 L={0.1*max($1,$2)} -grid[1] $L,$L,0,0,0.25,0xCCCCCCCC,0 -endif -if $5 -r[1] 200%,200%,1,100%,1 -*3d[0] 2 -if $4 --circles3d[0] {2*$4} -j3d[1] [2],50%,50%,0,1,3,0,0 -rm[2] -endif -elif $4 --circles3d[0] $4 -j3d[1] [2],50%,50%,0,1,3,0,0 -rm[2] -endif -if $3 -l[0] -s3d -f[1] 'i-y' -rm[3] -i[3] (2,0,1;2,{$N-2},{$N-1}) -r[3] 3,{$N-1},1,1,3 -round[3] -r[5] 1,{h-1},1,1,0 -if {$3>1} -r[4] 3,{4,h/3},1,1,-1 -r[4] 3,{4,h-1},1,1,2 -else -rm[4] -i[4] 3,{$N-1} -endif -y -a y -endl -j3d[1] [0],50%,50%,0,{if($3>1,$3-1,$3)},2,0,0 -endif -rm[0] -if $5 -r. 50%,50%,1,100%,2 -endif -if $6 xc={0.5*($xm+$xM)} yc={0.5*($ym+$yM)} dx={0.5*($xM-$xm)/0.96} dy={0.5*($yM-$ym)/0.96} xm={$xc-$dx} xM={$xc+$dx} ym={$yc-$dy} yM={$yc+$dy} 100%,100%,1,1,255 -axes. $xm,$xM,$yM,$ym,14,1,0 -if {$xm>0} -axes. 0,0,$yM,$ym,14,1,160 -endif -if {$xM<0} -axes. {w-1},{w-1},$yM,$ym,14,1,160 -endif -if {$ym>0} -axes. $xm,$xM,{h-1},{h-1},14,1,160 -endif -if {$yM<0} -axes. $xm,$xM,0,0,14,1,160 -endif --erode. 3 -!=. 255 -r.. 100%,100%,1,3 -j... [-2],0,0,0,0,1,[-1],1 -rm[-2,-1] -frame 1,1,128 -frame 15,15,220 0 -t. "$7",0,0,14,1,-220,-220,-220 -j.. [-1],{({-2,w}-w)/2},{{-2,h}-16},0,0,-1 -rm. 0 -t. "$8",0,0,14,1,-220,-220,-220 -rotate. -90 -j.. [-1],2,{({-2,h}-h)/2},0,0,-1 -rm. -endif -nm. $nm -endl -done -v + #@gmic dp : eq. to '-display_polar'. dp : -v - _gmic_s="$?" -v + -_display_polar $* #@gmic display_polar : _width>32,_height>32,_outline_type,_fill_R,_fill_G,_fill_B,_theta_start,_theta_end,_xlabel,_ylabel #@gmic : Render polar curve from selected image data. #@gmic : (eq. to '-dp'). #@gmic : 'outline_type' can be { r<0=dots with radius -r | 0=no outline | r>0=lines+dots with radius r }. #@gmic : 'fill_color' can be { -1=no fill | R,G,B=fill with specified color }. #@gmic : Default values: 'width=500', 'height=width', 'outline_type=1', 'fill_R=fill_G=fill_B=200', 'theta_start=0', 'theta_end=360', 'xlabel="x-axis"' and 'ylabel="y-axis"'. #@gmic : $ 300,1,1,1,'0.3+abs(cos(10*pi*x/w))+u(0.4)' -display_polar 512,512,4,200,255,200 #@gmic : $ 3000,1,1,1,'x^3/1e10' -display_polar 400,400,1,-1,,,0,{15*360} display_polar : -v - _gmic_s="$?" -v + -_$0 $* _display_polar : -check "${1=500}>32 && ${2=$1}>32" -skip ${3=1},${4=200},${5=$4},${6=$5},${7=0},${8=360},"${9=x-axis}","${10=y-axis}" -e[0--3] "Render $1x$2 polar graph plot from data of image"$_gmic_s", with outline $4 and fill color ($4,$5,$6)." -v - -repeat $! -l[$>] nm={0,n} M={max(abs(iM),abs(im))} -* {0.48*min($1,$2)/$M} -y ({$7*pi/180};{-$8*pi/180}) -r. 1,[-2],1,1,3 --sin. -cos.. -*. [-3] -*[-3,-2] -a[-2,-1] x N={h} -nm. coords -if $3 ({'CImg3d'}) -+. 0.5 ($N,$N) --z[coords] 0,2 1,$N,1,1,2 1,$N,1,1,'y' --+. 1 -a[-3--1] x -=. 0,2,100% 3,$N,1,1,0 1,$N,1,1,1 -y[-6--1] -a[-6--1] y -nm. _plot_polar_outline -endif -if {"$4>=0 && $5>=0 && $6>=0"} ({'CImg3d'}) -+. 0.5 ({$N+1},$N) --z[coords] 0,-1,2,100% -z. 0,2 1,$N,1,1,3 1,$N 1,$N,1,1,'1+y' --+. 1 -a[-4--1] x -=. 1,3,100% 3,$N,1,1,$4,$5,$6 1,$N,1,1,1 -y[-6--1] -a[-6--1] y -nm. _plot_polar_fill -endif -rm[coords] {$1-32},{$2-32},1,3,255 L={0.1*max($1,$2)} -grid. $L,$L,0,0,0.25,0xCCCCCCCC,0 -if {"$4>=0 && $5>=0 && $6>=0"} -j3d. [_plot_polar_fill],50%,50%,0,1,2,1,0 -rm[_plot_polar_fill] -endif -if $3 -if {$3>=0} -j3d. [_plot_polar_outline],50%,50%,0,1,1,0,0 -endif -if {$3!=0} -if {abs($3)>1} -circles3d[_plot_polar_outline] {abs($3)} -endif -j3d. [_plot_polar_outline],50%,50%,0,0.2,2,0,0 -endif -rm[_plot_polar_outline] -endif nM={$M/0.96} 100%,100%,1,1,255 -axes. {-$nM},$nM,$nM,{-$nM},14,1,0 --erode. 3 -!=. 255 -r.. 100%,100%,1,3 -j... [-2],0,0,0,0,1,[-1],1 -rm[-2,-1] -frame. 1,1,128 -frame. 15,15,220 0 -t. "$9",0,0,13,1,-220,-220,-220 -j.. [-1],{({-2,w}-w)/2},{{-2,h}-16},0,0,-1 -rm. 0 -t. "$10",0,0,13,1,-220,-220,-220 -rotate. -90 -j.. [-1],2,{({-2,h}-h)/2},0,0,-1 -rm. -nm $nm -endl -done -v + #@gmic drgba : eq. to '-display_rgba'. drgba : -_display_rgba #@gmic display_rgba #@gmic : Render selected RGBA images over a checkerboard background. #@gmic : (eq. to '-drgba'). #@gmic : $ image.jpg --norm -threshold. 40% -blur. 3 -normalize. 0,255 -append c -display_rgba display_rgba : -_$0 _display_rgba : -e[0--3] "Render RGBA image$? over a checkerboard background." -v - -to_a -repeat $! -l[$>] -i[0] (160,128;128,160) -nm[0] {1,n} -r[0] 16,16 -r[0] [1],[1],1,{s-1},0,2 -blend alpha -endl -done -v + #@gmic dt : eq. to '-display_tensors'. dt : -v - _gmic_s="$?" -v + -_display_tensors $* #@gmic display_tensors : _size_factor>0,_ellipse_factor>=0,_colored_mode={ 0 | 1 } #@gmic : Render selected mask field of 2x2 tensors with ellipses. #@gmic : (eq. to '-dt'). #@gmic : Default values: 'size_factor=16', 'ellipse_factor=0.92', 'color_mode=1'. #@gmic : $ image.jpg -diffusiontensors 0.7,0.6 -crop 60,10,90,30 --display_tensors , #@gmic : $$ display_tensors : -v - _gmic_s="$?" -v + -_$0 $* _display_tensors : -check "${1=16}>0 && ${2=0.92}>=0" -skip "${3=1}" -e[0--3] "Render field of 2x2 tensors from image"$_gmic_s", with size factor $1, ellipse factor $2 in "${-arg\ 1+!$3,colored,masked}" mode." -v - -if {$3} -repeat $! -l[$>] --_display_tensors $1,$2,0 -s[0] c --min[0,2] -*[1] -1 -+[1,-1] -a[0-2] c -r[0] [-1],[-1] -n[0] 0,255 -* -endl -done -else -repeat $! -l[$>] w={w} h={h} -* {($2*$1/2)^2/max(abs(im),abs(iM))} -s c -i.. [-2] -a c -s yx -r 2,2,1,1,-1 (0.5,0;0,0.5) -+[^-1] [-1] -rm. -invert -y c -r $1,$1 $1,$1,1,1,'x' --. {w/2} $1,$1,1,1,'y' --. {h/2} --sqr. -*.. [-3] -sqr... -i.. [-2] -a[-4--1] c -*[^-1] [-1] -rm. -compose_channels + -<= 1 -append_tiles $w,$h -endl -done -endif -v + #@gmic dw : eq. to '-display_warp'. dw : -v - _gmic_s="$?" -v + -_display_warp $* #@gmic display_warp : _cell_size>0 #@gmic : Render selected 2d warping fields. #@gmic : (eq. to '-dw'). #@gmic : Default value: 'cell_size=15'. #@gmic : $ image.jpg -luminance -blur 5 -gradient -append c -display_warp , display_warp : -v - _gmic_s="$?" -v + -_$0 $* _display_warp : -check "${1=15}>0" -e[0--3] "Render 2d warping field"$_gmic_s", with cell size $1." -v - -repeat $! -l[$>] -if {d!=1||s!=2} -error[0--3] "Command '-display_warp': Invalid image ["{$!-$>-1}"]: Dimensions "{w}","{h}","{d}","{s}" does not represent a 2d field of 2d vectors." -endif -i[0] 100%,100%,1,1,1 -grid[0] $1,$1 -nm[0] {1,n} -warp[0] [1],1,1,0 -rm[1] -endl -done -* 255 -v + #@gmic document_gmic : _format={ ascii | bash | html | images | latex },_image_path,_write_wrapper={ 0 | 1 } #@gmic : Create documentation of .gmic command files (loaded as raw 'uchar' images), in specified format. #@gmic : Default values: 'format=ascii', 'image_path=""' and 'write_wrapper=1'.\n #@gmic : Example(s) : raw:filename.gmic,char -document_gmic html,img document_gmic : -skip ${1="ascii"},${2=""},${3=1} -if {!$!} -return -endif -v -1 _name={0,b} -if {$!>1} -i[1--2] (10) -endif -a y -m {t} -s -,10 -_document_gmic_header_$1[] $3 _subsection=0 _example=0 _command=0 _is_example=0 _path="$2" ks0="0" ks1="-k[0]" -repeat $! -l[$>] -if {h>7" && "{${-head\ 6}'=='{'"#@gmic"'}}" && "(i[6]=={'" "'}" || "i[6]=={':'})} -rows 7,100% -autocrop {'" "'} _is_example=0 -if {i!={':'}} _command+=1 -s -,{'": "'} -autocrop {'" "'} -_document_gmic_declaration_$1 -else -rows 1,100% -if {i=={':'}} _subsection+=1 -rows 1,100% -autocrop {'" "'} -_document_gmic_subsection_$1 -else -autocrop {'" "'} -if {i=={'$'}} -rows 1,100% -autocrop {'" "'} _is_example=1 -if {i!={'$'}} _example+=1 -endif _filename=$_path$_name$_example.jpg -_document_gmic_example_$1 -else -_document_gmic_description_$1 -endif -endif -endif -endif ${ks{$!!=0}} -endl -done -rm -_document_gmic_footer_$1[] $3 _document_gmic_header_ascii : -skip $1 _shortcut=0 _document_gmic_subsection_ascii : -v + -e[] "\n\n "$_gmic_r$_gmic_b"**** "{0,t}":"$_gmic_n"\n" -v - _document_gmic_declaration_ascii : -if {{t}'=='"(+)"} qualifier=" "{t} -rm. -else qualifier="" -endif -if {$!>1" && "{${-head\ 7}'=='{'"eq. to "'}}} -rows. 7,100% -autocrop. {'.'} -autocrop. {'" "'} -autocrop. 39 _shortcut$_shortcut={0,t} _shortcutlink$_shortcut={t} _shortcutqualifier$_shortcut=$qualifier _shortcut+=1 -else -v + -e[] "\n "$_gmic_m${_gmic_b}"-"{0,t}${qualifier}":"$_gmic_n -v - -rm[0] -if $! s=" " -y x -repeat {$!-1} ({'" |"'}) -a[$>,-1] x -done -repeat $! -l[$>] -_document_gmic_split_ascii 80,0 -repeat {$!-1} ({'\n$s" "'}) -a[$>,-1] x -done -a x -v + -e[] $_gmic_g$s{0,t}$_gmic_n -v - -endl -done -endif -v + -e[] "" -v - -endif _document_gmic_description_ascii : s=" " bs0="\n" bs1="\\\\\n " -y x -if {!narg($_is_tutorial)} -_document_gmic_split_ascii 96 -endif -if {$!==1" && "0$_vt100>0" && "{${-head[0]\ 8}'=='{'"(eq. to "'}}} -i[0] ({'$_gmic_b'}) ({'$_gmic_n\n'}) -a x -endif -repeat {$!-1} ({'${bs$_is_example}$s" "'}) -a[$>,-1] x -done -a x -if {0$_vt100>0} -replace_str "Default values:","\n"$s${_gmic_b}"Default values:"$_gmic_n -replace_str "Default value:","\n"$s${_gmic_b}"Default value:"$_gmic_n -endif -v + -repeat $! -e[] $s{$>,t} -v - -done _document_gmic_example_ascii : _document_gmic_footer_ascii : -skip $1 -if $_shortcut ({'"Commands shortcuts"'}) -_document_gmic_subsection_ascii. -v + -e[] "" -v - -rm. -v + -repeat $_shortcut -e[] " "$_gmic_m$_gmic_b"-"${_shortcut$>}" "${_shortcutqualifier$>}":"$_gmic_n" eq. to '"$_gmic_g${_shortcutlink$>}$_gmic_n"'." -done -v - -endif -v + -e[] "\n "$_gmic_c"[ Total number of commands: "$_command" ]"$_gmic_n -v - _document_gmic_split_ascii : -do -if {w>$1} i={$1-1} -repeat {$1/2} -if {C=i($1-1-$>);C==32||C==38||C==42||C==43||C==44||C==46||C==47||C==58||C==59||C==63||C==92||C==124} i={$1-1-$>} -break -endif -done --z. {$i+1},100% -z.. 0,$i -endif -while {w>$1} _document_gmic_header_bash : -skip $1 -v + -e[] "# \n# Bash completion rules for 'gmic'. \n# \n# This file has been generated automatically. \n# Do not edit! \n# \n# This file should be copied/renamed in '/etc/bash_completion.d/gmic'. \n# \n \n_"$_name"() \n{ \n\tlocal cur prev opts coms \n\tCOMPREPLY=() \n\tcur=\"${COMP_WORDS[COMP_CWORD]}\" \n\tprev=\"${COMP_WORDS[COMP_CWORD-1]}\" " -v - _opts= _coms= _argcommand=0 _shortcut=0 _nbopts=0 _nbcoms=0 _document_gmic_subsection_bash : _document_gmic_description_bash : _document_gmic_example_bash : _document_gmic_declaration_bash : _opts$_nbopts=-{0,t}" "--{0,t} _nbopts+=1 _coms$_nbcoms={0,t} _nbcoms+=1 -if {{{0,t}'=='"input"}" || "{{0,t}'=='"i"}" || "\ {{0,t}'=='"output"}" || "{{0,t}'=='"o"}" || "\ {{0,t}'=='"command"}" || "{{0,t}'=='"m"}} -return -endif -repeat $! -if {{$<,t}'=='"(+)"} -rm[$<] -endif -done -if {$!==2" && "{${-head\ 7}'=='{'"eq. to "'}}} -rows. 7,100% -autocrop. {'.'} -autocrop. {'" "'} -autocrop. 39 -autocrop. {'-'} _shortcut$_shortcut={0,t} _shortcutlink$_shortcut=${-str2hex\ {1,t}} -rm. _shortcut+=1 -elif {$!>1} _command$_argcommand={0,t} -if {{0,t}'=='"help"} _argument$_argcommand="$coms\" -- \"$cur" -else -if {$!==2} ({'>'}) -endif -discard[^0] {'" "'} -i[2--2] ({'" "'}) -a[^0] y _argument$_argcommand={1,t} -endif _argumentlink${-str2hex\ {0,t}}=${_argument$_argcommand} _argcommand+=1 -endif _document_gmic_footer_bash : -skip $1 -v + -e[] "\topts=\"\\" -repeat $_nbopts -e[] "\t "${_opts$>}\\ -done -e[] "\t \"" -e[] "\n\tcoms=\"\\" -repeat $_nbcoms -e[] "\t "${_coms$>}\\ -done -e[] "\t \"" -e[] "\n\tcase \"${prev}\" in" -repeat $_argcommand -e[] "\t\t\"-"${_command$>}"\" | \"--"${_command$>}"\")" -e[] "\t\tCOMPREPLY=( $(compgen -W \""${_argument$>}"\") )\n\t\treturn 0\n\t\t;;" -done -repeat $_shortcut -if {narg(${_argumentlink${_shortcutlink$>}})} -e[] "\t\t\"-"${_shortcut$>}"\" | \"--"${_shortcut$>}"\")" -e[] "\t\tCOMPREPLY=( $(compgen -W \""${_argumentlink${_shortcutlink$>}}"\") )\n\t\treturn 0\n\t\t;;" -endif -done -e[] "\tesac" -e[] "\n\tif [[ \"$cur\" == -* ]] ; then \n\t\tCOMPREPLY=( $(compgen -W \"$opts\" -- \"$cur\") ) \n\telse \n\t\t_filedir \n\tfi \n \n} \n complete -F _"$_name" -o filenames gmic" -v - _document_gmic_header_html : -if $1 -v + -e[] " \n \n \n \n \n \n \n" -v - -endif -m "don : -_document_gmic_desc_on_html" -m "doff : -_document_gmic_desc_off_html" -m "eon : -_document_gmic_ex_on_html" -m "eoff : -_document_gmic_ex_off_html" _is_desc=0 _is_ex=0 _shortcut=0 _document_gmic_desc_on_html : -v - -if $_is_desc -u "
" -else -u "

" _is_desc=1 -endif -v + _document_gmic_desc_off_html : -v - -if $_is_desc -u "

" _is_desc=0 -else -u "" -endif -v + _document_gmic_ex_on_html : -v - -if $_is_ex -u "" -else -u "
"\ "" _is_ex=1 -endif -v + _document_gmic_ex_off_html : -v - -if $_is_ex -u "
Example of use:
" _is_ex=0 -else -u "" -endif -v + _document_gmic_subsection_html : -v + -e[] ${-eoff}${-doff}"

\"\"  "\ ""{0,t}"

" -v - _document_gmic_declaration_html : -if {{t}'=='"(+)"} qualifier=" "{t} -rm. -else qualifier="" -endif s1="\n" s0=" |
" -if {$!>1" && "{${-head\ 7}'=='{'"eq. to "'}}} -rows. 7,100% -autocrop. {'.'} -autocrop. {'" "'} -autocrop. 39 _shortcut$_shortcut={0,t} _shortcutlink$_shortcut={t} _shortcutqualifier$_shortcut=$qualifier _shortcut+=1 -else _command_name={0,t} -v + -e[] ${-eoff}${-doff}"

  -"{0,t}$qualifier":" -if {$!>1} -e[] "

" -repeat {$!-1} -l[{1+$>}] -if {h>48} -v - -replace_str ",",", " -v + -endif -e[] {0,t}${s{$<==0}} -endl -done -e[] "

" -else -e[] "" -endif -v - -endif _document_gmic_description_html : -if {${-head\ 13}'=='{'"Default value"'}} -s +,{':'} -l[^0] -a y -endl -autocrop {':'} -autocrop {'" "'} -v + -if {$!>1} -e[] ${-don}"
"{0,t}": "{t} -else -e[] ${-don}"
"{0,t} -endif -v - -elif {${-head\ 8}'=='{'"(eq. to "'}} -v + -e[] ${-don}""{t}"" -v - -else -if {(i<{'A'}" || "i>{'Z'})" && "i!=40" && "i!=39} -v + -e[] ${-don}" "{t} -v - -else -v + -e[] ${-don}{t} -v - -endif -endif _document_gmic_example_html : -if {i=={'$'}} -if {h==1&&i=={'$'}} tuturl=http://gmic.eu/tutorial/_$_command_name.shtml -else -autocrop {'$'} -autocrop {'" "'} tuturl=http://gmic.eu/tutorial/{0,t}.shtml -endif -v + -e[] ${-eon}"\"\""\ "A tutorial page exists for this command." -v - -else -if $_filename -else -m "foo : "{t} -l[] -v -99 -reset -foo -v -1 -_document_gmic -o $_filename,85 -rm -endl -uncommand foo -endif -v + -e[] ${-eon}"
"\ "\"\"
"{t}"
"{t}"" -v - -endif _document_gmic_footer_html : -skip $1 -if $_shortcut _subsection+=1 ({'"Commands shortcuts"'}) -_document_gmic_subsection_html. -rm. -v + -e[] "

" -repeat $_shortcut -e[] "  -"${_shortcut$>}" "${_shortcutqualifier$>}":" -e[] "eq. to '"${_shortcutlink$>}"'
" -done -e[] "

" -v - -endif -v + -e[] ${-eoff}${-doff}"

[ Total number of commands: "$_command" ]" -v - -uncommand don,doff,eon,eoff _document_gmic_header_images : -skip $1 -v + -e[] "\n - Generate example images from set of commands '"$_name"'.\n" -if image.jpg -else -testimage2d 400 -o. image.jpg -rm. -endif -v - _document_gmic_subsection_images : -v + -e[] "\n ** Section ""#"$_subsection": "{0,t}".\n" -v - _document_gmic_declaration_images : _command_name={0,t} _document_gmic_description_images : _document_gmic_example_images : -if {i=={'$'}} -return -endif -v + -e[] " ["$_example"] Command '-"$_command_name"': $ "{t} -v - -if $_filename -else -m "foo"$_example" : "{t} -l[] -v -1 -reset -v -99 -foo$_example -v -1 -_document_gmic -o $_filename,85 -rm -endl -uncommand foo$_example -endif _document_gmic_footer_images : -skip $1 -v + -e[] " - [ All done! ]\n\n" -v - _document_gmic_header_latex : -if $1 -v + -e[] "\\documentclass[a4paper,10.5pt,twoside]{book} \n\\usepackage{hyperref,fancyhdr,graphicx,amssymb,amsmath,times,makeidx,color} \n\\graphicspath{{"$_path"}} \n\\pagestyle{fancyplain} \n\\lhead[\\fancyplain{}{\\textbf\\thepage}]{\\fancyplain{}{\\rightmark}} \n\\rhead[\\fancyplain{}{\\leftmark}]{\\fancyplain{}{\\textbf\\thepage}} \n\\cfoot{} \n\\setlength{\\textwidth}{5.875in} \n\\setlength{\\parindent}{0pc} \n\\setlength{\\oddsidemargin}{15.5pt} \n\\setlength{\\evensidemargin}{15.5pt} \n\\setcounter{tocdepth}{1} \n\\sloppy{} \n\\definecolor{ca}{rgb}{0.8,0,0} \n\\definecolor{cb}{rgb}{0,0.2,0.6} \n\\definecolor{cc}{rgb}{0,0.5,0} \n\\definecolor{cd}{rgb}{0.6,0.6,0.6} \n\\def\\Ccr{\\color{ca}} \n\\def\\Ccb{\\color{cb}} \n\\def\\Ccg{\\color{cc}} \n\\def\\Ccc{\\color{cd}} \n\\def\\Ccn{\\color{black}} \n\\def\\comma{\\discretionary{,}{}{,}} \n\\newcommand{\\Ca}[1]{\\textcolor{ca}{#1}} \n\\newcommand{\\Cb}[1]{\\textcolor{cb}{#1}} \n\\newcommand{\\Cc}[1]{\\textcolor{cc}{#1}} \n\\newcommand{\\Cd}[1]{\\textcolor{cd}{#1}} \n\\renewcommand\\indexname{Index of commands} \n\\makeindex \n\\begin{document} \n\\tableofcontents" -v - -endif -v + -e[] "\n\\chapter{List of commands}" -v - -m "eon : -_document_gmic_ex_on_latex" -m "eoff : -_document_gmic_ex_off_latex" _is_desc=0 _is_ex=0 _shortcut=0 _document_gmic_ex_on_latex : -v - -if $_is_ex -u "\\\\" -else -u "\\begin{center}" _is_ex=1 -endif -v + _document_gmic_ex_off_latex : -v - -if $_is_ex -u "\\end{center}" _is_ex=0 -else -u "" -endif -v + _document_gmic_subsection_latex : _is_desc=0 -_document_gmic_replace_latex -v + -e[] ${-eoff}"\n\\section{"{0,t}"}" -v - _document_gmic_declaration_latex : _is_desc=0 -if {{t}'=='"(+)"} qualifier={t} -rm. -else qualifier="" -endif e1="\\end{flushleft}" e0="~~~\\\\" -if {$!>1" && "{${-head\ 7}'=='{'"eq. to "'}}} -_document_gmic_replace_latex -rows. 7,100% -autocrop. {'.'} -autocrop. {'" "'} -autocrop. 39 _shortcut$_shortcut={0,t} _shortcutlink$_shortcut={t} _shortcutqualifier$_shortcut=$qualifier _shortcut+=1 -else -_document_gmic_replace_latex[0] _command_name={0,t} -v + -e[] ${-eoff}"\n\n\\subsection{\\emph{-"{0,t}"\\index{-"{0,t}"}} "$qualifier"}\\vspace*{-0.7em}" -if {$!>1} -e[] "~\\\\\\textbf{\\Cb{Arguments: }}\\begin{flushleft}" -repeat {$!-1} -l[{1+$>}] -v - -s y,-60 -if {$!>1} -i[1--2] ({'\\-'}) -endif -y -a y -_document_gmic_replace_latex -v + -e[] "{\\small \\Cb{\\hspace*{0.5cm}$\\bullet$~~\\texttt{"{0,t}"}}}"${e{$<==0}} -endl -done -endif -v - -endif _document_gmic_description_latex : s0="" s1="~\\\\" s=${s$_is_desc} -_document_gmic_replace_latex -if {${-head\ 13}'=='{'"Default value"'}} -s +,{':'} -l[^0] -a y -endl -autocrop {':'} -autocrop {'" "'} -if {$!>1} -replace_str[1] " and ","} and \\\\texttt{" -v + -e[] ${-eoff}"\\begin{flushleft}\\Cc{\\textbf{"{0,t}"}:\\\\~\\\\\\hspace*{0.5cm}{\\small $\\bullet$~~\\texttt{"{t}"}}}\\end{flushleft}" -v - -else -v + -e[] ${-eoff}$s"~\\\\"{0,t} -v - -endif -elif {${-head\ 8}'=='{'"(eq. to "'}} -rows. 8,100% -autocrop. {'.'} -autocrop. {')'} -autocrop. {'" "'} -v + -e[] ${-eoff}$s"(\\emph{eq. to} {\\small \\texttt{"{t}"}})." -v - -else -if {(i<{'A'}" || "i>{'Z'})" && "i!=40" && "i!=39} -v + -e[] ${-eoff}{t} -v - -else -v + -e[] ${-eoff}$s{t} -v - -endif -endif _is_desc=1 _document_gmic_example_latex : -if {i=={'$'}} -if {h==1&&i=={'$'}} tuturl=http://gmic.eu/tutorial/\\_$_command_name.shtml -else -autocrop {'$'} -autocrop {'" "'} tuturl=http://gmic.eu/tutorial/{0,t}.shtml -endif -l[] ({'$tuturl'}) -replace_str "_","\\_" -s x,-60 -if {$!>1} -i[1--2] ({'\\\\-'}) -endif -a x -replace_str. "_","\\_" tuturl={t} -rm -endl -v + -e[] ${-eoff} -if {!$_is_ex} -e[] "~\\\\" -endif -e[] "~\\textbf{Tutorial page: }\\\\\\url{"$tuturl"}" -v - -else _is_desc=0 -if $_filename -else -m "foo : "{t} -l[] -v -99 -reset -foo -v -1 -_document_gmic -o $_filename,85 -rm -endl -uncommand foo -endif -_document_gmic_replace_latex -v + -e[] ${-eon}"\\includegraphics[keepaspectratio=true,height=6cm,width=\\textwidth]{"$_filename"}\\\\" -e[] "{\\footnotesize \\textbf{Example "$_example"~:} \\texttt{"{t}"}}" -v - -endif _document_gmic_footer_latex : -if $_shortcut ({'"Commands shortcuts"'}) -_document_gmic_subsection_latex. -rm. -v + -repeat $_shortcut -e[] "$\\bullet$~'\\texttt{\\Ca{-"${_shortcut$>}"}}' "${_shortcutqualifier$>}"~is equivalent to~~'\\texttt{\\Ca{"${_shortcutlink$>}"}}'.\\\\" -done -v - -endif -if $1 -v + -e[] " \n\\printindex \n~\\\\$\\square$~End of document. \n\n\\end{document}" -v - -endif -uncommand eon,eoff _document_gmic_replace_latex : -replace_str "\\","\\\\textbackslash " -replace_str "_","\\\\_" -replace_str "%","\\\\%" -replace_str "#","\\\\%" -replace_str "^","\\\\textasciicircum " -replace_str "$","\\\\$" -replace_str "\{","\\\\\{" -replace_str "\}","\\\\\}" -replace_str "&","\\\\&" -replace_str "|","~$|$~" -replace_str "<","$\<$" -replace_str ">","$\>$" -replace_str "\\\\textbackslash -","\\\\-" -replace_str ",","{\\\\\\comma}" _document_gmic_header_man : -skip $1 _gmic_n="\\fR" _gmic_b="\\fB" _gmic_r="" _gmic_g="" _gmic_c="\\fB" _gmic_m="" -_document_gmic_header_ascii $"*" _document_gmic_subsection_man : -v + -e[] "\n "$_gmic_b"** "{0,t}":"$_gmic_n -v - _document_gmic_declaration_man : -if {{t}'=='"(+)"} qualifier=" "{t} -rm. -else qualifier="" -endif -if {$!>1" && "{${-head\ 7}'=='{'"eq. to "'}}} -rows. 7,100% -autocrop. {'.'} -autocrop. {'" "'} -autocrop. 39 _shortcut$_shortcut={0,t} _shortcutlink$_shortcut={t} _shortcutqualifier$_shortcut=$qualifier _shortcut+=1 -else -v + -e[] "\n "${_gmic_b}"-"{0,t}${qualifier}":"$_gmic_n -v - -rm[0] -if $! s=" " -y x -repeat {$!-1} ({'" |"'}) -a[$>,-1] x -done -repeat $! -l[$>] -_document_gmic_split_ascii 80,0 -repeat {$!-1} ({'\n$s" "'}) -a[$>,-1] x -done -a x -v + -e[] $s{0,t} -v - -endl -done -endif -v + -e[] "" -v - -endif _document_gmic_description_man : s=" " bs0="\n" bs1="\\\\\n " -y x -if {!narg($_is_tutorial)} -_document_gmic_split_ascii 96 -endif -repeat {$!-1} ({'${bs$_is_example}$s" "'}) -a[$>,-1] x -done -a x -replace_str "Default values:","Default values:" -replace_str "Default value:","Default value:" -replace_str "\\","\\\\" -v + -repeat $! -e[] $s{$>,t} -v - -done _document_gmic_example_man : _document_gmic_footer_man : -skip $1 -_document_gmic_footer_ascii $"*" _document_gmic : -repeat $! -l[$>] W$>={w} H$>={h} D$>={d} S$>={s} IS_3D$>=${-_is_3d} -endl -done -repeat $! -l[$>] -if ${IS_3D$>} -r3d 1,1,0,-80 -r3d 0,1,0,80 -snapshot3d 400 -else -if {w>8192} -z 0,8191 -elif {h>8192} -rows 0,8191 -endif -n 0,255 -endif -endl -done --append_tiles , -if {w>900} r={round(900*100/w,0.1)} -r[^-1] $r%,$r%,1,100%,2 -endif -rm. -repeat $! -l[$>] -if {s==1} -r {w},{h},1,3 -else -r {w},{h},1,3,0 -endif -if {w<=h&&h<256} -r2dy 256,2 -elif {h<=w&&w<256} -r2dx 256,2 -endif -if {w<=h&&h>512} -r2dy 512,2 -elif {h<=w&&w>512} -r2dx 512,2 -endif -if {h<48} -r 100%,48 -endif -if {w<48} -r 48,100% -endif -frame 1,1,0 -frame 4,4,255 -endl -done N=$! -repeat $N -l[$>] {w},16,1,3,255 -if {w>75} -if {$N>1} -if {w>110} -t. Image\ [$>]:,3,3,15 -else -t. [$>]:,3,3,15 -endif -endif -if ${IS_3D$>} 0 -t. (3d\ object),0,0,13,1,255 -else 0 -t. (${W$>}x${H$>}x${D$>}x${S$>}),0,0,13,1,255 -endif -negative. -n. 0,255 -+. 164 -c. 0,255 -to_rgb. -j.. [-1],{{-2,w}-w-5},{{-2,h}-h-1} -rm. -else -t. [$>]:,3,3,15 -endif -rv[-2,-1] -a[-2,-1] y -endl -done -- 255 -append_tiles , -+ 255 -if {w<256} -- 255 -r 256,100%,1,3,0,0,0.5,0.5 -+ 255 -endif -if {h<256} -- 255 -r 100%,256,1,3,0,0,0.5,0.5 -+ 255 -endif #@gmic e : eq. to '-echo'. : (+) #@gmic echo : message : (+) #@gmic : Output specified message on the error output. #@gmic : (eq. to '-e'). #@gmic : Command selection (if any) stands for displayed call stack subset instead of image indices. #@gmic echo_file : filename,message #@gmic : Output specified message, appending it to specified output file. #@gmic : (similar to '-echo' for specified output file stream). echo_file : -skip "${2='\n'}" -v - ({"'${2--1}\n'"}) -o. raw:$1,char -rm. -v + #@gmic echo_stdout : message #@gmic : Output specified message, on the standard output (stdout). #@gmic : (similar to '-echo' for output on standard output instead of standard error). echo_stdout : -v - ({'"$*"\n'}) -o. -.raw,char -rm. -v + #@gmic function1d : 0<=smoothness<=1,x0>=0,y0,x1>=0,y1,...,xn>=0,yn #@gmic : Input continuous 1d function from specified list of keypoints (xk,yk) #@gmic : in range [0,max(xk)] (xk are positive integers). #@gmic : Default values: 'smoothness=1' and 'x0=y0=0'. #@gmic : $ -function1d 1,0,0,10,30,40,20,70,30,80,0 --display_graph 400,300 function1d : -check "${1=1}>=0 && $1<=1" -skip ${2=0},${3=0} -e[^-1] "Input continuous 1d function, with smoothness $1 and keypoints (${2--1})." -v - -l[] smoothness={max(0,min(1,$1))} (${2--1}) -r 2,{int(w/2)},1,1,-1 -sort +,y -s x size={0,if(iM>=0,1+int(iM),0)} -if {!$size} -rm 0 -break -endif -a x --f '0.5*(j(0,1,0,0,0,1)-j(0,-1,0,0,0,1))' -s. x -max.. 0.01 -/. [-2] -rm.. -a x $size,1,1,1,-1 -repeat {0,h-1} x0={0,i(0,$>)} y0={0,i(1,$>)} x1={0,i(0,$>+1)} y1={0,i(1,$>+1)} slope={($y1-$y0)/max(0.01,$x1-$x0)} yp0={0,i(2,$>)*$smoothness+(1-$smoothness)*$slope} yp1={0,i(2,$>+1)*$smoothness+(1-$smoothness)*$slope} i={round($x0,1,1)} j={round($x1,1,0)} -line[1] $i,0,$j,0,1,$> -if {$j-$i<=1} ({$y0-$x0*$slope}^{$slope}^0^0) -else (1,$x0,{($x0)^2},{($x0)^3};\ 1,$x1,{($x1)^2},{($x1)^3};\ 0,1,{2*$x0},{3*($x0)^2};\ 0,1,{2*$x1},{3*($x1)^2}) ($y0;$y1;$yp0;$yp1) -solve. [-2] -rm.. -y. c -endif -done -a[2--1] x -map.. [-1] -rm. 100%,1,1,1,1 (0,{w-1}) -r. {-2,w},1,1,1,3 -round. --sqr. --*[-2,-1] -a[-4--1] c -*[-2,-1] -s. c -+[-4--1] -rm.. -endl -v + #@gmic gmicky #@gmic : Load a new image of the G'MIC mascot 'Gmicky'. #@gmic : $ -gmicky gmicky : -e[^-1] "Load image of the G\47MIC mascot 'Gmicky'." -v - filename=${-path_rc}/gmicky_large.cimgz -if $filename $filename -else http://gmic.eu/img/gmicky_large.cimgz -o. $filename -+. 0 -endif -nm. [gmicky] -v + #@gmic gmicky_wilber #@gmic : Load a new image of the G'MIC mascot 'Gmicky' together with GIMP mascot 'Wilber'. #@gmic : $ -gmicky_wilber gmicky_wilber : -e[^-1] "Load image of the G\47MIC mascot 'Gmicky' together with GIMP mascot 'Wilber'." -v - filename=${-path_rc}/gmicky_wilber_large.cimgz -if $filename $filename -else http://gmic.eu/img/gmicky_wilber_large.cimgz -o. $filename -+. 0 -endif -nm. [gmicky_wilber] -v + #@gmic i : eq. to '-input'. : (+) #@gmic input : [type:]filename : [type:]http://URL : [selection]x_nb_copies>0 : { width>0[%] | [image_w] },{ _height>0[%] | [image_h] },{ _depth>0[%] | [image_d] },{ _spectrum>0[%] | [image_s] },_{ value1,_value2,.. | 'formula' } : (value1{,|;|/|^}value2{,|;|/|^}..) : 0 : (+) #@gmic : Insert a new image taken from a filename or from a copy of an existing image ['indice']," #@gmic : or insert new image with specified dimensions and values. Single quotes may be omitted in #@gmic : 'formula'. Specifying argument '0' inserts an 'empty' image. #@gmic : (eq. to '-i' | (no arg)). #@gmic : Default values: 'nb_copies=1', 'height=depth=spectrum=1' and 'value1=0'. #@gmic : $ -input image.jpg #@gmic : $ -i (1,2,3;4,5,6;7,8,9^9,8,7;6,5,4;3,2,1) #@gmic : $ image.jpg (1,2,3;4,5,6;7,8,9) (255^128^64) 400,400,1,3,'if(x>w/2,x,y)*c' #@gmic : $$ #@gmic ig : eq. to '-input_globbing'. ig : -input_glob $* #@gmic input_glob : pattern #@gmic : Insert new images from several filenames that match the specified glob pattern. input_glob : -e[^1] "Input all files that match glob pattern '$*'." -v - -files 3,"$*" N=$! -m "_ig : $""=arg -repeat $""# -i ${arg{1+$>}} -done" -_ig ${} -uncommand _ig -if {$N==$!} -error[0--3] "Command '-input_glob': No matching filenames for pattern '$*'." -endif -v + #@gmic input_gpl : filename #@gmic : Input specified filename as a GIMP palette data file. input_gpl : -e[^-1] "Input GIMP palette file '$*'." -v - -l[] -i raw:"$*",char -replace 9,32 -s -,10 colors=0 -repeat $! -l[$>] -s -,32 -if {$!>=3" && "isint({0,t})" && "isint({1,t})" && "isint({2,t})} colors=$colors;{0,t},{1,t},{2,t} -endif -rm 0 -onfail -rm 0 -endl -done -rm ($colors) -rows 1,100% -nm "$1" -permute yzcx -endl -v + #@gmic o : eq. to '-output'. : (+) #@gmic output : [type:]filename,_format_options : (+) #@gmic : Output selected images as one or several numbered file(s). #@gmic : (eq. to '-o'). #@gmic : Default value: 'format_options'=(undefined). #@gmic output_ggr : filename,_gradient_name #@gmic : Output selected images as GIMP gradient files. #@gmic : If no gradient name is specified, it is deduced from the filename. output_ggr : -skip "${2=}" -e[^-1] "Output image$? as GIMP gradient file '$1'." -v - N=$! -repeat $N --l[$>] -r 1,{w*h*d},1,100%,-1 -to_rgba -/ 255 -if {narg("$2")} name="$2" -else -l[] 1 -nm. "$1" ({'{b}'}) -f "if(x==0&&i>="{'a'}"&&i<="{'z'}",i-"{'a'}"+"{'A'}",i)" name={t} -rm -endl -endif ({'"GIMP Gradient\nName: "$name\n{0,h}\n'}) -repeat {0,h} start={_$>/{0,h}} end={_($>+1)/{0,h}} mid={_0.5*($start+$end)} rgba=${-at[0]\ 0,$>} r={arg(1,$rgba)} g={arg(2,$rgba)} b={arg(3,$rgba)} a={arg(4,$rgba)} ({'$start" "$mid" "$end" "$r" "$g" "$b" "$a" "$r" "$g" "$b" "$a" 0 0\n"'}) -done -rm[0] -a x -if {$N>1} -o raw:${"-filename \"$1\",$>"},char -else -o raw:"$1",char -endif -rm -endl -done -v + #@gmic on : eq. to '-outputn'. on : -v - _gmic_s="$?" -v + -_outputn $* #@gmic outputn : filename #@gmic : Output selected images as automatically numbered filenames in repeat..done loops. #@gmic : (eq. to '-on'). outputn : -v - _gmic_s="$?" -v + -_$0 $* _outputn : -v - filename=${-filename\ "$1",$>} -v + -e[0--3] "Output image"$_gmic_s" as file '"$filename"'." -v - -o $filename -v + #@gmic op : eq. to '-outputp'. op : -v - _gmic_s="$?" -v + -_outputp $* #@gmic outputp : prefix #@gmic : Output selected images as prefixed versions of their original filenames. #@gmic : (eq. to '-op'). #@gmic : Default value: 'prefix=_'. outputp : -v - _gmic_s="$?" -v + -_$0 $* _outputp : -skip ${1="_"} -if {$!>1} -e[0--4] "Output image"$_gmic_s" as their initial locations, prefixed by '$1'." -else -e[0--4] "Output image"$_gmic_s" as its initial location, prefixed by '$1'." -endif -v - -repeat $! -o[$>] {$>,f}$1{$>,b}.{$>,x} -done -v + #@gmic ow : eq. to '-outputw'. ow : -v - _gmic_s="$?" -v + -_outputw #@gmic outputw #@gmic : Output selected images by overwritting their original location. #@gmic : (eq. to '-ow'). outputw : -v - _gmic_s="$?" -v + -_$0 $* _outputw : -if {$!>1} -e[0--4] "Output image"$_gmic_s" as their initial location." -else -e[0--4] "Output image"$_gmic_s" as its initial location." -endif -v - -repeat $! -o[$>] {$>,n} -done -v + #@gmic ox : eq. to '-outputx'. ox : -v - _gmic_s="$?" -v + -_outputx $* #@gmic outputx : extension1,_extension2,_...,_extensionN,_output_at_same_location={ 0 | 1 } #@gmic : Output selected images with same base filenames but for N different extensions. #@gmic : (eq. to '-ox'). #@gmic : Default value: 'output_at_same_location=0'. outputx : -v - _gmic_s="$?" -v + -_$0 $* _outputx : -v - $=arg is_last_arg=0 is_same_location=0 -if {isval($-1)} is_last_arg={isint($-1)&&$-1>=0&&$-1<=1} is_same_location=$-1 -endif N={$#-$is_last_arg} s0= s1=s -if {!$N} -v + -e[0--3] "Output image"$_gmic_s" at same location, with same base filename but extension '' (skipped, no extension provided)." -return -endif -if $is_same_location -v + -if $is_last_arg -e[0--4] "Output image"$_gmic_s" at same location, with same base filename but extension"${s{$N>1}}"' ${^-1}'." -else -e[0--4] "Output image"$_gmic_s" at same location, with same base filename but extension"${s{$N>1}}" '$*'." -endif -v - -repeat $! -l[$>] -repeat $N -o {0,f}{0,b}.${arg{1+$>}} -done -endl -done -else -v + -if $is_last_arg -e[0--4] "Output image"$_gmic_s" with same base filename but extension"${s{$N>1}}"' ${^-1}'." -else -e[0--4] "Output image"$_gmic_s" with same base filename but extension"${s{$N>1}}" '$*'." -endif -v - -repeat $! -l[$>] -repeat $N -o {0,b}.${arg{1+$>}} -done -endl -done -endif -v + #@gmic pass : _shared_state={ 0=non-shared (copy) | 1=shared | 2=adaptive } : (+) #@gmic : Insert images from parent context of a custom command or a local environment. #@gmic : Command selection (if any) stands for a selection of images in the parent context. #@gmic : By default (adaptive shared state), selected images are inserted in a shared state if they do not belong to the context (selection) of the current custom command or local environment as well. #@gmic : Typical use of command '-pass' concerns the design of custom commands that take images as arguments. #@gmic : Default value: 'shared_state=2'. #@gmic : $ -command "average : -pass$""1 -add[^-1] [-1] -remove. -div 2" -testimage2d 512 --mirror y --average[0] [1] #@gmic plot : _plot_type,_vertex_type,_xmin,_xmax,_ymin,_ymax,_exit_on_anykey={ 0 | 1 } : 'formula',_resolution>=0,_plot_type,_vertex_type,_xmin,xmax,_ymin,_ymax,_exit_on_anykey={ 0 | 1 } : (+) #@gmic : Display selected image or formula in an interactive viewer (use the instant display window [0] if opened). #@gmic : 'plot_type' can be { 0=none | 1=lines | 2=splines | 3=bar }. #@gmic : 'vertex_type' can be { 0=none | 1=points | 2,3=crosses | 4,5=circles | 6,7=squares }. #@gmic : 'xmin','xmax','ymin','ymax' set the coordinates of the displayed xy-axes. #@gmic : Default values: 'plot_type=1', 'vertex_type=1', 'xmin=xmax=ymin=ymax=0 (auto)' and 'exit_on_anykey=0'. #@gmic p : eq. to '-print'. : (+) #@gmic print : (+) #@gmic : Output information on selected images, on the standard error (stderr). #@gmic : (eq. to '-p'). #@gmic rainbow_lut #@gmic : Input a 256-entries RGB colormap of rainbow colors. #@gmic : $ image.jpg -rainbow_lut --luminance.. -map. [-2] rainbow_lut : -e[^-1] "Input RGB colormap of 256 rainbow colors." -v - (2,10,13,13,15,16,15,15,18,23,26,31,33,37,38,39,42,42,44,45,44,44,45,45,44,42,44,45,45,49,50,52,54,55,56,57,\ 56,56,57,57,58,57,58,58,59,58,60,59,58,59,59,59,59,59,60,60,59,59,59,59,60,59,59,59,59,59,59,59,58,58,58,56,\ 56,54,51,48,44,39,33,20,5,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,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,5,25,50,66,81,90,102,109,118,129,137,144,152,158,168,178,183,190,199,207,\ 213,220,227,230,236,242,246,250,255,255,253,253,253,252,251,250,250,249,248,248,247,248,246,246,246,245,246,\ 245,245,245,246,246,246,246,246,246,246,246,245,245,245,245,245,244,245,244,245,245,245,245,245,245,245,245,\ 245,244,244,245,245,243,239,235,230,226,220,216,211,204,201,194,190,184,176,171,164,160,152,144,138,130,122,\ 114,107,96,87,78,69,57,50,46,38,31,19,5^3,10,14,15,17,18,19,18,19,23,25,30,31,35,37,39,42,44,45,48,49,50,51,\ 52,53,56,59,63,66,66,68,69,71,73,74,75,76,76,77,78,79,79,80,81,81,82,82,83,84,84,84,84,84,85,85,86,86,86,86,\ 87,88,87,86,86,86,86,88,89,89,90,92,92,94,96,99,102,104,107,111,117,120,126,130,136,142,149,155,161,167,172,\ 176,178,179,179,178,178,178,178,177,177,177,176,176,176,176,175,173,173,174,173,172,171,171,171,171,171,171,\ 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,173,173,173,175,176,178,178,178,181,182,184,\ 186,186,190,192,193,195,198,200,201,204,206,209,211,208,206,202,197,194,190,185,182,178,172,167,162,157,152,\ 144,139,132,127,121,115,108,102,98,92,87,79,75,69,64,62,58,55,52,50,49,47,47,47,47,47,47,47,47,46,46,46,46,\ 45,44,44,42,42,41,41,40,39,38,37,36,34,31,30,29,30,30,31,32,32,32,33,33,34,34,33,34,33,32,31,31,30,29,26,25,\ 23,21,19,15,13,13,16,18,18,18,17,15,13,12,9,2^6,19,25,32,41,49,55,65,71,79,84,90,96,102,106,111,117,121,128,\ 132,134,139,143,146,149,152,155,156,157,159,159,160,161,162,163,164,164,165,166,167,166,165,166,166,167,167,\ 168,168,168,169,169,169,169,170,170,170,170,170,170,170,171,170,170,170,170,170,171,171,172,173,173,173,175,\ 177,179,180,183,185,187,190,193,198,201,206,213,219,225,227,227,223,218,214,204,199,192,184,179,172,168,162,\ 156,151,145,139,133,126,120,113,106,98,90,85,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,84,84,82,82,82,\ 82,82,83,83,81,81,81,80,80,78,78,78,76,74,73,73,71,72,69,68,67,65,62,59,58,56,51,50,49,45,43,40,38,37,35,32,\ 31,32,32,33,33,34,34,35,36,36,37,38,39,42,44,45,46,46,47,48,49,48,48,48,48,48,48,48,48,48,48,47,47,47,47,46,\ 45,45,43,43,42,41,40,39,38,37,38,38,37,37,38,38,38,38,39,40,39,40,39,40,40,39,39,38,38,37,35,34,32,30,28,26,\ 23,20,16,14,12,16,16,18,18,17,16,14,13,9,2) -nm. [rainbow\ lut] -v + #@gmic roddy #@gmic : Load a new image of the G'MIC Rodilius mascot 'Roddy'. #@gmic : $ -roddy roddy : -e[^-1] "Load image of the G\47MIC Rodilius mascot 'Roddy'." -v - filename=${-path_rc}/roddy_large.cimgz -if $filename $filename -else http://gmic.eu/img/roddy_large.cimgz -o. $filename -+. 0 -endif -nm. [roddy] -v + #@gmic select : feature_type,_X,_Y,_Z,_exit_on_anykey={ 0 | 1 } : (+) #@gmic : Interactively select a feature from selected images (use the instant display window [0] if opened). #@gmic : 'feature_type' can be { 0=point | 1=segment | 2=rectangle | 3=ellipse }. #@gmic : Arguments 'X','Y','Z' determine the initial selection view, for 3d volumetric images. #@gmic : The retrieved feature is returned as a 3d vector (if 'feature_type==0') or as a 6d vector #@gmic : (if 'feature_type!=0') containing the feature coordinates. #@gmic : The coordinates of the last selected features are also returned as the status value. #@gmic : Default values: 'X=Y=Z=(undefined)' and 'exit_on_anykey=0'. #@gmic serialize : _datatype,_is_compressed={ 0 | 1 },_store_names={ 0 | 1 } : (+) #@gmic : Serialize selected list of images into a single image, optionnally in a compressed form. #@gmic : 'datatype' can be { uchar | char | ushort | short | uint | int | ulong | long | float | double }. #@gmic : Specify 'datatype' if all selected images have a range of values constrained to a particular datatype, in order to minimize the memory footprint. #@gmic : The resulting image has only integers values in [0,255] and can then be saved as a raw image of #@gmic : unsigned chars (doing so will output a valid .cimg[z] or .gmz file). #@gmic : If 'store_names' is set to '1', serialization uses the .gmz format to store data in memory (otherwise the .cimg[z] format). #@gmic : Default values: 'datatype=float', 'is_compressed=1' and 'store_names=1'. #@gmic : $ image.jpg --serialize uchar --unserialize. #@gmic shape_heart : _size>=0 #@gmic : Input a 2d heart binary shape with specified size. #@gmic : $ -shape_heart , shape_heart : -check "${1=512}>=0" -e[^-1] "Input a $1x$1 heart binary shape." -v - ir={round($1)} -if {!$ir} 0 -else -l[] 2048,1,1,1,'t=2*pi*x/w;16*sin(t)^3' 2048,1,1,1,'t=2*pi*x/w;13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)' -a c -display_parametric $ir,$ir,1,0,0,0 -flood 50%,50%,0,0,0,1,0 -==. 0 -endl -endif -nm "[2d heart shape]" -v + #@gmic shape_circle : _size>=0 #@gmic : Input a 2d circle binary shape with specified size. #@gmic : Default value: 'size=512'. #@gmic : $ -shape_circle , shape_circle : -check "${1=512}>=0" -e[^-1] "Input a $1x$1 circle binary shape." -v - ir={round($1)} -if {!$ir} 0 -elif {$ir<2} $ir,$ir,1,1,1 -else {int($ir/2)+($ir%2)},{int($ir/2)+($ir%2)} -=. 1,100%,100% -distance. 1 -<=. {(i+0.4)/sqrt(2)} --mirror. x -if {$ir>1&&($ir%2)} -r. {w-1},100%,1,1,0,0,1 -endif -a[-2,-1] x --mirror. y -if {$ir>1&&($ir%2)} -r. 100%,{h-1},1,1,0,0,0,1 -endif -a[-2,-1] y -endif -nm. "[2d circle shape]" -v + #@gmic shape_cupid : _size>=0 #@gmic : Input a 2d cupid binary shape with specified size. #@gmic : Default value: 'size=512'. #@gmic : $ -shape_cupid , shape_cupid : -check "${1=512}>=0" -e[^-1] "Input a $1x$1 cupid binary shape." -v - ir={round($1)} -if {!$ir} 0 -else -l[] (480,480,1,1,1) ({'" -WHX /ZL[ 1\\N] 2k 2l 4m 4m 4m 4m "\ " 4m 4m 4m 3l 3k 2k 1i 0i /g .g -e +c )a (` &^ $\\ !Y NW "\ " LU IQ "\ " :R>Z 9ZD^ 8T *^G` :X@Q ?`Ib ;ZCS AcMe ;[FTAQ \"{ ;\\GTBS $} ;\\JVBS $} ;]LWBT %} ;hBV (~P ;gBXNT 0~P ;hC^ 0~P "\ " GQEhC^ 0~P KZKpK_ 0~P M~TM_ 0~P ~h 0~P !~i 0~P \"~j 0~P \#~k 0~ \#~m 1~ $~n 0} %~o 0| %~q 1| &~r 0{ \47~t 1z (~w 1y *~z 2x +~| 2w +~~"\ " 2v ,~~P 1t ,~~\\ ~~c LU 2~m?~~b KU 0~k?~~b KV 0~k@~~b KX 2~l@~~` KZ 2~k@~~` K[ 1~j@~~_ LTKU 2U&~i?~~] LSHU 4X\47~i@~~] MTGT "\ " 5[\47~g@~~\\ MTET 6\\\47~f?~~[ MSCT 7]&~e@~~Z MTCU 8_1VL~dA~~Z MTAU 9a5~pA~~Z NU@T 9c7~pA~~Y MT>U :d:~qB~~Y LS=V ;f<~rC~~Y MT~rC~~Y NT:V ~z/U GU F~~m>~y.T FV G~~m?~y.T DU G~~m@~y.U DU G~~n@~"\ "w-T BU G~~m@UH~i-T AU F~~m*~^-U AU E~~l*~]-U ?U E~~l*~Z+T >U C~~l,~Y+U >U B~~t5~X+U =V A~~v9~W+U ;U @~~w;~W+U ;U >~~y@~W+U :U <~~zC~W+T 9V ;~~zF~W+U 9V 8~~yH~W,U 7U 5~~xL~X+U"\ " 7U 3~~~~S,U 6U ?~~~~^,U 5U @~~~~^+U 5V B~~~~QIV+U 4V C~~~~Q MU 3V C~~~~P LT 2V C~~~~ LU 2V C~~~~ MU 1V C~~~} MU 0V B~~~| MT /V A~~~{ NU /V @~~~y NU /W >~~~w NU /V :~~~t U "\ ".V 8~~~r!U -V 4~~~o\"U -V .~~~j$U -W 1~~~r*V -V 3~~~y/V ,V 4~~~|1U ,W 5~~~~3V ,W 6~~~~R6V +V 5~~~~T8U +W 4~~~~U:T *W 4~~~~Z@U +W 3~~~~]DU +W 1~~~~^FT *W 0~~~~^HT *W -~~~~^"\ "KT *X +~~~~^NU +X \"~~~~\\ +X !~~~~\\ ,X ~~~~[ +W ~~~~\\ ,W N~~~~\\ -W N~~~~] .X N~~~~] /X M~~~~] 0Y L~~~~] 1X J~~~~\\ 2X G~~~~[ 4X @~~~~V 6Y >~~~~U 7X >~~~~X :X "\ " >~~~~Z ~~~~] @Z >~~~~t)Z >~~~~{0[ =~~~~}4\\ =~~~~~Q9^ ;~~~~~R>a 4~~~~~Fd 4~~~~~n 5~~~~~o*S 1~~~~~q-X 4~~~~~y6Z 5~~~~~~UB] 7~~~~~~[J` 6~~~~~~p /~~~~~hEu /~~"\ "~~~f=o 0~~~~~f2d /~~~~~e1c /~~~~~e0a ,~~~~~c/^ \#~~~~~\\.\\ !~~~~~[-Y N~~~~~Z*T K~~~~~Z !~~~~~Z ~~~~~X K~~~~~T C~~~~{ B~~~~y @~~~~x >~~~~v =~~~~v ;~~~"\ "~s 3~~~~l 1~~~~[M\\ 0~~kKX:vGZ .~~hHT4oDZ ,TK`L~xGR\47_?Y !]I~vGQ 5Y ZG~vFP 4Y NWF~vFP 4Y =~wGQ 5Y =~wGQ 5Y =~wGQ 4X >~xFP 4X ?~zGQ 5X @~{G"\ "Q 5Y D~~GQ 4X F~~QGR 5X G~~RFQ 5X H~~SFQ 4X J~~TFR 5X K~~UEQ 4W L~~VEQ 4X N~~WEQ 4X ~~XER 4W ~~XDQ 4X \"~~YDQ 4X \#~~ZDQ 3W $~~[DR 4X %~"\ "~[DR 4X &~~\\CQ 4X &~~\\CQ 4X &~~\\CQ 4X \47~~]CR 5X \47~~]BQ 5X \47~~\\AQ 5X \47~~\\AQ 5X (~~]AR 6X (~~]@Q 6X (~~]@Q 7Y )~~]?Q 7X LV 2~~]?R 8X !] 5~~]>Q 8X \#a 7~"\ "~]>Q 9Y %d 8~~\\=R :X &g 9~~\\=R :X )k :~~\\Y ;~R <~~Z9R ?X :~R <~~Y8R @Y ;~S <~~X6Q @X :~S <~~X6Q AY ;~T ="\ "~~X5R BX :~T >~~X4R CX 9~U B~~Z2Q CX 9~U F~~]1Q DX 8~V I~~_1Q EX 7~X L~~^/R GY 7~d*~~_/R HY 5~f/~~a.Q HX 4~h2~~a-Q IX 1TJ~_7~~c-R KY $~^;~~e-R LY \"~^=~~f,Q MY ~_@~~h-Q NY K"\ "~]B~~i-R!Y H~[C~~k.R\"Y B~WE~~l-Q\#Y =~TG~~m-R%Y ;~TH~~n.R\47Z 9~TJ~~p/R(Z 7~TL~~q.Q)Z 5~~~x.R,[ 3~~~x/R-[ 1~~~w/R.Z /~~~w.Q0[ -~~~v.Q2\\ +~~~v/R4[ (~~~u/R6[ &~~~u"\ ".Q8\\ $~~~t.Q9\\ \"~~~s.Q;\\ N~~~s/R>] L~~~r.Q@] I~~~q.QB^ G~~~p.QC] D~~~p.QF\\ @~~~o.QH\\ =~~~n.RK\\ :~~~m.b 8~~~l.` 5~~~k.] 1~~~j.Y +~~~h.W (~~~g.U"\ " &~~~g.T \#~~~e.S !~~VJ~X.S N~~RF~V.R L~~PD~U.R J~{A~U/Q G~w>~T \#~s;~S !~m6~R N~i3~Q J~a.~P G~Z)~ E~ M} Ds C| Cf 6{ A"\ "a 2z @] .z ?Y +y 480} -b. 0.2% -endif ->= 40% -endl -endif -nm "[2d cupid shape]" -v + #@gmic shape_diamond : _size>=0 #@gmic : Input a 2d diamond binary shape with specified size. #@gmic : Default value: 'size=512'. #@gmic : $ -shape_diamond , shape_diamond : -check "${1=512}>=0" -e[^-1] "Input a $1x$1 diamond binary shape." -v - ir={round($1)} -if {!$ir} 0 -elif {$ir<2} $ir,$ir,1,1,1 -else {int($ir/2)+($ir%2)},{int($ir/2)+($ir%2)} -=. 1,100%,100% -distance. 1,1 -<=. {i/2} --mirror. x -if {$ir>1&&($ir%2)} -r. {w-1},100%,1,1,0,0,1 -endif -a[-2,-1] x --mirror. y -if {$ir>1&&($ir%2)} -r. 100%,{h-1},1,1,0,0,0,1 -endif -a[-2,-1] y -endif -nm. "[2d diamond shape]" -v + #@gmic shape_polygon : _size>=0,_nb_vertices>=3,_angle #@gmic : Input a 2d polygonal binary shape with specified geometry. #@gmic : Default value: 'size=512', 'nb_vertices=5' and 'angle=0'. #@gmic : $ -repeat 6 -shape_polygon 256,{3+$>} -done shape_polygon : -check "${1=512}>=0 && isint(${2=5}) && $2>=3" -skip ${3=0} -e[^-1] "Input a $1x$1 polygon binary shape, with $2 vertices and angle $3 deg." -v - ir={round($1)} -if {!$ir} 0 -else -l[] (0;{2*pi}) -+ {($3-90)*pi/180} -r. 1,{$2+1},1,1,3 -rows. 0,{h-2} ir2={round($ir/2)} --sin. -cos.. -a x -* {$ir2-1} -+ $ir2 $ir,$ir -polygon. $2,{-2,^},1,1 -rm.. -endl -endif -nm "[2d $2-polygon shape]" -v + #@gmic shape_star : _size>=0,_nb_branches>0,0<=_thickness<=1 #@gmic : Input a 2d star binary shape with specified size. #@gmic : Default values: 'size=512', 'nb_branches=5' and 'thickness=0.38'. #@gmic : $ -shape_star , shape_star : -check "${1=512}>=0 && ${2=5}>0 && ${3=0.5}>=0 && $3<=1" -e[^-1] "Input a $1x$1 star binary shape, with $2 branches and thickness $3." -v - ir={round($1)} -if {!$ir} 0 -else -l[] -star3d $2,$3 -col3d 1 -c3d -n3d -*3d $1,$1 $1,$1 -j3d. [-2],50%,50%,0,1,2 -rm.. -endl -endif -nm "[2d star shape]" -v + #@gmic sh : eq. to '-shared'. : (+) #@gmic shared : x0[%],x1[%],y[%],z[%],v[%] : y0[%],y1[%],z[%],v[%] : z0[%],z1[%],v[%] : v0[%],v1[%] : v0[%] : (no arg) : (+) #@gmic : Insert shared buffers from (opt. points/rows/planes/channels of) selected images. #@gmic : Shared buffers cannot be returned by a command, nor a local environment. #@gmic : (eq. to '-sh'). #@gmic : $ image.jpg -shared 1 -blur. 3 -remove. #@gmic : $ image.jpg -repeat {s} -shared 25%,75%,0,$> -mirror. x -remove. -done #@gmic : $$ #@gmic srand : value : (no arg) : (+) #@gmic : Set random generator seed. #@gmic : If no argument is specified, a random value is used as the random generator seed. #@gmic testimage2d : _width>0,_height>0,_spectrum>0 #@gmic : Input a 2d synthetic image. #@gmic : Default values: 'width=512', 'height=width' and 'spectrum=3'. #@gmic : $ -testimage2d 512 testimage2d : -check "${1=512}>0 && ${2=$1}>0 && ${3=3}>0" -e[^-1] "Input 2d synthetic image of size $1x$2x$3." -v - Dmax2={0.15*min($1,$2)^2} $1,$2,1,$3,'X=x-w/2;Y=y-h/2;a=atan2(Y,X);if(X^2+Y^2<=$Dmax2,255*abs(cos(c+200*(x/w-0.5)*(y/h-0.5))),850*(a%(0.1*(c+1))))' -polygon. 4,20%,20%,60%,20%,70%,70%,35%,45%,0.9,0,255,0 -torus3d {$1/7},{$1/20} -r3d. 0,1,1,80 -col3d. 128,200,255 -j3d.. [-1],30%,70%,0,1,5,0,0 -rm. -round. 1 -nm. "[2d test image]" -v + #@gmic uncommand : command_name[,_command_name2,...] : * : (+) #@gmic : Discard last definition of specified custom commands. #@gmic : Set argument to '*' for discarding all existing custom commands. #@gmic uniform_distribution : nb_levels>=1,spectrum>=1 #@gmic : Input set of uniformly distributed N-d points in [0,1]^N. #@gmic : $ -uniform_distribution 64,3 -* 255 --distribution3d -circles3d. 10 uniform_distribution : -check "isint($1) && $1>0 && isint($2) && $2>0" -e[^1] "Input set of $1 uniformly distributed $2-d points in [0,1]^$2." -v - n={round($1^(1/$2),1,1)} (0,1) -r. $n,1,1,1,3 -repeat {$2-1} --channels. 100% -r. {$n*w},1,1,1,1 -r.. [-1],1,1,100%,0,2 -a[-2,-1] c -done -r. $1,1,1,$2,1 -nm. "[uniform $2d distribution]" -v + #@gmic unserialize : : (+) #@gmic : Recreate lists of images from serialized image buffers, obtained with command '-serialize'. #@gmic up : eq. to '-update'. up : -_update #@gmic update #@gmic : Update commands from the latest definition file on the G'MIC server. #@gmic : This requires an active Internet connection and an access to the external #@gmic : tools 'curl' or 'wget'. #@gmic : Once the update has been downloaded, running 'gmic' makes it use automatically. #@gmic : (eq. to '-up'). update : -_$0 _update : -e[0--3] "Update commands from the latest definition file on the G\47MIC server." -v - out=${-path_rc}cli_update$_version.gmic -l[] cimgz:http://gmic.eu/cli_update$_version.gmic -if {h>7" && "{${-head\ 6}'=='{'"#@gmic"'}}} -o raw:$out,char -endif -rm -onfail -error[0--3] "Command '-update' : Unreachable update file." -endl -m $out -v + update_film_emulation_html : -if {!$!} -error[^-1] "Command '-update_film_emulation': Missing input images !" -endif -v - jpeg_quality=70 thumb_width=180 thumb_height=90 categories=bw,instant_consumer,instant_pro,negative_color,negative_new,negative_old,print,colorslide,various category_names="Black and White","Instant [consumer]","Instant [pro]","Negative [color]","Negative [new]","Negative [old]","Print films","Slide [color]","Various" -m "_thumb : -frame 3%,3%,255 -to_rgba -drop_shadow 2,2,3 -repeat $! -l[$>] -i[0] 100%,100%,1,3,245 -blend alpha -endl -done" -m "_title : ({'\"$""*\"'}) -replace. {'_'},32 -f. if((x==0||j(-1)==32)&&i>={'a'}&&i<={'z'},i+{'A'}-{'a'},i) -u {t} -rm." nb_presets=0 -repeat {narg($categories)} category=${-arg\ {1+$>},$categories} presets=${-_gimp_emulate_film_$category} nb_presets+={narg($presets)} -done -v + -e[] "\n > Update film emulation pages, for "$!" image samples and "$nb_presets" presets." -v - -v + -e[] "\n * Prepare folder structure." -v - -x "ln -fs ../copyright.html ." -x "ln -fs ../favicon.ico ." -x "ln -fs ../favicon.png ." -x "ln -fs ../footer.html ." -x "ln -fs ../header.html ." -x "ln -fs ../gmicmenu ." -x "ln -fs ../jquery-1.11.0.min.js ." -x "ln -fs ../style.css ." -x "ln -fs ../images ." -x "mkdir -p img" -x "cd img && ln -fs ../../img/logo4.jpg ." -x "cd img && ln -fs ../../img/logos.jpg ." -x "cd img && ln -fs ../../img/rss.png ." -x "ln -fs ../highslide ." -v + -e[] "\n * Generate thumbnails from samples." -v - -if original -else -x "mkdir original" -endif nb_samples=$! -to_rgb -repeat $nb_samples -l[$<] -nm[0] sample_{1+$<} basename={0,b} basename$<=$basename -v + -e[] " - "$basename -v - --r2dx $thumb_width --text_outline[0] "Reference",4,{0,h-28},20,2 -frame. 1,1,0 -o. original/$basename.jpg,$jpeg_quality -rm. --_thumb[1] -o. original/thumb_$basename.jpg,$jpeg_quality -rm. --r2dy[0] $thumb_height -_thumb. -o. original/minithumb_$basename.jpg,$jpeg_quality -rm. -endl -done ind_preset=0 -repeat {narg($categories)} category=${-arg\ {1+$>},$categories} presets=${-_gimp_emulate_film_$category} -v + -e[] "\n * Category ""#"{1+$>}": "$category" ***\n" -v - -if $category -else -x "mkdir "$category -endif -if $category/clut -else -x "mkdir "$category/clut -endif -repeat {narg($presets)} preset=${-arg\ {1+$>},$presets} filename=${-path_rc}film_$preset.cimgz -v + -e[] " - "$preset -v - -i $filename -to_rgb. s={sqrt(w*h*d)} -if {!isint($s)} -v + -warn[] "Preset '"$preset"' must be resampled." -v - -r. 64,64,64,3,3 -endif s={sqrt(w*h*d)} --r. $s,$s,1,3,-1 -if {iM<=255} -*. 257 -endif -o. $category/clut/$preset.png -rm. -repeat $nb_samples -l[{2*$>},{2*$>+1},-1] basename={0,b} -if $category/$basename/$preset.jpg -else -if $category/$basename -else -x "mkdir \""$category/$basename"\"" -endif --map_clut[^-1] [-1] -text_outline.. ${-_title\ $preset},4,{-2,h-28},20,2 -frame.. 1,1,0 -o.. $category/$basename/$preset.jpg,$jpeg_quality -_thumb. -o. $category/$basename/thumb_$preset.jpg,$jpeg_quality -rm[-2,-1] -endif -endl -done -rm. ind_preset+=1 -done -done -rm[1--1:2] -v + -e[] "\n * Generate html code.\n" -v - -repeat {narg($categories)} category=${-arg\ {1+$>},$categories} -arg {1+$>},$category_names category_name=${} presets=${-_gimp_emulate_film_$category} -repeat $nb_samples width={$>,64+w} height={$>,64+h} basename={$>,b} -v + -e[] " - "$category_name" / "$basename -v - ({'" \n\n \n \n

Film Emulation
\n
\n

Among all features available in G\47MIC, our Film Emulation filters are able to apply various pre-defined color presets on your images.\n Most of those 300+ presets have been designed by Patrick David, in order to emulate the look of\n analog films. They have a dedicated section in the open-source G\47MIC plug-in for GIMP, so you can apply all these easily in GIMP.

\n\n

Below, you can navigate through the different proposed color presets and see how they modify the colors of some sample images.\n You can also download each color preset separately as its corresponding Hald-CLUT file (in .png format), to use it in\n other softwares that support this feature.

\n\n

Image credits: Sample images below have been borrowed from Patrick David and\n Chi King\47s Flickr accounts, distributed under\n CC-by-SA 2.0.

\n\n

Disclaimer:
\n The trademarked names which may appear in the filenames of the Hald CLUT images are there for informational purposes only. They serve only to inform the user which film stock the given Hald CLUT image\n is designed to approximate. As there is no way to convey this information other than by using the trademarked name, we believe this constitutes fair use. Neither the publisher nor the authors are affiliated\n with or endorsed by the companies that own the trademarks.

\n\n
\"\"
\n
\n
\n \n \n \n
Select film category:\n
    \n"'}) -repeat {narg($categories)} _category=${-arg\ {1+$>},$categories} -arg {1+$>},$category_names _category_name=${} -if {$_category'=='$category} ({'"
  • "$_category_name"
  • \n "'}) -else ({'"
  • "$_category_name"
  • \n "'}) -endif -done ({'"
\n
Select sample image:

\n "'}) -repeat {$nb_samples} _basename=${basename$>} -if {$_basename'=='$basename} ({'" \"\"\n "'}) -else ({'" \"\"\n "'}) -endif -done ({'"
\n
\"\"
\n "'}) ({'"\n
Presets ("{narg($presets)}")
\n
\n
\n \n \n\n "'}) -repeat {narg($presets)} preset=${-arg\ {1+$>},$presets} ({'$preset'}) -replace_seq. 39,"92,92,39" preset_esc={t} -rm. title=${-_title\ $preset} -if {$>%4==0} -if $> ({'"\n"'}) -endif ({'""'}) -endif ({'" \n\n"'}) -done ({'"
\n
\"\"\n
Reference Image
\n
Refence Image
\n \n \n
\n
\n \"\"\n \n
\n \"\"\n
\n
Preset: "$title" [Download CLUT]
\n
"$title"
\n
\"\"
\n "'}) ({'"\n \n "'}) -a[$nb_samples--1] x -o. raw:${category}_$basename.shtml,char -rm. -done -done -rm category=${-arg\ 1,$categories} -x "ln -fs "${category}_$basename0.shtml" index.shtml" -v + -e[] "\n > All done, for "$nb_presets" presets.\n" update_gallery_html : -e[^-1] "Generate gallery for the G'MIC web site." -v - thumb_size=128 -x "rm -f gallery.shtml img/gallery_*.jpg" img/chloe.jpg img/fawn.jpg img/house.jpg img/statue.jpg img/beach.jpg nb_imgs=$! -repeat $! --r2dy[$>] $thumb_size width$>={w} -rm. -done _nb_coms=-1 -_update_gallery_html " " -_update_gallery_html " " -_update_gallery_html " " -_update_gallery_html " " -_update_gallery_html " " -_update_gallery_html "-luminance" -_update_gallery_html "-solarize" -_update_gallery_html "-negative" -_update_gallery_html "-select_color 100,0,0,0 -n 0,255" -_update_gallery_html "-array_fade 4,4" -_update_gallery_html "--mirror. x -fade_x 40,60" -_update_gallery_html "-shift_tiles 20,20" -_update_gallery_html "-fisheye 40" -_update_gallery_html "-fisheye 50" -_update_gallery_html "-shade_stripes ," -_update_gallery_html "-shade_stripes 40,1" -_update_gallery_html "-tetris 10" -_update_gallery_html "-blur 1 -gradient_orientation 2 -+ -n 0,255 -smooth 60,0,1,1,3" -_update_gallery_html "-flower 30,5" -_update_gallery_html "-water 30,1.5" -_update_gallery_html "-wave 4,0.4" -_update_gallery_html "-wave 15,0.2" -_update_gallery_html "-deform 10" -_update_gallery_html "-light_patch 4,0.7,1.7" -_update_gallery_html "-mosaic 0.5,80,1" -_update_gallery_html "-sponge 13" -_update_gallery_html "-hearts 15" -_update_gallery_html "-color_ellipses 1400,10,0.07" -_update_gallery_html "-whirls 3" -_update_gallery_html "-edges 15 -n 0,255" -_update_gallery_html "-to_rgba -gimp_reflect 50,1,110,160,190,64,0,1.5,0,-3.30,7,1.5 -display_rgba" -_update_gallery_html "-transform_polar R-r" -_update_gallery_html "-drawing 200" -_update_gallery_html "-draw_whirl 100" -_update_gallery_html "-texturize_paper" -_update_gallery_html "-stencilbw 30" -_update_gallery_html "-glow 4" -_update_gallery_html "-ditheredbw" -_update_gallery_html "-blur_angular 10" -_update_gallery_html "-blur_radial 10" -_update_gallery_html "-repeat 3 --deform[0] 10 -done -+ -n 0,255" -_update_gallery_html "-flood 50%,50%,0,50,0,0.7,155,100,255" -_update_gallery_html "--mirror x --mirror y -* -equalize 255 -n 0,255" -_update_gallery_html "-kaleidoscope 0.5,0.5,50,20" -_update_gallery_html "-noise 40 -cut 0,255 --meancurvature_flow. 20 -sharpen. 100 -a x" -_update_gallery_html "-gradient_norm -sqrt -n 0,255" -_update_gallery_html "-to_rgba -rotate_tiles 15,5,5 -display_rgba" -_update_gallery_html "-taquin 5" -_update_gallery_html "img/chloe.jpg -drop_shadow. 3 -rotate. 55 -blend alpha" -_update_gallery_html "[-1] -deform 10 -morph 4,0.05 -a x" -_update_gallery_html "-polaroid 20 -drop_shadow 3,3 -rotate 10,1 -display_rgba" -_update_gallery_html "--plasma 10,10 -n. 0.5,2.5 -n 0,255 -and -equalize 256" -_update_gallery_html "100%,100% -mandelbrot. -1.17229,-0.3038,-1.15209,-0.2836,1000 -map. 0 -*.. 1.5 -+ -n 0,255" -_update_gallery_html "--edges 15 -n 0,255 -fade_y 30,70" -_update_gallery_html "-split_tiles 5,5 -blur 8 -sharpen 1000 -equalize 255 -append_tiles 5,5" -_update_gallery_html "-imagecube3d -*3d 256 -r3d 1,1,0,60 512,512,1,3 -plasma. 10,10 -n. 0,128 -m3d 5 -db3d 0 -object3d[1] [0],50%,50% -k[1] -n 0,255" -_update_gallery_html "-warp_perspective 0.3,0.9,0.5" -_update_gallery_html "-rodilius ," -_update_gallery_html "-blur 3 -gradient2rgb 1" -_update_gallery_html "-normalize_local 80,7" -_update_gallery_html "-normalize_local 80,3" -_update_gallery_html "-normalize_local 80,7" -_update_gallery_html "-normalize_local 80,6,2" -_update_gallery_html "-isophotes 4 -dilate 3 -i[0] (0;255^0;255^100;100) -r[0] [1],[1],1,3,3 -blend alpha" -_update_gallery_html "-crop 30%,30%,70%,70% -resize 200%,200%,1,100%,5 -frame_fuzzy 30,30" -_update_gallery_html "-cartoon ," -_update_gallery_html "-cartoon ," -_update_gallery_html "-cartoon ," -_update_gallery_html "-cartoon ," -_update_gallery_html "-cartoon ," -_update_gallery_html "-resize2dx 300 -m3d 2 -elevation3d 0.3 -f3d 200 -snapshot3d 400,1.5" -_update_gallery_html "-resize2dx 300 -m3d 2 -elevation3d 0.3 -f3d 200 -snapshot3d 400,1.5" -_update_gallery_html "-resize2dx 300 -m3d 2 -elevation3d 0.3 -f3d 200 -snapshot3d 400,1.5" -_update_gallery_html "-resize2dx 300 -m3d 2 -elevation3d 0.3 -f3d 200 -snapshot3d 400,1.5" -_update_gallery_html "-resize2dx 300 -m3d 2 -elevation3d 0.3 -f3d 200 -snapshot3d 400,1.5" -_update_gallery_html "-topographic_map 16,2" -_update_gallery_html "-topographic_map 16,2" -_update_gallery_html "-topographic_map 16,2" -_update_gallery_html "-topographic_map 16,2" -_update_gallery_html "-topographic_map 16,2" -_update_gallery_html "--blur 10 -curvature. -norm. -+. 0.01 -/ -equalize 255 -n 0,255" -_update_gallery_html "--blur 10 -curvature. -norm. -+. 0.01 -/ -equalize 255 -n 0,255" -_update_gallery_html "--blur 10 -curvature. -norm. -+. 0.01 -/ -equalize 255 -n 0,255" -_update_gallery_html "--blur 10 -curvature. -norm. -+. 0.01 -/ -equalize 255 -n 0,255" -_update_gallery_html "--blur 10 -curvature. -norm. -+. 0.01 -/ -equalize 255 -n 0,255" -_update_gallery_html "-blur 1 -pencilbw 0.3" -_update_gallery_html "-blur 1 -pencilbw 0.3" -_update_gallery_html "-blur 1 -pencilbw 0.3" -_update_gallery_html "-blur 1 -pencilbw 0.3" -_update_gallery_html "-blur 1 -pencilbw 0.3" -_update_gallery_html "-old_photo -drop_shadow 3,3 -rotate -5,1 -display_rgba" -_update_gallery_html "-old_photo -drop_shadow 3,3 -rotate -10,1 -display_rgba" -_update_gallery_html "-old_photo -drop_shadow 3,3 -rotate -15,1 -display_rgba" -_update_gallery_html "-old_photo -drop_shadow 3,3 -rotate -20,1 -display_rgba" -_update_gallery_html "-old_photo -drop_shadow 3,3 -rotate -25,1 -display_rgba" -_update_gallery_html "-erode 10 --erode 3 -- -equalize 255 -smooth 40,0,1,1,3 -n 0,255 -negative" -_update_gallery_html "-erode 10 --erode 3 -- -equalize 255 -smooth 60,0,1,1,3 -n 0,255 -negative" -_update_gallery_html "-erode 10 --erode 3 -- -equalize 255 -smooth 80,0,1,1,3 -n 0,255 -negative" -_update_gallery_html "-erode 10 --erode 3 -- -equalize 255 -smooth 100,0,1,1,3 -n 0,255 -negative" -_update_gallery_html "-erode 10 --erode 3 -- -equalize 255 -smooth 120,0,1,1,3 -n 0,255 -negative" -_update_gallery_html "-light_relief ," -_update_gallery_html "-light_relief ," -_update_gallery_html "-light_relief ," -_update_gallery_html "-light_relief ," -_update_gallery_html "-light_relief ," -_update_gallery_html "--warhol 2 -fade_radial 50,70" -_update_gallery_html "--warhol 3 -fade_radial 50,70" -_update_gallery_html "--warhol 4 -fade_radial 50,70" -_update_gallery_html "--warhol 5 -fade_radial 50,70" -_update_gallery_html "--warhol 6 -fade_radial 50,70" -_update_gallery_html "--sketchbw , -rv -blend overlay" -_update_gallery_html "--sketchbw , -rv -blend overlay" -_update_gallery_html "--mirror x -a x -map_sphere ," -_update_gallery_html "--mirror x -a x -map_sphere ," -_update_gallery_html "-gimp_painting 2,1.5,2" -_update_gallery_html "-f3d 800 -rm 512,512,1,3 -chessboard 64,64,0,0,15,1,${-RGB},${-RGB} --imagecube3d -*3d. 230 -r3d. 1,1,0.5,50 -m3d 3 -object3d.. [-1],50%,50%,0 -rm. -gimp_painting 1,1.5,2 -equalize. 256" -_update_gallery_html "--histogram 256 -display_graph. {0,w},{0,h},3 -to_rgba. -*. 0.5 -blend alpha" -_update_gallery_html "100%,100%,1,1,'X=(x-w/2)/30;Y=(y-h/2)/30;5*cos(X*Y)*sqrt(X^2+Y^2)' -elevation3d[0] [1] -k[0] -r3d 1,1,0,60 -snapshot3d 500,2" -_update_gallery_html "-kuwahara 10 -noise 30 -smooth 100,0,1,3,3 -sharpen 400 -n 0,255 -equalize 256" -_update_gallery_html "-frame 4,4,0 -array_mirror 1,3" _nb_coms+=1 ({'"\n\ \n
Image Gallery
\n
\n All the images below have been processed by the command line version gmic\n of G\47MIC, from a set of initial 2D color images (displayed on the first row).
\n Click on an image to zoom-in. The corresponding G\47MIC command used to generate the image appears as a caption.\n This gallery is intended to show the flexibility and the genericity of the G\47MIC language.\n Remember, you can easily define your own image filters and effects by writting\n your custom G\47MIC command file,\n and eventually put them directly in GIMP afterwards.\n\n \n Copyrights : All pictures have been shot by David Tschumperlé.

\n"'}) ({'"
"\n'}) row=0 -repeat $_nb_coms ind={$>%$nb_imgs} out_img=${"-filename "img/gallery.jpg,$>} out_thumb=${"-filename "img/gallery_thumb.png,$>} -if {!$ind} ({'"\n"'}) -endif com=${_com$>} -v + -e[] " - Image "{$>+1}/$_nb_coms" : $ "$com -v - displayed_com$ind=$com -if {!narg($com)} com="-skip ," -endif --__update_gallery_html[$ind] $com iind={$ind%5} width={$iind,w} height={$iind,h} -o. $out_img,75 -r2dy. $thumb_size -if {w>${width$ind}} -r. ${width$ind},100%,100%,100%,2 -endif -l. -frame 3%,3%,255 -to_rgba -drop_shadow 2,2,3 -endl -o. $out_thumb -rm. ({'"\n"'}) -if {$ind==$nb_imgs-1" || "$>==$_nb_coms-1} ({'"\n"\n'}) -repeat {$ind+1} ({'"\n"'}) -done ({'"\n"'}) row+=1 -endif -done ({'"
}"\">
\ \ \"\"\
gmic "{$ind,b}.{$ind,x}" "${displayed_com$ind}"
\
}"\">
gmic "{$>,b}.{$>,x}" "${displayed_com$>}"
\n"'}) ({'"
\"\"
\n\ \n\ \n"'}) -rm[0-{$nb_imgs-1}] -a x -o gallery.raw,uchar -x "mv gallery.raw gallery.shtml" -rm -v + -e[^-1] "All done !" _update_gallery_html : _nb_coms+=1 _com$_nb_coms="$1" __update_gallery_html : ${1--1} update_server : -skip ${1=$_version},${2=1} -v - -_update_server_move[] "/Arrays~&~tiles/Hearts","/Testing/Samj/Arrays~&~tiles" -_update_server_move[] "/Artistic/Pastell~art","/Testing/Naggobot" -_update_server_move[] "/Artistic/Simple~noise~canvas","/Patterns" -_update_server_move[] "/Artistic/Granular~texture","/Testing/Samj/Artistic" -_update_server_move[] "/Artistic/Colored~engraving","/Testing/Samj/Artistic" -_update_server_move[] "/Artistic/Variations~on~a~single~color","/Testing/Samj/Artistic" -_update_server_move[] "/Black~&~white/Hard~sketch~xy","/Testing/Samj/Black~&~white" -_update_server_move[] "/Colors/Couleurs~metalliques","/Testing/Samj/Colors" -_update_server_move[] "/Degradations/Tilt~shift","/Testing/JéJé" -_update_server_move[] "/Degradations/Deteriorated~areas","/Testing/Samj/Degradations" -_update_server_move[] "/Layers/Fast~median~stack","/Testing/Iain~fergusson" -_update_server_move[] "/Patterns/Random~pattern~courtepointe","/Testing/Samj/Patterns" -_update_server_move[] "/Rendering/Adjacent~rectangles","/Testing/Samj/Rendering" -_update_server_move[] "/Rendering/Chryzodes","/Testing/Samj/Rendering" -_update_server_move[] "/Rendering/Lines~of~varying~thickness","/Testing/Samj/Rendering" -_update_server_move[] "/Rendering/Pintograph","/Testing/Samj/Rendering" -_update_server_move[] "/Rendering/Hawaiian~earring","/Testing/Samj/Rendering" -_update_server_move[] "/Rendering/Lines~around~a~point","/Testing/Samj/Rendering" -_update_server_move[] "/Rendering/Pappus~chain","/Testing/Samj/Rendering" -_update_server_move[] "/Rendering/Straight~lines","/Testing/Samj/Rendering" -_update_server_move[] "/Testing/JéJé/Rays","/Patterns" -_update_server_move[] "/Testing/Iain~fergusson/Halftone~shapes","/Patterns" -_update_server_move[] "/Testing/Iain~fergusson/Simple~local~contrast","/Details" -_update_server_move[] "/Testing/Garagecoder/Aurora","/Artistic" -_update_server_move[] "/Testing/Garagecoder/Despeckle","/Repair" -_update_server_move[] "/Testing/Garagecoder/HSL~adjustment","/Colors" -_update_server_move[] "/Testing/Garagecoder/HSV~select","/Colors" -_update_server_move[] "/Testing/Garagecoder/Stereo~image","/Stereoscopic~3d" -_update_server_move[] "/Testing/Garagecoder/Undo~anaglyph","/Stereoscopic~3d" -_update_server_move[] "/Testing/Naggobot/Blockism","/Artistic" -_update_server_move[] "/Testing/Samj/Chalk~it~up","/Artistic" -_update_server_move[] "/Testing/Samj/Denim~texture","/Patterns" -_update_server_move[] "/Testing/Zonderr/Spiral","/Rendering" -_update_server_move[] "/Finger~paint","/Artistic" -m "parent : -l[] ({'$""1'}) -s -,{'/'} -if $! -rm. -endif -i[0--1] (47) -a y -u {0,t} -rm -endl" -m "_max : ({'\"$""1\"'}) ({'\"$""2\"'}) -f[-2,-1] 'if(i>=97&&i<=122,i-32,i)' -r[-2,-1] {max(w,{-2,w})},1,1,1,0 --[-2,-1] -autocrop. 0 "\ "-u {i>0} -rm." -m "load_gmic : "\ "_nb_sources+=1 filename=${\"-basename $""1\"} "\ "-v + -e[] \" \"$_nb_sources\". \"$filename\" \" -v - "\ "-l[] "\ " -i raw:$""1,char -nm {0,b} -v + -e[] \" [retrieved from source '$""1']\" -v - "\ " -l "\ " -o raw:/tmp/$filename,char "\ " -_update_server_upload /tmp/$filename,include/$filename "\ " -v + -e[] \" [archived]\n\" -v - "\ " -onfail -v + -e[] \" [could not be archived!]\n\" -v - -endl "\ "-onfail -l[] "\ " source=http://gmic.eu/include/$filename "\ " -i raw:$source,char -v + -e[] \" [retrieved from archive '\"$source\"']\n\" -v - "\ " -onfail -v + -e[] \" [error, not reachable!]\n\" -v -"\ " -endl -endl" -m "calibrate_name : "\ "-autocrop 32 "\ "-f 'if(i>=65&&i<=90,i+32,i)' "\ "-replace {'_'},32 -autocrop 32 "\ "-replace_str Fft,FFT "\ "-replace_str rgb,RGB "\ "-replace_str lab,Lab "\ "-replace_str hsv,HSV "\ "-replace_str hsl,HSL "\ "-replace_str ycbcr,YCbCr "\ "-replace_str cmyk,CMYK "\ "-replace_str b&w,B&W "\ "-replace_str gimp,GIMP "\ "-replace_str roddy,Roddy "\ "-replace_str crt,CRT "\ "-replace_str g\47mic,G\47MIC "\ "-f 'if(y==0&&i>=97&&i<=122,i-32,i)' " -if {$1==$_version} -v + -e[] "> Upload latest version ("${-strver}") of commands on G'MIC server.\n" -v - -_update_server_upload $HOME/work/src/gmic/src/gmic_stdlib.gmic,gmic_stdlib.$1 -_update_server_upload $HOME/work/src/gmic/src/gmic_stdlib.gmic -endif -v + -e[] "> Load and archive .gmic source files.\n" -v - _nb_sources=0 -load_gmic http://gmic.eu/gmic_stdlib.$1 -if {$1!=$_version} -l -load_gmic http://gmic.eu/backports$1.gmic -onfail -endl -endif -x "cd $HOME/work/src/gmic-community && git pull 2>&1 >/dev/null" -load_gmic ${HOME}/work/src/gmic-community/compatibility.gmic -load_gmic ${HOME}/work/src/gmic-community/garagecoder.gmic -load_gmic ${HOME}/work/src/gmic-community/garryosgood.gmic -load_gmic ${HOME}/work/src/gmic-community/gentlemanbeggar.gmic -load_gmic ${HOME}/work/src/gmic-community/iainfergusson.gmic -load_gmic ${HOME}/work/src/gmic-community/jayprich.gmic -load_gmic ${HOME}/work/src/gmic-community/jboulanger.gmic -load_gmic ${HOME}/work/src/gmic-community/karos.gmic -load_gmic ${HOME}/work/src/gmic-community/naggobot.gmic -load_gmic ${HOME}/work/src/gmic-community/photocomix.gmic -load_gmic ${HOME}/work/src/gmic-community/ronounours.gmic -load_gmic ${HOME}/work/src/gmic-community/tomkeil.gmic -load_gmic ${HOME}/work/src/gmic-community/translation_ja.gmic -load_gmic ${HOME}/work/src/gmic-community/samj.gmic -load_gmic ${HOME}/work/src/gmic-community/zonder.gmic -i[0] (10) -i[2--1] ({"'\n#@gimp ________________\n'"}) -y -a y -discard 13 -replace 9,32 -s +,{'"#@gimp"'} -repeat {int(($!-1)/2)} -a[{$>+1},{$>+2}] y -done -nm[0] !header -v + -e[] "> Start filter parsing.\n" -v - progress_factor={100/($!-1)} merge_request=0 merge_start=0 nb_filters=0 offset=0 path=/ -repeat $! ind={$>-$offset} -if {{{$ind-1},[-1]}==10" && "{${-head[$ind]\ 6}'=='{'#@gimp'}}" && "({$ind,[6]}==32" || "{$ind,[6]}=={'_'})} -l[$ind] is_folder=0 -s +,10 -if {{0,[6]}=={'_'}} --rows[0] 9,100% -rows[0] 0,8 -else --rows[0] 6,100% -rows[0] 0,5 -endif -autocrop. 32 -mv. 1 -if {{1,[0]}!={':'}} -l[1] -s +,{':'} -replace_str[0] "" -replace_str[0] "" -replace_str[0] "" -replace_str[0] "" -replace[0] {'/'},{'-'} -replace[0] {','},{';'} -autocrop[0] 32 -if {$!>1} -calibrate_name[0] --replace[0] 32,{'~'} name=$path{t} -rm. merge_request=1 nb_filters+=1 -i[0,1] (32) -a y -v + -e[] " "$nb_filters". "$name" ("{round($>*$progress_factor)}"%)." -v - -else -if {i=={'_'}} -do path=${"-parent[] "$path} -shift 0,-1,0,0 -while {i=={'_'}} -autocrop 0 -autocrop 32 -if {w} -calibrate_name -replace 32,{'~'} path=$path{0,t}/ -endif -else -autocrop 32 -calibrate_name -replace 32,{'~'} path=$path{0,t}/ -endif is_folder=1 -endif -endl -if $is_folder -rm[0,1] -i[0] (10) -else -nm[0] $name -endif -else -if {$!>=3} -l[1] -s +,{'='} -if {$!>=3} -if {{1,[0]}=={'='}} -rows[0] 1,100% -calibrate_name[0] -i[0] ({':'};32) -i[2] (32) -endif -endif -endl -endif -i[1] (32) -endif -a y -endl -endif -if {$merge_request" && "$ind>0} -a[$merge_start-{$ind-1}] y offset+={$ind-$merge_start-1} merge_start+=1 merge_request=0 -endif -done -a[$merge_start--1] y -v + -e[] "\n> Force filters to move, if necessary." -v - -repeat $! ind=$> -repeat $_nbm -if {{$ind,n}'=='${_to_move$>}} -v + -e[] " "$ind". Move '"{$ind,n}"' to '"${_move_to$>}"'." -v - -nm[$ind] ${_move_to$>}/{$ind,b} -endif -done -done -v + -e[] "\n> Sort filters by lexicographic order." -v - -_update_server_sort 0,{$!-1} -v + -e[] "\n> Rebuild folder structure." -v - -m "nb_levels : -l[] ({'$""1'}) -s -,{'/'} -u $! -rm -endl" path=/ -repeat $! -l[$>] npath=${"-parent "{0,n}} -if {$path'!='$npath} nc=${"-nb_levels[] "$path} nn=${"-nb_levels[] "$npath} nb_up=0 nb_down=0 basis=$path nbasis=$npath -do nc=${"-nb_levels[] "$basis} nn=${"-nb_levels[] "$nbasis} -if {$nc>$nn} basis=${"-parent[] "$basis} nb_up+=1 -elif {$nn>$nc} nbasis=${"-parent[] "$nbasis} nb_down+=1 -elif {$nbasis'!='$basis} basis=${"-parent[] "$basis} nb_up+=1 nbasis=${"-parent[] "$nbasis} nb_down+=1 -endif -while {$nbasis'!='$basis} command= -if $nb_up 1,$nb_up,1,1,{'_'} command="#@gimp "{t}"\n" -rm. -endif -if $nb_down -l[] ({'$npath'}) -s -,{'/'} -k[-$nb_down--1] -replace {'~'},32 level={${"-nb_levels "$path}-$nb_up} balise=${"-if "{$level<=0" && "{$npath'!='/About/}}" -u b -else -u i -endif"} -repeat $! command=$command"#@gimp <"$balise">"{$>,t}"\n" balise="i" -done -rm -endl -endif -if {narg($command)} nm={0,n} -i[0] ({'$command'}) -y[0] -a y -nm $nm -endif path=$npath -endif -endl -done -v + -e[] "> Search and replace strings." -v - -replace_str "#@gmic\n","" -replace_str "Author: Samj.","Author: Samj." -replace_str " Latest update: 20"," Latest update: 20" -repeat $! -l[$>] -s -,10 -repeat $! -l[$<] -if {i[0]=={'#'}" && "i[1]!={'"@"'}} -rm -endif -endl -done -i[^0] ({'\n'}) -a y -endl -done -repeat $! --l[$>] command_name$>="" --rows 0,6 head={t} -rm. -if {$head'=='"#@gimp "} -s -,{':'} -if {$!>=1} -l[1] -s -,{','} -if $! -autocrop[0] 32 command_name$>={0,t} -endif -endl -endif -endif -rm -endl -done -if {$nb_filters>400} -v + -e[] "> Compress and save output .gmic files." -v - --a y -l. -v + --compress_gmic[0] --compress_gmic_gimp[0] -v - -i[0,1,2] ({'"#@gmic"\n\ "#"\n\ "# File : update"$_version".gmic"\n\ "# ( G\47MIC command file )"\n\ "#"\n\ "# Description : Update file for G\47MIC commands and filters (for version "${-strver}")."\n\ "# ( http://gmic.eu )"\n\ "#"\n\ "# License : CeCILL v2.0"\n\ "# ( http://www.cecill.info/licences/Licence_CeCILL_V2-en.html )"\n\ "#"\n\n'}) -i[2,4,6] ({'"\n\n# Local Variables:"\n\ "# mode: sh"\n\ "# End:"\n\ "#"\n\ "# (End of G\47MIC update file)"'}) -y -a[6-8] y -a[3-5] y -a[0-2] y -o[1] raw:${-path_rc}/cli_update$1.gmic,uchar -o[2] raw:${-path_rc}/gimp_update$1.gmic,uchar -o[0] raw:/tmp/update$1.gmic,uchar -o[1] cimgz:/tmp/cli_update$1.gmic,uchar -o[2] cimgz:/tmp/gimp_update$1.gmic,uchar -_update_server_upload[] /tmp/update$1.gmic -_update_server_upload[] /tmp/cli_update$1.gmic -_update_server_upload[] /tmp/gimp_update$1.gmic -_update_server_upload[] /tmp/update$1.gmic,update.gmic -if {$1==1652} (1650,1651) -elif {$1==168} (167) -else 0 -endif -repeat {w} -_update_server_upload[] /tmp/gimp_update$1.gmic,cli_update{i[$>]}.gmic -_update_server_upload[] /tmp/gimp_update$1.gmic,gimp_update{i[$>]}.gmic -done -rm. -rm -endl -endif -if {$2" && "$1==$_version} -v + -e[] "> Output list of filters in stdout.\n" -v - -x "date +%Y,%m,%d,%H >"${-path_tmp}date.dlm ${-path_tmp}date.dlm -echo_stdout "*** List of filters in the G\47MIC plug-in for GIMP ("$nb_filters" filters, on "{i}/{i(1)}/{i(2)}" "{i[3]}:00") ***\n" -rm. -echo_stdout "* List of filters, sorted by path:\n" -repeat $! -l[$>] ({'{0,n}'}) -if {i!={'!'}} -r. {w-1},1,1,1,0,0,1 -replace_str. "&","&" -replace_str. "é","e" -replace_str. "/","~/~" -replace. {'~'},32 -if {narg(${command_name$>})} -echo_stdout[] " "{t}" (command '-"${command_name$>}"')" -else -echo_stdout[] " "{t} -endif -endif -rm. -endl -done -echo_stdout "\n* List of filters, sorted alphabetically:\n" -repeat $! name={$>,b} path={$>,f} -nm[$>] $name"~(in~'"$path"')" -done -_update_server_sort 0,{$!-1} -repeat $! -l[$>] ({'{0,n}'}) -if {i!={'!'}} -replace_str. "&","&" -replace_str. "é","e" -replace. {'~'},32 -echo_stdout[] " "{t} -endif -rm. -endl -done -echo_stdout "\n*** End of list ***\n" -endif -rm -v + -e[] "> All done !\n" _update_server_sort : mid={int(($1+$2)/2)} -if ${"-_max[] "{$1,n},{$mid,n}} -rv[$1,$mid] -endif -if ${"-_max[] "{$mid,n},{$2,n}} -rv[$2,$mid] -endif -if ${"-_max[] "{$1,n},{$mid,n}} -rv[$1,$mid] -endif -if {$2-$1>=3} pivot={$mid,n} i=$1 j=$2 -do -if ${"-_max[] "$pivot,{$i,n}} -do i+=1 -while ${"-_max[] "$pivot,{$i,n}} -endif -if ${"-_max[] "{$j,n},$pivot} -do j-=1 -while ${"-_max[] "{$j,n},$pivot} -endif -if {$i<=$j} -rv[$i,$j] i+=1 j-=1 -endif -while {$i<=$j} -if {$1<$j} -_update_server_sort $1,$j -endif -if {$i<$2} -_update_server_sort $i,$2 -endif -endif _update_server_move : -if {!narg($_nbm)} _nbm=0 -endif _to_move${_nbm}="$1" _move_to${_nbm}="$2" _nbm+=1 _update_server_upload : -skip "${2=""}" -if {narg("$2")} out="$2" -else -basename "$1" out=${} -endif -l[] GMIC_LOGIN=${-gmic_ftp\ 0} -onfail GMIC_LOGIN="" -endl -l[] GMIC_PASSWD=${-gmic_ftp\ 1} -onfail GMIC_PASSWD="" -endl -if {narg($GMIC_LOGIN)} -x "lftp ftp://"$GMIC_LOGIN":"$GMIC_PASSWD"@ftp.gmic.eu -e \"put -O /www/gmic/ \\\"$1\\\" -o \\\""$out"\\\"; quit\" >/dev/null" -endif _update_server_binaries : -e[^-1] "Upload released binaries ($1) on the G'MIC web server." -v - is_pre=${"-strcontains $1,_pre"} file0=gmic_$1_debian_jessie_amd64.deb file1=gmic_$1_debian_jessie_i386.deb file2=gmic_$1_debian_wheezy_amd64.deb file3=gmic_$1_debian_wheezy_i386.deb file4=gmic_$1_ubuntu_trusty_amd64.deb file5=gmic_$1_ubuntu_trusty_i386.deb file6=gmic_$1_ubuntu_vivid_amd64.deb file7=gmic_$1_win32.zip file8=gmic_$1_win64.zip file9=gmic_gimp_$1_linux32.zip file10=gmic_gimp_$1_linux64.zip file11=gmic_gimp_$1_win32.exe file12=gmic_gimp_$1_win32.zip file13=gmic_gimp_$1_win64.exe file14=gmic_gimp_$1_win64.zip file15=gmic_static_$1_linux32.zip file16=gmic_static_$1_linux64.zip N=17 t0=$| -v + -e[] "- Waiting for binary files to be build." -v - -do -repeat 17 file=${file$>} -if $file -if $is_pre -strreplace $file,_$1_,_ -else -strreplace $file,_$1_,_ -endif file_latest=${} -v + -e[] "- Upload file '"$file"' to 'http://gmic.eu/files/latest/"$file_latest -v - -_update_server_upload $file,"files/latest/"$file_latest -if {!$is_pre} is_win=${-strcontains[]" "$file,win} -if $is_win folder="windows" -else folder="linux" -endif -v + -e[] "- Upload file '"$file"' to 'http://gmic.eu/files/"$folder/$file -v - -_update_server_upload $file,"files/"$folder/$file -endif file$>= N-=1 -endif -done -if $N -wait 5000 -endif -while {$N" && "$|<$t0+60*120} -v + -if $N -e[] "- Partial uploads done (timeout reached)." -else -e[] "- All uploads done !" -endif update_tutorial_html : -e[^-1] "Convert G\47MIC tutorial from Garry Osgood\47s blog (http://www.particularart.com), for the G\47MIC web page." -v - -rm -m "add_page : -__update_tutorial_html $""*" -use_vt100 -add_page /,1700,index,__index -add_page basics,4000 -add_page beginners-cookbook,1000 -add_page beginners-cookbook/cauldron,3500 -add_page beginners-cookbook/dyidiffusion,1000 -add_page beginners-cookbook/dyidiffusion/graduated-blurs,3800 -add_page beginners-cookbook/dyidiffusion/variations-on-a-theme,3800 -add_page beginners-cookbook/dyidiffusion/eigenvalues-and-eigenvectors,2300 -add_page beginners-cookbook/dyidiffusion/directional-blurring,3500 -add_page beginners-cookbook/dyidiffusion/tensors-for-the-tonsorially-challenged,8500 -add_page beginners-cookbook/dyidiffusion/eigen-thingys,4800 -add_page beginners-cookbook/dyidiffusion/fake-depth-of-field,7600 -add_page beginners-cookbook/fingerpainting,12000 -add_page beginners-cookbook/ramps,1200 -add_page beginners-cookbook/ramps/applying-a-curve,600 -add_page beginners-cookbook/ramps/blurring,600 -add_page beginners-cookbook/ramps/general-ramps,2500 -add_page beginners-cookbook/ramps/input-and-fill,1200 -add_page beginners-cookbook/ramps/one-dimensional-functions,800 -add_page beginners-cookbook/ramps/remapping-space,2200 -add_page beginners-cookbook/ramps/resizing,600 -add_page beginners-cookbook/ramps/warp,800 -add_page beginners-cookbook/road-systems,2500 -add_page beginners-cookbook/stained-glass,4000 -add_page beginners-cookbook/spectral-art,1500 -add_page beginners-cookbook/spectral-art/the-spatial-and-the-spectral,2000 -add_page beginners-cookbook/spectral-art/the-spectral-course,2000 -add_page beginners-cookbook/spectral-art/the-spectral-domain,2000 -add_page beginners-cookbook/spectral-art/the-complex-number-field,3300 -add_page beginners-cookbook/spectral-art/painting-with-waves-part-one,2200 -add_page beginners-cookbook/spectral-art/painting-with-waves-part-two,2200 -add_page beginners-cookbook/spectral-art/a-revised-map,1500 -add_page beginners-cookbook/spectral-art/intermezzo-spectral-editing,1500 -add_page beginners-cookbook/spectral-art/a-wave-painting-workflow,2000 -add_page beginners-cookbook/spectral-art/tiletex,5000 -add_page beginners-cookbook/spectral-art/coefficient-values,3000 -add_page beginners-cookbook/spectral-art/coefficient-values-part-two,4500 -add_page beginners-cookbook/spectral-art/coefficient-values-part-three,2500 -add_page beginners-cookbook/spectral-art/cheat-sheet,9000 -add_page beginners-cookbook/spectral-art/appendix,2500 -add_page command-decorations,3500 -add_page images,2000 -add_page images/conjuring-images,1000 -add_page images/images-as-datasets,3500 -add_page images/images-have-edges,1200 -add_page command-guide,5500 -add_page command-guide/color-manipulation/-autoindex,1000,,,commands-colors-manipulation -add_page command-guide/color-manipulation/-compose_channels,1000,,,commands-colors-manipulation -add_page command-guide/color-manipulation/-colormap,1000,,,commands-colors-manipulation -add_page command-guide/color-manipulation/-direction2rgb,1000,,,commands-colors-manipulation -add_page command-guide/color-manipulation/-gradient2rgb,1000,,,commands-colors-manipulation -add_page command-guide/color-manipulation/-mix_rgb,4000,,,commands-colors-manipulation -add_page command-guide/color-manipulation/-select_color,3000,,,commands-colors-manipulation -add_page command-guide/feature-extraction/-distance,9500,,,commands-features-extraction -add_page command-guide/feature-extraction/-area,2000,,,commands-features-extraction -add_page command-guide/feature-extraction/-label,1300,,,commands-features-extraction -add_page command-guide/filtering/-bandpass,5000,,,commands-filtering -add_page command-guide/filtering/-blur,2000,,,commands-filtering -add_page command-guide/filtering/-blur_angular,700,,,commands-filtering -add_page command-guide/filtering/-blur_linear,700,,,commands-filtering -add_page command-guide/filtering/-blur_radial,700,,,commands-filtering -add_page command-guide/filtering/-blur_selective,3500,,,commands-filtering -add_page command-guide/filtering/-blur_x,700,,,commands-filtering -add_page command-guide/filtering/-blur_xy,700,,,commands-filtering -add_page command-guide/filtering/-blur_xyz,700,,,commands-filtering -add_page command-guide/filtering/-blur_y,700,,,commands-filtering -add_page command-guide/filtering/-blur_z,2500,,,commands-filtering -add_page command-guide/filtering/-convolve,3500,,,commands-filtering -add_page command-guide/filtering/-dct-and-idct,1500,,,commands-filtering -add_page command-guide/filtering/-deriche,1500,,,commands-filtering -add_page command-guide/filtering/-diffusiontensors,7200,,,commands-filtering -add_page command-guide/filtering/-fft,6300,,,commands-filtering -add_page command-guide/filtering/-gradient,3000,,,commands-filtering -add_page command-guide/filtering/-gradient_norm,1300,,,commands-filtering -add_page command-guide/filtering/-gradient_orientation,3300,,,commands-filtering -add_page command-guide/filtering/-haar,2000,,,commands-filtering -add_page command-guide/filtering/-smooth,4300,,,commands-filtering -add_page command-guide/filtering/-structuretensors,3300,,,commands-filtering -add_page command-guide/geometry-manipulation/-warp,5000,,,commands-geometry-manipulation -add_page command-guide/image-drawing/-gaussian,2000,,,commands-image-drawing -add_page command-guide/image-drawing/-plasma,4500,,,commands-image-drawing -add_page command-guide/image-drawing/-turbulence,5500,,,commands-image-drawing -add_page command-guide/inputs-outputs/-display,2000,,,commands-inputs-outputs -add_page command-guide/inputs-outputs/-display_tensors,1500,,,commands-inputs-outputs -add_page command-guide/inputs-outputs/-input,7500,,,commands-inputs-outputs -add_page command-guide/inputs-outputs/-shared,2000,,,commands-inputs-outputs -add_page command-guide/matrix-computation/-eigen,2000,,,commands-matrix-computation -add_page command-guide/program-control/-local,3500,,,commands-program-control -add_page command-guide/program-control/-do,6500,,,commands-program-control -add_page command-guide/program-control/-if,3500,,,commands-program-control -add_page command-guide/program-control/-repeat,2000,,,commands-program-control -add_page command-guide/values-manipulation/-eigen2tensor,5500,,,commands-values-manipulation -add_page command-guide/values-manipulation/-index,3500,,,commands-values-manipulation -add_page command-guide/values-manipulation/-map,3500,,,commands-values-manipulation -add_page command-guide/values-manipulation/-norm,700,,,commands-values-manipulation -add_page command-guide/values-manipulation/-normalize,1700,,,commands-values-manipulation -add_page command-guide/values-manipulation/-orientation,5000,,,commands-values-manipulation -add_page command-guide/values-manipulation/-threshold,1500,,,commands-values-manipulation -add_page technical-notes/trigometric-and-inverse-trigometric-commands,2500 -add_page technical-notes/wavelet-analysis-and-synthesis-in-gmic,5000 -add_page technical-notes/gmic-color-mapping,1000 -add_page technical-notes/gmic-color-mapping/median-cut-algorithm,5500 -add_page technical-notes/gmic-color-mapping/k-means-algorithm,10000 -add_page gimp-filters,1500 -add_page gimp-filters/blur-by-color-filter,23500 -add_page gimp-filters/hedcut-filter,2000 -add_page gimp-filters/the-fingerpainting-filter,2200 -add_page gimp-filters/the-hairlock-filter,8500 -v + -e[] "\n * Prepare folder structure." -v - -x "ln -fs ../tutorial.css ." -x "ln -fs ../copyright.html ." -x "ln -fs ../favicon.ico ." -x "ln -fs ../favicon.png ." -x "ln -fs ../footer.html ." -x "ln -fs ../header.html ." -x "ln -fs ../gmicmenu ." -x "ln -fs ../jquery-1.11.0.min.js ." -x "ln -fs ../style.css ." -x "ln -fs ../images ." -x "mkdir -p img" -x "cd img && ln -fs ../../img/logo4.jpg ." -x "cd img && ln -fs ../../img/logos.jpg ." -x "cd img && ln -fs ../../img/rss.png ." -x "cd img && ln -fs ../../convert_raw_img/* ." -x "ln -fs ../convert_raw.html ../convert_raw.shtml ." -x "ln -fs ../tutorial_toc.html ." -x "ln -fs ../highslide ." 11,11,1,3,255 -frame 1,1,0 -line 3,50%,{w-4},50%,1,0 --line 50%,3,50%,{h-4},1,0 -a x -o img/toc_buttons.png 100%,100%,1,4 -fc. 245,245,245,0 -o. img/toc_void.png -rm -if {!narg($_N)} _N=0 -endif 0 -repeat $_N -o. ${_output_html$>} -o. ${_output_shtml$>} -done -rm. -repeat $_N -v + -_update_tutorial_html[] ${_input$>},${_height$>},${_output_shtml$>},${_output_html$>},${_img_prefix$>},${_tocid$>} -v - -done -x "rm -f __tmp.html" -v + -e[] "\n * All done !.\n\n" __update_tutorial_html : -skip ${3=""},${4=""},${5=""} -if {!narg($_N)} _N=0 -endif _input$_N=$1 _height$_N=$2 -if {narg("$5")} _tocid$_N="$5" -else ({'"$1"'}) -s -,{'/'} -if $! _tocid$_N={0,t} -rm -else _tocid$_N=index -endif -endif ({'"$1"'}) -s -,{'/'} output_base="" -if $! output_base={t} -endif -if {$!>2" && "i[0]!={'-'}} output_base={-2,t}_{t} -endif -rm -if {narg($output_base)} ({'$output_base'}) -if {i=={'-'}} -=. {'_'} output_base={t} -endif -rm. -endif -if {narg("$3")} _output_shtml$_N="$3".shtml _output_html$_N="$3".html _img_prefix$_N="$3" -else _output_shtml$_N=$output_base.shtml _output_html$_N=$output_base.html _img_prefix$_N=$output_base -endif -if {narg("$4")} _output_html$_N="$4".html -endif _N+=1 _update_tutorial_html : -v - url="http://particularart.com/tools-and-toys/gmic/$1" -v + -e[] "\n * Convert tutorial page '"$url"'." -v - -v + -e[] " > Retrieve page '"$url"'." -v - -x "wget -q "$url" -O __tmp.html" -i raw:__tmp.html,char -discard 13 -replace_str "class=\"internal\" " -replace_str "class=\"external\" " -replace_str "dir=\"ltr\" " -replace_str "border: 1px","border: 0px" -replace_str "G\140MIC","G\47MIC" -replace_str "CNTL","CTRL" -replace_str "Rashid","Rachid" -replace_str "gmic.sourceforge.net","gmic.eu" -replace_str "gmic_def","gmic_stdlib" -replace_str "@#","$!" -replace_str "@{-1,","{" -replace_str "@{","{" -s -,{'""'} -k[1] -s -,{'""'} -k[0] -s +,{'" \n\n