php-imlib-0.7/0000755000175000017500000000000010643376337012675 5ustar vorlonvorlonphp-imlib-0.7/docs/0000755000175000017500000000000010643376335013623 5ustar vorlonvorlonphp-imlib-0.7/docs/default.png0000644000175000017500000036265507161525711015771 0ustar vorlonvorlonPNG  IHDR?1gAMA a IDATx˒[$jf= \VztS" ?2Y5CLwuDf9fʼnDݞni  @ Z:a !1%xu)8j$0=9FkV4ÖpSDY0TzCTiY%(d 3GOlW1qYg Z <]*e{ֶ벍y4, H34p;>G5[W!V@ki}TO|zz6wfz~v8lZ GJR3FRĖy:`͜PBfXWd*l=X{L_$d gZ a$p ,#q/q/8|`=klZpY*1(w,p^ a?GfP@BE#`f$QbH M0Qe 5H섹 0iq0kS0W_M a畋9 ŝp\qpalи8 P3!06w7Aԡl $ 9H2nf f2~v#5Fp B UUUn-TpC JF)$%VUtwV"#͝HMlQRUqu %@ RPA @JKЍf*7[Q%"-}rU8̌` " P(3?;>2G{_p(ARF/0O@H g{1v7w7*1dP{J~0ae" PV/z& qa1LJ, 9d2=H{W1@""UFU`̪0CDcaU1L,fXUw!)UA{G4KkB/2!"F2Um&,Sp> O  f0Uq33̰df{{Z徏 2Uc{GJI[eWY "30G `nlZ[V?8Αhnj!#un W[9TX AgOyN#FiO,pPE' ÍY$*¥k!-P] ZKGZi]D-kK\dsNkiqau˨F_:fA5r^YÒClaLhc%"fHU,]ဵuć%T#a͑)Qpĸݭk ̴P{OKI#K!l>% RD `a#z)g@V;.c(|STe$R0`΂%(0ek2c1y\,"_N)'ZpdbHa5=@$|@ܞV055$=,  (lN:0$0M " Gjq11zS(#*.nK_DW#qZ8L)i;[Cǐ96Qw<];z#1#6ŗJ7{_$*f΄ c @%$ =wٷZb0Hۯr[5ܙYZCYUQt)Us2(D,I 9Dj֜jnJv %mߏH&MЈ,ñm;?=ocʾWlK}Hwd7~Zp#PB We?،F cXxu!(`Oh623M8q (!e`6"H c $2ʄ AYvSdth_xۧtg1sLj%x,FhbhCGFIfuǧk@=^kA(-5k*<ӝ&2IO3}NrLT <ĶmP޻ `ќY-0MJpcHJ"@G4˴uy>+FZYȴm^BsY0c4P:@pK3]0SܝP36&( Xchieat$-]y\@" Nm 30 $8}+Fph',4H5$v+k&H(0K P'@Dq DXh 9V/ !$=BR \~ŸSÞQC¹DLOs5+zceE 4| (&/dfpg̚ц6$MLl m6,JB&af B/LfU**1ܽCb% I)-L(Uefh9hG&BEa0Zha䶀ŬA\- 4~es aax{]\Ž t"Q1s?n_<&#\1K6AYa 1)͞7n3y}0 ΦˍFX@\0T6G3,CP>PnJ\FXJ8oQnZÈQ}d*dJ5MKR$$wsp8J ¨4@j*2_rFjS2[X9s_2 M<@:60{ 76ncG`*UeyKF ^c#CؾvX):g7BBGR6*f!raRbf{m@H  5ynrƄo8030Jp/oQ0XT B9az5p 4#6J&i(E1ftT/*w~yר\T#/סBjniPT}R3L%.H3cTI8FV`IpN%z]w# g T>r"Z % CMU0GL}jS}~nwᰝh.Ni Dx[á{m1cY1ƾ1FeIFS@'`|\JsVɑK8:0`-E' bXV^ P*E3͞%)ᖍ (gFۮA*9PC%h!L!Jw'9i Y!xI7苤J%4FI^ Jg1Vddg؍S40V⾄j3n,a&dhKU06?, U3PkVٽTTMu]Le̪L +ں5GY~,UJ q{e(c*&።ݺTfH QQU-^p84G"Ѱy,%fUA01#QP̂&ͭ7U&U%"p5\rhi= ,"qaV,)3sS*4K(Y-H}NYFR*ET52{1R[;a=ev,x <́4gcdI7J^W!GY% x 0jqoփ,fNfY hL,q-m 4w^1aLQ/^1/w|Q5@z:,vXHh$Hf-s!T/KdV&F{^pgP)L ͛)0KUc|x)qvwWnaNX%G>ovYKcDZZun <{ac`!n !#8h akغDu>\  F(͹^4[9)QSE@Ӷ4ж]p:ٙB4^ {!uQnHjj[Hqi7?"vá,,&2w;V[1yDeɞr(4!QAxcYI[wEI}VX`]|f|?׏qߞ(Ic[UfeeV:p4;٬Oφ}pjJ'sanJ.eUm{Noxs Y$r5_.ryz>]i.Oct@[7um=m{kA)Yr#bYVa:¹ԐE=y097Dҗ>:xl&ڗp  U^\GDGo왋@G̨@YOUG,8G9Ů#?~*QbN|iަw%1d8\D%ejE7}V IPzV{|~zIWzt͛$ 1zH6*\j. :^-s\=h"`v-#l{J8pg&*R@OgN~~~OO>?f< p>=}޷X򜚝L1F,`n=aTۆCC8S@49kd>~ϟǿ~O??>|d!)/?]ѥ]TeYчw!^U=&E:QZ#ݯ?}ZO|7:ek Ǐ>w>^|>޼=ޝͫoҤMɱF/&MiQ ߸)6eǫM!P"18L"ܘ *4s.)9 .rO.@r(pA5(PȪ6Q^ұ^IF$*Ufa%>_bP7No/­iiMѨ7i9HT>%c۱,0oc˲CkYՒ?qau.K)^}Pϕ6c(ò/Gq~CfFYjfgKA+fO_͛۞6 z*v|O>w˷~~??] ]fI/@}^>?O~ӇOJҶ}r\a=N8X {0_f_\?TB/myB5۱/8\[cl=n6=f,š95QZ4*H5=zu<>݃?C܊㇏~?~?﯏O{zUz7_l*?~w'<&+,E1d*ϻyQ3tX["ʌVMWKCy Fdgs'a4ha۴I[YM$\wR8M0ˈطQDn4FJn][7DҜ,䐲lǶYk8Oc<3x KF/frh.Neڴ/TF4*olU7<;<د}߫2[ľ*exp9-O_}5޾Nā`]?z}$mt+# hC5+gOaM>||gv_~~]׈%Ǹ^?~?}* IDATO>|x_Qg3<㟀U_A~9.,8f0%K[:k?"W>nS.uェ(fk $= R*D;b/`\# $#Wd lF}`x[hc'ͱɜMU<=_pKxq lubPUlncdBX=ܭuYz%MPe>SAs04<8Vnrw7~=}Y]z.,|YJGkV9=cA oڲF#pΧ3eFb1qSX.7ooo~/xl hƷmi=Ow>_s#yv1WOwiiiϿ {1Oԩq$Fp[}//KR&(v8LDlBڶf&$7Cѭc±KUexLf6?{Uź t{TM]U57&1n U e]_ɦ)NsxYςK2YHCNpOOzzq[3!e&;en:%|7mXk͇OOܫfﯞ\wެc]u}zR֫W fuGk`旆l5#jhAugݼ 7)?=ݯ5}kD3,) V0>pXmߪg)pc! *ue^}vx>_gQ{{~/wO޾~uz}|pk7wBۺIZ9=?q}^|՛_~u~xwcm.O>}~?~z#/;o<~5j8-Ӻ,KeY%^=~߾ooÿdYDh.=g(ApȀ-Fk9;V2Gs[m+M1_ញ}@~R~Yp" ̹z&=ٜFUt$614Z֪uۭɑ$;s81,vV\ZЍ܁JSpid!SFYLU >{J;h%{}$Or^~ x 8k9C|xy޷O۾~~˓}߾y_/q|j9:x溹]t=ygz p]Bq]>:9%#l_.ϟi:,x^uu[vXam󛯿>yt:kmƿqe&^},)sɼwd!iQԕ\Q3>g3QDi bR޷}cFͶLJ Wk߳Y;y\}l}q8ľA{ayGHxXQR%1%*GξY靾x˶x:zk4XY)r\އ̰.&>2I# 5Қ yc\hjsHYg<v}5F~t7[~ψ"VWo|C+rȬpx,XUvC5E,u=!){_?}z޽o߿?}z bӫ_׿}oެòuwx: ˙ 4M<3!9z[zc<K,l#ʚ nqZ@|X /7,yj6Ff6WsD@ B{z|lDҬd츧m|DÈIqdf=LrT/}# Be^pQ&M$Icf""i4b0CZ2cTU<2*0m 8jIJ">^Na %CPDgUfI_$I[#\X(u IG"'v#3 0E~Zl(LY,*cBɔDPʴV[_.U}fÜ7y ,ajzs7o c'Hr"bbt"t ARr33s3ob?|痗uݴFBfa7~owww<'I,`JiuiwJ}zOWWX;'MUϗu ?,yy;i`pg m}āQaPr63 ֒$0҅ %T5Ag8B˜^%BpdL|ILS1DIRz!%*ӨUL"̩5k ) j#^eyJ Np%fbֆB䴵!(!Iȃ!)reKDr^ΗRJ7b4Ӝ3D߿=y~ 1 0QR_wUZ5׆kMşǏ/OOϧ˺V3bAq8羚oo8]h]ښ ^RNCbif$0Uwj6Aњ.Mu]Rym[?N?mp|;%47w]BpT UY;j3Ż0HU_R<}$Cf%!LAtX4"th8ErBBR,(IaAWU&]d_"Z[)yʴ,,  pZHAՊւ,[Sswb~2IZj4RJ g509%Q[kCI:Tգd% ­)Ht4Srf%(c*7x,yBLi۱"ڏD~kٶmnڶm\V5'mџ>Ys\r޶1Mv8wjz6)gU=NjuU 4PFbQ`2fTM-*Xӵi9]zZ5>ܳ&c\t;I%Qt4  -ꁜFM aDWyWf~T%l0]myDAp;aȠ 0$2`p"6Èmn r %jHQfH5zHAĺVsmSKAnN]]+0H]cӝ헾y6@^ep@,HFFE~n-3R0rfi3G$1EnSD9K\A7~1k7W͚juY|>.z:m3ZZO%iuD1~~>A/rz|O>~NuY=LXJ.8r>/(|i"nO˲Jd]n9v^Oux:?bvߗ_%LT}7R5vNͫu2rxk2.Ս)6us.L+p <㲘(Y:ޅ $ %ڦAnkԍiM b]z"?:\U\P9g % WwAJ=?zzn6rR6[ \*3" SK Dj7muY鴝q^[m]YDr.IdE1֠t)nH A,|Pqi$%b!`vDF 3KL9eJLWIeFW\D,j8Us@t e3%Z`pY&..RT9^~Hj-D_P~Mjc朹4hahmTE0$&Zs%<;G IR%k\4CP5@F(%~}8MY#ttku#zYSm|\8L[uY>/O˲0TrNxqi9ڞkz K5>8|,$7Jv˲"pjҴmUe]ݼ@5{L" C .LYXr\J׺͘@FS>(j$X8a(oW_}uw?J8 Vh̑L ЉE"=텯=:|-/ם9V e3TeY 1 I  a1 Z-An삸+[]R׌ ޻:$H)pCbRmۚH[G\?@c5ZW&%@?: @PBL@ćwp+'9uDk?5Vպ:4ݪ1BДx\ӧ??ӣاDVWI'1ȷ2;8/wX#c^L3 Gmvv`uI B&32ȼ0]F`ZIiiRd$owOo߽߼ۇ/Cn"j$ 㴑:'Q2Y0H@bA ݲE"A3UT !׺H !!B(C'9q0ᖮUnp  uYVK|\Gߋ"ԣV4!B8T#gJr a .λ$IʦMջoODz5<HI#?c?aLq:֦k&@.;C;_@KRq;tfmXZZϼjY5l9D2K✥0u]t?}=}:LI4^R#z֟1ljo Ӻ9G_ww1q]ԝT2rזO'}8υ$;7.Ow[ilTX%wq'EÅ0 -ep4n>炜8y|÷ͷwa?9 WBjBDKǕɾ(ShiAsF 4 G01v>Зduﱟ:ZSxEi+v:enکXC"pFk#xp$` +1ܴ~-:/u(2gf CZԋ$lhvYRΐyצ, \$f}" 7wۚ8i)1$b|#;mjrEӸ]&2˴/s6.Ssy~S;Cʛc]ϪV Ak},-C  Nv]pi=DtB۶>~n4`Yy%~_-yϗecՇϛQ$"q h |)B@409aQmbniiݿ;:p{?yJ0Ahm”1$$iebQOLsu ]a!ěn۶v0`Zmn0wwb fe~ p*JMg~Uį>ڡp^3~Y:lz _k%ܗA^W}@tNrHG>H9_jUqZyNdQ/ՑoFRyJSטٺզXLaLeBy4䜄Q{'>'l)Ixi0|w㴻?ww3*mwOtIbQǗu~~Oekp/ x{{z||YzwUj Ŵ_.zYk}¹4nw7owwww777< 4ygӸ;nI.$9(%pdjFUm&̫ZFPԣ3B@,67KK*IR޶-s;†p׶ĀY7@SL"e9Nu&4K㇗& f9}wwi7oO/[w#vDvY/OO%'^Nj)Jrov CǛi/HC9ev:J1"/K4fԆjnJ4esA\#T\~ʕKf].%y(z:p~h&:648"*w3 ~/־""FD?jdq}QH # D3^p掉 R,Ij" ڌ \#`J*ݎ8N+;t-?y;!o]i훜5eJDͶZM?'?TYnW%b! a 9f}ÛnLJx\x<&r>֚STOu7ߝܔ޾Lqm]u*"(bdɶm/OOK.zx|w~|w޾erc)C9S΅ )z%UDޜ1 D)s*|5DD0sbesJ( 4mۖdNV1 7$t q#nYAUK"]y¼k: G2 b@+7C r jލF`Ñ\"8!B7[N3 SkFY"fB&3E3o}E&Yzթ9DB,}5"|TSDHi>Uѩ__m;#1y(%hnv4OonۍXiU"lxhmж.'.o~$x[}#ɶiN9_>W]z 4ݻo߾}ݴۥR}Rt&/ԏś+&HDbU#~GXtrh 3E8^$c]fHLSZץqY.ѾdzJyyNeG8SpGD&US$_̮_Tk+Zra 9 KZ[kXr*\ǶJ#8b2jj _ 1 bmLDdA3zP !; CyVm](n]ߪf=JAXxfw(ݬvnwws3v77ww77nw<qL"mA;Di]~Tڟjc1hOnq,S*p8v!眳6uO>^?|˟GB`)9e2݌?yxwww<{kߗ/ 5#q W651yJ%1.Eу.k fˉYjV$H̉;2݌ݮkC̔S0## 3yy@cP n0cNѵSfsBEF j R~Nc0j^dA؅EG 1Dꉻ8.{kI:_]fA%|q 3$yʗj) 0Bbu@Bn@t $TTꐞDfթ+8j4ka!S9,,ѭ&g7uz6'RR$Š-ء,W] gVkJaER8JQ5$<CioUsPYps$6+)E[XGA.ǃX+Y\Eww>||^/|>%) qJKP)2 2a80y)ט_*r)}N_%P6-<>}^9]M \O>}y|z~~^/ujɇ_^;2흽yD`%羿_NCWH8zԤ0,``,LʻcB.dp,OVʿ<5@k9 ڠDbY: )e1B䄔p{cJHh Hux%_p1 ֘KZk);z،}eF)fQVqnc08{ z\ RƥA D/+ORO3jh0r$烈.Չx(yJJ'o/l~2Bz !qEk}*JJ$cq\9Px)IS*#S{7n[kԹG~j=i#2.Q0y9"M?TxE ةvm9C7 aP5s98: ܼ‚80px8iUGeẶ$Œ R;ZQ7͞ ,*XNYppSͥlB",2$db&SshH16NG̻?)z~ux為ʦH&!=p ը,( sݿ|xSpuԦƩa,9眂:D| = @hA>(D#x 9pW0 u/ixyy2n7 &Z6KaAN,̰u|,͈Na!"h? iA>swgTK%]CS?~&qpY@Ւp]nr3%u$frEjJü;6dxˇ42$I9еbDLzv2ycVQdn uRJcN7S>$9//jokЈnᠫ2"ԬԖu۶mݶuYE6/䱤08.%c글@ fonǒ{C b=է_<+J$ZI"psǴ-lCQMrIʃ dUu͌߱"mwEv xw73UBUݬi%Adf\.w-{I=BV)Km*u&kjG "8 ztH3ㄫ+ Yta(4NlqDJ@`7{ K`qb_ QHu:.1šx^;M?0l_e7pJ ̪j'ܫ- QJة":d<捿k{Fc.]-nIt :&c>l&j ko7%.kJkR-hj>%Iy0ӋWT ! yZcAwUV r ?݅@O @3GDp~zDĚ0;{_#K87]yW2tE "߬+uiAx H77ĵ^rQŒ.`̈(-k.\ZCs~¤؏0iM^_N]g__yv#). /i޸Ԅ,L/RPw,<̪{9ޚˋ Z_? "u9WkYr&"Z" r  !hˋ&>T~o".j%C @ S.k =Al;,dy^k6w׷wo^mWi'd㞕rY[܏S9qv0^_ e5uUAGޟZfxW?O hIRKaYIܼ>CFDxVxUD"O^KHe,NEvt1ࠗ!$Yd"KPmV*!B"]\= QY|dAN`h2Rp3jAJPQb yXOsJuvL:N3TN^f f_lfhQam̤Y&O|D2 fg^"iY"bmBd*tqI{'r% +!Ȃp fFV*,I7kqJ{^f1]J~wt][̜R2K/0^25 H3k-T1 <=2@?R !Х" Z45ZIqI0CkhMZslv7F )唺r>>|||||8CҡMȢN ?htRfׯxz֎&/~F^w_nnal.tʿ \A^u vNIgc! P {[Ո2I3(Q^t1UdXA7 7yJ[8FʠUo"D7wV*Vc]+sRv~wVQ%wDY"_MEU=<8͠ !9‹v\}"4LӀ1QRr&CίNژҞ-qj&rz Lq߆t*(q~T~:u]nj??}۷|P$I|{"W4z.8WW_*|e?nkw􋫟l<U?ߛ ЭH8.n ձTZgH"Qqu4QreiC ?p}遀̸1{[qB@Fļt8e"kn*tIvwke= Zʒ6[$F=&"Ր@J?0hb"|ͽ|֔๕ZK*4GK*L!DsEKˆHzڼ9W~8ykLu޿qM9kVys{q^|֬ΏǏO?|o~(Nܧ}nAy̼f3bॢڗ%3p%_ڝp(|^ݗ՛7luY~}sgpg YRiy@\XH, 0hXH]jQwjBlhKh1pAK+ f*L*jpYݛE1a;˲5ɚ}>̍J-ΚzxyY VۼCʝ͊s<$*eKm5At[VTavFRs4e\-~,$1ia燹1WitP8'I-e>&Ա5`LY%sZT޿}n>nxu!YWi۫M~D}-g@&ݬhFDIAAAs{?zt|bG4wf42slusiqnuT zPHY4֞B¡ I22Fb#INH,b*6#ekm$BӳQV.vJ Z[pH,\C $<'6E_T9r "&b 'x\;#d;q"xZ)ER4޾єil쮮K4qLp"y#2m·)q:2{Y'gMxuwt!澖z:OO߽/Ӷ [)@8>"i;= =/n7v3cG'@3[s7u3)hBC'sD~0Y6aReUk*pxmFcfRmlca)uy0)Vu;pG$ yuߊCAL=!(ٕj#N U8G#KLJ$$ҝ>+Qn uL4;--ZB"HTXG5 /"vY%MB6_ϥZXqc[Wz||b^Ox^jūW~ͫ׻fT涖|T(/wY!? 0# Zx? X["Bm8:nRs)E-q`Χ}D"҂Vb+hF"""}2EJT2[ @S>RUwఛm 9}Z.SZ㚦Iڬjam OܹVg<~9Kkɇ^xM5C 8!A$VG1N\opZQ*AI1%S& h ]wˆ`YimZRZsi~%MOf)W_w<*뻻}/jwss6||`b-4*Pi$,-W\x؜(^S|4<=>)CTep´p;Z5k)51MX4g^@,% !MiK$" 9zIRˁGbK/~D/<aCx8šiJ# :+KV@ 䟯UDnwgω[)"wkM{:Y-|QKd7 6W8AdWow_\_ﮮq}M)Q[쁹dP4F5lh8-rf)gYCxydZ,B(3?--FVc;IH!b 8 v!8p48.\iA`{Jnfa"r^f٦E!D/8 B+97〜Qs @kC2[Km=6%i7UD K99,rqjn{f;c #_\^^j/J ðZ#BY8SqiHIalRqb0(gTi.*8Ђ31`0HAA|='i$OgZvBr#jK1Β\FVR-8|@~8\>sf8{B3(:V) aY6 OU>zO ѻ̜U֚8PY m)FxWW؏ݯشKG=<к+a$}ttJ))ܭ+]ՔʟmF Uzv5Dۍa~<SJnoSUͫ|>ϻ UxHhȬ/6L*VmN^"̬"e@Pf)VeE u]/Nf{$C ,u֬ ͛&pU"0z&ln? +Gj"q-*LcFD%^ zwʁ1X+ ]sxewK>FR%I5M^}1Mڌ% }ư(`?D. Ew7oDnBq(YZ!{ 6!A/s\)r5 #sw0 ͊fPmF(zoak PK>A/okag'UK;%Ω9]zH ֤."b(0^p*c2b!t300#E B+fUYKx)ءbrF$&ayLBB1p$jL\R=0R'{ {ǭV7fZJ)e^u]bf,*2$ sW(@]*`TZTP*+'.Iq0̵ۿ6':cśW|:ㄼݖi2h]V4M!e<1E'{7^cHzfҠ ͉u[\ZcF ,kE癋n6$&E7 w4T#ƠdkbDl/֚O]+X>nV׵bt:>ϽFzoG{̛!B. Io;Y,0"їNfe<Ot:Z[S櫬_oy}廛tگd F$ Q zkO=bn.Ix>a7#(`Q4nu]n34c60ffLD qX?\fJJ \e^F$;@D]&`$'bI !.&B)kᄃJiڏ\ YbT$iNP!}?$|4|~Rj)~'Rʹє>?Z[)u]XaрJqDZ}vY,Ke߽>|?Oy>g[MaØ⋛_M_~uC#.7(n׻~S i(՘.iYhRIB6vQ& pb`5ijbw Qf^gu2 U %$8q({NI#,(^荂li_)tak9FŻC˧H__ʺ,x>eYׂb"iLq&3K?!|^NxZj4N~χ$U|>:k)|zzw~ݻw>|x~~>ec]\)1#oj?u]ɜ.*^9\(Fq& LÈ)Eڤ'K A@$rk 윚CHDj]LHơV qHHaDY F<`5Rf)@pM"JJ'AZJymfŔ@D/ kvZ=@-q 3@OF9oXO `!%a=cir>槧yYyfmviYkV|ݻ?ف4 7ׯ`8G|>=???<~?ݏ?~t:ZP\SDV" (a5~u8춻qJ@VF+K˔( kf@ @2(|VZZWqrE[sbfvh:$/] a&q(Ԭ ͍T35xpFtoC̋5\bG`Wޫ]>x/&&"7% "e@ C_]tZk뺖Reiz>DT!MΛ۷?>K":RUbY ț|^fŏ_?zui ӧ~.6W*ДQf}[Ĕٛ¦ IDATpKیiNϘ9O;U1CAĉfKDwcT*N."4vkEg %EoRf4o-X51<.0#RZ߳:TpQ0+ޑ`$!!p <@'a[sβ,Z<˲|>VZ {PJS7ywa?lvfMk)x|xo_Wo|b0^\_|s믾;nn8jJ^~won~|O7䫯xKYUeST5ܽ5[t:?>>{oo}|<}|z<[;r"Qj9=ɟNx<4/ZyVo*oin77777a 7k޽o~{~~ں a;ʼlnn08p<Ǐ?{<}7K뗛n?72ϚsDxm|7o_op~~ZO:ff71:%pYtMҲv2ǺDaPB,TZ1n0fLe5!v[Pp-U).%0:" 2 +SBn"̬ t5=Z~Zw_%`*QhJ0/7at@u@TAZE^a4Vj}$A_X .S<&&~Y4|>ϧq=2eZ9m`~Www_~swի{ Mt=o~o>NϿ78|mO~:n><,xzfۺny[l~y|У#@w$Fe$yNSFVm(bHTaB )Z w16)\Y9jnc{!RI]F "3ҵ"RcJBrnk@)ID40 țTeSwhT""I`hWd`ӹ 2 Sn $}"(C¿k_쟟?~t߿5]Wx?럭+oWĤ*9R(ϳ?=Ǐ7ro}t^Xۯ^<~u0XNzt~>2;:-t|||8z,M|<>|o?}eRnSrќ r{8.a,+Jū;ѣ]9VG rND|OWݤ2k0Y@3H%V0a RC5 6JCF̨-P`LN'OC`oO8TTnr]7,IdSշYݘ 1w8$=ɮʌ=|"ƒGVL5/,;D0sӧ**}OAjoM i$v`!##(\3/$PU8eL"/Z6+< /3MS[OOO_~ׯ_x9Ot:]K^傥DmgZ26~] ,D!0889lPrťR鼨!+B7CBfCt7tvkBGBo[B Ѷ9)4ݩ0zk=\t9|# Z͡4daΊA @H@ P%T %Z[7(@$ Q+ƃ/?o5Ϸo>ӧ>|˗/Á%\i>bsn{5ueYr)Vu*9/9u8 ZmC@bVUUG= K"yqt!\j= b^j=8yg:/yՂTe9=>~_OߖܻEffN z^z5]Er:S%\0.tIBDdk}q!g$\UgG"R1U+cBsU.~fp*l=Tu^zD B)FP)%BD*\J1BJPEA$1(TDT횓 OyOׯ_߿?/ǧi3SD PZ΁2-Yk9~n7ncJHDFz❄pzQ5Pqi5o~/yU εs>%3it>?}_}tCHjuN,j٧RTcuÀԞ -0/c)4O~zx|7=V!ZD 3u q?7?tzf9<=ŮCa 123cm߾^RB^ZZEpL#. TSx)PS54S 4@w3r\̈Bf2vUl\dwy, ANGHt]C"M)R9F1sBbB4#m=u ,O X bmWsp=]领8vk(R̬VW%PZ'U0nWQ3v)咳R/p|xY`!sJqys۷?O?u΄p:څ }w7o~Qeh? ".<U, p`CkN0a{+W" *fP՚RI`zW)h.D@6]ʲdַs*3P)1!52YLs=a^keW3"Z*tPIͪ38U$FvgRi:>>쏏4oA3NRž Vj}x Yrc S&UvƗ c.ta:]ùW!\Bds$Z;n% 3rds f"$ff J)\r>N|84sΠ f}wݻ~߯F2+{a{uR֫a!H"¹`(+C$ .Иk56ǫ!3r _ihNЄ\ ,fNlE ŐT7gClws,,K;я#3VGr%z+B=KL@] 2kYj,t>_.yskE 䓤ҥ] n}{sۻOaGb2\$zOMW[dF(D郄 8ϵڒq,C߽7+"KޚbjF8B@"` =VC]t^ npͰnn߿~nf.W=\.4?>AKvp`s{0CtK^zdK.kñj %77I ;RJB@0aL=2曥[@#0*QV+5D[Ä/)#חKj5+UjY 31w!URqw?߿ !X0M.&&S=8BTLtA AD37c 8LgPoƱaUpX_Tʂ~b X jHKŴk[J7&W6 @8^o6;nj }9>_tIZx0t\W덕*˥#"Cq^j՝P1psgwV'lZkp3";`Cvr%,ek3L:Z5g{̤4D{1Z0aqvE7# t`555QEfD[jLf -)98 X%3`,e`R 2>vO{۾j,!"*Kjzkq` YZZ4&%ǰ͸Zk^߿}ڞxޮ!Kk_t4$Df"ܙT+u37pnIyfjdsq|A4C47p ݽTsw\n !5*'+WUkOAse\nkerMFf iD lCs\A.'30djnj\%t:tt!@s7V nft<<.sFD7kT=u6 zE1"ǧo߾~ӄ|R"J@r | W0 !|/O9OE/fq11XLfXz3OEg-yi6IQrjQcۥ.t*zϾC[rjxC>q.))`fEI~~?}>/\ OBHcn֧Zw뻸]K.$0;ˢՁ $B!34Wr쪭; @ TՁNBNun:T#(BVVW0z+AٟZrV4DvBe>"Pkk_Sn -}U$\M\ٱ [pqZ XѴ)2pU v3]mj% ðnnn._i#`)%@өi޿ÇOtynqUױH)=忞Nk6KUB!lfm9iTe0cK)f.S=&u)f3/O?ĘSs.b9㒥jZ4=Z.n'8NA1P>R`68.X X* 3bտH B5hNDRcW je4]XV3ꦠnmd3CHHP] ͉ -<òT@^00Z8kWjCCl9&e]A՗VA΋KG&C6>ʕ@f^T|:CH)|>ׯ?~Sy|ӱ\.3UwBC߿nv7qIfOZ>=N<ֺaY6)nMz\=u뙐EKa$4#wԛ vxXNNP90#a:_t#I,nX/n?~l+8,u>=G,.K;2~hŁ1ŐϹcA5k]ی$'s.)C/hOYt2$_fBDPJ(y /g;>|3yߦ)3p::TL@kRB0h@ c'21P  $tϵ:@jRr&P@Mm>ХC=ZJؚ HZlvxz~ӧ/uc5WU8.ln՛7?ܿ]o60PבJ_L=1qV?e*U]߯Us)~)Puzϴл(I!$ tѯKMy VcߏHoaOp"ų!ydU8BBHB p#8T`F@Z>BA`sj %UT !Uk3 #YWJB`v5V UKEĖT W+۩"n=9cz%f)ݞ{>}dtսo|s) …2q68OϦQ5!egd58f4|Q+=ep $@0 C"(T͌!6U5ՖR Xњt\IzdR TˡsUBt5ӢV bͥ( 7 t:~\y.E= c.K5R11r-өԥzt'_ L,TUGhJD"-rF3[%!%AZPk"z%(Z;pPsZoĉB*bEAn ye.X? Zf}6"A0HLwooޮ޾6!\jM0ݲq]'EpJDRpɫ?3jmn!'%8GDJ@ 8Ze Mf!) m|B[l ܜ.Vt+Ւ[P se+TK .øZojBBJ,-V*@3_*f$Pg%̸3)ZCHA⒋2 H-KmT+㯅7Rr"DTKV4\/e^4/nULLsSHV$tV0cp ZCO#=b\ު. r4DQ)O820 6tV"d&fFH h^ tzhV&nDcH]7%H 2)"Wq1Wt>_&czwx{ݯ>V8 |22~S ˪l9n%F! @{]Jc ,$'ݧ`RQb1qb.V4]uyS$wUs^J}0"U݄)PJuXmoonnovzƑ۝5! $6~ P_aH<VaZKAWG3+YIBA$,PJ)wA8@T\!"(9:J@b|(#Nw@Da:J"Pj>8I7/.󪏗s]qϧs˸H} `84("0&W,x73j?Lm,UBT5F{ &$HEjnF3WßjHcGxO#`",,bЃ EB7aXi{s} ~fXccJ~ b!ŘRlTre(]Hê[= 12sj0&cק.Ւ*>܋,WE{>]cׅI1tC!}x>g5Gʤ 5 Sݛo߼yx#n)$rNx\Jmv6PXieRJzRmW3C$d`eo"4B1-Ԟ;fcDUU" GثZU X?{ ZNnCNXRqSL$׺^Kx,p!%kyf1]-P*s!fs\!QŹygݧRq/=]j!@ddjgF,LJhm9Z5ղrH\zd"~E,TͥTfaq #HSJ ǰq!Kb)%AbJ:MpH˨.d[3zmY[R?rbׇ O#06~ _Y| N0ϓ&iȀc>}o߼7of]$LnA f@R TaB !,Vs!H,TS(zs;L#"lv1:^&AT<_N9QKվ|e:r/7"uDYHy^<Q3u30fFRۗдA]'ȱ2*CEEU6וrafe|O_>ڽFb`/rYTVW' m CߥϹ/Gr9Z .C'A4gGa R23VP #t%\P+C,֢9gc#DJ`GT `1GFa}QtpBdwPspnfꚵZAUŀ Swpt&OBw75%,!QK(XveYRCd!fտ߾^ mu,g~ZVǮ1q׷?}}YM~g&1rݶo_S9p`}lY^~o߾۾zu1;(jB@MĦ @L0R"8@S^h u Fm36JQj9 [t< 9;1`˗_qUv]"1n}lCC(8Wo޾{m~lc51"C8v]oև/:ryQ52껰٬nnwW~ }:(:(R=WP2@C5N`HPbPHRѬ ܾUPt"77k)|qAD OHead:||ǟ|޿Ώ_j ÷O@_m>vc :.fo7` |:MwU@. HU+V /r43sZYD@D#hjD ^MZٿ(' :pڍ`)G$<%oіIUa0׌0!>Ku=BMLLB niXo=nݝq9ݕy1RZ Mvcf`KfMOy>"Ϊi5f۷?xOw77jlk/cMc qf45P'υܩ9$d~qհ^ح=Z9cdw0hMQȅE8 B fp'5w#Tp7Po{^ezmٮoTvے&/QY ǰ1 H`8q`0 ؆)(Q/uyU՜sY{)Ҥ>gVƜs4_cfjXIO&iL7/[2Gaʼntg޾+> W|ы"k]ӉaLYS> [o};ǧGo⃿xyuy!BΙ]0UO as,C@׵cBΣ R#9*W d* FT1TD6Kfsʀ=8b 8LSQ,|bDY͈^//uM> ˜(xuR\p!6|ƶ1:L5vov\ݻwi8O덊͖G?~|Njj΅C^9cf{ϻ&咒cɹRRȔAljDJN9FD߶mvMӴmP*o8 `1:L2oa8/VDUjy0(@S-L\ L:1 A2E00ͻܹƩ^%l=m$~s6(:/fsXo7;'bl)FqΘ '^NJ1j:)}R岌$Rrlnh>glh&EÇ(NR$ʙL%R4'sTw2b( ̈aBY"),?NKkcy׻$yAqauփUsE-Fwxtܯ1mחUwmx ȸ֖es@2P,)AIPHUDx@HP5j931#dRY))ea̽OݘS/*Cʷˋͥj5oϖOvz+N<~dXkF y~O/_~v~rp&ƾ=8>z6&X,v|nEv!4fn,cd nFq>P' 9SM*&$>c9X )cJ()%RbHgv }f;'XoԵhv^,fm;q޶ѻ!|fy,hAN*"v'])kQسj|Ey֜*>:sd)=I 0XսfUZ)Ήj& 1 |lD18FCiv1_̓UϮ.xp8xvbF_O~Zf4 ~2Fg׷{bv9"F5j۶mk9lM~6lX6YkV!Ϊw(H̪11ʂTԒ[-:b$SbUM0#T`IR 8*INe+iuQR븹zy&bAo=~wR>;??{{/EPJJi)ɘ7}mdanfdon~vvzg+|ttu1!F8$e}flrp.R(!N)gィ QCa@'rbLUT'Q߉_Gd" c2Uv̭a pYBL-H윏m.~ǣãayxt$D3XLd1 1E1hgИlCyd *J )䲾]_]4Mwtton?~yM\"p56֯^<_nw~w<Ŧc\fIFM,CɹkgUTAKN%;BΥٷٛ9Oz'0s"J&LbQa&*̤:MvD{Yy.Mžf2̻TmJQRp1tPܼ mLM]!FbkV+ eįiFį;/}բ٦vj |?a3b`5r!>#*J,2194H ;I@)DT{"QQ4F/p|i{paӾ|4ېhn4ٸY;;9[?[o_lW-Øo\{IØ67ʰg)$E9a9tݬM#"aUIRAp;8GNY PU͙㙪~'{)& ڜqfY*;.Imf ,İh ias+aNm,.2GU? @fD͊.gTU)`jсB.=]jȮMmyU3̪61<CB- Pnz8ؑל b0rC#kvH" "2QK]iɨpɬ~ޓ9>;čYŎ:,"|6g/^}?<Ų?~wJIJJm M{Ol<82/Dd>[~~cθr@aT06㪏*`$jc&K&e6026=@|05U#rbimQ 􉆤EY̵UYmBBt1ض]-b1bӑBEk4:ѝ-׻ TK&ժϻ^yG}a/gz}FY FEoR?zs!+#5lFYf v/}vR<-F "%EE̬hN~_>6CUo~߻]A0fE7sHDX( d(nnqC$Irun{:7 1sD<. ,Nm;!ɟbfc@Hu@?>;_g'6?̈P՜o?sh`Bp;)Z,A`/*b|-grR̓1Tɘλ\< (b)I&":`~rPۋo}pyRȪZQ*԰H-vG5A"h =~*&bE*$(" 5dE$;f:_@E 985"7Kť*^9ln.R.ƍcׯ.]ӱoͰj3pJzZ"//o4qvfryͿorn/ooCx!mvv/E%jMSŋ t0??;f2d砊 QT#+RhBQ %TLőZS׌fCkq}ה tHuz$1"c\\R#)D pTz˃3)iP&6xbfq.t8ni{; .f:xp[{zzb8ώRwd.?;:b5(IDO,8_hQ+kfyqВ( ecXbλn~}on YXՠ5Q;5cE,"BV@޳$i]cfV13TCU;!-uQwh{Vbp[.Pc1*L3fMxM7Qu7Ӕ3&&:E]LJXh,◺>!+ibŨf5z긘-Lwj'jƂhdYJ`:ĪrerdaS`2e;oVdz{'9Nܬ7=dx0vԅle܂B30l^̎Vv{{ӧ_86үe4VrܐmL#!jbLR1cR QTB P*YaRA2F09_r&y?m5sT#06$ -aC (.I Va235cFm_ 92(zmaC+;wߩs,)9eI$ǾL궢 P]5ɑ,+[9cda&<~|p䢫kJImn+d!96u8f{1ڥ"©0I|y~{1Yf8>:_.T>{vkQvGG7ϞaZ/:GM7{ѫgOwF?/o|ft9W \./.|nSQ"bKnLΈ R{][""ð(,9JJVu9M6OaQBR@ 6gW׀L9;(XDX5tlJyooכ7zo>?w[osa~5T0at-?޸S93&0T[55S|p!$ZqE2@RGDEE؁It.U Qf|ˮ9U]S"JAdYĢ!lbJ%wfj(X l׽1Ԣhj2>/,}fz%UyGՊ(}:=έQjL=AD\bb) /D݌- o mGe$2T`ߪRPi֯=89f̘ ~Є`օΗa=>9Rwa3IJ$*v\\_7[Ą4z1rnU5_/?_{ѓ{vqptV},=qF{H,vqwsLWQC_`u3Q18Ud< qΙc$G(RN!z﫠Vv'#B* TiB[82h]޹bR-@ %K)g3 Ov4̀k" Pbd6lj FYUPAߵCA*yL/0Q,Xr1AhTój4n-0@P9Z6(g MUs)yxւ3̈$Pl3Gw"#P2 ꎪ9I!XȢc.@rsk$"Hb`k@C0Ӥʨc,9=Z'VNUN\ )jԑ '*TS*isdi5qoWW91b¬qdAm-Tͭa~B7o) [çg'gr~ys90Xf6W~[nyyð=9Z7̵K_Ј@V}|J&f}?:b.`%lG`؏ص(1"Ņ>n'n-)D *d󞣇ɩ3#GA)VJAf&[9 !X$1l!{:1p\jg0L2,dCfd=1Eoh $ ^T!@HIipJn2CRx b̤L0fetQYh>RPb3`L.!H1U5XNM;>MMDDhur\x~kF2k^KNŽo=y4eMjbou:ژFRi|Zo7!w'5q,Xol_jUJ"GWG8;('?~1?Ƀ{g/}6)?|o*RQ1fpfRŰȊHӆUh6Ab<auz$M$$ye7dя>l5k% )g;"cʽǨ!u'v-g\bM秧I$>fYn6 Xm?\ow/v?8?g'wOgٙyWbo׷W/8?;>zU1*aXS88I%3s#8#rF4 Аer!FUR94JvÐ I]\;*'պQ٫VQWSIŹ_EI1;ё{,(`9h"R;DY)$cb5umDӐ@k`~4иCa3 bkw1X;d(BRAƌpV"3vFjOFU`>[ H L e <CbK'P2<)v#gyTX TTj3Eʂ!GFz>MJ;V8&MÉ4NW.<[|3T~,Y7[vyt+?{gg׷7qhf #/~8"ΟxzW/_Ƀg'7?l}}Wy_Jפ1]_\䣏vׯ˛!oXh ,Tl((bc~`jaѓ T=XfmlTRvLz{uw1R]~owWWWq[Im6mV&6ӣGxNN<|~ރǶmp|wzxrr85ח?~G||vw gqTO"k:7UMJ`2`\ڊasՕ3c% 0u$f LĮ­3Wo=hqhM@;l*]p9G S&sê  8j"&2I5΂ (ZdA1acA/Zh(2; ~ϜnGڤ}BNUA.ULȆAy4 EsS #(YV+rIi;v0#!&A0b <ܽӣ˗D׿vN)vno.^mofsbz+_=<';r2wG)6uٙjt0FiWP%37d)U؜ PE WSΨjo@lrR"bLZ&;:0Y331DPDPX̒& bS7fYY Vf9PL"i_:#TFn'f YO&0Y' Ss,DT 9GӑKVi82֙c M d4D64mD[t3컦{|G}~9F\[I{"n{{{+9-KgvqfBPy1-{'b~r6ƮSv\b [iGnvvvp?>=St.6N8f0$|!0#f"}%u]l)جj+ؑ1猜 ƶ!eIJb9fvK@ݜs\9ff1α1]u. ޵ 6oP63H3J*])%f`2S.U5Z*J!F(b Ryǜ.\J1hb>&]uHY1 U&CD1فgl"S!gU>̗s.sC=DlP)pL1ZɶG_{_\xw^٧4^^/gq~X[oW7xn8wup-;/^s8o88fAفO_g)z&/7ֻ߽WW|(R=8ػf `]3_8"j>࣏>q?G+EPBA@L|.b2R KQSyi>Z+&SFM{TK>X8q\; P#4 :mVٍCfriG)_<{'NjW..1x{yo}k_jwZr`6ѫn8X,R$DjPݰJMGԛm]Oj^kW.}\؎qqˉD P(" . G &FcSUT^km\ C9~ 3VY1Zk@ }3MBykC  6Vk c g,FXHIH<s}SP9 (vaI!jk@uF0CZ @1!@gmp~=Ä@oaCa x"g-`B)0F)!Ax$޼oګ/Sic'.Jz (VN۠u0ډAv}S70( uOO|A |6}?}~zt8f_M릪,8#;klmU@ڪg%q0(0aEqekF@ M( Ę\C1"κsHZRFK}qJ[Zs g'2|V ,q tz#AQDY@Y0zg$Eh%9 Hs5V{7 9O#@(5*aNppPN9 F0c 3R#@p%y5:ζ)$4@ LQ A1AYU/g bT[ 8XR!:$,$AA˶H3!c(mC 'h gTPl(R;wkM¦׮][mKL߷ިAtuc3Ux(n.V,b 4Goh/7w_j7~9@9"VļkVJ|Qbѕ󦮧G|?xN##Foj_7 kEo^Bp68 98Ё?" Us*C)W(xhcVy608Eb٩+|#$xh6Jb ]ZI5imSF @:/NI7aD4S!x;)A({Fkix)imC{hڦL(Mbܕ'- ÖqJ=TBiL xouYoƣ,/C`KAuIS謳۵qF0TՌQ 0bX1@}F_;:fⓏ?W^%YܖzBxrv\CȶbZ+wcle6l ={x6#E_~$Nw@l7֋A"B,ZkeQ); xOV !E 望AZNKNY'B[Ο?&˓,$+3Bk{L&C`W'ڈsD0!+=Crc;%)p7n8>/}ǯ}󛇇>^3HGU"Je$Jq7۾)bL BZ;!bAgˋ?L/ygo~a\R>zj2ƤS HIzmۺ\QwZ;ml2iq02ZZ!„@RFN` 2#К`ZFIqzc@}[AQXWl3(7aD4A gфq`#B2W} !J:)C B(e΁8y H J[BFP!bQh(V,w Z[]הu A)IMf)ۦ\Ag<4<GHj #/f;{_K,b,II0FuYl2ϒT睎$oT"ɀFwBYY 9C0LPƳ9D܇AxkBpCUuH?y{;go}Gs!EIOgOE kg8I`<{r1\9ÔmSVȝÃJIZLdhʦxgg7/De#bq8>9JӡmmјIy71z6'GҠ(4r:8/x#7$B F!p}DiUNB@pP1G,$!@p&vW9hGءN)@y` [ cRHtU1 @q`tHcLJ=(͒јFvݠ boJ@Da͓$JbR !l׮_{nU0PW |gi<&ӾDurO#hgo^4c 6Wq ,#`-(bX]hJJS0dX ~h(<y7S:B?3h*tp8Idz,Oϟ!)Nj|1^~H=J6!]?HѦڬj}n,&#ؓ3j/⃯FO>dj}@CƓby~8c;pTlϢ487o!ݦeFR1%넒ETC!Xm (0+Uy LOelTCx1cD!u2$m BcQ*o0RIQV8y5@GY•l0F`g  b1 )a\ M_]'YMSאbeDP8Eqh 3BmʦCr{эwoܺpv}v*ۚ# U)Cau.ժ>z?u6F J)mBBʢ( !@G(8Bƫ4 vJ'1%T:bT+ѕk%d[5]'(]C]ę5Rˎb<&~>ytc7]`\@gʠ5 y3#C %M };8~0RLfEavq#m/j7O|cgЕj 0;("KB8UhLt>0jO8[c'f,{  u'r`f,RC0c1#4!LO;okјRSx/I]CSwB4nΛ6N (8IS14 Z'7i z(Ɉy "=zLIkιھw>Yrk"$˦$j>4FֹdS@(6E"NxPRuU% !M$I"LF"-2dMlp;6׏PEP >?y.7^=Ik8CzEڶ5N{qXլOҋ$F_1 4}pg0DR{1sFa(qR!]Zmcv)8RCFY[,py{इW䫯:N]]ɡC o7,f`$cbzB(`LUоggύֈr\@q . }DiJNHIG9>P<#6bgwoID[9kYICLx۴އW^~y/D(rJ0F-/0p'YgEK9D, i@P8!l/jc'S$RՂPΫ3x:M4MY1"<BTͳGyy!*dDt}q L'#b<dgzcZ;k40C;kaqZZk($TH0a[xlPw$ǀOg(XM՗j!>i 1iƳ8bȈF8@ #( VRv(I(@0Ck,)b8Q82Β8n>jV)aF#ipqdh{}8twgRb{^,c F |W}Av8NdLG|1Y.A@Q Yr>\?y>|< ,Y?*Wپb`:{D,D,r@0Γ"ϳ^5bm7e Ac8A|@(Nq9Yo?*OHPI6ߠ86g%8J:vų\`˽ޜϦ }d)Q*[,evY !lgvF{c!R^h:r,..~o݃k1 MdJ(8~_-ORV̓//wvh:-s}B"vg|Z6+,SY:cA rFsP"烳ASjhq/snr ft`Twȭ#=R 8UUUx8=ypo_[N1nrs,8dյ1&☧!s!/?|P͗^u|58OZ ]#/כaIwb͊j7? ?W^~fFi }G4ӌ!?0FJi!(rl,.p u @;:hx>/Fw_{':鶫g_gd[-zWޮyV\F08-+41YlgO9`4vUYϝwz?X NB,ǔ9-eQmI xGں*. MJ%zt/=Ž7{Hi#hjYE_Jni -v S2XY魣liw~Z%WW z4򂉍.Alrg6YQ],f6܊^<{DuptXeDmY[) !e$X+j$j(9Ҫ^wZVIBvMUV,{~rrq~F|P(<(ɲa3ȏ{ߕ {w_V;Ƀ몜/w'ytmM6|4!{nE1CW?#k<.664ϓpVˮ9->{[~?uᅗ^aʺ&,K#%?}*dU/V_w}~n'CLn XM`en>gKDh3!֊F#^!gSU IDATN5:i1+ºׇCFkT:7+#+<eF秥Jd<|:C=/Fe9z1{E D(@)a8Ӻ;!'xA,xlu*M$S@Sy6|5|Kg-fI8J"!,f;zZ jI8veW/6%h2G%̗;˩sٔg_}dOܾ7^u1I$PU%qH}u"d(9)sښΧ m k[Ũ)嵠rgghF#<2aAi!I̲3ܛœEL@N-NslE9roZkN?}9IFP0#-Ќ"+v I  xsqbf}\^ܸ}$6UwG̲\ bgiy;?i5r1FϦ%\˃Wduͻ,;ZC x>CVYih:v \?i[| !g C7uE3?8_y0b^8Ȇ~HeyixʠW bhhLfADN FjYDΦ,-0$HTi-w-l6ܸ}:!OӇBZ?pݠsکVwlT}ˋ @T7ig)qQB@CЭOyf8{eY"&h0ň0=;Y~z[w^6|6Nrxh눡M1:΂}f GY"Ǔt<_Qݮ0,Mxɳ]`Zcya3FSD#h(m0:W}[o6s& aHǔ2ƳEiGC*s}}?nW`P;M(`UUiL}ZI)shS-' ;ݕÃggFz(/M I6">O7U=fxxB!*c"W[%v;QƇah.IRYYQ#8ifi6NwwwgdIF`Z۲98X^m)a$MdVB^nJȳx<ƄI (⌄kVۘb3Ak8lvuGRg4u-7ۋETmO;srz6N# gwrN{~ٗw8$^+w 'Os|:cd'Ub2_gB@:\L;1Up>RGVGAޥYdv`nphyV0J(²]̆x]]~RRZs#*cAb(&8㝏$b4ǔ%D CjHloo}U6ZC6 #ۿ;kz8O!0ΚD O}|B3kg8J]yX(0L\uI1N8@~r9/Jl7<;˹jN9huYrU]n Ag][/8= Y詃. >NA!8q<1ƄRQdYN"b`$B)䐦ijFZhI8>2gUZnW" qD쌢QL(Ml~X]AMuжE&>{8O(AE+cw.@ANz#˜FnA<|U1߼E D5+u^OƷo_,vv}x<ń`qi&Y1!. £{?/)}PBg8)HW^"@#qAdVH/C,BpF bӞ(!J&`z80~I//},(Ɋ/R o4"KGHh ]HoTx>&dwtZ{o/;o3aǦ]kQY+;eZNR2 MlaWbqg|`,ǻFŻr9߽R?,^^?s@xQ2ئmzT7w|K}g'SCetKC=ږO?֋. ESn(RsekÕχbaGh4g !zѬjP{FtqSm='k'g#5Cwq$`(AҲ_L [bϊqM۲ivUvSpGz$A&b9_\[ޘث٬۶m~ݞ2 NNlIb0+h)@Ws9'O_?:mBڃUh RbIQw|$!YlqxuBAѣcm #l6_,'O.WTiγ`Db|| _6 R7!0_L1 O?,WmW];ؿv!JʳGibAhQדْlGa1&ܴkg-c=BaRj;݀ =1[,b 9fU^?{|[>E}ao?;/HX4R˳3 ~Qzxk8{}⃗^z^D,4HA1Q=J]?8~;w}4mIyIo~hwy?TNeRD_86{&eYqqwoyvzzǟW xd)ڬWLjc0C, :%|4 <P PfLAQ0AH)vZodQL Fi:?:_>{уgO;cxo5`Ô*NO*3tz`_IBy{tOb6-nyqm<[EvWzpvc_䓏?q{{^ wݺ}L X? 7z{)AiL 9yz(K8X m7+s"ٳY!LtD!\+vwwFq%0h3w]ۀ`J=>4XcwXA\nn>gOYY^t:F k1Fl˪S'7ݼy띷~&<wWV($s+]"8pOT` \~syeOJEALZ5'+8SK*`!$/Zk(HQ)y"q0H A0YvOn(%%d$۵pipղ>g0g{~G0Q9 pJm.v|$$8o:{{ׯTKAZ.eE5[Ca |iYK[[ۦm/_)pt"A5ML|m:d4!ĘOlyme:&I0:G}SLJKK˒$7:IUuE!OP7uB1ˆZI8ukM܂Ѩw4 凇4M8>!lݪ_oQ(Ѩ 4%L@H=%{3qo Fj-&q Ec`4L]Z4E/-#Dyw4*w~gx}ʸ-ZDz I∊2*DEMU㒕E<`y^b]V*N]L #g(BLy L[͇y{ﮞ8ǐfxͤjmo@Dr@JIaI* @J% RUtMEYU QHLcdԨUq.rLUCU/k~ %'> a&mZcw9/`oǟ`: {iضƵ7=W~ x晏?w;[[6a % 3.Qc d?|pgW' 1M2+ Z4!ҘT-Ѩ &"' & O8)Lo4ƎW5G5]p4).(qLկEW4g4ųl:3&A>SCSǃ[iUIɪIfݮۮ84mlmYۆ (i68YZ4 f:eQ(TVT%YF{++'[IQV'N\];q:Bd &#F QygIM&qt z`'. a)ӔJ IDAT")%RBED 9%`N*"e#MΜ9{8))TdE ia Ӕdp& .JE L9%YTuooG*T Ȍq*iIs$Yڪni[XՃ}Z}~ikdF8e%P3³ɚ3 L놮*RYe/=aaiyay?mmm,-$]YZ ضYY4O5 .`tadY4˲(DuuUU顇7NkyV`Lï}7G9BH`W&/< iٚVRN~+n.2$,1L5ϲx6Dk$eI(:}ܩ3`zT!8<™ajgI UaXЮ<rG"ǞYJ;[eX1|r|7lX7򂚦SL*XZ ˃G.LSU1,@Hh6۞gm.8Ï{ۓa߱L,e8J.By9ۻʻ\no2;ݝ-'YR$ Tזe-c0Z[UIs H$y8$ZoWkd$a%(pU$HTIAŗ_2S],*ŪLC:f#7arO>d0X '28 /8!(0^[`-H졇%t >zrLZΝ?+?~釽SO=9L8] t~ɽQ(Q5(t*B<`Ν'NnH@o*ˬ pF\`2?y^[n<:"$3dDYa۶,-k6l4֖hVOVMmA(,)r' \@@u +F=}<& a4MDLR GTY0Nϒ[XM׫?pzs=0$I_]_WeYŗ^4t|MSpY4IjZ{iJ^h6AhVs>IRwݻwO9ZX3돳pj(M3_-pAE !`ID,+P1l(JyɢiǓ+5L"%Q$)fh"䦡zzkސRN[^ER8)[7 LJMS,9yr5I/뒬~S5fWudɔeô RFj$$IiZbEFQ$XGI1$5$n)wEY/mt{Ve8YFҼ +((jYf^}xә*AW׫-.85~}cYGe," 3-h-{2˫}^@2^$78Z>q.hR4e0M.45M4/Q8,)K p"U]tr<⹦nCy`Ȓq'])ʒ&4 Wq/}IV} K lLfRd60㣣ݝǵΜX\^TT)/2@UuN^B4>dۯy[1̹{[; ˫[5Lq^$IAJ~f1- rRZ f0!p"%Y;܂<{tER&(eڶ꺡hH)!} UC4,oda&G0H*3sN"Uk/}_~ݍ;Xpf7nklZb^YezZ߿~杛Rf\X?S0(N$խE ޵-V՛#QpNg+qdz$Ƹ,K\8ϣ$# ̓`BxvmpЛK=}+W+cR^pw]f>3.)3<嘆+W+g*ΪSk9:6U(n޹&ŋ\1Ü˕hldzU) A/!T4L)g 8-i'Q\ E-۳MstMrJB߹F dӝ((r"L#E /fq Ŧ 'ז+o~3Tٓ'L[/*ͬ`J Rۯ ?ɍSA8}0Q4=I3RT }rjFڼ ?d:^'k"#y8*1U+bPU \:8ꏿo≊W%u-dvV˜q9n֚c,Mzrdx_뿼yj:[Z` 01@L|r0WV4,Lm/o:%E*fBVeT]c4P GTuNKBKY0"ue48{7{]~oX+J:.MDY;(y/,1Qlco޹uk.>i!2BŬQBҜ@I+uuG)0NfF|gy;k2e6 .^w8j/+V=bĒpx XV+l甘Z^#L Zbr%  agqJ\ ǽ$mI ceehgogq2Nn޺ı&kˊq߮6t>L]_?t>2=uX_[[veH6œfjyY,{S6䪗 hŖb#V0p:9`d2Fa< koo 8ݪ=~cnʵIAxOyfeYMϬG?[ݹ Qxq1%4$M$VkgkGB(Y0>}zGy;g5ڭlﭬmY 8z[>t遳g+{sٙ [楨jn!F^"RE3¡X(t-w*d()+UE,GILqI, aQpUIXl~ݶj(47༄PoEf*ۮ>$AY7&pM02bQF"bg9D,3.b IVi\fQ:+cv^Ϳ; L8+Duw\g%Ƣo^}_COԶ}ߐg!XtM]ݲ4 Tl09O4)r't0h /.IyD)\Oz1狋^Ž|__|;oooW[g/j4I 任[w_zc/ i$3hՊ"CruRZ,.q!Y&Kg$R5dS3tݡ 8"IQ)dYȇ|曯~ ~㞨(Ϸ[@UfoT1KÿRQeLҔ4 KN)I13"PUE1D襝W`X%۫sg-4n4اSjK4v zm}nH\' HƓQ4LrAIsN$!J#0$5=5:K"$O޾~\ cdqObif8 ʙRnWq4"^] Sjd#DZ2a4v)ZBiHwu./J$O<`g{۽s޳<QZ{w+k~+ "2Mr'V%e5UhT sRiv Q-& ("I%ET]d 2SEK& I`$pLǽ4JͫzeI>-Sbz<:C9%ÉPQDIQV[qmWU8!TGi3J"ǘFQdE9DXRp2:GG۵Ӟ/uo.Z_sTYDRIq.XcXh qQDĒd"I,G~Վ(۷oZg?6K4 pZzZ+kkimnms&vSWޭ1!o%RUqIN=d$+*&$NfݔY7R*y FJ%3!# HD #dŨMd#Yh//_˗ҬT|YG3:(֋[wLӚW+4m_vۭ5疗(*q2 BN14tġgmEQdzsW^{r c^lPsM4~Ro)%ϟ;y,EQHi4;;A0 '@QQ($ z.՘ Y&qbI&c^$ɤ^j[z]MYųaז|[Q8Ea{gP8$(!K `2ӔRb0̣qݙ#éo޹xnWY?''K歝Ǟ|nuayc1<:,"T`ZXDI3 T4(@UU2WͭxݣFˊx@MyLS4߾}>kٰozjqsgAf cqR!i\ժvZ/}/ ٳg%$Z,E͆{泟>qJ%U,TA~jmfx[PG#-dTɊB`sLT4A2MWjBQI\Ƴ`<6uc6 IP@ʨh(8eL(\_q,ZV[_bضk*iz^V4 T)J4uâ^8jBDV+7xZo.IeX)gY+3h:qv~.=|s2?ubMYtx͋r}nE$2/޹_oEqb~%y,Oqs;ؖU*P@qGf]ȯ^p(I`s^UuM5[LP)9!e+_vuYyaI%(QgێCFj`n6:ˋ+aSBϛ#\#%2I 鈥Qӯ*A0X]8+ڵ?ǻo??9mZAOÔf G'q8CZ%1DyČq4J$5TݵlE,g*PlC y{%IA@Ik(2 W^,YMe5fbyqǎ޸uWU]{ێ1 U,elnͣۇEI*$EV4k&JiYNdXo^~/-˭,EQlY*[,ʆ,EMηv>:"E_][˵z2jT4yOӗz[}j,Ltx#KB!cڬk%t<8~,I?nXA lA'w@%Pb 4晨)AzE,M['zZ JX7M]SMCCtES|ȺӜ[pJ9{}hs1_m4GQ?<\[[-0ȁ \Bp<~_~;wIC=0M$@Yi8 zF(Pź)-"@;;E`qDq~a2x:8}Aٺt!òkFFMǶ)#ׁ l:oUU\k9`݃}Y$$QHJl6`v:,YC9yQ\ows #g^΢`F 9qJ7djT41Lc:̵wnr*$yePD](~Ð*+2N&I0&Lgq'Nn~JJKWI8GgY(Qg~,"`TtxpG814<ͭ FE81MʹGTϦ31,EPx׾o#(O>NL4,R00[Q7Cײ6$yuW^_L1= _R'?ؙdʀ8j6N$OfL(BhY*cZA0%nt{xZܼqp޻~eғk;p)$ݹd#ٺI4L!%#x8"(ZU0ZVz{lt_Mdzߏɓ'}M.Ӿg fvKD'튤BJЕPHBA).dPrW$`=Ӿ['K<SDW*3)% u1!B(۝62qQV0Y-0✯&G7zFcng;0mDe9+K,kݰFuM-EeێEMǢiJdYl9a#/JM]__Y!([VEަCƚ[ۛi<+]\p%@*Zǫ}MԐ%eYjq͛u5hhR$r(7tM?dzqvLJ]?zctVlDa;n4ħNԋƪaQJJ:Aa9en8xre[;IR{nx:XvΔ&r `b .Y##Oݯ`M~V$H^{[(^$%0 * 4,75v=Ԋq\DzlxIL %gM/_d\#Jg/L/$γ۷nj)<~GoSؔ< :].Ӌ#UVW'B%3]uWð;-,gΏ̟s} _&,jZ bq^gA-^P„Hk4X/&yU5Mk?V@5RuQԋyAR C%ECm/NgWebP*˒dfl: 8=ֽרw}e:o &./~4xn݊w?~q9s1I'tKjdŵyLX;ׂV,Kd#|}b l\ tʳܵ,v;xUeY6^[w?~M#7nF naRdIקe^dU0qW aPʱ1=BZdyƊ A,D7Zۣed4]W jE,* KR7U(lY*14,`K_ R{OOZŕhd$t:l1[nDjf1Ɯ׼ȋtieu]ل G<]}{a{?s6WW?}F; VruCQ~J/?.덍_яQt~AěYݖ_w+|eg&\|Zmxt-kog }ڶUUj162, |̢WڴmBLV4~UuSIh$@4uf WYp)oQBj)FB^_ל2ϳKzZ45z^jie12 ;zuz{}wswLXSq1%_q!:/|ꊳ,!UURW:rmΤF7߾{+[;+@mj5H-(2LB膛A !+϶.t6E_y*d~_^Wh(}ϳз׾o}?7aS:8 CAIjQZY$BQksw[w]EBHTe]uJkN =lwq=y%L{G.577  EWStyXUWyB2@I = ]`VjL@[iw< Ѱ;K;[n5][ `$,ێW % noo߾Q^@5")8^J͋V+ܹ]We @1) cM͋).Ą5P5PcL-  ƠP/;4LY4yU׿'{à>8q,OVeSזiEoj0 :M-9\yQ"`I+&8D=7L<ӢG'muHc U/>rX%fk0}HQ%!dXĬ n{j#lyq덶Aק&ȔV- L ʂ75@*@B6SYŧg~zR 'ď AjZ j;^`ȊT)5 펔j*ByC~ ?9znݸ_t:}rեŋVˣ @Zi 67Uɛ^Hm[)1QZ+XUK A]UqÏzۖcSl ͩI47E!&q"^qQ!bԁPYVE, Tui^\8 6;avnaD@B]2 \7]O1]Qtz^)( .Vʤ@" uݺ\٪vsV;H^Q݊Znݭ1Ъ7E^+XYKMrcc|$N x\X&}[3˶(@ 8Ub51cpB@TRVk +4e8Tk8Ϯ.!PEbuMl mx=;;IΏ}ZxehҦ.Ze={>;|0 .BJIUV_Seڶx.aVPC>cA*M4I4h0X:?XC(aeRip~z\̻."DD**Ol$@\,0 <۷YU1H,io><Ž x~ aC깍`M]c -"JA$%# Z.m?G06FU;7!BA7MGM& YԲ}Ϗ|W6m"L\?,W*DݺW>]KFYVŪn8ݮzb0$iԌ̱(*IS%yE>`L|l^^ϟO(4'sԔPx5H 557Z+Tz6IggXQ ,Ӹ88zl6,4M18[:HiX1QVeZ bt*Ħbro~_}~}mo?tI(bY1AXeYkJ(.d^h:eYw{UYRxwob^x~[orO/W5eDQAQ&/U  :I5tZgEQuxmG^PiZOWM$,$vmWCtMqZ-8*Ɋ4ب&l\זc}m\7U^!vBځOBlȢIJM˖@!Bx9c*yrV(P"16@!_Qm ㆱ,IN/'>/t6E:0\%tKjX;CMm~wOƃ$^={WgR iv͛&K)iٶkRI;4I9P LI4M]W$P4<ƹJ IDATج23<],%*!@*}+ iԒRʪhP`XuZYQE.7a5Dò$>>:JiI=\!diŠ48I>9z3V[c[ǵ5D`ں5kZ @BY5$~c$gEI T{A`b ''?3]6uUbɓ闏.'U~v݊tZ.8\45 B获 KJLaiÀJc0 %U3^W h}-bU)26i)X\5R 8Bʚ5i\zs51:.[u7*NN[Ħc4S@Pct/:MF-]gLIn|^UU >6vfA] ,7 3O>P ǦrljR|4tks۵mѰ?\/>|g\_>y9Y>6mPT@E!dY! jG+i~txX䅔v~/\hd|>_ήmyͪ9r.zA]!HƸjk2/5P㭃} $meͥf7YeHбs-dȗϟwx~kEE30r޵UŇ>, b(h"OA؊ c\d=J[J7 e/\"uG֡-׋Gfጚ6֠aLj-&-;h9n @A`Ʉ16FþVu [(-b˱4kZUjy杷>߾ (|?Ҥr=V nJiM˳=ˤ@Y08;=~;ݿcH=&aSxM.&N+($1.P4EAZwWK]]^ZΒ$lZb 98MW< YY[mD k^5 |?ǿ !mݸyp}ئM͸t(Ͳ LAβ0HJ(!XͨEG_<{v|ܲ[Id2q[&1FZ۷Bd|ͯ܌Z]ϋv~7woJea 4 W_ۛ{뤰l_koN$^+4{onl^-.2x._>٣v{]VYQd_|^i'[y'n[4M B`44u50MjBsmץC׵,mlo˘{_-L`!FP+(kΑ3L E$k,ҬATuBh!@Ȗ)}.Ե-l LYwj~;[j,捬\>||3ib,[_xh8 Oo|=d4+ky ۃ;xk'ggeU\S7Bx8 EyQӴ?dYjQgR*o ٗvUJ 1u\ u7wQskRB(놻z^Y0&q0ɭÖ 65+ӥR۵Բ?ܻm(EZSBZX)eԢ,+ɕ2˲rgEqw4.Wdx')(,B0( bÎiQ'881)66wvmq'(~o]qg, rim\kՔL-)zU2@J,泫inmmqy?|[o5/u;e (;9vN1+VDUl= -jUUMiՒ$W{VYdqng42;v?Jaw0#  BY)~٣2[,8qZV'>AXVqu&AMUpфQ@(㗭v؊r?w/.&UhЇZei)3Jwwo櫪!@ȴvsgKB)q-/l&g%IV`8.ΦSϱ[aG8NɣIUŖE;eQVyڋ" J iU(@bRy@B$l䂕R4ZpB<|60>|q8/M"LJiҼ꺱l3j>:<\/<|=q0leei` k R;!Pz2A 4m7J.sbqy9`]۹u[7x[wmnlz]j{ޭ;^a|ۮ{߻~~鴻N}MJ4,c^7ҒKGh<olo @ Esz @糫=˶I]G;vۭDiV Z,67z6<}tvqFl7AiEj.A9U]*@i)c;I4 lS+MS۶G۽¦*t4u֗>{\6`ölr% )u-b @ lU}txX|g{AX|1AD8owFn؊`ϿEA? tbUp4¦1]":/t(r Íwv:l\/WLVVN@XUe^d^#bՙF&E<0llA/ ?qœ?Yհv3o|ݺZR4umb\, i:2LlR6,ODʢv're -;->F~,KRu0i7ovpp "3Sp6*.5­OFVO b0 m-xYV ioɕ @5e@mu&Zs52-"(-g/^gWl.,A^ l{ͭvϘ@Ȝ֬fjS4DH+-(FA~{]?ho3 0~{s-1Ld!8Fce^j46 B0ťRb&jV6Ea_N<BTeA[`LF.3 9*Vu˪(۵0`W1!aQ5Pܺ*$wK2I @2ϣV9omoI \h粪a@Pq)W7U8p\]1شMbf^yYfE~tt|q~q9NS 1F@$M=/X-3ƘI:_ů|{²,)RWǧI.lV9:p+.:I@six{Xzrqk!Gڛ_tz*7 0(B2tsmڞaR΁I5̺iVM]4t\B-ʱM۱gI,]N [!(rj|Ih 5]fv|a質ZuD7@(t=|Z&-ڲEQl;|8Jr\5"JjH0QREyzvvpp3+ZG^ # V EYW!ILzWN;luZilə uhӔG/_>{9muvXGC??;$F"O*KvAk6`<pDFmjRH،Kqnk{˪.|[[slIL>g!}fn0IG~GwnݼsU(Ӌ>xxopNx9dn?1֔E>&,NyJxm(/*B)@FUo|JbY; ڭM-2N ݎg4I0lu;=!4!& "n Λ)Jx8.q<}/ ݽxSr5T  ,̲PjKՅ縞J!P_?  V}G/N7vvv+Ǜۃ#<ǭkF)=}u-,jو0;VZEe۝N b#m泹h!Mymv$ 7uFgg/g DN_y6,t:61643 \d nqӳ󋳍-ѵ7 bƫE]y&Y-p(4 &n E  Aha4]z9yJF㰿w`Z9RC\Dܦ&\k1Yh)Eqdr^1&4_'eyo~kV+RBpΓ4 €Rj K)*sРߙ&/?J <0uNGL\_>]-笮(jP (XJ(\5M#Kc͘B1>6l邕 :zI.뺁A:iś#Z Z4<ܚŇOW(^?\r8ZYPʪk eY//anl .BSGIAu +v!Rl>KtՔU%T )$4HuglۖΣCTʴQ*b IDATE3<LꖭE%y2gEQ6q5Fyo~!5O"հVp6lʋx'@еMJ|gYm5/+M!q ADX]fP-qcu$O!Y ǵ^}m /4doNݑ:qsz|qe6UdEU+Vul{/eVK8Gb%8Y:ږmfR%d_A*+>t DUŋ%y}7h4Vַ%TXnl`U^U~Ue@dY 7V YV* $0 |6=2MUQ,".n6;fB8/ÃYuYնpƺ+fE-yMuninwl:4E4Z~?Ãd)[b@% ) +Kq,kvZDZ$UU><9p:u"KYr9q\y8A) A ]2;-fN&<Vq`ii{,ɚaAMYE QM2L۲N{ﯵd:Mpu}у{r7+WvZb>/k8NeMog'ܹn-t:54\|gj;&ˆ@LgJ@YP@N4r9ΦÃ|$c[:BR2Z2MDXmʘ*ˋ$(<::p-sgYXbĘԔ5/:/2΅aAn 5y^yM (;wҶem: b cF5`u]I]#V۵:ϋ4$8 <8\YakjUMre, LS5U!B`g.-U0\YU-W 0a馦i ֶ7vWk9|mkI|v?]6fgUMa;5E= @ymg54OKCU*-dž]1bE@,(5/j!Y:V Z !5$bor߿88X R‹l4Y^WUTӲ\0 c}u?x7PU4DƊ e1"z7 HTQ]VVI OO84u IXFx\_\S,Y\E(B4,p8N Fg}r4OmZ)M˷nTtttq<?{g?y5uRO ~[mVm|x?)el-c^V-Q|.II̸uCAr1_){mm9VH JSwlsƂ/Oee)|uuV|6nݟ?z%sN7\yQ$ix6=Eui)çnImS5uy&&Pq +!jٵ6F=m|EU5U Y]G~t>`}C^zP ,ggGWoޒU1;ܗ*k2ZIN,ԶMae|ek!5祦) rZV͆j5$*65 byrF6ZRԐF7%yjZom}]U)dY_v𚲚eIN0Z,땔b(|hxo?w϶?wp /[P,X,?X҂s0[L+ZٖX $vmݟwor ;RjiZVRm&Zi9a{~oe >^1̇xY\~{swn8EU"^NaXѲ4ZrYֵ6m- C?ߟMǛWvtמXHNu]$|.?{uMm:(\,UM@YḎfjgc]ɓEU]TeI{_~YU5+qe;{{@Qb  F @iTT5}\?g=svAU,I LjAA*s]GS$MU] 4E) :JNk4yi! { Y䷞}niWwN//כO( JI8b2ƺgBX%A !$/lhKe>~/2,7=ɸFضm(cs8gEQQN5A b\"4vOlEUxU2G@Y$e60^5T#@Bn?|YK7mbU?"\<ȖQg7o~GIچPx9|,?z/%RzWab6n|ϽmdX(XGU*dd%q TU}w06m![(, ۙG2s\2}ݟE7vI*+2+ycBQTۏ<Vmt_no}ȓǟlo~>+kx2xxnFy +kVUu%7{IiQ@MJYһu, UMNJpXllnis=IpEa,; Dj@X_g.(EPUBP-o9ú00Pu"9]f|9핲,fou5r*IVϵ -,UE#Du8\E4E1]L(y."oomڎ遢_};o=_EQ *9֌+A Q*ph6ûi*](HҺl;0Ezv!+fwtx Ǎ˪*g|?J0l5[ t0IiǴ(Dݒn+tz%ҐIo+^xͰu(6IJ3EJ`%Gۃlęb3P4e8" *Tr'Eg[nM`\JG(ӪQ {qr<<8n6nh=tEA1Q՜NyZ4-BbBVO"ex9jS%Jgd Gp>~ BDQyO*1\bUW$ .!ܼ75MPb h͚^c>[|ŧY V7nyFQOU?WիӧGuQQTd^U}v6,M/&`cXa`,Xb]U Ͱ̲y_mvz~z3&i8Nb/p]fcvZ$FB, A8GJ4]S`뺦 E)y99.AϤR$ˊ`{sJkj`hLufE˒Zm92Ný<::98>MwUYwZNYS0DPBTִL+q4˵i]DqŎՔe9pLu<iJ76u{ޣP"Ŋ4͛ua4MܽfY(-t[}@*/0D9ϬgWܾu[Q5*:%F*HN9/KXƼ  ג1iZ׷7$6_DC#0X%"IҘҚem}-݅[se7&,y%т%4M{t(wڭVVg;Bf{[IB@0I <]di+~8>;9=;|smu94ϣe8[-B` ݴm V wkW>[@+r&et!HӢ,ۦĘ͗xu}#tiZ<=HMf흽O>lvyvtz$}vIn}uoGӍt(}1D*@֔2. !Ơ1rtUS!>zz&b1ϋރ/(i %R4LbqhACB 5qlV5b9Y1l`5m,(,[[[e5UYcMW8cIi@H1-gbtttrqbj4]S,s>(2`uu )F "%]l7U͊qU~:8:8;=b:j.2v{Pn^Z^Я*ZꖔzQ\*ְH b[0n6l[H17?@ `YRK% %UMͩ˲TCD k`Q#۳ɂU^fL`m IDAT`HԱ,YVs2\]WV5~ֽOn|굽_Q7!i]R S)!/tW/\W,)`%\YMOدxa&i>[FR E!r1s}o4H8]u=Z;}(_GX!W__}((y-úqF*R!$-k5Q(DNG,H@MHR"U5 Z~3V2gk㍦ nڪ򺒌qt(NkmGՍb1O&p:5U-rߵ-[GXj2[D}'UYɯzƍ=45:FbFKE2+-dz,`e::uZ0a˷Z@5ϿX^k24-`c{gHuq>??,Ġ'2Up/>W^?Aӊd6\[]N1^hnn_XkZi\NRחp&qR P 1gjL2$`"^.V $Tl>U|soi!eeFEaIb䘆je͊^ 5MMǎi"ZNM|V32^}upi%˂"?{|\S:|?l2lns''O9-;9 V35Mje-i .2ʯ}0{Le0l5XȒjnmmD;;;uU  !%gK ugbאum$%sƲӢZ ^^cUJUUɐ~ƭ7_x,( dL #5j|7V!!١pvvzՃGA{=讨g5@XPĔ"QeQܽ lr~Al;$/2;ڿOt4v7ۚay]"􍷾izYU+0f[W]?~"$fGu{X?}dv׉b^~z^ ^I,jj5Z \dy1"SUP?ltM*J@iT0D0ACUz|tk}cFz>V2ghN CX1l0M]] Jp&%pi//ρA!pVmE7) dF?([𚭚 ۴׷:'or^j:,ꪨl]8 r.a]USuYn+hy p]LtIR$IUWLJ4m˂B$8Wtⷺf@b]\\*E)ah2t"OJ0|C`kVG.cBUWƭvG5}oc GǏ=HҴs28bDTES i7:i4㨈##)&j@^=~x_y[;{>VH]0˽t@2!f9A MtMǫ0ZWTr!"h:!^˴A#PՍ<Ŀ^:h6ת)sFk_~_|:BXUr]s ʠJ Yq0@\Iifԍgj4s_y㻢.k/NgOO!AN#Xߺ{q9UZ5)(9,j4ݱLt2 ]R%KjIB $gӢ, ݲ]\7Zu9GG~xnXۜMYV^zksi92%y^&EͥTdejYq 4`5Fӳ q]smֵ Hnn%YrzzWeW+/փEUu^f+bXii9V"uU{g9\\p!e^.3,N‹JE j޾³wL _(+igeMW1lK^ĸα"fc{ׯ|2&HPVYi^I!uݲRk[52V27pnxo!0 =V8I M9ʼu:tTdq%Ln"E*j]eͽފT|h=U ~QUIE. UyWwwZpl' fkڿރ~DWQDY2W< W?=GO ÌhF%e.MZ ϱӪ/BtUm2 b׶MBQsJ !BMBp  !1hiM.ep2_!4utuKs8Άcu77Y˯,rKhؾʸ G0 [j!͔^SIJ@ӈR$Z8^W$BV,,ʶwn~[~Vlu;\=uTL(* J (O76v$q-U"KR۶ ]tjx6WT0$e9χgd5E鯛Aᴯ߸usoϾ6[FeIO/D'Q&뭷uͣ5b6(2q76ZV4CZ=7L1mke)ZQNt]7,DJVՖm Y)Ċ؊noÆ\>}t_M)1V R`>ou/!B %iymZ"Nⓣ8NtMڶeA͠Xrt3[GGE1ݻG:0L8,H``뺆7"*'^S5*Ɨͭe?yzԙK4-w܉DWNuvv=6P1@nB! Nsן{Hի*FB |nI_ /OO`DWV _|VTEdeyW~?Ot;-m"QxƫzAYԬ.nP` Amߛ ϓ(fV "6ϳ$]CML%4M}//.~?{̱vnKx-!eL7(CM]7Mu5t 5[fZsAt \t]nR"(,|^2F(;"M!el4o7wnV6ҒDiՍB7-LHV !UN̴ i-Q=fk椐Xsp 0E&y}Ӌ'+[g6ylVاV 0`{g? {m-1Ŭ  nà,kmlk^6]ۊ1,~?,E||`c7>=_^Ue)Vi;8nh<9QJ+2G}'}oewX5ȋ9A Z v(uu- 7ڮD3FN$֫ep "8WcECX۬l2iۉ|Bӝs ңx=ܽ\t`cGǧu[onte>&sGHN? ͍>.!^*-Q_y @h wcʙa@m]ueޔ.8nrCn F$饮`ۦmQYZ+}r7/fө˯xʪTnyj_/Ius1R7Z|6>}|@o-E9l_]aF<:k,&` ㇭^Wh?>֫VȨ~:SBضm}tMFyB d1y[w^Z5iY7oΘjX{a0~:ؐZ:qF2]h庬>}jʜ_OO={MWmq/{ LR_Gq<_ F+ ݔJHp^Pu]]خI~'c]v Q* X  Wq75{|4"íN[̑^Yu'M]FuѬV˳s/$qGG4z> 0S .$ZA/D˫Fvn^Na(v:yN'e^xAMw&@blJ6cr%.5@HIx%M' eaN1Z!?4Ju붔]1Limuٺؿq^{O_&ioʺ"iߍ/NE}Эk$^g$I`:.KD9Bpuu}x>Oha/@bc4uND[[}b1}q" 2/DDCSMdYԽkE\?p>VeoA70Bw)/lp1EF1pXH%Cmb/.f2+*V'G?zZR F0TyW]¡0&mHt-ed2?7}PXcR`(Ez+Z捛qH rƓG[' Fdb4͗r2 /ZLtڹubZͯ|)[E0NGӣgS~;^$zE\#fb*mJd'N}Oo5ʲQ]Y/ƶ.kшR/ouuӏ.N<].i/)k??b͖^Qv`0v|7rPJcXhK5D1 aI#T SE#:("(Q@uaíNBABUr:76vo_Ɯ4bhtZD1~,XfA"`ʊt1=_׋s now_x9 N"!& "p{RgO:~ 0QϡF8 $"Zrp\UpYV˪N.ձ w??J{C aic1a!;?_7 geQ6CL6(1aqo(^,VBvx2-;7n߽u(M7\J[1wwvw &]a1dl9iʶ&,[U/WhL=~]يXX1K R0<맱Sz :wv{['}0 6!N5am40s!BPV5#x^^'uԥu*_߸}čGNh!{vr~7~W?ye;nuꍽm#Y!fW,(ǫ,/Unvm#U)}[_xq_+w_z:@kut R f̃{ IDAT"Q[_|0|2>5(v'@IH?ۿ~sJ($;t'Q̖h8DܺuG7N}ARj~nbog(ӣ'|cﺒzlt{zF |B/eAog'9°]Qw| <~$7^ ὏=c ӓN^mBUtcs42PChQZ Y$M h:=9Dڦqs̗O|7YΦK ۭ~1-n\r UN%s b~Yԥ"H51aY%n\BukXh48t`MHhK[`zˇO벾fˬuHw_D^B8A2'b¶]RQPJ3J #b @6UW褐ZJ EZ\k !H|:|jY̦[ÞQt2߽vs~9e.X >;;隬3Ԓ`غq΀R@nc\CXc aVEbeU?<.VyYhl*(?|ۿ QwɕCe1dE_︎nh4/fWgǎi/d6>_gR/JYڿ֏€c/9ш9.T]FvmS.lwz> 9P*+b,hbM0h\t7GӖ> 0θȉVU[zm)j>JlmVxJP7m(j ]~tbINjbx7 77wQ^qߋb?CFW]Sϫb9[W bH 3w I.<quGi=Fio5xzxɰ7^JP9N/\B*;X$d9Q44:fW.jUa?~A0\DAd#Ț|=)]A j%dWa,0Aϼ rdzeu0ªf2- kvw8q}#~1 _.8e@=)e,ytc'm'UE!<([,nN]E%qCq]-!`-0M1 k\M4r:;(]ҋa]~7a^G1Yղ͗z~xlʔc?8q[f%bDm%:񑨋*[h]̍{x~Q/I^P {.vZ۷R1ƝttIɋ{GGEQTA߿q'߾vǏӍp8L>㎔2ˊj}v|Rl9r!$gi"eYgyZa j"NNjƭۍioh!y߾tE%;|1>sJQN14] +;%uβ]GacF'Su+ՅM|1(g~o\վI95֔MgZ/|Zz8. x(Xk)JkkL<|@hX@! 3m,2ʊ#Q0_4 !?qDJ0#̃EnP[Mϻ2;?y&D;h@bba`dS ./N߸4X/5k.4]N+ "7vF*ݝMe|c!SOnވ%J՚:lq^_jU*\i^PeKV٪ǃf6s!,<JI[{r<zU^ʦ }: t"KmclF';< Fڈ̚jn1p>HᛯU+e\PkvwӴ8p EӮ$ˊ[w_(v=]^e4vFlU:(Yڦ ƑLC&PSRQV,NeSQ$!cDxiu( 9ee17 б]-V %!\(jrU!F[76bDZxѳ'O=Nz'?ӫa$AKT[b4TMxs< |Xv.\S)o}y->y^6CQhmFw[,([{IueSf -Ym(##uZ.|lWUY4M$aK:-œ"1Ms8'B)@*omB*[,{x=ĸa Z%w G8[L>k IT ѵ ) Q;^€şI/;wfTP4FAzAGeSյӆp? `T \E'1ƍmEչr:n넅{1ce8%`cTZ 1o\1Bf뵶v6Mʶ[#?Hs|EN!sr'Jx]ƨZUUeaiF'셽^tl~(UKz܋ a 0aĿGLΦ?ǟ};>Z+CDM#\/Zb_FW2'H~/޹vTq\.h4L{a(K;7,&cQq0Ͽ݃hDG''q!,s(f8"~J 8n4^~Qʼ itwO]__ۿGUI葶U92ZcEdUÿglƷ~ApiwmG+˂:ZDoʡ̈& ־Y}_nؽ .cm"ˉB=? 9'#Ǐۦǽ NjrkbL0uݹy.g-'`zz!7_%yQm A1s.k_u(Ƴ F X;!c6Zk!T?g>Ob6>+ ۿDNtZkm2ˍ֜ۛ ^y(Ohynu8n4ӢheQUAaEg`f:~ (i%E'8%WWm+%bby+op-}]h#f5_{z@ynC\ԕ]b)B-ʈZ)EY=]t7Qdq#鏮|,ʮk]4jjm413e`@”J`URtƨ(L>2_alzDe#/ƺ-zr"gi(u]mlD^m;˜zѲ((mQ?~ჭMKp{ `)2ƴ#7ˋg`xN'|O{آ"FV Xj<:A=eSuWA-) h$J42_֯ϿJ4>ggW:Ɔym]bݸ!B(e1cZ-uSwMzګ" \h1P^o7?VG~oaQl[kez\(l1dd[ %D%! D.糦0&,N8aʣv\B8$bdE#cz嫶( |N9ַ~%Ǐ=y0C:Bʳ]6 "uH0Jhj!)N<\N'Z,|9>u8VA@^V5ء },[_]M5M]R h0Z%(m#´1B긞seUVdo˹".4b<\N?Dd5۶*J19AQy!>=v~St{7ag 3Nӵ5Z6brT ZbL2%+ UN:3`! bu[e[+nn'qZkZh4T]ϵʠbX<<>;mrǍp|uII2 ::c+̍1na6&m@Օs(Z[st0̋Q0MF[7"qǭ@ۉN?V6\^>߼?}kR7ođ?9?E@XbRZTUvuV-˦X)1趩Kl+gOkƗa:$0R@VN4)FrA#CHlQ܋(AuRa00@p\vmlA4Ŕ~. eQ?JCik߉G2D^2/K!FP_SBxoZO׫ v M\5/ Uaw8om̥pc2(FCsW>6;7t轓s *_zrMH]\75PG \`59 #Khr0*[|zHe!„~eS~~/yko@USʶZ-IȺah!, rQuW78eVuoEmžB7%?gl\s;/sUݔJ+@A6=[O.:7F+W=QJQDmclmUQABvMxyUVnp1zx:Rʶx IXjѶ? i2y闰- r=^uK0:9=%˜@HrO⺭NfSնm\KG;~߃b>okcQV)Q !hvqښq1V#`1Bu5#VNS "6_=H`?/^"-=gZ[pc?i[㺎1*U^1n;?!@IDAT:}U#Odgdqsc r€2(Q,Ύ$6 vql Oe (c;>n}?|rhe JmPm(99;9:TJv ~qgقl|9|/I<3@XcD :h<~r-%8_7Aڏ?N89~ږuWW7GQSmMڵl +!Ȋ (r]m֋f} d~/]]!1eRZ/wM+R&|ݔj.j܃Ha'0yEWz}ڬ+gKhoϻa:߻Օ޽q# uy6'"˹YV˺, !sEزȲ$^ tߗm|2^NB{DcxVm [ 1OS`cS;{jv~uj%(v}b-dIg p a 2V$#L5Zʎ2JDwwi<ǽx0^` A!hlV,'[ F֘ ;֭[o}/7_z*_G Ҩ74j' un^M.bV$tlыl F"p1ִm+D?яWYnؾ~{ F"s r9޶EUeFt?Pݸ( >TrwkW Y5j2>|p>|UY8~ k2_Ž8/0J",sD2bvjkU26荢VQrjeͬ^ ؍SƠ1Zt0C͡0sqK%0r\?IyEA2 ^ b.az`c0z ɦaEB!gyN]/ pwssKX8X-tz~Z,&?r1L7_0' * @package Imlib * @access public */ class ImlibColorRange extends ImlibCliprect { /** * Resource id# of the current color range * * @access private */ var $cr; /** * Resource id# of the image to draw on * * @access private */ var $im; /** * ImlibColorRange constructor * * @access public */ function ImlibColorRange() { $this->cr = 0; $this->im = 0; } /** * Add a color to the color range at distance $x. * * A distance of 0 will center it between the previous color and the end. * $x is ignored for the first color. * * @param int Distance from the previous color * @param int Red * @param int Blue * @param int Green * @param int Alpha * @access public */ function add_color($x,$r,$g,$b,$a) { if (!is_resource($this->cr)) return false; imlib_add_color_to_color_range($this->cr,$x,$r,$g,$b,$a); } /** * Add a color to the color range at distance $x. * * A distance of 0 will center it between the previous color and the end. * $x is ignored for the first color. * * @param int Distance from the previous color * @param array Color array (r,g,b,a) * @access public */ function add_color_array($x,$arr) { list($r,$g,$b,$a) = $arr; $this->add_color($x,$r,$g,$b,$a); } /** * Create a new color range * * @return int Resource id# of the new color range * @access public */ function create() { if (is_resource($this->cr)) return false; return $this->cr = imlib_create_color_range(); } /** * Free the current color range * * @access public */ function free() { if (!is_resource($this->cr)) return false; imlib_free_color_range($this->cr); unset($this->cr); } /** * Fill the current image with a rectangle using the current color range * * The color range will be filled in the specified box at angle $angle * * @param int Upper-left X coordinate of the box * @param int Upper-left Y coordinate of the box * @param int Width of the box * @param int Height of the box * @param int Angle to rotate the color range (degrees) * @access public */ function fill_rectangle($x,$y,$w,$h,$angle) { if (!is_resource($this->im) || !is_resource($this->cr)) return false; if ($this->cliprect_inuse) return imlib_image_fill_color_range_rectangle($this->im,$this->cr, $x,$y,$w,$h,$angle,$this->get_cliprect_array()); else return imlib_image_fill_color_range_rectangle($this->im,$this->cr, $x,$y,$w,$h,$angle); } /** * Set the image to draw the color range on * * @param int Resource id# of the image * @access public */ function set_image($im) { if (is_resource($im)) $this->im = $im; } }; ?> php-imlib-0.7/docs/class.ImlibDraw.php0000644000175000017500000000706407226666061017322 0ustar vorlonvorlon * @package Imlib * @access public */ class ImlibDraw extends ImlibCliprect { /** * Resource id# of the image to draw on * * @access private */ var $im; /** * ImlibDraw constructor * * @access public */ function ImlibDraw() { $this->cliprect = 0; $this->cliprect_inuse = 0; $this->color = 0; $this->im = 0; } /** * Callback for drawing everything * * Since all the drawing functions work the same way, this function * does all the work. It takes four ints, often x,y,w,h, and passes * them to the specified function. * * @param int First param * @param int Second param * @param int Third param * @param int Fourth param * @param string The name of the function to call * @return bool False if no image is set yet * @access private */ function _draw_something($x,$y,$w,$h,$cb) { if (!is_resource($this->im)) return false; if (!$this->get_color($r,$g,$b,$a)) list($r,$g,$b,$a) = Array(255,255,255,255); $cbname = 'imlib_image_' . $cb; if ($this->cliprect_inuse) return $cbname($this->im,$x,$y,$w,$h,$r,$g,$b,$a, $this->get_cliprect_array()); else return $cbname($this->im,$x,$y,$w,$h,$r,$g,$b,$a); } /** * Draw an ellipse * * @param int Center X coordinate * @param int Center Y coordinate * @param int Ellipse horizontal amplitude * @param int Ellipse vertical amplitude * * @return bool False if no image is set yet * @access public */ function draw_ellipse($x,$y,$w,$h) { return $this->_draw_something($x,$y,$w,$h,'draw_ellipse'); } /** * Draw a line * * @param int First X coordinate * @param int First Y coordinate * @param int Second X coordinate * @param int Second Y coordinate * * @return bool False if no image is set yet * @access public */ function draw_line($x1,$y1,$x2,$y2) { return $this->_draw_something($x1,$y1,$x2,$y2,'draw_line'); } /** * Draw a rectangle * * @param int Upper left X coordinate * @param int Upper left Y coordinate * @param int Width * @param int Height * * @return bool False if no image is set yet * @access public */ function draw_rectangle($x,$y,$w,$h) { return $this->_draw_something($x,$y,$w,$h,'draw_rectangle'); } /** * Fill an ellipse * * @param int Center X coordinate * @param int Center Y coordinate * @param int Ellipse horizontal amplitude * @param int Ellipse vertical amplitude * * @return bool False if no image is set yet * @access public */ function fill_ellipse($x,$y,$w,$h) { return $this->_draw_something($x,$y,$w,$h,'fill_ellipse'); } /** * Fill a rectangle * * @param int Upper left X coordinate * @param int Upper left Y coordinate * @param int Width * @param int Height * * @return bool False if no image is set yet * @access public */ function fill_rectangle($x,$y,$w,$h) { return $this->_draw_something($x,$y,$w,$h,'fill_rectangle'); } /** * Get the current image resource id# * * @access public */ function get_image() { return $this->im; } /** * Set the image resource id# to draw on * * @param int Image resource id# * @access public */ function set_image($im) { $this->im = $im; } }; ?> php-imlib-0.7/docs/class.ImlibColor.php0000644000175000017500000000336207226666061017500 0ustar vorlonvorlon * @package Imlib * @access public */ class ImlibColor { /** * The array defining the color (r,g,b,a) * * @var array $color * @access private */ var $color; /** * ImlibColor constructor * * @access public */ function ImlibColor() { $this->color = 0; } /** * Get the four color components as by-reference variables * * @param int &$r Red * @param int &$g Blue * @param int &$b Green * @param int &$a Alpha * @return mixed False if a color isn't set, the color array otherwise * @access public */ function get_color(&$r,&$g,&$b,&$a) { if ($this->color) list($r,$g,$b,$a) = $this->color; else return false; return $this->color; } /** * Get the color array currently defined, if it is defined * * @return mixed False if a color isn't set, the color array otherwise * @access public */ function get_color_array() { if (!$this->color) return false; return $this->color; } /** * Set the current color using the four components * * @param int Red * @param int Blue * @param int Green * @param int Alpha * @access public */ function set_color($r,$g,$b,$a) { $this->color = Array($r,$g,$b,$a); } /** * Set the current color using an array of 4 elements (r,g,b,a) * * @param array Color array * @access public */ function set_color_array($arr) { $this->color = $arr; } }; ?> php-imlib-0.7/docs/class.ImlibCliprect.php0000644000175000017500000000555707226666061020177 0ustar vorlonvorlon * @package Imlib * @access public */ class ImlibCliprect extends ImlibColor { /** * The array defining the cliprect (x,y,w,h) * * @var array $cliprect * @access private */ var $cliprect; /** * A boolean that determines if a cliprect is in use or not * * @var bool $cliprect_inuse */ var $cliprect_inuse; /** * ImlibCliprect constructor * * @access public */ function ImlibCliprect() { $this->cliprect_inuse = 0; } /** * Get the four values of the cliprect * * @param int Upper left X coordinate to clip from * @param int Upper left Y coordinate to clip from * @param int Width of the cliprect * @param int Height of the cliprect * @access public * @see set_cliprect() */ function get_cliprect(&$x,&$y,&$w,&$h) { list($x,$y,$w,$h) = $this->cliprect; } /** * Get the array that defines the cliprect (x,y,w,h) * * @return array Array defining the clipping rectangle * @access public * @see set_cliprect_array() */ function get_cliprect_array() { return $this->cliprect; } /** * Get the boolean that determines if a cliprect is in use or not * * @return bool True if the cliprect is in use * @access public * @see set_cliprect_inuse() */ function get_cliprect_inuse() { return $this->cliprect_inuse; } /** * Set the four values of the cliprect. 0 for X disables the cliprect. * * @param int Upper left X coordinate to clip from * @param int Upper left Y coordinate to clip from * @param int Width of the cliprect * @param int Height of the cliprect * @access public * @see get_cliprect() */ function set_cliprect($x,$y,$w,$h) { if ($x == 0) { $this->cliprect = 0; $this->cliprect_inuse = 0; return; } $this->cliprect_inuse = 1; $this->cliprect = Array($x,$y,$w,$h); } /** * Set the array that defines the cliprect (x,y,w,h) * * @param array Array that defines the cliprect * @access public * @see get_cliprect_array() */ function set_cliprect_array($arr) { if ($arr[0] == 0) { $this->cliprect = 0; $this->cliprect_inuse = 0; return; } $this->cliprect_inuse = 1; $this->cliprect = $arr; } /** * Set the boolean that determines if the cliprect is in use * * @param bool True to enable, false to disable * @access public * @see get_cliprect_inuse() */ function set_cliprect_inuse($set) { $this->cliprect_inuse = $set; } }; ?> php-imlib-0.7/docs/class.ImlibImage.php0000644000175000017500000002401607227015673017441 0ustar vorlonvorlon * @package Imlib * @access public */ class ImlibImage { /** * The image resource id# * * @var integer $id * @see create(), get_id() * @access private */ var $id; /** * ImlibImage constructor * * @access public */ function ImlibImage() { $this->id = 0; } /** * Callback for functions which query the current instance's attributes * * @param string The name of the function to call * @return mixed String or int * @access private */ function _get_cb($cb) { if (!is_resource($this->id)) return false; $cbname = 'imlib_image_' . $cb; return $cbname($this->id); } /** * Callback for functions which flip or tile the current instance * * @param string The name of the function to call * @access private */ function _no_param_cb($cb) { if (!is_resource($this->id)) return false; $cbname = 'imlib_image_' . $cb; return $cbname($this->id); } /** * Blend a region of the current image onto the region of another ImlibImage * * @param int Resource id# of the destination image * @param bool Merge alpha * @param int Upper left source X coordinate * @param int Upper left source Y coordinate * @param int Source width * @param int Source height * @param int Upper left destination X coordinate * @param int Upper left destination Y coordinate * @param int Destination width * @param int Destination height * @param bool Dither * @param bool Blend * @param bool Alias * @access public */ function blend_onto_image($dst,$alpha,$sx,$sy,$sw,$sh,$dx,$dy,$dw,$dh, $dither,$blend,$alias) { if (!is_resource($this->id) || !is_resource($dst)) return false; imlib_blend_image_onto_image($dst,$this->id,$alpha,$sx,$sy,$sw,$sh, $dx,$dy,$dw,$dh,$dither,$blend,$alias); } /** * Blur an image with a given blur radius * * @param int Blur radius * @access public */ function blur($r) { imlib_image_blur($this->id,$r); } /** * Create a clone of the current instance, return a new ImlibImage * * @return object ImlibImage * @access public */ function create_clone() { if (!is_resource($this->id)) return false; $clone = new ImlibImage(); $clone->id = imlib_clone_image($this->id); return $clone; } /** * Create a cropped ImlibImage from a region of the current instance, return a new ImlibImage * * @param int Upper left X coordinate to crop from * @param int Upper left Y coordinate to crop from * @param int Width to crop * @param int Height to crop * @return object ImlibImage * @access public */ function create_cropped($sx,$sy,$sw,$sh) { if (!is_resource($this->id)) return false; $crop = new ImlibImage(); $crop->id = imlib_create_cropped_image($this->id,$sx,$sy,$sw,$sh); return $crop; } /** * Create a cropped, scaled ImlibImage from a region of the current instance, return a new ImlibImage * * @param int Upper left X coordinate to crop from * @param int Upper left Y coordinate to crop from * @param int Width to crop * @param int Height to crop * @param int Width to scale the cropped region to * @param int Height to scale the cropped region to * @return object ImlibImage * @access public */ function create_cropped_scaled($sx,$sy,$sw,$sh,$dw,$dh) { if (!is_resource($this->id)) return false; $thumb = new ImlibImage(); $thumb->id = imlib_create_cropped_scaled_image($this->id, $sx,$sy,$sw,$sh, $dw,$dh); return $thumb; } /** * Create an image resource to use with this instance * * @param int Width of the image * @param int Height of the image * @return int Resource id# that was created * @access public * @see get_id(), $id */ function create($width,$height) { if (is_resource($this->id)) return false; return $this->id = imlib_create_image($width,$height); } /** * Create a rotated ImlibImage, return a new ImlibImage * * If radians is specified, degrees will be ignored. * * @param float Angle to rotate the image * @param float Radians to rotate the image * @return object ImlibImage * @access public */ function create_rotated($degrees,$radians=0.0) { if (!is_resource($this->id)) return false; if ($radians) $num = $radians; else $num = $degrees; $rotated = new ImlibImage(); $rotated->id = imlib_create_rotated_image($this->id,$num); return $rotated; } /** * Create a scaled ImlibImage, return a new ImlibImage * * If $height is not specified, it will be calculated from the dimensions * of the current image, so that the aspect ratio is preserved. * * @param integer Width to scale the new image to * @param integer Height to scale the new image to (Optional) * @return object ImlibImage * @access public */ function create_scaled($width,$height=0) { if (!is_resource($this->id)) return false; $scaled = new ImlibImage(); $scaled->id = imlib_create_scaled_image($this->id,$width,$height); return $scaled; } /** * Output the raw image data of the current instance to stdout * * @param integer Quality or compression level to use * @access public */ function dump($quality=75) { if (!is_resource($this->id)) return false; if (!imlib_dump_image($this->id,&$err,$quality)) return false; else return true; } /** * Flip the current image diagonally * * @access public */ function flip_diagonal() { return $this->_no_param_cb('flip_diagonal'); } /** * Flip the current image horizontally * * @access public */ function flip_horizontal() { return $this->_no_param_cb('flip_horizontal'); } /** * Flip the current image vertically * * @access public */ function flip_vertical() { return $this->_no_param_cb('flip_vertical'); } /** * Free the current instance and image resource * * @access public */ function free() { if (!is_resource($this->id)) return false; imlib_free_image($this->id); $this->id = 0; } /** * Get the current filename, if it's set * * @return mixed Filename string or false. * @access public */ function get_filename() { return $this->_get_cb('get_filename'); } /** * Get the current image format. The default is png. * * @return string Image format * @access public */ function get_format() { return $this->_get_cb('format'); } /** * Get the current image's height * * @return integer Image height * @access public */ function get_height() { return $this->_get_cb('get_height'); } /** * Get the current image's resource id# * * @return integer Current resource id# * @access public * @see $id, create() */ function get_id() { return $this->id; } /** * Get the current image's width * * @return integer Image width * @access public */ function get_width() { return $this->_get_cb('get_width'); } /** * Check if the image has an alpha channel * * @return boolean * @access public */ function has_alpha() { if (!is_resource($this->id)) return false; return imlib_image_has_alpha($this->id); } /** * Set the alpha channel of an image * * @param int The alpha level to set for the image * @access public */ function modify_alpha($alpha) { if (!is_resource($this->id)) return false; imlib_image_modify_alpha($this->id,$alpha); } /** * Load an image file into the current instance * * @param string Filename * @param integer Load error number. 0 for no error. * @return integer Resource id# or false if load failed * @access public */ function load($infile,$err=0) { if (is_resource($this->id)) return false; $this->id = imlib_load_image_with_error_return($infile,&$err); if (!is_resource($this->id) || $err) return false; else return true; } /** * Save the current instance to a file * * @param string Filename * @param integer Quality or compression level to use * @return bool False if the save failed * @access public */ function save($outfile,$quality=75) { if (!is_resource($this->id)) return false; if (!imlib_save_image($this->id,$outfile,&$err,$quality)) return false; else return true; } /** * Set the image format for the current instance * * @param string File format * @access public */ function set_format($format) { if (!is_resource($this->id)) return false; return imlib_image_set_format($this->id,$format); } /** * Sharpen an image with a given sharpen radius * * @param int Sharpen radius * @access public */ function sharpen($r) { imlib_image_sharpen($this->id,$r); } /** * Seamlessly tile the current image both horizontally and vertically * * @access public */ function tile() { return $this->_no_param_cb('tile'); } /** * Seamlessly tile the current image horizontally * * @access public */ function tile_horizontal() { return $this->_no_param_cb('tile_horizontal'); } /** * Seamlessly tile the current image vertically * * @access public */ function tile_vertical() { return $this->_no_param_cb('tile_vertical'); } }; ?> php-imlib-0.7/docs/class.ImlibPoly.php0000644000175000017500000001030707226666061017342 0ustar vorlonvorlon * @package Imlib * @access public */ class ImlibPoly extends ImlibCliprect { /** * Resource id# of the image to draw on * * @access private */ var $im; /** * The resource id# of the current polygon * * @access private */ var $poly; /** * ImlibPoly constructor * * @access public */ function ImlibPoly() { $this->cliprect = 0; $this->cliprect_inuse = 0; $this->color = 0; $this->im = 0; $this->poly = 0; } /** * Add a point to the current polygon * * @param int X coordinate * @param int Y coordinate * @return bool False if there is no polygon set * @access public */ function add_point($x,$y) { if (!is_resource($this->poly)) return false; imlib_polygon_add_point($this->poly,$x,$y); } /** * Checks if the current polygon contains a given point * * @param int X coordinate * @param int Y coordinate * @return bool True if it does, false otherwise * @access public */ function contains_point($x,$y) { if (!is_resource($this->poly)) return false; return imlib_polygon_contains_point($this->poly,$x,$y); } /** * Draw the current polygon on the current image * * @param integer If true, the polygon will be drawn with the endpoints connected * @return bool False if there is no polygon or image set * @access public */ function draw($closed=1) { if (!is_resource($this->im) || !is_resource($this->poly)) return false; if (!$this->get_color($r,$g,$b,$a)) list($r,$g,$b,$a) = Array(255,255,255,255); if ($this->cliprect_inuse) imlib_image_draw_polygon($this->im,$this->poly,$closed,$r,$g,$b,$a, $this->get_cliprect_array()); else imlib_image_draw_polygon($this->im,$this->poly,$closed,$r,$g,$b,$a); } /** * Fill the current polygon on the current image * * @return bool False if there is no polygon or image set * @access public */ function fill() { if (!is_resource($this->im) || !is_resource($this->poly)) return false; if (!$this->get_color($r,$g,$b,$a)) list($r,$g,$b,$a) = Array(255,255,255,255); if ($this->cliprect_inuse) imlib_image_fill_polygon($this->im,$this->poly,$r,$g,$b,$a, $this->get_cliprect_array()); else imlib_image_fill_polygon($this->im,$this->poly,$r,$g,$b,$a); } /** * Free the current polygon * * @return bool False if there is no polygon or image set * @access public */ function free() { if (!is_resource($this->poly)) return false; imlib_polygon_free($this->poly); $this->poly = 0; } /** * Get the bounds of the polygon * * @param int Upper left X coordinate * @param int Upper left Y coordinate * @param int Lower right X coordinate * @param int Lower right Y coordinate * @return bool False if there is no polygon or image set * @access public */ function get_bounds(&$x1,&$y1,&$x2,&$y2) { if (!is_resource($this->poly)) return false; imlib_polygon_get_bounds($this->poly,&$x1,&$y1,&$x2,&$y2); } /** * Get the current image resource id# * * @return int Current image resource id# * @access public */ function get_image() { return $this->im; } /** * Create a new polygon * * @return int Resource id# of the new polygon * @access public */ function new_poly() { if (is_resource($this->poly)) return false; return $this->poly = imlib_polygon_new(); } /** * Set the image resource id# to draw on * * @param int Image resource id# * @access public */ function set_image($im) { $this->im = $im; } }; ?> php-imlib-0.7/docs/class.ImlibText.php0000644000175000017500000000621307226666061017344 0ustar vorlonvorlon * @package Imlib * @access public */ class ImlibText extends ImlibColor { /** * Resource id# of the currently loaded font * * @access private */ var $fnt; /** * Resource id# of the image to draw on * * @access private */ var $im; /** * ImlibText constructor * * @access public */ function ImlibText() { $this->fnt = 0; $this->im = 0; } /** * Draw a text string onto the current image * * @param int X coordinate of the upper left corner of the string * @param int Y coordinate of the upper left corner of the string * @param string Text string to draw * @param int Direction of the text * @return bool False if no font is loaded * @access public */ function draw($x,$y,$str,$dir=IMLIB_TEXT_TO_RIGHT) { if (!is_resource($this->fnt) || !is_resource($this->im)) return false; // If we don't have a color set yet, we'll default to white if (!$this->get_color($r,$g,$b,$a)) list($r,$g,$b,$a) = Array(255,255,255,255); return imlib_text_draw($this->im,$this->fnt,$x,$y,$str,$dir, $r,$g,$b,$a); } /** * Free the currently loaded font * * @return bool False if no font is loaded * @access public */ function free() { if (!is_resource($this->fnt)) return false; imlib_free_font($this->fnt); $this->fnt = 0; } /** * Get the current image resource id# * * @return integer Image resource id# * @access public */ function get_image() { return $this->im; } /** * Get the width and height of a given string if it were drawn * * @param string String to measure * @param int &$w Width the string would be * @param int &$h Height the string would be * @param int Direction to measure the string * @return bool False if no font is loaded * @access public */ function get_size($str,&$w,&$h,$dir=IMLIB_TEXT_TO_RIGHT) { if (!is_resource($this->fnt)) return false; return imlib_get_text_size($this->fnt,$str,&$fw,&$fh,$dir); } /** * Load a font * * If the font is in the font path, it can be referred to by font name, * and the path does not need to be specified. Otherwise, it must be * referred to by filename. * * @param string Path, or current directory if passed blank * @param string Font name * @param int Font size * @return bool False if no font is loaded * @access public */ function load($path,$font,$size) { $fontdata = ''; if (is_resource($this->fnt)) return false; if ($path) $fontdata = $path; $fontdata .= $font . '/' . $size; return $this->fnt = imlib_load_font($fontdata); } /** * Set the image resource id# to draw on * * @param int Image resource id# * @access public */ function set_image($im) { $this->im = $im; } }; ?> php-imlib-0.7/docs/package.Imlib.php0000644000175000017500000000037607227023642016762 0ustar vorlonvorlon php-imlib-0.7/web/0000755000175000017500000000000010643376336013451 5ustar vorlonvorlonphp-imlib-0.7/web/class.ImlibImage.txt0000644000175000017500000002150107177473074017321 0ustar vorlonvorlon */ class ImlibImage { /** * The image resource id# * * @var int $id * @see create(), get_id() * @access private */ var $id; /** * ImlibImage constructor * * @access public */ function ImlibImage() { $this->id = 0; } /** * Callback for functions which query the current instance's attributes * * @param string The name of the function to call * @return mixed String or int * @access private */ function _get_cb($cb) { if (!is_resource($this->id)) return false; $cbname = 'imlib_image_' . $cb; return $cbname($this->id); } /** * Callback for functions which flip or tile the current instance * * @param string The name of the function to call * @access private */ function _no_param_cb($cb) { if (!is_resource($this->id)) return false; $cbname = 'imlib_image_' . $cb; return $cbname($this->id); } /** * Blend a region of the current image onto the region of another ImlibImage * * @param int Resource id# of the destination image * @param bool Merge alpha * @param int Upper left source X coordinate * @param int Upper left source Y coordinate * @param int Source width * @param int Source height * @param int Upper left destination X coordinate * @param int Upper left destination Y coordinate * @param int Destination width * @param int Destination height * @param bool Dither * @param bool Blend * @param bool Alias * @access public */ function blend_onto_image($dst,$alpha,$sx,$sy,$sw,$sh,$dx,$dy,$dw,$dh, $dither,$blend,$alias) { if (!is_resource($this->id) || !is_resource($dst)) return false; imlib_blend_image_onto_image($dst,$this->id,$alpha,$sx,$sy,$sw,$sh, $dx,$dy,$dw,$dh,$dither,$blend,$alias); } /** * Create a clone of the current instance, return a new ImlibImage * * @return object ImlibImage * @access public */ function create_clone() { if (!is_resource($this->id)) return false; $clone = new ImlibImage(); $clone->id = imlib_clone_image($this->id); return $clone; } /** * Create a cropped ImlibImage from a region of the current instance, return a new ImlibImage * * @param int Upper left X coordinate to crop from * @param int Upper left Y coordinate to crop from * @param int Width to crop * @param int Height to crop * @return object ImlibImage * @access public */ function create_cropped($sx,$sy,$sw,$sh) { if (!is_resource($this->id)) return false; $crop = new ImlibImage(); $crop->id = imlib_create_cropped_image($this->id,$sx,$sy,$sw,$sh); return $crop; } /** * Create a cropped, scaled ImlibImage from a region of the current instance, return a new ImlibImage * * @param int Upper left X coordinate to crop from * @param int Upper left Y coordinate to crop from * @param int Width to crop * @param int Height to crop * @param int Width to scale the cropped region to * @param int Height to scale the cropped region to * @return object ImlibImage * @access public */ function create_cropped_scaled($sx,$sy,$sw,$sh,$dw,$dh) { if (!is_resource($this->id)) return false; $thumb = new ImlibImage(); $thumb->id = imlib_create_cropped_scaled_image($this->id, $sx,$sy,$sw,$sh, $dw,$dh); return $thumb; } /** * Create an image resource to use with this instance * * @param int Width of the image * @param int Height of the image * @return int Resource id# that was created * @access public * @see get_id(), $id */ function create($width,$height) { if (is_resource($this->id)) return false; return $this->id = imlib_create_image($width,$height); } /** * Create a rotated ImlibImage, return a new ImlibImage * * If radians is specified, degrees will be ignored. * * @param float Angle to rotate the image * @param float Radians to rotate the image * @return object ImlibImage * @access public */ function create_rotated($degrees,$radians=0.0) { if (!is_resource($this->id)) return false; if ($radians) $num = $radians; else $num = $degrees; $rotated = new ImlibImage(); $rotated->id = imlib_create_rotated_image($this->id,$num); return $rotated; } /** * Create a scaled ImlibImage, return a new ImlibImage * * If $height is not specified, it will be calculated from the dimensions * of the current image, so that the aspect ratio is preserved. * * @param integer Width to scale the new image to * @param integer Height to scale the new image to (Optional) * @return object ImlibImage * @access public */ function create_scaled($width,$height=0) { if (!is_resource($this->id)) return false; $scaled = new ImlibImage(); $scaled->id = imlib_create_scaled_image($this->id,$width,$height); return $scaled; } /** * Output the raw image data of the current instance to stdout * * @access public */ function dump() { if (!is_resource($this->id)) return false; return imlib_dump_image($this->id); } /** * Flip the current image diagonally * * @access public */ function flip_diagonal() { return $this->_no_param_cb('flip_diagonal'); } /** * Flip the current image horizontally * * @access public */ function flip_horizontal() { return $this->_no_param_cb('flip_horizontal'); } /** * Flip the current image vertically * * @access public */ function flip_vertical() { return $this->_no_param_cb('flip_vertical'); } /** * Free the current instance and image resource * * @access public */ function free() { if (!is_resource($this->id)) return false; imlib_free_image($this->id); $this->id = 0; } /** * Get the current filename, if it's set * * @return mixed Filename string or false. * @access public */ function get_filename() { return $this->_get_cb('get_filename'); } /** * Get the current image format. The default is png. * * @return string Image format * @access public */ function get_format() { return $this->_get_cb('format'); } /** * Get the current image's height * * @return int Image height * @access public */ function get_height() { return $this->_get_cb('get_height'); } /** * Get the current image's resource id# * * @return int Current resource id# * @access public * @see $id, create() */ function get_id() { return $this->id; } /** * Get the current image's width * * @return int Image width * @access public */ function get_width() { return $this->_get_cb('get_width'); } /** * Load an image file into the current instance * * @param string Filename * @param int Load error number. 0 for no error. * @return int Resource id# or false if load failed * @access public */ function load($infile,&$err) { if (is_resource($this->id)) return false; $this->id = imlib_load_image_with_error_return($infile,&$err); if (!is_resource($this->id) || $err) return false; } /** * Save the current instance to a file * * @param string Filename * @return bool False if the save failed * @access public */ function save($outfile) { if (!is_resource($this->id)) return false; $err = imlib_save_image($this->id,$outfile); if ($err) return false; } /** * Set the image format for the current instance * * @param string File format * @access public */ function set_format($format) { if (!is_resource($this->id)) return false; return imlib_image_set_format($this->id,$format); } /** * Seamlessly tile the current image both horizontally and vertically * * @access public */ function tile() { return $this->_no_param_cb('tile'); } /** * Seamlessly tile the current image horizontally * * @access public */ function tile_horizontal() { return $this->_no_param_cb('tile_horizontal'); } /** * Seamlessly tile the current image vertically * * @access public */ function tile_vertical() { return $this->_no_param_cb('tile_vertical'); } }; ?> php-imlib-0.7/web/example.3.png0000644000175000017500000015515607174531665015773 0ustar vorlonvorlonPNG  IHDR"XsBITO IDATxsdy'xed&\*JDJjɖ%YnBv艘agjZ)Q)EVU}K r_~=@@(g7|?:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃:蠃Yۿ󋡿^١9`tAꠃ>7 (< EJm,_,nwɲJ f:`ъF'n% 5ן[,BVv@x )jmdX(dT( ND"݋b{} |Q ģXd]@`t{‡%t}L@@me{m390h8w|`aaw{nQ(hĴZ{.~x>T ]]Ar|4ςEJK=JFlؿad@A<2ѿx\H@ r ]!i]P 잛#L @V3yv?u4M EY!i:H(jTknvOLL|#7e0b4hK%IӋfhy}fYI6 3-+m7J(dZ!o?E縆,ÖӦ(e,.w?ܻv0 ;}jΕ߯$G}7HQjV+R-mEӍ@0M hAivm6˪8,ͰjYeIISd7yz\&hW;:z4i`b>VcT&AP$n r霄@iY,Iz<:]s.WU\q mrrl3Mo/.E>PT./-{yeQ|gjjݮ5pff}EeYn/Ek4DQPlf]UZ_رs\V^a-tuuJW7AP>'ho˙/J0^5+b_@޽wo"NjzsajۡpyǥR^'Ip %8nK[/OL"˿6]#Irth76VR(4/\xEH!{:8x~nwXl4s <` o4}cߴ/( |a EQ @WO>ek:͏gjjm}4MafH, VeYemll{ +ѝi&"B?A҇뚦%~ji^,r 3&E=Bm4E}fYi:%0::NkAre?~F6BdH '[]7T*?Y,~ώ{]~80+_!e2$O6 D* l5 C۝sa^wnmMH.DBdl63Ql6ОɣP89b ˚=z [Lv  neY=CDR%i-(^^?;v;.˲x>|e*orPXXX꺑?~QBtzttt(&xj==wLur>˲/?!J%@Tr!cԸ哞D¹)rzz6*2MTչk{{c1 ,JHCiq%Xopx>U* d/8(/a׷<6T0|~hi$A `yYVc̲,R9eƺUL81̰qm@"ya76Nz4mۜAd>^l95U.8*&'u]ru@Ls̲;'h˧jlhY$ ^fb1qaMFKKa$WW'2IQ=<Te)MdY$#_6|+7ndGIX'X q!9jjD[Xef0Pl⿴Z?<&Imun'6[ITBҒhc4](t]F؂*#>bHС?0pbltr'3gr>ɰ,k^Adp.(_Q]zl: ZRvn.W \?^;\Պp_ou_p~n3 ֊ŴÊ ЀTWd>nf30ld^GQd*{{׊GBz(ιbpV;|^=>rUz{K$ʩafs^W].I;|fxaXhl5rN$ ~8 ho}w;8>bYّx%IңBGٜve ҒSLx\0$SԖC `9nV[L[A=0[nh4Oi8MONN˽{zxVW/Q8b_Ӈ4 |[IQVBޱKRW`Z./War|o(& fH<ίJCN\0,aP hfpv6 i l Ќ%;`KLm(áz ǹlzuM8"ԝ$)1%H|$t(GZ_~"QF5-lz$M{$g$!(|=77AVk$Dh[UU=9 g% rAn|㝞ÍXL|F˚Ǐ ~}`O{uEBUM7gR),кFOAi*`olZ^&Ab}_?^cfKYO.GDS8X )]r%9Xi^tyVU1 }Fo)ø$˴Ёt[Y?;CDrpڲlll@y\ ׽^5L1tQhYf>Ktain7$0I$ƅ M: X5(ABmlLxzX/a1,AAQe,xkk\EF^*(\, 2+aZ-H~ swdp|*l_Xi'2 $Z-4F4wz`8|([,-iZ|)%MZfӠ PU^WUL2g7^ziBآ雍[P:Iǡ aysˏ n\oQViO,RӧO*k\w9_?4M5,s !8Arjr217j6'R;TjWfsmUӎ& ⢮뺮#DUUD$I&Ξ MPL[g7c+Y(_bP(jiq196o<0h;! Xl_}OaJPH͖FhWy7 NGuB;?7O3f4'8ia&Ay(D(J's ܜiJe~q mzH-V joCnVU@oxH$:>P=V:}5, HgQU/L_y> Ztz~n |>yzˇFve7n &^_GA8){˲/b%04p~+4UU 2 #&уz͛(* rA})V(HO"#aR4@+JCQ )]\8x$4㸎 ]h MN afX0$I"H}nƍ?~WBOF4 Qywvvji.Ӛ^w (w&'}twY(Ǜ7s)X@OޝKǎ e˾GW._VEu|Viw8 4hàF4 q(DK(M;Z5iNB;Z$:¡1'"Rv(NBS!ΝS.<êrCQ,E@,q ˢfj9}h4Z }q%t ~ =EQR W\=^*'NxWuB(9$j5g_F2$Yvh#H$\YAw@9x՛7'ED]Wx~cc^GjOϏgfdeݟM.@jFhYs&ݐ_ݮV5p S Iҹ.q=DZK"ⰸ,>qm9'<ϛYV7yt "64Ezh4shWjZf3|p k!seYs4MdWU5!3$e&if^nHZD__2e#ڱ+J\;}H8jBb' B|'ȲNOɲwe,,UC; \Axh1ML1u(00L$&IV Iֱx\\6k&0Hz#Gss;rm( x˲a*n.PTQQ޺zlbnh]-4mY֝.f~ϰJ!)ѩ>²1izHUT P~]~rjZuHe--.LLaQA߯iQChXֿ- s`ܽ;7;D'T{UD6uYUUIs1›ø>>o֓wΞ8zԿac eG}|=6 8D"RJA @wOWKKMd nZ,˞uZ _wJz<0I2_*G/9@׫( ,˚_>z.( 햞gX(4Mn YfwPKH-Sގ_*7P_ܸZ_w@tnȓR( =R3gYAvjZao/?` J]HY8uvgūrnBc8 <%q~%E!a|+oݹT?m$(He[/xܩn yWT6eZMZ_t0x ym &nD!; IDAT@q-==tSSOGQhanGvYRPp #ek5KwuHrЩ0r'1Lam”HwP<goMe\#,k2% /RLèV$J  uq@Ikщ\V _?,2,'B$ɰ,29!֏ұlN,  ][]4͹W6HCDFݽu9QVHпG)3X fY Ϗo.K(,YcdEƊ<.Iw#bF`os#s'p$R,AgUUpF4v2?m;@QV79z6^PJMNZ-`,$SGp8H(l~H^כ7Skk4mK 0tٳۺ}<*Alv$(Vyp#n5JQ_=} SYjL%>|"<^.7^Ѡ_,_]XPUH&"Ȼ ^Lx4*!t=k8s۞P=[E Kj2?ዳ/.T.Pq)jҲӒu>iU{d*/q_/6'VOZ}}dYVJ YIDj95Ib[kk_l66:Hꄛ#Ax?Ju߽TXE?Ƥe4(Iv~qq6y·de?E)+4}4>p/ae$n@x,67;to&IWde,sfY IEOmc;S9TmHd {<.AiZS"fQ|~˂3{7GJ:yj%MyV{ =0 !Te4++v(V3[)@$20M?6~Kj5.j0IOLܿwE c1jh0MK p H{zѣ>^ s,VsDQZ/ $IJiڙ3Z,̧;{I9BHCDD{X\Ik55=0˗q.>(c9CnE9e>C;}ٝ*Z% خ 5v>;jq޽@v3dtp#(eyxܙfV/[>6{ N}UQjom`08N;|1,ym{P()i_}VX4=Wj5divĉ^?V%i_/4ήdHhKr^ocG[/oo.qq4Jvf:sT*rޖ|p xX(jZ׋ Gw'fgqXiFv>Y>5薅'A{e|7t]$)Hxرw:`pD.pzz$I"Mӽg'4(U'A&K4h i+zz{XlZއKZ^Q:fS<{^=’ s k'[T٘$IAwŠ(x<$QU,h+x<aGPEQ2/m(dh#r]tf$e`2rq*%5JDzlRqD`ϲ'ԪUDIx\{^pha S+Q0֘4M!,8 ${z{58F|/\u~]]yų øɌuuu"hnjNR$w$ABGAIRb4 Mt?< /дk=P3EQ{ d9Il`~nwn$imЊ,fZ D8;t=roo aI≯Mz?8apa^!Amdž h ߌZNպlv{<_1~JLe" Rx MVxbJeifzi3KύߜvSiɍ KYgnnLȮT*/G=сϨ߿sn@!؝\^>6> ;v39wJ^( xޛ7nJ%|Zʛ&nw\X Ȳ[ò,MӮ̜{,sDv4=ư,bևXxX;31-?`pz˥X]E1ݬP(w=͂8bqHލ|^ Xk_mv(H>[͆vMݡ͞"'OX 6yTl8V.EV>+$IƫheQ <Ө rm#byc~>0?@%Iى !,JQmUF,U=ð I.^~fF}Ļzz`  X iiGv;//r>ǕO%$˟e閅Q4]TKKimZ DZIM,d WUm{(7Hߥdn s aa!W2{['T09եii.v[o$FRA+Qe%pD:Qt;h8hr(k|(JzGga~c[=܌vR7J^]0B!q`'?}Qv7HVf2'OGhڢiznj6v!0FGWV$[p%OM6a&-ݱض'hp$ 76EfYUoByȮr0 4IۂPU+|0VΒCw,6(H,Ql6C/i;"D IRr@.P$.6r6`Y@@GilQnOedPG$3DIrݙtui iV&I4\Vv4}$QE:UU|6Rަ ;{zVB9CS55 vuu] 4Miݑ{W:`ۧR"qjvá zP@K66>Ady8Б8YV;ޞr4Tj띜}9@(Ib%~#2Eg{U{$ sPP HopJ-+_W x (MB[ޗLP@A1,C~.ϳ,KѴiZ UGȰR Xxj>iwwY̌o{IR2[`9v+l3̿w$JkktH,UԻ̰i @Á0, =xF+˃>WUGnߞb\VC r_ZBw?߻Z[fԓu1KN]T* ,jVۅo޹Y0" .0>1uImDzwvf+1WBi1`beLJLfu} psT̹ r)Û( ;А/ΎU,pĸ =wf8`s󇮷6*c_>r0x|h(A}~"8iyDa A=vX(|=NL<:BК~'47`I2v܍bxԩ?\*#ZF)JR{.zxDElϠX"miGl)CGZ' d^?N°Ht2rxm\"Xv: I^8q"wF ڲEeKG<ߗL^EBQEgc?*a{RH4:3WNAz}y^С@\.ip%@Cyzccumiq~?mk5Exi }7A990 3ϲKz:*= L@)%Ϟv0,"<'"&C4RmEQb#GU' IDATsl^'p(vs}ݻf!S|xt2,`n"-.=;8o|rsv\n(|Wx PDŽDw7kf\*qqz(k?O|Vwor.ޖ h76\oߏP BӮpWQ> cl9 !_ޏgiQ$IYJU-.E5[nN_ UUfU,PDxdl.]˻vxgR]2 3ء-I{{1w0LSdb5Iz tDMjr"h eٵZ Y0LEfSU<дX 7VfnZ|Jqr hkZy[\P0 B.PUV(^ d>b[EnUUf$ Skk~A$RD}̙,Ts80Y"ITqqV+-˲$vuu?JEOzWn Yب4q0Lizg08nm|<.T*;e,$IcGZ4M&F EbRwKİk-v>-MCz,EDTs5nOPJ8JQO׽4 kR\_ z j;4ե3 V&֣QFץL.$E L`| Ssv><4qF{tS4ќ&v"v;NtAN쿄Pd"c:s bq߳Sa{{4](4q>r=ꠃC.W^7OTj!)7x ýˆO0,Ui]CX f v##|ts( bTQՙ|G<0X <*T Ͽߪ0'vU8E?Τ3/] ܿ'vA j}}3/W*XOǻUU, 4U,εk4}̙ﱬ7CERi$ѣ.K4g؞!`pO:Ac]phlg@uMs\?tb|24=E3e}rhSve2[L|r.GfڍhFWRV"W~4o\Z3{}}|aXe//~;4^9\$T~;_7_~Ϝ  @_ߟL5͛ }p0|( H浛7oR𷆇Cъ,߽qV]^~WWV`.R]Ӄ<(j]IBѨH-iM\OQ$0x|;/A8Y_' c0(E*x|ih l+IS9}N@d6+$E馉*P[4I>nJ!5Z}ib^IY@+Zj4=dax{qqT BNﱡܞVBfa[SlJ@س|2YR"Foh4zzPA?z ,+1?b\\[{iddKeHQ-M/' Du@ƍ_66 'CeBZˏ$ 0k6JI%, vE\7P.FѰLv ÝNF(./{ou%xkFD{ $@$HqDR-vl\]9=3̩?@C93}zzյuy˲e\DZw X GdC$@ROx7nw}H[,=L0hZB J$sH#j2[E-xsxط޼w顡jAxB)F<^dN347~ A4iwrf@N`X֭@d6#Iֵ5PzvGQ!AEEجԺgm6QwCGa9Nuw3 l4|n&22 H^k]3Ţ)Y, p6 RflL3 5]'IRSUL:aakxfdZB sp\rd xrUm@ .׺ +Wx`БͶ?Loo^BN3LQV˒0L(Z ktumDpfz µp`gKa̢>nAlr0,7J訟$iC/dkؿ9#aG۰ZCϟ?68xRX_?'rVinRi6Zv6S,...AdY|1nٳ`Brtuu=iz…bZkdIzed$…rL1wE3SP<3mSf*/oOOzV#dYp3Bi QN.tLOޛH6Eiv[efMӏzq0fBs==o̲ؖԼ40D<&==\\>_Ip_ڻeYbrznnA_^l+qJ64B,~k׮wuTtƁ@;bdn?xepooGQS|[%[2@  iFAxqpЬ p:cfseX0 d2TJUl&R.FF~z}5 B}yb}KNY#@iPˁ1oV%eYg/KKPNgx8#4poŲ,BhW+f{ b4zuACѨn?w%KXX}i $B>sNoϝr==dKN_K$~>?_4e\Os[, RXF" +++}6,{!VwnfEZK$ ~R~?ajCAhYXSSYU}mrCh:l6Z\.ǻilhq33k FlKn$ R٬V*gggp<}Q.eA YlVu]c.Wm7j"pLF)˦N2ɚ`mu>L)?r!d#atuw=6SgPwRpwYZ&X\X(J 1kKe|9 \PWUչNӴ$Izހ.1MûfPZ5 C]336"00Djڧ |Lg63zz)0j*[81FN'X[3+_4\_O2 EѥN!L+˲-(f 384t) vFݝVVi xK$I5>unrjzXU =[v,??wn&ŚD~63cVu8o8x H>o9if2wPhm|/|TZAPnv+)GFHPյP,bF)~V_ 9#INQ~Ͽo\>`pw0tNQ`UlN(eSdeU)jb?._\WqnCw`&FFw8|~?\.nB@\X! Ib.0H2 +W#S4ڵ3393pL)gܜkSfdz>wY0 $iʆifJ0 x<$I. -CX.!>pFH4jMM8nZÖ|_5ף2)'7|(p0nV?>u78<6/Bwj6iȑv'q#bՆ'&\]]2(^_ZZ]P(\_, Ptu VI B( r\oo]dV"J(IffD"jh$ْLD[bB"b*Orw6x$IMױu^XlD2 +|'&׉Mg`Y7(d wu1:+FFär|.qE(:*LGl8d3MӜNq7.qߜ>J&Z,fFGJObFƅӧͦf+m6-۵kXڵj:=5翲ئm J\ngw>$>tzNz/|/&#*,bYٳk(8zgnR;3p!$A8uʻ<& ǽKQ\$#g&c{澨(8㸢(kďΞ],GS*H| C0eObO’՞xb5?q44=Eӂ`:2 ^_qwgAzn mnuP:2>o;l)˲' @X鍍)m\.]s\TzΝgmIrHbdDߌm;-?ǿ c"4MQXVWMan8Ph*/ OM&175MZ¶9,˶Ukke r֜8Ʋ۫a!j>ƺgJy] S8 lf8s{ IDATġNPlubh60 #Nc׳:I&FFFFr>ҧ Hŋ胓 ǍbV0 C ';Xłp0q' ~}?ϯ?r_ٳyim"zIf66x0P$IJ?w\Bi6Ժ/-/˲uС\ HT.p]Ln3, kkT_HB"8o߷O{2:El?(J9y'u_p !E$CgσNQ t-3ǁX,]-Ú"'Ym !ME7"M^_3!xLhTv2߶_&3caؒH_%bjR{HVĶfܛ&4QjO!˸d{{ӚyE̞BɶF+(bl()"d\*$I"y^@+˾fLxˌlDfԂq+CCWo0BOLNdSSMO7j?^No--xjJZwg2'&'D\qceh+/\ht~nΌiuu֘;wZ2|> $IT("B!BfnNZ(ZyU+Ӡ0+QI;zJP(ԩ#Tvxj\X,{]v:}:W{%@>O ǽ˲]$I {qyfq(RiX\(OWWFL4S4eR0 B -dba]~W[ !\^'btl+==:X] \) }\>5%M{w,|.#.l QLnlY溻3^-H4ݻ}fPͦiMX=mTv!IUKFz"1(b#GgjMҴ߿7 aiv*W+LJplb0$o$j29^,g盂 WIҿae!(U]-=qp*iohh٬jJ%Nv+}}%if~޴>Df_7ו<Ì8~.LFL.qYsfnuPGeIpz*U.Fc= Yq>g;?84V !0MҒq>w*UF?*a+.2 L03<4Mt8a]׮q|(rKdqu.{OA #p\ @ Ck5.Kbf\nKLNәxش̴@ZU ˮBBɲ |o6AtooU_X[Xp\8Ap@ӕJEEd0Lz3#J'H/ ,b&em8.z<Z(K0a\.Ot{[WT*cCCN' °pEӚ&Dz= l懆Mo99 w@@VeB P7e0f2;2o}R.8$a``)8S!j D`sn)9Pk)J&ˑgebfRД1‚pv]m_\fpo޶unC;}ng=9.\_:zk]>zsg?;6ԓ8Ss()㩡tey$|3A$iH r<n1(S++$ۿ!4W*ozV疗##3 >AvzhL1Ѽ;V[v zO NgСgСC:ttrرz [o;vam}Hx ߑxs[o=tEU0:>< ]#xOcǎ7-tرӧO?zt)S><@+tգYsCGa=u,M;ՠ̿>}gZmoھ22v :ryT[oft p1_taN}e ؜}ζqNZ'-=E#7O-s[BN''tI: yfl3`k]>Na=\.H_rcߚ nprv!yK|m@G>E<>[,-lڶL=}~;r󔹯jlū`be`ˎЎ\!E#xce"Dy=oǶy-Ztxr<{vr_Qۃ{I'ǃoX.fx?v0t{6ާ-fvK͓VXXÓ+c*}h Ca=`mam1Ó;N]b{}iaHQXl}nI'+l=miG>u&Ln)og˦c߉˃oO2HOZ v_:!5|쬷h1[z3<>n@'ǃoO2 ~"$s{Pҙ:|iYU'ڡCϞ ]СCOazD:tСC:tСC:tСC:tСC:tСC:tСC:tСC:tСC:tTp\˿qt2W-;ӡؓG:< : Cg=Og8qEJpHi`PuUU 0 qFUzYBGa=ܰ٦VV0 "(:QXpdƆfi ÌF"z{g=3ss,ѫn~փ!; uD$Rs/븢<>t|X9B4SULӞ>cvY¥K @5<>$35u;wzt3 Y3eY躎8MBHPzkrz9ϒ`D~pi8uKB a8N5%J}}T0Lu2 a!B #MaX׵k0p\r>(Y\t]r UU@ Ck5.Kbf\nVLE6zzfdY&aX8, _YYd4M+J8R[Xp̙3Z ðݻβ76fff4UEEQԭLð ιsJiÁaX\Mapf 0Çs8k]mWWYve`.ϟ7;>2X]X]/OL7;Ncp:F$/R\\uKUUr`Ȳqܫ faawEA#?X[tj_7]ח S5wt8N1̍b0j5thAD89>11J&@xg"13= .{@ 76H ^$!l6CC_|aI׷|)BOBA44mXE B8~.=:ߏaX*7|>81 h),WTzԩt*z/_8z{7,ipw\W 滺d1zL׫ZIuI_,zE7&&xovGa0cZRh<(6ix(y;!d G޾2$InQX$;4)*H 0 " G3͍'bQ*{m AѴ#:Y,M BX4m`7KӴ$IOpğ{V-L]ŢfTbqA^00bt,վRʛgn 0FW|S8^VB8BU3(YB8ڐ { CQp/e^Kմ֧!UU4I&I HWV à(vrHĝɘ:Ty|^`Yv<~9   XT_Wڶt.Dz,/b:罽P ;Kl{I!V!okcao=qrAV*èe{:b IDATnr0|p|dD巧#++L6? fpMKAI$ϧ{{%]7l&3go@*~"ˣ}}V鉱1IrT\"Bqb!TU!$j I! (J. eTdBN,jz{~Va w7= \.[872o4 {!Z]m{Ƽ|80VUuue jEUUu]u}=]XGӴE[/j^E+&vloyOQ_,wxϏR8G4j:jtR9EQqƍ[a0,K G- ݑ^‚($I:].W.lYV*x6+؉>B=F0u_/-,QUռD>3ST Xd $g~pᇕ(8~ l6yc|ܙ2 x?1e9B>|UMS F;&6bd66z}hx+V6CLe٩POjb'>4'ӂ0[ )0EVE'h]LʽB^?ǻ'q-n$1 #B&5.˴,8nn\$ɲ4Z?7$izVz4l7s&CC@$ՕhX,Glo;ٳ$0 smTm6w dxZ,(jBy;Wd3MN]$NN%βOVUCo( X@;6cSӵmtwk`3N\$9 YR{W/\,Cf\&SY^>IQXIHQܿ kܡC{qs WtWns8j>f%IDG' Ф"<44J&ͅa!wD3,+z`̷ufüiR9}<4\wRPPUv<.#ɺ+奥b{Y3Je<Ͽߔ .GGz*loff٬n d,F߽~r'@Mّ;'ED;lU2I/=:e"PhmuUp۽0?h4;v',=8]-7o"wەQt3Ek$W_QE9Nd&&~u\zk`nZ]Y){ y}QZH,;>H .x[[t| \$Ni/cGѨ(aTey9EvؘKJ%궇61weЛNC 0Y&QެA`,.<ӿCjcN]ŠXlW(J.5 pPB/F/B*@u&IC((t sGNbv M'|gYZ-zU o$a, QznنO|E'j5htA?0 +rqІ ,!+t4W 6ca! Kwǣn kw~l65MqGӽ; QDg/W~.pav"˲uؚmlgZqܩ\$A9`5l =5ðv9xk zoo M~ h6z!3>Hkvaz^@סÐjYN0 f@(*\T*$S EE>RA40U(HSp,$oj5UU(h 4 !C!0M BXŲF9\uMBzmRfZxHʛb1kv f옡APalq IJY]m6Ic Ml6_u9Dzj}~|,/R);Wl; dVeϊEEQ,'&|^r2}+Ǎ +Ȳ٬Ⲫl6H /9Lð@PhZac{OϞKin8Δ6--4(JXL~^_a?,ӓ'Y5Xs(?ٷ].Ẻͅt90xz}Xd ]'hXU9rV,,8;|[aُXvaqAF/ ˩>{~aͭ-8:2Jc}MflT* 8, l6 & l6$Pl|*EVgU5Mn8v:tE B^Oom5M3zhZE]uM_, ZԾDĮ ji?bvw+ -}>t(z]״<٣50ha$I Y qIzE&N*'^Os%gY6W+$_ pTZ(!9p AN'[\ɓQZ,Rg _}xI qܑPq 4 GQ[8p86]WFF&"fzZ_Cpr0E=^?%3CCiE9ͷTNa==|iLd2ןݞ 肀ekܷP]j5n_;t2*u(Gw?/\(B}Al0; ",) `m%>{w#4G"M7{ȕꨝA #l{A oys:1 6^&clb^L1g2Ù @:7gê`y7{ yϏUвX6bΔE##"{{ϯ¨v_]е$EBZvS.HǒJ9qpMr^ Z70 IAEI&5R_R>3l4q\kwn'朹WDS2tgYW] N%C8~庵 :4Myxr2a<0 1OD!^DzKLUDcVj%%f[ S?w,:뢕vY *GN57o v *d['NkU^Jñja^;;$1{4_d׆ Y|a0os[ s l8Tj ˹E)Vazj:`Ű_8n;_8z Jy _ye~i)JݜKyLlH$z{zrz2iR8Y,nF0T*fvY߾$9x7;QH]|vG#/CU/TÕ|p(ʖ(,g<[,[,vWm}|30hj*R)Av{P0 c`F'@X[Paus~@Eӑd29r\*--.ƢQΞ}<%`-8t}|m`aZߞ&WAQ*T΀*"dYiz˗[֙I8%v$1}!j,YB |:o8; MP əǡFCn` 8]pIysjN )>a=V *==<}1 #$I'Dwy/PCf >E}駍F"' oY,4QFruj4L& 7 #5 `|/꺃eMYrֈt:ɲ( n7A}ffx)S)*>>N&r9I( FQݧpLqD0.1U'`?]~$i|1AQ4y ;1 aRcǏ_xQ33.x_ߍ{Jӓ780_ӵkRI$eaCXWp(*KtՒ$IBՂB0 %s\':U]jAG)q6r20SuTf`w8 [-,"eYa],+O&EQ 4j8^r dY$t 9Z-$QAA]mB9l( aEQK4+^ b+@6@opӢ |Vk4LF ]tq< ]DFcxxR]xe~/Ej૯X$>rȈҟ9B!O[X j4 E 9Jfh4JR-쓀PNO8hwT#2Di`AdAPT0'tSՍ`hQA0Y4Ft- -jRiiqQQUN)JR]x*%k33Ri޺J&iF!aqDyYE9qB!k,K~!q|)8c8Nbq8|O9oyl?E 3 l$̳6ۉBwVy'^Y^Vz$b,Dc1²왓'˃;2 J2NZ.UR~ekx,zZ5ų!L?S)':o./,/m1_^xMghRjK.]޿~=#eS^7sdGwtUGӸ$PڹCpjàgO.om\[* Ӵ;tz=*7[pjZ~x\}N{K= J&VWGJnuiEx:XnMy`r)mj ujiqcsen0 $V+H& MϥM(ylX0lfffqqq+Rd9NWUEQ>S磛N鉉IaJ KiS #GrH|R'<0_;Sz&Ý1>bvj]4l6766 Cn El6( A ֧*ErDAd.%bgsE" z{YYY]YCr_&';lkonz7n@ d'& ǁBX$03L^7PL2t2h7IX_m6WU8\cǏѦÑ_'qh@1 r8 ;0 dY|~APh&g}> K%2 (b%U_L!ÚnEz[޼20 Wx֎/./F&7A)tH$I |exؕH (p: BXd6iSSkk$Ib8rZzl0CEZHV"([l>\PZ&Znw(rfܹ\.Hx v(fJ%Tb,0;{eypL'q\+{+wGa G%a:d7 Ns1Ot29ڼ95L>??8ujl"d΍,ϲ`("L^鱤@.4ld0$ 8J0 eO [nW~|0B,/Dgp8^{ //tw$It/=jj240Qu86D^C|csM[#w" [K6,BK4mF]<MlbOpS%PHupPTQEMIyEUalEj7NN*ʷt-rbُ/\flM7D'x\UU?tNb=ժ#edU^iȀ*4-Q.1V*L_3&e6(jƌ:Crm&":`$IryR9QLh$YSճ֖ii'~cN[X 0$I5{"y0 0 `kr\JAW?.ѝ@VQ4 MݱrK|>o^.оh.Eѵ늢@p(d_(dZ `fccb=t >3U8NGQQjZf![vK'Ϝoǽ 1 Ŕ'kk@.\f2 7:ƅ4}|xD=$ 5n{y)IL_`Q"ˑI:l _*1:Xi6?eY$ETU5P(̔4mV5DQes!$GwM@@Ҵziy ;qWXK%8 ?_ORi#9TnLl~pB6iYVj~84 §80$Q4 IMuѡ]뻱o4iѺ/^V5Uj>Okɤ5"8K>9#/dLS 1D5eTTQ)j{ ^0@# _E1G5ͽpGm/麢sz e?)tu]8I6A $BN\RdE$I;u]A۷"uGRz=PXh,e/[s.v4MƧᅅ5=aRA3p>o|,Oy<A%4MX,4ݽKh hX,ϞjN78 0C= (j{ pI[al6$IV frH>x00 ˙-j9xZyl|p4 aomŷCC\E0Lz{4(sor)d1Ų~NgU66‡v2˲p]38>6N;c gU*Zmlb)4]hLL3`ͱאjy<+Abqh$U,,9Bnx+MÞYv0%0L0Y-3 Ah-&΃qR\ղ܉u 8ֶC;WENg[ f0a<N/]W=aORNt4(;490 0j4 #fձ8GWV.˲v#(&}P:,..6DQ0e_2jl6/\! K( ӻp%aj}1Ea/UUK*]%::^_^i öG^QYn0(KKloPUxD ;ۋ 'YhA43rQah7zu}~cctt1>>aX"f =k ÒG1wnߺz0ֻ|2k{4hTQGd&ߗeµk폓$EEQ`d^?]bWB&%黣dz LNV 1;0 {4' м(r݌h {;Ajڒ9I+{faA,8{p(zdrr#ݠBFm/]Aen:hZmI۳C1huA$j<Ϛ(3g>~V:t&9r]-`~Z-n/q>CC8Z.qmvOn)w>V_֪*hOa6vvHNz/m4Ll_ݼt@QPՖzͦ,˦)`jNDQaGZX,˗Oz<=YH Ct/bXlsb[4]K`>.lfy{ipg$VVq[,-&UQ`,{%Dqr`}exu]_[[zŴsSԽ<`jj(i%TUy08_=Ba㉴`7#nCl `hkzz}.\X_[d鿯G,) Jl@3m!Hj;t70BQT,FV\G,~-2d̃ޣȲ).=,+IX ];^bvIjtԞRB>0Vr>@oK#.IIuikgk$yq%:FU++^ d2]Wah4{<j,˂px*#S Lc~WY})xa~T }Ixyi)cOd @#&h oۀ((/ZT,`P(g}w~^?ϐV.?vl;733VzXhT(Z׮$0 qZnF"##qjա.LPiM$fʶb/ 1 w: ],:T~`+-_|yC!@&3@43?:6fL-YM~5SL*?` (y6˝|{ɚpkiIoA=ҳ.t:s\&A#=o@QAX0LQSRԛM󿛛Kf ٴ\NeǓ- ~'Z;b+t\j Y|ݾ',{ʕf96>>i:BPKzP .nTYh6 yCZT._h4~|K4s M>0N2N-@ݵhkO 0V2kk7a%y~}{`ajH[/_.;(evYưlݖq|F[oeE5Hh?$UU2qjja.@5Djo|2xޞj&%eYg` ٳ\ά u,?*G ޘV= /1^N}uee WW{ua-7o-ηA4w 9sxT_W.\haݶhw0_4EtͷުT* A݉Z˲|eoᑑ 4-G"h{a;Ce5˲FWWVZRJcE`ehPr_>T6|GpxBeFFR33--mf$ (Fj|ŧA.43YhAJ'Q< ..h`OWT(q|xda\u2s\!T==a9XbTU8Q!W鉑 {EC IDAT u/˗% kTPYvjjϧIS584E8@#bo4 Xje3Mn-,y R$|Nb#Q>۟}Iql3:r=OhxD^!{As֝<{R!++ \jf4]ڎ@PTSUhq5[7:֖aK {w3 ]_. +cc~]1 ;83wӍ󫋽'TgϚn_xVgI=oɋ͉=ټ1 X,'L8?ǦX,Cjq5YAu]![l! y<,jpJ;\ (5<= '0Zmt'pߟ*yHGz>fK?XpuT6jGF"wMײ`p?#=a:qXΫy"f$ Zf"' le']Pxi4ѕ+[[(vq73I1Mbw7% #͚f|n LO?]eyd~yR mONА5{k{@8(0H:i.Zc>FaiAtO^xù9e@`V{!|,"y/)עiS\.//=a8~Ph4(4myZ=yC4dR|i#m3t eβ=*:'R),,EN}C;_y;0baNHŹeQ,iRؼgpS& ÑHM$e Yqv` q Z-4MB"ADO;V~i 0)]bT=W(|t /wzZ5$IbٙVL$0ƙYGz{͏VV3e3fSI!IbI$RȽ#W=|=7T:֎U4p:Q$`wníV+9 0o$%x[eYz히sm8Gk0Gpp',+<Eq w0n` St /iZSU$岵R1H 6 C`.T*_X SzzMܮ5c'˶ÖJnSo<:àq[-O42ˢh?$KKpݠKt\[_{WtrGtf$ vRt[}}ff+M)b }3дl6GSB`{UaY wC(eQQ.i<9r%$ fz:Q4ZXfMM 0pF Vf`u&hԮ U.) p{Msb4 .v,k.xT*z{o~Ev~r}d'3IwVLd4eK%~@jZm ;xqf2A1l~̓ G*fCg}ɤIюjn6Uy+кf HX*E}0^މڟ*VV.z+*I>7>lϼ,U[580$IXwx*,)J$ɲ fS/$|.aFjUkHtZۓIR<tsttϛ{s86:6gU*KK,˿|晾vjOѮ/tX.jZ '|ptvdiV(EQ鸰Y{ mÀ%t%f)㺛( zU$BoyVłAjzڵ5Aðw#,R^y~ZE:;4@MEcqQ ˲uUw]:MnC׃j7j Ba5v6;Jy/O#%U݌Dfgg?4Tkb>>͟S|wGƲT(<`Y*>$eO xt l˷mN׶Q}:KN'CUlz+r4>s_$ɗ?%1yQ3Lȑ-v͏{Pl軫9Id!7ջZ:ٚ{ad2zNyRwăg˲ג2 u U5t 0 EM}(wt:r՟߸p8^Nիf8©dRmۻ;pWUU$VWy]+a~}B26oܼh><)_թtPmE d7M&'sw7dn7!r:& bln"U5\0|1:S5gg>{2GFQwVA($I41W EQz4.: ./]"[4=}Q`O;K&I!(^iT97ל`d6l\P(|T.{{-\NM3:no8 alf<~SFԟ2G񞞞yCTEگ (v>bqM֢Qy[>K.h{/WuUU;4t Lpdh˗꫿"j5B¡GWb631!+1 k*ʍ[&1iZ=ƄtF`&Yo'𭵵1V5$')s1?Myҩ#EwcjCvzE8Aĉz=;8Q.7?7(J2OޕT../~ j>۩Ա[Ze{BX nnlmS& MaOЖZTvdX,6;5Vaעр͙_6hL&ߏ nsS+++G&'ɶ7w sssgM]-tc8496G>sϽ}o|/DbmcC3GxL&G/0& ]C8;2x992=M w6=ma]_`Y b\A9P)HKSj{HO* rrjT (u (adgv`<;;gfgߟ77ʲdճ~ITDj59) FGv4R ѰT*VlvB_uG,h/BA4BÇ_)j/CɻIo^ %irrΎOQo(rT* LPѴO%hDff>`^"++\uJE|>`0X' ǑZ.1Uø mP-$I"9Z8a#e]_?>V]K>xo:a@`岏Y Wư,IR4cGG߇B c(.{eql= rê:iLHWwR./ ar&23=͘F8+z|p| c%IZK8,5r˗\nkSn{F]ϟ?fu]^_X8(Z*Z̈H3Dѣ;M_KߥҔQdiU}UylLyjvVQSͭ\.ŸgHO"70,޾-X,ʡNw 0cX̬]8۴Ћ6A3 ;ɤd2Н;a:TpXânyV쐁ۉy%X:Mlv,K&\ ~W G>:]X%L$ KYb~Jm̂ެmu`~Җ-gk*94%Ճ9_ۉ-HԕD54ICźKh5V+˶eO-@p~1%_/EATi7^,a>t%n-%ԯvftx%Kzf?5)-zRuh/!zETAT ȗw,pXGgҶi׃ŕX3It'k,saRevظ{.[ҴDXN۫l6O<)ElYǶHvc8ֱm١Ddkq8Q#[8 tsEIENDB`php-imlib-0.7/web/example.4.png0000644000175000017500000001155007174531573015757 0ustar vorlonvorlonPNG  IHDRQ/ĨsBITO IDATx}lFׁ> (C2[!2Aa ,l#(V SIu}S*"s0Eň(DJAJcJ8w\w{ޯO˻s/@!B!B7F)nEп]QҹN@Hҍ_f~ GPDtQ":(j5JD%CѡFPDtQ":(j5JD%CѡFPDtQ":(j5JD%CѡFPDtQ":(j5JD%CѡFPDtQ":(j5JD%CѡFPDtQ":(j5JD%CѡFI0݀K:Q":~A? B!B!B!B,i^tߋbS 4Q0"eJ|ƌ)SG[Z#X>JŽ=SG$vGCZx [Bswծbw5Hi?2_PQF!4j`(#F 1&5Q Zid_FMzKҏV1Ym6x+CL"N)8DrLC@zTWet\y39Ѓ-$x+Zr:nf|͔6ԕ ]06ܖ<"7y9iHKc-hԤDt \¥f4'&^% fc7{2귖ޫPk#v*:4==7T3uw û} 46•Ê5nܸqH! ga֝ų8:U z%O?tMMŋ>KrTQ!J)>*SPPxo]\q0ժn+[Z—o{WO>]Dì,\/1sׯ[x1<օ.Z 腕S1(#n%øcPL}轸 *#ƍ+++U89H܂ 4o޼+C8t j/e"\|Ϯvժ8QLS+#я?xĉP 5_Y FaN|wo2b.Z襗^RL=}J?۸twS F;;;ӻulQ^:c{w;)^4e(-/\ F~aU0/ o2Vv5*-(eEj FGw+CWFrTP+Sj*ǎS}$Q?6sKBL$_/F+**jjjnE7ܹOuelHTW=%} Jxek.^ SMZEh^;spG*1䣺͋@T{; Br=GFFƖ-[z?RHp뭦p_~y…~"!QGwy`: }4N4/;|qX3+.]3ܹs޼y~"9Ewy1a(ډ%u>j{XFN4/,ȡ;ѼȰ?9t'j4ZN4Onb?wI;ѼGmM,\Dwyat'F݉A5j)3ѻDA>h'>zVJu ݉}4N4OLai^D· ㋜5vyؔ$9&GC-&AMwMuP ihbq-[\|YZc0 -U\D*4/TF=Ns&ke xK87"3r E 4hc[4QD5 t74[~!F7o\UUn` A)߉;U=͟?ǎH*[2D1ĊQ, ю޽{˫}55[nv횴RV+GUOkX,>zjCV?b_pJ]nP-:sѣGH*ir̼KП*9IvEW ދ{UbxcN3壣G8q#<"GBTIϗǪDP xyuX02G}HJ%.E 6lXmmmZZz$Vͤꢻ.®2ʗiܹMMMH(K%-!X6l(**1b2RIZ#)y\6)jtϞ=IZ*ǶFeʳdWS{yٙ3g(ְ6HuhJ}ѻt޽xАD;F'=Y՜ +tjT?uR ,8qBz..v|R{R]ǻS(InڴdX?jܔ$x{^Nd*iJ^Ob,5~-z[j6ތzyQ=&lZHYYY---< i(zqТDuQe*]SZZ0aB{{v2%8ZI}_y=:PTH?Z Uo=hyyyyyy>}TuXWݩŝJ3Uxt-[deeM4Io@C3Y!y;}ds2Bbw/_Bzkx,XpAeh.Fiv"`kJ]ɓϞ=;f@gH(VqWK.3grz(WHZQkx<>eU zK7j onn9sÇqVHC466 5htŊ8+$cְL6M[vI FmeyQkXhiiiuuu~~~GG PuXD~UwJx}i->}~͘1Cgdjfmll|wV^B0ѢX,6~'O*㬐n]7GWG|3gdddvwHAhT5B'|_n 9ZC7׿={5k* )GaXnc؜9s[;cc{-Wuڽ>}ϹE:݋Wm1:EEZXLCX[\Bt`nq VhM Z<.n0 bmj`SH P36kBm#g&F k_q|PnyD?T{ I1bd]8>ʛ6"*h&2'l6X7,%NռtV>}Fb.1T 'pbXX]t/2giPIU ٪-4s;}jő 5/ٴh^0lӶ*hB)Z}킥{AQRs֕K%e2t]tύYiX*qh Z#-HUm -5PD>s|aMv=jYif*Y*+5JSV%킥{CL&PAYim̴k^YilU@`!e>RK$Pn _WBi/TmX tZF>P^Yi*?BXHuL]LJh^%.dڙƦ_ġn>uW}>!TxW%}*P(lJc3-:٪ \Vn^P5jQ*LDnS6!O%4yc*'m^~yCQBVK:+s Z<+Mu_t"˗J(HvˤBZVj^di^*WW6W)}*۪Yim>KYi{5@~ZeIP.+h*ͫB_V [ZpcZ{ 1 L[]VU&mDxӽ|M%˅ ,+ʹU嶠VJieo zmT) ;4 fT*De䴲UI'+"LLVZ]fV܎{ 183C*8+<ҽ"-+M׼Y&T5Yikj>+Mm{@*7 [aV6TL*>q'o֍OadsݚѦBf\߉/955odᇨ$b&>] ]=.iy3,*Byn$,E3Aȁޗ~3&W*W>W|f-hٶ%Yii5|$Py$\w. ?{`m` Xmu"pJdBQ4T$,a(q:C㡼6#sȭp]߆Z1Swxk5]呻XMO1e c$v$^,+-Ui~`6^{yd`Xs f,8+ ʲ̰Se*Uz&\tO4 bi^Jزb3-:. cU<.9PD>35/bK2'6sg EbErPD%T 6P;I˯fQfjޮ56V?!?+A>k;ξ'䙷lU_nFGϛY_^3w~b|6mkq}vuI|o77`ggL&fHd)H/_έ_<4ڥ-3H́zߘd;θkm觟{MǾl=? W\W~D[gvv0f?|l#qxlhP"{H_:5G/ޤjrbdʻgW3{m7/gG]78֐.Z`j<33|wgs0 \<{`Bx&'| G`˼ #(+ ^)=^gݿz|<^WӤ](|ݟ.R t.T8' ؼq_|#Ό%26XFC |>wħ=׭; 5a1]d7<{p? 9q~gϓp_r_+}*) pJtu@;yꁹx 84j/<毭߹}lu|p:!gf\rʩuQZTw_*})le_[;݀83y{qo ~>s;o}Zr+GѳvoY{:f}'bw'ZW~laVwh [\ )tjkL xZ{TWAHB9g& ;^x,ZԴ'>VtOqt屑{a!fVbZ/ld]B3)!H x%:?P @޲+C!l[{ؓ`s44FX˗>r~͕$`fMZKCNdžCփ'D㲭fT 7 !'%^<[V^sz0Q}Zk6FOM(u (d}#?%@e fs?@Ϗc!ʓu:X-LU N;gw6I.m`۠*VK! @ƠSǟzY&0%ux:;x:rxϐ. ۖ{Y8_y `>$rzQn|+0ƔTuE) )f4MxeGs~|[殺y5" n>֠`m*|ȋ,NfbFwܸwytu9 ޓ@x\7SRztg/˵}ߺl ޶ؒ}G g_wɡNӾi{*UQx30O>3s]^_7mq߆9gtT鴹wP\wuutuu\}X8:5k.[fճV1oį^/yfi%} Q+9iSW^wZ+Bߑz_Qc=H“Io+ ضe+ca̞i7mZxN:⃏9 ix~euIu/ڻ'Ns;/k%5}4{zggmZ62ѩf[+_@4rHΒn& zL<ӯ,X//@?9Ra'%b LOP`m!OVošM co#A 6@m9qwKG}ENێ/UN…@R…;Cc1O:֮_8~\;իgY"g{L C$+M<_y&}FYq@z c$jvvK.A3;+(@waH\͂ 0oQp3-ԑ`EP7ڤ#hfc0^\1䦍GP+̵u)T傪u = DmfVJ 6_W%nVTL4mB2H_ "rQP_6SpJmU4>YiZW6yZB$i.hZfJ s궆 (afZyaӽP* UJԢo(efڨydf¬4_L-hoVJEN╸CV[f\o.xep;%+3|J2 J n'hkv9LCYisjbҼ[/W";Soj^ޣGՉs޳^ K~b 1p &XPmg1R `Cϒп}꧹ZZ\_( h{4R'! A0S962rZd='y!``fENd=q]@2KI5 $Yj0 m\-gUbt>6wUpe&o*H5 I7mП_9q5U1$ubfHèk ,$+NI5ѩG*d4LJLEƪ5W@U(hfbN4mPԽTQG9Ju +)2$ȁ/5-pU?13I^[ K4yoW |Ux!23+6HrQA'Q7BfqxbVuϱEqR%:Hѽ6#7Q+tMD+qD1l:+M/&أR6; WzGy}65@!?](/+><ʥ 8mXJ~/Bp]Fe%F &rӣ8̬VyXcuVܢ33!7E-bV% sŲd䗕8/,J90Ğw<"YU=TaN2:s8 H10x#tX4YcՐj3 A˚3guU^K*CeHÉ98R9/[vZ];gL_ԑdP"&~e\NLfF% ]U!/&bNKq']\Gsu¯3 A Q6WFK_.x \v2Z*)+EI!'@ ^gjpAKKDvO9=Q[&<>M6{3l16_CoT fVA)HDkJ${{ceҞ^eĂ!&26\Qz8 lkfu e{eiʬQ%u;uV=3\/$AtjēM r* CB5HnYK§{K8Blif7`TJnTmAڎO,D+SdWcrA?A$b3n=ug9I;AZmeV&Lo[4IHmw 1rfH5*h&+ >Hg$@b"8egf'5U L$% AJZV.RzRR!6Ӳ)H!+ 4NA T^M Ď`!vʼn߾(KIJEj df5,i"Ҕw%hZ @ug3mUԣwۚϴc)n '_Aɹ" r; A09ˢRIf"D0mԺ *DfPbU5ɠF; g}ccl|6 S ~X^A 'Hb#= dr @CJ!%UiZ~6SKxb$l-<)`Te]FI⾓[e묍bwڻ3DaveEzx.%A H eS?r:gs [Mv,J,!l`oAe%f*P[oyZ.4P#䰔 !\#˅RJ2JSP7er4yߘ8ےYiB=*@dOzzJH29`n>?7J``)-t9eΧ @(h o_VjD۪$ I23"Tn[Iޝ]]B OĒ,M"ɊQa:xU͠eg3%{dU5EqVDHOL`!6)*$X`H: fHv,MH+W|nձ®u>uƋ +UH !Bz\1'c F;1 tq9qG};ǸcꮎqV8ע_joɴô] v k~`G`F$YHur\: uIB`tY%&]z $I0x&abb) RH0C`"ƮKu& NyB1{m㲐jVx2:)3 I[E%-J=J5ȟz$Mt01|a&xLlК^QubO%'=ORtLE} z$&kZ5?kϚ֎˓p\+渘Brdн{K:nt*4:Nﶳ`{&+(J]IDATC@Z]j{l3ڬ7& Releases
php_imlib 0.3
January 10, 2001
 
http://mmcc.cx/php_imlib/php_imlib-0.3.tar.gz
php_imlib 0.2
November 1, 2000
http://mmcc.cx/php_imlib/php_imlib-0.2.tar.gz

php_imlib 0.1
October 5, 2000

http://mmcc.cx/php_imlib/php_imlib-0.1.tar.gz

Requirements

Before building this extension, Imlib2 will need to be installed somewhere on the system. Imlib2 itself depends on freetype for rendering text and the relevant underlying image libraries for the desired image formats. At the very least Imlib2 needs libpng and libjpeg. Lastly, Imlib2 needs a DB loader, edb.

Briefly, some requirements are:

  • A Unix or Linux OS
  • PHP >= 4.0.1 (4.0.4 recommended)
  • Imlib2 >= 1.0.0
  • edb >= 1.0
  • freetype >= 1.3.1
  • libjpeg
  • libpng

Where to find these libraries: (There may be more recent versions)

Imlib2
1.0.0
http://www.us.rasterman.com/imlib.html
http://www.us.rasterman.com/files/imlib2-1.0.0.tar.gz
 
edb
1.0.2
http://download.sourceforge.net/enlightenment/edb-1.0.2.tar.gz
http://download.sourceforge.net/enlightenment/edb-1.0.2-1.i386.rpm
http://download.sourceforge.net/enlightenment/edb-devel-1.0.2-1.i386.rpm  
freetype
1.3.1
http://freetype.sourceforge.net
ftp://freetype.sourceforge.net/pub/freetype/freetype1/freetype-1.3.1.tar.gz
http://rpmfind.net/linux/RPM/freetype.html
http://rpmfind.net/linux/RPM/freetype-devel.html
 
libjpeg
6b
http://www.ijg.org
ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz
http://rpmfind.net/linux/RPM/libjpeg.html
rpmfind.net/linux/RPM/libjpeg-devel.html
 
libpng
1.0.8
http://www.libpng.org/pub/png/libpng.html
http://www.libpng.org/pub/png/src/libpng-1.0.8.tar.gz
http://rpmfind.net/linux/RPM/libpng.html
http://rpmfind.net/linux/RPM/libpng-devel.html
php-imlib-0.7/web/gen/0000755000175000017500000000000010643376336014222 5ustar vorlonvorlonphp-imlib-0.7/web/gen/home_data.xml0000644000175000017500000000770107227215414016663 0ustar vorlonvorlon January 10, 2001 Version 0.3 It's probably been a bit more than "the next few days" to some folks, but the holidays are funny that way, I suppose. Anyway, 0.3 is done and ready for use, judgement, and criticism. The announcement is &nbsp; <a href="http://www.phpbuilder.com/mail/php-general/2001011/1528.php">here</a>, and the tarball is &nbsp; <a href="http://mmcc.cx/php_imlib/php_imlib-0.3.tar.gz">here</a>. Fair warning about the color range support: In the course of adding it, I noticed a bug in Imlib2 1.0.0, which causes &nbsp; <a href="documentation.php#imlib_image_fill_color_range_rectangle">imlib_image_fill_color_range_rectangle</a> to segfault if you call it before adding at least two colors to the color range. So, don't do that. December 23, 2000 Upcoming release With the release of PHP 4.0.4, a modest API change was made which will break php_imlib &nbsp; &lt;= 0.2. So, in the next few days we'll be seeing version 0.3 come out to fix this, and to add a modest few features. For now it looks like the new features will be color range (gradient) support and image compression/quality setting. On the bugfix front, there's also a somewhat significant fix to imlib_blend_image_onto_image, which doesn't behave correctly in prior releases when blending images with alpha channels. November 1, 2000 Version 0.2 Well, I'm releasing 0.2 with two days to spare on my "one or two weeks" time estimate. Briefly, this release adds all the drawing stuff mentioned below, image rotation, flipping, tiling, a much better set of PHP classes, and no Xlib requirement. October 20, 2000 More Updates All drawing functions now obey an optional clipping rectangle that can restrict how much of the image they can draw on. Pretty slick. On the PHP side, the class files are coming out nicely, here's one of the &nbsp; <a href="./class.ImlibImage.txt">class files</a>, and some &nbsp; <a href="./imlibtest.txt">example code</a> that uses most of the functionality currently in place. &nbsp; <a href="mailto:cardinal at dodds.net">Feedback</a> on this is especially encouraged. <br><br>There's not much left to do before releasing 0.2, probably in one or two weeks. Most of the work at this point is documentation, some examples, etc. October 16, 2000 Imlib2 1.0.0 Released Well, the first stable release of Imlib2 has been sent out. php_imlib 0.2 will require it, since it fixes several important bugs, and adds some drawing functions. October 15, 2000 Imlib2 sans Xlib Raster recently accepted a patch from our own Steve Langasek which removes the dependency of Xlib from Imlib2. In other news, I added polygon drawing and cliprect support, so all in all it was a good wekend. October 9, 2000 Development Update Just a quick update on where things are heading, I've added the drawing routines and flip/tile stuff. So, there's two things off my todo list. Polygons will be in by next week. After that, it's going to be mostly PHP-side coding, getting some good class files fleshed out that should make development nice and clean. October 5, 2000 Version 0.1 First public release of php_imlib, with image loading/saving, cropping, scaling, and text drawing implemented. php-imlib-0.7/web/gen/generate.php0000644000175000017500000000647307225574765016547 0ustar vorlonvorlonbuf = ''; $this->out = Array(); } function openElement($p,$name,$attrs) { switch ($name) { case 'news': $this->out[] = "News\n
\n" . '' . "\n"; break; case 'item': $this->out[] = "\t\n"; break; case 'date': $this->out[] = "\t\t
\n"; break; case 'title': $this->out[] = "\t\t\n"; break; case 'content': $this->out[] = "\t\t\t
\n"; break; default: // We're ignoring elements we don't recognize } } function closeElement($p,$name) { if (strlen($this->buf)) { switch ($name) { case 'date': // TODO: A regexp to see if it's in YYYY-MM-DD format, and // optionally rework it to Month Day, Year format $this->out[] = "\t\t\t$this->buf\n"; break; case 'title': $this->out[] = "\t\t\t$this->buf\n"; break; case 'content': $this->out[] = $this->buf . "\n"; break; default: // We're ignoring CDATA that isn't // in an element we care about } $this->buf = ''; } switch ($name) { case 'news': $this->out[] = "
\n"; break; case 'item': $this->out[] = "\t\n"; break; case 'date': $this->out[] = "\t\t\n"; break; case 'title': break; case 'content': $this->out[] = "\t\t\n"; break; default: // We're ignoring elements we don't recognize } } function readCharacterData($p,$data) { $this->buf .= chop($data); } function readHeader() { if (isset($this->page['headerfile']) && is_file($this->page['headerfile'])) { $arr = file($this->page['headerfile']); // array_merge seems to be a suspect of rearranging array keys. // Since I don't care enough to investigate now, we'll do it // by hand. This way we know it's doing what we want. foreach ($arr as $line) $this->out[] = $line; } } function readFooter() { if (isset($this->page['footerfile']) && is_file($this->page['footerfile'])) { $arr = file($this->page['footerfile']); foreach ($arr as $line) $this->out[] = $line; } } function setPage($page) { $this->page = $page; } }; $pobj = new PageParser; $p = xml_parser_create(); xml_parser_set_option($p,XML_OPTION_CASE_FOLDING,0); xml_set_object($p,&$pobj); xml_set_character_data_handler($p, 'readCharacterData'); xml_set_element_handler($p,'openElement','closeElement'); foreach ($pages as $page) { $pobj->setPage($page); $pobj->readHeader(); if (!$fp = @fopen($page['xmlfile'],'r')) die("Could not open XML data file {$page['xmlfile']}. Exiting."); if (!$outfp = @fopen($page['outputfile'],'w')) die("Could not open output file {$page['outputfile']}. Exiting."); while ($data = fread($fp, 4096)) { if (!xml_parse($p, $data, feof($fp))) die(sprintf("XML error: %s at line %d\n", xml_error_string(xml_get_error_code($p)), xml_get_current_line_number($p))); } $pobj->readFooter(); foreach ($pobj->out as $line) fwrite($outfp,$line); fclose($fp); fclose($outfp); } xml_parser_free($p); ?> php-imlib-0.7/web/gen/home_top.inc0000644000175000017500000000236707227154422016531 0ustar vorlonvorlon

This extension, as one might expect, provides access to Rasterman's excellent image library, Imlib2. The extension is coming together fairly well, with probably four fifths of the Imlib2 API ported which I've been aiming for (There are parts of Imlib2 used specifically for X applications, which of course, we don't need in a PHP extension). See the About and Documentation sections for more information on the extension.

Here's a brief list of what php_imlib does so far:

  • Loading, saving, and writing to stdout of jpegs and png's (And other non-web-relevant formats)
  • Image modifications: Cropping, scaling, blending, flipping, rotating, seamless tiling, blurring, sharpening
  • Drawing primitives (rectangles, lines, ellipses, n-point polygons) including support for a clipping rectangle
  • Text drawing with TTF fonts
  • Color ranges (gradients)

You can find php_imlib here. See the Downloads section for requirements information.

php-imlib-0.7/web/gen/settings.php0000644000175000017500000000045207225575007016572 0ustar vorlonvorlon Array('outputfile' => '../index.php', 'xmlfile' => 'home_data.xml', 'headerfile' => 'home_top.inc' // 'footerfile' => 'home_bottom.inc' )); ?> php-imlib-0.7/web/imlibtest.txt0000644000175000017500000000234610515373312016200 0ustar vorlonvorloncreate(480,320); $outlinecolor = Array(255,0,0,255); $color = Array(255,127,0,255); $box = new ImlibDraw(); $box->set_image($im->get_id()); $box->set_color_array($outlinecolor); $box->draw_rectangle(7,7,106,56); $box->set_color_array($color); $box->fill_rectangle(10,10,100,50); $poly = new ImlibPoly(); $poly->new_poly(); $poly->set_image($im->get_id()); $poly->set_color(255,0,255,255); $poly->add_point(100,100); $poly->add_point(215,110); $poly->add_point(150,215); $poly->add_point(102,255); $poly->draw(); $poly->free(); $txt = new ImlibText(); $txt->set_image($im->get_id()); $txt->load('','Vera','25'); $txt->draw(250,50,"Always a Boom.",IMLIB_TEXT_TO_UP); $txt->get_size("Always a Boom.",$tw,$th,IMLIB_TEXT_TO_UP); $txt->free(); // Draw a box around the text string $box->set_color(100,100,100,255); $box->draw_line(245,50,245,50+$th); $box->draw_line(250,45,250+$tw,45); $box->draw_line(255+$tw,50,255+$tw,50+$th); $box->draw_line(250,55+$th,250+$tw,55+$th); $im->save('./dst.png'); $im->free(); ?> php-imlib-0.7/web/lain-closetheworld.png0000644000175000017500000005335007174527733017770 0ustar vorlonvorlonPNG  IHDRcgAMA a IDATx}νwf|vTut yyN11pn?r/>>-֡~.u^6.0,h헰À_|ȇ|O}ꢄek2~a07.G.>?u\eR??.ȏ\|G}#Uziij;/e &u\H`{BlςC|J%RM)| .JwEyaa//\|g|ƹ- `8(;6g>2__n_ooHX mxgzSAIֽy{޳Ӟ.,V,fh2Yi>eESy~k?ŵky֒i[DywyM!_WWx3<^gg'V]y'~'B ۿDxg}֩ x"ʻ|(M o{__y0Ngg/>c?L:R4My:}"'/bHSν.Y<=(&J"(B eN!V ox놂Tb4+K?OdSZ??myֳu1d6pHNz-8 (JP}E_ES׽nMa2YI\~JM%M+M(sM=Lqbשy'aO&1W|W,,XөEPhxKKMߴeYe)wܱoAoy'~2O0 Ł:%j*~nhE9}|/xD3x&1Ym}`{D9~*Ӆު)H'H~#qiאu(̣%z ( (qYMz kT;KJiaL 6> cFHms5ĄKOع0蜲f=e_e~ CYbz0/ɦxU x$7}^ ڠxH@#/?&zֵv18N"d/4Wp $B@(Cx bzVR1 ]yaW,kk˜ʫs5is.Tsςoe"0:s)Z]vxA"hzkb#p,yn#1|ѧf{(DT.Lo1SuEC^i~ށ?偋kNэa<њ<6F\ A7E0D0.Ĺ0AFQ/) UߤjN% R]S@p9Ƙ*wgp暳| \Ji""^|5tm-*ך{C)Z硬S=-LTcP0~q?㇩+q<8OOcܮ]X$K֤ȃXk*ʜ:,'6A"P0ފ̟B4 9eËu9=,+%1 2?s&1Yy=d5-oyK.'X_=[Y-e1 ӏsLn5(&2 X7a >@&?)VbjtEOYzDoo+Ӧ6W>k qK:p1A+Kɰd.s0 𒗼 ,/U`rq;4!p 5u8VUem3S'8K9+74Z ʋI3Æ)~hܷy{^ uJfwЃP?2eYeC ːVyu8uNs4$ o`x8gN2l}u׿[]S?BvB YlLM%FUzUZsVHsDvZ Ho>{BEʯJ97!!\7ƟJ瞦9MVaϴE`N"B3Pڟ5)</smʔd]\?<H qE1a\M;liH b j<Y1nP,Ea57 ꬶܒUe)9sRc/N[C(`@E/zQy t c[o}_k#N[Heh?cVw`]xx1v+Z@Y%T3=p:Ų^7ءmn]y\<)(q*cq\`܉]SH3 A +K xGaHz# +M';z3WYX?}ҦWN^3C:Qh/v^fڗG)U%91¥,?v`x2E[F={k|p vN~i|Z|oH#|F16&b1(0sDf3#PK_p1G,q#c:fW6W/%R>kEp5K#^xJ;y<0_ 0f'ܯx+|?m8<]GT۶T;f}J@GGATi,>c]3!nb 1?g,"07J}aBia pmjl͚egdvcMa= mp"ɣ.}1 vǃ* u8s{ # _^pThS1 ?1޽N;b\ \:ro^)lU !j)'܈(бty2PC\A 3ŠQ.gQj5<( y(/0^oW(0~.ch]`~]Lx{fFO;Q(0uWg ^l|E (왇飍w<}vqYx.7ޞ'cvN!%`M>ԋAՕw$'=i(\rZ͉Uky%) Jpx[ ,NjRu{y.?:zxG pr܅fKeL e!#JIc )E[, V}ug$4ݭEiӥݴ癙 _7^(1_ڙsc3ufA1/S澍ex3D]i%#0&&YXh W%_o0"E1DȕyQD%Bי(.H5*m} 5% 1CX ēE9]h'Ë_v#~GYϞA0E,sǝs[n_|G?[/F?RpAE w=  n8b'c(wRݳ(4Oyz2[»NLG̦C(Hu4 J&{4t&sMtÇ1b!xoTh`x~&&?($1҆qю\n͹"p!--Uƚh}qb6l 0ȡ)j #Rew XS,+o!\,07}/yсwRɢjRDꋵW<]A)Be=/Habm#Jc.A9pjluum)58خJ ԧÈ}20av#>/BC {/ |Vpݿ#Qn\[ZX҆:=C_vpp'¡ӘQ };lQemzZl`q qJ;;^ VŽ=ii}%„2.mu@EW0BGóg`_x;54`ɷ.67$0Q\x -tvE8*m ZװSv?z쾟7N!`jAnce YF&a0 )f c <FpcX(8.q:.4C#+t}J܅waNpm2%P\ZDF&LRKz-]V0 6΁!7睼Kc@%uz<ԎsRp2nvYC<\ǫ#v:6$lM yQ=rbpgW'Y 7s1N'KUbhː9=1ic~ `,b)xa(޻3u8l!!?1~$8c`g* uaSh8s קٮT@n\01lky|=' D`-g~jhYz_4?&OYga0mf IDATwZ#OeW w`CGWk"З] Yq ='mU+Svw@VSsZxlXe` A)uc I%?CuF)2e1Pkn\Gx?9xS<haiW_;m?]JΕ,A[:2EȕyG_=E@0 5ί)*$ !c|ݴ\!zvJ O_ R·vIgt{FzSg8^$(|d`NQTB 8 BO"Xj8qc5G> gXHwCYT3)QҼå!!$Ra/yRwKE׾}>EFX}c۶WbXXV2 1:ѷ3S 2h~m{>.$!6E;Ay?!lH`{k: Nxfznw.4m& J3G:@Gӄ!1v%l>>/,# l|ʘ:eu&ٞ==m' EX9aIvH?]oO$\(2l_fbMA({!&_:meWbmoG3x1eOU}mL"a9I)CTb&^x s_W* 8%`L}wBCH}gHW>;jٸd,F]`5_Za3 B2D1%io#0# I`nNMka^x` ) |]( fy-׮]C- RyWc%  #Z/`(dsJ׶>ExP)m̙ ^)LQ^`m%/lvU@0oʇģ}1·(q̹!XbL: ;{cKH ?r'Kj%\;?&<nt+e`]w1X8ySp÷+u+8p(+rg_jcL0G\X. Sw}!`flcƝ*J^bU-=.\JmLcS&`xluYB#}xP}}ςГ/1r+r2,8˾R!ajB VsSLupctaNar pdԈ)h[0eOA%E269Zˑoj2d#){J .eښ+k֤W<+ڷg9;b춞_`]i\:,d7L İ]66_Dcoc\KzhVr)/m \D9aT_hdۖcb]~cA'Nuz#x˸>o/R|,C^wx (JxҶp@WJ,k\=I>cELɭ3{& B!m*1S/ SF `8[nj?E]%R|bˠmE}ׄ&L/6ekq28(YLG`]Ȯ:&~^CFgJ 6DHb9m3ej%>ʠV-꣙-oo:mוp48 xY*3r]1xG-f,(:Rf}729:}L$OG 1V4 ː +! YJD0TLE TK7 .Y& !b]# Ǘu'g^>E!W(p0_pebPSl_WʵnNcBb{CbnTޣf t/Bˤ0V ,YZ>xcA0+ς;Ϭ'Gqfw<<^a#+"< ^ t|XX!gÃhʆi>m(7b6m';0_167mٰeӓaSq86fWp~2DiTbM)ù$摵 w KH$Y|$u3/6B]'V!6@ aO7xcVH91eZ7c = ^5{  Eʊ7Uh⺆a0oQ \~ ga#`ړo.`RF& 89xm:,e 7rh}.xcp:kxC _ʫ3^Aʟ+fDS7!c5 #hLV;'0:ij}MK.|#T`0Qi*^@{+!r{qa.VڱEje.$dUR A(cBMA%eiCrTτA >1JH18'o<@94{zvSv+oˊ=s<!L>R`p߻( 1Nlb rM7HGIKө)Piڭ_3VU1hp|y'g٫_s'Tmyg?{8Z[#o^meB٤s+gN|;+1l}@y8wx.gor);: R: M~ȥϔL9Is=X҆4hULz *pvB f]ƘX>Qz],@B0}B"U$`PYj=-@XJ|ckSx$jL7( "<`fxq}?tRX-Ef;Rri+tGB D/( W*Ҏ#Cݮ=%'z9<|0^QgEORWJ3.<^Y~%W{a\$4|?VMX 4VV/QzkX0AomԳҴ-_S9r*ò8ȓW`|J4]9kkG=J-9_, 7[~0AM"R Vx婴sD;(x1>6jړ- b"h` AGM5B: =0|RʽvwiexӞ_m^mɗTu??8>#oܫ[>0ʛH~ p/ɚ }==xwmD?^l;]H-A!b7AN렎#:y2^7Lߔ&y}ӄA"ƯngK40g~0[iݤ)C" uR64G=h-O98V6 . >̝'> ]Z1peF*^]^u;/y VYlz!~`Op?}}Es[.:)2 (aüD@BR)B#i[>bV&9SV^Z΁+lQW3Fx_ެ6XuBNAPaPYixڵKC0}St۪C(J6B3cp-Zs'Vb\=arBߞi^o'<-mi'?4վvFS>p3eX~"aH%{0D=g<z׷-O{j~m -B BnӮ0zBr? у H}91KFyx0e\6FM6/zыZoO9G( Nɽ>gXx9uCA ڝi5}d;B___p`NM1)QO$ ve).x|y r̥e" {)އi:Sh61cтz&ڇ'8ԟէ xJ<{(gGl+-s2y*W_RMgu\|{,uDxYrBwa0j1L `<=`?H`&}Mh-uW߆kZ*=p[Hpk)Lد9=*h5/saFã:9/+.zBMCce"xܻ,;uֱUk043C'ulȊ~'^pՆYڕ<WW\T\. crl1% \h"ئ{ط?EP2Ɵt1pu<=bGpP;Q*Y0pT7 p1 ;(nԛ+ 8j:mU1K ̱x-E͒QSzVk6k8?K>b]Pֽe ,ɒl:d2(?-©M'Gt:pN00Ԓ8gWz~5#큷>ܒ]*<,;α#8j];۩&,dUu:۶'>c~&es=qx7-n6vYvz}|ͤ=ڻ9G &NWX}{Va>IS\cz\[,Py86 8]j[{ |i×=޶Ξ'90!_ྼ޻8u>c`\!6򍀇z3gg&/xV:U`c7㡚)|ɖ[Cp9~CNϨ@80CrD<"oIW bLm)o[9MS8+9 ᨙ*l\=#O!B{{/aP Ɂ&b ^ fń~ }?YpUp:[r LxrSxx <[x2}}%z#Z PFO0 >dMv5kDG!d.!E䗏8Ϲp⧯SCC!Rj{uF`:iEpl͍ ?L25ഞ a=frpYJ@{߸pY0NQ4}@HE˦@ǵ\ Xc.xz~[ݧX\r 9΋ M),޶bj y) ĵwL@S<Hi`\Ám&K,A:? o0wL4v_1msfiM-vNm+&P2|2^si)xShk*>4(pmSN'ub?̚3*jåmJ1!7xl ~z^^\gyN»ԭꟌO˶d\=E.O\2diU/>ˏ&qL@SM>\6o;ahKK=bvĶԙHi4ʩN7(0I``BGKk9UN*%фbY3!o]x|s}h|>r-BMa/ <`%|gzmj)Š^GSSr6LUa?H:.\8TtxxYІ8hоᛱZKiBAO!*=r[R@M4(*K Mѕ{N6uQ ڢX,zsK)/kӆ?<|c#}(TU_^^v27\h F3+5BWst}=oA@Yb-j\4W }; {_Dow"j~1#B{ςeA\3#\QmI^c? +<0C!xh~CW,í`K}Sɻ/MUe|^XQ~x@Kqۧ3^M`v\L'g$yGOX}GnQ^S$tvq_ݦ̲G>3׀|<$es$Obնcld)q1 c>!"B`X\0T,Y `4s1xRQDXՉr;g> 7]%[Xq# vO[wp*YI,\ `u_6NIDATBrR J ~)d$>Sv.yځ+ʓПd?IQEXCYc܇w)?7^J! Ro F(m1 $KcMic|cXtqQT!j.75\B`b ˩/}KۘV`]FӌWPo*@dWwq C\e {X_4 ?EY'6CȹIѤSS.P}QrYqyi:n}o+RW>|IIJB'_T^Ù{4n"ygLpo| Q?z;oy[f(Mh>%4Mx` `rļ5k#4hmn[~gѣCŘL|pXt*&hq|aLSPUKQ`qk5L\+p1>O ƳK]٘p'ןD`H DXdTFo6Me(:7aԮ: Q)ȓ ͛P?e1NdMu߂fWy1ݲ՗$eOBP> 7/]@GPA4{SB@shM+/r #('^Gбr8o8Aut$W˚Kw@i%u+YSɷǁU`K0Y+9룯NSSrP7k*jp[@ò/y_}E:uܛYJ.܍w;Ҋ7Ze@"tr9 Q0;'p8FC_pGE83AJ>_-߲g*qXFh۸/Fi u" gY 3`T?Y [ӳ`={ Y;p)>ֵWe 'qZ^Ѯ l }p]mePuJ XhV qۂs]=23|PP ,2 6;9X bs\]12AM\M&Yuch2y .RO \vq}` \,'12yλ]iA C.?,kM%Q 1-']zr[ͩ#nb 0 g2fFl̐E,63T @( J^ Kq mCŀ8`%W[\BmxXxݒi^?45̲x˞ĺx Rml۴}yu€cuC]tKPKqvj5շ[T0lQwPSm<;`mcwu^>} G`"(ނx$8o6Mq6Ԏ rI\:ޭXO̭UkԔMIuYe=pqڊYD<K^Ny `=ߛ7׍0 Bxﹱ"|LB[e?8VrgE޷15-Z2~' h:x#zTFA0˵uagV' N1i#,׾d+ 0djF̲lr0 Ay8$P)o9.MNe2Pb+ʵ_G)+I7Z.9fjUGx+ƋnvƈuVڟl/ ]}6-gEwf ;]ߔY7.oRHb" f]-Egs BbJ&̙~/5xY - f=,u?{bi H@eX;lA,  g50S?慧R4TF׏(qxGՎI X=:wxh`1RN"4ผ{#f3T~s jRvlXJ94ԯ( .܋',o5v9NgG;gX1C;ͬGH.J)7v4(z7mV_m]ld|:*vA~Go{$㜃jWA銺1!؇v u"پoN1Kk 8[)in3E)'Й301A4k@ ;C NB1SVivRJiSxbG)s™MDNZ c0a g)pݡ鏄 c)P &ڒk(IJ( m7%do@ٲRz8!)"&zkuX\9n .(nF˜bη:Ӭ@a0KU6KMK6nsP=fGJU,B1g`˻` #Iw$F;,#Ņ6`ǵcLwlmq%`N﫭͔>z]%:fM(OB=hV:*30dKiN5r8!hD` J–R بH\a qK$$4E+vJTR};\v'2Jel*|,*EgWW.0U֯o=!)ERю|_gU+JF(a$9`<)qwJ'Y*;..>3 x 9 :L}vCʠp!r/G޾NɔQ{%*j\U5#5Fdd" 4͇ Y Ggx6dsK?L,\A%ҀAỴ(XGQz3ᵀ@yaⴝӞHܘ? `h;xAb$ - {3 Lh`^h<kK祀eVN?x0hkIqؽ`@^b,S/{)b[$Qaw9!T6 _p^_#pҡ}Y+1^0'Ц3+EPUSB³懕5fED0Eqk( .Epxy"Sի8g'q٣\^G5HypoȤ_<.b*c =E$Y(&`X~xmi|_[Q7m2熺 `5pG0,PCD ~/v*Os-VcD`pq*+= B`-ͦj'DyH.JS)0Fzs G7U Lw}ֲ?/[4_78Ѳq 咜9(X岉[~SaMX rv4{roqnPyZ,yC|}u6E'?G\f z)Dax9D0NݳRjy9n'p‰|?N^x27wONJ %j=v^.pݸDCٴMNwXR#BY^8DK%Ӟ>5'Ũh9"!b#T*r͌Y c:e5ScLhj>j9f-u!Mvms54._섓`|I`x Ї#fS0N= >O /ֻ&h8"ߗH*SLZM<™ `Ko\11<H7g8WGe;bᐡGh8Da1Gk\1"U0ݔ5X :}^$7=#ֱc(r@M udـ8`qpӲCÀ-Yĕ`2)!QMy)?hhw7SIENDB`php-imlib-0.7/web/example.1.inc0000644000175000017500000000200507174521303015722 0ustar vorlonvorlon
<?php

// If you compile php_imlib as a self-contained extension, you'll need to
// load it here.

//dl('imlib.so');

if (!isset($file) || $file == 'none')
{
   ?>
   <form method="post" action="<?= $PHP_SELF ?>" enctype="multipart/form-data">
   Filename<br><input type="file" name="file"><br>
   <input type="submit" name="Scale">
   </form>
   <?php
}
else
{
   $src = imlib_load_image($file);
   $width = imlib_image_get_width($src);
   $height = imlib_image_get_height($src);
   $ratio = $height / $width;
   $dst = imlib_create_cropped_scaled_image($src, 0,0, $width,$height,
                                            200, 200 * $ratio);

   // Alternatively, you could simply say
   //$dst = imlib_create_scaled_image($src, 200, '');

   Header('Content-type: image/' . imlib_image_format($src));
   imlib_dump_image($dst);
   imlib_free_image($src);
   imlib_free_image($dst);
}

?>
php-imlib-0.7/web/global.css0000644000175000017500000000136207230256216015415 0ustar vorlonvorlonBODY { color: #000000; background-color: #cccccc; } TD.d-cell { color: #000000; background-color: #dddddd; vertical-align: top; } TD.d-nav { color: #000000; background-color: #dddddd; text-align: center; font-size: 10px; vertical-align: top; } TD.d-navpipe { color: #000000; background-color: #dddddd; text-align: center; font-size: 8px; vertical-align: top; } TH.d-cell, TD.d-dark { color: #000000; background-color: #bbbbbb; vertical-align: top; } .d-title { font-family: Arial, Helvetica, Geneva, sans-serif; font-size: 12px; font-weight: 800; text-decoration: none; } .d-field { font-family: Arial, Helvetica, Geneva, sans-serif; font-size: 12px; text-decoration: none; } php-imlib-0.7/web/index.php0000644000175000017500000001234507227215414015267 0ustar vorlonvorlon

This extension, as one might expect, provides access to Rasterman's excellent image library, Imlib2. The extension is coming together fairly well, with probably four fifths of the Imlib2 API ported which I've been aiming for (There are parts of Imlib2 used specifically for X applications, which of course, we don't need in a PHP extension). See the About and Documentation sections for more information on the extension.

Here's a brief list of what php_imlib does so far:

  • Loading, saving, and writing to stdout of jpegs and png's (And other non-web-relevant formats)
  • Image modifications: Cropping, scaling, blending, flipping, rotating, seamless tiling, blurring, sharpening
  • Drawing primitives (rectangles, lines, ellipses, n-point polygons) including support for a clipping rectangle
  • Text drawing with TTF fonts
  • Color ranges (gradients)

You can find php_imlib here. See the Downloads section for requirements information.

News
January 10, 2001 Version 0.3
It's probably been a bit more than "the next few days" to some folks, but the holidays are funny that way, I suppose. Anyway, 0.3 is done and ready for use, judgement, and criticism. The announcement is here, and the tarball is here. Fair warning about the color range support: In the course of adding it, I noticed a bug in Imlib2 1.0.0, which causes imlib_image_fill_color_range_rectangle to segfault if you call it before adding at least two colors to the color range. So, don't do that.
December 23, 2000 Upcoming release
With the release of PHP 4.0.4, a modest API change was made which will break php_imlib <= 0.2. So, in the next few days we'll be seeing version 0.3 come out to fix this, and to add a modest few features. For now it looks like the new features will be color range (gradient) support and image compression/quality setting. On the bugfix front, there's also a somewhat significant fix to imlib_blend_image_onto_image, which doesn't behave correctly in prior releases when blending images with alpha channels.
November 1, 2000 Version 0.2
Well, I'm releasing 0.2 with two days to spare on my "one or two weeks" time estimate. Briefly, this release adds all the drawing stuff mentioned below, image rotation, flipping, tiling, a much better set of PHP classes, and no Xlib requirement.
October 20, 2000 More Updates
All drawing functions now obey an optional clipping rectangle that can restrict how much of the image they can draw on. Pretty slick. On the PHP side, the class files are coming out nicely, here's one of the class files, and some example code that uses most of the functionality currently in place. Feedback on this is especially encouraged.

There's not much left to do before releasing 0.2, probably in one or two weeks. Most of the work at this point is documentation, some examples, etc.
October 16, 2000 Imlib2 1.0.0 Released
Well, the first stable release of Imlib2 has been sent out. php_imlib 0.2 will require it, since it fixes several important bugs, and adds some drawing functions.
October 15, 2000 Imlib2 sans Xlib
Raster recently accepted a patch from our own Steve Langasek which removes the dependency of Xlib from Imlib2. In other news, I added polygon drawing and cliprect support, so all in all it was a good wekend.
October 9, 2000 Development Update
Just a quick update on where things are heading, I've added the drawing routines and flip/tile stuff. So, there's two things off my todo list. Polygons will be in by next week. After that, it's going to be mostly PHP-side coding, getting some good class files fleshed out that should make development nice and clean.
October 5, 2000 Version 0.1
First public release of php_imlib, with image loading/saving, cropping, scaling, and text drawing implemented.
php-imlib-0.7/web/header.inc0000644000175000017500000000311007227017505015361 0ustar vorlonvorlon <? echo $title ?>
PHP Imlib2 Extension (php_imlib) v0.3
Home' ?> | About' ?> | Documentation' ?> | Downloads' ?> | Examples' ?>

php-imlib-0.7/web/documentation.php0000644000175000017500000003201507226735032017027 0ustar vorlonvorlon Documentation

Below is a brief blurb about each of the functions in the php_imlib extension. For examples of how these are used, see the examples page. There are also some PHP classes included with php_imlib (Which also have examples posted on the examples page). These classfiles have been documented using the PHPDoc documentation system. That documentation can be found here.

Predefined Constants

imlib_add_color_to_color_range
imlib_blend_image_onto_image
imlib_clone_image
imlib_create_color_range
imlib_create_cropped_image
imlib_create_cropped_scaled_image
imlib_create_image
imlib_create_rotated_image
imlib_create_scaled_image
imlib_dump_image
imlib_free_color_range
imlib_free_font
imlib_free_image
imlib_get_text_size
imlib_image_blur
imlib_image_draw_ellipse
imlib_image_draw_line
imlib_image_draw_polygon
imlib_image_draw_rectangle
imlib_image_fill_color_range_rectangle
imlib_image_fill_ellipse
imlib_image_fill_polygon
imlib_image_fill_rectangle
imlib_image_flip_horizontal
imlib_image_flip_vertical
imlib_image_flip_diagonal
imlib_image_format
imlib_image_get_filename
imlib_image_get_height
imlib_image_get_width
imlib_image_has_alpha
imlib_image_modify_alpha
imlib_image_set_format
imlib_image_sharpen
imlib_image_tile_horizontal
imlib_image_tile_vertical
imlib_image_tile
imlib_list_fonts
imlib_load_font
imlib_load_image
imlib_polygon_add_point
imlib_polygon_contains_point
imlib_polygon_free
imlib_polygon_get_bounds
imlib_polygon_new
imlib_save_image
imlib_text_draw
Getting and Setting Image Parameters
string imlib_image_format(int img)
Returns the image format of an image


string imlib_image_get_filename(int img)
Returns the filename of an image


int imlib_image_get_height(int img)
Returns the height of an image


int imlib_image_get_width(int img)
Returns the width of an image


bool imlib_image_has_alpha(int img)
Return a boolean for whether or not an image has an alpha channel


void imlib_image_modify_alpha(int img, int alpha)
Set the alpha channel of an image, or modify it if one was already present


void imlib_image_set_format(int img, string format)
Sets the image format of an image.

Loading/Saving Functions
void imlib_free_image(int img)
Free an image


int imlib_load_image(string img[, int &err])
Load a file into an image, optionally fetch an error parameter


bool imlib_save_image(int img, string name[, int &err[, int quality]])
Save an image to a file, at an optional quality level (1-100) for jpegs. For pngs, the value will be converted to a compression level (0-9)

Creation Functions
int imlib_clone_image(int img)
Duplicate an image


int imlib_create_color_range()
Create a new color range


int imlib_create_cropped_image(int img, int srcx, int srcy, int srcw, int srch)
Create an image from a cropped region of another image


int imlib_create_cropped_scaled_image(int img, int srcx, int srcy, int srcw, int srch, int dstw, int dsth)
Create a scaled image from a cropped region of another image


int imlib_create_image(int w, int h)
Create a new image with the specified dimensions


int imlib_create_rotated_image(int srcimg, int degrees[, int radians])
Create a rotated copy of an image. If radians is specified, degrees will be ignored.


int imlib_create_scaled_image(int img, int dstw, int dsth)
Create a scaled copy of an image. If dstw or dsth is left blank, the aspect ratio of the source image will be preserved.


bool imlib_dump_image(int img[, int &err[, int quality]])
Output an image at an optional quality setting

Rendering Functions
void imlib_blend_image_onto_image(int dstimg, int srcimg, int malpha, int srcx, int srcy, int srcw, int srch, int dstx, int dsty, int dstw, int dsth, char dither, char blend, char alias)
Blend a rectangular area from an image onto an area of another image, scaling as necessary

Image Modification Functions
void imlib_image_blur(int img, int radius)
Blur an image with a given blur radius


void imlib_image_flip_horizontal(int img)
Flip an image horizontally


void imlib_image_flip_vertical(int img)
Flip an Imlib_Image vertically


void imlib_image_flip_diagonal(int img)
Flip an image diagonally


void imlib_image_sharpen(int img, int radius)
Sharpen an image with a given sharpen radius


void imlib_image_tile_horizontal(int img)
Tile an image horizontally


void imlib_image_tile_vertical(int img)
Tile an image vertically


void imlib_image_tile(int img)
Tile an image horizontally and diagonally

Drawing on Images
bool imlib_image_draw_ellipse(int img, int xc, int yc, int w, int h, int r, int g, int b, int a[, array cliprect])
Draw an ellipse of the specified size and color on an image


bool imlib_image_draw_line(int img, int x1, int y1, int x2, int y2, int r, int g, int b, int a[, array cliprect])
Draw a line of the specified size and color on an image


bool imlib_image_draw_polygon(int img, int polygon, bool closed, int r, int g, int b, int a[, array cliprect])
Draw the defined polygon on an image


bool imlib_image_draw_rectangle(int img, int x, int y, int w, int h, int r, int g, int b, int a[, array cliprect])
Draw a rectangle of the specified size and color on an image


bool imlib_image_fill_color_range_rectangle(int im, int cr, int x, int y, int width, int height, int angle)
Fill a rectangle with a color range at a given angle on an image


void imlib_image_fill_ellipse(int img, int xc, int yc, int w, int h, int r, int g, int b, int a[, array cliprect])
Fill an ellipse of the specified size and color on an image


bool imlib_image_fill_polygon(int img, int polygon, int r, int g, int b, int a[, array cliprect])
Draw and fill the defined polygon on an image


void imlib_image_fill_rectange(int img, int x, int y, int w, int h, int r, int g, int b, int a[, array cliprect])
Fill a rectangle of the specified size and color on an image

Fonts and Text Functions
void imlib_free_font(int font)
Free a font


void imlib_get_text_size(int font, string str, int &w, int &h, int direction)
Determines the width and height of a string if drawn with a given font in the specified direction


array imlib_list_fonts()
Return an array of all the fonts available in the font path


int imlib_load_font(string fontname)
Load a font


void imlib_text_draw(int img, int font, int x, int y, string str, int direction, int r, int g, int b, int a)
Draw a text string using a font onto an image

Color Ranges
void imlib_add_color_to_color_range(int cr, int x, int r, int g, int b, int a)
Add a color to a color range at a specified distance from the previous color in the range. A distance of 0 centers it


void imlib_free_color_range(int cr)
Free a color range

Polygons
void imlib_polygon_add_point(int polygon, int x, int y)
Add a point to a given polygon


bool imlib_polygon_contains_point(int polygon, int x, int y)
Check if a give point is inside a polygon


void imlib_polygon_free(int polygon)
Free a polygon


void imlib_polygon_get_bounds(int polygon, int &x1, int &y1, int &x2, int &y2)
Get the bounding coords of a polygon


int imlib_polygon_new()
Create a new polygon
php-imlib-0.7/web/about.php0000644000175000017500000000465507226700032015271 0ustar vorlonvorlon About php_imlib

The general idea behind php_imlib is to mimick the function names and their parameters as closely as possible at the extension level. However since Imlib2 uses a singleton context that I'd rather not duplicate in the extension, most functions will require extra parameters to establish context. As we've developed php_imlib, a few needs have also come up which Imlib2 doesn't address. In those cases we've defined functions in php_imlib which aren't present in Imlib2. So far we've added three functions: imlib_dump_image, for outputting an image to stdout (Comporable to GD's ImagePng($im)), imlib_image_modify_alpha, and imlib_create_scaled_image, a shortcut of imlib_create_cropped_scaled_image, which is ideal for creating a scaled copy of the whole image quickly, such as for generating thumbnails.

To combat the need to have a large number parameters for some of the more complex functions, I had written a single PHP class to wrap the extension in version 0.1. However as I developed 0.2, that clearly became insufficent. So, starting with 0.2 I've included a handful of more reasonably sized classes that spread things out nicely. I'm fairly pleased with how they've turned out, but as always, feedback is encouraged. More extensive documentation on the classes is available in the phpdoc directory.

In the first release, I had also included an abstract image class that allowed the use of GD and php_imlib with the same class. At least for the time being, that's been scrapped, since it was never implemented fully at the time, and would've occupied far more time than it was worth this time around. So, I filed that one away under "bad idea".

What's Wrong With GD?

There's nothing wrong with GD, I just wanted an alternative. Aside from that, Imlib2 is a faster, more powerful library.

Caveats

Imlib2 is not thread safe. While this isn't a large concern at the moment, it will become a more important issue as Apache 2 develops and threaded httpd installations become more common.

php-imlib-0.7/web/example.2.inc0000644000175000017500000000076710515373312015736 0ustar vorlonvorlon
<?php

// If you compile php_imlib as a self-contained extension, you'll need to
// load it here.

//dl('imlib.so');

/*
 * This will draw a string of text.  Quite thrilling, I tell you.
 */

Header('Content-type: image/png');

$fnt = imlib_load_font('./Vera/25');
$im = imlib_create_image(300,50);
imlib_text_draw($im,$fnt,5,5,'Text String in Vera Sans.',IMLIB_TEXT_TO_RIGHT,
                255,255,255,255);
imlib_dump_image($im);
imlib_free_font($fnt);
imlib_free_image($im);

?>
php-imlib-0.7/web/examples.php0000644000175000017500000000343307225576034016002 0ustar vorlonvorlon Script Examples

Here are some examples of using the php_imlib extension. The first two use only the functions provided in php_imlib, the rest use the PHP classes.

  • Extension: Upload and Scale an Image' ?>
  • Extension: Draw a Text String' ?>
  • PHP Classes: Flip, Blend, Text' ?>
  • PHP Classes: Draw Rect, Poly, Ellipse' ?>
  • PHP Classes: Gradients, Transparency' ?>

The image created by

php-imlib-0.7/web/example.3.inc0000644000175000017500000000673710515373312015742 0ustar vorlonvorlon The image created by this script is available here.
<?php

/*
 * This example takes a source image and outputs an image with four
 * scaled copies of the image.  The original, and the image flipped
 * using the three flip functions: horizontal, vertical, and diagonal.
 *
 * The images are labeled using the ImlibText class, and a background
 * is filled behind them using a filled rectangle from the ImlibDraw class.
 */

require './class.ImlibImage.php';
require './class.ImlibColor.php';
require './class.ImlibCliprect.php';
require './class.ImlibDraw.php';
require './class.ImlibText.php';

$padding = 20;
$thumbw = 170;
$thumbh = '';	// If this is left blank, the height will be calculated
$bgarray = Array(220,115,115,255);
$textarray = Array(255,255,255,255);
$srcname = './lain-closetheworld.png';

// $mode can be 'horizontal', 'vertical', or 'diagonal'
function flipCreate($obj,$mode)
{
   $cb = "flip_$mode";
   $obj->$cb();
   $new = $obj->create_clone();
   $obj->$cb();
   return $new;
}

$im = new ImlibImage();
$im->load($srcname);
$orig = $im->create_scaled($thumbw,$thumbh);
$im->free();
$imw = $orig->get_width();
$imh = $orig->get_height();

// Create the image large enough to fit four scaled copies of $srcname
$dst = new ImlibImage();
$dst->create(2*$imw + 3*$padding, 2*$imh + 5*$padding);

// Load in a font and set the color and image to draw on
$txt = new ImlibText();
$txt->set_color_array($textarray);
$txt->set_image($dst->get_id());
$txt->load('','./Vera',16);

// Get a drawing object and set its color and image to draw on
$box = new ImlibDraw();
$box->set_color_array($bgarray);
$box->set_image($dst->get_id());

$orig_alpha = $orig->has_alpha();
$box->fill_rectangle($padding-3,$padding-3, $imw+6,$imh+6);
$txt->draw($padding,$padding+$imh,'Original');
$orig->blend_onto_image($dst->get_id(),0,0,$orig_alpha,$imw,$imh,
                        $padding,$padding, $imw,$imh,0,$orig_alpha,0);

$horiz = flipCreate($orig,'horizontal');
$horiz_alpha = $horiz->has_alpha();
$box->fill_rectangle(2*$padding-3+$imw,$padding-3, $imw+6,$imh+6);
$txt->draw(2*$padding+$imw,$padding+$imh,'Horizontal');
$horiz->blend_onto_image($dst->get_id(),0,0,$horiz_alpha,$imw,$imh,
                         2*$padding+$imw,$padding, $imw,$imh,0,$horiz_alpha,0);

$vert = flipCreate($orig,'vertical');
$vert_alpha = $vert->has_alpha();
$box->fill_rectangle($padding-3,3*$padding-3+$imh, $imw+6,$imh+6);
$txt->draw($padding,3*$padding+2*$imh,'Vertical');
$vert->blend_onto_image($dst->get_id(),0,0,$vert_alpha,$imw,$imh,$padding,
                        3*$padding+$imh,$imw,$imh,0,$vert_alpha,0);

// In order to keep things simple, this image will be cropped off if it's
// not square.  This is done to keep things simple.  To show the whole
// diagonally cropped image, the dimensions for $dst would need to be
// calculated from the resulting height of the diagonal version of the image
$diag = flipCreate($orig,'diagonal');
$diag_alpha = $diag->has_alpha();
$box->fill_rectangle(2*$padding-3+$imw,3*$padding-3+$imh, $imw+6,$imh+6);
$txt->draw(2*$padding+$imw,3*$padding+2*$imh,'Diagonal');
$diag->blend_onto_image($dst->get_id(),0,0,$diag_alpha,$imw,$imh,2*$padding+$imw,
                        3*$padding+$imh,$imw,$imh,0,$diag_alpha,0);

$dst->save('./flip.png');
$dst->free();

?>
php-imlib-0.7/web/example.4.inc0000644000175000017500000000361207174533553015744 0ustar vorlonvorlon The image created by this script is available here.
<?php

/*
 * This example draws a variety of shapes on an otherwise black image.
 * Demonstrates draw/filled rectangles, polygins, cliprects, ellipses, etc.
 */

require './class.ImlibImage.php';
require './class.ImlibColor.php';
require './class.ImlibText.php';
require './class.ImlibCliprect.php';
require './class.ImlibDraw.php';
require './class.ImlibPoly.php';

$im = new ImlibImage();
$im->create(225,260);

$outlinecolor = Array(255,0,0,255);
$color = Array(255,127,0,255);

$box = new ImlibDraw();
$box->set_image($im->get_id());
$box->set_color_array($outlinecolor);
$box->draw_rectangle(7,7,106,56);
$box->set_color_array($color);
$box->fill_rectangle(10,10,100,50);

$poly = new ImlibPoly();
$poly->new_poly();
$poly->set_image($im->get_id());
$poly->set_color(255,0,255,255);
$poly->add_point(100,100);
$poly->add_point(215,110);
$poly->add_point(150,215);
$poly->add_point(102,255);

// The cliprect will leave a gap in the middle of this polygon
$poly->set_cliprect(100,50,125,110);	// Draw the top
$poly->draw();
$poly->set_cliprect(100,190,125,70);	// Draw the bottom
$poly->draw();
$poly->free();

$poly->set_cliprect(0,0,0,0);	// Turns off the clipping rectangle
$poly->new_poly();
$poly->set_color(255,255,255,255);
$poly->add_point(106,106);
$poly->add_point(205,115);
$poly->add_point(147,211);
$poly->add_point(106,245);

$poly->draw();
$poly->free();

// This will draw a few pseudo-randomly colored ellipses
$j = 30;
for ($i = 90; $i < 260; $i += 20)
{
   $box->set_color($i,$i*2,255-$i*2,255);
   $box->draw_ellipse($j,$i,10,$j/2);
   $j += 20;
   if ($j > 70)
      $j = 25;
}

$im->save('./draw.png');
$im->free();

?>
php-imlib-0.7/web/example.5.inc0000644000175000017500000000300207225463111015723 0ustar vorlonvorlon The image created by this script is available here.
<?php

/*
 * This example is mostly for playing with color ranges (gradients)
 * and alpha channels.
 */

require './package.Imlib.php';

$red = Array(255,35,35,255);
$blue = Array(35,65,255,255);
$text = Array(200,220,255,255);
$shadow = Array(10,10,10,100);

// Create objects
$im = new ImlibImage;
$cr = new ImlibColorRange;
$d = new ImlibDraw;
$t = new ImlibText;

// Set up objects
$im->create(250,150);
$cr->create();
$cr->set_image($im->get_id());
$d->set_image($im->get_id());
$t->set_image($im->get_id());
$t->load('','banco.ttf','25');

// Large blue rectangle and gradient
$d->set_color(22,28,235,255);
$d->fill_rectangle(10,10,210,110);
$cr->add_color_array(0, $red);
$cr->add_color(0,0,225,225,255);
$cr->add_color_array(0, $blue);
$cr->fill_rectangle(15,15,200,100,125);

// Text with semitransparent shadow
$t->set_color_array($shadow);
$t->draw(43,48,'Showing off.');
$t->set_color_array($text);
$t->draw(40,45,'Showing off.');

// Purple semitransparent square
$d->set_color(195,105,195,127);
$d->fill_rectangle(30,90,50,50);

// Green-to-transparent gradient square
$cr->free();
$cr->create();
$cr->add_color(0,0,255,0,0);
$cr->add_color(0,0,255,0,50);
$cr->add_color(0,0,255,0,255);
$cr->fill_rectangle(90,90,50,50,235);

$im->save('testdraw.png',50);

?>
php-imlib-0.7/CREDITS0000644000175000017500000000125307353305511013704 0ustar vorlonvorlonThe Obligatory Credits File =========================== Contributors ------------ Matt McClanahan * Project maintainer Steve Langasek * Feedback, debugging, patches * Configurable font path, imlib_dump_image, other good stuff. Piotr Pawlow * Cache size control, image filter support, bugfixes Thanks to --------- The Rasterman (Carsten Haitzler) Mandrake (Geoff Harrison) and all the folks in imlib2's AUTHORS file * Imlib2 Tom Gilbert (gilbrit, giblet, grubby) * feh, a great reference for how the heck you make Imlib2 work php-imlib-0.7/Makefile.in0000644000175000017500000000035307164553263014742 0ustar vorlonvorlon# $Id: Makefile.in 90 2000-09-28 05:27:15Z vorlon $ LTLIBRARY_NAME = libimlib.la LTLIBRARY_SOURCES = imlib.c LTLIBRARY_SHARED_NAME = imlib.la LTLIBRARY_SHARED_LIBADD = $(IMLIB_LIBADD) include $(top_srcdir)/build/dynlib.mk php-imlib-0.7/LICENSE0000644000175000017500000000713007167033371013676 0ustar vorlonvorlon-------------------------------------------------------------------- The PHP License, version 2.02 Copyright (c) 1999, 2000 The PHP Group. All rights reserved. -------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, is permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name "PHP" must not be used to endorse or promote products derived from this software without prior permission from the PHP Group. This does not apply to add-on libraries or tools that work in conjunction with PHP. In such a case the PHP name may be used to indicate that the product supports PHP. 4. The PHP Group may publish revised and/or new versions of the license from time to time. Each version will be given a distinguishing version number. Once covered code has been published under a particular version of the license, you may always continue to use it under the terms of that version. You may also choose to use such covered code under the terms of any subsequent version of the license published by the PHP Group. No one other than the PHP Group has the right to modify the terms applicable to covered code created under this License. 5. Redistributions of any form whatsoever must retain the following acknowledgment: "This product includes PHP, freely available from http://www.php.net/". 6. The software incorporates the Zend Engine, a product of Zend Technologies, Ltd. ("Zend"). The Zend Engine is licensed to the PHP Association (pursuant to a grant from Zend that can be found at http://www.php.net/license/ZendGrant/) for distribution to you under this license agreement, only as a part of PHP. In the event that you separate the Zend Engine (or any portion thereof) from the rest of the software, or modify the Zend Engine, or any portion thereof, your use of the separated or modified Zend Engine software shall not be governed by this license, and instead shall be governed by the license set forth at http://www.zend.com/license/ZendLicense/. THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------- This software consists of voluntary contributions made by many individuals on behalf of the PHP Group. The PHP Group can be contacted via Email at group@php.net. For more information on the PHP Group and the PHP project, please see . php-imlib-0.7/config.m40000644000175000017500000000171110205105131014354 0ustar vorlonvorlonPHP_ARG_WITH(imlib, for imlib2 support, [ --with-imlib[=DIR] Include imlib support. DIR is the Imlib2 base directory, defaults to /usr/local.]) AC_DEFUN(AC_TEMP_LDFLAGS,[ old_LDFLAGS="$LDFLAGS" LDFLAGS="$1 $LDFLAGS" $2 LDFLAGS="$old_LDFLAGS" ]) if test "$PHP_IMLIB" != "no"; then AC_DEFINE(HAVE_IMLIB, 1, [ ]) PHP_EXTENSION(imlib, $ext_shared) for i in /usr/local /usr $PHP_IMLIB; do if test -f $i/include/Imlib2.h; then IMLIB2_DIR=$i fi done if test -z "$IMLIB2_DIR"; then AC_MSG_ERROR(Cannot find imlib2) fi IMLIB2_LIBDIR=$IMLIB2_DIR/lib IMLIB2_INCDIR=$IMLIB2_DIR/include AC_TEMP_LDFLAGS(-L$IMLIB2_LIBDIR,[ AC_CHECK_LIB(Imlib2, imlib_load_image, [AC_DEFINE(HAVE_IMLIB2,1,[ ])], [AC_MSG_ERROR(Imlib2 module requires CVS Imlib2)]) ]) PHP_ADD_LIBRARY_WITH_PATH(Imlib2, $IMLIB2_LIBDIR, IMLIB_SHARED_LIBADD) PHP_SUBST(IMLIB_SHARED_LIBADD) PHP_ADD_INCLUDE($IMLIB2_INCDIR) fi php-imlib-0.7/README0000644000175000017500000000612207367361150013552 0ustar vorlonvorlonPHP Imlib2 Extension (php_imlib) ================================ This extension, as one might expect, provides access to Rasterman's excellent image library, Imlib2. The extension is coming together fairly well, with probably four fifths of the Imlib2 API ported which I've been aiming for (There are parts of Imlib2 used specifically for X applications, which of course, we don't need in a PHP extension). See "About php_imlib" below and the contents of the docs directory for more information on the extension. Requirements ------------ See INSTALL for where to get the required libraries. Imlib2, freetype, libjpeg, and libpng should work on most Unices, I don't know how portable edb is. Briefly, the requirements are: A Unix or Linux OS PHP >= 4.0.6 Imlib2 >= 1.0.3 edb >= 1.0 freetype >= 1.3.1 libjpeg libpng What's Wrong With GD? --------------------- There's nothing wrong with GD, I just wanted an alternative. Aside from that, Imlib2 is a faster, more powerful library. Caveats ------- Imlib2 is not thread safe. While this isn't a large concern at the moment, it will become a more important issue as Apache 2 develops and threaded httpd installations become more common. About php_imlib --------------- The general idea behind php_imlib is to mimick the function names and their parameters as closely as possible at the extension level. However since Imlib2 uses a singleton context that I'd rather not duplicate in the extension, most functions will require extra parameters to establish context. As we've developed php_imlib, a few needs have also come up which Imlib2 doesn't address. In those cases we've defined functions in php_imlib which aren't present in Imlib2. So far we've added three functions: imlib_dump_image, for outputting an image to stdout (Comporable to GD's ImagePng($im)), imlib_image_modify_alpha, and imlib_create_scaled_image, a shortcut of imlib_create_cropped_scaled_image, which is ideal for creating a scaled copy of the whole image quickly, such as for generating thumbnails. To combat the need to have a large number parameters for some of the more complex functions, I had written a single PHP class to wrap the extension in version 0.1. However as I developed 0.2, that clearly became insufficent. So, starting with 0.2 I've included a handful of more reasonably sized classes that spread things out nicely. I'm fairly pleased with how they've turned out, but as always, feedback is encouraged. More extensive documentation on the classes is available in the phpdoc directory. In the first release, I had also included an abstract image class that allowed the use of GD and php_imlib with the same code. At least for the time being, that's been scrapped, since it was never implemented fully at the time, and would've occupied far more time than it was worth this time around. So, I filed that one away under "bad idea". Function Reference ------------------ The extension functions are covered in docs/api.txt, the class files are covered in the phpdoc directory (html only). Both are available online: http://mmcc.cx/php_imlib/documentation.php http://mmcc.cx/php_imlib/phpdoc/ php-imlib-0.7/TODO0000644000175000017500000000042507353306125013356 0ustar vorlonvorlonNo particular order: * Merge in image filters patches * Color modifiers? * Script-specific font paths * Different operations (add, subtract, reshade, etc) * Functions for reading/writing raw image data (For storage in DB's) Eh. Not sure about this one. * Text at any angle php-imlib-0.7/php_imlib.h0000644000175000017500000001231110205120072014760 0ustar vorlonvorlon/* +----------------------------------------------------------------------+ | PHP version 4.0 | +----------------------------------------------------------------------+ | Copyright (c) 2000, 2001 Matt McClanahan | | Copyright (c) 2000, 2001, 2005 Steve Langasek | +----------------------------------------------------------------------+ | This source file is subject to version 2.02 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available at through the world-wide-web at | | http://www.php.net/license/2_02.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | | | | Alternatively, you may distribute and/or modify this code under the | | terms of version 2 of the GNU Library General Public License as | | published by the Free Software Foundation. | | | | This software is distributed in the hope that it will be useful, | | but WITHOUT ANY WARRANTY; without even the implied warranty of | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | | Library General Public License for more details. | | | | You should have received a copy of the GNU Library General Public | | License in the file COPYING accompanying this software; if not, | | write to the Free Software Foundation, Inc., | | 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | | | +----------------------------------------------------------------------+ | Authors: Matt McClanahan | | Steve Langasek | +----------------------------------------------------------------------+ */ #ifndef _PHP_IMLIB_H #define _PHP_IMLIB_H #include #include #include "config.h" #if HAVE_IMLIB #ifdef ZTS #include "TSRM.h" #endif extern zend_module_entry imlib_module_entry; #define phpext_imlib_ptr &imlib_module_entry #ifdef PHP_WIN32 #define PHP_IMLIB_API __declspec(dllexport) #else #define PHP_IMLIB_API #endif PHP_MINIT_FUNCTION(imlib); PHP_MSHUTDOWN_FUNCTION(imlib); PHP_RINIT_FUNCTION(imlib); PHP_RSHUTDOWN_FUNCTION(imlib); PHP_MINFO_FUNCTION(imlib); PHP_INI_MH(OnUpdateFontCacheSize); PHP_FUNCTION(imlib_add_color_to_color_range); PHP_FUNCTION(imlib_blend_image_onto_image); PHP_FUNCTION(imlib_clone_image); PHP_FUNCTION(imlib_create_color_range); PHP_FUNCTION(imlib_create_cropped_image); PHP_FUNCTION(imlib_create_cropped_scaled_image); PHP_FUNCTION(imlib_create_image); PHP_FUNCTION(imlib_create_rotated_image); PHP_FUNCTION(imlib_create_scaled_image); PHP_FUNCTION(imlib_free_color_range); PHP_FUNCTION(imlib_free_font); PHP_FUNCTION(imlib_free_image); PHP_FUNCTION(imlib_get_text_size); PHP_FUNCTION(imlib_image_blur); PHP_FUNCTION(imlib_image_draw_ellipse); PHP_FUNCTION(imlib_image_draw_line); PHP_FUNCTION(imlib_image_draw_polygon); PHP_FUNCTION(imlib_image_draw_rectangle); PHP_FUNCTION(imlib_image_fill_color_range_rectangle); PHP_FUNCTION(imlib_image_fill_ellipse); PHP_FUNCTION(imlib_image_fill_polygon); PHP_FUNCTION(imlib_image_fill_rectangle); PHP_FUNCTION(imlib_image_flip_horizontal); PHP_FUNCTION(imlib_image_flip_vertical); PHP_FUNCTION(imlib_image_flip_diagonal); PHP_FUNCTION(imlib_image_format); PHP_FUNCTION(imlib_image_get_filename); PHP_FUNCTION(imlib_image_get_height); PHP_FUNCTION(imlib_image_get_width); PHP_FUNCTION(imlib_image_has_alpha); PHP_FUNCTION(imlib_image_modify_alpha); PHP_FUNCTION(imlib_image_set_format); PHP_FUNCTION(imlib_image_sharpen); PHP_FUNCTION(imlib_image_tile_horizontal); PHP_FUNCTION(imlib_image_tile_vertical); PHP_FUNCTION(imlib_image_tile); PHP_FUNCTION(imlib_list_fonts); PHP_FUNCTION(imlib_load_font); PHP_FUNCTION(imlib_load_image); PHP_FUNCTION(imlib_load_image_with_error_return); PHP_FUNCTION(imlib_polygon_add_point); PHP_FUNCTION(imlib_polygon_contains_point); PHP_FUNCTION(imlib_polygon_free); PHP_FUNCTION(imlib_polygon_get_bounds); PHP_FUNCTION(imlib_polygon_new); PHP_FUNCTION(imlib_save_image); PHP_FUNCTION(imlib_dump_image); PHP_FUNCTION(imlib_text_draw); PHP_FUNCTION(imlib_get_cache_size); PHP_FUNCTION(imlib_set_cache_size); ZEND_BEGIN_MODULE_GLOBALS(imlib) char *font_path; char **saved_path; int cache_size; int min_cache_size; int max_cache_size; ZEND_END_MODULE_GLOBALS(imlib) #ifdef ZTS #define IMLIBG(v) TSRMG(imlib_globals_id, zend_imlib_globals *, v) #else #define IMLIBG(v) (imlib_globals.v) #endif #else #define phpext_imlib_ptr NULL #endif #endif /* _PHP_IMLIB_H */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: */ php-imlib-0.7/phpdoc/0000755000175000017500000000000010643376336014151 5ustar vorlonvorlonphp-imlib-0.7/phpdoc/class_ImlibColorRange.xml0000644000175000017500000000767207226655567021115 0ustar vorlonvorlon/home/matt/src/cvs/imlib/docs/class.ImlibColorRange.phpMatt McClanahanAll functions relevant to creating and displaying color ranges0.3ImlibColorRange constructorfrom the previous colorA distance of 0 will center it between the previous color and the end.$x is ignored for the first color.Add a color to the color range at distance $x.from the previous colorarray (r,g,b,a)A distance of 0 will center it between the previous color and the end.$x is ignored for the first color.Add a color to the color range at distance $x.Resource id# of the new color rangeCreate a new color rangeFree the current color range-left X coordinate of the box-left Y coordinate of the boxof the boxof the boxto rotate the color range (degrees)The color range will be filled in the specified box at angle $angleFill the current image with a rectangle using the current color rangeid# of the imageSet the image to draw the color range onResource id# of the current color rangeResource id# of the image to draw onimlibcliprectget_cliprectget_cliprect_arrayget_cliprect_inuseset_cliprectset_cliprect_arrayset_cliprect_inuseimlibcolorget_colorget_color_arrayset_colorset_color_array$cliprect$cliprect_inuse$colorImlibCliprectImlibColorImlibColorphp-imlib-0.7/phpdoc/phpdoc_classtree.html0000644000175000017500000000477207226655567020404 0ustar vorlonvorlon PHP Imlib2 Classes - Classtrees
Packageindex Classtrees Modulegroups Elementlist Report XML Files

Classtrees

 

ImlibColor

 

ImlibImage


Packageindex Classtrees Modulegroups Elementlist Report XML Files
PHPDoc 1.0beta
php-imlib-0.7/phpdoc/class_ImlibColor.xml0000644000175000017500000000443707226655567020134 0ustar vorlonvorlon/home/matt/src/cvs/imlib/docs/class.ImlibColor.phpMatt McClanahanThe variables and methods in this class provide a way to get and set thecolor to be used by any text or drawing functions.Provides variables and methods for handling color0.3ImlibColor constructorRedBlueGreenAlphaFalse if a color isn&apos;t set, the color array otherwiseGet the four color components as by-reference variablesFalse if a color isn&apos;t set, the color array otherwiseGet the color array currently defined, if it is definedSet the current color using the four componentsarraySet the current color using an array of 4 elements (r,g,b,a)The array defining the color (r,g,b,a)ImlibCliprectImlibTextphp-imlib-0.7/phpdoc/class_ImlibImage.xml0000644000175000017500000002403007227013564020051 0ustar vorlonvorlon/home/matt/src/cvs/imlib/docs/class.ImlibImage.phpMatt McClanahanThis class contains methods for the loading and saving of image files. Alsocontained in this class are functions for getting and setting image parameters,image modification, and rendering.Handles image loading and saving, parameters, manipulation, and rendering.0.3ImlibImage constructorname of the function to callString or intCallback for functions which query the current instance&apos;s attributesname of the function to callCallback for functions which flip or tile the current instanceid# of the destination imagealphaleft source X coordinateleft source Y coordinatewidthheightleft destination X coordinateleft destination Y coordinatewidthheightBlend a region of the current image onto the region of another ImlibImageradiusBlur an image with a given blur radiusCreate a clone of the current instance, return a new ImlibImageleft X coordinate to crop fromleft Y coordinate to crop fromto cropto cropCreate a cropped ImlibImage from a region of the current instance, return a new ImlibImageleft X coordinate to crop fromleft Y coordinate to crop fromto cropto cropto scale the cropped region toto scale the cropped region toCreate a cropped, scaled ImlibImage from a region of the current instance, return a new ImlibImageget_id()$idof the imageof the imageResource id# that was createdCreate an image resource to use with this instanceto rotate the imageto rotate the imageIf radians is specified, degrees will be ignored.Create a rotated ImlibImage, return a new ImlibImageto scale the new image toto scale the new image to (Optional)If $height is not specified, it will be calculated from the dimensionsof the current image, so that the aspect ratio is preserved.Create a scaled ImlibImage, return a new ImlibImageor compression level to useOutput the raw image data of the current instance to stdoutFlip the current image diagonallyFlip the current image horizontallyFlip the current image verticallyFree the current instance and image resourceFilename string or false.Get the current filename, if it&apos;s setImage formatGet the current image format. The default is png.Image heightGet the current image&apos;s height$idcreate()Current resource id#Get the current image&apos;s resource id#Image widthGet the current image&apos;s widthCheck if the image has an alpha channelalpha level to set for the imageSet the alpha channel of an imageerror number. 0 for no error.Resource id# or false if load failedLoad an image file into the current instanceor compression level to useFalse if the save failedSave the current instance to a fileformatSet the image format for the current instanceradiusSharpen an image with a given sharpen radiusSeamlessly tile the current image both horizontally and verticallySeamlessly tile the current image horizontallySeamlessly tile the current image verticallycreate()get_id()The image resource id#php-imlib-0.7/phpdoc/packageelementlist_Imlib.html0000644000175000017500000000343307226655567022030 0ustar vorlonvorlon PHP Imlib2 Classes - Frameset Packageelements

Packagelist

Imlib

 
Classes
  ImlibColorRange
  ImlibDraw
  ImlibPoly
  ImlibCliprect
  ImlibText
  ImlibColor
  ImlibImage
php-imlib-0.7/phpdoc/phpdoc_xmlfiles.html0000644000175000017500000000527607226655567020242 0ustar vorlonvorlon - Modulegroups
Packageindex Classtrees Modulegroups Elementlist Report XML Files

XML Files

 

Packageindex Classtrees Modulegroups Elementlist Report XML Files
PHPDoc 1.0beta
php-imlib-0.7/phpdoc/class_ImlibPoly.xml0000644000175000017500000001120407226655567017767 0ustar vorlonvorlon/home/matt/src/cvs/imlib/docs/class.ImlibPoly.phpMatt McClanahanThe routine for getting a polygon onto an image is generally to create one,add all its points (The order in which the points are added determines howthe polygon will be drawn), set the image to draw on, and draw.Does everything relevant to creating and drawing or filling an n-point polygon0.3ImlibPoly constructorcoordinatecoordinateFalse if there is no polygon setAdd a point to the current polygoncoordinatecoordinateTrue if it does, false otherwiseChecks if the current polygon contains a given pointtrue, the polygon will be drawn with the endpoints connectedFalse if there is no polygon or image setDraw the current polygon on the current imageFalse if there is no polygon or image setFill the current polygon on the current imageFalse if there is no polygon or image setFree the current polygonleft X coordinateleft Y coordinateright X coordinateright Y coordinateFalse if there is no polygon or image setGet the bounds of the polygonCurrent image resource id#Get the current image resource id#Resource id# of the new polygonCreate a new polygonresource id#Set the image resource id# to draw onResource id# of the image to draw onThe resource id# of the current polygonimlibcliprectget_cliprectget_cliprect_arrayget_cliprect_inuseset_cliprectset_cliprect_arrayset_cliprect_inuseimlibcolorget_colorget_color_arrayset_colorset_color_array$cliprect$cliprect_inuse$colorImlibCliprectImlibColorImlibColorphp-imlib-0.7/phpdoc/elementlist.xml0000644000175000017500000003147007227013564017220 0ustar vorlonvorlonAll functions relevant to creating and displaying color rangesImlibColorRange constructorDoes everything relevant to drawing or filling ellipses, lines, or rectanglesImlibDraw constructorDoes everything relevant to creating and drawing or filling an n-point polygonImlibPoly constructorProvides variables and methods for a clipping rectangleImlibCliprect constructorDoes everything relevant to text drawingImlibText constructorProvides variables and methods for handling colorImlibColor constructorHandles image loading and saving, parameters, manipulation, and rendering.ImlibImage constructorAdd a color to the color range at distance $x.Add a color to the color range at distance $x.Add a point to the current polygonCreate a new color rangeCreate an image resource to use with this instanceResource id# of the current color rangeChecks if the current polygon contains a given pointThe array defining the cliprect (x,y,w,h)A boolean that determines if a cliprect is in use or notThe array defining the color (r,g,b,a)Create a clone of the current instance, return a new ImlibImageCreate a cropped ImlibImage from a region of the current instance, return a new ImlibImageCreate a cropped, scaled ImlibImage from a region of the current instance, return a new ImlibImageCreate a rotated ImlibImage, return a new ImlibImageCreate a scaled ImlibImage, return a new ImlibImageFree the current color rangeFree the current polygonFree the currently loaded fontFree the current instance and image resourceFill the current image with a rectangle using the current color rangeFill a rectangleFill an ellipseFill the current polygon on the current imageResource id# of the currently loaded fontFlip the current image diagonallyFlip the current image horizontallyFlip the current image verticallySet the image to draw the color range onSet the image resource id# to draw onSet the image resource id# to draw onSet the image resource id# to draw onSet the four values of the cliprect. 0 for X disables the cliprect.Set the array that defines the cliprect (x,y,w,h)Set the boolean that determines if the cliprect is in useSet the current color using the four componentsSet the current color using an array of 4 elements (r,g,b,a)Save the current instance to a fileSet the image format for the current instanceSharpen an image with a given sharpen radiusResource id# of the image to draw onResource id# of the image to draw onResource id# of the image to draw onResource id# of the image to draw onThe image resource id#Callback for drawing everythingCallback for functions which query the current instance&apos;s attributesCallback for functions which flip or tile the current instanceDraw an ellipseDraw a lineDraw a rectangleDraw the current polygon on the current imageDraw a text string onto the current imageOutput the raw image data of the current instance to stdoutGet the current image resource id#Get the current image resource id#Get the current image resource id#Get the bounds of the polygonGet the four values of the cliprectGet the array that defines the cliprect (x,y,w,h)Get the boolean that determines if a cliprect is in use or notGet the width and height of a given string if it were drawnGet the four color components as by-reference variablesGet the color array currently defined, if it is definedGet the current filename, if it&apos;s setGet the current image format. The default is png.Get the current image&apos;s heightGet the current image&apos;s resource id#Get the current image&apos;s widthCreate a new polygonThe resource id# of the current polygonLoad a fontLoad an image file into the current instanceBlend a region of the current image onto the region of another ImlibImageBlur an image with a given blur radiusCheck if the image has an alpha channelSet the alpha channel of an imageSeamlessly tile the current image both horizontally and verticallySeamlessly tile the current image horizontallySeamlessly tile the current image verticallyphp-imlib-0.7/phpdoc/class_ImlibText.xml0000644000175000017500000000724707226655567020004 0ustar vorlonvorlon/home/matt/src/cvs/imlib/docs/class.ImlibText.phpMatt McClanahanThe routine for dealing text is to load a font, set an image to draw on,and draw a string.Does everything relevant to text drawing0.3ImlibText constructorcoordinate of the upper left corner of the stringcoordinate of the upper left corner of the stringstring to drawof the textFalse if no font is loadedDraw a text string onto the current imageFalse if no font is loadedFree the currently loaded fontImage resource id#Get the current image resource id#to measureWidth the string would beHeight the string would beto measure the stringFalse if no font is loadedGet the width and height of a given string if it were drawn, or current directory if passed blanknamesizeFalse if no font is loadedIf the font is in the font path, it can be referred to by font name,and the path does not need to be specified. Otherwise, it must bereferred to by filename.Load a fontresource id#Set the image resource id# to draw onResource id# of the currently loaded fontResource id# of the image to draw onimlibcolorget_colorget_color_arrayset_colorset_color_array$colorImlibColorImlibColorphp-imlib-0.7/phpdoc/ImlibCliprect.html0000644000175000017500000004516707226655567017607 0ustar vorlonvorlon PHP Imlib2 Classes - Imlib - Class: ImlibCliprect
Packageindex Classtrees Modulegroups Elementlist Report XML Files

File: /home/matt/src/cvs/imlib/docs/class.ImlibCliprect.php
PHP Imlib2 Classes - Imlib

ImlibCliprect

ImlibColor
   |
  +-- ImlibCliprect

Provides variables and methods for a clipping rectangle

 

public class ImlibCliprect extends ImlibColor

Provides variables and methods for a clipping rectangle
The variables and methods in this class provide a clipping rectangle thatcan be used by any drawing function to restrict drawing/filling to arectangular region.

AuthorsMatt McClanahan <cardinal@dodds.net>
Version0.3

 
Direct known subclasses: ImlibColorRange, ImlibDraw, ImlibPoly

Methods inherited from ImlibColor

imlibcolor, get_color, get_color_array, set_color, set_color_array

Public Method Summary

void

ImlibCliprect()

ImlibCliprect constructor
void

get_cliprect(int &$x, int &$y, int &$w, int &$h)

Get the four values of the cliprect
array

get_cliprect_array()

Get the array that defines the cliprect (x,y,w,h)
bool

get_cliprect_inuse()

Get the boolean that determines if a cliprect is in use or not
void

set_cliprect(int $x, int $y, int $w, int $h)

Set the four values of the cliprect. 0 for X disables the cliprect.
void

set_cliprect_array(array $arr)

Set the array that defines the cliprect (x,y,w,h)
void

set_cliprect_inuse(bool $set)

Set the boolean that determines if the cliprect is in use

Fields inherited from ImlibColor

$color

Private Field Summary

array

$cliprect

The array defining the cliprect (x,y,w,h)
bool

$cliprect_inuse

A boolean that determines if a cliprect is in use or not

Public Method Details

ImlibCliprect

public void ImlibCliprect( )

  ImlibCliprect constructor

Returns void


get_cliprect

public void get_cliprect( int &$x, int &$y, int &$w, int &$h )

  Get the four values of the cliprect

Parameter
int &$x
left X coordinate to clip from
int &$y
left Y coordinate to clip from
int &$w
of the cliprect
int &$h
of the cliprect
Returns void

See Also set_cliprect()

get_cliprect_array

public array get_cliprect_array( )

  Get the array that defines the cliprect (x,y,w,h)

Returns array

Array defining the clipping rectangle

See Also set_cliprect_array()

get_cliprect_inuse

public bool get_cliprect_inuse( )

  Get the boolean that determines if a cliprect is in use or not

Returns bool

True if the cliprect is in use

See Also set_cliprect_inuse()

set_cliprect

public void set_cliprect( int $x, int $y, int $w, int $h )

  Set the four values of the cliprect. 0 for X disables the cliprect.

Parameter
int $x
left X coordinate to clip from
int $y
left Y coordinate to clip from
int $w
of the cliprect
int $h
of the cliprect
Returns void

See Also get_cliprect()

set_cliprect_array

public void set_cliprect_array( array $arr )

  Set the array that defines the cliprect (x,y,w,h)

Parameter
array $arr
that defines the cliprect
Returns void

See Also get_cliprect_array()

set_cliprect_inuse

public void set_cliprect_inuse( bool $set )

  Set the boolean that determines if the cliprect is in use

Parameter
bool $set
to enable, false to disable
Returns void

See Also get_cliprect_inuse()

Private Field Details

$cliprect

private array $cliprect

>><<

The array defining the cliprect (x,y,w,h)


$cliprect_inuse

private bool $cliprect_inuse

>><<

A boolean that determines if a cliprect is in use or not



Packageindex Classtrees Modulegroups Elementlist Report XML Files
PHPDoc 1.0beta
php-imlib-0.7/phpdoc/phpdoc_elementlist.html0000644000175000017500000005501607227013564020723 0ustar vorlonvorlon PHP Imlib2 Classes - Elementlist
Packageindex Classtrees Modulegroups Elementlist Report XML Files
a b c d f g h I i l m n p s t _

a

add_color Function in class ImlibColorRange
Add a color to the color range at distance $x.
add_color_array Function in class ImlibColorRange
Add a color to the color range at distance $x.
add_point Function in class ImlibPoly
Add a point to the current polygon

b

blend_onto_image Function in class ImlibImage
Blend a region of the current image onto the region of another ImlibImage
blur Function in class ImlibImage
Blur an image with a given blur radius

c

create Function in class ImlibColorRange
Create a new color range
create Function in class ImlibImage
Create an image resource to use with this instance
$cr Variable in Class ImlibColorRange
Resource id# of the current color range
contains_point Function in class ImlibPoly
Checks if the current polygon contains a given point
$cliprect Variable in Class ImlibCliprect
The array defining the cliprect (x,y,w,h)
$cliprect_inuse Variable in Class ImlibCliprect
A boolean that determines if a cliprect is in use or not
$color Variable in Class ImlibColor
The array defining the color (r,g,b,a)
create_clone Function in class ImlibImage
Create a clone of the current instance, return a new ImlibImage
create_cropped Function in class ImlibImage
Create a cropped ImlibImage from a region of the current instance, return a new ImlibImage
create_cropped_scaled Function in class ImlibImage
Create a cropped, scaled ImlibImage from a region of the current instance, return a new ImlibImage
create_rotated Function in class ImlibImage
Create a rotated ImlibImage, return a new ImlibImage
create_scaled Function in class ImlibImage
Create a scaled ImlibImage, return a new ImlibImage

d

draw_ellipse Function in class ImlibDraw
Draw an ellipse
draw_line Function in class ImlibDraw
Draw a line
draw_rectangle Function in class ImlibDraw
Draw a rectangle
draw Function in class ImlibPoly
Draw the current polygon on the current image
draw Function in class ImlibText
Draw a text string onto the current image
dump Function in class ImlibImage
Output the raw image data of the current instance to stdout

f

free Function in class ImlibColorRange
Free the current color range
free Function in class ImlibPoly
Free the current polygon
free Function in class ImlibText
Free the currently loaded font
free Function in class ImlibImage
Free the current instance and image resource
fill_rectangle Function in class ImlibColorRange
Fill the current image with a rectangle using the current color range
fill_rectangle Function in class ImlibDraw
Fill a rectangle
fill_ellipse Function in class ImlibDraw
Fill an ellipse
fill Function in class ImlibPoly
Fill the current polygon on the current image
$fnt Variable in Class ImlibText
Resource id# of the currently loaded font
flip_diagonal Function in class ImlibImage
Flip the current image diagonally
flip_horizontal Function in class ImlibImage
Flip the current image horizontally
flip_vertical Function in class ImlibImage
Flip the current image vertically

g

get_image Function in class ImlibDraw
Get the current image resource id#
get_image Function in class ImlibPoly
Get the current image resource id#
get_image Function in class ImlibText
Get the current image resource id#
get_bounds Function in class ImlibPoly
Get the bounds of the polygon
get_cliprect Function in class ImlibCliprect
Get the four values of the cliprect
get_cliprect_array Function in class ImlibCliprect
Get the array that defines the cliprect (x,y,w,h)
get_cliprect_inuse Function in class ImlibCliprect
Get the boolean that determines if a cliprect is in use or not
get_size Function in class ImlibText
Get the width and height of a given string if it were drawn
get_color Function in class ImlibColor
Get the four color components as by-reference variables
get_color_array Function in class ImlibColor
Get the color array currently defined, if it is defined
get_filename Function in class ImlibImage
Get the current filename, if it's set
get_format Function in class ImlibImage
Get the current image format. The default is png.
get_height Function in class ImlibImage
Get the current image's height
get_id Function in class ImlibImage
Get the current image's resource id#
get_width Function in class ImlibImage
Get the current image's width

h

has_alpha Function in class ImlibImage
Check if the image has an alpha channel

I

ImlibColorRange Class ImlibColorRange.
All functions relevant to creating and displaying color ranges
ImlibColorRange Function in class ImlibColorRange
ImlibColorRange constructor
ImlibDraw Class ImlibDraw.
Does everything relevant to drawing or filling ellipses, lines, or rectangles
ImlibDraw Function in class ImlibDraw
ImlibDraw constructor
ImlibPoly Class ImlibPoly.
Does everything relevant to creating and drawing or filling an n-point polygon
ImlibPoly Function in class ImlibPoly
ImlibPoly constructor
ImlibCliprect Class ImlibCliprect.
Provides variables and methods for a clipping rectangle
ImlibCliprect Function in class ImlibCliprect
ImlibCliprect constructor
ImlibText Class ImlibText.
Does everything relevant to text drawing
ImlibText Function in class ImlibText
ImlibText constructor
ImlibColor Class ImlibColor.
Provides variables and methods for handling color
ImlibColor Function in class ImlibColor
ImlibColor constructor
ImlibImage Class ImlibImage.
Handles image loading and saving, parameters, manipulation, and rendering.
ImlibImage Function in class ImlibImage
ImlibImage constructor
Imlib Package

i

$im Variable in Class ImlibColorRange
Resource id# of the image to draw on
$im Variable in Class ImlibDraw
Resource id# of the image to draw on
$im Variable in Class ImlibPoly
Resource id# of the image to draw on
$im Variable in Class ImlibText
Resource id# of the image to draw on
$id Variable in Class ImlibImage
The image resource id#

l

load Function in class ImlibText
Load a font
load Function in class ImlibImage
Load an image file into the current instance

m

modify_alpha Function in class ImlibImage
Set the alpha channel of an image

n

new_poly Function in class ImlibPoly
Create a new polygon

p

$poly Variable in Class ImlibPoly
The resource id# of the current polygon

s

set_image Function in class ImlibColorRange
Set the image to draw the color range on
set_image Function in class ImlibDraw
Set the image resource id# to draw on
set_image Function in class ImlibPoly
Set the image resource id# to draw on
set_image Function in class ImlibText
Set the image resource id# to draw on
set_cliprect Function in class ImlibCliprect
Set the four values of the cliprect. 0 for X disables the cliprect.
set_cliprect_array Function in class ImlibCliprect
Set the array that defines the cliprect (x,y,w,h)
set_cliprect_inuse Function in class ImlibCliprect
Set the boolean that determines if the cliprect is in use
set_color Function in class ImlibColor
Set the current color using the four components
set_color_array Function in class ImlibColor
Set the current color using an array of 4 elements (r,g,b,a)
save Function in class ImlibImage
Save the current instance to a file
set_format Function in class ImlibImage
Set the image format for the current instance
sharpen Function in class ImlibImage
Sharpen an image with a given sharpen radius

t

tile Function in class ImlibImage
Seamlessly tile the current image both horizontally and vertically
tile_horizontal Function in class ImlibImage
Seamlessly tile the current image horizontally
tile_vertical Function in class ImlibImage
Seamlessly tile the current image vertically

_

_draw_something Function in class ImlibDraw
Callback for drawing everything
_get_cb Function in class ImlibImage
Callback for functions which query the current instance's attributes
_no_param_cb Function in class ImlibImage
Callback for functions which flip or tile the current instance
Packageindex Classtrees Modulegroups Elementlist Report XML Files
PHPDoc 1.0beta
php-imlib-0.7/phpdoc/packagelist.xml0000644000175000017500000000043407226655567017174 0ustar vorlonvorlonphp-imlib-0.7/phpdoc/phpdoc_packagelist.html0000644000175000017500000000741407226655567020702 0ustar vorlonvorlon PHP Imlib2 Classes - Packagelist
Packageindex Classtrees Modulegroups Elementlist Report XML Files

PHP Imlib2 Classes

Packagelist

Imlib

 
Classes
  ImlibColorRange
  ImlibDraw
  ImlibPoly
  ImlibCliprect
  ImlibText
  ImlibColor
  ImlibImage
Overview Packageindex Classtree Help

Packageindex Classtrees Modulegroups Elementlist Report XML Files
PHPDoc 1.0beta
php-imlib-0.7/phpdoc/phpdoc_warnings.html0000644000175000017500000000637607226655567020251 0ustar vorlonvorlon PHP Imlib2 Classes - Report
Packageindex Classtrees Modulegroups Elementlist Report XML Files

Warnings

 

/home/matt/src/cvs/imlib/docs/class.ImlibText.php

2 Warning(s).
 
[function] draw mismatch
4th parameter type '$dir' does match the the documented type 'int', possible error consider an update to '@param string $dir of the text' or '@param string of the text', the variable name is optional.
 
[function] get_size mismatch
4th parameter type '$dir' does match the the documented type 'int', possible error consider an update to '@param string $dir to measure the string' or '@param string to measure the string', the variable name is optional.
 

Packageindex Classtrees Modulegroups Elementlist Report XML Files
PHPDoc 1.0beta
php-imlib-0.7/phpdoc/classtree_ImlibColor.xml0000644000175000017500000000067707226655567021016 0ustar vorlonvorlonImlibColorRangeImlibDrawImlibPolyImlibCliprectImlibTextphp-imlib-0.7/phpdoc/class_ImlibDraw.xml0000644000175000017500000001136307226655567017747 0ustar vorlonvorlon/home/matt/src/cvs/imlib/docs/class.ImlibDraw.phpMatt McClanahanDoes everything relevant to drawing or filling ellipses, lines, or rectangles0.3ImlibDraw constructorparamparamparamparamname of the function to callFalse if no image is set yetSince all the drawing functions work the same way, this functiondoes all the work. It takes four ints, often x,y,w,h, and passesthem to the specified function.Callback for drawing everythingX coordinateY coordinatehorizontal amplitudevertical amplitudeFalse if no image is set yetDraw an ellipseX coordinateY coordinateX coordinateY coordinateFalse if no image is set yetDraw a lineleft X coordinateleft Y coordinateFalse if no image is set yetDraw a rectangleX coordinateY coordinatehorizontal amplitudevertical amplitudeFalse if no image is set yetFill an ellipseleft X coordinateleft Y coordinateFalse if no image is set yetFill a rectangleGet the current image resource id#resource id#Set the image resource id# to draw onResource id# of the image to draw onimlibcliprectget_cliprectget_cliprect_arrayget_cliprect_inuseset_cliprectset_cliprect_arrayset_cliprect_inuseimlibcolorget_colorget_color_arrayset_colorset_color_array$cliprect$cliprect_inuse$colorImlibCliprectImlibColorImlibColorphp-imlib-0.7/phpdoc/ImlibColor.html0000644000175000017500000003214007226655567017103 0ustar vorlonvorlon PHP Imlib2 Classes - Imlib - Class: ImlibColor
Packageindex Classtrees Modulegroups Elementlist Report XML Files

File: /home/matt/src/cvs/imlib/docs/class.ImlibColor.php
PHP Imlib2 Classes - Imlib

ImlibColor

ImlibColor

Provides variables and methods for handling color

 

public class ImlibColor

Provides variables and methods for handling color
The variables and methods in this class provide a way to get and set thecolor to be used by any text or drawing functions.

AuthorsMatt McClanahan <cardinal@dodds.net>
Version0.3

 
Direct known subclasses: ImlibCliprect, ImlibText

Public Method Summary

void

ImlibColor()

ImlibColor constructor
mixed

get_color(int &$r, int &$g, int &$b, int &$a)

Get the four color components as by-reference variables
mixed

get_color_array()

Get the color array currently defined, if it is defined
void

set_color(int $r, int $g, int $b, int $a)

Set the current color using the four components
void

set_color_array(array $arr)

Set the current color using an array of 4 elements (r,g,b,a)

Private Field Summary

array

$color

The array defining the color (r,g,b,a)

Public Method Details

ImlibColor

public void ImlibColor( )

  ImlibColor constructor

Returns void


get_color

public mixed get_color( int &$r, int &$g, int &$b, int &$a )

  Get the four color components as by-reference variables

Parameter
int &$r
Red
int &$g
Blue
int &$b
Green
int &$a
Alpha
Returns mixed

False if a color isn't set, the color array otherwise


get_color_array

public mixed get_color_array( )

  Get the color array currently defined, if it is defined

Returns mixed

False if a color isn't set, the color array otherwise


set_color

public void set_color( int $r, int $g, int $b, int $a )

  Set the current color using the four components

Parameter
int $r
int $g
int $b
int $a
Returns void


set_color_array

public void set_color_array( array $arr )

  Set the current color using an array of 4 elements (r,g,b,a)

Parameter
array $arr
array
Returns void


Private Field Details

$color

private array $color

>><<

The array defining the color (r,g,b,a)



Packageindex Classtrees Modulegroups Elementlist Report XML Files
PHPDoc 1.0beta
php-imlib-0.7/phpdoc/classtree_ImlibImage.xml0000644000175000017500000000016507177475100020736 0ustar vorlonvorlonphp-imlib-0.7/phpdoc/ImlibImage.html0000644000175000017500000014715007227013564017041 0ustar vorlonvorlon PHP Imlib2 Classes - Imlib - Class: ImlibImage
Packageindex Classtrees Modulegroups Elementlist Report XML Files

File: /home/matt/src/cvs/imlib/docs/class.ImlibImage.php
PHP Imlib2 Classes - Imlib

ImlibImage

ImlibImage

Handles image loading and saving, parameters, manipulation, and rendering.

 

public class ImlibImage

Handles image loading and saving, parameters, manipulation, and rendering.
This class contains methods for the loading and saving of image files. Alsocontained in this class are functions for getting and setting image parameters,image modification, and rendering.

AuthorsMatt McClanahan <cardinal@dodds.net>
Version0.3

 

Public Method Summary

void

ImlibImage()

ImlibImage constructor
void

blend_onto_image(int $dst, bool $alpha, int $sx, int $sy, int $sw, int $sh, int $dx, int $dy, int $dw, int $dh, bool $dither, bool $blend, bool $alias)

Blend a region of the current image onto the region of another ImlibImage
void

blur(int $r)

Blur an image with a given blur radius
object ImlibImage

create_clone()

Create a clone of the current instance, return a new ImlibImage
object ImlibImage

create_cropped(int $sx, int $sy, int $sw, int $sh)

Create a cropped ImlibImage from a region of the current instance, return a new ImlibImage
object ImlibImage

create_cropped_scaled(int $sx, int $sy, int $sw, int $sh, int $dw, int $dh)

Create a cropped, scaled ImlibImage from a region of the current instance, return a new ImlibImage
int

create(int $width, int $height)

Create an image resource to use with this instance
object ImlibImage

create_rotated(float $degrees, [ float $radians ])

Create a rotated ImlibImage, return a new ImlibImage
object ImlibImage

create_scaled(integer $width, [ integer $height ])

Create a scaled ImlibImage, return a new ImlibImage
void

dump([ integer $quality ])

Output the raw image data of the current instance to stdout
void

flip_diagonal()

Flip the current image diagonally
void

flip_horizontal()

Flip the current image horizontally
void

flip_vertical()

Flip the current image vertically
void

free()

Free the current instance and image resource
mixed

get_filename()

Get the current filename, if it's set
string

get_format()

Get the current image format. The default is png.
integer

get_height()

Get the current image's height
integer

get_id()

Get the current image's resource id#
integer

get_width()

Get the current image's width
boolean

has_alpha()

Check if the image has an alpha channel
void

modify_alpha(int $alpha)

Set the alpha channel of an image
integer

load(string $infile, [ integer $err ])

Load an image file into the current instance
bool

save(string $outfile, [ integer $quality ])

Save the current instance to a file
void

set_format(string $format)

Set the image format for the current instance
void

sharpen(int $r)

Sharpen an image with a given sharpen radius
void

tile()

Seamlessly tile the current image both horizontally and vertically
void

tile_horizontal()

Seamlessly tile the current image horizontally
void

tile_vertical()

Seamlessly tile the current image vertically

Private Method Summary

mixed

_get_cb(string $cb)

Callback for functions which query the current instance's attributes
void

_no_param_cb(string $cb)

Callback for functions which flip or tile the current instance

Private Field Summary

integer

$id

The image resource id#

Public Method Details

ImlibImage

public void ImlibImage( )

  ImlibImage constructor

Returns void


blend_onto_image

public void blend_onto_image( int $dst, bool $alpha, int $sx, int $sy, int $sw, int $sh, int $dx, int $dy, int $dw, int $dh, bool $dither, bool $blend, bool $alias )

  Blend a region of the current image onto the region of another ImlibImage

Parameter
int $dst
id# of the destination image
bool $alpha
alpha
int $sx
left source X coordinate
int $sy
left source Y coordinate
int $sw
width
int $sh
height
int $dx
left destination X coordinate
int $dy
left destination Y coordinate
int $dw
width
int $dh
height
bool $dither
bool $blend
bool $alias
Returns void


blur

public void blur( int $r )

  Blur an image with a given blur radius

Parameter
int $r
radius
Returns void


create_clone

public object ImlibImage create_clone( )

  Create a clone of the current instance, return a new ImlibImage

Returns object ImlibImage


create_cropped

public object ImlibImage create_cropped( int $sx, int $sy, int $sw, int $sh )

  Create a cropped ImlibImage from a region of the current instance, return a new ImlibImage

Parameter
int $sx
left X coordinate to crop from
int $sy
left Y coordinate to crop from
int $sw
to crop
int $sh
to crop
Returns object ImlibImage


create_cropped_scaled

public object ImlibImage create_cropped_scaled( int $sx, int $sy, int $sw, int $sh, int $dw, int $dh )

  Create a cropped, scaled ImlibImage from a region of the current instance, return a new ImlibImage

Parameter
int $sx
left X coordinate to crop from
int $sy
left Y coordinate to crop from
int $sw
to crop
int $sh
to crop
int $dw
to scale the cropped region to
int $dh
to scale the cropped region to
Returns object ImlibImage


create

public int create( int $width, int $height )

  Create an image resource to use with this instance

Parameter
int $width
of the image
int $height
of the image
Returns int

Resource id# that was created

See Also get_id(), $id

create_rotated

public object ImlibImage create_rotated( float $degrees, [ float $radians ] )

  Create a rotated ImlibImage, return a new ImlibImage
If radians is specified, degrees will be ignored.

Parameter
float $degrees
to rotate the image
float $radians = >>0<<
to rotate the image
Returns object ImlibImage


create_scaled

public object ImlibImage create_scaled( integer $width, [ integer $height ] )

  Create a scaled ImlibImage, return a new ImlibImage
If $height is not specified, it will be calculated from the dimensionsof the current image, so that the aspect ratio is preserved.

Parameter
integer $width
to scale the new image to
integer $height = >>0<<
to scale the new image to (Optional)
Returns object ImlibImage


dump

public void dump( [ integer $quality ] )

  Output the raw image data of the current instance to stdout

Parameter
integer $quality = >>75<<
or compression level to use
Returns void


flip_diagonal

public void flip_diagonal( )

  Flip the current image diagonally

Returns void


flip_horizontal

public void flip_horizontal( )

  Flip the current image horizontally

Returns void


flip_vertical

public void flip_vertical( )

  Flip the current image vertically

Returns void


free

public void free( )

  Free the current instance and image resource

Returns void


get_filename

public mixed get_filename( )

  Get the current filename, if it's set

Returns mixed

Filename string or false.


get_format

public string get_format( )

  Get the current image format. The default is png.

Returns string

Image format


get_height

public integer get_height( )

  Get the current image's height

Returns integer

Image height


get_id

public integer get_id( )

  Get the current image's resource id#

Returns integer

Current resource id#

See Also $id, create()

get_width

public integer get_width( )

  Get the current image's width

Returns integer

Image width


has_alpha

public boolean has_alpha( )

  Check if the image has an alpha channel

Returns boolean


modify_alpha

public void modify_alpha( int $alpha )

  Set the alpha channel of an image

Parameter
int $alpha
alpha level to set for the image
Returns void


load

public integer load( string $infile, [ integer $err ] )

  Load an image file into the current instance

Parameter
string $infile
integer $err = >>0<<
error number. 0 for no error.
Returns integer

Resource id# or false if load failed


save

public bool save( string $outfile, [ integer $quality ] )

  Save the current instance to a file

Parameter
string $outfile
integer $quality = >>75<<
or compression level to use
Returns bool

False if the save failed


set_format

public void set_format( string $format )

  Set the image format for the current instance

Parameter
string $format
format
Returns void


sharpen

public void sharpen( int $r )

  Sharpen an image with a given sharpen radius

Parameter
int $r
radius
Returns void


tile

public void tile( )

  Seamlessly tile the current image both horizontally and vertically

Returns void


tile_horizontal

public void tile_horizontal( )

  Seamlessly tile the current image horizontally

Returns void


tile_vertical

public void tile_vertical( )

  Seamlessly tile the current image vertically

Returns void


Private Method Details

_get_cb

private mixed _get_cb( string $cb )

  Callback for functions which query the current instance's attributes

Parameter
string $cb
name of the function to call
Returns mixed

String or int


_no_param_cb

private void _no_param_cb( string $cb )

  Callback for functions which flip or tile the current instance

Parameter
string $cb
name of the function to call
Returns void


Private Field Details

$id

private integer $id

>><<

The image resource id#

See Also create(), get_id()


Packageindex Classtrees Modulegroups Elementlist Report XML Files
PHPDoc 1.0beta
php-imlib-0.7/phpdoc/warnings_parser.xml0000644000175000017500000000305007177475100020072 0ustar vorlonvorlonPHPDoc found 1 syntax error(s) in the tag list. Tag: &apos;@return object ImlibImage&apos; - Objectname is missing, syntax: &apos;@return (object objectname|type) [$varname] [description]&apos;..PHPDoc found 1 syntax error(s) in the tag list. Tag: &apos;@return object ImlibImage&apos; - Objectname is missing, syntax: &apos;@return (object objectname|type) [$varname] [description]&apos;..PHPDoc found 1 syntax error(s) in the tag list. Tag: &apos;@return object ImlibImage&apos; - Objectname is missing, syntax: &apos;@return (object objectname|type) [$varname] [description]&apos;..PHPDoc found 1 syntax error(s) in the tag list. Tag: &apos;@return object ImlibImage&apos; - Objectname is missing, syntax: &apos;@return (object objectname|type) [$varname] [description]&apos;..PHPDoc found 1 syntax error(s) in the tag list. Tag: &apos;@return object ImlibImage&apos; - Objectname is missing, syntax: &apos;@return (object objectname|type) [$varname] [description]&apos;..php-imlib-0.7/phpdoc/ImlibPoly.html0000644000175000017500000005203507226655567016755 0ustar vorlonvorlon PHP Imlib2 Classes - Imlib - Class: ImlibPoly
Packageindex Classtrees Modulegroups Elementlist Report XML Files

File: /home/matt/src/cvs/imlib/docs/class.ImlibPoly.php
PHP Imlib2 Classes - Imlib

ImlibPoly

ImlibColor
   |
  +-- ImlibCliprect
     |
    +-- ImlibPoly

Does everything relevant to creating and drawing or filling an n-point polygon

 

public class ImlibPoly extends ImlibCliprect

Does everything relevant to creating and drawing or filling an n-point polygon
The routine for getting a polygon onto an image is generally to create one,add all its points (The order in which the points are added determines howthe polygon will be drawn), set the image to draw on, and draw.

AuthorsMatt McClanahan <cardinal@dodds.net>
Version0.3

 

Methods inherited from ImlibCliprect

imlibcliprect, get_cliprect, get_cliprect_array, get_cliprect_inuse, set_cliprect, set_cliprect_array, set_cliprect_inuse

Methods inherited from ImlibColor

imlibcolor, get_color, get_color_array, set_color, set_color_array

Public Method Summary

void

ImlibPoly()

ImlibPoly constructor
bool

add_point(int $x, int $y)

Add a point to the current polygon
bool

contains_point(int $x, int $y)

Checks if the current polygon contains a given point
bool

draw([ integer $closed ])

Draw the current polygon on the current image
bool

fill()

Fill the current polygon on the current image
bool

free()

Free the current polygon
bool

get_bounds(int &$x1, int &$y1, int &$x2, int &$y2)

Get the bounds of the polygon
int

get_image()

Get the current image resource id#
int

new_poly()

Create a new polygon
void

set_image(int $im)

Set the image resource id# to draw on

Fields inherited from ImlibCliprect

$cliprect, $cliprect_inuse

Fields inherited from ImlibColor

$color

Private Field Summary

unknown

$im

Resource id# of the image to draw on
unknown

$poly

The resource id# of the current polygon

Public Method Details

ImlibPoly

public void ImlibPoly( )

  ImlibPoly constructor

Returns void


add_point

public bool add_point( int $x, int $y )

  Add a point to the current polygon

Parameter
int $x
coordinate
int $y
coordinate
Returns bool

False if there is no polygon set


contains_point

public bool contains_point( int $x, int $y )

  Checks if the current polygon contains a given point

Parameter
int $x
coordinate
int $y
coordinate
Returns bool

True if it does, false otherwise


draw

public bool draw( [ integer $closed ] )

  Draw the current polygon on the current image

Parameter
integer $closed = >>1<<
true, the polygon will be drawn with the endpoints connected
Returns bool

False if there is no polygon or image set


fill

public bool fill( )

  Fill the current polygon on the current image

Returns bool

False if there is no polygon or image set


free

public bool free( )

  Free the current polygon

Returns bool

False if there is no polygon or image set


get_bounds

public bool get_bounds( int &$x1, int &$y1, int &$x2, int &$y2 )

  Get the bounds of the polygon

Parameter
int &$x1
left X coordinate
int &$y1
left Y coordinate
int &$x2
right X coordinate
int &$y2
right Y coordinate
Returns bool

False if there is no polygon or image set


get_image

public int get_image( )

  Get the current image resource id#

Returns int

Current image resource id#


new_poly

public int new_poly( )

  Create a new polygon

Returns int

Resource id# of the new polygon


set_image

public void set_image( int $im )

  Set the image resource id# to draw on

Parameter
int $im
resource id#
Returns void


Private Field Details

$im

private unknown $im

>><<

Resource id# of the image to draw on


$poly

private unknown $poly

>><<

The resource id# of the current polygon



Packageindex Classtrees Modulegroups Elementlist Report XML Files
PHPDoc 1.0beta
php-imlib-0.7/phpdoc/ImlibColorRange.html0000644000175000017500000004676407226655567020101 0ustar vorlonvorlon PHP Imlib2 Classes - Imlib - Class: ImlibColorRange
Packageindex Classtrees Modulegroups Elementlist Report XML Files

File: /home/matt/src/cvs/imlib/docs/class.ImlibColorRange.php
PHP Imlib2 Classes - Imlib

ImlibColorRange

ImlibColor
   |
  +-- ImlibCliprect
     |
    +-- ImlibColorRange

All functions relevant to creating and displaying color ranges

 

public class ImlibColorRange extends ImlibCliprect

All functions relevant to creating and displaying color ranges

AuthorsMatt McClanahan <cardinal@dodds.net>
Version0.3

 

Methods inherited from ImlibCliprect

imlibcliprect, get_cliprect, get_cliprect_array, get_cliprect_inuse, set_cliprect, set_cliprect_array, set_cliprect_inuse

Methods inherited from ImlibColor

imlibcolor, get_color, get_color_array, set_color, set_color_array

Public Method Summary

void

ImlibColorRange()

ImlibColorRange constructor
void

add_color(int $x, int $r, int $g, int $b, int $a)

Add a color to the color range at distance $x.
void

add_color_array(int $x, array $arr)

Add a color to the color range at distance $x.
int

create()

Create a new color range
void

free()

Free the current color range
void

fill_rectangle(int $x, int $y, int $w, int $h, int $angle)

Fill the current image with a rectangle using the current color range
void

set_image(int $im)

Set the image to draw the color range on

Fields inherited from ImlibCliprect

$cliprect, $cliprect_inuse

Fields inherited from ImlibColor

$color

Private Field Summary

unknown

$cr

Resource id# of the current color range
unknown

$im

Resource id# of the image to draw on

Public Method Details

ImlibColorRange

public void ImlibColorRange( )

  ImlibColorRange constructor

Returns void


add_color

public void add_color( int $x, int $r, int $g, int $b, int $a )

  Add a color to the color range at distance $x.
A distance of 0 will center it between the previous color and the end.$x is ignored for the first color.

Parameter
int $x
from the previous color
int $r
int $g
int $b
int $a
Returns void


add_color_array

public void add_color_array( int $x, array $arr )

  Add a color to the color range at distance $x.
A distance of 0 will center it between the previous color and the end.$x is ignored for the first color.

Parameter
int $x
from the previous color
array $arr
array (r,g,b,a)
Returns void


create

public int create( )

  Create a new color range

Returns int

Resource id# of the new color range


free

public void free( )

  Free the current color range

Returns void


fill_rectangle

public void fill_rectangle( int $x, int $y, int $w, int $h, int $angle )

  Fill the current image with a rectangle using the current color range
The color range will be filled in the specified box at angle $angle

Parameter
int $x
-left X coordinate of the box
int $y
-left Y coordinate of the box
int $w
of the box
int $h
of the box
int $angle
to rotate the color range (degrees)
Returns void


set_image

public void set_image( int $im )

  Set the image to draw the color range on

Parameter
int $im
id# of the image
Returns void


Private Field Details

$cr

private unknown $cr

>><<

Resource id# of the current color range


$im

private unknown $im

>><<

Resource id# of the image to draw on



Packageindex Classtrees Modulegroups Elementlist Report XML Files
PHPDoc 1.0beta
php-imlib-0.7/phpdoc/ImlibText.html0000644000175000017500000004347507226655567016766 0ustar vorlonvorlon PHP Imlib2 Classes - Imlib - Class: ImlibText
Packageindex Classtrees Modulegroups Elementlist Report XML Files

File: /home/matt/src/cvs/imlib/docs/class.ImlibText.php
PHP Imlib2 Classes - Imlib

ImlibText

ImlibColor
   |
  +-- ImlibText

Does everything relevant to text drawing

 

public class ImlibText extends ImlibColor

Does everything relevant to text drawing
The routine for dealing text is to load a font, set an image to draw on,and draw a string.

AuthorsMatt McClanahan <cardinal@dodds.net>
Version0.3

 

Methods inherited from ImlibColor

imlibcolor, get_color, get_color_array, set_color, set_color_array

Public Method Summary

void

ImlibText()

ImlibText constructor
bool

draw(int $x, int $y, string $str, [ string $dir ])

Draw a text string onto the current image
bool

free()

Free the currently loaded font
integer

get_image()

Get the current image resource id#
bool

get_size(string $str, int &$w, int &$h, [ string $dir ])

Get the width and height of a given string if it were drawn
bool

load(string $path, string $font, int $size)

Load a font
void

set_image(int $im)

Set the image resource id# to draw on

Fields inherited from ImlibColor

$color

Private Field Summary

unknown

$fnt

Resource id# of the currently loaded font
unknown

$im

Resource id# of the image to draw on

Public Method Details

ImlibText

public void ImlibText( )

  ImlibText constructor

Returns void


draw

public bool draw( int $x, int $y, string $str, [ string $dir ] )

  Draw a text string onto the current image

Parameter
int $x
coordinate of the upper left corner of the string
int $y
coordinate of the upper left corner of the string
string $str
string to draw
string $dir = >>IMLIB_TEXT_TO_RIGHT<<
of the text
Returns bool

False if no font is loaded


free

public bool free( )

  Free the currently loaded font

Returns bool

False if no font is loaded


get_image

public integer get_image( )

  Get the current image resource id#

Returns integer

Image resource id#


get_size

public bool get_size( string $str, int &$w, int &$h, [ string $dir ] )

  Get the width and height of a given string if it were drawn

Parameter
string $str
to measure
int &$w
Width the string would be
int &$h
Height the string would be
string $dir = >>IMLIB_TEXT_TO_RIGHT<<
to measure the string
Returns bool

False if no font is loaded


load

public bool load( string $path, string $font, int $size )

  Load a font
If the font is in the font path, it can be referred to by font name,and the path does not need to be specified. Otherwise, it must bereferred to by filename.

Parameter
string $path
, or current directory if passed blank
string $font
name
int $size
size
Returns bool

False if no font is loaded


set_image

public void set_image( int $im )

  Set the image resource id# to draw on

Parameter
int $im
resource id#
Returns void


Private Field Details

$fnt

private unknown $fnt

>><<

Resource id# of the currently loaded font


$im

private unknown $im

>><<

Resource id# of the image to draw on



Packageindex Classtrees Modulegroups Elementlist Report XML Files
PHPDoc 1.0beta
php-imlib-0.7/phpdoc/phpdoc.css0000644000175000017500000000267407177475100016146 0ustar vorlonvorlonBODY { background-color : #EEEEEE; color : #000000; font-family : Arial, Tahoma, Helvetica, sans-serif; font-size : 10pt; margin-left : 1em; margin-right : 0; } A:LINK, A:VISITED { color : #000099; text-decoration : none; } A:HOVER { background-color : #FFFFFF; color : #00009F; text-decoration : none; } H1 { color : Black; font-family : Veranda, Tahoma, Arial, Helvetica; font-size : 16pt; padding-bottom : 5px; padding-top : 5px; padding-left : 5px; } H2 { color : Black; font-family : Verdana, Tahoma, Arial, Helvetica, sans-serif; font-size : 14pt; margin-top : 2em; } H3 { color : Navy; font-family : Verdana, Tahoma, Arial, Helvetica, sans-serif; font-size : 12pt; margin-top :1em; } H4 { color : Navy; font-family : Verdana, Tahoma, Arial, Helvetica, sans-serif; font-size : 11pt; background-color : #E6E6FA; padding-bottom : 2px; padding-top : 2px; padding-left : 2px; margin-top : 1em; } H5 { color : Navy; font-family : Verdana, Tahoma, Arial, Helvetica, sans-serif; font-size : 10pt; font-weight : 900; margin-bottom : -1em; } H6 { color : #000000; font-family : Arial, Helvetica, sans-serif; font-size : 10pt; font-weight : 800; margin-bottom : -1em; } BLOCKQUOTE { margin-left : 0; } CAPTION { font-family : Verdana, Tahoma, Arial, Helvetica, sans-serif; font-weight : 800; } TH { background-color : #FFFFFF; } TD { background-color : #F0F0F0; font-size : 10pt; } CODE { font-size: 8pt; } php-imlib-0.7/phpdoc/frame_packagelist.html0000644000175000017500000000077707226655567020524 0ustar vorlonvorlon PHP Imlib2 Classes - Frameset Packagelist

Packagelist

Imlib
php-imlib-0.7/phpdoc/class_ImlibCliprect.xml0000644000175000017500000000757707226655567020633 0ustar vorlonvorlon/home/matt/src/cvs/imlib/docs/class.ImlibCliprect.phpMatt McClanahanThe variables and methods in this class provide a clipping rectangle thatcan be used by any drawing function to restrict drawing/filling to arectangular region.Provides variables and methods for a clipping rectangle0.3ImlibCliprect constructorset_cliprect()left X coordinate to clip fromleft Y coordinate to clip fromof the cliprectof the cliprectGet the four values of the cliprectset_cliprect_array()Array defining the clipping rectangleGet the array that defines the cliprect (x,y,w,h)set_cliprect_inuse()True if the cliprect is in useGet the boolean that determines if a cliprect is in use or notget_cliprect()left X coordinate to clip fromleft Y coordinate to clip fromof the cliprectof the cliprectSet the four values of the cliprect. 0 for X disables the cliprect.get_cliprect_array()that defines the cliprectSet the array that defines the cliprect (x,y,w,h)get_cliprect_inuse()to enable, false to disableSet the boolean that determines if the cliprect is in useThe array defining the cliprect (x,y,w,h)A boolean that determines if a cliprect is in use or notimlibcolorget_colorget_color_arrayset_colorset_color_array$colorImlibColorImlibColorImlibColorRangeImlibDrawImlibPolyphp-imlib-0.7/phpdoc/warnings_classanalyser.xml0000644000175000017500000000147007226655567021462 0ustar vorlonvorlon4th parameter type &apos;$dir&apos; does match the the documented type &apos;int&apos;, possible error consider an update to &apos;@param string $dir of the text&apos; or &apos;@param string of the text&apos;, the variable name is optional.4th parameter type &apos;$dir&apos; does match the the documented type &apos;int&apos;, possible error consider an update to &apos;@param string $dir to measure the string&apos; or &apos;@param string to measure the string&apos;, the variable name is optional.php-imlib-0.7/phpdoc/ImlibDraw.html0000644000175000017500000006456207226655567016737 0ustar vorlonvorlon PHP Imlib2 Classes - Imlib - Class: ImlibDraw
Packageindex Classtrees Modulegroups Elementlist Report XML Files

File: /home/matt/src/cvs/imlib/docs/class.ImlibDraw.php
PHP Imlib2 Classes - Imlib

ImlibDraw

ImlibColor
   |
  +-- ImlibCliprect
     |
    +-- ImlibDraw

Does everything relevant to drawing or filling ellipses, lines, or rectangles

 

public class ImlibDraw extends ImlibCliprect

Does everything relevant to drawing or filling ellipses, lines, or rectangles

AuthorsMatt McClanahan <cardinal@dodds.net>
Version0.3

 

Methods inherited from ImlibCliprect

imlibcliprect, get_cliprect, get_cliprect_array, get_cliprect_inuse, set_cliprect, set_cliprect_array, set_cliprect_inuse

Methods inherited from ImlibColor

imlibcolor, get_color, get_color_array, set_color, set_color_array

Public Method Summary

void

ImlibDraw()

ImlibDraw constructor
bool

draw_ellipse(int $x, int $y, int $w, int $h)

Draw an ellipse
bool

draw_line(int $x1, int $y1, int $x2, int $y2)

Draw a line
bool

draw_rectangle(int $x, int $y, int $w, int $h)

Draw a rectangle
bool

fill_ellipse(int $x, int $y, int $w, int $h)

Fill an ellipse
bool

fill_rectangle(int $x, int $y, int $w, int $h)

Fill a rectangle
void

get_image()

Get the current image resource id#
void

set_image(int $im)

Set the image resource id# to draw on

Private Method Summary

bool

_draw_something(int $x, int $y, int $w, int $h, string $cb)

Callback for drawing everything

Fields inherited from ImlibCliprect

$cliprect, $cliprect_inuse

Fields inherited from ImlibColor

$color

Private Field Summary

unknown

$im

Resource id# of the image to draw on

Public Method Details

ImlibDraw

public void ImlibDraw( )

  ImlibDraw constructor

Returns void


draw_ellipse

public bool draw_ellipse( int $x, int $y, int $w, int $h )

  Draw an ellipse

Parameter
int $x
X coordinate
int $y
Y coordinate
int $w
horizontal amplitude
int $h
vertical amplitude
Returns bool

False if no image is set yet


draw_line

public bool draw_line( int $x1, int $y1, int $x2, int $y2 )

  Draw a line

Parameter
int $x1
X coordinate
int $y1
Y coordinate
int $x2
X coordinate
int $y2
Y coordinate
Returns bool

False if no image is set yet


draw_rectangle

public bool draw_rectangle( int $x, int $y, int $w, int $h )

  Draw a rectangle

Parameter
int $x
left X coordinate
int $y
left Y coordinate
int $w
int $h
Returns bool

False if no image is set yet


fill_ellipse

public bool fill_ellipse( int $x, int $y, int $w, int $h )

  Fill an ellipse

Parameter
int $x
X coordinate
int $y
Y coordinate
int $w
horizontal amplitude
int $h
vertical amplitude
Returns bool

False if no image is set yet


fill_rectangle

public bool fill_rectangle( int $x, int $y, int $w, int $h )

  Fill a rectangle

Parameter
int $x
left X coordinate
int $y
left Y coordinate
int $w
int $h
Returns bool

False if no image is set yet


get_image

public void get_image( )

  Get the current image resource id#

Returns void


set_image

public void set_image( int $im )

  Set the image resource id# to draw on

Parameter
int $im
resource id#
Returns void


Private Method Details

_draw_something

private bool _draw_something( int $x, int $y, int $w, int $h, string $cb )

  Callback for drawing everything
Since all the drawing functions work the same way, this functiondoes all the work. It takes four ints, often x,y,w,h, and passesthem to the specified function.

Parameter
int $x
param
int $y
param
int $w
param
int $h
param
string $cb
name of the function to call
Returns bool

False if no image is set yet


Private Field Details

$im

private unknown $im

>><<

Resource id# of the image to draw on



Packageindex Classtrees Modulegroups Elementlist Report XML Files
PHPDoc 1.0beta
php-imlib-0.7/INSTALL0000644000175000017500000000512107227017443013717 0ustar vorlonvorlonPHP Imlib2 Extension (php_imlib) ================================ Dependency Libraries -------------------- Before building this extension, Imlib2 will need to be installed somewhere on the system. Imlib2 itself depends on freetype for rendering text and the relevant underlying image libraries for the desired image formats. At the very least Imlib2 needs libpng and libjpeg. Lastly, Imlib2 needs a DB loader, edb. Where to find these libraries: (There may be more recent versions) Imlib2: http://www.us.rasterman.com/imlib.html http://www.us.rasterman.com/files/imlib2-1.0.0.tar.gz edb: ftp://ftp.enlightenment.org/pub/enlightenment/e17/libs/edb-1.0.2-1.i386.rpm ftp://ftp.enlightenment.org/pub/enlightenment/e17/libs/edb-1.0.2.tar.gz ftp://ftp.enlightenment.org/pub/enlightenment/e17/libs/edb-devel-1.0.2-1.i386.rpm freetype: http://freetype.sourceforge.net ftp://freetype.sourceforge.net/pub/freetype/freetype1/freetype-1.3.1.tar.gz http://rpmfind.net/linux/RPM/freetype.html http://rpmfind.net/linux/RPM/freetype-devel.html libjpeg: http://www.ijg.org ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz http://rpmfind.net/linux/RPM/libjpeg.html http://rpmfind.net/linux/RPM/libjpeg-devel.html libpng: http://www.libpng.org/pub/png/libpng.html http://www.libpng.org/pub/png/src/libpng-1.0.8.tar.gz http://rpmfind.net/linux/RPM/libpng.html http://rpmfind.net/linux/RPM/libpng-devel.html Built-in Extension Installation ------------------------------- To build php_imlib into PHP, extract the extension into the ext/ subdirectory of the PHP source tree, run buildconf, and recompile. tar -C /path/to/php_src/ext -zxvf php_imlib-0.3.tgz cd /path/to/php_src ./buildconf ./configure --with-imlib[=/path/to/Imlib2] [other args] make make install Standalone Installation ----------------------- To avoid recompiling PHP itself, build php_imlib as a self-contained extension (imlib.so) and reference it via either the extensions directive in php.ini, or with the dl() function from inside PHP. tar zxvf php_imlib-0.3.tgz cd imlib phpize ./configure [--with-imlib=/path/to/Imlib2] [other args] make make install Configuration ------------- The only relevant configuration parameter that php_imlib recognizes is imlib.font_path, used to define which directories are automatically checked for fonts. It can be set at a system or directory level, or if it isn't defined, the default value is /usr/local/share/fonts. php.ini example: [Imlib] imlib.font_path = /usr/local/share/fonts:/web/www.domain.com/fonts httpd.conf example: php_value imlib.font_path /web/www.domain.com/fonts php-imlib-0.7/COPYING0000644000175000017500000006654310205115560013725 0ustar vorlonvorlonGNU Lesser General Public License ********************************* Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble ======== The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does _Less_ to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a. The modified work must itself be a software library. b. You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c. You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d. If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a. Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b. Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at runtime a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c. Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d. If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e. Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a. Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b. Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries ============================================== If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ONE LINE TO GIVE THE LIBRARY'S NAME AND AN IDEA OF WHAT IT DOES. Copyright (C) YEAR NAME OF AUTHOR This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. SIGNATURE OF TY COON, 1 April 1990 Ty Coon, President of Vice That's all there is to it! php-imlib-0.7/CHANGES0000644000175000017500000000511510643377026013666 0ustar vorlonvorlon2007-07-05 * imlib.c: Steve Langasek Update the module for compatibility with PHP5; thanks to Piotr Pawlow. * Version 0.7 released 2006-10-18 * examples: Steve Langasek Remove ARIAL.TTF in favor of the legally redistributable Vera.ttf. * Version 0.6 released 2005-06-06 * imlib.c: Steve Langasek Remove the static definition of 'third_arg_force_ref', which shadows a declaration in the Zend headers and is therefore unnecessary with current versions of PHP. * Version 0.5 released 2005-02-15 * COPYING, imlib.c, php_imlib.h: Steve Langasek Dual-license under LGPL, with Matt's agreement. * Version 0.4 released 2005-02-10 * imlib.c, php_imlib.h: Steve Langasek Fix up code to conform to the ZTS API, necessary for building on Debian systems Fix up broken copyright headers, since this code is not copyright the PHP Group Add missing "static" keywords to a new helper function declaration. 2003-09-04 * config.m4: Steve Langasek Fix package build rules so they work with php 4.3's phpize 2001-09-23 * imlib.c, php_imlib.h: Piotr Pawlow Added cache control, several bugfixes to other code 2001-01-10 * Version 0.3 released 2001-01-09 * imlib.c, php_imlib.h, docs/class.ImlibImage.php: Matt McClanahan Added blur/sharpen support 2001-01-07 * imlib.c: Steve Langasek Implemented pass-by-ref arguments according to current standard. 2000-12-26 * imlib.c, docs/class.ImlibImage.php: Matt McClanahan Added image quality/compression setting to imlib_save_image and imlib_dump_image 2000-12-22 * imlib.c: Steve Langasek include php_config.h explicitly. Module now works with PHP 4.0.4. 2000-11-17 * imlib.c, php_imlib.h, docs/class.ColorRange.php: Matt McClanahan Added Imlib_Color_Range support. 2000-11-01 * Version 0.2 released 2000-10-20 * docs/class.*.php: Matt McClanahan Added a set of PHP classes that provide a nice OOP wrapper around php_imlib's functions. 2000-10-16 * imlib.c, php_imlib.h: Matt McClanahan Added ImlibPolygon-related functions 2000-10-15 * imlib.c: Matt McClanahan Added optional param to all drawing routines: an array of (x,y,w,h) which is used to define a cliprect to be used for that function call 2000-10-09 * imlib.c, php_imlib.h: Matt McClanahan Added _flip_ and _tile_ functions, which all use _php_imlib_single_arg() 2000-10-08 * imlib.c, php_imlib.h: Matt McClanahan Added _draw_rectangle, _draw_ellipse, and _draw_line 2000-10-07 * imlib.c, php_imlib.h: Steve Langasek Move resource type handles to static int's in imlib.c 2000-10-05 * Version 0.1 released php-imlib-0.7/examples/0000755000175000017500000000000010643376337014513 5ustar vorlonvorlonphp-imlib-0.7/examples/gradtest.php0000644000175000017500000000237307226666144017047 0ustar vorlonvorloncreate(250,150); $cr->create(); $cr->set_image($im->get_id()); $d->set_image($im->get_id()); $t->set_image($im->get_id()); $t->load('','banco.ttf','25'); // Large blue rectangle and gradient $d->set_color(22,28,235,255); $d->fill_rectangle(10,10,210,110); $cr->add_color_array(0, $red); $cr->add_color(0,0,225,225,255); $cr->add_color_array(0, $blue); $cr->fill_rectangle(15,15,200,100,125); // Text with semitransparent shadow $t->set_color_array($shadow); $t->draw(43,48,'Showing off.'); $t->set_color_array($text); $t->draw(40,45,'Showing off.'); // Purple semitransparent square $d->set_color(195,105,195,127); $d->fill_rectangle(30,90,50,50); // Green-to-transparent gradient square $cr->free(); $cr->create(); $cr->add_color(0,0,255,0,0); $cr->add_color(0,0,255,0,50); $cr->add_color(0,0,255,0,255); $cr->fill_rectangle(90,90,50,50,235); $im->save('testgrad.png',50); ?> php-imlib-0.7/examples/flip.php0000644000175000017500000000626010515373312016146 0ustar vorlonvorlon$cb(); $new = $obj->create_clone(); $obj->$cb(); return $new; } $im = new ImlibImage(); $im->load($srcname); $orig = $im->create_scaled($thumbw,$thumbh); $im->free(); $imw = $orig->get_width(); $imh = $orig->get_height(); // Create the image large enough to fit four scaled copies of $srcname $dst = new ImlibImage(); $dst->create(2*$imw + 3*$padding, 2*$imh + 5*$padding); // Load in a font and set the color and image to draw on $txt = new ImlibText(); $txt->set_color_array($textarray); $txt->set_image($dst->get_id()); $txt->load('','./Vera',16); // Get a drawing object and set its color and image to draw on $box = new ImlibDraw(); $box->set_color_array($bgarray); $box->set_image($dst->get_id()); $orig_alpha = $orig->has_alpha(); $box->fill_rectangle($padding-3,$padding-3, $imw+6,$imh+6); $txt->draw($padding,$padding+$imh,'Original'); $orig->blend_onto_image($dst->get_id(),0,0,$orig_alpha,$imw,$imh, $padding,$padding, $imw,$imh,0,$orig_alpha,0); $horiz = flipCreate($orig,'horizontal'); $horiz_alpha = $horiz->has_alpha(); $box->fill_rectangle(2*$padding-3+$imw,$padding-3, $imw+6,$imh+6); $txt->draw(2*$padding+$imw,$padding+$imh,'Horizontal'); $horiz->blend_onto_image($dst->get_id(),0,0,$horiz_alpha,$imw,$imh, 2*$padding+$imw,$padding, $imw,$imh,0,$horiz_alpha,0); $vert = flipCreate($orig,'vertical'); $vert_alpha = $vert->has_alpha(); $box->fill_rectangle($padding-3,3*$padding-3+$imh, $imw+6,$imh+6); $txt->draw($padding,3*$padding+2*$imh,'Vertical'); $vert->blend_onto_image($dst->get_id(),0,0,$vert_alpha,$imw,$imh,$padding, 3*$padding+$imh,$imw,$imh,0,$vert_alpha,0); // In order to keep things simple, this image will be cropped off if it's // not square. This is done to keep things simple. To show the whole // diagonally cropped image, the dimensions for $dst would need to be // calculated from the resulting height of the diagonal version of the image $diag = flipCreate($orig,'diagonal'); $diag_alpha = $diag->has_alpha(); $box->fill_rectangle(2*$padding-3+$imw,3*$padding-3+$imh, $imw+6,$imh+6); $txt->draw(2*$padding+$imw,3*$padding+2*$imh,'Diagonal'); $diag->blend_onto_image($dst->get_id(),0,0,$diag_alpha,$imw,$imh,2*$padding+$imw, 3*$padding+$imh,$imw,$imh,0,$diag_alpha,0); $dst->save('./flip.png'); $dst->free(); ?> php-imlib-0.7/examples/draw.php0000644000175000017500000000315607174533377016172 0ustar vorlonvorloncreate(225,260); $outlinecolor = Array(255,0,0,255); $color = Array(255,127,0,255); $box = new ImlibDraw(); $box->set_image($im->get_id()); $box->set_color_array($outlinecolor); $box->draw_rectangle(7,7,106,56); $box->set_color_array($color); $box->fill_rectangle(10,10,100,50); $poly = new ImlibPoly(); $poly->new_poly(); $poly->set_image($im->get_id()); $poly->set_color(255,0,255,255); $poly->add_point(100,100); $poly->add_point(215,110); $poly->add_point(150,215); $poly->add_point(102,255); // The cliprect will leave a gap in the middle of this polygon $poly->set_cliprect(100,50,125,110); // Draw the top $poly->draw(); $poly->set_cliprect(100,190,125,70); // Draw the bottom $poly->draw(); $poly->free(); $poly->set_cliprect(0,0,0,0); // Turns off the clipping rectangle $poly->new_poly(); $poly->set_color(255,255,255,255); $poly->add_point(106,106); $poly->add_point(205,115); $poly->add_point(147,211); $poly->add_point(106,245); $poly->draw(); $poly->free(); // This will draw a few pseudo-randomly colored ellipses $j = 30; for ($i = 90; $i < 260; $i += 20) { $box->set_color($i,$i*2,255-$i*2,255); $box->draw_ellipse($j,$i,10,$j/2); $j += 20; if ($j > 70) $j = 25; } $im->save('./draw.png'); $im->free(); ?> php-imlib-0.7/examples/Vera.ttf0000644000175000017500000020061410515373312016116 0ustar vorlonvorlonOS/2_cpVPCLTъ^6cmaplXcvt 9fpgm&`gaspH glyf tA&~hdmx4!Hhead݄T6hheaEoL$hmtx Ǝ0kernRՙ-loca=maxpG:, nameټȵpostZ/prep; h::_:: dM0l   p t  &   Y &  &   c . 5 `  s 0 & {Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera SansBitstreamVeraSans-RomanRelease 1.10Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.comCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera SansBitstreamVeraSans-RomanRelease 1.10Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.com5fqu-J3T99NR7s`s3VV9s3D{o{RoHT3fs +b-{T#\q#H99`#fy```{w``b{{Rffw;{J/}oo5jo{-{T7fD)fs@%2%%A:B2SAS//2ݖ}ٻ֊A}G}G͖2ƅ%]%]@@%d%d%A2dA  d   A(]%]@%..%A  %d%@~}}~}}|d{T{%zyxw v utsrqponl!kjBjSih}gBfedcba:`^ ][ZYX YX WW2VUTUBTSSRQJQP ONMNMLKJKJIJI IH GFEDC-CBAK@?>=>=<=<; <@; :987876765 65 43 21 21 0/ 0 / .- .- ,2+*%+d*)*%)('%(A'%&% &% $#"!! d d BBBdB-B}d       -d@--d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-ff@ /10!%!!fsr)5 @@ <2991/0K TX @ 878Y P ]%3#3#5qeM@1<20KTKT[X@878Y@0 @ P ` p ]#!#o$++`@1      91/<<<<<<<2220@   ]!! !3!!!!#!#!5!!5!T%Dh$ig8R>hggh`TifaabbNm!(/@U" '&( /)/))/B" ) *!#*- ) " & 0<<<1/299990KSX99Y"K TX0@00878YK TKT[KT[X000@878Y#.'5.546753.'>54&dijfod]SS\dtzq{---@A$*.U# jXV`OnZXhq) #'3@6$%&%&'$'B .$ &($4'!%   ! + 1 49912<0KSXY"K TK T[K T[KT[KT[K T[X4@44878Y"32654&'2#"&546"32654&%3#2#"&546WccWUccUVcbWWcd1Zܻۻa ۻۼ 0@      !         B  (('+'$ .  .'.'!!199999991/9990KSX99999999Y"2]@ " ) **&:4D ^YZ UZZY0g{ "-  ' (   2'') #**(/2; 49?2J LKFO2VZ Y UY\_2j i`2uy z 2229]]3267 >73#'#"5467.54632.#"[UԠ_I{;B h]hΆ02޸SUWDi;#QX?@Yr~YW׀c?}<$$/1oX3goB@ 10KTKT[X@878Y@ @P`p]#o+{ O@  29910KTX@878YKTX@878Y#&547{>;o @ <99103#654<:=JN@,       <2<2991<22990%#'%%73%g:r:g:PrPbybcy #@   <<1/<<0!!#!5!-Ө-Ӫ--@ 1073#ӤR@d10!!d1/073#B-@B/9910KSXY"3#m #@  10"32'2#"  P3343ssyzZ K@B  1/20KSXY"KTX  @878Y]7!5%3!!JeJsHHժJ@'B   91/20KSX9Y"KTKT[KT[X@878Y@2UVVzzvtvust]]%!!567>54&#"5>32Ls3aM_xzXE[w:mIwBC12\ps({@.    #)&  )99190KTKT[X)@))878Y@ daa d!]!"&'532654&+532654&#"5>32?^jTmǹSrsY %Đ%%12wps{$& Ѳ|d @   B    <291/<290KSXY"K TK T[X@878Y@* *HYiw+&+6NO O Vfuz ]] !33##!55^%3`du@#    190KTKT[X@878YKTX@878Y!!>32!"&'532654&#",X,$^hZkʭQTժ 10$& $X@$  "% " !%190@]]"32654&.#">32# !2 LL;kPL;y$&W]ybhc@B991/0KSXY"KTX@878Y@X9Hg]]!#!3V+ #/C@% '-'0 $*$ !0991990"32654&%&&54632#"$54632654&#"HŚV г "Əُattt$X@# %!"" %190@]]7532#"543 !"&2654&#"LK:lL>$& V\s[#@<21/073#3### %@  <2103#3#ӤR#٬@^M@*B$#29190KSXY" 5Ѧ`@ #<210!!!!^O@+B$#<9190KSXY"55//m$p@+$     &%99991/9990K TX%@%%878Yy z z ]%3##546?>54&#"5>32ſ8ZZ93lOa^gHZX/'eVY5^1YnFC98ŸLVV/5<4q L@2  L4307$7CM34( (+(I+*(I,=M<9912990K TK T[KT[KT[KT[XMMM@878Y@ NN/N?N]32654&#"#"&5463253>54&'&$#"3267#"$'&5476$32|{zy!orqp ˘s'6@   0210].# !267# !2'ffjzSb_^^_HHghG.@   2 99991/0`]3 !%! )5BhPa/w.,~ .@   21/0 ]!!!!!!9>ժF# )@ 21/0 ]!!!!#ZpPժH7s9@ 43 1990%!5!# !2&&# !26uu^opkSUmnHF_`%; ,@ 8  221/<20P ]3!3#!#"d+991/0KTX@878Y@ 0@P`]3#+f M@  9 991990KTX  @878Y@ 0 @ P ` ]3+53265M?nj @(B  291/<290KSXY"]@ ((764GFCUgvw    (+*66650 A@E@@@ b`hgwp  ,]q]q3! !#3wH1j%@ :1/0@ 0P]3!!_ժ @4  B    >  91/<290KSXY"p]@V   && & 45 i|{y   #,'( 4<VY ej vy ]]! !###-}-+3 y@B6 991/<2990KSXY" ]@068HGif FIWXeiy ]]!3!#j+s #@  310"32' ! ':xyLHH[[bb:@   ? 291/0@ ?_]32654&#%!2+#8/ϒs R@*  B     39991990KSX9Y""32#'# ! '? !#y;:xLHHab[T@5  B    ?  299991/<9990KSX9Y"@]@Bz%%%&'&&& 66FFhuuw]]#.+#! 32654&#A{>ٿJx~hb؍O'~@<    B %( "-"(9999190KSX99Y")])/)O)].#"!"&'532654&/.54$32Hs_wzj{r{i76vce+ٶ0/EF~n|-&J@@@1/20K TX@878Y@  @ p ]!!#!ժ+)K@   8A1299990KTX@878Y]332653! ˮ®u\*$h@'B91/290KSXY"P]@b*GGZ} *&&))% 833<<7HEEIIGYVfiizvvyyu)]]!3 3J+D {@I      B     91/<2290KSXY"]@  ($ >>4 0 LMB @ Yjkg ` {|      !   # $ %  <:5306 9 ? 0FFJ@E@BBB@@ D M @@XVY Pfgab```d d d wv{xwtyywpx   []]3 3 3# #D:9:9+=; ]@F      B    91/<290KSXY"K TK T[KT[X  @878Y@ '' 486 KX[fkww       &()&(' ) 54<;:;4 4 8 ? H O X _ eejjhiil l xyyx}  x   @]]3 3 # #su \Y+3{@(B@@ 91/290KSXY" ]@<5000F@@@QQQe &)78@ ghxp ]]3 3#f9\ @BB 991/0KSXY"K TK T[X @ 878Y@@ )&8HGH    / 59? GJO UYfio wx ]]!!!5!sP=g՚oXS@C210K TX@878YKTKT[X@878Y!#3!XB-@B/9910KSXY"#mo<@C<10KTKT[X@878Y!53#5oXޏ@ 91290##HHu-10!5f1@ D10K TKT[X@878Y #ofv{-{ %@'   #   E&22991/9990@n0000 0!0"?'@@@@ @!@"PPPP P!P"P'p' !"'''000 0!@@@ @!PPP P!``` `!ppp p! !]]"326=7#5#"&5463!54&#"5>32߬o?`TeZ3f{bsٴ)Lfa..'' 8@  G F221/0`]4&#"326>32#"&'#3姒:{{:/Rdaadq{?@  HE210@ ].#"3267#"!2NPƳPNM]-U5++++$$>:#qZ8@G E221/0`]3#5#"3232654&#":||ǧ^daDDaq{p@$   KE9190@)?p?????,// , ooooo ]q]!3267# 32.#" ͷjbck)^Z44*,8 Cė/p@     L<<991/22990K TX@878YKTX@878Y@P]#"!!##535463cM/ѹPhc/яNqVZ{ (J@#  &#' & G E)221/990`***]4&#"326!"&'5326=#"3253aQQR9||9=,*[cb::bcd4@  N  F21/<90`]#4&#"#3>32d||Bu\edy+@F<21/0@  @ P ` p ]3#3#`Vy D@   O  F<2991990@ @P`p]3+532653#F1iL`a( @)B F 291/<90KSXY" ]@_ ')+Vfgsw    ('(++@ h` ]q]33 ##%kǹi#y"F1/0@ @P`p]3#{"Z@&   PPF#291/<<<290@0$P$p$$$$$$$ ]>32#4&#"#4&#"#3>32)Erurw?yz|v\`gb|d{6@  N  F21/<90`]#4&#"#3>32d||Bu\`edqu{ J@  QE10@#?{{   {  {]"32654&'2#"s98V{>@ GF2210@ `]%#3>32#"&4&#"326s:{{8 daaqVZ{ >@   GE2210@ `]32654&#"#"3253#/s:||:/daDDadJ{0@    F21/90P].#"#3>32JI,:.˾`fco{'@<  S  SB %( R"E(9999190KSX99Y"']@m   . , , , ; ; ; ; $( ( *//*(() )!$'      '/)?)_))))))]]q.#"#"&'532654&/.54632NZb?ĥZlfae@f?((TT@I!*##55YQKP%$78@  F<<2991/<2990]!!;#"&5#53w{KsբN`>X`6@    NF21/290`]332653#5#"&||Cua{fc=`@'B91/290KSXY"K TX@878YKTKT[X@878Y@Hj{  &&)) 55::0FFIIFH@VVYYPffiigh`ut{{uz>]]3 3#=^^\`TV5` @IU U U U   B     91/<2290KSXY"K TKT[KT[KT[K T[X  @878YK TK T[KT[X @ 878Y@" 5 IIF @ [[U P nnf yy          %%#'!%""%' $ ! # 9669 0FHF@B@@@D D D @@VVVPQRRPS T U cdejejjjn a g ouuy}x}zzxy  { v } @/   y]]333# #V`jjj;y` Z@F      B   91/<290KSXY"K TKT[KT[KT[X  @878YKTX @ 878Y@   & =1 UWX f vzvt        )&% * :9746 9 0 IFE J @ YVYYWVYVV Y P o x  /]] # # 3 dkr))`HJq=V`@C        B     9129990KSX2Y"K TKT[X@878YKTX@878Y@     # 5 I O N Z Z j        '$$  )( % $ $ ' ** 755008 6 6 8 990A@@@@@@@@B E G II@TQQUPPVUVW W U U YYPffh ii`{xx   e]]+5326?3 3N|lLT3!;^^hzHTNlX` @B 2991/0KSXY"K TK T[X @ 878YKTX  @878Y@B&GI  + 690 @@E@@CWY_ ``f``b ]]!!!5!qjL}e`ۓ%$@4 %   !  % $  C %<<29999999199999990K TX%%%@878Y&]#"&=4&+5326=46;#"3>l==k>DV[noZVtsݓXX10#$@6%   #%#C %<2<9999999199999990K TX%@%%878YKTX%%%@878Y&]326=467.=4&+532;#"+FUZooZUF?l>>l?VWstݔ1#@  1990#"'&'&'&#"56632326ian ^Xbian ^V1OD;>MSOE<>LhN'$uhm !@T   !!  ! !!!B     !  VV!"2299999991/<9990KSXY" #]@  s P#f iu {yyv v!# ]]4&#"326!.54632#!#TY?@WX??Y!X=>sr?<҈_Z?YWA?XXN)sIsrFv)su''&-k'(u3^'1usN'2'u)N'8u{-f'DR{-f'DCR{-f'DR{-'DR{-7'DR{-'DRqu{'Fqf'Hqf'HCqf'Hq'Hof'f'C\f'F'd7'Qquf'Rsquf'RCsquf'Rsqu'Rsqu7'RsXf'X{Xf'XC{Xf'X{X'X{9; '@  YW Y <<1<203!!#!5!oo\]u=  @  Z[Z10"32654&'2#"&546PnnPPnoO@v+..ooPOmmOOp1.-rB#!Q@+     "  "<<<221<9990%&&'667#&73JDFHAMf fIX⸹)**'# 32!b`@!    <<1/2<2990K TX@878Y66].#"!!!!53#535632NL=ty-=))׏/я\= >@54&.#"#"&'532654/.5467.54632{?>?>S8alӃ\]>9̭IXW:fqր][;;ȦI.Z.L-[.K''PGZsweZ54m@''TLf{xf[1,pE3!   \ 104632#"&3~|}}||};9 %@]] 91290!###&&54$yfNݸ/@0-'!  **.  !' $'$-F099991/990@@'(     ! "&  : :!MM I!I"jj  ]]4632#"&'532654&/.5467.#"#:A9`@IPAtx;e\`Wqqs`/Q*%jd_[?T>7;[gp/8L`@6EBC?2H09JC 9 $HE301BKL?gwyVpMI`3D/IC@&=>:A$104G$ 7aD=0^* D^ J21/02#"$'&5476$"32676654&'&&&&#"3267#"&54632mmllmmmmllmm^^``^^⃄^]]^\^BB@zBCFInmmmmnnmmmmng^^^傁^^__^]⃅]^^! "'F >@!    b b cbc91<<2<<903#######5Jq7rqr/B^^sRf1@ D10K TKT[X@878Y3#fF)@dd1<20K TK T[X@878YK TK T[KT[KT[X@878YKTKT[X@878Y@````pppp]3#%3#^y'>@"     <291<2<<990!!!!!'7!5!7!}/H{};fըfӪH@9  B     <291/<0KSXY"]@gww  ]!!!!!!#!59=qժF՞f +@< +,  )&  *&& &,+,* # )#3,99999999199999990@*WZWU!je!{vu! FYVjddj(|svz( ]] 324&'.#"&5!27!"&''3>_'y=_''NOy;WfNPƀ[gX@CHp@CpDfbMKYg[KKX /@- !$'!!0 $*0999919990@     $$$   $$ $ ***///***55500055 5 :::???:::EEE@@@EE E JJJOOOJJJV !"&'()]]32654&#".#"326#"&54632>32#"&1TevYR1UfvYRF^_HDa^/XZie7XXjeߦ~᧯w .@     <2<21/<<0!!#!5!!!-Ө-}} T@.B $# <2291/90KSXY" 5!!@po V@/B$ # <<291/90KSXY"55!5AǪR@F  B     fe f e<2299991/2<2<290KSXY"K TX@878Y@(' ' ')((79  ]]!#!5!5'!5!3 3!!!c`Tþ{yT9{3{JD{3V` M@%  !   NF!2912<990"`""]3326533267#"&'#"&'#% )I#ER2bf*V H<9 NPOONNh-)b@'! '!* $$*9991990K TK T[KT[KT[KT[X*@**878Y>54&#"#"&54632#"&54324&#"32IH7$$0e՘ݢe WOmVPmmWKt,>bFأ[t}t{w; ]@    91990@0QVPZ spvupz  Z pp{ t  ]]!! !!5 7AJI3!wq@gg120!#!# }/#@1 " $ #" #h#$9999991/<229990K TX$$$@878Y@V             ##(]]#3267#"&5467!##"#>3!i/7.%7vy"Pµ)6< yJ\:1fd.xo@E}/%&@  & iji&1026732#"&'&&#"#"&546327j Pd@7*8  kOeD=!0 l9TA6?&#Hn!bSA8?Ss;)_@3(%%  * "(kl"k *22999199990!!#5#"&5463354&#"56632"32655P,]uu>DIE~bRhP{@p?Dq[[""CO@Mr`d.@  klk 9910!!2#"&546"32654&PXγгi~hi}|P{ݿܾsN@@"   mm  9991/<20%!5654#"!5!&5! Dz?1/aL"a*>w؍{o{3>@C'-%= 4%:.-*1 %?47&%7& =&-7"E?<9999912<<29990@0+0,0-0.0/00@+@,@-@.@/@0P+P,P-P.P/P0+0@@@@@@@@@??? ??0,0-0.0/@,@-@.@/P,P-P.P/ooo oo`,`-`.`/p,p-p.p/,-./]q].#">32!3267#"&'#"&5463!54&#"5>32"326=DJԄ ̷hddjMI؏`TeZ߬o0Z^Z55*,ywxx..''`f{bsٴ)H +@<+,&  )&  *&& &,+,* # #Q)E,22999999199999990@p(?-YVUV jf!{    { z{ {!"#$%{&%--&YVUZ(ifej(ztvz($$]] 32654&'.#".5327#"&'')gA\*g>}66]C_56`?`!*(Ou))Hn.Mw834OMx43N $@/  !# #%" " "!& %999919990KTKT[KT[X%%%@878Y@ ttttv]33267#"&546?>7>5#537ZZ:3mN`^gIYX0&DeWX5^1YnFC98ŸLVV/5<65 b@ <2991/0K TX @ 878YKTKT[KT[X  @878Y P ]#53#3+e^@ 10!#!^=} *@    91903##'%\sB}}`s-Pb;V#@@   B   !$  $912299990KSX29Y"K TX$$$@878Y.#"!!#"&'53267#5!>32&P,`r<::d/4a/am"?$Ɨ5dzɏ!!J;?@.9*-" *19" <-<<219999990#"'&'&'&#"56632326#"'&'&'&#"56632326ian ^Xbian ^Vgian ^Xbian ^VoNE;=LTNE;=KڲOE;=LSNE;=K`8@91/90@cmpxyvn]] !3!^DC?%# @I    B   o o n<2991<2990KSXY"55%-+#-+#RRH# @I  B   o op<<991<2990KSXY"5%5+-+-#^R^  ^R^   #@   1/<<220%3#%3#%3#hk'$uh^'$us^'2'us ;@   299991/220!!!!! !# !39OAg@AժF|pm|q{'3@1 . ("%4"1 K1 Q+E499912<2290@%?5_5p55555????? ooooo ]q].#"!3267#"&'#"32>32%"32654& H ̷jbdjQGьBN5Z44*,nmnm98olkp݇y/10!!yy/10!!ym '@   1<20#53#53ӤRӤR??m '@   1<203#%3#ӤRӤRլ@@@ 10#53ӤR?@ q103#ӤR՘?o )@ r <<103#3#!!oA#u"@91990  9%-=V'\^N'<su+@B10KSXY"3#-\^R#/@I -'! - -'!0 *$0* $ $(st*(s099999999919999999907'#"&''7&&5467'766324&#"326{r%$&(r;t=:x=q%%&&s7t@?s9q(&%%s>v:@t8s'%$|pprs#G@%Bon29190KSXY"5s-+#R#I@&Bop<9190KSXY"5+-#^R^  /J@(   L<2<2991/<22990K TX@878YKTX@878Y@0P]]#!##53546;#"3#JcM`/яNPhc/J@!    L<<991/<22990K TX@878YKTX@878Y@0P ]!#!"!!##53546JcM/ѹ{Phc/яN9;>@   Y W Y <<2<<2122220%!#!5!!5!3!!!oooo\\HF103#F@ 10%3#ӤR@m '@    1<20%3#%3#ӤRfӤR@@q L #'3?K@D$%&%&'$'B@ .(F4 :&$L%IC'1+C =  1 =I 7+ ! L9912<<2220KSXY"KTK T[K T[K T[K T[KT[XL@LL878Y"32654&'2#"&5462#"&546!3#"32654&2#"&546"32654&WddWUccUt%ZVcbWWcdWccWUccܻۻۻۼܻۻhm'$um'(uhk'$uN'(uk'(uk',/u`m',/uXN',/u;k',/usk'2'usm'2'usk'2'u)k'8u)m'8u)k'8uy` F1/0@ @P`p]3#`?f7@ u91290K TKT[X@878Y3#'#fJ7c@$   VwVv99991<<99990K TK T[X@878Y'.#"#>3232673#"&9! &$}f[&@%9! &$}f[&@Z7IR!7IRb+/10K TKT[X@878Y!!V)9H W@ VV1<0K TX@878YKTKT[KT[X@878Y332673#"&v aWV` v HKKJLDf,@ d10K TX@878Y3# _@ V xV10K TK T[X@878YK TK T[K T[X@878Y4&#"3267#"&54632X@AWWA@Xzssss?XW@AWX@sss#u@  ' 1/90!#"&'532654&'T76xv.W+"J/;<+->i0Y[ 0.W=fB@991<20K TKT[X@878Y3#3#߉fxLu @   '1/90!33267#"&546w-+76 >&Dzs5=X.. W]0i?f7@ u91<90K TKT[X@878Y373xu ?@   : y<<991/900P]3%!!'79Pw^Mo;jnH ^@  z z <<991/90KTX @ 878Y@ @ P ` sz p ]37#'7Ǹ}Lɸ{JZjXjm'6uof'V\m'=uXf']@ <210##    g@    2  y<291/220@(   ]]! )#53!!3 !iP`P5~.,qu('@^%{&%#${##{#({'(#&'('%$%(('"#" ! B('&%"! ## #)&' ! (%#" QE)999999919990KSXY"?*]@v%+("/#/$)%-&-'*(6%F%X X!` `!f"u u!u"%#%$&&&''(6$6%F$E%Z Z!b b!z{     {zzv v!x"**']].#"32654&#"5432''%'3%F2X)6 ~r4*!M!ü޼z&77kc\̑oabk'<su=Vf'\^ =@   ? 2291/0@ ?_]332+#32654&#'ђV>@ GF2210@ `]%#3>32#"&4&#"326s:{{8daa-10!!ת? @M    B   <291<290KSXY" '77w55v8vL57y5yy5 ,@   |]|| 12035733! c)t'+n^J@$}}B ~9190KSX2Y"!!56754&#"56632 "?XhU4zHM98rn81^BQ##{l0b(H@'    #)~&~ )999190#"&'532654&##532654&#"56632 \e9}F4wCmxolV^^ad_(fQI7Z`mR|yOFJLl?<:=svcE`''5 d?''5db''5 dsm'* uqVZH'JP', /uu'6ou{'Vs'k'&-uqf'Fs'm'&-uqf'Fq$J@$ "    GE%<<1/<20`&&&]!5!533##5#"3232654&#"F:||ǧN}}daDDad10!!dHF103#F1@: "+ /) 2+"!)#&  , & &*!/<29999999999122<20K TK T[K T[KT[KT[KT[X222@878Y@z  1Ti lnooooiko o!o"o#n$l%i'i-  !"#$%&'()*+,-2   USjg ]].#"!!!!3267#"#734&5465#7332[f A78 ʝf[Y`(77(6bbiZȻ{.# .{ZiHH"{/ #/{"G)@ dd1<20KTKT[X@878YKTK T[KT[X@878YKTKT[X@878YKTX@878Y@````pppp]3#%3#^ys@B10KSXY"K TX@878YKTX@878Y@ %%6FVjg //]]3#7Ju@!  VV 99991<2990K TX@878YKTX@878Y ]'.#"#4632326=3#"&9 $(}gV$=09" (}gT";9! 2-ev 3)dw @B10KSXY"K TX@878YKTX@878Y@*$$5CUU//]]#ę1w@ 91<90K TX@878YKTX@878YKTX@878Y@ //- ]3#'#Ӌ1@ 91290K TK T[K T[K T[X@878YKTX@878YKTX@878Y@ "  ]373Ӌ ? @   ] <291<290KTKT[KT[KT[K T[K T[X@878YKTKT[X@878Y@T /9IFYi       "5GK S[ e]] !33##5!55bf]my9 j@ VV120K TX@878YKTX@878YKTKT[X@878Y332673#"&v cSRav 6978w{zf103#  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>: ~1BSax~ & 0 : !""""+"H"e%  0AR^x}  0 9 !""""+"H"`%^ChVjq_8 (Bbcdefghjikmlnoqprsutvwxzy{}|~f55q=3=dd?y}s)3s\\?uLsLsyD{={\{fqqq/q999qqJ+o#7=V;=3XyysLs{{{{{{fqqqqq9999qqqqq9\3 'sLfR#hd+/s`N{H?55=ZyyLss/q%%=V^33 / /9% qyy\\\\;LsLsLs9#LF+o{\3X3 q=55^5bb3sq\+osfqsfqqds 5?+   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     sfthyphenperiodcenteredEuroc6459c6460c6461c6462c6463c6466c6467c6468c6469""""XO!nE~Le  R s  X : i  = z /Eu)pP@"m#{CwRw [ r !5!B!!!" ""#"0"="J"W"d"q"~"""""""""## ##'#4#A#N#[#h##$4$%3%S%&&'K''((X()_*%*\**+z+,D,,-P-..R./0A011!1P12H2z23F3p3p3}3334z44445595g55556[667C77888J999)969C9P9]9j9w99999999::{::;;^;;;<"<_<<<<<<=c>;>H>U>>>?a??@:@K@\@m@z@@@@@@@@A@AVAkBEBBC_CCDUDE*E?- x$%&')*K+-r./2934K57D9:;< =IQR&UYZ\bdg9xy&z&{&|&}&9 999 K$$$$$9$&$*$2$4$6$7a$8$9}$:$;$ php-imlib-0.7/examples/scale.php0000644000175000017500000000157507167131325016314 0ustar vorlonvorlon
Filename

php-imlib-0.7/.cvsignore0000644000175000017500000000046207167746636014711 0ustar vorlonvorlonacinclude.m4 aclocal.m4 build config.cache config.guess config.log config.status config.sub configure configure.in config_vars.mk .deps dynlib.m4 imlib.la imlib.lo imlib.slo install-sh libimlib.la .libs libs.mk libtool ltconfig ltmain.sh Makefile missing mkinstalldirs modules php_config.h php_config.h.in php-imlib-0.7/imlib.c0000644000175000017500000014250110643251371014126 0ustar vorlonvorlon/* +----------------------------------------------------------------------+ | PHP version 4.0 | +----------------------------------------------------------------------+ | Copyright (c) 2000, 2001 Matt McClanahan | | Copyright (c) 2000, 2001, 2005 Steve Langasek | +----------------------------------------------------------------------+ | This source file is subject to version 2.02 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available at through the world-wide-web at | | http://www.php.net/license/2_02.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | | | | Alternatively, you may distribute and/or modify this code under the | | terms of version 2 of the GNU Library General Public License as | | published by the Free Software Foundation. | | | | This software is distributed in the hope that it will be useful, | | but WITHOUT ANY WARRANTY; without even the implied warranty of | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | | Library General Public License for more details. | | | | You should have received a copy of the GNU Library General Public | | License in the file COPYING accompanying this software; if not, | | write to the Free Software Foundation, Inc., | | 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | | | +----------------------------------------------------------------------+ | Authors: Matt McClanahan | | Steve Langasek | +----------------------------------------------------------------------+ */ #include "php.h" #include "php_config.h" #include "php_ini.h" #include "php_imlib.h" #if HAVE_IMLIB ZEND_DECLARE_MODULE_GLOBALS(imlib); static ZEND_BEGIN_ARG_INFO(third_and_fourth_arg_force_ref, 0) ZEND_ARG_PASS_INFO(0) ZEND_ARG_PASS_INFO(0) ZEND_ARG_PASS_INFO(1) ZEND_ARG_PASS_INFO(1) ZEND_END_ARG_INFO(); static ZEND_BEGIN_ARG_INFO(second_through_fifth_arg_force_ref, 0) ZEND_ARG_PASS_INFO(0) ZEND_ARG_PASS_INFO(1) ZEND_ARG_PASS_INFO(1) ZEND_ARG_PASS_INFO(1) ZEND_ARG_PASS_INFO(1) ZEND_END_ARG_INFO(); static int le_imlib_cr; static int le_imlib_font; static int le_imlib_img; static int le_imlib_poly; function_entry imlib_functions[] = { PHP_FE(imlib_add_color_to_color_range,NULL) PHP_FE(imlib_blend_image_onto_image,NULL) PHP_FE(imlib_clone_image,NULL) PHP_FE(imlib_create_color_range,NULL) PHP_FE(imlib_create_cropped_image,NULL) PHP_FE(imlib_create_cropped_scaled_image,NULL) PHP_FE(imlib_create_image,NULL) PHP_FE(imlib_create_rotated_image,NULL) PHP_FE(imlib_create_scaled_image,NULL) PHP_FE(imlib_dump_image,second_arg_force_ref) PHP_FE(imlib_free_color_range,NULL) PHP_FE(imlib_free_font,NULL) PHP_FE(imlib_free_image,NULL) PHP_FE(imlib_get_text_size,third_and_fourth_arg_force_ref) PHP_FE(imlib_image_blur,NULL) PHP_FE(imlib_image_draw_ellipse,NULL) PHP_FE(imlib_image_draw_line,NULL) PHP_FE(imlib_image_draw_polygon,NULL) PHP_FE(imlib_image_draw_rectangle,NULL) PHP_FE(imlib_image_fill_color_range_rectangle,NULL) PHP_FE(imlib_image_fill_ellipse,NULL) PHP_FE(imlib_image_fill_polygon,NULL) PHP_FE(imlib_image_fill_rectangle,NULL) PHP_FE(imlib_image_flip_horizontal,NULL) PHP_FE(imlib_image_flip_vertical,NULL) PHP_FE(imlib_image_flip_diagonal,NULL) PHP_FE(imlib_image_format,NULL) PHP_FE(imlib_image_get_filename,NULL) PHP_FE(imlib_image_get_height,NULL) PHP_FE(imlib_image_get_width,NULL) PHP_FE(imlib_image_has_alpha,NULL) PHP_FE(imlib_image_modify_alpha,NULL) PHP_FE(imlib_image_sharpen,NULL) PHP_FE(imlib_image_set_format,NULL) PHP_FE(imlib_image_tile_horizontal,NULL) PHP_FE(imlib_image_tile_vertical,NULL) PHP_FE(imlib_image_tile,NULL) PHP_FE(imlib_list_fonts,NULL) PHP_FE(imlib_load_font,NULL) PHP_FE(imlib_load_image,second_arg_force_ref) PHP_FALIAS(imlib_load_image_with_error_return,imlib_load_image,second_arg_force_ref) PHP_FE(imlib_polygon_add_point,NULL) PHP_FE(imlib_polygon_contains_point,NULL) PHP_FE(imlib_polygon_free,NULL) PHP_FE(imlib_polygon_get_bounds,second_through_fifth_arg_force_ref) PHP_FE(imlib_polygon_new,NULL) PHP_FE(imlib_save_image,third_arg_force_ref) PHP_FALIAS(imlib_save_image_with_error_return,imlib_save_image,third_arg_force_ref) PHP_FE(imlib_text_draw,NULL) PHP_FE(imlib_get_cache_size,NULL) PHP_FE(imlib_set_cache_size,NULL) {NULL, NULL, NULL} }; PHP_INI_BEGIN() STD_PHP_INI_ENTRY("imlib.font_path", "/usr/local/share/fonts", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateString, font_path, zend_imlib_globals, imlib_globals) STD_PHP_INI_ENTRY("imlib.min_cache_size","0",PHP_INI_SYSTEM, OnUpdateLong,min_cache_size, zend_imlib_globals,imlib_globals) STD_PHP_INI_ENTRY("imlib.max_cache_size","4194304",PHP_INI_SYSTEM, OnUpdateLong,max_cache_size, zend_imlib_globals,imlib_globals) STD_PHP_INI_ENTRY("imlib.cache_size","0",PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateLong,cache_size, zend_imlib_globals,imlib_globals) PHP_INI_ENTRY("imlib.font_cache_size","524288",PHP_INI_SYSTEM, OnUpdateFontCacheSize) PHP_INI_END() zend_module_entry imlib_module_entry = { STANDARD_MODULE_HEADER, "imlib", imlib_functions, PHP_MINIT(imlib), PHP_MSHUTDOWN(imlib), PHP_RINIT(imlib), PHP_RSHUTDOWN(imlib), PHP_MINFO(imlib), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES }; PHP_INI_MH(OnUpdateFontCacheSize) { int size; if (sscanf(new_value,"%d",&size)==1) { imlib_set_font_cache_size(size); return SUCCESS; } else { return FAILURE; } } static void _php_imlib_free_cr(Imlib_Color_Range cr) { imlib_context_set_color_range(cr); imlib_free_color_range(); } static void _php_imlib_free_font(Imlib_Font fn) { imlib_context_set_font(fn); imlib_free_font(); } static void _php_imlib_free_img(Imlib_Image im) { imlib_context_set_image(im); imlib_free_image(); } static void _php_imlib_free_poly(ImlibPolygon poly) { imlib_polygon_free(poly); } static void _php_imlib_set_cache_size(int size TSRMLS_DC) { if (size>IMLIBG(max_cache_size)) { size=IMLIBG(max_cache_size); } if (sizefont_path = NULL; imlib_globals->saved_path = NULL; } #ifdef COMPILE_DL_IMLIB ZEND_GET_MODULE(imlib) #endif PHP_MINIT_FUNCTION(imlib) { ZEND_INIT_MODULE_GLOBALS(imlib, php_imlib_init_globals, NULL); le_imlib_cr = register_list_destructors(_php_imlib_free_cr,NULL); le_imlib_font = register_list_destructors(_php_imlib_free_font,NULL); le_imlib_img = register_list_destructors(_php_imlib_free_img,NULL); le_imlib_poly = register_list_destructors(_php_imlib_free_poly,NULL); REGISTER_LONG_CONSTANT("IMLIB_TEXT_TO_RIGHT", IMLIB_TEXT_TO_RIGHT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_TEXT_TO_LEFT", IMLIB_TEXT_TO_LEFT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_TEXT_TO_DOWN", IMLIB_TEXT_TO_DOWN, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_TEXT_TO_UP", IMLIB_TEXT_TO_UP, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_TEXT_TO_ANGLE", IMLIB_TEXT_TO_ANGLE, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_NONE", IMLIB_LOAD_ERROR_NONE, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST", IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY", IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ", IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT", IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_PATH_TOO_LONG", IMLIB_LOAD_ERROR_PATH_TOO_LONG, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_PATH_COMPONENT_NON_EXISTANT", IMLIB_LOAD_ERROR_PATH_COMPONENT_NON_EXISTANT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY", IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE", IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS", IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_OUT_OF_MEMORY", IMLIB_LOAD_ERROR_OUT_OF_MEMORY, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS", IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE", IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_OUT_OF_DISK_SPACE", IMLIB_LOAD_ERROR_OUT_OF_DISK_SPACE, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMLIB_LOAD_ERROR_UNKNOWN", IMLIB_LOAD_ERROR_UNKNOWN, CONST_CS|CONST_PERSISTENT); REGISTER_INI_ENTRIES(); return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(imlib) { UNREGISTER_INI_ENTRIES(); return SUCCESS; } PHP_RINIT_FUNCTION(imlib) { char **font_list; char *pathbuf, *ptr, *end; int i, font_count; /* Set default cache size */ _php_imlib_set_cache_size(IMLIBG(cache_size) TSRMLS_CC); font_list = imlib_list_font_path(&font_count); if (!font_count) { IMLIBG(saved_path) = NULL; } else { /* Save the current path where we can retrieve it later. */ IMLIBG(saved_path) = (char **) emalloc(sizeof(char *) * (font_count + 1)); for (i = 0; i < font_count; i++) { IMLIBG(saved_path)[i] = estrdup(font_list[i]); } IMLIBG(saved_path)[i] = NULL; /* Now clear the imlib path... */ for (i = 0; i < font_count; i++) { imlib_remove_path_from_font_path(IMLIBG(saved_path)[i]); } } if (!IMLIBG(font_path)) { return SUCCESS; } /* And repopulate it with the ini-specified default. */ ptr = pathbuf = estrdup(IMLIBG(font_path)); while (ptr && *ptr) { end = strchr(ptr, ':'); if (end != NULL) { *end = '\0'; end++; } imlib_add_path_to_font_path(ptr); ptr = end; } efree(pathbuf); return SUCCESS; } PHP_RSHUTDOWN_FUNCTION(imlib) { char **font_list; int i, font_count; /* Restore cache size */ _php_imlib_set_cache_size(0 TSRMLS_CC); /* Retrieve the current path and clear it out. */ font_list = imlib_list_font_path(&font_count); for (i = 0; i < font_count; i++) { imlib_remove_path_from_font_path(font_list[i]); } /* Restore the saved font path. */ if (!IMLIBG(saved_path)) { return SUCCESS; } for (i = 0; IMLIBG(saved_path)[i] != NULL; i++) { imlib_add_path_to_font_path(IMLIBG(saved_path)[i]); efree(IMLIBG(saved_path)[i]); } efree(IMLIBG(saved_path)); return SUCCESS; } PHP_MINFO_FUNCTION(imlib) { DISPLAY_INI_ENTRIES(); } static void _php_convert_four_longs(zval **zone, zval **ztwo, zval **zthree, zval **zfour, int *one, int *two, int *three, int *four) { convert_to_long_ex(zone); convert_to_long_ex(ztwo); convert_to_long_ex(zthree); convert_to_long_ex(zfour); *one = Z_LVAL_PP(zone); *two = Z_LVAL_PP(ztwo); *three = Z_LVAL_PP(zthree); *four = Z_LVAL_PP(zfour); } static int _php_handle_cliprect_array(zval **dbox, char *func_name, int *x, int *y, int *w, int *h) { zval **element, ***box_coords; int i,arrcount; HashTable *box; box = HASH_OF(*dbox); if (!box) { php_error(E_WARNING, "Wrong datatype in call to %s, need array",func_name); return 0; } arrcount = zend_hash_num_elements(box); if (arrcount != 4) { php_error(E_WARNING, "Wrong number of array elements in call to %s, need four (x,y,w,h)", func_name); return 0; } box_coords = (zval ***)emalloc(arrcount * sizeof(zval **)); for (i = 0; i < arrcount; i++) { if (zend_hash_index_find(box, i, (void **)&element) == SUCCESS) { convert_to_long_ex(element); box_coords[i] = element; } } *x = Z_LVAL_PP(box_coords[0]); *y = Z_LVAL_PP(box_coords[1]); *w = Z_LVAL_PP(box_coords[2]); *h = Z_LVAL_PP(box_coords[3]); efree(box_coords); return 1; } static int _php_handle_imlib_error(INTERNAL_FUNCTION_PARAMETERS, Imlib_Load_Error err, const char *img) { int errnum; switch (err) { case IMLIB_LOAD_ERROR_NONE: errnum = 0; break; case IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST: php_error(E_WARNING, "%s - File does not exist", img); errnum = 1; break; case IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY: php_error(E_WARNING, "%s - Directory specified for image filename", img); errnum = 2; break; case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ: php_error(E_WARNING, "%s - No read access to directory", img); errnum = 3; break; case IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT: php_error(E_WARNING, "%s - No Imlib2 loader for that file format", img); errnum = 4; break; case IMLIB_LOAD_ERROR_PATH_TOO_LONG: php_error(E_WARNING, "%s - Path specified is too long", img); errnum = 5; break; case IMLIB_LOAD_ERROR_PATH_COMPONENT_NON_EXISTANT: php_error(E_WARNING, "%s - Path component does not exist", img); errnum = 6; break; case IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY: php_error(E_WARNING, "%s - Path component is not a directory", img); errnum = 7; break; case IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE: php_error(E_WARNING, "%s - Path points outside address space", img); errnum = 8; break; case IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS: php_error(E_WARNING, "%s - Too many levels of symbolic links", img); errnum = 9; break; case IMLIB_LOAD_ERROR_OUT_OF_MEMORY: php_error(E_WARNING, "While loading %s - Out of memory", img); errnum = 10; break; case IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS: php_error(E_WARNING, "While loading %s - Out of file descriptors", img); errnum = 11; break; case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE: php_error(E_WARNING, "%s - Cannot write to directory", img); errnum = 12; break; case IMLIB_LOAD_ERROR_OUT_OF_DISK_SPACE: php_error(E_WARNING, "%s - Cannot write - out of disk space", img); errnum = 13; break; case IMLIB_LOAD_ERROR_UNKNOWN: default: php_error(E_WARNING, "While loading %s - Unknown error.", img); errnum = 14; } return errnum; } static void _php_imlib_draw_something(INTERNAL_FUNCTION_PARAMETERS, void (*func)(), char *func_name) { zval **img, **d1, **d2, **d3, **d4, **dr, **dg, **db, **da, **dbox; int x,y,w,h,r,g,b,a,cx,cy,cw,ch,argc; Imlib_Image im; argc = ZEND_NUM_ARGS(); if (argc < 9 || argc > 10 || zend_get_parameters_ex(argc, &img, &d1, &d2, &d3, &d4, &dr, &dg, &db, &da, &dbox) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); _php_convert_four_longs(d1,d2,d3,d4,&x,&y,&w,&h); _php_convert_four_longs(dr,dg,db,da,&r,&g,&b,&a); imlib_context_set_image(im); imlib_context_set_color(r,g,b,a); /* FIXME: This should take an optional antialias option, with on as default */ imlib_context_set_anti_alias(0); if (argc > 9) { if (!_php_handle_cliprect_array(dbox, func_name, &cx,&cy,&cw,&ch)) RETURN_FALSE; imlib_context_set_cliprect(cx,cy,cw,ch); } (*func)(x,y,w,h); imlib_context_set_cliprect(0,0,0,0); RETURN_TRUE; } static void _php_imlib_single_arg(INTERNAL_FUNCTION_PARAMETERS, void (*func)()) { zval **img; Imlib_Image im; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &img) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); imlib_context_set_image(im); (*func)(); } /* We wrap imlib_image_draw_line, because it doesn't return a void like all the other drawing functions do. So, since we don't care about Imlib_Updates, we're going to return our own void. Nyeh. */ static void _php_wrap_draw_line(int x1, int y1, int x2, int y2) { imlib_image_draw_line(x1,y1,x2,y2,0); } /* {{{ proto void imlib_add_color_to_color_range(int cr, int x, int r, int g, int b, int a) Add a color to a color range at a specified distance from the previous color in the range. A distance of 0 centers it */ PHP_FUNCTION(imlib_add_color_to_color_range) { zval **crange, **cx, **cr, **cg, **cb, **ca; int x,r,g,b,a; Imlib_Color_Range range; if (ZEND_NUM_ARGS() != 6 || zend_get_parameters_ex(6, &crange, &cx, &cr, &cg, &cb, &ca) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(range, Imlib_Color_Range, crange, -1, "Imlib Color Range", le_imlib_cr); convert_to_long_ex(cx); x = Z_LVAL_PP(cx); _php_convert_four_longs(cr,cg,cb,ca,&r,&g,&b,&a); imlib_context_set_color_range(range); imlib_context_set_color(r,g,b,a); imlib_add_color_to_color_range(x); } /* }}} */ /* {{{ proto void imlib_blend_image_onto_image(int dstimg, int srcimg, int malpha, int srcx, int srcy, int srcw, int srch, int dstx, int dsty, int dstw, int dsth, char dither, char blend, char alias) Blend a rectangular area from an image onto an area of another image, scaling as necessary */ PHP_FUNCTION(imlib_blend_image_onto_image) { zval **dstimg, **srcimg, **malpha, **srcx, **srcy, **srcw, **srch, **dstx, **dsty, **dstw, **dsth, **dither, **blend, **alias; Imlib_Image dst,src; int sx,sy,sw,sh,dx,dy,dw,dh; int calias, calpha, cblend, cdither; if (ZEND_NUM_ARGS() != 14 || zend_get_parameters_ex(14, &dstimg, &srcimg, &malpha, &srcx, &srcy, &srcw, &srch, &dstx, &dsty, &dstw, &dsth, &dither, &blend, &alias) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(src, Imlib_Image, srcimg, -1, "Imlib Image", le_imlib_img); ZEND_FETCH_RESOURCE(dst, Imlib_Image, dstimg, -1, "Imlib Image", le_imlib_img); _php_convert_four_longs(srcx,srcy,srcw,srch,&sx,&sy,&sw,&sh); _php_convert_four_longs(dstx,dsty,dstw,dsth,&dx,&dy,&dw,&dh); convert_to_long_ex(malpha); convert_to_long_ex(dither); convert_to_long_ex(blend); convert_to_long_ex(alias); calpha = Z_LVAL_PP(malpha); cdither = Z_LVAL_PP(dither); cblend = Z_LVAL_PP(blend); calias = Z_LVAL_PP(alias); imlib_context_set_image(dst); imlib_context_set_anti_alias(calias); imlib_context_set_dither(cdither); imlib_context_set_blend(cblend); imlib_context_set_angle(0); imlib_blend_image_onto_image(src,calpha,sx,sy,sw,sh,dx,dy,dw,dh); } /* }}} */ /* {{{ proto int imlib_clone_image(int img) Duplicate an image */ PHP_FUNCTION(imlib_clone_image) { zval **img; Imlib_Image src,dst; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &img) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(src, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); imlib_context_set_image(src); dst = imlib_clone_image(); ZEND_REGISTER_RESOURCE(return_value, dst, le_imlib_img); } /* }}} */ /* {{{ proto int imlib_create_color_range() Create a new color range */ PHP_FUNCTION(imlib_create_color_range) { Imlib_Color_Range cr; if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } cr = imlib_create_color_range(); ZEND_REGISTER_RESOURCE(return_value, cr, le_imlib_cr); } /* }}} */ /* {{{ proto int imlib_create_cropped_image(int img, int srcx, int srcy, int srcw, int srch) Create an image from a cropped region of another image */ PHP_FUNCTION(imlib_create_cropped_image) { zval **img, **srcx, **srcy, **srcw, **srch; int sx,sy,sw,sh; Imlib_Image src,dst; if (ZEND_NUM_ARGS() != 5 || zend_get_parameters_ex(5, &img, &srcx, &srcy, &srcw, &srch) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(src, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); _php_convert_four_longs(srcx,srcy,srcw,srch,&sx,&sy,&sw,&sh); imlib_context_set_image(src); dst = imlib_create_cropped_image(sx,sy,sw,sh); ZEND_REGISTER_RESOURCE(return_value, dst, le_imlib_img); } /* }}} */ /* {{{ proto int imlib_create_cropped_scaled_image(int img, int srcx, int srcy, int srcw, int srch, int dstw, int dsth) Create a scaled image from a cropped region of another image */ PHP_FUNCTION(imlib_create_cropped_scaled_image) { zval **img, **srcx, **srcy, **srcw, **srch, **dstw, **dsth; int sx,sy,sw,sh,dw,dh; Imlib_Image src,dst; if (ZEND_NUM_ARGS() != 7 || zend_get_parameters_ex(7, &img, &srcx, &srcy, &srcw, &srch, &dstw, &dsth) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(src, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); _php_convert_four_longs(srcx,srcy,srcw,srch,&sx,&sy,&sw,&sh); convert_to_long_ex(dstw); convert_to_long_ex(dsth); dw = Z_LVAL_PP(dstw); dh = Z_LVAL_PP(dsth); imlib_context_set_image(src); dst = imlib_create_cropped_scaled_image(sx,sy, sw,sh, dw,dh); ZEND_REGISTER_RESOURCE(return_value, dst, le_imlib_img); } /* }}} */ /* {{{ proto int imlib_create_image(int w, int h) Create a new image with the specified dimensions */ PHP_FUNCTION(imlib_create_image) { zval **nx, **ny; Imlib_Image im; int x,y; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &nx, &ny) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_long_ex(nx); convert_to_long_ex(ny); x = Z_LVAL_PP(nx); y = Z_LVAL_PP(ny); im = imlib_create_image(x,y); imlib_context_set_image(im); memset(imlib_image_get_data(), '\0', x * y * sizeof(DATA32)); ZEND_REGISTER_RESOURCE(return_value, im, le_imlib_img); } /* }}} */ /* {{{ proto int imlib_create_rotated_image(int srcimg, int degrees[, int radians]) Create a rotated copy of an image. If radians is specified, degrees will be ignored. */ PHP_FUNCTION(imlib_create_rotated_image) { zval **srcimg, **cangle, **crads; double angle, radians, pi = 3.141592654; int argc; Imlib_Image src, dst; argc = ZEND_NUM_ARGS(); if (argc < 2 || argc > 3 || zend_get_parameters_ex(argc, &srcimg, &cangle, &crads) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(src, Imlib_Image, srcimg, -1, "Imlib Image", le_imlib_img); if (argc > 2) { convert_to_double_ex(crads); radians = Z_DVAL_PP(crads); } else { convert_to_double_ex(cangle); angle = Z_DVAL_PP(cangle); radians = angle * pi/180; } imlib_context_set_image(src); dst = imlib_create_rotated_image(radians); ZEND_REGISTER_RESOURCE(return_value, dst, le_imlib_img); } /* }}} */ /* {{{ proto int imlib_create_scaled_image(int img, int dstw, int dsth) Create a scaled copy of an image. If dstw or dsth is left blank, the aspect ratio of the source image will be preserved. */ PHP_FUNCTION(imlib_create_scaled_image) { zval **img, **dstw, **dsth; int sw,sh,dw,dh; Imlib_Image src,dst; if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &img, &dstw, &dsth) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(src, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); convert_to_long_ex(dstw); convert_to_long_ex(dsth); dw = Z_LVAL_PP(dstw); dh = Z_LVAL_PP(dsth); if (!dw && !dh) { RETURN_FALSE; } imlib_context_set_image(src); sw = imlib_image_get_width(); sh = imlib_image_get_height(); if (!dw) { dw = (int) (((double)dh * sw) / sh); } if (!dh) { dh = (int) (((double) dw * sh) / sw); } dst = imlib_create_cropped_scaled_image(0,0, sw,sh, dw,dh); ZEND_REGISTER_RESOURCE(return_value, dst, le_imlib_img); } /* }}} */ /* {{{ proto bool imlib_dump_image(int img[, int &err[, int quality]]) Output an image at an optional quality setting */ PHP_FUNCTION(imlib_dump_image) { int argc, q, fd, retval, output; char *tmpfile; zval **img, **quality, **err; Imlib_Image im; Imlib_Load_Error im_err; argc = ZEND_NUM_ARGS(); if (argc < 1 || argc > 3 || zend_get_parameters_ex(argc, &img, &err, &quality) == FAILURE) { WRONG_PARAM_COUNT; } if (argc > 1) { zval_dtor(*err); ZVAL_LONG(*err,0); } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); tmpfile = estrdup("/tmp/phpimlib.XXXXXX"); if ((fd = mkstemp(tmpfile)) < 0) { php_error(E_WARNING, "%s: unable to open temporary file", get_active_function_name(TSRMLS_C)); efree(tmpfile); RETURN_FALSE; } /* TODO: notify in case of errors? */ retval = fchmod(fd, S_IRUSR|S_IWUSR); if (retval != 0) { php_error(E_WARNING, "%s: could not change permissions on temporary file", get_active_function_name(TSRMLS_C)); close(fd); efree(tmpfile); RETURN_FALSE; } imlib_context_set_image(im); if(!imlib_image_format()) { imlib_image_set_format("png"); } if (argc > 2) { convert_to_long_ex(quality); q = Z_LVAL_PP(quality); imlib_image_attach_data_value("quality",NULL,q,NULL); } imlib_save_image_with_error_return(tmpfile,&im_err); if (im_err) { close(fd); unlink(tmpfile); efree(tmpfile); if (argc > 1) { ZVAL_LONG(*err,im_err); } _php_handle_imlib_error(INTERNAL_FUNCTION_PARAM_PASSTHRU, im_err,tmpfile); RETURN_FALSE; } /* fseek or something, then read the file and dump it out. */ lseek(fd, 0, SEEK_SET); output = php_header(); if (output) { char buf[4096]; #if APACHE && defined(CHARSET_EBCDIC) SLS_FETCH(); /* This is a binary file already: avoid EBCDIC->ASCII conversion */ ap_bsetflag(php3_rqst->connection->client, B_EBCDIC2ASCII, 0); #endif while ((retval = read(fd, buf, sizeof(buf))) > 0) { php_write(buf, retval TSRMLS_CC); } } close(fd); unlink(tmpfile); efree(tmpfile); if (output) { RETURN_TRUE; } else { RETURN_FALSE; } } /* }}} */ /* {{{ proto void imlib_free_color_range(int cr) Free a color range */ PHP_FUNCTION(imlib_free_color_range) { zval **fcr; Imlib_Color_Range cr; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &fcr) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(cr, Imlib_Color_Range, fcr, -1, "Imlib Color Range", le_imlib_cr); zend_list_delete(Z_LVAL_PP(fcr)); } /* }}} */ /* {{{ proto void imlib_free_font(int font) Free a font */ PHP_FUNCTION(imlib_free_font) { zval **font; Imlib_Font fn; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &font) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(fn, Imlib_Font, font, -1, "Imlib Font", le_imlib_font); zend_list_delete(Z_LVAL_PP(font)); } /* }}} */ /* {{{ proto void imlib_free_image(int img) Free an image */ PHP_FUNCTION(imlib_free_image) { zval **img; Imlib_Image im; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &img) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); zend_list_delete(Z_LVAL_PP(img)); } /* }}} */ /* {{{ proto void imlib_get_text_size(int font, string str, int &w, int &h, int direction) Determines the width and height of a string if drawn with a given font in the specified direction */ PHP_FUNCTION(imlib_get_text_size) { zval **font, **textstr, **tw, **th, **tdir; Imlib_Font fn; const char *text = NULL; int w,h,dir; if (ZEND_NUM_ARGS() != 5 || zend_get_parameters_ex(5, &font, &textstr, &tw, &th, &tdir) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(fn, Imlib_Font, font, -1, "Imlib Font", le_imlib_font); zval_dtor(*tw); zval_dtor(*th); convert_to_string_ex(textstr); convert_to_long_ex(tw); convert_to_long_ex(th); convert_to_long_ex(tdir); text = Z_STRVAL_PP(textstr); w = Z_LVAL_PP(tw); h = Z_LVAL_PP(th); dir = Z_LVAL_PP(tdir); imlib_context_set_font(fn); imlib_context_set_direction(dir); imlib_get_text_size(text, &w, &h); ZVAL_LONG(*tw,w); ZVAL_LONG(*th,h); } /* }}} */ /* {{{ proto void imlib_image_blur(int img, int radius) Blur an image with a given blur radius */ PHP_FUNCTION(imlib_image_blur) { zval **img, **radius; int r; Imlib_Image im; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &img, &radius) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); convert_to_long_ex(radius); r = Z_LVAL_PP(radius); imlib_context_set_image(im); imlib_image_blur(r); } /* }}} */ /* {{{ proto bool imlib_image_draw_ellipse(int img, int xc, int yc, int w, int h, int r, int g, int b, int a[, array cliprect]) Draw an ellipse of the specified size and color on an image */ PHP_FUNCTION(imlib_image_draw_ellipse) { _php_imlib_draw_something(INTERNAL_FUNCTION_PARAM_PASSTHRU,imlib_image_draw_ellipse, "imlib_image_draw_ellipse"); } /* }}} */ /* {{{ proto bool imlib_image_draw_line(int img, int x1, int y1, int x2, int y2, int r, int g, int b, int a[, array cliprect]) Draw a line of the specified size and color on an image */ PHP_FUNCTION(imlib_image_draw_line) { _php_imlib_draw_something(INTERNAL_FUNCTION_PARAM_PASSTHRU,_php_wrap_draw_line, "imlib_image_draw_ellipse"); } /* }}} */ /* {{{ proto bool imlib_image_draw_polygon(int img, int polygon, bool closed, int r, int g, int b, int a[, array cliprect]) Draw the defined polygon on an image */ PHP_FUNCTION(imlib_image_draw_polygon) { zval **img, **polygon, **pclosed, **pr, **pg, **pb, **pa, **dbox; int r,g,b,a,cx,cy,cw,ch,argc; Imlib_Image im; ImlibPolygon poly; int closed; argc = ZEND_NUM_ARGS(); if (argc < 7 || argc > 8 || zend_get_parameters_ex(argc, &img, &polygon, &pclosed, &pr, &pg, &pb, &pa, &dbox) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); ZEND_FETCH_RESOURCE(poly, ImlibPolygon, polygon, -1, "Imlib Polygon", le_imlib_poly); _php_convert_four_longs(pr,pg,pb,pa,&r,&g,&b,&a); convert_to_long_ex(pclosed); closed = Z_LVAL_PP(pclosed); imlib_context_set_image(im); imlib_context_set_color(r,g,b,a); if (argc > 7) { if (!_php_handle_cliprect_array(dbox, "imlib_image_draw_polygon", &cx, &cy, &cw, &ch)) RETURN_FALSE; imlib_context_set_cliprect(cx,cy,cw,ch); } imlib_image_draw_polygon(poly,closed); imlib_context_set_cliprect(0,0,0,0); } /* }}} */ /* {{{ proto bool imlib_image_draw_rectangle(int img, int x, int y, int w, int h, int r, int g, int b, int a[, array cliprect]) Draw a rectangle of the specified size and color on an image */ PHP_FUNCTION(imlib_image_draw_rectangle) { _php_imlib_draw_something(INTERNAL_FUNCTION_PARAM_PASSTHRU,imlib_image_draw_rectangle, "imlib_image_draw_rectangle"); } /* }}} */ /* {{{ proto bool imlib_image_fill_color_range_rectangle(int im, int cr, int x, int y, int width, int height, int angle) Fill a rectangle with a color range at a given angle on an image */ PHP_FUNCTION(imlib_image_fill_color_range_rectangle) { zval **fim, **fcr, **fx, **fy, **fwidth, **fheight, **fangle, **fbox; int x,y,width,height,argc,cx,cy,cw,ch; double angle; Imlib_Image im; Imlib_Color_Range cr; argc = ZEND_NUM_ARGS(); if (argc < 7 || argc > 8 || zend_get_parameters_ex(argc, &fim, &fcr, &fx, &fy, &fwidth, &fheight, &fangle, &fbox) == FAILURE) { WRONG_PARAM_COUNT; } _php_convert_four_longs(fx,fy,fwidth,fheight,&x,&y,&width,&height); convert_to_double_ex(fangle); angle = Z_DVAL_PP(fangle); ZEND_FETCH_RESOURCE(cr, Imlib_Color_Range, fcr, -1, "Imlib Color Range", le_imlib_cr); ZEND_FETCH_RESOURCE(im, Imlib_Image, fim, -1, "Imlib Image", le_imlib_img); imlib_context_set_color_range(cr); imlib_context_set_image(im); if (argc > 7) { if (!_php_handle_cliprect_array(fbox, "imlib_image_fill_color_range_rectangle", &cx,&cy,&cw,&ch)) RETURN_FALSE; imlib_context_set_cliprect(cx,cy,cw,ch); } imlib_image_fill_color_range_rectangle(x,y,width,height, angle); imlib_context_set_cliprect(0,0,0,0); RETURN_TRUE; } /* }}} */ /* {{{ proto void imlib_image_fill_ellipse(int img, int xc, int yc, int w, int h, int r, int g, int b, int a[, array cliprect]) Fill an ellipse of the specified size and color on an image */ PHP_FUNCTION(imlib_image_fill_ellipse) { _php_imlib_draw_something(INTERNAL_FUNCTION_PARAM_PASSTHRU,imlib_image_fill_ellipse, "imlib_image_fill_ellipse"); } /* }}} */ /* {{{ proto bool imlib_image_fill_polygon(int img, int polygon, int r, int g, int b, int a[, array cliprect]) Draw and fill the defined polygon on an image */ PHP_FUNCTION(imlib_image_fill_polygon) { zval **img, **polygon, **pr, **pg, **pb, **pa, **dbox; int r,g,b,a,cx,cy,cw,ch,argc; Imlib_Image im; ImlibPolygon poly; argc = ZEND_NUM_ARGS(); if (argc < 6 || argc > 7 || zend_get_parameters_ex(argc, &img, &polygon, &pr, &pg, &pb, &pa, &dbox) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); ZEND_FETCH_RESOURCE(poly, ImlibPolygon, polygon, -1, "Imlib Polygon", le_imlib_poly); _php_convert_four_longs(pr,pg,pb,pa,&r,&g,&b,&a); imlib_context_set_image(im); imlib_context_set_color(r,g,b,a); if (argc > 6) { if (!_php_handle_cliprect_array(dbox, "imlib_image_fill_polygon", &cx, &cy, &cw, &ch)) RETURN_FALSE; imlib_context_set_cliprect(cx,cy,cw,ch); } imlib_image_fill_polygon(poly); imlib_context_set_cliprect(0,0,0,0); RETURN_TRUE; } /* }}} */ /* {{{ proto void imlib_image_fill_rectangle(int img, int x, int y, int w, int h, int r, int g, int b, int a[, array cliprect]) Fill a rectangle of the specified size and color on an image */ PHP_FUNCTION(imlib_image_fill_rectangle) { _php_imlib_draw_something(INTERNAL_FUNCTION_PARAM_PASSTHRU,imlib_image_fill_rectangle, "imlib_image_fill_rectangle"); } /* }}} */ /* {{{ proto void imlib_image_flip_horizontal(int img) Flip an image horizontally */ PHP_FUNCTION(imlib_image_flip_horizontal) { _php_imlib_single_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU,imlib_image_flip_horizontal); } /* }}} */ /* {{{ proto void imlib_image_flip_vertical(int img) Flip an Imlib_Image vertically */ PHP_FUNCTION(imlib_image_flip_vertical) { _php_imlib_single_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU,imlib_image_flip_vertical); } /* }}} */ /* {{{ proto void imlib_image_flip_diagonal(int img) Flip an image diagonally */ PHP_FUNCTION(imlib_image_flip_diagonal) { _php_imlib_single_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU,imlib_image_flip_diagonal); } /* }}} */ /* {{{ proto string imlib_image_format(int img) Returns the image format of an image */ PHP_FUNCTION(imlib_image_format) { zval **img; Imlib_Image im; char *name; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &img) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); imlib_context_set_image(im); name = imlib_image_format(); if (!name) RETURN_FALSE; RETURN_STRING(name,strlen(name)); } /* }}} */ /* {{{ proto string imlib_image_get_filename(int img) Returns the filename of an image */ PHP_FUNCTION(imlib_image_get_filename) { zval **img; Imlib_Image im; const char *name = NULL; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &img) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); imlib_context_set_image(im); name = imlib_image_get_filename(); if (!name) RETURN_FALSE; RETURN_STRING((char*)name,strlen(name)); } /* }}} */ /* {{{ proto int imlib_image_get_height(int img) Returns the height of an image */ PHP_FUNCTION(imlib_image_get_height) { zval **img; Imlib_Image im; int height; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &img) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); imlib_context_set_image(im); height = imlib_image_get_height(); RETURN_LONG((long)height); } /* }}} */ /* {{{ proto int imlib_image_get_width(int img) Returns the width of an image */ PHP_FUNCTION(imlib_image_get_width) { zval **img; Imlib_Image im; int width; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &img) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); imlib_context_set_image(im); width = imlib_image_get_width(); RETURN_LONG((long)width); } /* }}} */ /* {{{ proto bool imlib_image_has_alpha(int img) Return a boolean for whether or not an image has an alpha channel */ PHP_FUNCTION(imlib_image_has_alpha) { zval **img; Imlib_Image im; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &img) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); imlib_context_set_image(im); if (imlib_image_has_alpha()) { RETURN_TRUE; } else { RETURN_FALSE; } } /* }}} */ /* {{{ proto void imlib_image_modify_alpha(int img, int alpha) Set the alpha channel of an image, or modify it if one was already present */ PHP_FUNCTION(imlib_image_modify_alpha) { zval **img, **alpha; Imlib_Image im; DATA8 map[256]; Imlib_Color_Modifier *cmod; int malpha, i; double ratio; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &img, &alpha) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); convert_to_long_ex(alpha); malpha = Z_LVAL_PP(alpha); ratio = ((double)malpha) / 255; imlib_context_set_image(im); if (imlib_image_has_alpha()) { for (i = 0; i < 256; i++) map[i] = (DATA8) (i * ratio); } else { for (i = 0; i < 256; i++) map[i] = malpha; imlib_image_set_has_alpha(1); } cmod = imlib_create_color_modifier(); imlib_context_set_color_modifier(cmod); imlib_set_color_modifier_tables(NULL, NULL, NULL, map); imlib_apply_color_modifier(); imlib_free_color_modifier(); } /* }}} */ /* {{{ proto void imlib_image_set_format(int img, string format) Sets the image format of an image. */ PHP_FUNCTION(imlib_image_set_format) { zval **img, **zformat; Imlib_Image im; char *format; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &img, &zformat) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); convert_to_string_ex(zformat); format = Z_STRVAL_PP(zformat); if (!format) { RETURN_FALSE; } imlib_context_set_image(im); imlib_image_set_format(format); RETURN_TRUE; } /* }}} */ /* {{{ proto void imlib_image_sharpen(int img, int radius) Sharpen an image with a given sharpen radius */ PHP_FUNCTION(imlib_image_sharpen) { zval **img, **radius; int r; Imlib_Image im; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &img, &radius) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); convert_to_long_ex(radius); r = Z_LVAL_PP(radius); imlib_context_set_image(im); imlib_image_sharpen(r); } /* }}} */ /* {{{ proto void imlib_image_tile_horizontal(int img) Tile an image horizontally */ PHP_FUNCTION(imlib_image_tile_horizontal) { _php_imlib_single_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU,imlib_image_tile_horizontal); } /* }}} */ /* {{{ proto void imlib_image_tile_vertical(int img) Tile an image vertically */ PHP_FUNCTION(imlib_image_tile_vertical) { _php_imlib_single_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU,imlib_image_tile_vertical); } /* }}} */ /* {{{ proto void imlib_image_tile(int img) Tile an image horizontally and diagonally */ PHP_FUNCTION(imlib_image_tile) { _php_imlib_single_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU,imlib_image_tile); } /* }}} */ /* {{{ proto array imlib_list_fonts() Return an array of all the fonts available in the font path */ PHP_FUNCTION(imlib_list_fonts) { int fcount, i; char **flist = imlib_list_fonts(&fcount); if (array_init(return_value) == FAILURE) { php_error(E_WARNING, "Cannot initialize return value"); RETURN_FALSE; } if (!fcount) RETURN_FALSE; for (i = 0; i < fcount; i++) { /* FIXME: Is 1 the right parameter here? */ add_next_index_string(return_value, flist[i], 1); } imlib_free_font_list(flist,fcount); } /* }}} */ /* {{{ proto int imlib_load_font(string fontname) Load a font */ PHP_FUNCTION(imlib_load_font) { zval **fontname; Imlib_Font fn; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &fontname) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_string_ex(fontname); fn = imlib_load_font(Z_STRVAL_PP(fontname)); if (!fn) { php_error(E_WARNING, "%s - Could not load font.", Z_STRVAL_PP(fontname)); RETURN_FALSE; } ZEND_REGISTER_RESOURCE(return_value, fn, le_imlib_font); } /* }}} */ /* {{{ proto int imlib_load_image(string img[, int &err]) Load a file into an image, optionally fetch an error parameter */ PHP_FUNCTION(imlib_load_image) { zval **img, **err; int argc; Imlib_Image im; Imlib_Load_Error im_err; argc = ZEND_NUM_ARGS(); if (argc < 1 || argc > 2 || zend_get_parameters_ex(argc, &img, &err) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_string_ex(img); if (argc == 2) { zval_dtor(*err); ZVAL_LONG(*err,0); } im = imlib_load_image_with_error_return(Z_STRVAL_PP(img),&im_err); if ((im_err) || (!im)) { if (argc == 2) { ZVAL_LONG(*err,im_err); } _php_handle_imlib_error(INTERNAL_FUNCTION_PARAM_PASSTHRU, im_err,Z_STRVAL_PP(img)); RETURN_FALSE; } else { ZEND_REGISTER_RESOURCE(return_value, im, le_imlib_img); } } /* }}} */ /* {{{ proto void imlib_polygon_add_point(int polygon, int x, int y) Add a point to a given polygon */ PHP_FUNCTION(imlib_polygon_add_point) { zval **polygon, **px, **py; int x,y; ImlibPolygon poly; if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &polygon, &px, &py) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(poly, ImlibPolygon, polygon, -1, "Imlib Polygon", le_imlib_poly); convert_to_long_ex(px); convert_to_long_ex(py); x = Z_LVAL_PP(px); y = Z_LVAL_PP(py); imlib_polygon_add_point(poly,x,y); } /* }}} */ /* {{{ proto bool imlib_polygon_contains_point(int polygon, int x, int y) Check if a give point is inside a polygon */ PHP_FUNCTION(imlib_polygon_contains_point) { zval **polygon, **px, **py; int x,y,ret; ImlibPolygon poly; if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &polygon, &px, &py) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(poly, ImlibPolygon, polygon, -1, "Imlib Polygon", le_imlib_poly); convert_to_long_ex(px); convert_to_long_ex(py); x = Z_LVAL_PP(px); y = Z_LVAL_PP(py); ret = imlib_polygon_contains_point(poly,x,y); if (ret) { RETURN_TRUE; } else { RETURN_FALSE; } } /* }}} */ /* {{{ proto void imlib_polygon_free(int polygon) Free a polygon */ PHP_FUNCTION(imlib_polygon_free) { zval **polygon; ImlibPolygon poly; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &polygon) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(poly, ImlibPolygon, polygon, -1, "Imlib Polygon", le_imlib_poly); zend_list_delete(Z_LVAL_PP(polygon)); } /* }}} */ /* {{{ proto void imlib_polygon_get_bounds(int polygon, int &x1, int &y1, int &x2, int &y2) Get the bounding coords of a polygon */ PHP_FUNCTION(imlib_polygon_get_bounds) { zval **polygon, **px1, **py1, **px2, **py2; int x1,y1,x2,y2; ImlibPolygon poly; if (ZEND_NUM_ARGS() != 5 || zend_get_parameters_ex(5, &polygon, &px1, &py1, &px2, &py2) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(poly, ImlibPolygon, polygon, -1, "Imlib Polygon", le_imlib_poly); zval_dtor(*px1); zval_dtor(*py1); zval_dtor(*px2); zval_dtor(*py2); imlib_polygon_get_bounds(poly,&x1,&y1,&x2,&y2); ZVAL_LONG(*px1,x1); ZVAL_LONG(*py1,y1); ZVAL_LONG(*px2,x2); ZVAL_LONG(*py2,y2); } /* }}} */ /* {{{ proto int imlib_polygon_new() Create a new polygon */ PHP_FUNCTION(imlib_polygon_new) { ImlibPolygon poly; if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } poly = imlib_polygon_new(); ZEND_REGISTER_RESOURCE(return_value, poly, le_imlib_poly); } /* }}} */ /* {{{ proto bool imlib_save_image(int img, string name[, int &err[, int quality]]) Save an image to a file, at an optional quality level (1-100) for jpegs. For pngs, the value will be converted to a compression level (0-9) */ PHP_FUNCTION(imlib_save_image) { zval **img, **name, **quality, **err; Imlib_Image im; Imlib_Load_Error im_err; int argc, q; argc = ZEND_NUM_ARGS(); if (argc < 2 || argc > 4 || zend_get_parameters_ex(argc, &img, &name, &err, &quality) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); convert_to_string_ex(name); imlib_context_set_image(im); if (argc > 2) { zval_dtor(*err); ZVAL_LONG(*err,0); } if (argc > 3) { convert_to_long_ex(quality); q = Z_LVAL_PP(quality); imlib_image_attach_data_value("quality",NULL,q,NULL); } imlib_save_image_with_error_return(Z_STRVAL_PP(name),&im_err); if (im_err) { if (argc > 2) { ZVAL_LONG(*err,im_err); } _php_handle_imlib_error(INTERNAL_FUNCTION_PARAM_PASSTHRU, im_err,Z_STRVAL_PP(name)); RETURN_FALSE; } RETURN_TRUE; } /* }}} */ /* {{{ proto void imlib_text_draw(int img, int font, int x, int y, string str, int direction, int r, int g, int b, int a) Draw a text string using a font onto an image */ PHP_FUNCTION(imlib_text_draw) { zval **img, **font, **tx, **ty, **textstr, **tdir, **tr, **tg, **tb, **ta; Imlib_Image im; Imlib_Font fn; char *text; int x,y,dir,r,g,b,a; if (ZEND_NUM_ARGS() != 10 || zend_get_parameters_ex(10, &img, &font, &tx, &ty, &textstr, &tdir, &tr, &tg, &tb, &ta) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, Imlib_Image, img, -1, "Imlib Image", le_imlib_img); ZEND_FETCH_RESOURCE(fn, Imlib_Font, font, -1, "Imlib Font", le_imlib_font); convert_to_long_ex(tx); convert_to_long_ex(ty); convert_to_long_ex(tdir); convert_to_string_ex(textstr); x = Z_LVAL_PP(tx); y = Z_LVAL_PP(ty); dir = Z_LVAL_PP(tdir); text = Z_STRVAL_PP(textstr); _php_convert_four_longs(tr,tg,tb,ta,&r,&g,&b,&a); imlib_context_set_image(im); imlib_context_set_color(r,g,b,a); imlib_context_set_font(fn); imlib_context_set_direction(dir); imlib_text_draw(x, y, text); RETURN_TRUE; /* TODO: Useful return value? */ } /* }}} */ /* {{{ proto int imlib_get_cache_size() Get the size of image cache */ PHP_FUNCTION(imlib_get_cache_size) { RETURN_LONG((long)imlib_get_cache_size()); } /* }}} */ /* {{{ proto void imlib_set_cache_size(int bytes) Set the size of image cache */ PHP_FUNCTION(imlib_set_cache_size) { zval** tsize; int size; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &tsize) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_long_ex(tsize); size = Z_LVAL_PP(tsize); _php_imlib_set_cache_size(size TSRMLS_CC); RETURN_TRUE; } /* }}} */ #endif /* HAVE_IMLIB */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: */