fontmatrix-0.6.0+svn20110930/0000755000175000017500000000000011641435631014334 5ustar malexmalexfontmatrix-0.6.0+svn20110930/help/0000755000175000017500000000000011641435631015264 5ustar malexmalexfontmatrix-0.6.0+svn20110930/help/helpbase.css0000644000175000017500000000213211041357426017556 0ustar malexmalex/* helpbase.css */ body{ font-family: Helvetica, Arial, sans-serif; margin:0px; padding:5px; background: #FFFAF0; } .par{ text-align: justify; font-family: Helvetica, sans-serif; font-size: 1em; } .list{ text-align: justify; font-family: Helvetica, sans-serif; font-size: 1em; margin-left: 0; } #welcome{ text-align: center; font-family: serif; color: #fefefe; font-size: 1.5em; } h1{color: #A52A2A;} h2{color: #A52A2A;} h3{color: #1C86EE;} h4{color: #AA5500;} /** tabs **/ div.tabContent { display:none; } ul.tabs { margin:20px 0 0 0 ; padding:0px; border-bottom:1px solid #D2D2D2; height:1.8em; } ul.tabs li { background:url("tab-left.png") left top no-repeat; padding-left:4px; float:left; margin:0; list-style-type:none; } ul.tabs a { background:url("tab-right.png") right top no-repeat; padding:2px 12px; border-bottom:1px solid #D2D2D2; text-decoration:none; display:block; color:#333; font-size:13px; } ul.tabs li.current a, ul.tabs a:hover { background-position:100% -150px; border-bottom:1px solid #BF0000; } ul.tabs li.current { background-position:0 -150px; }fontmatrix-0.6.0+svn20110930/help/nb/0000755000175000017500000000000011641435631015663 5ustar malexmalexfontmatrix-0.6.0+svn20110930/help/nb/readme.html0000644000175000017500000000062111147562706020012 0ustar malexmalex Fontmatrix User Manual

Readme

fontmatrix-0.6.0+svn20110930/help/nb/menu.xml0000644000175000017500000000643011217644652017360 0ustar malexmalex fontmatrix-0.6.0+svn20110930/help/nb/index.html0000644000175000017500000000065411147562706017672 0ustar malexmalex Fontmatrix User Manual

Welcome in Fontmatrix help system

fontmatrix-0.6.0+svn20110930/help/nb/CMakeLists.txt0000644000175000017500000000020111147562706020421 0ustar malexmalexSET(FM_HELP_FILES_EN menu.xml style.css index.html readme.html ) INSTALL(FILES ${FM_HELP_FILES_EN} DESTINATION "${HELPDIR}nb") fontmatrix-0.6.0+svn20110930/help/nb/style.css0000644000175000017500000000003311147562706017536 0ustar malexmalex/* Fontmatrix help style */fontmatrix-0.6.0+svn20110930/help/js/0000755000175000017500000000000011641435631015700 5ustar malexmalexfontmatrix-0.6.0+svn20110930/help/js/jquery.js0000644000175000017500000007120611041355024017552 0ustar malexmalex/* * jQuery 1.2.2 - New Wave Javascript * * Copyright (c) 2007 John Resig (jquery.com) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * $Date: 2008-01-14 17:56:07 -0500 (Mon, 14 Jan 2008) $ * $Rev: 4454 $ */ eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(J(){7(1e.19)L w=1e.19;L E=1e.19=J(a,b){K 1D E.2m.4Y(a,b)};7(1e.$)L D=1e.$;1e.$=E;L u=/^[^<]*(<(.|\\s)+>)[^>]*$|^#(\\w+)$/;L G=/^.[^:#\\[\\.]*$/;E.1i=E.2m={4Y:J(d,b){d=d||T;7(d.15){6[0]=d;6.M=1;K 6}N 7(1v d=="25"){L c=u.39(d);7(c&&(c[1]||!b)){7(c[1])d=E.5c([c[1]],b);N{L a=T.5N(c[3]);7(a)7(a.2s!=c[3])K E().2r(d);N{6[0]=a;6.M=1;K 6}N d=[]}}N K 1D E(b).2r(d)}N 7(E.1q(d))K 1D E(T)[E.1i.21?"21":"43"](d);K 6.6G(d.1n==1N&&d||(d.5j||d.M&&d!=1e&&!d.15&&d[0]!=10&&d[0].15)&&E.2H(d)||[d])},5j:"1.2.2",82:J(){K 6.M},M:0,22:J(a){K a==10?E.2H(6):6[a]},2E:J(b){L a=E(b);a.56=6;K a},6G:J(a){6.M=0;1N.2m.1h.1j(6,a);K 6},V:J(a,b){K E.V(6,a,b)},5E:J(b){L a=-1;6.V(J(i){7(6==b)a=i});K a},1K:J(c,a,b){L d=c;7(c.1n==4d)7(a==10)K 6.M&&E[b||"1K"](6[0],c)||10;N{d={};d[c]=a}K 6.V(J(i){P(c 1r d)E.1K(b?6.Y:6,c,E.1l(6,d[c],b,i,c))})},1m:J(b,a){7((b==\'29\'||b==\'1P\')&&2M(a)<0)a=10;K 6.1K(b,a,"2q")},1t:J(b){7(1v b!="4D"&&b!=W)K 6.4B().3t((6[0]&&6[0].2u||T).5v(b));L a="";E.V(b||6,J(){E.V(6.3p,J(){7(6.15!=8)a+=6.15!=1?6.6M:E.1i.1t([6])})});K a},5r:J(b){7(6[0])E(b,6[0].2u).5J().3n(6[0]).2a(J(){L a=6;2e(a.1B)a=a.1B;K a}).3t(6);K 6},8t:J(a){K 6.V(J(){E(6).6C().5r(a)})},8m:J(a){K 6.V(J(){E(6).5r(a)})},3t:J(){K 6.3P(1a,R,S,J(a){7(6.15==1)6.3k(a)})},6s:J(){K 6.3P(1a,R,R,J(a){7(6.15==1)6.3n(a,6.1B)})},6o:J(){K 6.3P(1a,S,S,J(a){6.1b.3n(a,6)})},5a:J(){K 6.3P(1a,S,R,J(a){6.1b.3n(a,6.2J)})},3h:J(){K 6.56||E([])},2r:J(b){L c=E.2a(6,J(a){K E.2r(b,a)});K 6.2E(/[^+>] [^+>]/.17(b)||b.1g("..")>-1?E.57(c):c)},5J:J(e){L f=6.2a(J(){7(E.14.1d&&!E.3W(6)){L a=6.6c(R),5u=T.2R("1u"),4T=T.2R("1u");5u.3k(a);4T.38=5u.38;K 4T.1B}N K 6.6c(R)});L d=f.2r("*").4R().V(J(){7(6[F]!=10)6[F]=W});7(e===R)6.2r("*").4R().V(J(i){7(6.15==3)K;L c=E.Q(6,"2N");P(L a 1r c)P(L b 1r c[a])E.16.1c(d[i],a,c[a][b],c[a][b].Q)});K f},1F:J(b){K 6.2E(E.1q(b)&&E.3x(6,J(a,i){K b.1O(a,i)})||E.3d(b,6))},4I:J(b){7(b.1n==4d)7(G.17(b))K 6.2E(E.3d(b,6,R));N b=E.3d(b,6);L a=b.M&&b[b.M-1]!==10&&!b.15;K 6.1F(J(){K a?E.35(6,b)<0:6!=b})},1c:J(a){K!a?6:6.2E(E.34(6.22(),a.1n==4d?E(a).22():a.M!=10&&(!a.12||E.12(a,"3i"))?a:[a]))},3K:J(a){K a?E.3d(a,6).M>0:S},7g:J(a){K 6.3K("."+a)},5P:J(b){7(b==10){7(6.M){L c=6[0];7(E.12(c,"2y")){L e=c.44,5L=[],11=c.11,30=c.U=="2y-30";7(e<0)K W;P(L i=30?e:0,2b=30?e+1:11.M;i<2b;i++){L d=11[i];7(d.2p){b=E.14.1d&&!d.9s.1C.9o?d.1t:d.1C;7(30)K b;5L.1h(b)}}K 5L}N K(6[0].1C||"").1p(/\\r/g,"")}K 10}K 6.V(J(){7(6.15!=1)K;7(b.1n==1N&&/5w|5y/.17(6.U))6.3o=(E.35(6.1C,b)>=0||E.35(6.37,b)>=0);N 7(E.12(6,"2y")){L a=b.1n==1N?b:[b];E("90",6).V(J(){6.2p=(E.35(6.1C,a)>=0||E.35(6.1t,a)>=0)});7(!a.M)6.44=-1}N 6.1C=b})},3q:J(a){K a==10?(6.M?6[0].38:W):6.4B().3t(a)},6P:J(a){K 6.5a(a).1Y()},6N:J(i){K 6.2V(i,i+1)},2V:J(){K 6.2E(1N.2m.2V.1j(6,1a))},2a:J(b){K 6.2E(E.2a(6,J(a,i){K b.1O(a,i,a)}))},4R:J(){K 6.1c(6.56)},3P:J(g,f,h,d){L e=6.M>1,3m;K 6.V(J(){7(!3m){3m=E.5c(g,6.2u);7(h)3m.8I()}L b=6;7(f&&E.12(6,"1V")&&E.12(3m[0],"4x"))b=6.3V("1S")[0]||6.3k(6.2u.2R("1S"));L c=E([]);E.V(3m,J(){L a=e?E(6).5J(R)[0]:6;7(E.12(a,"1o")){c=c.1c(a)}N{7(a.15==1)c=c.1c(E("1o",a).1Y());d.1O(b,a)}});c.V(6D)})}};E.2m.4Y.2m=E.2m;J 6D(i,a){7(a.3R)E.3Q({1f:a.3R,3l:S,1G:"1o"});N E.5l(a.1t||a.6A||a.38||"");7(a.1b)a.1b.2X(a)}E.1s=E.1i.1s=J(){L b=1a[0]||{},i=1,M=1a.M,5i=S,11;7(b.1n==8f){5i=b;b=1a[1]||{};i=2}7(1v b!="4D"&&1v b!="J")b={};7(M==1){b=6;i=0}P(;i-1}},6e:J(b,c,a){L e={};P(L d 1r c){e[d]=b.Y[d];b.Y[d]=c[d]}a.1O(b);P(L d 1r c)b.Y[d]=e[d]},1m:J(d,e,c){7(e=="29"||e=="1P"){L b,3S={3C:"4Z",4X:"23",18:"3u"},3r=e=="29"?["7P","7M"]:["7L","7K"];J 4S(){b=e=="29"?d.7J:d.7I;L a=0,3a=0;E.V(3r,J(){a+=2M(E.2q(d,"7H"+6,R))||0;3a+=2M(E.2q(d,"3a"+6+"62",R))||0});b-=1Z.7E(a+3a)}7(E(d).3K(":4b"))4S();N E.6e(d,3S,4S);K 1Z.2b(0,b)}K E.2q(d,e,c)},2q:J(e,k,j){L d;J 3y(b){7(!E.14.26)K S;L a=T.4a.4L(b,W);K!a||a.4K("3y")==""}7(k=="1y"&&E.14.1d){d=E.1K(e.Y,"1y");K d==""?"1":d}7(E.14.2B&&k=="18"){L c=e.Y.18;e.Y.18="3u";e.Y.18=c}7(k.1E(/4c/i))k=y;7(!j&&e.Y&&e.Y[k])d=e.Y[k];N 7(T.4a&&T.4a.4L){7(k.1E(/4c/i))k="4c";k=k.1p(/([A-Z])/g,"-$1").2w();L h=T.4a.4L(e,W);7(h&&!3y(e))d=h.4K(k);N{L f=[],2L=[];P(L a=e;a&&3y(a);a=a.1b)2L.4U(a);P(L i=0;i<2L.M;i++)7(3y(2L[i])){f[i]=2L[i].Y.18;2L[i].Y.18="3u"}d=k=="18"&&f[2L.M-1]!=W?"2D":(h&&h.4K(k))||"";P(L i=0;i]*?)\\/>/g,J(b,a,c){K c.1E(/^(7k|7h|5Q|7f|48|5O|a3|3v|9Y|9W|9T)$/i)?b:a+">"});L f=E.3f(d).2w(),1u=h.2R("1u");L e=!f.1g("<9R")&&[1,"<2y 78=\'78\'>",""]||!f.1g("<9O")&&[1,"<77>",""]||f.1E(/^<(9K|1S|9I|9F|9A)/)&&[1,"<1V>",""]||!f.1g("<4x")&&[2,"<1V><1S>",""]||(!f.1g("<9y")||!f.1g("<9v"))&&[3,"<1V><1S><4x>",""]||!f.1g("<5Q")&&[2,"<1V><1S><76>",""]||E.14.1d&&[1,"1u<1u>",""]||[0,"",""];1u.38=e[1]+d+e[2];2e(e[0]--)1u=1u.5D;7(E.14.1d){L g=!f.1g("<1V")&&f.1g("<1S")<0?1u.1B&&1u.1B.3p:e[1]=="<1V>"&&f.1g("<1S")<0?1u.3p:[];P(L j=g.M-1;j>=0;--j)7(E.12(g[j],"1S")&&!g[j].3p.M)g[j].1b.2X(g[j]);7(/^\\s/.17(d))1u.3n(h.5v(d.1E(/^\\s*/)[0]),1u.1B)}d=E.2H(1u.3p)}7(d.M===0&&(!E.12(d,"3i")&&!E.12(d,"2y")))K;7(d[0]==10||E.12(d,"3i")||d.11)k.1h(d);N k=E.34(k,d)});K k},1K:J(d,e,c){7(!d||d.15==3||d.15==8)K 10;L f=E.3W(d)?{}:E.3S;7(e=="2p"&&E.14.26)d.1b.44;7(f[e]){7(c!=10)d[f[e]]=c;K d[f[e]]}N 7(E.14.1d&&e=="Y")K E.1K(d.Y,"9r",c);N 7(c==10&&E.14.1d&&E.12(d,"3i")&&(e=="9q"||e=="9p"))K d.9n(e).6M;N 7(d.28){7(c!=10){7(e=="U"&&E.12(d,"48")&&d.1b)6Z"U 9i 9g\'t 9b 9a";d.99(e,""+c)}7(E.14.1d&&/6T|3R/.17(e)&&!E.3W(d))K d.4z(e,2);K d.4z(e)}N{7(e=="1y"&&E.14.1d){7(c!=10){d.6q=1;d.1F=(d.1F||"").1p(/6W\\([^)]*\\)/,"")+(2M(c).3D()=="93"?"":"6W(1y="+c*6S+")")}K d.1F&&d.1F.1g("1y=")>=0?(2M(d.1F.1E(/1y=([^)]*)/)[1])/6S).3D():""}e=e.1p(/-([a-z])/92,J(a,b){K b.2F()});7(c!=10)d[e]=c;K d[e]}},3f:J(a){K(a||"").1p(/^\\s+|\\s+$/g,"")},2H:J(b){L a=[];7(1v b!="91")P(L i=0,M=b.M;i*",6).1Y();2e(6.1B)6.2X(6.1B)}},J(a,b){E.1i[a]=J(){K 6.V(b,1a)}});E.V(["8e","62"],J(i,c){L b=c.2w();E.1i[b]=J(a){K 6[0]==1e?E.14.2B&&T.1k["5h"+c]||E.14.26&&1e["8d"+c]||T.6I=="6H"&&T.1I["5h"+c]||T.1k["5h"+c]:6[0]==T?1Z.2b(1Z.2b(T.1k["5g"+c],T.1I["5g"+c]),1Z.2b(T.1k["5f"+c],T.1I["5f"+c])):a==10?(6.M?E.1m(6[0],b):W):6.1m(b,a.1n==4d?a:a+"2P")}});L C=E.14.26&&4t(E.14.5n)<8c?"(?:[\\\\w*4s-]|\\\\\\\\.)":"(?:[\\\\w\\8b-\\8a*4s-]|\\\\\\\\.)",6w=1D 4r("^>\\\\s*("+C+"+)"),6v=1D 4r("^("+C+"+)(#)("+C+"+)"),6u=1D 4r("^([#.]?)("+C+"*)");E.1s({5d:{"":"m[2]==\'*\'||19.12(a,m[2])","#":"a.4z(\'2s\')==m[2]",":":{88:"im[3]-0",31:"m[3]-0==i",6N:"m[3]-0==i",3j:"i==0",3M:"i==r.M-1",6r:"i%2==0",6p:"i%2","3j-4m":"a.1b.3V(\'*\')[0]==a","3M-4m":"19.31(a.1b.5D,1,\'4v\')==a","84-4m":"!19.31(a.1b.5D,2,\'4v\')",6E:"a.1B",4B:"!a.1B",83:"(a.6A||a.80||19(a).1t()||\'\').1g(m[3])>=0",4b:\'"23"!=a.U&&19.1m(a,"18")!="2D"&&19.1m(a,"4X")!="23"\',23:\'"23"==a.U||19.1m(a,"18")=="2D"||19.1m(a,"4X")=="23"\',7Y:"!a.2W",2W:"a.2W",3o:"a.3o",2p:"a.2p||19.1K(a,\'2p\')",1t:"\'1t\'==a.U",5w:"\'5w\'==a.U",5y:"\'5y\'==a.U",5b:"\'5b\'==a.U",3J:"\'3J\'==a.U",59:"\'59\'==a.U",6n:"\'6n\'==a.U",6m:"\'6m\'==a.U",2G:\'"2G"==a.U||19.12(a,"2G")\',48:"/48|2y|6l|2G/i.17(a.12)",3E:"19.2r(m[3],a).M",7X:"/h\\\\d/i.17(a.12)",7W:"19.3x(19.3I,J(1i){K a==1i.O;}).M"}},6j:[/^(\\[) *@?([\\w-]+) *([!*$^~=]*) *(\'?"?)(.*?)\\4 *\\]/,/^(:)([\\w-]+)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/,1D 4r("^([:.#]*)("+C+"+)")],3d:J(a,c,b){L d,2o=[];2e(a&&a!=d){d=a;L f=E.1F(a,c,b);a=f.t.1p(/^\\s*,\\s*/,"");2o=b?c=f.r:E.34(2o,f.r)}K 2o},2r:J(t,p){7(1v t!="25")K[t];7(p&&p.15!=1&&p.15!=9)K[];p=p||T;L d=[p],2j=[],3M,12;2e(t&&3M!=t){L r=[];3M=t;t=E.3f(t);L o=S;L g=6w;L m=g.39(t);7(m){12=m[1].2F();P(L i=0;d[i];i++)P(L c=d[i].1B;c;c=c.2J)7(c.15==1&&(12=="*"||c.12.2F()==12))r.1h(c);d=r;t=t.1p(g,"");7(t.1g(" ")==0)6z;o=R}N{g=/^([>+~])\\s*(\\w*)/i;7((m=g.39(t))!=W){r=[];L l={};12=m[2].2F();m=m[1];P(L j=0,3g=d.M;j<3g;j++){L n=m=="~"||m=="+"?d[j].2J:d[j].1B;P(;n;n=n.2J)7(n.15==1){L h=E.Q(n);7(m=="~"&&l[h])1T;7(!12||n.12.2F()==12){7(m=="~")l[h]=R;r.1h(n)}7(m=="+")1T}}d=r;t=E.3f(t.1p(g,""));o=R}}7(t&&!o){7(!t.1g(",")){7(p==d[0])d.4k();2j=E.34(2j,d);r=d=[p];t=" "+t.6i(1,t.M)}N{L k=6v;L m=k.39(t);7(m){m=[0,m[2],m[3],m[1]]}N{k=6u;m=k.39(t)}m[2]=m[2].1p(/\\\\/g,"");L f=d[d.M-1];7(m[1]=="#"&&f&&f.5N&&!E.3W(f)){L q=f.5N(m[2]);7((E.14.1d||E.14.2B)&&q&&1v q.2s=="25"&&q.2s!=m[2])q=E(\'[@2s="\'+m[2]+\'"]\',f)[0];d=r=q&&(!m[3]||E.12(q,m[3]))?[q]:[]}N{P(L i=0;d[i];i++){L a=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];7(a=="*"&&d[i].12.2w()=="4D")a="3v";r=E.34(r,d[i].3V(a))}7(m[1]==".")r=E.58(r,m[2]);7(m[1]=="#"){L e=[];P(L i=0;r[i];i++)7(r[i].4z("2s")==m[2]){e=[r[i]];1T}r=e}d=r}t=t.1p(k,"")}}7(t){L b=E.1F(t,r);d=r=b.r;t=E.3f(b.t)}}7(t)d=[];7(d&&p==d[0])d.4k();2j=E.34(2j,d);K 2j},58:J(r,m,a){m=" "+m+" ";L c=[];P(L i=0;r[i];i++){L b=(" "+r[i].1w+" ").1g(m)>=0;7(!a&&b||a&&!b)c.1h(r[i])}K c},1F:J(t,r,h){L d;2e(t&&t!=d){d=t;L p=E.6j,m;P(L i=0;p[i];i++){m=p[i].39(t);7(m){t=t.7V(m[0].M);m[2]=m[2].1p(/\\\\/g,"");1T}}7(!m)1T;7(m[1]==":"&&m[2]=="4I")r=G.17(m[3])?E.1F(m[3],r,R).r:E(r).4I(m[3]);N 7(m[1]==".")r=E.58(r,m[2],h);N 7(m[1]=="["){L g=[],U=m[3];P(L i=0,3g=r.M;i<3g;i++){L a=r[i],z=a[E.3S[m[2]]||m[2]];7(z==W||/6T|3R|2p/.17(m[2]))z=E.1K(a,m[2])||\'\';7((U==""&&!!z||U=="="&&z==m[5]||U=="!="&&z!=m[5]||U=="^="&&z&&!z.1g(m[5])||U=="$="&&z.6i(z.M-m[5].M)==m[5]||(U=="*="||U=="~=")&&z.1g(m[5])>=0)^h)g.1h(a)}r=g}N 7(m[1]==":"&&m[2]=="31-4m"){L e={},g=[],17=/(-?)(\\d*)n((?:\\+|-)?\\d*)/.39(m[3]=="6r"&&"2n"||m[3]=="6p"&&"2n+1"||!/\\D/.17(m[3])&&"7U+"+m[3]||m[3]),3j=(17[1]+(17[2]||1))-0,d=17[3]-0;P(L i=0,3g=r.M;i<3g;i++){L j=r[i],1b=j.1b,2s=E.Q(1b);7(!e[2s]){L c=1;P(L n=1b.1B;n;n=n.2J)7(n.15==1)n.4p=c++;e[2s]=R}L b=S;7(3j==0){7(j.4p==d)b=R}N 7((j.4p-d)%3j==0&&(j.4p-d)/3j>=0)b=R;7(b^h)g.1h(j)}r=g}N{L f=E.5d[m[1]];7(1v f!="25")f=E.5d[m[1]][m[2]];f=4A("S||J(a,i){K "+f+"}");r=E.3x(r,f,h)}}K{r:r,t:t}},4w:J(b,c){L d=[];L a=b[c];2e(a&&a!=T){7(a.15==1)d.1h(a);a=a[c]}K d},31:J(a,e,c,b){e=e||1;L d=0;P(;a;a=a[c])7(a.15==1&&++d==e)1T;K a},5m:J(n,a){L r=[];P(;n;n=n.2J){7(n.15==1&&(!a||n!=a))r.1h(n)}K r}});E.16={1c:J(f,i,g,e){7(f.15==3||f.15==8)K;7(E.14.1d&&f.54!=10)f=1e;7(!g.2A)g.2A=6.2A++;7(e!=10){L h=g;g=J(){K h.1j(6,1a)};g.Q=e;g.2A=h.2A}L j=E.Q(f,"2N")||E.Q(f,"2N",{}),1x=E.Q(f,"1x")||E.Q(f,"1x",J(){L a;7(1v E=="10"||E.16.52)K a;a=E.16.1x.1j(1a.3G.O,1a);K a});1x.O=f;E.V(i.2d(/\\s+/),J(c,b){L a=b.2d(".");b=a[0];g.U=a[1];L d=j[b];7(!d){d=j[b]={};7(!E.16.2l[b]||E.16.2l[b].4i.1O(f)===S){7(f.3F)f.3F(b,1x,S);N 7(f.6h)f.6h("4h"+b,1x)}}d[g.2A]=g;E.16.2g[b]=R});f=W},2A:1,2g:{},1Y:J(e,h,f){7(e.15==3||e.15==8)K;L i=E.Q(e,"2N"),2f,5E;7(i){7(h==10)P(L g 1r i)6.1Y(e,g);N{7(h.U){f=h.2k;h=h.U}E.V(h.2d(/\\s+/),J(b,a){L c=a.2d(".");a=c[0];7(i[a]){7(f)2T i[a][f.2A];N P(f 1r i[a])7(!c[1]||i[a][f].U==c[1])2T i[a][f];P(2f 1r i[a])1T;7(!2f){7(!E.16.2l[a]||E.16.2l[a].4g.1O(e)===S){7(e.6f)e.6f(a,E.Q(e,"1x"),S);N 7(e.6d)e.6d("4h"+a,E.Q(e,"1x"))}2f=W;2T i[a]}}})}P(2f 1r i)1T;7(!2f){L d=E.Q(e,"1x");7(d)d.O=W;E.3H(e,"2N");E.3H(e,"1x")}}},1U:J(f,b,c,d,g){b=E.2H(b||[]);7(!c){7(6.2g[f])E("*").1c([1e,T]).1U(f,b)}N{7(c.15==3||c.15==8)K 10;L a,2f,1i=E.1q(c[f]||W),16=!b[0]||!b[0].32;7(16)b.4U(6.51({U:f,2K:c}));b[0].U=f;7(E.1q(E.Q(c,"1x")))a=E.Q(c,"1x").1j(c,b);7(!1i&&c["4h"+f]&&c["4h"+f].1j(c,b)===S)a=S;7(16)b.4k();7(g&&E.1q(g)){2f=g.1j(c,a==W?b:b.6Q(a));7(2f!==10)a=2f}7(1i&&d!==S&&a!==S&&!(E.12(c,\'a\')&&f=="50")){6.52=R;1R{c[f]()}1W(e){}}6.52=S}K a},1x:J(c){L a;c=E.16.51(c||1e.16||{});L b=c.U.2d(".");c.U=b[0];L f=E.Q(6,"2N")&&E.Q(6,"2N")[c.U],3B=1N.2m.2V.1O(1a,1);3B.4U(c);P(L j 1r f){L d=f[j];3B[0].2k=d;3B[0].Q=d.Q;7(!b[1]||d.U==b[1]){L e=d.1j(6,3B);7(a!==S)a=e;7(e===S){c.32();c.41()}}}7(E.14.1d)c.2K=c.32=c.41=c.2k=c.Q=W;K a},51:J(c){L a=c;c=E.1s({},a);c.32=J(){7(a.32)a.32();a.7T=S};c.41=J(){7(a.41)a.41();a.7S=R};7(!c.2K)c.2K=c.7R||T;7(c.2K.15==3)c.2K=a.2K.1b;7(!c.4W&&c.4V)c.4W=c.4V==c.2K?c.7Q:c.4V;7(c.6b==W&&c.6a!=W){L b=T.1I,1k=T.1k;c.6b=c.6a+(b&&b.2i||1k&&1k.2i||0)-(b.68||0);c.7O=c.7N+(b&&b.2x||1k&&1k.2x||0)-(b.67||0)}7(!c.3r&&((c.4f||c.4f===0)?c.4f:c.66))c.3r=c.4f||c.66;7(!c.65&&c.64)c.65=c.64;7(!c.3r&&c.2G)c.3r=(c.2G&1?1:(c.2G&2?3:(c.2G&4?2:0)));K c},2l:{21:{4i:J(){5A();K},4g:J(){K}},47:{4i:J(){7(E.14.1d)K S;E(6).2z("4Q",E.16.2l.47.2k);K R},4g:J(){7(E.14.1d)K S;E(6).42("4Q",E.16.2l.47.2k);K R},2k:J(a){7(I(a,6))K R;1a[0].U="47";K E.16.1x.1j(6,1a)}},46:{4i:J(){7(E.14.1d)K S;E(6).2z("4P",E.16.2l.46.2k);K R},4g:J(){7(E.14.1d)K S;E(6).42("4P",E.16.2l.46.2k);K R},2k:J(a){7(I(a,6))K R;1a[0].U="46";K E.16.1x.1j(6,1a)}}}};E.1i.1s({2z:J(c,a,b){K c=="4O"?6.30(c,a,b):6.V(J(){E.16.1c(6,c,b||a,b&&a)})},30:J(d,b,c){K 6.V(J(){E.16.1c(6,d,J(a){E(6).42(a);K(c||b).1j(6,1a)},c&&b)})},42:J(a,b){K 6.V(J(){E.16.1Y(6,a,b)})},1U:J(c,a,b){K 6.V(J(){E.16.1U(c,a,6,R,b)})},63:J(c,a,b){7(6[0])K E.16.1U(c,a,6[0],S,b);K 10},2h:J(){L b=1a;K 6.50(J(a){6.4N=0==6.4N?1:0;a.32();K b[6.4N].1j(6,1a)||S})},7F:J(a,b){K 6.2z(\'47\',a).2z(\'46\',b)},21:J(a){5A();7(E.2Q)a.1O(T,E);N E.3w.1h(J(){K a.1O(6,E)});K 6}});E.1s({2Q:S,3w:[],21:J(){7(!E.2Q){E.2Q=R;7(E.3w){E.V(E.3w,J(){6.1j(T)});E.3w=W}E(T).63("21")}}});L x=S;J 5A(){7(x)K;x=R;7(T.3F&&!E.14.2B)T.3F("61",E.21,S);7(E.14.1d&&1e==3b)(J(){7(E.2Q)K;1R{T.1I.7D("2c")}1W(3e){3z(1a.3G,0);K}E.21()})();7(E.14.2B)T.3F("61",J(){7(E.2Q)K;P(L i=0;i=0){L i=g.2V(e,g.M);g=g.2V(0,e)}c=c||J(){};L f="4J";7(d)7(E.1q(d)){c=d;d=W}N{d=E.3v(d);f="5Z"}L h=6;E.3Q({1f:g,U:f,1G:"3q",Q:d,1z:J(a,b){7(b=="1X"||b=="5Y")h.3q(i?E("<1u/>").3t(a.4e.1p(/<1o(.|\\s)*?\\/1o>/g,"")).2r(i):a.4e);h.V(c,[a.4e,b,a])}});K 6},7q:J(){K E.3v(6.5X())},5X:J(){K 6.2a(J(){K E.12(6,"3i")?E.2H(6.7p):6}).1F(J(){K 6.37&&!6.2W&&(6.3o||/2y|6l/i.17(6.12)||/1t|23|3J/i.17(6.U))}).2a(J(i,c){L b=E(6).5P();K b==W?W:b.1n==1N?E.2a(b,J(a,i){K{37:c.37,1C:a}}):{37:c.37,1C:b}}).22()}});E.V("5W,5V,5U,69,5T,5S".2d(","),J(i,o){E.1i[o]=J(f){K 6.2z(o,f)}});L B=(1D 3O).3N();E.1s({22:J(d,b,a,c){7(E.1q(b)){a=b;b=W}K E.3Q({U:"4J",1f:d,Q:b,1X:a,1G:c})},7o:J(b,a){K E.22(b,W,a,"1o")},7n:J(c,b,a){K E.22(c,b,a,"2O")},7m:J(d,b,a,c){7(E.1q(b)){a=b;b={}}K E.3Q({U:"5Z",1f:d,Q:b,1X:a,1G:c})},7Z:J(a){E.1s(E.4H,a)},4H:{2g:R,U:"4J",2U:0,5R:"49/x-7j-3i-7i",6x:R,3l:R,Q:W,6t:W,3J:W,4n:{3L:"49/3L, 1t/3L",3q:"1t/3q",1o:"1t/4l, 49/4l",2O:"49/2O, 1t/4l",1t:"1t/7e",4o:"*/*"}},4q:{},3Q:J(s){L f,2Y=/=\\?(&|$)/g,1A,Q;s=E.1s(R,s,E.1s(R,{},E.4H,s));7(s.Q&&s.6x&&1v s.Q!="25")s.Q=E.3v(s.Q);7(s.1G=="4u"){7(s.U.2w()=="22"){7(!s.1f.1E(2Y))s.1f+=(s.1f.1E(/\\?/)?"&":"?")+(s.4u||"7d")+"=?"}N 7(!s.Q||!s.Q.1E(2Y))s.Q=(s.Q?s.Q+"&":"")+(s.4u||"7d")+"=?";s.1G="2O"}7(s.1G=="2O"&&(s.Q&&s.Q.1E(2Y)||s.1f.1E(2Y))){f="4u"+B++;7(s.Q)s.Q=(s.Q+"").1p(2Y,"="+f+"$1");s.1f=s.1f.1p(2Y,"="+f+"$1");s.1G="1o";1e[f]=J(a){Q=a;1X();1z();1e[f]=10;1R{2T 1e[f]}1W(e){}7(h)h.2X(g)}}7(s.1G=="1o"&&s.1Q==W)s.1Q=S;7(s.1Q===S&&s.U.2w()=="22"){L i=(1D 3O()).3N();L j=s.1f.1p(/(\\?|&)4s=.*?(&|$)/,"$a2="+i+"$2");s.1f=j+((j==s.1f)?(s.1f.1E(/\\?/)?"&":"?")+"4s="+i:"")}7(s.Q&&s.U.2w()=="22"){s.1f+=(s.1f.1E(/\\?/)?"&":"?")+s.Q;s.Q=W}7(s.2g&&!E.5M++)E.16.1U("5W");7((!s.1f.1g("9Z")||!s.1f.1g("//"))&&(s.1G=="1o"||s.1G=="2O")&&s.U.2w()=="22"){L h=T.3V("6k")[0];L g=T.2R("1o");g.3R=s.1f;7(s.7c)g.9X=s.7c;7(!f){L l=S;g.9V=g.9U=J(){7(!l&&(!6.3c||6.3c=="60"||6.3c=="1z")){l=R;1X();1z();h.2X(g)}}}h.3k(g);K 10}L m=S;L k=1e.7a?1D 7a("9S.9Q"):1D 79();k.9P(s.U,s.1f,s.3l,s.6t,s.3J);1R{7(s.Q)k.4G("9N-9M",s.5R);7(s.5I)k.4G("9L-5H-9J",E.4q[s.1f]||"9H, 9G 9E 9B 5G:5G:5G 9z");k.4G("X-9x-9u","79");k.4G("9t",s.1G&&s.4n[s.1G]?s.4n[s.1G]+", */*":s.4n.4o)}1W(e){}7(s.75)s.75(k);7(s.2g)E.16.1U("5S",[k,s]);L c=J(a){7(!m&&k&&(k.3c==4||a=="2U")){m=R;7(d){74(d);d=W}1A=a=="2U"&&"2U"||!E.73(k)&&"3e"||s.5I&&E.72(k,s.1f)&&"5Y"||"1X";7(1A=="1X"){1R{Q=E.71(k,s.1G)}1W(e){1A="5C"}}7(1A=="1X"){L b;1R{b=k.5B("70-5H")}1W(e){}7(s.5I&&b)E.4q[s.1f]=b;7(!f)1X()}N E.5t(s,k,1A);1z();7(s.3l)k=W}};7(s.3l){L d=54(c,13);7(s.2U>0)3z(J(){7(k){k.9m();7(!m)c("2U")}},s.2U)}1R{k.9l(s.Q)}1W(e){E.5t(s,k,W,e)}7(!s.3l)c();J 1X(){7(s.1X)s.1X(Q,1A);7(s.2g)E.16.1U("5T",[k,s])}J 1z(){7(s.1z)s.1z(k,1A);7(s.2g)E.16.1U("5U",[k,s]);7(s.2g&&!--E.5M)E.16.1U("5V")}K k},5t:J(s,a,b,e){7(s.3e)s.3e(a,b,e);7(s.2g)E.16.1U("69",[a,s,e])},5M:0,73:J(r){1R{K!r.1A&&9k.9j=="5b:"||(r.1A>=6Y&&r.1A<9h)||r.1A==6X||r.1A==9e||E.14.26&&r.1A==10}1W(e){}K S},72:J(a,c){1R{L b=a.5B("70-5H");K a.1A==6X||b==E.4q[c]||E.14.26&&a.1A==10}1W(e){}K S},71:J(r,b){L c=r.5B("9d-U");L d=b=="3L"||!b&&c&&c.1g("3L")>=0;L a=d?r.9c:r.4e;7(d&&a.1I.28=="5C")6Z"5C";7(b=="1o")E.5l(a);7(b=="2O")a=4A("("+a+")");K a},3v:J(a){L s=[];7(a.1n==1N||a.5j)E.V(a,J(){s.1h(3s(6.37)+"="+3s(6.1C))});N P(L j 1r a)7(a[j]&&a[j].1n==1N)E.V(a[j],J(){s.1h(3s(j)+"="+3s(6))});N s.1h(3s(j)+"="+3s(a[j]));K s.6g("&").1p(/%20/g,"+")}});E.1i.1s({1J:J(c,b){K c?6.27({1P:"1J",29:"1J",1y:"1J"},c,b):6.1F(":23").V(J(){6.Y.18=6.5x||"";7(E.1m(6,"18")=="2D"){L a=E("<"+6.28+" />").6B("1k");6.Y.18=a.1m("18");7(6.Y.18=="2D")6.Y.18="3u";a.1Y()}}).3h()},1H:J(b,a){K b?6.27({1P:"1H",29:"1H",1y:"1H"},b,a):6.1F(":4b").V(J(){6.5x=6.5x||E.1m(6,"18");6.Y.18="2D"}).3h()},6U:E.1i.2h,2h:J(a,b){K E.1q(a)&&E.1q(b)?6.6U(a,b):a?6.27({1P:"2h",29:"2h",1y:"2h"},a,b):6.V(J(){E(6)[E(6).3K(":23")?"1J":"1H"]()})},98:J(b,a){K 6.27({1P:"1J"},b,a)},97:J(b,a){K 6.27({1P:"1H"},b,a)},96:J(b,a){K 6.27({1P:"2h"},b,a)},95:J(b,a){K 6.27({1y:"1J"},b,a)},94:J(b,a){K 6.27({1y:"1H"},b,a)},9f:J(c,a,b){K 6.27({1y:a},c,b)},27:J(l,k,j,h){L i=E.6V(k,j,h);K 6[i.2S===S?"V":"2S"](J(){7(6.15!=1)K S;L g=E.1s({},i);L f=E(6).3K(":23"),4y=6;P(L p 1r l){7(l[p]=="1H"&&f||l[p]=="1J"&&!f)K E.1q(g.1z)&&g.1z.1j(6);7(p=="1P"||p=="29"){g.18=E.1m(6,"18");g.36=6.Y.36}}7(g.36!=W)6.Y.36="23";g.40=E.1s({},l);E.V(l,J(c,a){L e=1D E.2v(4y,g,c);7(/2h|1J|1H/.17(a))e[a=="2h"?f?"1J":"1H":a](l);N{L b=a.3D().1E(/^([+-]=)?([\\d+-.]+)(.*)$/),24=e.2o(R)||0;7(b){L d=2M(b[2]),2C=b[3]||"2P";7(2C!="2P"){4y.Y[c]=(d||1)+2C;24=((d||1)/e.2o(R))*24;4y.Y[c]=24+2C}7(b[1])d=((b[1]=="-="?-1:1)*d)+24;e.3Z(24,d,2C)}N e.3Z(24,a,"")}});K R})},2S:J(a,b){7(E.1q(a)||(a&&a.1n==1N)){b=a;a="2v"}7(!a||(1v a=="25"&&!b))K A(6[0],a);K 6.V(J(){7(b.1n==1N)A(6,a,b);N{A(6,a).1h(b);7(A(6,a).M==1)b.1j(6)}})},8Z:J(b,c){L a=E.3I;7(b)6.2S([]);6.V(J(){P(L i=a.M-1;i>=0;i--)7(a[i].O==6){7(c)a[i](R);a.6R(i,1)}});7(!c)6.5z();K 6}});L A=J(b,c,a){7(!b)K 10;c=c||"2v";L q=E.Q(b,c+"2S");7(!q||a)q=E.Q(b,c+"2S",a?E.2H(a):[]);K q};E.1i.5z=J(a){a=a||"2v";K 6.V(J(){L q=A(6,a);q.4k();7(q.M)q[0].1j(6)})};E.1s({6V:J(b,a,c){L d=b&&b.1n==8Y?b:{1z:c||!c&&a||E.1q(b)&&b,2t:b,3Y:c&&a||a&&a.1n!=8W&&a};d.2t=(d.2t&&d.2t.1n==53?d.2t:{9w:8U,8T:6Y}[d.2t])||8S;d.5o=d.1z;d.1z=J(){7(d.2S!==S)E(6).5z();7(E.1q(d.5o))d.5o.1j(6)};K d},3Y:{6O:J(p,n,b,a){K b+a*p},5F:J(p,n,b,a){K((-1Z.9C(p*1Z.9D)/2)+0.5)*a+b}},3I:[],3T:W,2v:J(b,c,a){6.11=c;6.O=b;6.1l=a;7(!c.3U)c.3U={}}});E.2v.2m={4C:J(){7(6.11.33)6.11.33.1j(6.O,[6.2I,6]);(E.2v.33[6.1l]||E.2v.33.4o)(6);7(6.1l=="1P"||6.1l=="29")6.O.Y.18="3u"},2o:J(a){7(6.O[6.1l]!=W&&6.O.Y[6.1l]==W)K 6.O[6.1l];L r=2M(E.1m(6.O,6.1l,a));K r&&r>-8N?r:2M(E.2q(6.O,6.1l))||0},3Z:J(c,b,d){6.5s=(1D 3O()).3N();6.24=c;6.3h=b;6.2C=d||6.2C||"2P";6.2I=6.24;6.4E=6.4F=0;6.4C();L e=6;J t(a){K e.33(a)}t.O=6.O;E.3I.1h(t);7(E.3T==W){E.3T=54(J(){L a=E.3I;P(L i=0;i6.11.2t+6.5s){6.2I=6.3h;6.4E=6.4F=1;6.4C();6.11.40[6.1l]=R;L b=R;P(L i 1r 6.11.40)7(6.11.40[i]!==R)b=S;7(b){7(6.11.18!=W){6.O.Y.36=6.11.36;6.O.Y.18=6.11.18;7(E.1m(6.O,"18")=="2D")6.O.Y.18="3u"}7(6.11.1H)6.O.Y.18="2D";7(6.11.1H||6.11.1J)P(L p 1r 6.11.40)E.1K(6.O.Y,p,6.11.3U[p])}7(b&&E.1q(6.11.1z))6.11.1z.1j(6.O);K S}N{L n=t-6.5s;6.4F=n/6.11.2t;6.4E=E.3Y[6.11.3Y||(E.3Y.5F?"5F":"6O")](6.4F,n,0,1,6.11.2t);6.2I=6.24+((6.3h-6.24)*6.4E);6.4C()}K R}};E.2v.33={2i:J(a){a.O.2i=a.2I},2x:J(a){a.O.2x=a.2I},1y:J(a){E.1K(a.O.Y,"1y",a.2I)},4o:J(a){a.O.Y[a.1l]=a.2I+a.2C}};E.1i.5f=J(){L b=0,3b=0,O=6[0],5q;7(O)8K(E.14){L d=O.1b,45=O,1M=O.1M,1L=O.2u,5p=26&&4t(5n)<8H,2Z=E.1m(O,"3C")=="2Z";7(O.7b){L c=O.7b();1c(c.2c+1Z.2b(1L.1I.2i,1L.1k.2i),c.3b+1Z.2b(1L.1I.2x,1L.1k.2x));1c(-1L.1I.68,-1L.1I.67)}N{1c(O.5k,O.5K);2e(1M){1c(1M.5k,1M.5K);7(3X&&!/^t(8F|d|h)$/i.17(1M.28)||26&&!5p)3a(1M);7(!2Z&&E.1m(1M,"3C")=="2Z")2Z=R;45=/^1k$/i.17(1M.28)?45:1M;1M=1M.1M}2e(d&&d.28&&!/^1k|3q$/i.17(d.28)){7(!/^a0|1V.*$/i.17(E.1m(d,"18")))1c(-d.2i,-d.2x);7(3X&&E.1m(d,"36")!="4b")3a(d);d=d.1b}7((5p&&(2Z||E.1m(45,"3C")=="4Z"))||(3X&&E.1m(45,"3C")!="4Z"))1c(-1L.1k.5k,-1L.1k.5K);7(2Z)1c(1Z.2b(1L.1I.2i,1L.1k.2i),1Z.2b(1L.1I.2x,1L.1k.2x))}5q={3b:3b,2c:b}}J 3a(a){1c(E.2q(a,"a1",R),E.2q(a,"8D",R))}J 1c(l,t){b+=4t(l)||0;3b+=4t(t)||0}K 5q}})();',62,624,'||||||this|if||||||||||||||||||||||||||||||||||||||function|return|var|length|else|elem|for|data|true|false|document|type|each|null||style||undefined|options|nodeName||browser|nodeType|event|test|display|jQuery|arguments|parentNode|add|msie|window|url|indexOf|push|fn|apply|body|prop|css|constructor|script|replace|isFunction|in|extend|text|div|typeof|className|handle|opacity|complete|status|firstChild|value|new|match|filter|dataType|hide|documentElement|show|attr|doc|offsetParent|Array|call|height|cache|try|tbody|break|trigger|table|catch|success|remove|Math||ready|get|hidden|start|string|safari|animate|tagName|width|map|max|left|split|while|ret|global|toggle|scrollLeft|done|handler|special|prototype||cur|selected|curCSS|find|id|duration|ownerDocument|fx|toLowerCase|scrollTop|select|bind|guid|opera|unit|none|pushStack|toUpperCase|button|makeArray|now|nextSibling|target|stack|parseFloat|events|json|px|isReady|createElement|queue|delete|timeout|slice|disabled|removeChild|jsre|fixed|one|nth|preventDefault|step|merge|inArray|overflow|name|innerHTML|exec|border|top|readyState|multiFilter|error|trim|rl|end|form|first|appendChild|async|elems|insertBefore|checked|childNodes|html|which|encodeURIComponent|append|block|param|readyList|grep|color|setTimeout|runtimeStyle|args|position|toString|has|addEventListener|callee|removeData|timers|password|is|xml|last|getTime|Date|domManip|ajax|src|props|timerId|orig|getElementsByTagName|isXMLDoc|mozilla|easing|custom|curAnim|stopPropagation|unbind|load|selectedIndex|offsetChild|mouseleave|mouseenter|input|application|defaultView|visible|float|String|responseText|charCode|teardown|on|setup|currentStyle|shift|javascript|child|accepts|_default|nodeIndex|lastModified|RegExp|_|parseInt|jsonp|previousSibling|dir|tr|self|getAttribute|eval|empty|update|object|pos|state|setRequestHeader|ajaxSettings|not|GET|getPropertyValue|getComputedStyle|styleSheets|lastToggle|unload|mouseout|mouseover|andSelf|getWH|container2|unshift|fromElement|relatedTarget|visibility|init|absolute|click|fix|triggered|Number|setInterval|removeAttribute|prevObject|unique|classFilter|submit|after|file|clean|expr|windowData|offset|scroll|client|deep|jquery|offsetLeft|globalEval|sibling|version|old|safari2|results|wrapAll|startTime|handleError|container|createTextNode|radio|oldblock|checkbox|dequeue|bindReady|getResponseHeader|parsererror|lastChild|index|swing|00|Modified|ifModified|clone|offsetTop|values|active|getElementById|link|val|col|contentType|ajaxSend|ajaxSuccess|ajaxComplete|ajaxStop|ajaxStart|serializeArray|notmodified|POST|loaded|DOMContentLoaded|Width|triggerHandler|ctrlKey|metaKey|keyCode|clientTop|clientLeft|ajaxError|clientX|pageX|cloneNode|detachEvent|swap|removeEventListener|join|attachEvent|substr|parse|head|textarea|reset|image|before|odd|zoom|even|prepend|username|quickClass|quickID|quickChild|processData|uuid|continue|textContent|appendTo|contents|evalScript|parent|defaultValue|setArray|CSS1Compat|compatMode|cssFloat|styleFloat|webkit|nodeValue|eq|linear|replaceWith|concat|splice|100|href|_toggle|speed|alpha|304|200|throw|Last|httpData|httpNotModified|httpSuccess|clearInterval|beforeSend|colgroup|fieldset|multiple|XMLHttpRequest|ActiveXObject|getBoundingClientRect|scriptCharset|callback|plain|img|hasClass|br|urlencoded|www|abbr|pixelLeft|post|getJSON|getScript|elements|serialize|keypress|keydown|change|mouseup|mousedown|dblclick|resize|focus|blur|stylesheet|rel|mousemove|doScroll|round|hover|keyup|padding|offsetHeight|offsetWidth|Bottom|Top|Right|clientY|pageY|Left|toElement|srcElement|cancelBubble|returnValue|0n|substring|animated|header|enabled|ajaxSetup|innerText|noConflict|size|contains|only|line|gt|weight|lt|font|uFFFF|u0128|417|inner|Height|Boolean|toggleClass|removeClass|addClass|removeAttr|replaceAll|insertAfter|wrap|prependTo|contentWindow|contentDocument|iframe|children|siblings|wrapInner|prevAll|nextAll|prev|next|parents|maxLength|maxlength|readOnly|readonly|borderTopWidth|class|able|htmlFor|522|reverse|boxModel|with|1px|compatible|10000|ie|ra|it|rv|400|fast|600|userAgent|Function|navigator|Object|stop|option|array|ig|NaN|fadeOut|fadeIn|slideToggle|slideUp|slideDown|setAttribute|changed|be|responseXML|content|1223|fadeTo|can|300|property|protocol|location|send|abort|getAttributeNode|specified|method|action|cssText|attributes|Accept|With|th|slow|Requested|td|GMT|cap|1970|cos|PI|Jan|colg|01|Thu|tfoot|Since|thead|If|Type|Content|leg|open|XMLHTTP|opt|Microsoft|embed|onreadystatechange|onload|area|charset|hr|http|inline|borderLeftWidth|1_|meta'.split('|'),0,{}))fontmatrix-0.6.0+svn20110930/help/js/jquery.jtabs.pack.js0000644000175000017500000000375011041355024021570 0ustar malexmalex /** * Ridiculously small sized tab implementation with all the * features you'll need. * * Features * - API is similar to $.ui.tabs. * - inline and ajaxed content * - tab enable / disable * - next- prev tab functionality for wizards * - initial tab loading * - + more * * @TODO: * - NOT supported: (+ corresponding workarounds) * * Few examples: * $("ul.tabs").jtabs(); * $("ul.tabs").jtabs("click", 1); * $("ul.tabs").jtabs("next"); * $("ul.tabs").jtabs(function(tabIndex) { }); * * * If you want this plugin to be released at http://plugins.jquery.com * please drop a note to: tero.piirainen@piimaa.fi. * * * @since 01.02.2008 * @version 25.02.2008 */ eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(4($){$.I.q({8:4(c,d){l 2.o(4(){5(H c=="E"){3 a=$.B(2,"z");3 b=[d];a[c].y(a,b)}p{L $.8(2,c)}})}});$.8=4(c,d){$.B(c,"z",2);3 e=2;2.9={i:2.i};2.9=$.q(2.9,d);2.7=c;3 f=0;3 g=0;$("u",c).o(4(a){3 b=$(2);b.t("a").6(4(){e.6(a,c)});5(b.A(".k"))f=a;5(b.t("a").j("r")==R.P)g=a});5(g>0)e.6(g);p 5(f>0)e.6(f);p e.6(0)};$.q($.8.O,{i:4(a){l N},6:4(a){3 b=$("a:x("+a+")",2.7);5(!2.9.i.y(b.h(),[a]))l;5(b.w()==0||b.h().A(".m"))l;2.n=a;$("a",2.7).o(4(){$($(2).j("r")).K()});3 c=b.j("r").J(1);3 d=$("#"+c);3 e=b.j("v");5(e){d.G(e);b.F("v")}d.M();$("u.k",2.7).s("k");b.h().D("k").s("m")},C:4(a){3 b=2.n+1;3 c=$("a:x("+b+")",2.7);5(c.w()>0){5(a)c.h().s("m");2.6(b)}},Q:4(){2.6(2.n-1)}})})(S);',55,55,'||this|var|function|if|click|root|jtabs|opts||||||||parent|before|attr|current|return|disabled|index|each|else|extend|href|removeClass|find|li|url|size|eq|apply|el|is|data|next|addClass|string|removeAttr|load|typeof|fn|substring|hide|new|fadeIn|true|prototype|hash|prev|location|jQuery'.split('|'),0,{})) fontmatrix-0.6.0+svn20110930/help/README0000644000175000017500000000155311217644740016152 0ustar malexmalexFontmatrix documentation The very first thing you need to know is that documentation is a work in progress. We will let you know when it's more or less settled, so that you don't waste your precious time on trying to paint a speeding train :-) Anyway, this is how it works. Every translation has its own directory named after two-letter language code, e.g. 'fr' fro French, 'de' for German, 'ru' for Russian etc. Every directory has a menu.xml file that contains description of contents structure which is loaded to the sidebar in help browser to help navigating contents of the documentation. Currently for each language that used to have a translator (before 0.5 was out) menu.xml points to English files, that is: file="../en/some.html" When we are mostly ready, all you will need to do is copy ../en/*.html to your language directory and start translating. fontmatrix-0.6.0+svn20110930/help/CMakeLists.txt0000644000175000017500000000027111220441342020011 0ustar malexmalex## Help ## # Now it’s just a matter of maintaining a list of all # needed files, when releasing - pm SET(FM_HELP_DIR ${CMAKE_SOURCE_DIR}/help/) ADD_SUBDIRECTORY(${FM_HELP_DIR}en) fontmatrix-0.6.0+svn20110930/help/TODO0000644000175000017500000000027311217644740015760 0ustar malexmalexSTILL TO DO - translate new content WORK IN PROGRESS - write missing content - add new screenshots DONE - split help_en.html into separate files - revisit and improve docs structure fontmatrix-0.6.0+svn20110930/help/en/0000755000175000017500000000000011641435631015666 5ustar malexmalexfontmatrix-0.6.0+svn20110930/help/en/news.html0000644000175000017500000000130511431102451017513 0ustar malexmalex Fontmatrix User Manual — What's New

What's New

The version you are looking at contains a number of improvements over the previous one, such as:

  • complete overhaul of user interface;
  • new approach to searching and filtering PANOSE features;
  • bugfixes.
fontmatrix-0.6.0+svn20110930/help/en/additional_export_for_packaging.html0000644000175000017500000000076211217644147025147 0ustar malexmalex Fontmatrix User Manual - Additional tools - Exporting font info for packaging

Exporting font info for packaging

TODO

fontmatrix-0.6.0+svn20110930/help/en/comparisons_glyphs.html0000644000175000017500000000511611223375754022507 0ustar malexmalex Fontmatrix User Manual - Comparisons - Comparison of glyphs

Comparison of glyphs

Comparison of same glyph in different fonts can be useful for both work and study.

To add a font to the list for comparison in the Browse Fonts sidebar click on the font's face, then go to Compare tab and click Add button.

Here is a typical view of Fontmatrix in glyphs comparison mode:

Now let's have a closer look at options available to you.

Show checkbox toggles visibility of a glyph rendering with a font that is currently selected in the list above.

Fill allows choosing one of predefined fills for a glyph or disabling colored fill by selecting "None".

Points will render points from which shape of a glyph is constructed, and Controls will render control points for these points:

"Metrics" will render baseline and display em size:

"Offset" moves a glyph horizontally to the right so that you can line up several glyphs without stacking them on top of each other:

But sometimes stacking is exactly what you want, especially when you are learning about differences between weights within one font family. In that case you can use offset to group weights of roman and italic faces:

Despite of using same huge area as in playground, amount of shifting is limited, so five glyphs are usually a limit for letters.

Finally, the Keep in sync checkbox makes sure you use same character for comparison between fonts, and slider and checkbox are a way you choose a character for rendering. If you want to compare two similar glyphs of the same font, add that font twice and uncheck Keep in sync to select second similar glyph:

fontmatrix-0.6.0+svn20110930/help/en/additional_db_check.html0000644000175000017500000000072211217644147022472 0ustar malexmalex Fontmatrix User Manual - Additional tools - Checking database

Checking database

TODO

fontmatrix-0.6.0+svn20110930/help/en/readme.html0000644000175000017500000000126311217644147020016 0ustar malexmalex Fontmatrix User Manual

News

The version you are looking at contains a mumber of improvements over the previous one, such as:

  • a new way to search by Panose features;
  • a glyph comparison mode;
  • a much improved user interface;
  • a bew help system;
  • etc.
fontmatrix-0.6.0+svn20110930/help/en/setting_up_preferences_service.html0000644000175000017500000000207611217644147025046 0ustar malexmalex Fontmatrix User Manual - Preferences - Service

Service

This tab groups options that are related to external tools and resources.

The Fonts Editor allows you to define preferred fonts editor and defaults to FontForge that is used on Linux and Mac systems (please bear in mind that principal Fontmatrix developers are GNU/Linux users).

The Help Browser option let's you defining what browser to use for reading this help system. It defaults to Fontmatrix's own help browser that uses Webkit for rendering help pages.

The Hyphenation Dictionary option allows you to define a dictionary for use with sample text. Left and Right options define FIXME.

fontmatrix-0.6.0+svn20110930/help/en/menu.xml0000644000175000017500000000746011223413474017360 0ustar malexmalex fontmatrix-0.6.0+svn20110930/help/en/management_activation.html0000644000175000017500000000233511223404744023111 0ustar malexmalex Fontmatrix User Manual - Font management - Activating and deactivating fonts

Activating and deactivating fonts

There are three ways to activate and deactivate fonts in Fontmatrix:

Selective way. In Browse Fonts sidebar go to Names tab and enable or disable particular font faces or even whole families.

Mass activation/deactivation via menu. Filter out fonts, e.g. by selecting a tag in Browse Fonts and use Edit > Activate all current or Edit > Deactivate all current to enable or disable all currently filtered fonts in the Browse Fonts sidebar.

Mass activation/deactivation via system tray. Use right mouse button click to open menu where you can click on names of tags to activate or deactivate fonts that have this tags assigned to them.

fontmatrix-0.6.0+svn20110930/help/en/setting_up_preferences_system_tray.html0000644000175000017500000000455311217644147025773 0ustar malexmalex Fontmatrix User Manual - Preferences - System tray

System tray

When you change your fonts collection or switch available font sets rather frequently, it probably doesn't make much sense having Fontmatrix window around all the time. So you can close the main window to system tray and do some actions from there.

Show Fontmatrix in System Tray option enables or disables the whole system tray related functionality.

If you enable the Close to system tray checkbox, every time you click the closing button of main window, Fontmatrix will hide in system tray. The first time you do it, a warning message will be displayed.

You have two ways of restoring the main window: either single clicking with left mouse button on the Fontmatrix's icon in the system tray, or right clicking there with subsequent choosing of "Restore" menu item. The "Minimize" menu item will close the main window to the system tray.

Start minimized to system tray option is useful when you want Fontmatrix around all the time to manage your collection, but don't need it on start up immediately.

Show "All" actions option adds two items to the system tray menu. Those are "Activate all" and "Deactivate all". As self-explanatory as they are, they make all the fonts known to Fontmatrix either available or not available in the system.

Ask confirmation when activating or deactivating all fonts option, related to the previous option, should rather be disabled unless you really know what you are doing.

Ask confirmation when activating or deactivating fonts by tags option will make Fontmatrix ask your for confirmation when you make a set of fonts that are grouped by tags either visible or invisible in the system. When you rightclick the application's icon in the system tray, all available tags are listed in "Tags" submenu. See the chapter on tags for details.

fontmatrix-0.6.0+svn20110930/help/en/comparisons.html0000644000175000017500000000113011217644147021107 0ustar malexmalex Fontmatrix User Manual - Comparisons

Comparisons

Fontmatrix currently provides two ways to compare fonts: by comparing lines of text in Playground tab and by comparing standalone glyphs in Glyphs tab.

fontmatrix-0.6.0+svn20110930/help/en/setting_up_preferences_samples_collection.html0000644000175000017500000000254211217644147027263 0ustar malexmalex Fontmatrix User Manual - Preferences - Samples collection

Samples collection

Fontmatrix ships with a set of sample texts for a number of languages, so that you have something to start with. But if you want to use your own sample texts, you can add them here.

Start with giving the sample text a name by typing it into a filed just below the list of custom sample text and clicking the "+" button. Thenew sample text's caption will appear in the list above. Now go to the text entry field and paste your text, then click the "Save" button. The text will be added to the list of available sample texts in "Display options" tab inside "Sample Text" area.

If you need to remove a custom sample text, choose it in the listbox and click "-" button. This operation cannot be undone.

Just in case you are curious, all sample texts are stored as plain text file in the home directory (which is ~/.Fontmatrix/Samples/ on Linux).

fontmatrix-0.6.0+svn20110930/help/en/setting_up_preferences_files_and_folders.html0000644000175000017500000000106511217644147027045 0ustar malexmalex Fontmatrix User Manual - Preferences - Files & folders

Files & folders

Templates Folder FIXME

Remote directories FIXME

Local storage FIXME

fontmatrix-0.6.0+svn20110930/help/en/setting_up_preferences_display.html0000644000175000017500000000302511217644147025046 0ustar malexmalex Fontmatrix User Manual - Preferences - Display

Display

Preview word group of options controls the way the font previews area looks like.

The Word: option constructs the prase displayed the preview displays. By default only font's name is displayed. If you want Fontmatrix to display font family name, add a space and <family> sequence. If you want Fontmatrix to display font face name (like Regular or Italic), add a space and <variant> sequence.

Default font size option defines font size measured in points to use for the preview prase.

The two other options, subtitled and is RTL, define whether to display font's name and face below each preview and whether the preview phrase should be rendered from right to left (e.g. for a phrase in Arabic).

Chart Subtitle Font group of options controls the look of preview subtitle. You can choose font and font size (in points) there.

Initial Layout group of options controls FIXME

Information Style options allows you to use your own CSS style for the area inside "Font Information" tab.

fontmatrix-0.6.0+svn20110930/help/en/resources.html0000644000175000017500000000303611223375754020575 0ustar malexmalex Fontmatrix User Manual - Useful online resources

Useful online resources

Contacting to developers and fellow users

If you want to ask questions regarding use of Fontmatrix or, you can either join the mailing list or our IRC channel at Freenode network (we’ve embedded a webchat client under Fast IRC that you can use if you’re really unused to this IRC thing).

You can also join a forum at Libre Graphics World website and ask your questions there.

Looking for free/libre fonts?

You can find free and open source fonts here:

fontmatrix-0.6.0+svn20110930/help/en/printing_fonts.html0000644000175000017500000000135311223411751021612 0ustar malexmalex Fontmatrix User Manual - Printing fonts

Printing fonts

Fontmatrix is currently lacking documentation on that functionality, but it's pretty much straightforward, so try printing to files first and you'll see what it looks like. Just note that Fontmatrix will scale text lines to fit the whole used area to a chosen paper size. That's the only tricky thing maybe.

fontmatrix-0.6.0+svn20110930/help/en/search_in_panose.html0000644000175000017500000000374311223411536022055 0ustar malexmalex Fontmatrix User Manual - Search - PANOSE metadata search

PANOSE metadata search

The current implementation of searching by PANOSE metadata is rather experimental. We just wanted to have something to play with, whether it looks good or not, so we will continue working on that (and definitely write better documentation on using PANOSE in Fontmatrix). In the mean time here is how you use what you have so far.

In the Classification tab you can see a chart that displays a kind of PANOSE map for the currently available fonts. That map consists of several aces, each of them representing a particular PANOSE variable. If you choose a font in the sidebar, you will see a thin black line going from one axis to another.

To find fonts matching some PANOSE variable values first hover your mouse pointer on the axis/variable. Then click on a value and look at the sidebar to see that only fonts that match this value are filtered. You can press Shift and click on another value of same axis/variable to extend the search. If amount of filtered fonts is too large, you can further narrow down the search by hovering your mouse pointer on some other axis and picking a value of interest. Note that Fonmagrix will construct a query for you in the upper part of the Browse Fonts sidebar.

Sometimes PANOSE information provided by font vendors is incorrect which results in providing incorrect results for your queries. You can solve this by editing PANOSE metadata for a particular font without saving changes to an actual font file. Learn how to do it.

fontmatrix-0.6.0+svn20110930/help/en/viewing_sample_text.html0000644000175000017500000000626011223405771022633 0ustar malexmalex Fontmatrix User Manual - Viewing fonts - Sample text

Sample text

Viewing a sample text can be useful for both typesetters, graphic/web designers and type designers. This function is available in the Sample text tab of the main window.

Sample text collection

Fontmatrix ships with a set of sample text in various languages and scripts and allows you to add you own sample texts (see Samples collection chapter for details).

To pick a text from collection click the vertical Samples collection button to reveal a sidebar where available sample texts are listed.

Navigation and rendering

Sample text is rendered on a very large canvas, but line breaks are applied automatically so that in the end you see text in paragraphs anyway. You can use Ctrl+mouse wheel for zooming in and out and middle mouse button for panning. If you want to zoom to a particular region, click and drag to draw a rectangle around the area of interest. A single click anywhere on canvas will change the view to 1:1 zoom level.

While zooming in with default options you will immediately notice that text gets pixelized. This is because by default Fontmatrix uses Freetype library to render text, so that you can see what the text will really look like when rendered on display. If you aim to use a chosen font for a print job, click the vertical Display settings button to reveal a sidebar with rendering options and switch from Rasterized to Vector.

You can also change font size, but note that rendering of sample text in that case will update only when you single click on canvas. While this is somewhat inconvinient for simple and straightforward scripts like Latin or Cyrillic, when it comes to Asian scripts, rendering of every font size change may take quite a while due to complex glyphs composition.

The next group of options called World is wide controls inline and block progression. So if you need to render a text in Hebrew (right to left inline/block progression) or Mongolian (right to left inline, top to bottom block progression), this is where you define script specific options.

Fontmatrix can optionally use its own shaper for rendering text. Enable Shaper checkbox to try that.

OpenType features

Fontmatrix has a quite advanced OpenType support and allows to test implementation of OTF features available in a currently loaded font. To do this click the vertical OpenType features button to reveal a sidebar where available OTF features are grouped into respective OpenType tables and subtables.

When you enable or disable a feature by clicking on respective checkbox, Fontmatrix automatically rerenders the whole canvas.

fontmatrix-0.6.0+svn20110930/help/en/setting_up_layout_engine_options.html0000644000175000017500000000360111223413146025423 0ustar malexmalex Fontmatrix User Manual - Setting up - Text layout engine options

Text layout engine options

Fontmatrix uses its own text layout engine (TLE) to support advanced OpenType features. When the TLE looks for best break, it builds a list of possibilities and attaches the difference between the break node and the line width to each node. At the end it selects the list that has the little distance.

Since the TLE has a number of variables you could tune, they can be customized to your liking. Use Service > Text layout engine options command to open the dialog.

The dialog is very much like an audio equalizer: you change weights of each variable, dragging slider up and down.

  • Before — factor applied to a break node that comes before the first OUT_OF_LINE node
  • Exact — factor applied to the first OUT_OF_LINE node
  • After — factor applied to nodes that come after the first OUT_OF_LINE node
  • End — factor same for the last line of the paragraph
  • H-penalty — super factor applied to the node score, if it is an hyphen node
  • Max. compression — maximum compression of white spaces

If you have managed to read till this sentence, you are Pierre Marchand — lead Fontmatrix developer. It also means that the text was never improved to become human readable. So go and fix this, will you? :) In the unlikely case of you not being Pierre please report to the bug tracker.

fontmatrix-0.6.0+svn20110930/help/en/font_book_templates.html0000644000175000017500000000116711220414321022601 0ustar malexmalex Fontmatrix User Manual - Font books - Creating font book templates

Creating font book templates

Documentation on creating font book templates isn't ready at this time. Please come back later or ask your questions on IRC.

fontmatrix-0.6.0+svn20110930/help/en/images/0000755000175000017500000000000011641435631017133 5ustar malexmalexfontmatrix-0.6.0+svn20110930/help/en/images/importing_set_tags_2.png0000644000175000017500000005211211216441647023766 0ustar malexmalexPNG  IHDR_i:sBIT|dtEXtSoftwaregnome-screenshot> IDATxw|nz ԄP)ґ+خW^/vް\{vT,(((ҥ(IH۝l$[g~nٙ9edv!ǟ~*n8s UBD&M|㢲RP yBDn=KU)傒lE`3Y|Y'"PSwr44JWZTڦiZi4Dziе{V._Ʒ?e(EEX>[w_-}R9-"tmwoY^;WMlTa8jպ5+Wr9R4 {P=3?Pͽr'63I~BPPJ/S$,˗-Qkww4nҔ>%roC07 HIOg矓7a;~iؑ۷!r2yVi&1‰MԣSqLW w;~,O+~Xhr雼c˒ wyYyZǸO3+}$!)dKx`qjwN/wsrPVb!1) v^N4%fpέ#[ZCo`QݯaY3[# -M Dl頢Te/ %KPZ2]u W?|4( L%u!&BhVan 0/֬YY>1H_SFCJLp[o5>NVO牫br"C{dz_3& B…sooН+̂4?e7nXf,ï~L6h‘3؛ҊnO4ӳ{/.zx-MS{R-g/ڂ?zu,wt;9Cﺍ eé#);N{L}ݽJ%_Oߑ8 5hG|kiF\Rʗ|ɗ?_6=ŋ#1!M3Ȓſ]]/9CLEn#]ˤdF|)[(C0k:w&o?lמ$/tcƯk}R/Y%/7Hlͅ46;9Tp5s>d ߼·l/rxBmA-SɛDBr2Ɏ_̙wc;ovaj7^`g?kk6)݇d/zoQGbr2> <ЏoI~ԈйsKb+̻o£/%p4oǑ?㥟"tU7OߗlHJJbҍhӶ5'Ҧm&MIJwC,%>|F15۶uyL|1d-ۖ c(&ՠQ ;cI;Xh"l ^/J|}3K !BFY-KSv[J)j,Vk/<[7pFΌ{>o5;)MS+9cN:Sn$SL'&XV|=ӠT>hq:d&Re* ĎLzzQHzw@og ݆ZW~73>S \ќDt y|/֣~ZÒ^dž7'2 F_q=f.DjZ%/p|Ym6J R7C XŪ+"R|"V,_?aUrtK/ rbf9ܝ;+:~/%B9ɸ8OU{`#KS/.]ǍӏXXϱ|4h74@1y'rѫe0 [wx.7ɰ4'\?3GgtjsFY`[+u1b]Lm'1m 'bMЭ[咗a@p%/R@^N?s#%='|NlZLNr:+/k]T5yぼ,~m2\O)xguTvO~s)-.sX>qR*ML^^eޒm> z+'X+w}Hr!v7UlD\Bu*}Ty/fV{/o.wrLޛ߁ ڧ~=ß`Ip!DPYN5MQr%F*\ri_;ݻ]l[)."mRVV^l&brSGm eQPGyz Jaڨ8\m9 P":ⱘJQ2Y310o佔|b+V]a{!o of ͆^Ʉl1BͦWzn/ʭ lW]ՅVvاiV6OO7*Pw@35%))[y(ҸZ*IY9II,τ%>E54 wߝnYiPq^KΔ۶,_)hqRWKrW&Od[_d-z\s5܅W>(sɔvLf&s$}YBjs*J2ә=S؏9T^닲Y֎/y9s8Z- Rр:E4>O|LNL{{*ٵ4;X]<b"3!D9z,(0óN*>埉R 4̈́t6p@u,$\KX:pwAqr(dz!aAy!{q>滃!"Ay!"_$D+"Ds6?2cIHΛ_ڤاv7cJX{&""Dn{MeL9BH$-=-ߔ /f,D}aAy!BzmRh!x L i"_Sy(0,|biBPbciWO;NnǵM#%[# x5|8oƎpٽ 8~͋\˵-`=33&朑#9)dI˹ad>xa 1!.W72 v wIo(kF?8/.ّF>w ?Tnf g-BJ)eF!A yr}.=s {G0V}F3e;YsEb@ͤd.z ?EO:&Џ`ڋ%>[OqՃodk֫I&ݭU)L鯲y}d%WoN޼>vCy?v^PMf}?alGzg|-RVssf?,ewGBD 'v|铜o;3=Zyy+|#X]ҕZ)?ŋn#acrvNsGdߓ$4q  hNܤ'sn&$h&R3S˺|IMg|%_=JG^[=Ӡp|Ƕi4BMWu'yDTP ,Fظn*֭ZH]p0jvf {=䣸:]3N\q4lGgt[0sML&S浧A)ߜkgFqXH+4DY[ؔlrUIMMD)?hU=_ꮻ;z4L_&oS0+..=7n9BSl_ݨZjk.r?ym/%*ϦTk3k&_Hꖅ/4 Z>9֒3q>6v]4.ⵤF orXo8p =gMD' ;+oun _|ADқ6a^85abZSQ>!a1k$5=<ɴۓW~CRM`z 0[js:PLQ^uצ3;c"ybo9}s"XL\z_nx`0i?&BegUs?|B\q-Wp2DNꤷjE۫8'G 8{뻟/θQ^us}+9qMִۘBu~?5jeX1kS 7q -_Κˉ{iխKzVÆQ3;$s}1|~E#S2 &j.uv8য়HXHoԈ]i8d~K@ B9rӤWVswh!"2 $f[lޱ;v9JJ"=#>}?`q:*Dk4 w70pb$ $~=_&F [&}@u"s "r"+񶜮cҥXxiioOéѺW}Bx[Pپo￧Z|<޽;!G)>!b_3+ɢ"6lʆ[:))4̤Q~4KRZp򑃽>6ۓÌ7 b< e[HS<'̙4UFmh`v" jQiO>73"bڰpgeJv/^ d6ӰAuHé!Jk7jJǑ'W ob%HmgcuE~bѠ`WOW'O|J>1WǍ㋫fsxj7XgSӯiڡ3Ū۰)O.OA]ı1;Xw͓ )bws#1b8Λswj`ΟJy˹n.=|&幀Ol4rrbb]gC\-"bqÆ4҅&ÆڸXbPZu5+(.MӰ سq=l R?~ښdNO#3nհPUE6 N5/U~*e]/;W7tG޻_ӆk=흲Zٸkw>vR5q^4:lj3t]iH: 9.=h6鍙n/Ul %o5=\׾%'$8>1ijZ} S3nHOAT 1%& N< rź8"-Sɓ EWK(xu}y5)td*y*s-Hn?zo6\"-+ t{9_/LNiҪM>g%=q JZL\z۹5 mDSr$M<⧽ɫݪΕW}^jΞJH[WŹ={sG: Lw^s%DJ{Jq~_ƌO? NDXx_4NivGjoȾܗ!DwOTEZY#M寯3}uΞJY)cؙ ӗeϪwBJ,Yuu~X86jDӮ]i2t() *=\D0{سu3sz!AF nb<8 S71GXx{T Zq:\>OGֈ lW~*e-,L#r>j-@zz榏2-tBk}e.:9ybc$Mv'؁ě4nr232h޷/ #^@<^6BQlW;Znߚ=y{k%O|F81X1o>ݍԞK_FӁNq`:V[e,֬I6mh:p iݺa285G՚=+m[90$S)civry+0Ybѣ77fѬcGF͖-(MR>$`ėr6e޽of|}dy~!D)e:mڸAQdP^.o/[rJ-Wo?@x25"[72%%-MBL\._ʝ(.fض hLFFѴ_?eiY!bYac%+q_.݃UN4t5Rcڵ,^ /ФV-2ڴŠA48LY_XSrc%'h $=O,0bz[,%KH2lЀi1b23ݴ,$4YI$^Ɵ99~K24Yg| ey~!iÎu4M[f&]ǎ~6X IDATOJZXΕ+ٱlߎ#ߋ$+1֞i-*b-,۲mlSS̤4G" =m8;j=?cKpH3ƌ)7Si~$|gg%$) '75kXf 瞣yڴh׎Ӡsg7!b$A[4ඟҺ#k;awNJ'x~wrb**+WڞbӢEh) -6$S'Z NͦMKק2E-?itVz+J)޽^ Y/oyUM{V+vbծ]WKLefՋI^MB{JIhyܸ`Zznjis.޲ɭZ񧓓d%򪜷9wF{uVN˖-i1`Mzr["406IX#k^]`ܢu6Jfy*iW3mMpR'a f=T BFP>n$frC7mĎ^PAZ\k$<W'w_ڳ&mOOxzxe '1W998cxvVh&wOCYIsM;8;^H7m6z'&FtVH"6+/H7 %Yۮ/z@gpiɌzvI 5nL1ch=f =|;c< K)vOo/o<BW@C Ơ?dTΓ&W_iAtO4FʬY,uˣה)gJOgcLa!l<ôqAwOcHB+ŏsM'30]dj2r$_ZEM2tli<~=,ٸ/'N]iԚoT޷nb.` ](0tޘ7֗_s"]jǎ;p^ٚƫ\]g^gŽ[f㚾}AwO^.BK ; gΎEZݺ|z0̦ru쟔ė ᪫G4Mc…,۷!k7JV"D +6@ٳirZDj={*]ru4>7O"owO48|?L/f ,D`2I O/KS44`޶m(wh|3:M0kkЯm6Z2!DiCcFO?MR25kg6$GO?֘^ⷿ K!д`\x|>%V$ig+V4MdualVcrC6ȟScڴt$U? ,^̹͚FówB4&͟[/\`,)l9x#y^Ďg۷TVJko%Aw#"4l o{MW\P'[!,X.s|d!"A@'ѣrGxYY,:|F$+"=mؑ,:qvE3ժ|&YQȯiÎ|3O@4+bi̱Z99Fg} !BǯAy_gܙk-E4M5um4{ϰ"tuqZfҊUi f~e0:pNI5 b.\h21y:V*l5MC4tЕ"CӸsptשk0lf'Pk_ߤ>Q&FryK`84?~lGq-ӦSz1$jQ5CZ&$ָq[?~lpybVbC[Kh+V+x3f3׭g-Z\d%B_@VGH)GMK4޶Zi'!:+]^.X' !P !BJ￟_ݣw jM4>ˣVkay*_=x~NrB^ (qs׃=9}:?} -1c\+<{8Ɉ$U*lx!CY GJ33+m78sB6 3{J*P;rJ'oEIfgʔ1T_=R)?u?@|\P8V%Rdd_!hxJ'ۛǎ̤y 7w_<ѣ Iի; & *PnKI)aJFgeq1}:WY_)fJ38b!#ʚW_u=M' ֭ MG@4f[/}{EM8ԡC.oI "|b:( ;4)* rO4|e%C)a߿^=!Dt@yW/W*}鯿"j`:kW?_gwislZT"f*,k "1žml!7:oUmAўT$S (\{ח54tKx~}njw6tq+\Y!'fʛg;'{/xE~{}v#Y=}s#~BbC@"Dxd@0{6N8MmƎ暉Yai_4{イFr(̞:DH壻*SVb2XUu9O+V18% SVֱa\㝫70"b2ھ{oק4Ak҅׻8.L1T,7}f"b.('v8th0R r"-d ^,e%-QERKٻBIV"D\@f([ /2mҤd)krvj^i"Suboׁ"{!Dh\@iޥ ]+ۗ\>;ؑCx&}0 TV⩜7_<1PjwFYIE|aK|b{f5?㌲:- $BGɆ ޏO9W|+{p #H$>1P_N{-MͥKyS'Co3Q _ﶽZim=,!jJE [BD (C'M*GjZWw{xծ*(ߵk1cLJzL}) 'Pg%F !/&J\f&TX):7n]|V:Y<;p ]1m9i<ѰB@AwXK;,;Wd"8ҁOo4)E1x:j˗G` 8去@by/&3lFUV}N8&}Qt3VNE۷GŠ}8"b6Lw@_j/gNӸ棏^+<+9I "b:X5㺁]f%F׷cT`Ύyn۪U@e%2"Dt@4i_ֵ2sܸR}t@"DJzJ\qUi>|aUAK9OY"|D@46m"`.AӦ)96'YQ( -ZK/U]uh7#'rD!"W (]y8B3^?#xFWE[e]N (ٗ^˖Q@=֑x{L1$|s2X+fwV.,<~sk`G`44wts?I)܍xl"!"[Pjf|^=oF]0XW'ͦe;f7;1GT`J*9(i<ޓ'a|Ǐc-.V\t4q+J)?\nAw>!DhI@ ];{o2wQ7@e$@"D E9r%TXQ$e%BQ ӛ#1+BD (5 ֣x%+"6I@(m[FB,DhI@ٱc"t@"DxH@~xqZU}H0"|$Ta;kNAw $B*J?ts1!|! RJѿ~}ﮬ!I@bR\V' ,D#S'GMd*_P7kז-oI "I@"~x ̚Un[K"$TL){H (1nٛorɤIe'Xt`"DH@a~ ?.D6}56BV"D!%'sEn ֠$Ę}b !EJ 9f }{L?'%FmD3 ɾȓ= (1h.jӆ %ٌ%%нysW^&D'֠[ $5 @a)Y@{} w0hnB#$D!]雒g(\_r |+ח@bݭ"%Lfx#wNHیi/ @A ( (a0۹uL-嚤P~}- !AJ}5}:{PX &L- !IJ-1kۧ2xW]^{  (!W\@Ѫ_?BX>{6]wrVbt][-k"1%@o$%})\~9V\Ym"$>j6/2YId% [A!%Hv+X\Tf]+!D0H@ +Vзo_86VI6 `6"h$رuٵ+nrNT,ݱwB:u+=:t qL±/m9{r,-6 (bۻ-[rXJ1\U.MH E /kBЏF8dL @vӦ^" (~OKzrd% .euemBPj{jWOw|yi *mF!DH@1H)ErT]p^ުY֩eBPbR~ d%^q@b' y$H)`ͥDݽ,炑`շG !BERXXjV ęLLJBP%cRryr.LZשC\B& J).c^}H$vڶ5XRLP`KBPի?x\4h j5HQ`BPݛo7p{L4b +qժRe'w}1L)8S}\Joy=r4"x-#Y}_L= .*P~zy6~Y+ra3 !DTopNECV˃gge"L@Y\xՕGC qZ..o9n BR(_\ $2Hj8;X!eۂ r'h$NU.Q#;$(9FA9l`MY}v]p"b6Z޽zQ\:/o IDATr14H[ٲ\Q#&ʉ޹3C98: $JPaC%}q!DUs`mK>ёTթwk8@ N,Kdg u?wP?Ndž 9j n/*2k @MBPХvm)Oe{ݟ*jYM QPt]{J "X嬎hUQLFnA],QPR X$rWo]1[GSّ])Z#Xe0u{8n>Zzhޜ&,n8c{|hVzIRHѡ\) 1qXg$_rVG,_ުHqBD(7nͧ/ۋ[5Vju놻B"6ֱ#lt_,e%UmݝpwAᇈCgO^Pg%iZY0q5ZU{S$8[ѯh 6R?< #cyo"]Wnd]3Pe[>Ki dU>~*`g>.?>AAbPB_ܶP{{+>+F9k] ײ)F]pwCj1n8j/öSPhE _c}Vn[ ; ۶ w[Y]oͅuy1Poʲܚuot/DDĉ7{vJ*U9$+݀Q'뽵Ժ=5Ⱥ> `79tk|LkaEg(O_,{)YLj M;ww7DuzNal^5sQl<ڑ~:Xa]bwFZg KXO<T`wET`omnXt u@9=vv,v=WkgwYQJ+A)}L/y}\w}['SpwAJV(M&mtv#q["+~`_Qq n˨d(fbmȣx#,"IB-ý mrIT=4;ߎeqv\J-NKKS;eos 7T&/o9C.oy/-1z%JV 4жV3>Uh5t/JEspބ >AwYvf1%mL#BP񑜕Ƞ{d.X80.$e…9%+m_1i>;ݨdB %,P} /Pf%HKĮyԪh%+f#RtjVr+lP]K=pfHY-Z}DfVa֤J)yjN?M+]9u$s\:c6[}1>-ܲ3;vqVJe8o>{lRYif3[d섫?zMwS|I |7v,fs:69MrB))>'^{7gjEc$+Y]D=BR:\m-yJaZϣ5kqfvO5 P@RB<];#OO x@cf{6 {.ԭK\BBAqQۓ55π(:'cchF|r Ij\7 (zn.82 ZYYAi HMknTY (zq1]jࠓ`R鄾$r+BĞ]鞘^7D~{G !DZm8w۶RcW`"*pU.==]BҥeKA)E_mN l4oJ*^Uay@˖i  ]Wyzt[DZx(,%ɃA2$]BRF݈lٰ̆v-#Ģ)8SHNKONVFl wh-[dt|@Z$eKƎeX`Gbu3-w!ގ _,[ŭ^1b*PFK`U,X g{!;oJbj%WΏ"t9c7S>s#uuNKW|tXSb)zB$ f3 Ӷ?޽'Nps_+**R=Ha L۠iV y3W\Hvª* XuwsЛO\RGT a _W}ljKF~mktoT"IIJp8]K@-墨j]]o8KG[~!c!&Mggtz_V0  _?ٹQ=bHDjt)yKv{46>tv=4xBul<_7iy< |85Z3[ux;"0IDYFNe7Rq#guo]]'ܬ,B?3߉J[x2!7@g3nf<ڛAoi#/EGBP^k"7Yp}7'w}ĕE5dqHL μ UTuЛttp_Q^\BK.]5CFfq1)o@ ]?uر>qTH(}Ws\9sOm-ǛIV+-R=j\ ڸy-3 { jFn-O=$PbJ֬YTnL%zchbh wR"nŰe7D(P uHn !YѲ];˙b o1N%FY,*)ᮒ%\bD=-cAQqD2 ;X=e6G9g U\i|oK *WUp=^_?}1VST]zL3饔ERvl;Zr͎XR)S4lwPW_ x9{JkYv-0G=zvԼW!˲(4A$mrYu] u|q*@Oucs^)\w?ii,W( ]׭8$H$ " H] B>d2|$Ig,˒$U 8eYi#H<D",2% !y;P(T**W9S.w=z۶@ggg<Bd)A^ad2D"J*⧪j*[caj,$:% !8Ɔ$)iZ˄kr+;euvvGQ ]b:N$lVEIZ>s^*La``G4ZAm$ee2d2Y%4s3ض]Qp8<::hAAL&2$I,kFex%$ EQ V|>42BX8!hz!,k}}}ii\.+PR)Dn i@ O9tzyy9LJTU!Ţ@4BX*VVVVVV(zӸc;vD"4 A+m'bX? r[l!Ӑ u .$Jy<1ƶoN1A%Rѣx\1 Ɔh4 Q$cTT: ̔J s Ff>խ+TZ^+4؈D\޹s'5x" !|SǩJm6慕?Ky+}}+T_]cX,;vl޽> B\5 ɲ{zzB￉*+t2ibc8ptv>CDS`cǎ:~]u]w'E`0 pVt:d*%IWaBa߾}T vkBPWWWMH$dYK9]K-a ]T*9iˋד) B˲|0m뮯͙YRɲvCrxa؜s6w]Xw\X6,lXg T)2Se"DS%&DP_d !|;8|q񞞞FL&3??N}>_o޽kXȔdMݵ)27,HE&20YdUf{.tMn;.3$/&AdYl 󙙙P(TT*5222<sijk@O] ̅3U&m0/[ƕ6v \Ɠ3xRĊx)[q+9jA߆@#$-"i]vշlZxp8iΟmloo•2⾝a.b,wpdC%p.9?:QܧBZJ]MR{mBҩTԩSXLvKْwKFvid2s z⛇B }Ǿ݁G ڢ qa\eytt0x?SD?7zaՋ 8|?1|ib)꺾yd2m}HKI/)> (VqE7G5 Bف)A<>x!V1Z0N WԩSRɻi~mk 5 ߔ f `C}SZ+eJ0QP",#`"#k g ‘iňo?mT*iֆc;w<|iw*R,h˫dp . 0Qc`x`iPjV+"fa'+iv$O a/oLJ6vR֑a0x-]Xr)\]EPF}!waj!Z‘h>MorS6-~7iymEX+ܲeqyWD>UL"C4]K&/dBM†]i RMf~ jv`fsXLr+mžZ53+8ރU Ew/t?~$%bڵ'N]ϦT*{V T+\t6lw/&vGxP8'\>`_^dUys gKԺez^Cd6ERBrϫnLJq o'?VRvwb{0E ~4M5 cbb͟#G~"H5M[XXh*b;ݒMo&ƥUG(`GlG߰\6g֝ixPxiź"Im>K8>7C1m ,/HC#xG"^sxZI1;-ͽ+gcA|l6QΟK&{]ڭٱ.mo듦.QtM_VēN!4bmܳ[f:9d0;i 9\‹s#;*irZܡR"Eߌa0<8cLUE7#WrgםE#I1&{GOlf1mN:*Se|%MM|೗'Q5\Ù$ CEĥj]3!q\m7bbѻ믬8CCEwz6,XinR+OiTu6dA~Gv4C1/V3^iagXxQĥg-xNk8.Gjߕ1p?7'9312 a}V8AE1Ͷ gKHigG>݄ny"V!3l\ZZ{Xyއ}M¯ ubr/V>{Y./G*m{Wly zG%IJ$m>%O7tޑOawoW3^;z@IAvaf_"4[`@ZVpB]馦[׽q|$et5zE`(GzIZIø{ZǙ]xCݞv#mв95M -ν馪HXpFZ/!YEOBy1ћ < Qt'7wO!_ƮؖeQ\wX|khܰ܉Kxd1-BDˡAhQ+M #Dw2EfV'~TYD뼪QMH["M(7zu}JY?]aAQ{&YReqPV6"$ņk Z%T338тx¼=(tdyEr~Bե:@]7 Aĺ$49猵By-A{n'Ei^Xs˘ \pGUm2յ \X$! !q0LlatMwm}rG}'ryfN7PܬUD Xo s8xwQH$Dc&`Df-9bU$ޤӈ GƏNHr`22ڮg >aB:BiioWQji^;<BŪ7hw/ ͓AABH9Y%{N c%$9Zı߽ch}hSb~+lρ-k !$` d0ŕm:2} GUE6B (6 /$/ej[4'nE l"j QFk dg.౭x-a]xheb۶+aiaTKEc**9ÍT WP(= 8sxVL*YMr\. BP*lEQ^/ (ʲi ^~bx>-+ a _pO aΣ܋ $4\.dtXdUdOEI(/D7w&eso/JY(7Wm΋b>OtڶmIDQTU; * Э#cx pSzx2{kC錰d:I$I BdfT$nn|)ޫfHam;J'^$!#:>?^p~i #d_\\\__e)B :0с[)V 2R k-BB+rܕ+W % :ӠɄT*MOO'IAK h!4MsfffmmMUՎ:$ E]םW%Ali|`BX(Ν;gYV,@ ͳ< +!!lP8 ~?% J3xv߼$:1 M&Rĉ 4ft(4M4qi,*˲$IJk'O:CBH UaVum朇BP( }>_+òaqӁesۅiqw\.,0,8.7m6]w8L . sہrׅ'B-Ey|؃np?/!sy,O $u4͆RA˲iP+7a%drӆes&7-n0,nܰu!0 Lr0p@`p9DD1@^Td cv1Wq""t;0ea mIm'O*9/Ja088۫*=p Q4zɕxnfK@ Ld/GDD" 0B>& L OKxb܁qK尰9, wz]wil&:uʶpAMie˲:::ǣ(9]<6_Ϻkg1,%5D|*$Ħ,CPZ4}N[6E9gΜu=[;˲r,CCC===חIҲ5p2EW$BYgDdz"GoYdO$K7 K%K`LS҄D IDAT X14M ^x1 X\M}}}4b;8|xh7yA oaʧ$%g|kU| $@-xM\a/g ӤBh|"clԊx=GϜ5zbWmqQ6y]>AOa"~2*U2&$ J "i+{-1;=7~DûQJon!SdYaex /_4Fjx"Ȗ\ :BPA!4t<2/g0';K2 g~ iv!tguuwsؘ Z=ob$Arx7-G3"vx|hM8q>&^7Q> :i !`TjYkCA♢[61'OH]"88&.a,o9iL[GjYɅs妦h 9[GTAc5v Kr\@v ˇe$q(H W>@A-%bT*utt~Ţ5Hgnɻ淙Ⱥ;{wTMp`q`B/QШ8\.OLL9HUsKW*h|%j JQhpO|; u G[?/ᴜrΗk&c,˽4īUkG=A(w3E)VP8?C#בU<{hT[S lT*$^S pLM?vags'>rC͒^sψ߇'j޺Bdjs۶>B x Uvg2?l_F u~hTE3L- ^D(^xy=99-=@el[Q4;̥td[#h{ aT}fY%qaіE&KշwS`#4~<ܽV&Sl WoRlۮe" >tx͗yGH'su1{#-b4(BԸѰM5hj#Ɠz:*LⲂ8mS!4MQBKIGF,1iUsxN ٴ:SK!%u;yt_E9/&p~ W /=D4ڶ]ЕZ& `#<< >[y|ufUjJcf>AcK!YDY:/ :"sё=?{du4f$UklVR,z 59`W (q$6LM~Փ6-KeZ"x?Uу]n%!t茰~ XJ:A_qxBF[bej`7EI!0 /\ `Á^6-x / !ARmۦls!MH:.T8=%SL~QBEBh&叞FP ܱ'Z \\ũeHD0"@1M?E-;d–Ї|=4$-ˢ뵌mN]h* aPj W_5X(I#LBHBaHl5B,0AP E?:hI_Buk)}E؆ae B#!l!ft8`&!EQj)(Asy\.׆J+z-U"!lLTuA&!8NA$]i._޵9OӚEhB=R(,*,h̛B#^ X W9J%Z9<9Bɇ( 2 !ZK!$ɶm L s'6j\XK8oÐq&!MjG(r&H$TUmgGk16)a+"4/!-W,qʲL&i:󊢴+2s1IQ-1%LmTH=K$QUUIdYIڳ&3dzGakAz)lBh$BmUHE(eʩXPhLRy@zVAZ <󓠙h]DI"!躱Xƅ%IJ»ц/{Bn !ls 2Y^ a$e*!EQD;e.3Mm{k2s9#ݤclwRsF(7Kר8UU5X}W|}EGM"l!TWTN~QP@ PZ،1Is"l>m,^Tqhhv,~\ 'ZF9PBA㢨S( mAaDYDGƻB(~bgXYYi'< v6k*Q -HS l!* "gV¹6i9&sb*[Nk@Da@Vp,>(3 !" 5$IDQ\\\lg{vvT*9X+,MOBUfeȑ6kctbߡ^u @1I+;Z1 [[|4J^@DBJk3@A-f SK8ZBC8,"ǸwBb5IBX(>ɓ-5S(Ν;Wi{"m+!5&lf!51P8]v(q1xX_bDRw]5X,:uoۂjoUAG0L͊Q5lKx\oȺ9,>mC^הw@8. W\is~Ah5Ă;5K&kfubQ ܏~tzD$?"ha4]^^n˗/P(D[k_&(5;A!3͉YF'5؟Y< o,~-ˣW H4ڨ uBX,xb&iyqqquudތΰ] cos:)lNQ:nG*`u~,h'J0Z0NQ#ӧbS?Ü+W\z5gaS,x)"r%tS&zcwd0W;b>_D7#gO㷇p0P ̇x$?bbbX,%tEQMӎ;ּ m>uJ<$IYz_s%a+&NwD1yH<娵G=uva ~}0CBWhP(>~8>wܕ+W=ET:zhX,DEMfj,&cG G~'bO ?<㏾O尰 o]g܅3gR*>Η7}JU|{g^eYrz *3mtӧO@ @u2/{SEwϗ,>R#ۅӳf\C>7`wԪi>_ʡmx៧qu'>6$hoS.$.{vBW\dO~?D0{weeX,qgi:ujddddd1O t:bxç;붭;"h +ܯz;Qa=ʏsn:`1z$r _-l o<ʪW4]y,o_{w=s_;џ-!q i\m!055uQEQXEQx<4::{bbqff&Ljq:].lGGG֝=7sy .޽];*L’}r,eEuryff&HhnTuT* r@CpGq_C W8k8oC5^‹)\#Ƃ7Ɠ 7~lU~|w3; wUVx<^GBh4jࠪ5ήzsV{i }]y;4oe|X܌vGʊ:h Ybb84cP{"&DYϺKIg1dK*3IDPcyCeO5r '$(ABHQz2:>btw7uo[«Hԑt4qG/waĄ [GNGFGfg}=jX\.p I"8닋===px3{utzcc#NoRضfSRƘybTvoʶtE3\#o#~ASOa>嵓k9ܴaZܰiis♢$r,2E"uG(kze6 ;9<7Q탸]G@@~mHP%ئ`&sSoçUEN4a,4Otdm6 Շn P۾}{%=AB"EQ îfd2i۶x<E"jeYL&L&Iq$IReqL&355Uw#A5,6S7=9gav8\l>Tf;ܰi(@ 0&00 &l듄*V*& &NJ)|,@NE&<_ڻql{#2kpצisaۻwKo! ^t:H$b4eYz93MSu] F\`(VtzllW޴K?(EP+H^oDjql7ϕhaTߍ[־SU|'OLCu|[nG 5u]EQ~Iq]iYi1Q+Vu'N j:ĉ~i9 E&pŤ P_eU&X)b*3ϾEZE(80Fc/m[P_ P_cUm"{*>p8ieYlvllT w-6oB9"EB6g3 |"ۆ[r$pn/ݍ=vy b7v!kV<?њBDZP$uΝ ވ1xj1 IVkobJQ..3( šN7*vGf1:'i<=JY G\+BE<6wǧ<{+j *ZK/yj9{=J%0áK3fۧX2C]ȇ^5>ɲy^w_u,#~aS=Q3\3zN|E?{Ҡ@]w;1u7>wY=s_nX#^wС3gd2j6;]>^䳷i_9R)f!2a#w_ t7,Į>Mrflˁ8)Ğ7V 8g_VX-prgvC l1q8*v*}iO|qn[^]rdTUݿ[$/--8un]׻  r+ NwD]FԜ%LYd~B4 Ă`5\Y^1_b.&7;/wbY+&>;nH00-H# xlZ"|y>B/_/ Q(-ᆸm\I+H&n޷KۿRzb2jJG`X[/(<n"V`mx( bsN'x$gĎZ(_c=DǼv6ݻW\.Ǜ3&pγ٬a{ݶmM^'",l8-t%Z vYE qqS|2NY0 "El`|CK \p\,sS^z"H4L| |˅^ !o gixl'>7%{%sݖؽnrRi׮]SSS$gmͼ0qm}=At{DX,x|Ν UqeS%{CMMb|# ?v&~cR"7:0э t  n,ߍ4~k;>$J XS#7m;!wY,[U+FoN<7&~]G.A v4nafqQeϨ~BҦıg j?j汲Sexԃ+V<$s_2%qN07ߙS ؽ{w>N&&M[uKpxjjYdѶ?c\Z:bCyJ&݂λ"{>*R-N K8z _Xʼn `;M9.|l Qt[Iۆw_yB* m:9X,jӕYW:49500PG,I,*Y"XM+\̮;cn/ĂXs9%7s~M ;P5a?z7krWاohdz"-?-8 qGqZ07E\* xy8 Uܶ? eY+Wj Jw@Mk8aeY%@OOi ///ZYG*# j.n . k2'I{wFq^l'm PJGnCTHRTҪi8ahDQ@;`iFo<`+7F-)~g~+%пc>svJ6*Nk ex{ǽ+isp6I[#+YԕTn4uSw^xX<1xRZigQ+"m€@F^x& >@h>{ '#i'J $k}6x&/Floa|}7| '9 @!¢h_LZ5  i~>aIE, aODR@'$Ô@Ѥݸ*m&]g[NƯ) bBe@0PQq Q1KNI>wX L>,$8ʀP?Ce|f(Ԧd_W'bM6x/[hz4!Ңs{]9ق Aaڠor*H3g$(mc6uVhHgAM9kn(Dv/ǜ.9E*jz)oh4T, 4-GKglށWŇ?Kbcřa}~%dd.\ հP@kCL=p>*]Y3mi/mgmά bV8$0W+3Xbj"Cxh\~#FUW~̾S|ɰvCdqnUGFFMUV^3ο`A$*oRr/^&uĭ|ěqFRHy9"ei+!7 CJa+gSgtk_hIOXI4f:2 |5Vc<_w&:I9,bJ7^_̻|O­FY9PQ_cۧ>ݴ _8Rl[65PEG?ǽyC.".}o@Be@y?xkQ]AR7pƯnϵκ%+L~L<5}.Mhd#BP)֊~Ɨ3XŢ ? Ta˂IP`z M']ѧ*s\T&/kWz\yɩ;;}|#,sŦRy'Sݿ|EgY[޸r5yBPω0ƽ$[FnB0,}I͠Iz...9d}KfMg*/wxXmL[pmDSre1^?b$*"iG)cǏ;&$WUiܺ:50ۺƼ3s-}\OX$'bf.+>'x kSOV yPzɯ;yfQ5sF 8¢d}d^tK4R}ᕑ_v f[@g+_,]VilC]'lm:{햞<5+'ga؁F>kqȋU͙QG"}vyMZe@W@ ?2c&}|7 0 BTdHs9S,&rS$t0:gdYn1&锹cD[|V(PJQVeg ùx{=+1/Au4Daj2)EҖ㻹Ƴo@1glp:5c-r )*%?Yv,E5vRr&?_)xܒs1uZY"Dp1 A'\ }Td͇4_}ҷST{',\3!>e:ٞʆ5otXΨe}o@ 65fuˏ!E.iҼn}@hտZaIae15{;|/u@pf8յiޞ5a-Tb%Lc"L<ʃQ>9emС%Mɺev6y"E֋NnFǬ .-Ү8;.o4wuZH&_e7?wCӀz>?Dܩ9C51l,c "6Z-ϰk HU-X)DejBsS$R$K8o-dsH%b5-/Tp TUs$R mxS-]ԚzCuf)0iD=+Q -Ǯݾ>Z7/AGS#56w lL&ކ7Zm[BʀH&M@U aHgg[']8hpcѪOGmM^UQ_[gY{MbGK;݈W }hoNi /K+p,TUY& ë*022&C[,͍Xv3}|w+DFBh,/T C h0uxNcGi&tD 7lDs90f;R%p90n>F|~cڍ6Zf='MĩG&*lijŒu1%x@h;uơ$cĘ1 EhOWيu,G\l0+{-ÞSATXlTCkkmbejrNJZ6L|<p9&N`ȲIn نO/3I9dk߷fEƩjڠN>{`u{to{s7\Uu8夓pOǘc/Sf=<UWEJ֤ bE PQiӦO_>&x`;cb@[3_SgbGoڋc8۬=}&s<=G.q4Tdl+WM>?mo-H5Fc7_eAQxc{'|ߺtnXeb|* _0ϓ<0~t~P=C h<#'.<#=/++ڷnZw-INʁ'ZL:g|Ac^_^i;}y~P]QǓ:߄rޜ?hkz e;?‡ ~vYrP3p(=GB7p_Oǫ<_ -PZQ۸c<7Յ^z%y q,c4/Dc!˕z@ʇ0͇?wj3ߧUIc]k?Ӷ˦ŠZa#qˏ3ЬnG_m>hQ|ݪzn$>q<={[8tl=ΟWwt%p wyۛl8k.oVn hm U2֏š#YD-xn&@S߽xf#sEg+5cܭFy8ԣ~Yg]GwHmŻC@y &;kG}ImA<ɸv"BYC/jȣk&/3 'ˎ ư3z{6Ko.¼9+@N'ֹ*֑C> 4V{>;M;L4_)]d7U#_fx-],㡄$Y<= 0$;]SYU1q}Ν/.8>9o9"'ø.TpE,9'n!y {Ř5P+(B:㞑xJ 5yƗ6G\DOC5ݒ ̜8<[!rv8C?s?s$!2>55Q6ʕGd}{M .ZG}w*Yt:mܰ/^X|pU@hn$PېrCQ_; {| >| ml;c9|Bn`*FO*K8yLm g ]QЀ Dɼ3pnNJ:Lrg#6[iYRՂn|ۚҕ@Ce]'7a1xfᇖcv 4R T_;3^Rƪxݕ[ +w<ڲXv+l`x,wW}zP_Qvn6sw57[ #eF4?s^r1=Ob[M[|6M๕IJMPU Z*x}:^>^pIǥIu%hNj3^d3]ފ69c\UqmuzMiU .тں:Vu Q|Z|kFyW)<˸Ud┽/nU0>疭ÜW. [;얻lo)嵫aM}AEQ_U_gyu!om'9~: ?~zc\ڳ+B|ͻ,2kqw;1\?i?YIW淟@ !\csYPϙrD۱hO5jH0ktLnz,G[S#Xݶcǡ¬şy2f+w4'^[ }_O= 馥Ǿp8KjJA=s|/.\lXYK?U'} 4 4o>xFg1(99}tW;%~m/' ن4*{67bgK+*4_s㏶5{@p;9\ #$/Ǹo\|xeK5ݭ`̕@r¨ſ< p1mp9@0 Oa /b΂ԍD嘉6nVĴ:6 -;MC8EuWwI;`϶ĻFiwX wjoo܍;x>?X2w6Wu;Y2Ux8nي}/¡r;fTUӳXfݝqzZx 0 [vmcA jhڛveŎ##v4%nv{s^[`bmk_AS&b޸oRIW8oq]hhb;HY,sFlgOi9g~gH*=XUv|?I|Eܲr.SSg.ɷ0Ur;9XXܬQ "hAL Zy"!\ SDE\ELU(:Ѧ'??Iu>NQ#6vq;" i!lG{apVY?y+קr9GSY`9a|RZvX2,#YuY4ǣCq''d<&H;oF]1 E <Μ٪-غU.FeYQDlO u$=)+Y(vNm:3t IDATˈXQVXEMJ]7p6z_ugvF"A}F)EJ2Ȁ$". !oVU 鉭^ `f VmGˑ[1aB]zbYN*{n+Nl_ϓF&(CC5{L>\P=BQSʹXTdAQ+<@{l'4%0N=3gA@G I,SF+[g[qf%Ω=MLyV(uڦLw>MbAwUXCTЋ)3C1bscQkؖ8 ?=83&7~,x$vIw١QJDXcQ,KD XUZ(UoG5;]g`K|wfgs3!C}tWbźqXW͊뻤vR"Ʈ٫V[q`rL2V@=R~*{ig(lJyyi"-K Tg"gQI9-[zK]Y8ypI6neHWy1Wc_kók{4$'¢eSg>f$qA؁)mnmXZ ٌq#TNʊ!T@+0^]xmngZe21Y4)w@UΫ)$Z~֍/ӽ{r2 V]8/+ ~i'VmoĦVDITQU^1UXWejjrwUeUUҪ "F)%>/ 攪ΐp̦g=tosyK9'@'|='aE',Co$|ĝͺ}^9.;D̜0xׂEXv]Rˬ5z4\|t7}>g?4CsueXߡabH/ϥi$AwrVe?P xqMò% < æ`(!c`ҫ5{=M7: bapwv=qq U'.e58b>5!V3n7$<{!3&0ÐTMhrVIhF5*%vW{B7Y 2wgdqd߮pj~W@g`:οT-BIK6AY"J"RX@M9+g̡5;*J}qakӵwEDeR+faOi}t@hrBCOyCY^֕kD2?³W 艓 NTsXd9ĝyzzW3'@N rvbeEZo"neT*j5:l]]8'&0Z ޘH@+|Y^YmJ(prul2ayRd!g!@/LOt9מ|d%n:\~s$..=k?,t-A,Z] E.3bJڽh}ƍw:2dȆkGdidN|Bjra^'Uͦ b8 p왨Ǟ]{ȶ~x=f.$R$ aM&F15{k"d.R^ig#܈<$8nKyM۶KDA1eX/ۇL\uw?bD5BUszz.ʁyk)E8UHܼcnٓb׶ N:~ <@5{ZֱqWcW΀)Θ eftg╝;[= {csc Б`/VڪJ^a3p>˖S{u҂8׾%\p~xN,\/q)E_sLccyمhxk@SI1}A")Mv a(9O^s {مSo{/zJM` Gkªg{31eĕ8;k$[I}/yLsU,dpw؆+fdhwhs:|_ 4\q!COӝҁ u2!W?"-]ʃcRRuw;$ndVV,ak ?^0*|8} X؆mh1215QZbˆa3֛onI{W ǽ,C|aY]z-67aL<: o%$#l{64&Ĩ νF)g-y\3Ԯ\0񈽇UMځm 0cj*rŷ?o-Xt!#1[$.̫ ]U*j1b$xNRj{#N_z +n[J#'.ہq!>شgx{8׷cGu%C{Nn5V\4Сv윗0Sf7qp.ӏɃw" A?fcԝ[羁?Aj}qܗ_}(z֪7(7"l*L;9t~fJk]hIk!m0ko/.覉++n'MnkJHu.:rQ̒]}uIJvu-8j;qMwю;ӓ= x̛Ddk'4|Viyw&\ty-^}H|pߋܗ,@)ˠ}YƐOO_Xt4/$3`Gh:o$xk_܄ kxE0ɄtKS"ѷhbzϼ0s,w.8p̜0*-c5Lzkx`mܴnW `_ [m[6K.,"ݱYIK%hj#dgDNa2<  qG`q&[]/]ͻyE1}}w]-nܴa='QUsJug{-OV\r1.4H&$>7 -!.ߺs?}ē ϼ7X|;]3=2\Disԓgy̵̔`xeV8 i]V80Y3ŏy*YhVx/6RsEra_Ȱ 罎m/>*#aa`E?o]ɄZEn&^DF>&rO.P._rjN:n-QQKPRb*pgpČ0b++PYBKg Zڱz6d9:[nkɸXyP 3mMQwL".L_m ɤķkWY9&{2|Z:cҎ6cɚhjjJ Xl̎|<OzT vḚq ?>?uIa94݇P! ƣFߺ(DymN=ǎ” (G{W:bV|zl,233?Z(Z8*𺘩xH%DU0<}*<uO5nV0a5밭zڀN皨IYfy1 ?Gh]b %sk9}NP9`N㹫ydG|Pp @l"eţFTI嬵֋P.c7"6tC n &rTs" Ě0w1{J¾/Q>)V8_%]8P>!oa>Ѓa޾\B)Ugΰ+_98ܗBkRANLB<ޡ:\-hf $o"'ߪ Mwq迩 E$`=Wlm\dC F^ў^K{EqXh-2fJfhݕfL_d<E}Ɲ?d9K:9RB 483t5˔w=#ؔZ E{n1ij)ĥF&'Ө^M}Ǵ8B!XYA Auh癄":e/IJKw _R!RuSMOXUmS3ǣ{1D$I^$o8I&2K²g.c`NOHa-;Bld%q$Eit7BַNMA)`R씧TSťV{YdjR2?#)RE H Cy겉ױp{k3 a*5o)Q@&XM2=Qi]TNh'A #u$ eg\ &+vɦ\3t%a/l M>3]&bQJ3=Uϐ5D"$&KU͑^)mA$/B䔚ܦS-]w 2Rh۱PID#^5-3CP^{MVlXWE=\ޠl d2kQcz952}^iŜk̹)U11LJ$w+jX2T 5!MUW2ENG bo1-c›5r.xPI @1fT!z;&ϕ?2ۻeqtUfPԡU)m3 i]b RPwEjP]֘GAeevC&*`؋n)GI2WfȐ)΢{Iqd2+ݕsM)x}s-M).d+EezbxR8J \=2_h`r![y3U,8>My$kR[3?˫wrb4PLbg=d,_z^,,&&}[t'HP$b{ewrcN8By}BƦ;؝eW;=.MZAc$֑9"Sg@ObH>S_=ֽ6d;b4xO)ɭ{D% S'cJ ~;#Db:LY@ 0g7jz|a7yL @aF/Ur 8Hpe٭tB@(k@ T@  9=x,z86[ٚ0ߴ]qs|5k@ &|$|&{e~6aH;߿&0ᐣn/X-9lMH[ bG  F@4pYcqX`/|$USo،>h.被D/2xu w;טO`ӷai`oTx*P)Z}@ (: 8|B ͎`4Vb.U?A/"rѦA{@DHWɶ.kvviK"P/5ǻ;h۶K891qBeV&ڀ lE‘ $G˙3tZb]hG%t<`W}X#"BBoYވt1^wzg> vEj@ JU  pq4M(JefR+0M4m,HoG D"т- +@|6~$[?E[>^z+VP}@ zv aT+ѹؑO{3jH4/CK#TKau_~mO47 pp[Eod4XIDAT"llsk8a9g9=袋ҽH MeW.le7]ulu:>-; {{߾Ě޻M -g`\{%_[ym2X쳿y^E]t՗ c;,ٱ}ԵƮ5o$;kod$3k\{ z_˵=袋rQ=B@ E+܍Β!O"T(>k@ @]I#$WP 10M F%$"$ChYVaJ$G1lLAתB@ r""AiyPi~Z4nKZ ;I"#%J`߀eDK`I$mHc#_ !.'-!H@ i !@$H  "A0A2!L˦Zɸj=G~_<(ɧ-X'o+rc"Q=BBIPqbZQ!R {P5%ûZ\̌&+Dcc̝ҭ|ӋQ} %%i)/>4|Y40DW@Z>L}èaDa駪R\UU:HMIǵd=FO$& CPt;cwW:lɩX;v0l&KE Sc Og_-zh9S{()䋧} hZZ}IU+ Hӌ#l͑ J՟}޼bUCz(«z^UjA /IwEǼh+ DO_AJ6&HtciQ4]2D~'``qTY9G "66JR_ꔏM [ZVD9) hE&ޛیǛ3<w P5!` 7GKk%K*˛?R他gL⳴`/IL|;}@v$0X@MjGDH$X$yKLX|BpcfOs\~&o6#BÈ Lv@;XsC"B"~'A?$(bX<h}W<oofE Fh ʬp3DZcXYO1$y'>_9]M-h)I9!3&b޴iw EcOe:TUbdV ˛.WӧX"f|9逽#.w$`橡UZPU4-qi&n0b0̈́eMvN{{fx37oGHc.o/Ldzaow7Y7 >(^VU @fQ4,Bcz&8µA%@lu{W ".Ox~ug iy_Ea0M#ޏ1.2; <0y 4-܍Eg [ Gan#(`̀iA .1˜D~eg$D!B(Pnfha[ ` c&t3=tNk\r`z} C ndG싹cIztmJ{lzӭ`%"$ jZڇ8Cvp` * m Y{L4 p44u"B &`i5#Xr#f5 ,J(DN hJ,CDHR)[bx vd!řl: $M( Hp i!B|9 '-  c~|HdBId3 ݓjַB$H}"A7zWU+mmkp  G$H}EiR . o=!Afe?%ΒH:3lJD4< |{B<.0:vLI͕T(`RKFƃw 5d%N@!MHvM6+?NT5UUKBƥE$80qפ%&"6H]i @/1D 2U)BDHmȹx2fZؠDހj禕` N܈0WSZD]5-d%VHP@c҆d̘]at :[W Mߛ%b8#F$"A5x{J; ǚ^t= /܃|j4%J)zR.U8dZ[i*.|,Uǘ#A'I4i~d~hZ(O|dI, Zzk+%t9<2yر>i*,N Q+xxZ'W .זX rHO;3Mҿ8'+V Wf1i2ϙt3F(E_4-(mh߸rw0$5QE&Oy"P+y*i$kp ZU)X^d$RM0F?@ %!@ D@ @DH !@ D@ @DH !@ D@ @DH !@ D@ @DH !@ D@ @DH !@ D@ @DH !@ D@ @DH !@ D@ @DH !@ D@ @DH !@ D@ @DH !@ D@ @DH !@ D@ @DH !@ D@ @ ! @ C !@ &FH !MxD@҄GDH !Mx!"$ & "$ <"B@ is$ғ!@ xq!܄GDH uP"<"B0贖Ax!/"<<(6@ Ȏ+IxAӧs<"B @  Y'+/"!=J7X7Dx!\i"by y};4Oi" by̓N>u˰qꘀ%xi铸'˱yCq[{k߹ | ~3@0J7{hhz01u8i}'`ql{/;|?L0SOf^q5 w}S|/tZ8yu8|tL?]r^ 7v^?`Ŗ3kSߎ9>׭-<2}݇W{cf`¤Cqرw^z-9+8"> ULt κbiA?GNi'nf7o rއ4ƛ-ƺuу8v$NS0mҁcSq}_MuNr/9=r[;/5Zߜr:XN >So|i&3` =lzfG1mo#i9F_p1qX}ǛնwM'5OE|cl<:x r|^=z"*I X9ʀ^֖xd:ĘSZzLL8_3E8:^h|*&FD[ k|VmǍ5{n?q9}/$6u064KSso輻TλS`#2ltT|ȯšݖ1^Ԏ%іNtؾ }.|%SODzs%m'4fh~.78r1aGB9xgw0%.Z|5~R5i9xMxg`&^ `21v'!0OAυrX䷭wuhMd M(EyQh@!<2s_]ӎ/`CTjInv-$( ,뮻؅,3ED7(($nE#4@z(mEeTRhD披j%ӦMnM3?3ws9m|Y&1&yzn4Dr^$%sQu4U`dE33v0gl4>fHMLeh)7i(H&Ei*Ρh&SlZ?-!zbE8I3L۲_xsl`ĂDکttD[:iBySl4O\0^'8"@-k@h iqNĞgbrUdy;SV8qf|۳jN4ݡ>'Qx ':>DY-<̜CWbaԸ {jxG.akPp7bOBj(#(i 2/&%c+͍6l6EnbMIқ~{W)w6:8j%H-ʌHʧyc1Gh.uZ$_Řő|ٙ91fͳ^LFaLy >mQo˖;(T}+_,?" ZPDMK{ۢMXfpҥdY'8?D-%۬W5ԑ52ϯF%aɄWH^V'h8x4*Ex"<J߻"Td/@V19Ͽpn?"<^/ Yx] "<^r}O@Ex"Η\d '"<]$DxO'þ!++M?IENDB`fontmatrix-0.6.0+svn20110930/help/en/images/browse-fonts-previews-tab.png0000644000175000017500000010151011223375754024702 0ustar malexmalexPNG  IHDR,#_sRGB pHYs+tIME;tEXtCommentCreated with GIMPW IDATxw\Ggы (EPQ,!XQF%-k QXb4`GQt)RqecrGS|?yg3bwh?\d IMKDD@ "H@"D H!@"D = ~Sk{E0%#ygWlSJ*@6yۊ,tmlj3 }zڅXhS6ms߾Cѧ Z2`Z8ȰW''ҔI0I/ۙ5c?~νA@m HtAFf@ʤ쒞([#lDN @M!#]P]E"i"9+gYb/v 2NFz-S҈;6~vLPV%Tٰl e/S {,^4'W3S9C(!Y%B\WXA {~ @de΋@,iQ5^?,zr&[(Bae(`w&( =s7jh'tR{~C,#`V\\ `{>*ڴwJQ{L VD]nˑAJ֍&[>N2gBqEzo.o9s?{wvgE%޴Yp Ԥ9/l$>ę}tߏԞD(y}B,#7RF 1PË(V9@, C:]X6Mp/n$Xb02ȡ8w8>I{w5۸Z>aM]3-TtMkt v$Ï-{^:lRyCTůxBHaQlulzV榈e su6_[mjT@UdR;|6_ѥ8NQ2_jS\0ܕ~(_)SFy0tG(ݵ1Ptͺd΋@4CG$l$2.dgX|{ -o@uh Mxtry *5drE !ф`G $B@"D H!@"D !D@ $BD@ "$B@GG)6f!Xf[N DF{ןv\5w1^& xfjj3~X, O.N޳ɕ4 07o:1!ӑ;,!A4/l[FeB{1lRS`f =jexOżDn iA?X^c_؆VZ,'~\uw~eϹ J"jw%MTEbDǭ7D$B[Ouz~1֤3 (*)(~޶7C[DƝt:u/[FL-񓗧"Rcfv{em?$py-uh ̻u>ݚ^V_aaؓq, VpwxvDANBm΄9ܛo[똩_IL|ﵣSG;"bڸO(x20T5KզQq~UeﲫU Ls p&(blX6XU^/էoWj Y"OT4Àϡm+Y~7ߌֺxio2l3g]pKCMrc[f`gmܺh`MݛϽT5bXUm^^NNss rbEݽ/ܸ6`IVbs 6ETSj3o +V Etz#++5Mkv Ti=b֟Qdxw߳Ơ8oϏGgA% Jenv?\ɮwv$x7*m^^0`EsL vf׵k_^@Ks%WHbZ1F`bDԞȡ8w8԰ 5985vC1\ kPP}sAUjSq h IVbp7ⰲ>꫾y`2Ya~Htun:͙vM(Ν7pʕ۷o99!B"l=j]=dvS6=ݺ3gi(е_(\i&-;֌Ҥ|_%/4R|HDbʇIqeXt/!11Ģ}9Ԏu ~s|5flX(P@jGHL7Xz/g]I~K$BH,bP4; Ϝ9g͞9sX$Eض(SQٓ|A]P3j|WMVצ%YE9Vw/y/Z%ļײuR =u YF/QU@\+@H@.OBW59E9n,?D?L];2/y"Jk!Z5K_ AaL`>u@ƙfΚ5r֬Y3g͔/lT51R[\|Ϗd~ѿKqdjԀ%5 .YGo{O'u[\x< ?Mw1]A!fk&3{/>ܝi`˧]bǺ3{'mu؈!{(Ԏٶ1magBPO4\s†[M=nbmg jסȭ̙3᷒|z98N[>V]?ۈ!`w{~l}6%+b@-Oi^<{l0xNZjZ:)<0H()46<;@q e BC f!dAwz6Eh&y9\P@w[w1e}}"&Yx>b%JDgQ79 U ;z%iJ݋}M]L^hïdZ׮ZW"]j5sG@_[ ]U9 ʺݜ9e|Ңl_Oz2>{`3~ g(mkXfb븅^|2j7N{GѴY9kRC^P1Y4='B?4cXUE py j1~SB@V铕wk֒3wsֹV)yLL,ϊJi*-W8@0 WQQye6ȂJ kbjj\wsV[/&U8CS}Tˋ(V9@, ;1NTqrJQnSaѬ Gb5w޿)5gk2rab[Ai?Hջ@8m(BwW!9RQw1M,T[[$(--g0QBsBd ߈ k2PEҿEL-<("D H!@"D aA5h{a{Qzj$BaKr|︫j *sIWAW99MZ1O WLoFҩ..kDtJm_qq[wzJyz[׼㻽/!L;w3giE݄9@ +[lކsr?k:ZVD$&Zv X\yuFL8` kDbVV=^` P$_ !H$!"nOV)$BbfĹywJ(]W=,zcW* z +B`+ !A8BQyv2B_W5~ ia| *`59B@t Ol}O>x0LzۆTBa*~ƽE8qړE@yhLU.~C E|(D:cNq.W\˥=sw6JW)ףw\?~j=!# Q7 hG" v!aUeoi "0\EEeL *-XD$媩]whkTqrJ a**zzL!C J}MEog1  &Em'q&  _A $BDh1/@"D H!@"4dxC jzmmmZJBYiI'ʃ㸊Z}t4'E65Q[Goh[ N,uԔ>PCtz5@,v:c8nܫoW!P(~˯阿0bS(bJHO߃J!se0̮:)*hn@,xEg~`77;SGOvaMu.AAUG4r]b U͛ў" cVZ(0Yli E뵫|;'Ǽv!۔l(4E;1 VI(3T1bJ(ˇ茞tU%QJBh:3v9iWw>{vix>JwomY_¼PNל}[CU-}|/׼^,CfJ| PpXms˒KaшϽxӜZL厚ܭ[Ke({cͳj`(U\\*S8f!4\'Jn={gЈ;7ݹ^ɩcVB\l-T(ͮy5l~NXMAZ^>a[7 ÕL' @9l v1_ت+׏8哷 a@\0s=pܮ?:}`JW-[^ =m@2lFK=Eaw }@l:~֜4[Ёh1٥B敋]0B хL 8gYN5TzO~pIw5>W78@0}~-qؽ u.fT 2H(w쫄gJPr߈/0Xq%,~q*,b&4[d\AybvUT1Xunߞʱ*χ~ kH&;ڀ !vIWfU [ŦC 8HTeq r߶hS 5Oz}=rҝ \vBWQ8ou4D%Ř"Aәkl](M̡:=U[*377(:pjo\*2SAHJq6>PkqO6c]vy}c]ml$'Ԁ EF_ ,>T,+(KQ}I]JeKʳ*⊴H6wefL #ڤO(/}W@{Ȉ3F֒wCaIF@OJ%|HW_NFCAO@X[YurSF!]ct? 7cGZu;YEukc晪l2MhJkfF 9L\Tl!<vl 3{ wZ>bwt`ܜl蕏@ƄU+'vpkj(S{aJ䍀 JV\W K*l1@@F8(C\؏B=r]ۓKc{HJ2F,4jڭZ1V]_Nwݘk?wjA\eO.'.^v?X 'Xlg5]gkV=zP5MK6?K Qs(Gk$1Li֓oKVKߋ/laDxBYP u;YfRBBT)ƵYHdq%k%3EE t5 j!v=A|"EXWցLOQpra{{d6"NS^naͩ ~ug0NJ~_Q=@D >1'6^*GA Ú{&Ƞoa 8c + 4j92" !,&~͞@Edx<^VVdˑ{򳚚l!+ 0LZ~B@t6޸qx„ ƝY\~ӓG 2[4)C/^pss|q'j+Vr'O 79p%,m휜_֭[>l狰1B0/ MRNnP(buK(a_=!A"?'%%u qD"QZZo߾,K.jjj'N_ubq~AasnJjݺR)l9Dx֭,]]N'B@uF IDAT!,_4Pf$߿/$o= fX,.bbRRjY4`huHhvG+**N|SXX(&N8e>x ==VCCO>Gggg~d 4qRfgg~BEE̘1CQQݻg6w\<\WWw͑$舏&?kkkK,)E?hР| 8!?/6t :͜3b=}d{!$ "LOO~޽{ aII@ D۶mc #555666$$, {%Ǐ)9Wyy]C" LKK#GT !!!QQQ!ܻwnaaayyyhh@ >}=z$򦦦[n***o߾%%|+Wtuunj3xJN*wokkkccC߼ys̙SNm۶mԩ~˗MLL씕n޼yu͟?"Jbdddoosȑ˗/>}x+((ݻ޽ԤފDEE斕M6MZ2% x9Ǐ9ΥKAVVVg„ Gx9y`Fggg3}tZ@ XbY|yC3rÉϞ=իb,c$9αc8˗_q8/^uq8ݻwK!% 1B3m(ȳl۶M,Gp8͓ݝرCK,p8wi#Gr8$˗/p8^^^KJ yGz1o'ϟEGĽx<<%76%7<*<84:ɋǑdMLI>2B{׫!!!QQQ$E͐FmmM$O8333eee@UU$N'ø8ٟo{пF*MYӦMWp[QQrt779sH^%,vvv777WUU`ϟ֭ۆ gKKK1B3mxܹ`-[H œeLLDJJJsҘ555t:]f$999Yfw$F#KDxxxxxxD-҇@EN3F(+(@ɣfַB;MB1==] 4$B{P[[ h,oo@o޼a0k㡠0ox`VV֬Yƍ'mteeeIGd.9((HAA,s9?`'C6x`ɒ%H9hNH&DI#XؘBHVTT8.ݐ$%T]]]SSS߁tsZd% BD"B$Qt%}BO˗KKKWZ%|Fb;'ӂǎ+{Y%&& Bqqq 9dRs%v_*y? 4554MFϩ"H{hhh!þ}-Z%_חE"I'OR#FlHJֿ">/˨EbR0q=z0%_zk.uuϴ$) >E7&)..>{Edd̓I$y^VWW-̬~(ҵkW^۷osss9%$#KOObR]]Mrr|MI0ww{FGG8p$o"""H0ࢢ"r&oS6$ҧO6-7d%GJc6y_dJ6199ѣGOΝ;eJu#( GWO$:`A^zU#Y!8[ؽ{wUUҸ8Iz1aҏlK))] ]ɓ'OÆ N̙3龾~~~gΜ!/4`~~ ɂ Ф '`^keFo /)yG.\>zݻw-Z$= V" P k`r(-&$$?~|С?~|ii\ʽ m'aaaqqq,,2iw'!44lXG&{͖9dF:Us"wNի;w B___dqƌfRPPPWW﬚C6$"' XZZ*))Ix###k$Ѭ?%%ϟ?4wܫW~F|ן%H2/_feeIݻwN\8>cƌD$'nbbҽ{OS`6$".C&l$|D~~~; _aa!0LHJg0d7; @R+%e IA*0qoSyfڵ  oFuuwzlqQ҉5Gۯ_$]LC9Ɵg"C6nwww=sܛ7oVTTH.>5 kGϞ=7nLWI6dCr!0K8@Č3,,,d-'O$90=Jߋvtt444 -!ɃB JEK.v!/^xxxXZZH \$rɧlmm۷o쬬l~4˗/֯__QR5jԑ#G"##kjjN8qu!L}Q۩T*˕^6t $#FZj%K6ԅr0///ID&ɓL&솥Q4)jWWW{{={HأGDFFN4If6\#7{?ޘmڴIC"'zw ];w[իW._5!!!22244444ܹs/_yX,ڵ%G֭۱cǶnzSNihh@-[dr6޽ɓ'wܹsN+S~)99xΝdoСCrK͛7o &ƘWWe˖#^rƍ߿ׯw܉8ٮZn%`R\4,DL=e?}ptgrcO쌫ܹqua 2Qcee墢7oadd$XB$%%()) 3--F7o8ӳgOaVaZZڻwp޽{=:Tmmm\\\yy^6V Iht:NRiT(R$&D"@  BiR>~Muhp6uٝx{{ccǎ&(ɩ^ZSSʪ-+lbbҜz|0SSS_ȆY`H;ͷ$5BRDLV\I)oyϷW 0"u)7ͩTjJJٳg>|8wFzO`~#| f B؜?R,011͛7*++W5q~ j?H&cV\\a^رcIII CKKȨKܻwogoï]6V BТ="TUUmٰ`H3+# z!~O&h]B$BȰ 7F!Dؑ于:v_N >0BK} m R>F#*^]ڼpD3V-:-?5l&:.=)&C;,^ԬkwXPLVD~c+,Q2秀"99lN[\I&x[ lt2g۳/f(6vWoڝ}~VU{6Q>so6] Â2k` @"lWh- ?k7`J{ՔgR\b[\Q[,7mBZt lcܭ!z(SYթ_I-8 uh>\QqȟfNrpۅ Mumv,q+ઃ ߊ)!Di΃Uq(Xʕ^}R*߃3/ԫ6;j%=aq@~-)ӿJw)wW|3NuqY{<_R;}K3|5 $¶7C**% x{O{uKH/x{9ͅS)W8g͘/otҔ)6nGVDX0iog I/*(GfF6{IumJg0fʩmA)>zxͩ .%~y`2YGksBAAW`JLŖἺUdT*p37qto9;GW(Ԑm?'>UXN'aڔl4Q{@"l{!/z?teP ݁$I9&},a|V}+>E>inRptn -5tj +_aybm, G[ ({&a[/K˳y *tLUaB/%7p@M-Ϊ"`mfONG$j޽J !Du3n&S7o20d!/~_ҥe 2 S65=u {Z`Z9U]L<hրw8aTMctYhۆi,-SjO>2$OL`,nsQww9vwha^uwk =x*,Gն۾<N԰,XG.H`@,LJ4:J__H,";51Tr]κ/B^)T ޾  :0*)a'Q8AE"@3m !(::M_'$aHM uUE%*Z˯UUbaMUUBE5EGV&=eCDtp "55EKC|H, KJJpɗ}[3  BfEHBNw "HԽ% yBaD"D $BSJB}BSh G$BD@ "v_~)d̘1:<0448q"j+-%)))88x„ PSSS!!!x:'i$ɣˋNˈhӽAC"޽{7}o߾v횦&ǻvW^{Ç7T{zzoT*5((ҥKÓΞ={}ooK.\~]ӦM?֯_SN~嗰;vP({:u*33O>7n ?h4Zpp0uX[[߻w/888$$d͚5:u*00P5,6l< rvvŻvJMMm Q?;e.gMHH̤666䖱cRꐐEEE۷o2dŋICn!"IK{Z\.A=z0&9gΜu֑@ .sNeLMM,X ]7nݺZ__D" y摾FM2eذaFGGV^ݣGaֶ)))d۷uuu,k…?ӳk,OUUݻ544ׯDW{ QixH;33O+++Kt뛘$%%EEE1B" &Hwpg8N```jj*P5續- Kvvvvvvtt494*aϟ?7nܠA/ԧH$"S{NnݸYsssn̎}a0dݻsR޽6V IDAT'_x{$¨bC:$P(|3$[>z$%%Iɓ'7@ZJKK%[ FsKQQ o߾vZdddvv69q&Y]V.]ZSSsʕbmmpB###HTUUؾ}{C筨tzj8_VVEٵkW++ׯ[YYϼp jjj|{i6cǎo޼9)))33[nMK4i(d/V^-NڧO=z۷OzW^dIhhhTTTlllvvÇa_ma$=|a\ H@i0) utt<==\nzz#GnJs.1jkk=zD"{*29SXXHzfҽ{}y>y̻bMD&BBhjj~?~\ LrH5557jԨOpJEUUJD\2!瓡HA9 ,[<-[\\\޽;y/eG#88N7cǎNcK! mPD ѣ F Booo7p@==&wIJJqth޽Bw&& 'YTT$ѣGJ\\\TT0 8::N<%]Ç'%%61 ;w 7r4mJ?ߟ_&~6G%?oĉ=zѢ/>>nb~zذaUUUwލP(#LwرrJCCÒ`ooo6]UUޯ_?o߾<ׯ_'''1c-ZԻw着{())\2}too 8;;]r%//O__aJJʺu̙d2###/^hffֺ?|QVV^n֭[ϝ;7qϼ/F dU֫cFqB"$6,3&vlvuu/trM_$`25q͚5 \v-y;wzkÆ ߿r/^P...ݻܹs2ε, رc[lyHX,@__ݺuGhh׀ӧOwuumvĉϼc8п߻.j4:M$Ģ* WVQ SpH@2^vÇ?MF>aaa~Wѣ%> ={ ;0 55X22>>>66QT==#F /**b2:thf%11ŋ rA١JJJCms o]$F1ꃇAyyj**8ch8.'WWGv8Wݽ{fiiiiiE:8>j(+}Ɖ'ʬѯ_?NO>M1./8CFNl_ZVV(r(biLUUe(&"L6zDT55FbodU JT:UIQIlH,!DF_<X`AC,b6m4I2̂Dvݻ۷931 aMf5dfA hn@"D H!9Tr]mcggk;i/'_\&k2u U=A_|?r 9?P;'dw$o yBϊ )vV= UJ(E"D"uh>\*O8o՘Gtb;n-7J3V_X;~d#d]۶t)wʬ;EMuQ^;+D!9ao*.X4n(F>DDqbWnUiv[ѭG"8cQE%Ⓒj+ݾ}D±_tgwWK& zeo |]5z ~~~sT k c~Gbv#C=U2 ھ{/e I=u尽g>j5tہ_*7~WF\壶֝=η2hR#hZLiMc07rd+=ӌ,DjI95 /x04J =]}nF*Ty`2YLt &5,@lC y)+|U@23gK9&},a|,) Eٶt!A7t9}q~7T^+q#h`OO6@75Y G;PsMGK5V&12fVMKek#M%%b<0 &c^yqlgjSKXSzA escwXenrU-?_3m%;g+??#1nc8M'GTb-:-gtYha% P^eW BS#ҏ+~>}?0k6\L٥{_t:`h4 ENWBV  5g vD%q&PTY(btcU Ma^5_oOeе۴٘DhދNaKn(F( "H!@"D !D@ $BD@ "$B@ "H@"D H!@"D !D@ $B]y\N}}ߔK(=*[dg&ca0؍1c0-$*ID%۽?n]oo7{s=r{."!"!"!"!"!"!"!"!"!"!"!"!"C]QC]]]<Qv6}QOt)}MC$|`}WVM+ kf]9|%8퇙wD)UC:Ĥ$9AΤr|qy!/  ? -(ns⿞n?׷.1~K~!-2o sqxOwq7^lz5+ ,?KpkR!K<'%NjFE?7ƸX eu'Y[ssG>V _,͖a8ʴ+|> M}˹qsx}V>/5e0 u%ByrmX:ueluU\q$IDEMR}9Īܬ/&l "Ms5 S]RĢN|m\%ș0o}J$'5tz#v2Rŝ-+ mDŽů_]3u͒arfjʊ{qKBs9_xnE{TtƯ%@nm5~5S__Uo|>|.7YTWe&8&f}[Vx(Kʪ^Mu)]]$I?s45`8c̼=mBJ OΫr#Q{UT4p[>+{}qa$If<wRܡ?ul9kJ x [`O_W]ٽG-8F Av 5P -[x~Z.C'L{yk$A\ݷ(#6vZ^}2:B,]O>fQKO_j7e?AޓmBU_Ba$>6܈#zRĻ)K;M~~do)AUqLLWS?,!B,Ƅ74v]LAU=humuqT1]uHB L_7Ԗt2i!.nm (Ȼ{s|Õ4Vpa PBYKGQMC۵[:>giN&vX[xԴ^QIՆ,2VČ ޸ g6f}i>h80XsMK WF5N wa' Trj_Kfe'>( QMy ԋ1 [Cy/Qk;}i{7K2Noi EߝP ]Qؔ$ɒ NulCjؠmbVv!eE~4zqq~6yV+sgAWmP|˭i頊ڊ$@i"۩4F؅-a4?{ 0;º$l/}GjB+ijS ih ͳy)Ikаfd)mg5P(>:͎:wѕgM14<3+" x 8k&6iu-1@)ǻgAt V)a:={I0MAǴ`o?]?+gr TQ3k۴]-#(^zܲ2EkL,mc*Ƅ]W>Ü̉**Iϖf_$+#I-дmi9F;#5o\-R&ܺjyOnwzoj(L)">`N[pY-c33)+k[> ?ڿH]'EMC̄80<*|jpYCAMY}uG\g'>./Ky0k2 C9%8yz Gޛț^=%')"HE֖HEU_ D?ƄqKV*vtiy~Y/^boDtz_{4L|OwOel*>UE?} k@w_i:۾N9ϣ] jb<}([[C1VUW_q3K~=[WߤCԅ/%؅`֞߾F]Lٰ姲 JpAq琺3Er 0t B/Oƶz+o!ϻDE*~&!ՖhdmRjtޣ}A&,:ʢ|: r_<;'U k_]T7)E$ݳ%`&#@m0Lᙸ_-%H<{1B8N%lA )[ؐ3/'>G$7fDObuȪ_YNYV7 /zeqz `8zf})ŜeP_Gڿإk- _ْ2t7:)nв qχ:s~J.S[^}D]ס}u+P-i^YOf _umeAyMzK8(kjK/w3o^AUJq)/)oY:-l/|D]>օIelj/Śn]Bm0žN;n+t@΍NXXSS/@,<@Y$Bd%ؙ(js) [-lUl9KӞTu-$օq&ϖ]QhA`*ғC]{ƓAw@IF$l!/7cTY=r>IXCU"I5`fU3z͛<{ƣ%*6lӧns2Ļ @ހ{2ܫ֊čs`]xN кRܲ݃u[>Ww\'$ aK.E&G܇)_P I(}^ϱyX@D.c mao8kilυc\̺<>hqkZm<>)NkB*e^k; YGn9k/%%Z$_>+$VAy<>IB]hվYR^'"L$ B0d"VFh;)hۛQO-@$Ih9(D|!5B("‚;%ڜ twkuTed ׋yJ`2=g9^Z9MZBZ[&XME$QJ;Q =Ćx/h*7P0fHBO Kf%%i% }4KrlyL4GKR,p\QP,u u/7;<};E)2r͏㗽T0. KK>Hnb,Y[/ 1ycT{b7Zt%x9q 7S6VkU쨝n+)hb[A-D:)d ?Dbw_% |U:7Lo,>zIg߼{QZT؟3Pg=V,ۯz:e $@ޓZUV&^ei'毙##̹xaoh2IHa]Q3jI6ddžx.kū,Q1&/OBBVlX] [&[9Vpt>=k+J#IN}^:=9-9^4*2|iDܾ4-d4c!4u,[*,.Cuҷ#7m/tӛ3Yl6ŖaX F+>Bߦ_>܏9Y~zk@:ABe]52Oɩ> J |H9/d#PvH9)჆߼}">` X $ dXb\+ 5]#۩)KY>g\rif YB.GHm69"!(aogX :(D9HO32䛰k 1DB%!K$W PLhH[vjғYB(cV#:A$D@2&\[bN+QRTlm"K 0p [3t$aMu%r...W\Ϊy󦋋(B9rԟ'N=Ng]H|?3066yxzĜ.ér9.((z)444tO8Qlb#a𣹣ţGx< -O>m``CBio#&#c8&8${9,,,5 q1c$&6H?u֖ŋ妦^^^}&$$ZYYEGG?y888Gk<oРA헖>|PYYyȑm@:...66аկx={!ϩ?^SSCưaQu|abb訣#>ϏNMMr}8p`g"""RRRѣ555 n;.sΝW^D"331c(++ӟfddxҲW^M<{W^R"4hP _~e 莶¯1F4Q;J ?MHHظqō'Ow8)))AAA#GܹsDN:uԬY!!u__CEEE{5kŋ5rbccl۶mȐ!0ںu͛7Ϝ9#5hggGP$m۶ŋcؾ}IVXd2 yÆ B%ׯ/..Kv+**jƍt={^Ã3::zK, 'O~9sHO³gFDDSKرу;+g4ffZ,7xqÈ SSS-,,\|$I[[[OOO%%ϟ;wN^^~ɒ%0o޼{%$$_ܞ*ɥKH477UWWONN;pVZ%Q[QQ122ƍ˗/?s挱1U… BPQQqذa FQpႌ̄ CBBΝ;f/_ ±c~ #///<<<##믿pe/^,7n899ׯ/8O4J˗D"''''''Օ=Y & F!q`L&&"D5R8--M]]ƆzgϞ I]neF`{JJJߵk޽{=JΝ;UUUvvv=z&:uppرce\]]===.\?3Ύekii:u_:BpQ? q߿F<{츸8jV~~~WM@@@|||XXԩS+(xxx1bݺu;w5jF[=R]|>Æ "ロ:u*Uq[lWUUkbb"A3fdgg+((lذa̘1Ty'0(8 |>d2pz$A "DB!ѝ )糾ƍRV mmmALL U积ٳw.^&LF997R 3p9~z-Zf)P% ;vW gzf ==*l 6={ݻWPPꚔ;;;G/iuΝA p(-##sI]θa8`ezFfߔ1AfVγ$ ukKHIj簡C\ɡd֭۷o#ɉWQQ=z4ٵ]]]Dxss|dذatF򆆆ǎ{iYYYuuuee%ǣ+8;;8qɓ' 0443442dOHHszOJJJiuwwPqWqܤ$%tTܼaḈ 3sލ԰ 1nJ†86MCTa```TT}}}jjjT Gɓ'SSSCBB&NH%?ƍG7>Zº:U2zr;ٹ R9@*//IUPQQ9vΝ;V0}Pj5jTKȉ˖- 8t萋) 4 kX?FqƢ"[[ە+WZZZR#S灁PQQի;wƮ_RKK ƌ3|Aee4مEjXQ^^.QKƉ}LL;q:w7M)TPf$) ZXfM5b*+PCɓtj⦏$IhXz54ҩ.Q;ZB   c⸎۾F$AjC՛$7ʈ/S[>}\Ǐ߭e˖8N+RdhZ 4޽{_8cƌ.50L$ >q#sԩm۶eeeхEEEE\/GG%KP-Z۷ò瑩}6dٲeeeeTaMMfiiVVV=z۹s'A=p@FFF##ٳguVB%f64׳:yF,&knyEYYG)))f===CCC[M*==9sGMM˗l6{˖-%|򥒒Ҽy>LHYYѣSLa2 >wtt%'''PCCCidrtR b >pZ^Vjw&ɥs@'wPj+]R |4R-{:#N(< 9njIpY99iݹ8f0LyɳIE"QeeØ"}H{3WazOS]ݶv ==]gW79VxG%}݇''M B@(5<>HWUU, ?b'(3i\{ ?&Q^^a*`@Rhq &%/KfUW[o'G$a &% uCa4GTI  DБwPxTVV=q6zGEe{y)FGy({+)[Z􊈌v3CXB~nfuc\&Jɾjj>C3 /Oя>l6)Ko!u'Jnm=Z2PV,)ҐqhSSn]?X1dӟF-7^?^~JBMqL7d^WMWw'06mW b@sU0T3'H+E~dnEs}, k>;^Od_OXrzrog7s%a ܩ 0n~h߾ͩ]Kuq[}6ۤ1n-.>oܽHsqxOwq7^Qx~^36ޭ9vڪk7d+"m[KlEu-fY!jS9әùG$iاt2XruIU6  ڗg|lTJV㵒yYK*õvqkG2NI%DUӬowh(['1+FJ3B #^^ RU!Ou<9COKUD5ivD3p7[$ EW:̪'9ˎJ!Ks(o=ҶtPо L%Sve*˓WQaƮ X:ñWREu/B aZMH(*9[?ъg~٘WkYO#AU7O 1n3j3pՖfWWMz.<!nn߄\[iݨGt)4O-9oLC|<}|Y kLվ>sUv˞LO͋VNnPoW xU1Oolc6$I Z22<$IDATc5_˵Y~"ַ_RTxTu:zpA2oW;1Wo]$}3oͺMzN}' _3 @B_$t5ZQQ ==s>ٴ n(·TVV@Uuw{vTjsnÙn?6"!|pvv:{B/SWn Y~ݟa'> PWS<|%n B[᳂TLء/Jb W# |`DBg'zI㸡᳧q"7MLBH$)+ 2F~f:m # a`h;˩kroH24(4AW(p** $d2r g3n~' R$r>% ?m'c8 SSW7e&#+$[ tbX,V2|^e0]s7BwG4lf)v݆*B׹y[Bu xCc Gg7 t5t:@B+I㳳2=D@5 : E"-BU:IDBDB&]>,!g+mIENDB`fontmatrix-0.6.0+svn20110930/help/en/images/extracted-font-compact-encoding.png0000644000175000017500000017025211220414321025771 0ustar malexmalexPNG  IHDRnENsRGBbKGDC pHYs+tIME3w_BtEXtCommentCreated with GIMPW IDATxw|TE׀-wBGP(`V&*6l ^W %W4 Hi (JS%@G͖{Vz^?Ӿa4i=ʶ5|Z0fRXWw"$ 7-Bxn,Ua>},Q}R=l^0BBB #$4aK[w2uW?O6X;xdC @jt/ˏ RӯNy-7Rs;,'ٻg>yu6w~gI*M[oe8:G0:Ğ-l+z8︕qz<(d_ywZZGvU)>YLvj]Ms^}e -~S:H>"}?B{s]ӭn2 "ʏkdꕭ-7#tGU㛵]>&jKy|]|5+ϿW2ӻDg櫢ZOy{lv|ͤzWɳA0MSnFQ~!%qM7!d#8諿g櫂RsnĻ{=6%Ej{zv3KKXd(Z4DM$P}XZ /@wNݗ¬X "}ij|.*"o<ԍ`Cl!t\NKӌ.@1 0J[~,:v@?,u?/fMo^@ӈ3mr"D :BwWoJX,W<__ܕH7qW;Uz!KcCkرdMwO(WLVr?d(]2ƙQ@0ﺟ۲e {B?` f{͍7Mwb˿OuHŻ+_spأˮ`Ѣ\El6;p( Q9õ2_ի '~ ni !!z,Yڵk=XUT:~I8~< OWQbg|? ywhm'@o|ys'i:n-A^穒E бtg5{JMXj"(/.!\48 E"!赊CMH,X0>ƺΑAFrz<ʄ# . ^3:',|qٌŔčHl2'G-kׇ~}odL64QZdz>sնZWyr te6/2ݢi6i6e^ z5,n+0[\mAf ?h(W=͋3' Ϻ&#GʷoT ʹ/t!^;]ׁ Z6khPeKԏ-%ss Su\|'w_OŻBm=4u@}r 0,p]ڔPzʌr {C(ؽ*|\ı"v!eNZ&Z?Rq=m#ZF)N@v.m#NqZRvg..>g1KgQ&[WN־oĮRX.f]T`AcXCHx8v`aFx-m|O.Nx;38ZZȦ3:NH'}Γ*8c4@͎},~m6y RU?1h 5&W|GHq?|jUqtXeTl4 VT6aGl [޽hڑFeE~oڝ+=|)G"wTg7CsŘej_9y[{/|ߥ-/J#ctU' U:_}{g5eӵډ1^-%F¢ nj%t'޽zoBf͙6N~{-[c3opQT-w}˺kÇyWtܙ9ĹEXa?t(,,wNG:iGL~5\=jOjeFUm?Evaĸ^sWq\or1H+GLα\2ҲP!m+S%KQm>.Ǯ>ao~!릪r0T^t#E@T$-"P '1=^~x,b6T'9tzՓ mc6aA`>qM{ <qo9E.3&q6+[6#2iQ#8&o;dXޔ0alq7sY*GHGlrX1avU;u7pi¤Ɩ|" ڐJ))І y?oiBh#3ՇA PoMm#4rS~U.~N i.HfkLMD ؄p(d!݈VtpDjYy{1VҊ*=<1nt]ʋKq4ΫzsWc#G|>k^ rا㜟叽н3}J[~**nT򇩨S{001z_w轢Rզ?@e{[wC|}7,E;ƍM0ۭ=W(?|fj/\ DOuXǶs_X/Ul UYm|5Pd6Sb;W(ƍ#~Z"غ5!,;k+:W^h|)EO +ad>ۇ~Fp2+ǴC=g/ь|^zz(88X[9TnF-PBChPРJhZ-'X+VC/3}TtŴt" Y)p nK>.pcng^6ݹqjވM| b f[J8^ЄW!@7!$nnTk|A;LDf_L`ς]3mp*߾7$N^B 1hݬ T>^Du&;8`@ ykmk֦sA|ݸZ K/p0L[iSlgUCj+:r<]ڔXu H3;ycz݈!oʗ%XNqLVV`r.]0s w|.17qQ'Q'~)9<0:Sbƪ΋k4`t~(oomLc T* !:NPg?&\ WZH>^'`iw;p-@1?mTu-gϏ!q$W-lQݭꡌOq;󆩼pK۵;w1+y}?^J}yBr퍫ۗɣ.Pqط+{.^&~^ɪk^'ѡLy!6)pw^{07j7k(`2h[3zukpZ=r8UTVƵ68,CY=G]p?h`51T:fI :,hvDy-zŵq<΢huԜ ě6i,&S Z4,ʱrBP zݝ`6Y0Y,vi뵶 :EA(hZM8o ܪ3&^u+e̘쮣j4qw~5vya1c2,N7>"}D}"GҗjVNk?q<Ι0ιgLnMʇ8fQoKՏ1[M=X3&f5:z-nm?M&fQ%۱zs ɳf[wrpy~m+ƽ\Thhy5^8q%]1WUvDKU1Ue%l7v'nWnjS9kdG"H$:%r$o2qa\E Nr-91Y@@cfeQΙ=d=+o(--BG86`^XWy_+F"H$:3 1,q(Z=zm`ّuu[jv@ 9`.3m|Ii-{/+(J|6ǿSYϫASF.N<%Z"H$ASEz:,PzKts[s,WVy,5gmLdfN/hy*QS=6t2H$IvDrܦZ,j$D"H$IPh4[AD"H$DD 8[$D"H$I`( ޻!H$D"HhyD"H$$y!3D"H$IPd8/H$D"c87Ǿe|w.bL~tZŷ!.`^̉crwvelz+їX'Go?N(JNN[Z{6v [־w =}g.{/JmQW.uJ_պk2{@[}3{ŗD1ⳃ `[^I$iUNյ䚟PRRBII &J׊\NzzkzN|>, |z]lf~'&!G*/ُ̞\j[h gv$oĚs®<?)Éџ>904N:7=-c˗p¯[`@'<8q n/u|U2]$t+҈ϹITWrv-{ᦪߓh'¶-ğdm%Mȶ$䌈UOUЅZ k<<2P\96Wd\] wqMh2걕*ώ=|3ul楑8m**t,\mFǯbP4kև3CݹM:'2|г3-c0MJ/N^GUP]zEP;N}eU2zΎJwc}G*֥ۚ峣 &t^A iVUwm.eUy&j(D4hNc M,Uص'`9Κ.G0Teu[_R}儭UŊ=?2\.lx>oB¼x4Z+O=c:*Kۂ &6c(Ř_CFԺ}5".4߻zOnY/u'NҎ s[pMЪh&lޣw}+?J|U~*2v( ?w PEv`jj6.,Egdz'˴~#*E\|4!tuNeX"H|婇)ʼnew;ļ7%r\Gqgw^Nlɨelw~mä0}W[?A=MGˑe }[wK,?rTx9DZ5|+dגl{j&'Z$, IDAT׋^d;s3~!l“Gx& WmĬxgņ" ڔDԧ F8W_)(9ADA½ɳi_jY(Ui^[#H۰2(> }x~d.-?3dS\_+ nd ;2&2^ϯ쥂bOJZu'*ۿZDXR{y^=e.|`O?O{9ة;vvT'VOLz4Ci?Dǹ'r廗Zw!&BY {+L\s/gOC.]atNwO$~2|62Д)cKbA=5)|愇ނK䦯Q[0)qqmZC2a\w}th4/j0:P>&HJCaO~ƶq>7bzs7{t[vtkޒ-0Db[@Һv%A\hPl?(Jc- Iui{ pz^s/#e2|k7-ۻC-ҧm7}3Pb9=e4-5j||5d].GJ, &NMhju 9]\l;e>ue}jstmm jIQ1wuW[;28@qd;{e#cEX|OJxaQ1 cK8K+5G ^:_ޟFz'KC`+ڍ&$99|s/H̫Aל _I^^yy|b V7NxxnYI͙dw&Rxv4Yȶ49S.Q6F.1U_0#P4s=\l, aV41PPd=NWr> (}$#o"RڻbUOJ?ẁ[pKr72(M¸Smm.'SPvsݐisx99GLTa݉ĵ5D )a>ݸ1f6ٝjϹ.yo|{Gߒe=3RC'&\یL^} c\ꮶvlFh! a:^Q~eVӌ ײz.;c'Ȓь6O Z›uִn݊0MeU!NKº}QEZ.Q'F4%xuGc.xy(909W-2oߚFz|0]oqg쨨C[p!q+Ov ^[+}wvq]}ޘ)Ob:W}@T \pG?;_6Zնۧ .jY?cW۪?W~bwK_6y54]ЫQ_6Ǎꮶvy$}ZZwܯ@bB>i_0|Ot{>ڜښE( ך?|Ê꓍{OmVv龽RmB[* ]hyL(rD"!>iD)-k*[`*+SVa!d%0?dkNB#ŏZGQkj~}-dq (le@+ߪP| 'LMZE7cnC0nMtٖb*DBzJf ˋ9u -\a+ wQf)fۜY5+{kOn"yr&ؐ]h 7 ikiw%Z-ЭtXfڍ9'>ֵxf^ށų5d2z)?SG߰b8ZZHDv9}|O<hjKw[Y+/oű\/RF&g|d4-xP N4˱ #,,kR |Rrk!/O[&sh#'7ٟbh\D"D'4'~:N}e⚾lO2RSSwTAӶ[>XMOn×_M`ǀ`+5's,D"H$$HP=GҔD"H$$)%D"H$AgM:Q"H$D"4B//H$D"-H$D"H!yD"H$$cy9V"H$D" Z4rD"H$D|BiD"H$$(yH$D"H2yD"H$$hyH$D"H2K$D"H$`D3/H$D"!X^"H$D" h^NH$D"H5`%D"H$` XD"H$$xH$D"H!:EQdiH$D"H$AD]Y (RA u:HR ,+t}#3%eB#B6EKS6 'i|sXyr?[0mB JOΌ__&2~<u$98|'sRB( 羜GER'mIDNtޛ+F{Éj{ +Oةw10Ypå4#29&N6Kc %9Nڶ̢>)\wd֬])0TOmW1QΦGд4ZR۷o'##k@/rL0Ys~9KIڶ;$f3yh<1:,2xrvSܨ1L4(^A <;ؾ};={ ##t7 )+C\ڳ RX%]<|J+i⵩:ȐH:]t?.:}>Yu27Xq6VMg~oΈN[ˬ:fv|VWHg4h1Bj#-& i/s_kU ܝawe9iuc?QGqhTyWBSl AQbN]<ѶxzD)(t4!d}`g2}+Be?>Jٶɼg$B%>OZvjeCAIg 3ײ~Kʏ~n¥HU?bkUjޓ@m 7-?AV*{M_]SSrs(}ym{y<]bu|ĉ/I֣}bn`)3>>4/ZC_&{ͧ'y+^3; @!WbLNkq!qx3B!Q|s!BŐWc&!,&4+VB2c3/?}bS mԕ'D%%b3qBG1!mؐWپF|XBQ"J(B~^Oŝ} "tlW.jԑlVa.>.jdD~v8X.: K+P,*?,A U>vV(D/_ZEٗ'5T~hv<qd0M?PS6,2n~*n0P58Gۮ&~.BWeM4K[PC_#&}'Y֕|J%5ׯ;VUBbz{>N?gb+EPKvl]PSG3faU409cRk|Z>v~tpXcBBĘyGEQIcM凌DvXp̢,jJ֦~ՃIy{POTs[b.o4Vd~nVWblVGlExoN&uU#dm۶Ͷ'%%9b;w|D%(,6w5E[+v)p1~эMo׈EBa^LDtz0Gb8Dtے♭efձ}"W\VmG]$t1[NB$w;s8" ݓ >`{٨o$<|qi(Rb@GAxȾ+[9%VLhlо B. =΍OG+~:\hlX$LKxDR82gc ?N5{iAٿPXƲڠ{yv[wZfP:'Ҷ/mlsABf*Xjkt~uȧjcndֽ᥮|>Vo=[K2ttgBl[>f [W-u]m!t4i 伦ց"[5#2QmYu"FwPJ。ѠzyD:8^Skg~q:EZ->}7*þFyñ~d׏Wyα.^rgv{{e)i}t2q^!֕k<].m[uj 9TʻNTMJ:;qo4zYۣ>0.Qۚ iOdu!ka]*~klOZ3&޹&۫}u٦婦C4?i佭}4_xꩧx':!\,Mf8n%>]'_[|},gl,>lV; d!Ǹ¾tЖlo7eS]oD!KXOWK6!IyUgT4Z 3ߍ ueo5Ԅ4R }eccǢUghe>پx=Ep 'Vk˄.Cy2}E壹7U}G֡m}Wf}YWkqejۭ:}1shtܝ?ҘfAFmtZ]]tpψ c\0zcfs;jW;eNֺ ܕ}CԏT"N41v}O<ǚwxiT;,\=s|d?N/`7Y̙ǎSqAt1=y_nh1'g/#wvo[wo>JE< 7 [w'3alB& V&w;3Ъw+ߋڼGRXfS=f4aाe'BP΁_wv*cM/⑩񿫹Uk+2qK{5lۇ\Qo< ǥ-5ׯKVSJ>\kqejڭ}s_bUv|x};Di)ceݟn_띮]U@T?&kĹ@T_&5 DߨYdU}CԏT.vzﳿmL >tԱz9bz9ux@{M8Gw{&t(Bs[F!0#vZH$vƢYnb#4}'߸Y mV5?Jt`Մ#sDbhE44HLv5JG{Ym2{'\-fê<:;Xoy3!*' j)tU>r‰טATOVW.x`JTAhbD4zQ=9ț BjRu O(;PǺbĥ/!PaK-sm?xECq"?ʨZ> ޮ_wn%;ĜCDdLKyTڳMj2UA`|,g?fYxw>rŸ_폽ߤE};gܖn]yzۀ7w9UeMײ֦/UY~f#>;;tbcc1J$g0sεXQ IDATqqq$$$l̝;\F#$$$mmrr2̹dggK~~K?h4b4H6/撔0EHnn[(PPP[.>~INë}#%%ܬZ[:X8QPPpZꣾꡠVIIIjOCCC/vX/@dff?$\"..ỽOgee9{llX eKm#miiiA?dfft1cF萕Pξ~c |Im6q@tEh9VeFFKVV撘hr#wѵH$ϴ&%%5L3w\ʢ HIIh4ڞǓT}qbb"̘1le˚瓜0h$11$::t呗gwܼx? y*[m'>݆wfΜi g̘ڀ>33{@/Hf͚e;[0kбe)))69;w.6d[_EZZZaM 8֛6d㔙i~^`g͚~\y̝;ֱ$RRR 77T[L؏?K$X[}='L]gFvvm!h4h$???2ue$O[YYY &Se< OgggφX:6H]j6 `=djjs#iiids%##F6 :|:LّYIHHc% 9+7ljttǶ3::3fT\dֺ/s]Xaܹ re}Os'RRq@̬~p_٠{ g[5{G ojj*t҅ ُLMMK.J$Auu55AhC +@FDm媾A~~~)5:9O' SFg hҔKm^{JJpub}{rrC$x|aGEM9#233ł΋OsL}]O/a}ȁ}f̈Xƶ}Gd]#9.eVKMM53gάqo|DRynׁ@q ~0 `_ d\ -SW dU Е v>@|QߙJ~~~wg:;wmyll,,u2iZZZm^qdF#)))$att4dggۖڴI>ͯlPXsc{&| v2։qqq.kҧ+%wȢIkXooぶ h$99m|sssmOՂi! {&++F9T[\{0&61JHH //H$}0.9ԦqGKNNN嗭ZߛOmOquXm!++˫L}@__? *ڳ!D"98gφL/v, BCff&㵃qҫ]^^999oBGؿ +`gj+yDҐ89Wml's:,Ё8cƌ6UU'/Ll1/O\qiCSdj^"p%E BgҨp.ix=+_Cj伞Ú4KPz"--a8Zrr2YYY ::5!!zaRR͔G+N6IN]3f̐|дiSU|N1Eflyh233fe58c^W}q}friJْѓD"9]g哒2cm0/o011Hll qlHII9ٕ]<VKSA=j\[FWj $؃@|IK:/}?f K}~!s璝MttYo_*U:{nlF@ȱuOBBGfͲgxÆDmwqNaQPqUA xj&^?z&{%뱺k⹞lx&ޢ$x$rT'NO3t{[^@($I^һ.Nj2ߝR?vrnM䕾IiO\rnQӪ:jH$FӢLfI-u _ɪK2v+&~( 'pK4Nʶu'0 Cj"Q3 o"(nb;Z=tv)R.- a7pRV$XRԧPMʳZՊ`)es) #ϻ R͘薽PGsxqF""iIRhoo/ސL&ݎD"hkkCKKKEx,CKK %퀙WB$  JxK|>iGWcMR)_.{$ dؗ4sꀶ. eYrU}ʸDFy<("4c}!:HmD*Q*SSA0V) erd2%9(phct,@wY+a VDb42 ٢zekL$IylLp|+pc`C`uSRr\I>[@y#!?D2*/Mh$`u! 0$^5%8Ah>'zݣ`uG"B!_~'i9%'Q/R"DQCMAi}:VƐfuV8LH%I*aԮ~?_rT U'5(.pVrڊm%(9\ ssppppp cl&usb rL&90ծ(p87^lH#8̶w:<I7|0s  сɓ'cȎtW+r;&O#GbBܽ*x \.e2p \WȠ,ǿG.~8 Cy=Hg'ȧ@u핃cs°C~3ч4㥣z8 掮oOIN|%f;U5|E:X 7 ӄA`O⿅Nps~q-mxծ̷%c4~w:&{Ȯ8hxUuNxw۽nsxfxv8c>07F`Fث;NjgtOcctq:w~.:XDzq֍ #1J|w [>zwfxkq|4s}mx=<tF+#&M}HPd@߿'zqu!4q @bȼ1_~ |V=K,>vxe ov% ȑ$2`;/9{B2q}g]~:PON_ `-~_G&Y {.9p~>Ӽ5vygzBzCއ'TB')n><`BHL!Mٱ i*YEses`!+~2wJе<Hk\v .^M+!]+䦽@rW˝`p<H`rs\=أzëגqAw𧮆ttts璥~wi6]?;GP]?[Ä<-_}+ZH'܇ܺKp B7|;ᅻ߀q̰:޳i΍x\||!3uo-r޸|N}g?ĂEs1_Umtq~;W]ç܏#8z^ ρ.B>a&gj1OЯ |-_߱Ȇr}$r*9z=;]Ѻ<>CH`#vv|Jɿ/Ðw]fpgX\2H?gGűPx L_!gPS^?RƗqΛO_[_T152Ȟ( +4C.g,3% Ceڮ_!ɤxWϾ45t 'mA~\w\+~~8m_`u {xup|0Rqk+@Q=7}/>1~^}3lswˍ=,Gs!xV2/U~-bkC%|5եЪvұ}Ud>/Ӹw@?v)oU#p?_xd.ָe5;5 F&+x'g76 Ƚ\UB'=[X-1u;cz7=cG-ܔۡaH D^ی Ⱦ%V+(ـQg 4R k^:x.:&NnwVߐqkoc}w.= >ҪKDO;n}5^~!z?r*yrLV]/ëOIJJ8ޞq<3]v}oѦ%1yI&t:>BH?7^}jNA Wa+3hۮ)idlhwx텛dfe+/W5X8gaqn[H ?ހ&ƈö*|FX5m.pfΙ9'E]X?9|pq[b7/˧~pU0dhH5 IDATl}Xr<—ky8 O,pEyP 5čÁGO"> 09*K[fߌ#wĴsO=RlަT]~cLD0^CXJLKc@vy-|34ap}Q{_{:n^m}?oEmvd{-ػɁαq:#4co8tna[<:#ߞ)tq夭ݿ8KiLxgKihߴk? ŅEq AwhV[%4pXsهȾ; $MmqN?A[X`X:E^rt B[AUV2G^ҢйcTr-Fjr)!{ߓ.ݧ4pW"=0q|:;wܪg䃙@qBpb%޽`xb|o[/.CuN#z2p \. 'OƐUwI 'Oȑ#1~X~;cŃ3 {bK?b;O^88888888l8X=^ ˸%XyWp#u}='z|>;.|]kx?pppppp8O2p \.e2p w3rSmqa#r8I>zpLn8UMg yz+#/deXaԩU?:$<f\.Ewl8888t H J!J!!֞BB`軂 @ J! ˡP(@xOw Z!Sq DQdT*X,h4jՑmmрN'`Q!I|>`&1A8%ʗdJmrDQs "~llQۦ@ ` z1.IP(  UlEQ$I8$ y L|>[3lI5Bf٬-:rbq@]mW  ?HYmFudE|e>Ftt2_( JV\L``vBf ö@ P\PdYF8v$!rBH$%2r9R)p q̳U**sV" $IEZ(~5H @eGXJFA-T*H$H$|z$WP( Y-%]J[T(ǃҦXz0jGJ:X,f\DH,ūrKR`(kI:g p8\#*}DWqc b$E >d4(>^ga- rIy|>a9C8.iK:.6-Wإ Q;Dђy 2Xbgaxw;]d0S6eeG=n͖V٬6iʾ'I&Wʱ* U@'L=wu b+ u# G$ǃ$I%ܡҸ`ٓ(|$IeGkTʧ9LZIGj~g;=> s%KW/'sέ,]dT2L&e*d}zqFvT0ezȼ҆xdyzQ&GVʩE(I$JŊEXrP ?mz^њE+Rg22jd0SZlI˞d|>/b;ԋD9j2_IG,c%xs立w|GGGէd^u+^-H$d<٥[M^hj2*ZgvAWG`4ZA橭PFL8FMʱ5>kYW[4̫#J$FsTjsd [ʼn>X:| 'j",^cc'X6`e!aF#e zd2U:fF+xVxIA;dG.AL&24" Jw~B4-9:jtjmzO2XB%MiZ9u>h/tR0RV2ٽ "zT$zrJ("ђ2dvXJ(*p88yVq#E26=0c,(߭6G%"Odq%).M&azW,voT?= &-H &k"QD/ԟM$pڗ?|ɰ%EJZ4Ճh4ZRo ˈo(̖h4j|HߚKBFQUS8T#ud7D>[+_T3Cvf./ %JY3-[.34(݃J9hm`NCw(XZ<=(Sl+kFF_S^$ItW&mgAfâWe>ov눼U>uԪ$xd^ip[4TdYC7Ur0WuC-D%3v:guV}?OrMBbVt &bf/Yi_ N&l8ޱzc-k>ccy=`u=hwXUɵ*:@V ,ޭ9io9hiiAKK%וshTZvwJJ"r2RmMktq{d%LY`9Xp\A  D43P*k*B(b6%Nl2ah j+;/~? dYF8]4ztNCRՆ'"ޟȠ(urWBzߡr>WKP@ 尽lԫv%!) iDxy@"W"3LXKZ;,3/hT?Ua.)[\T.,˖ms2>woJr`Wn̻+;:WQ-1JɤC8.aTǝގt:xO%Nl/.Ӂ@BIoqUڔ*T]:i:V"njS-He$KIBZ[[]gL---/u>ze @ ([`#vvMBD69۬ڥJdz- ":T}(׮4.eSm^oOy0 .idDO}#Ҏbv~yh4 χRt~ ?n,@jGDѪ eOQ{[h{d2Ylמ&C4%(De"rY+QI6zlڅtHA l(/}dY]5nykDl6[N<|=2R |b˨ vHWIT6a9Ƞw2njjՠ ZZd$ |N=!Nϧ[Z}SZA74bӫ#ZdPyCTHAΝK^@ƏK\ʲ+j-rjɕ=iNBL&l6en#2BAj9 hkk+G9PݗzzћS#'l+} :~Xԃl6KDQ$Ǚ?>cmW%$I*>dè ~@dYd2IA %|v=|>]+ڐ]zNcF[%C]i< e}* {#IfdUt8.Տ%lbD2_@N [ ÚHdY&pDQ,% z h!pY)cL[|e>_keN(dd+Z\B/^e-3Lٮ9zuJ|iYm\bP(kŊcB(ڐpنhFlL̫#1Z4ժvBd>L HdV7(hկqJd^mSh#듁5WFuVyL(I,$늼6:2>@ee1^Ijz= ̛aKz`0ذp=0VDs,Uǁr*"[7x<ȼ1ktncȼG7|0s6]դq)jo1Uz\j߈f@Wʃ(PM'聶_iCBAPǂ>Rq2董2(}/BY{sC5yxpo2{S—ܨ9'2z<@GG&O̼ J wEnɓ1rH7͍7Ijhl7`dbw2(m>864.p'ypppppppppp؋U +ya '6YvRx<K<'Vsppppppppp،ЛO8Irp=lz0\Ε2葃p=87q=8csXw5\u]I\.e2p \.dCspppppppijCzlM GJ8w1  n?{n|n>ָdtw`Ʋ IDATIصFb.߾o;?9ӝ<3v}7-=l?<Ň,_='>j8>?~wL,w`OcOŻops.((Ç}uw;u~yW x'hˈ^ya48<6;tzvC |(-=~Lwc D =gTo{80!4,g>셭}dr>#yxtv@=4o|/}?P޹x98HdjswVH  OnqG o/OncSq?။G?L]Kҥg&c0v}^T鿫!O ;vc4;*;gtN2셶CNM0]3k˵>vǞmpb` ҡq{_=|}vN fBpayC´t9! C nMǴp58f/0`ڀ&G>J-ut{3$S/iq|?#~6~祿ഋ_οKc-nM_G?Zމ_r-igȌp ~=:Wd {8iXUkߏ{aѸ'q.mx9ofl[xa>i g}_@8Ў-ڮƛ.nw~q":>|35;?@ï;8uL{0h/[a0a8j¶hNUc{?cÏN\{Cqf\Rv; 8`*|YNc'iX cc~H\2 Kc5 ŜZ0WqgBv|Y0Cc]K]`tp2O }u;.| s?n_|}x(ho}\t>[D7=m$s|ϾZK}; `(?pS+fpb_s ̓0W܌{_~!V-Oi4쉾=YUk'r WߞHcl+OW`{&'7@;1?4 #Z{AwH,w"o 1^lU {U3qcj\ث|_q8t]yaG'Tq@ BTbx O>G聭<;|4<'K#Ug/C[voY-$ooiGca[a>S?7^W$v pE"?z~3?EK3fO?/Eq1wU`_}ֿsNǟƛSW=npzv{|<˱r;]/˱H v*B/{}7J?驸WS0o0H+[g`H| >s|5} ח#>w.+k'c';}s`?5G0k5%M2=2YlY>8]Q#e;#g [GD&%pXMD<0{&s:nVbׅ7`ҭgw¯2]p|V C|0.Շr5mu0w8x1sh\ E^$2pLJYFeUۑ EîaKWZ[=`{e-sl=T%:жFqt^~HO8c } s%KW/ Ǎ%#^`\T^bi-L$/U]aKTsDYLPP1 P( J1WT(6xJ$H$eĂ 7QA,({cp9|EQHzE9X$I͈S=WJ;; rqkp~n'TJ;zsG.h~UZbI|=}g%?-"rY2ޭ9mvVW¼^/s+"ftX2+sAFC̊rWjyuZK&[WIӈ|6-)At6$ɒ~EQwȼY!ϓh4ʌ+#ajiMۭ}w;OVGdMfxUKo~"Z;-Ȳ|GP-}?E4R]9dn2o4 Z[vHޠdژbC6/Dnymd K?hM%"xIﯺovJ=A@ `HV;lc%2iPV"b`ĎDC>Jt: Wk⦩$J8bbaMSJoRJMY4mhS$I2MN@S=5؝+[~ZEk26_++kNH +(Jx%P26ʦji iJBPrn1fQŐ|H&% ;2C.;M4/^=W'j\`cEZJo|(2 QN.a)gMN=lW#I$Nru ]F" k.L1Xcut(X뉤 51ܨWn"LID zzk<F@]o[Yh;YZl_9ƍ, Ɔ1B +Ȳ츠#ȼ[Njq)$ILLt8U\j b*YV֬hT7#gߩWh4 Q+V"1#F-IgS/V()k#F J>YFE4U…~VY,ZUXxSppxdލ`J8B4͌H`Nf50{2:BmBXX~qS<oX~v*VDZC;PbF -y9ezusOYS9gA~'1uԪ ͛cgɲ\a1Zs hmmme#N;)&$AFĭ%v#HE^oIH&U6cBd]КVy=<)$l@<%oJD" @G.'״9vk+h ;SlEy^D$3sbkAF3V$ϪE~Bn"͉|uqƊ~LҥzED\+DOt~F Ys:_(*#V](a6WNZ+ZڕbcN>P2z'F>ֻܒN`'6c!n#P(seSz?y#%*1k)6JXȳ*qp h~hiiAKK Z[[]Sb%fT Q֖wʊ?3,h7a"n=g٠zYY˙hrhkkch\A?gŢjThZ-~GUR0l&)+  H 1ybYhJd^9<?lEjpTrud2e[ʈ}[[kqg"+P$u-H 8Ȑ 8:1/\8vu(!pj^?]Іa$ $ ][Lmmm ]|eXDD-+ފ9MNJsms9ю%(Z[[ zN$D`BwY5qVs^y[Nȳw"}Vj) eY k UyDѪ$ޠ#ZUkݎ4L=yI^XUB]YUo88B IDAT1`CZ2$BM 6ݦ uvR"4"$'mUZuhɌߦUzYU#&VoX jp88X,V3ɤAfCI|#Vz"D@ PSmy+xFK\UЪc`[+:,Ne 0򌚼Š>4< }Sjz[EYZrk)]tMݰ٤Uj!"u[Q\`T>ϲG=6 V~9iZA(quHEk|p{F{˲Zl dgyZ+ НdJZCzW^'mZ*!ғ|R1vuVt>HX^BN!n1g-9*}M8Kd^ϝd=׺e JR +T^rrT^W3T rVAFoM$%QyA, [db9D'T[J.(t5ow=<nY(&Z4H$bP_AIHodWUZQL&K;SP"oe ;,d,+wZpSB_kP(T3ZU'z-贳/,RTLuE#D\-RlX6ol`jTB3[[=fdY""P@ta;0AGm!0e`3 z+^>oXPy!NA (e$I+V[RYWh?DQjzd|ƴ]d^IƌFy\fS,b]2֫|>_Z#"'R Ձ]ul21L浢nf>4CkigC'xE0r\ rzBbNe|>_1ǙgvZ5 ]?/P;.cþl6T*UaQfH$wX`])QYW?>2kspp It"[9(BZCv<ˍXKcԩU?sI N98888888L&֒Id267,spppppppX Atq [<Et2Hzxpppppppppp<2}y'}SU[)D[:mS8rh{īzDZ떨ԥ.7QXLT a尜Ld&$d&|?ϓ灜d~y/@ dm6@ KQm6)K^$@ wyb)t;<?S:'̻D!Hd Hd HW`pvh1}h:چ|On T xah;|8Jz lB1'1:@  xb`Mb-M04t@ T8p'u@p(ؖ/m0 P_܁nof~*<>T=xS~[dR4n7x<x

{F$9_r+آsg9_>74eRbl25OE߄p8\dcʳ祫+wᬵ7'KaiPqݏb%X<.<]S6?s9ν5\*n; ?},qXx7@:Vݐtz,r}v\}~ g_MzhE!87C4WρS«0ݙWa'~Nsn ^òލo ݋U] Ϣ_/5XضE\n߽ +FN0Ɨbx>ҹ_Ix@hc_l/p ?نOY?5}6NjAL}kcx1Q9`!Y|]_pvYV+c,7vHCJM1S5 iC2&{ g';_)&>͸{5nx]n^a!`G~ۚ{3˞:o{32qaccE ڝ,M2Q;s?fK= mS|o;[5!l丯coWSAGqi9йKܻ_f~&{<&ة~R_+O3ؖ׳#={Ya=iglMdhE~/aw ;=~2`===U}ٲe 9otLLܭd?Co~O9i!q Fc:1}0r=1dKzn"W İm[V-[qc1$0|NH>{<ƺTOwpoă/^  4\ 0d'OC\t׷ nc wLALܣ}ϱO_Ky» :%0nݟEQ8| _ۋNq͔gJdW`cC2 .a^tNx?I$@2 $ɰ===;wn_|9Ə),PolywX;x$K-Z{G[S @ "B<Tpk'>/A;@ Cg#l@ #s0$@2 $@2 $ɰ+`=<`sI!*iSeVP.H}類r-Ql/Zdi v&ƥJy+`X*dN @ t:P(P(D2$ tww#RgZ,")@ vat6N#!!JdY^ut%16H$ E($l%$"%K{ <`~X,H$x<"1G @NpR~?u*1|6E @<ozZ=&V@ JUU$Iٰt:Mh4t:%gB)2_F$Y!BnVD PzuUUA[6\A:L<Fc(P%'#BO P(ۂ3Un_$Q', L 1|@ 8Tvk4 k} DQD"lJ[ݶw A]L ®EQr=@huA` @ U'@ ӡ|"@ !HP "l6[®fd΋tH$\_{cQVkND"B'l 䮺]w4CM$9b_Ŝ N#NnIRyUu7a2鉄g?^Fj$ɽD(#ĿdI*lB/te,CUբ[{42wDQ'c 1O!Jr" f΍D8;.?D"\~0I BNd2([Jӹ>.xu H${HtL95s2( @%2ch4DQziEE3 `(2Y(\y$Ibdv)C0,(,0M djҁzd2y%$)dY(S6d xy;Qi,d|i4=mWUՖ[b1 Y M#pAmD4-jӺOGтg{z('9>/ے%UUWeY.W[3 : ùhV ~Q4Mc$lD${"K2mKEbS52$I(JA?[ ` ozzze˖1lJdV2g4Ts0vH1Bh2o Q0v3L"&[̗#`ϋX3clTo$\*d7(6#Tj d^Ӵ@#fx Lٵ>KfrU3|1 d^fE`Z̗ =>An0'GכgH7y.2_L>}Ԫ;쯑#fݍ9؀`I'ƼQ7vryڬfymVvȼ,EyP{/EԲiȼ9Kqd>LZ2l2oC3J8<(-7ɳV!0o%<,ۄ %C>*- d|a~dnS)&U첱Z7X L܊O|"i"7}D[d Kmcx(2o\+f vX5l67ʑa+kT1ې=IY j{u¦+|i( y*Vfb;fLy[66b,\W몹q܊(6hs"|Ӯ݂Qdt#NO[id~AOb~CPDfT3 3?Ip؜G6,ˈFt5M6av)ov*}=Y>JdkD;K79B!G\x<^DQtD2ڀR겹b7~`ȼ-z 2U)"4MC8F4mQDlv zzdzty^qrn%2NՅt: EQ7&F$?ѯ&Ǚ?_4+uũS}%⏕EQ@d<2#t NArw7#ɼ~QtH̟srV$:iBe1J VdM:utt`C&<#o(xijQ X$Ѥ\E,X 5ՎZmɮBA)yR#Pl{S$CGG1* lK#gyNf2P In$ q F43OhEdقRi\4n5;`@h| BBE@Q,"8󌴑˦nf+:=O窪Z>Ȳ6̃ۈH$YiВdD櫇e8 @UbhsZi?ٹIm1<DDI>h4ZhC P\و\iɪP(#oA-7ֻ56{xނץf_lޕq(v:!H "箠4,Qn@hUݪ}&A0,2~z3<87rfdUȼU`0oL"@www^/"8%:W<mŚR@hT~&>Oqؤ*db[hҁX2e6 ܴ*Fy˧H$wX @wwwޒ,H&$[Ȝ4Lh)XkC犢 C4M[Tf #ffI&p*M1,X,D"H`0H$P(H$7cAhZ} #VD䫇\\_=M'8̧2<A;Wn[' Cww7~x<UUǑdr/4MOP7W~M$U?4YZ]}M79 ^@Ug[h>m7O)"H<5(^oݭ~yV+Kwww۪_n.z IRA-V" jɼ(:׭KJz޼-NQgSv2oET*U0 Bv$I*vVG8n H,sa Pp^DDN#9m6ԃ]6T[V>'c>H$ƣl6[G鶭ڹ(r+ F^ᴚF,7M$E},OR$ IDAT,F F\F}i0G_pI(JvrD$H _e,rBWbww7|>smt#w ;Лԍdk|Nz }9bb^YTU1$ܗn:[s[mt:'S+š9O.]f'7 P(mw6uV9`BQ`$x<A` `04Mc1i L0Qs1=U 1L&  TUede2mxk?퍎:xAz^o_"/ʲ\4>e2h֛x9;L&2 FLѦT x/"ym^F5Je˖1lJdf$,1u^$H2o^,fe$xN$*e9w<#,ʣ( SINI8zɤ|0̳(fp8E)N3FLUՒJE w&!3UUKڕ,˹Ao=`ͱDQ{vjکOȲ\T?^771,6d2i7:C(2UU9Id`Sqi4-Gu1s%'b|l93J*oBGqdH#Jh8]nd k7̗s3Y,|Ւ3;iZYU]T;#V<$IbpEQ(eo.=XgǚE k,=k΄ɓRTGU{vj+y/ 7˖4M+KdJ7[[EQONK K7'y}b)d1V_'>lL^^ v<'WPWh>y<\kxGc'-:{h۔W6-цCqTtFCN)~Kؚz<9?3L_ 8>==1Cq}ž,k;dh{8n6xxmZ/vs p}F''wa蠩XTwkfESǥgc|b߲Vu\&nWqcO:M,|V4חߑd~s0eR ݎ+֟p }%{Wqwm'3p>ǹ_mƾ/G㤫 ڇXN };?]#>]ϻgǿWb?ϗIiу̥A u?ї܋WbnH tQqf(3[Z6u:N7+ANdN+pGwu? FAzp5v x>5} 1|ј^mb`/Œbcf N|9xʹ}\_n|cm|^ػ^/-fwPmؾ1)K6Ҹ2}G8ų7? nھ߼~YcT;ƂmoknjO߷V{ϛpGK&|'†Y\_o+tNfXض;o?6-b#:{Xo?6g5 8v6f; ;+V;,{ g'3ƶn>x<>}'0ϰcl={ꌡs_'})&>͸{5nhϗ6[,{x:1[6!?+؛2y6pЩ,c}kӆe#k#g cLjc{_mbmYq=;ҳ7(e}/lW7v7vHCJM<-5]T(%ok5 ̡`]6K`gdzV>{*k釬*=|]'P2N]oUi%qc?eɆw>=|(6kQ Y\oQn%l2M;;`L;c?oZ.98샠="nZ9{ Ϝ}qqcxvįVXx 06Z߷ښi ϸi7,ދtbB{X~1fp"a#[V-}0m߬'ȃ#cѿ t9Y w.x`^;ㆷv<y;[MX2?m<{gaAòE|V:Kf !]]wHzcz8 ,}/ӫéAA(r९#g71fz};m@^<6m"g200pa%3t;s~mEU/?y02Cr,4,JaEw-^/e} 왟OMdymTAi%ycc/ŷ{w6?=R[ SX;75ڧz=^ܲ6͉-/l@SRB%ĴQonËO ðm܇GM 6cjl^{jAh6bkN<G3.ztcdz߉C?ALH|wrۺy^> _f#1g9gbѕcw`c >_VVtQ),뮎ϯG ?6~O-+z~6 `/{}3qoLUwpfu*q`c݃]eRH+Sk,֖MM銕U]H  ^0^˽Rx" ߂&L*7OFJ{u4;I਑FM9xy&09 ^{,›gVyFM\?/ [s[߯~l+_]3ko?g]}/VތfJIɎgyOƜNjWj kWi3CGŢ^AեN;^s+{iV~} j 8dz̓oQV^£[m~ӊ.*+ϯGm|X͹Z[#W+?3FWn})+Tz5h ƾG ㈿ ~{@;?obl'(7`jP~%8?avX=5Nmz[nf۟ SMP ݫE\0{&|&`B5_U= Xgs5rҿsɼG1 )<;ޛ9f{uŒ?\Ԇ0qc6h(v¸v=Ga1~m/.;8gq,] ZCxXqf^y7Vb wS,nvݳW^&n{)WvTU; {clzftr83bl<}p R lm=0L:E7} <=~*.rliXM 67z71p|xqǕSq1}NzsĈ*촞o6<^IPn?}u{/tqg[|ֵ8s1n0@ BKyl\~l0pI8Or}I@ D]F٤U@g/vP78c7o!Hd Hd H] 9[N: QnZ9Hd#aSہ2T 7M\m l@ +Ad@ @p)RBsffk~ :>Otj @Ex^x^aj'jKd@ \X,n[%^/$I,ˎH4nx<I~.  JL(dY(K G*~^&ekg\-o5Mk<@ 4^"N#HM$A\1' $ (`0W@`(HtY:EQ RDX HX X ,# Ҁ:E1ٯT DoKdb%HTjl6X,EQ)tt$CAj =#L2M~.ɰd22LKZ2hDQd ^^  y%ɪl㒦i}dPU5ﻊn2ӯ ,ҧ+q R>"IeFTU{ld2Ej7#3Y1Z[zzze6s2HCGGGeX,g^Z(BUUpY+A*d SWWWnx[]BZV?la2f!'GTUx\eVA .c$!"ɟJ[6# 9v$&l6G,~?u hzq</7}\}#{%IP@~~{>b{<7R,V:0$)o@y"B yvIF'8Rize6ic=3}F~8# nJȳbܳN- eմjl>t܌A>MrmIRyWveYnX *h4N [0U#4VU*xQX2=d2(JKEa,U+U9.=RdX&yYVōj*JX,.t{R-ţ:g[Ū 뭸q0\jѼ $Ib'2*=KZ+L&h;dX4-Hnk2,lpA3 D TU͑Zi ,rDQ̛X0>7;V3W<v yeJPoUU-$7>|n2_ʷK[Ӵ#IRA ɼ7yS& ,LL&#Vld^E"n%1)[ $UL2K@tWE~L}\ޜB5M fTt ɪ^zFܙ"d1drly1' HxAGN6z7hftՃWL&ץxMeY.cA墹/LꝧͶo^1"2 2o,oV}VB(/6NaUE*BWW9zڱ}4,%wU3ϑex.{>{5;l6%AFSg\xrQ+uYVlʟlwwww^?+B^PSŽx#IdYw̡P(V|+H4lТe (a.+jl6L4RbB^,C4uR::: ^IFB=n;Ͷ}bXiX$3by+Amd *-O2~G}>A{{;|>~# ò,畚O]s HdRэ7dY~$ HuX,ߟ"N*0~?|>hA$\-5Ӭ`V 9`Bo{&Iqtuu!JJTWD"[YPUkVФloolO,["7(BޛyuvU rwCPI-~jD~V#|"dY.ʣ{ (O4'NRT >zP7q ThI 7zK$JFI \BAM0ditՅh4g@ Î!tf{zU}Qz}J3K0ժ:$bICNEl)7seLV ^kA|ĪKGcc'$I*\^veY|>(YsHx^ $M;em$xz*Bww7"hsnH(ux5SC=F'}( $vO;hC`kJk땎`>TmkCփ~p||ʨ:hE!rK`E)jdy3rY9۩5~Z[G̻`˵|M%;Яv7KW.v|C%/Ir `]%*bqX7nqYżfs7c"H+'>4볯N^c\ ǫYdjH (8jn/JgYHsb<4F"{#C#j"<رQVY0JfEd3p2̫>L&-oշhx_ny>f%ݎjfٗsJ}^OT P+W#x^GoWE$[tZm̭4^u[K5zP&"xn wכ{:0:::kYT͆Tb."`\NҗWE(Kߋ]/^e?}暦,˺Q;`26*[BeE^탼{͆זJ8ey[T|LlZsM> ϱEbvWj6=/\m~m6<d2*jl4ok3Ƒq8+o+ue:4+QAmmR|z)#Lm-@N^4U?yλk8ʍz,U|KnL~^7e`,wv@d`}dΉh4 YjEQr$Nlq;f: #J`^0R{}/1~$ɜ ^on1 q94ޗ2 rz614i}8ĮD<;}`0of >B sγḟճz%}Ux$IlGu;+iB[_4r0V#4dGFb1G-o v:AN[dY# ҃q>;brЌW\3~qPe Vniy7™9 FH&4 dhN'Q$H9]~|!Sgsd0^e |=:qs `0m+(L"6*V?OfH$SA׷RI}njW}[xbuǼ]^ՂwU3mO+$O%񖷭+6ӊg*ȼ9镱J]Kf~Y_ɥwww}ہ,YMBuZQq=P;o \G׺nJh-?ref]VVk-Ax5P7V(875̉|;3id蟁E{3NzTU7&TἢQF.:cA]*G}ڷE.ږ>(M!N Bwu\az0=0zmrJs`++jm>͡:0x[4r>-m&NCeSKt♻@ Pl^:Il۶d.fr]eR[jTśfVf ^^`͈fLey1[po)7|kZl6G%>Ib>_ 7UUmtd|fR }vP=`IoKq:x*9 o(B4G>%+x[ޒhѨ+6*;Z8ٷ^%Ra~)k2d%13<@+[ղ,v<Ϸx[lr\կi68F*( t*wVC*5 = z8U5WSL[eHǫXSZ*iVqHsEr\-PW)L& Yͪd`WZ`~[żNh_dYnXXo P4~-R5^͖WUݔU /팭|<tAZ%`_}ժ_Y2o,k5꥔y_* b8 r?_lz~#B}f&X" <2VV2{rn$ Eaxi2 K&,WQKYL&VU՜MKoy<ۙdX<{Ad.]6UU1G䝞8jD)[Y}Rz63/o]d֗md^Z+5!2Odz4, h`3|JTT_6';|YR/O?eeeeee|>сbߟS$AL&^/Jkjjd2Ybb'O fw~R]I`8cJޡ&B+(IdlblbL8@`8`q2ľ gAB-f0***Ν;ydE] JKKt:]VVرcnj8wCĉ˖-3gΰ8PV?ƞ? C=cA޸qڵkӦM1cFBB@%ڀw ֡4&B !C,,9'\oWc*#ŎSQQQqa^裏 ʣ@QNX,/3g /dnڴɕL&{w^xEeyn:z|ӧO>}zΜ9˗/w=6r a30fDÉ_ 5X3DF4{|LJw9tZG'.\8f̘A۷w7p 6 oBBB|g?GyD,!L'<2 9l't\__A^aÆ(i.IIIVb Ly'0 (X,6Mp|O?$֯_m׿XbT}ObX, @TTTpp0Xnݖ-[FǺ/۷/44tZ FdϧO@DTvvv* N0 .󣢢"""<DC'2cN#nڻw {;1n'~d2=S))) YVQe2 "`0 &Iq ^ ロ>}… BO?4.P/AAX,ǭV+A!!!vohv 5k]$pC̊fEr L r\.q8BlyBVF/pkoڴi40LqիgϞ=h'NVkZY,rWt}٪UBCC9NTTTHHHoܥKx c6U*U gI%dtMph4&駟[쫯Zx]t~Hf8*b2͛7oݺpRSS W 7A0el&h:b֛ZN䟝Hܭ+ȘXd(Jkk={"""6nHv({1G{zA Vkgg\.MpWG]r^@b0HRގ;&N8w\LWRRbhDy͚5G[ð9s_v?@ɯ`bL՚S:,G0B:`!F!f>CNV"`_|)2BTExa(oAY,`8Їd~駊/4y#?~:88xJdzQqNĮ],X@&a4a Yv~ACCCwwD~?.q3LJڼy+~V%W q`r˗csrrL K*LcXi0&1MRPPK'x />Ȥ*&B[x1?'N}wp¡CyI& vB`0\nPPG\dɱcHS(bzňLG:(ɘAyر#4/>~q\vQ,_F_vܹ5k8Ņľ3Bd HnǎR{ܲe]ꫯ7op?p}G$jCz|n&oj 'PHA5:::;;5J?3S;68XZ 1ľ}~QP8{twwgffd7̨ƍZrB庸C[[[F IRdEQ zb6ſԩS{[.GYdZp8};NRؙL&X|{4cy JlٲbŊ~{GoXl廙GX˗kv5V!E'pRG"̙SQZv,.QP\͞1cÇ;::h8~Çoڴi֬Y tvN2 A@ss˗Ϝ9R0,_%@%bsF2jѢE\.AHdL&12D _`*j˖->=[lIfG89WZeO BG<4'&\u6=s[n577;cl?j }y]X,֌3?Ғ7}$(J]6n8 Ag4z=w]"uuu=zTT?~ܸq" }[(Ƌ/?~ĉk֬!M'AVbQ**d Ǐx'̙3(.YoRѣ3KJJpwgZZt[ ,_IZ^K`;@/XvTp9qyYyH AbbbrrrddX,L&'##(//322b1n!!!QQQFQӉDs͞=_uΜ9$ bryhhhoID}}@ pjǏ?M)))&(s˪18͛7\}J];aK&cX)))v={')},ח !YF:{"Lۈ/G]矿l.---EEE&)00 W^y%99YׇL<9++K,;tqu֭[>jmm.AAAcǎ  H"@@p8 {۞d H6x#Dl߾}<o^yJDvە挌 [Ӛ:!!a_~%A<,n0R#*^ւ8/ݻ;::h8;vСm۶^l4rX,&9ȏG]n=CDRR]"Ǎsm۶MTT,Ol(Wm.urtD!wdRRR@|(+&Y'G(px@vz ԭǝ_Of&;Oð?v1aqDR\\d2]Dlllܰa 2eJhhTرc}={8 8}ta\_ `FSѸOvd|„ #i{0{7{*f$;"#BǛ:xWX \dӧj̈́?r|.κ\{ǎ&;bl۶ Aw}E#`03Gb`HK`x,X]],RŜ7o˗a&j|>>եb X__?nܸtR߬ 3)= LpBi,'κ/BX.;~ǏL&(۶m۴iرc H4ǖb/FqQFQdggK$?aX `RRCxnJvJ2!!a$!e7+Bܬ2-_anȞQWWGӢحJj,Qv 6mZ_9MvB.oݺ矷orᒒRI&p_}UO8YzsxBP ^b_ĊhSSHa;;;kjjuEp?F;Lj}_݈ a,5@ .Yr\Ҡn06l0f̘~/6 nBQt+i87o\_ִ~/s(qn~ IvW\1cc`!*[0w0::zʔ)'O_;-)ԟPVĒ(0 KII|2MvBxyWJ ^a_p}֭zB 6gX(jl&+p0 kZ@┙;׮]9skJ$pd ME̙39,U6\.7$$'!B ݱҥKO81ewuwwoٲ'W}N9Hlcǎ(ht@=AP[[sˆRDgwjdȨ jl@|JeW]C -ʀSB5'`rr2njjnPTի{7zs #ߡT5 W WvEqN\~}ƌίiB}8 kBaܨ};zЙ)# ?F}8y侒hs^e˖+Wۃ ER#N>+^\k"dGjiii#쪪}R>H/ V{"b-ْb_Ό[`pʔ)4ٹ U֢E̙d#A?Z8U}L&d,td2ٸq<J!H۰R%O1yn0\.rؗ>CD.dݳgOzzzO'K'Olqq1 GjE"ӧ!{]';zwv8iiiI6lGGH$rlUq>dQ]'10{ɒ%ɎJM@!ŒI&$9d'--Dr㨩 04yH&22R"@gpؕkdbga IDATzٝ:u  :QшD"7?K[_uX"=d"; U`hooyϡP(ίI cu'; =NV;Os!WO욛srr^|E'E*vvvtV`^L'ZrL>6##c$N ~aL1j,#Jv'*pZ /`3V7[ZZ| 0iiiL&h4:ujժUd20񪪪~[fݡHOOwdN};rCo!"5{#XhL'O))i@%Y0 ;ӦM~+ƲȠ[I*WaMY@R)ʑޡ4 ڌ7ot_&ï( pO[Çw}tuuuPQ:;;y!'NdY7!ӌQ ( &+r:fpɓ'ΝKm3c b?qƾ B^OLL$ >7܃:d2QeÖM8qN`999.wMLܓ+jDj+0Nzb=8džRiAAl3*; 0~3g5O bٔld^p!%h4>d2QEO#ۆ%vyOcWkBckdȕ*'Ggrll 5k8;KCp}pcc۷>= lv=FAX, &R|^"7쳁`\F\>=Xz͛]Lq9q vVH>d3A1F L X9s ùP a_[/զje2Y@@%g4CCC{:ujU KHa7 }>O>Z?& s@_.CPܭ[ tI8uTTTT_BJܺ8C3'joK.P__ﺲ#d2ۣTUUM:k=k֬/r,}8`JbdžE LWXXxС{KTON*J2''穧rUnFcTTTOnjzLEѦ&b0 kkkgϞ MXr~7A?{7Ts{?o}riNB((0,''g^$$$udaW__/Hn-||MO}h4۶my۽4C+..u111=vիW#""%:dPth4R-//yM]ccce˖͛7E˗/߿ʕeƍ'Np/tC_ߟ?1l\5MT/C򂂂2222`;:::(!!+))!7,=Ak׮u]>F=AJ`0n#88S(Gٸq㳲FbEL&3gۇz ^)EG[(F(6 x7ƀ%kz8qWɺFHChlSZZENV+BP(p8&`0FѨP(233N{[0A-JLXAhƎoݹsRSSրd2PCss\. ϲɫnJ *++?[w}GDkkkss`t2L0, P( LIIY~=%mHa20/-U>V4|?ر5`V+%8sŋJΔb6zuyպ aT*bxEEի}AvzFֶ֩:SMHOZԕ"B`,nz:;; RA(AmdEӽjKKK򗿸d2vA---BLtѨjAi!Sg-tE[aMpBkرc˖-s H*R+d2EGGmz[RRX,}5F2AP~Qe^ITaIQ$:R%ڡ 0Itݙ3gfϞP RIa Im.]?~@ E/++s= J~bWwwh 'V͢ [4|ap|lȨ"B\ a8Ю* 1ٙ,/a~OS2af&}Y2L`lƍ.^o0@t_VUUxÀ!6qW[ qܬșwKgۺN-Ȝ΍ a1h%7dwt)]&ZYg4CBBz,A)v%%%IIIMBAIN`D]Dr¨)Dpuj0Il/&!'; rrry?jhh 埛W/ač7\oxgg١E"<3R0vJ e@[7֪Ą>tnB(FvtJazVU L [ny[znr=`R 111w[Nol.((|rKKiS{ f b1]sFtamXT s^ϽRXX2gz=HvN:I$ʋVkbbbWn޼mV[yyy\\r\bsSRRaa/_...=z1b FL3\<("$]hOduؖl͂3jԨ)0RpH4RQ6+41c okV]]EQTTRr06,!>{lnnnJJʳ>ަCLD~ ^'GfE+d? ŋׯ_Ow rNe}h/-իW]aJ%Ţ`?~<RɓfÕzMKO`i5r D0m ÇsΥV A W:$OLDAPLLW-JjjjrXOഷZJ%%S jkkh0 ;y /  3gq(iF]1T Zԉ.·a:ټuV\_{4y64r(Jʳ!6ɓ'{M:Ō9Tr)2D"(//o޳MqBɜB .f>6a ŶmۦM#4dPuww3LAV [n hҥK/+W0L𚚚Ag* Jr޽<{^`91brtV/-evܹvڙ3gҷɮa.\.jam\FQ"dddx1 mmmzٴ :`>rHnnҥK_{^6J9"`i.\8xoLo';Tc1kZ %E׆CnjCI}+rLN,ˣis_}Uzz_|*t`@WL׿u>3ȮaU-9> QXX{nW.noogX$Q[[KVv Ç={^;vlY`m &?vNqtkEE=as=mXOdx۰d 6x޼y355aT*u+6ljj*ŢvΡwg}f',B?&*^Ն<8o_@VXXx>f!7ѣm^tTu}SUUUtt%x6lGG* 길8چHxW?Ck@B))#^)EN }Z[[͛7Sxkhh 'Z ~yH6dhkk|+[[[)J"|}}hsӧO9rt%F\!'$r|b-ȒI>aL{9G_rBie***:J'g(jW^^msrrϟNPAPUU( ?{'|btF(4v Rb:*ȜL@Em۶h"o;ieeecƌyaLya ڈ ^h r$B"Pl:))f :o-))m+B1)c;PvaBFj~]d }/0aɾ]NP־&--ͫϝ;7m4W1]]]8Sx*Hچuhڵ>#rRX[ Bfz_ס`ڵȮ&11YUT ;8,^Ks?"T(udn*=xš`06oly+ZvdBYӆfs:_VXAHtST*CUWW{]z5&&&::c`PkWWW(JlO?_z*Єq ĄDoIv---aT6yDP޽mؚd8QWWg4]hllx~V???>Ow:鍣G677XR#YZ:Xn޼ix0k=EQ{ٰ'O\xqVh(UWWpZ]xvUP ( _~e͚5t;mZrAǼ*:T*+**mJLD]]/[>99v~xw.քʑpj"i8tPdL};Rd21 Ow0,l#~{キ_@ATG=%4>k%_3YкtXi3M۷,MvL&sHvp"b8EDDx?88Ywʕe˖655ybXTKK TD"\aaas郛p ltj> io޼9qDdf0 ; ɮՕ #GϟoD"aX h҆EvPSS?}]pJ c1(:p SVTdg?K{"0{!  E~~~l6{bd%%%9<BzZnLmĢ(;x᰻gQQф h}a**44ތ2s4>|xX}}'e`nooCQ|X"޸Z%(9΢"چN.<0 cFÌ(ñR7(KswwzNQQQdh.O[aرc>h ¾[BGh)ƝDv*>bxðifXF#.C-ZyZb0즙А0MKKs ooKGR; lةT*wk_y啺;Ȇ5L NiDCDԓpăU8Aw/ >'ΞPĭkҶh.3~0lZYY ðH$BTG!vmmm;PݱcDzeI6l(,,ܾ}W\=Q a{yl " {V F 6ܕ2sΡg4=Td*X֯2ި$BӥH0JfTvIv{ =oҤIvټysWWo妦&R,#Ay 6 "TdUP} yJ=Q(ٙf.;,uQ|͒%K"""t taaa=/zhM]^^^YY={oɯzYY7oF68; Xad'ͺK[ 9a :|a\zUVUtygb6lvV;V+a޵J{}7lFEѥKr/Wv.iL/S{-w([}vBh48}<  6/|<1 z?o;P ٓr TQ5&Lu:Zl_J 4-'|SOƒnkkc0}d2'y!6|v^Ev딝M);dm={Ν;/PNNFQ~.KJJr#mXweffڴ%' {޽O>7( CF0z΃RGc@0STxy`05H$8׍7~a?U(6mL&I邂l|AP\jNNBxg2aGYlBf3a=AYpb_֌Cv1   x5 tV8nmmeiӦvޝ@<Ǟ pߌ\mmcx)Fd:Ν;'f͚r;::uYBtW ⃝Z .55aEѣGc( !r wn6ŠYd0d!CFr|۶mׯ+wEDr=H҄A ãGwaðJ DN^s^xw^4t<dUVYVA233hex]%eu; d8sNOԉy.MvBgf $hX,VfffUUHR 11qժU}]cǎTG j ;@3ؽ{H$a:N<;zhVL& I_.2;lgyyyCA|z7oG<򄲙 *sʎdjZᄈgz}v_~徲:rss+++WXVX,aaa=VjPPP_F#n:zn@vFٴiSϧ3]}}}yy>H *ybqg2.y}޼y.\?P(lS5 a!;""":::zIY,Ȏt:,Xp=a|gz>|Jw~'HАLҢhp8uXY0G>ɽqܹ[n~b۷ (00y Zv~D0>Brƌn:͛7om4!mkV CrrͽCYE1c~7?S(|A_Z޺uɓɲ6,A=ډpSTw9|>_ N\XXxw}  pС1cƄ|'|});x̼Y]n޽{!۷o_uu;xp-Kd#P4If,iii555C`ƒo?vR8P__麻{z׍ A}Îe\.Eo=oڽLH\zUTΛ7q|}Ǒ̵΋/^~駟ɨjbVMLLt%bDGGǎ;^~垚0FSVVۛ[ZZrssx AƎrΓylB1kb!WZUXXX[[K555+~aOH'|st #sg#`8x%.9 (;s͏ ݺ~a_.LVYYy+VH$ryDDYdUd.NSO=SǦR˅Baoui4Gydfff;w }@{>0.yjȯΝ;G֭[fM2:ʇF:vpWC@v~~~畀y%8N_I/T*z뭇z^AKKKSSӥKǏo#b1˵p>Fyw_}ٲe=y]]]"w?I"""1z3BY]Pw&+n+}w!JݷB>/n߾}„  ~z9XĘ沇_c(]hh06Ft#[{׷`.[o)]v `V"'NxwgΜeR5֠,W\:}yL&'щ;wnڴi޼y=lMMzH @ddd;&&6C}852ի{gE/]ꫯD>1Y+1;;*hH9 @_("<}K{)ٸ< |~_.6׿5::zӦM/_vEdoviS`Z̙JEaPz/Wnܸgd bӫ-[7cʔ)7ot~MdKo&!;ȩnC2ﲲ;v8L u8v }٧zd!J5eބJD[`ε`?fu*i-˾+ =-[`߾}-" Œdl6CQ<6m0lȘ0aÇ3nޒے—| `; I!@I !}$dNIC73 l\㗫җ8 ۲dl# ن﮴ݿ'Ol6XP$I^ʕ:55u q`hmmz< N^n744lڴi:0 O_I,O=@QT{{~P(o>zmRHn4+**֯_9Mtn" ϟ?Rdl Иx } DKm@ x饗 g}644!IԩSJ/5]ޫmTh?Jo!q E(Iׯ>}8Sb pUŞk׮f|$].\8n&\@ߤj+_^[[;22"Jb1 zh4Dܒ].WWWj(;w`0lٲe8n233>}z: VV^jd4$ CCCaׯeooH$zHp߽{wNNNnnnnnS:Dk֬\Ń7πkp*SMo&)!!!,,L* ٬Ҳ2P}TKa4&wi}b%oIjh7{A /7ڇC#DP]GviϜ9> c v---gΜ裏ƣBAv=OvvtZq7F )]Hs۶mAT>y'NL3Dr}fsFFùy&Klj:'cǎ+dggr޽cǎ}'7\ũ3-6'av2V[UUe˖s)2)Nė_~ꫯNj/{=wҮJW[[ظaÆԹ?Fq:,!,}xj:0!q ~YH0;(ry)>q_7:^D >/GdbX4(rJ}}˯m!M+WOP0@Zq  p>1ܼݕk׮}wfɒ%yzr4׏xЪK>]=Zt֭[ǟp@liivtazgD"r7xcSVz8Odx<;cj5a/]o'$$aأU8vnZM&Al6{)7Q >dɒReZBᣳ@bjRH [.x `Xa lLVVV[....==}Vv׿.--cA'D u1Rʇ7LGIJFϗcfee]T(띱!~R&L'Z,v2LR8q⭷ ""$əBQT(Rv IAE7|>)B Ebc+&bJHR^PtR#bX,EQSݡ+W*ʬ\;e˖:ujGYd}s-cYwvv={6x5$/W'9QT/_O~B&<8(s>='~/ˎ;ǩH;ovvvptt BAD"DFqA(roe!!!~͛Dž2JrRRTdL ?hr߿xbJ+իzĆl|`&%IŋWoo. NFq܋K0zB[2qݿo6_bϞ=,\NSuhfcF;Su̙[Gq7III~f555M<޽{/^D\fG.3X,4myDI,Mx ===;;ѣ%V*6-x= Aǎy<fKOO/ r>fyϞ=iii֔aҥvܹs~^#B 8ͽgb䤮cS3^K l/_<~'FK`:J7 ڵkUUUկƍ[[[^D"ɞt ɬzz3QN8Q[[k׮S/v'O26=<l66mΝAr}(v(((Y74Fceebٺu+=XH[$..~``qeA8L 5[JA+]\\s#|g111R-Ľ!_Enƍ;wA(%є}q8 l+\ѥN6xџpD-Z{/\@Px}IRT:<vj4\j0Ο?׷lٲ|RmE:;;|M?P <6 C X?E 46͒yq %h$y;wl߾=&&ֻD\0Q:z>z9C[>̙3k׮I^.{̙+W[vXVڔ+W`v!Nx۽w^>T7122`6/\޾x⢢"Bg7߿)%";}_ >mXZZ[C!ҨĴpd[nUVVYKf2! }A172Pm6]'qƙ_O V>|܂B1<!z$ICmhuҨp5~Nzꂂ1).8O+8H4XIy( }}}_}UCCCQQъ+9q͛7nP* 99nnE ?2Lqqq)))E@gr}/^\l /0h4V ('K-:h4]6!!!dܹSSS4F~WCQz: b(FA "0= QӀ`5yY~QȅY2:j\ZZZjjjj%K >8J%A(b" $ HQ>)ty1PE$"dwijjjllDd奥fH~֭{)@@o[J}>r.tvp8z}lllrrRLLL s0eΝ;W__@^^^nnnRR&nl6v}>Z޽{>/;;8??? X^jIӥgffFDDD"P(&>t) #mNᡜ&nb-.q9<1bCذ.IDATxy|n9HHB8@r ֪ȥxPijPhEѪ-zzV+h9<"@BfgG |?}lfg y;3.""|ǎ'smFc""ǘ Yx9(HDĘDD)HDĘDD)HDĘDD)HDĘDDj[ӟd}1@}1]_-(SD3̔ڃ$+y_%L)G\4O<Ř%e71j $"ҤU /|`:SG3N}dgob L% 9,K9p/ZI]|9l)NS>\2\>|nȵH8qSGs1͇A]-xw6S&OG+gF2LDviӘrfk"ltZ!"a2yQ(j5L?g6i|@!3 9x`o?q?L=7Ļ><8zNQaW "_ pҘ:Zy3f:{DwGôIPV\YO(}z`/-?PUH7zb5;{S%Lt]hϑXNJ.) LA&tږk>ownKc{yxd\t9cctF8RyX;:f HS1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S11Ǧ`+Lw\=w y*K2~ßxc{YUXʶ/䛒ƮDH%L鯬/kU;7If&+_5nO. PV>>uP['m]\.J-?sF:J6<ͭ3ۦ;#˷M!CAx[2=QCq [ќء^c۟u kN%|@m$}Dְ7*^)'2^_ cAI&ӧD[MW~_>f˲֤7ǹ;Ϻz̜{D+yck=uxyq_20r>gY`J]0k8)-}[HYh"Jsy?;&y#Jkvi7L)8,|E^߉:`[uM&%dF^9߼Dߗd3i;dn>NhVʆ^€Ѯd40z/K. oT?9}ӇNwEK8;>%3zO'_ʧ;RuNoMU%dov>R\5 545N}WMRQ GOsr(iq^,+'WMa6<>\iC|N^(+`uxxFtt>C\tawY?8x &c7ee|UM߮qy|ΡۅIDe$xP4 45՝#)<>hƭSŽ⽬V8bҰ]OmޏOq&Jc;Ȼ'Eڅ^clǠ xط/<^6[8#A8"HCot2Q#&MdaNĩSԨCfdԵftn~+ӚמEC/Db`b egۏVÈHljX9i ^w2v@yNv]j@6:+$o [wqND=a[l"okP~!m:V\t˝9ko+νغ+ܾH dt \bOjG #[rZ-Np+rcjMHu;<2}vGnSq? 1iyp$F?<{%빥W"kE%6nG- ot+oFu Օ{% %À%C;QldPP i꼎\lmPf6uxon#t:ǒ!T^Zбhb-||e6 &rWtJL>.|;_t'nKwc߷|B"~>C;8{E/ePRZj :?s X2s'sʯ&йvb\"?N;q8ٺh.|]:!T>x?Xq?c-X?k&*GF錞6uCv?so93g[Co'~j?Hʦ_PVZE-rg]׆>{)Y/8?v3F]z sQ XN{xk6<]ǒIּ NOKvQi=%g|PT'iEڟPf5' _K{hؿfec~_XNGɫfξ5;'ijB]".19auTmwߎm9.jrҬQ{ G>O8.}1t>y KM^$mvS[bײܲ\u_UyGuo>֯#)[)B lo(ǵ ..]3%[zUӯwBddQv /6S!];жt&Tnbwx = }e8EjrqC,L݉ZK5U CYvPʶmB-ȁ,L ~&:`BJK&>%;l"wsvmq.U1a:3D0TvǖwZ>g Ny}١ Oh;CNGvdgb|7+\p۰:&i!;>ť{b_evTdUlSoQӶVloʨѷ]׭`;.|1 ̢: ؎{>7ouXpz;XKIXM2 UXⴥ:!(O/D?#lۏX_tX n5 X҇eV,.)- Mg<~\c8qhb6ÎK)Hi"3>kڶj'hS$ Ie@l+'ѦsWo:0>[8hڥNYϿJqٹ_)rjnn /qҫ` 1=']Ojs˶%#?P#f-J =ÆC>Grк>ˮ/{%y#!ob 8RvCȝC9\͈fqEp7;E'ٞ޿fZj֟ }f?DVղ;8^a^E (*8{4bPǖjOn:yG1`<G^^h rK|צ.Vo;җ?R *,?I~'حzƨ}~f`d>w&rxM>snOYʎ.rL?Gb"yv}0 /_w.j28bԾI߳rg=7srcH}h"tC5$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bLA""$"bg8smF}!"ǰdO9$Zu1LHDĘDD)HDĘDD)HDĘHDqmuceYx>,Oxc$  pp{H?>_oSu)-."3s={eѬY3ҺDzĶmͲ>e\y<^RRp#,v9'"++)+ȕ},zu}$@˗ޛK~k^o8݈ȶmV}>]ZcCA 0 v&/<8 ?V8MNN]v-m۵ #jݦ K-[ˡ DF*DLq]TE;▇F"Ґ^_aˏKEĘDD)HDĘDs?b;?e0i_\)>zo4T8LdYHxō]PӦH5oϪ]/.H O,R,J m ~8m^] J:8 z:.섟2v w-דUԒ~øa lƯ@q5$w"ͽq%k_]>X4_4oyn?1]jW':b~-y]z4}o/J6𷹫t<>w][ om!qq0?y(p5/~ _]ƘlJyaw+Ld)xm-6QBE UcCdJ6DO$) YqB`Y;^6٘DSOp|cןx p Yyj7sprp]Nw~\jW7+뭬$'S)yos¤KRIz]CiD nwn2^ɡhFk4ڲ vGfXrW 蔱+2Pn'ސ7\6#/C Ly|/@d}lo \܊fPgߞ1F ҬXRƲ= ux獻;nͽyZ䚇3koAI6r|p]\|i19GwY?+~R>b3C^D<01'؛UYNfr\{Ny^?=)O&29ޱƛmLA"Džq|γצ(Pd QqDA"LJz8o]xQ[u2o@κ&:]H}qpq t<ˮCS*m^pl;Nw?mоC{V}mj`#˶C|tRS 4,bDva+ ¸{| 2/8,a颅;K{8J~мysV}'yl1*Ĥ|DreWVܘWԔbB,X@<>]v%szK bY͛'Сc¸<l- j/D~,"&6={a¾ Oey",h KGEĘDD)HDĘDD)HDĘDD)HDĘDD)HDĘDDZc!"0HD wI!IENDB`fontmatrix-0.6.0+svn20110930/help/en/images/extracted-font-copyright-info.png0000644000175000017500000014776011220414321025530 0ustar malexmalexPNG  IHDRQ iOsRGBbKGDC pHYs+tIME.BtEXtCommentCreated with GIMPW IDATxy|Lwf2lؗXK^ľZ[J_}K UnJ)-ji~QEֈ%Ծƚ31dLIϛ̹{ϹydC9AAQnW)"*]<=ٱ  [7z6%ЮڶeK)% `ILn+Jvզ  >Eldzl;j:NyQxL("|uv;{ uS(vycdTyfz\LR|F^QnǗ=Mi'>HŻ}~[c_ 5/ߠW<{fQ$s;,\w3flr O}z BTup QyOn//6jS0qj&k~Y{cӹCS,'~`9g)d}1Bn(*w.PWPxҭ~8ϖ. 2h"RSpswcРAT`VT7{OMDNv DPPÀ|ET˄ejq4- ɸ(%'c"r.K5(] :QRqq@!GP?CW|8ת1 y|(˞錽im4d} =깱u["Ѿk2 ,?ǛbѻS3N} XysA!zڒxwt=/ a#P*wObVfwhrE}Eܒ_lbFs?eA_6V&cސ3% vk36?ArQ?H%ذ1QM(Q$+9U5Hm8>]v<ٳ. W(9NqPV-Ia}<ݧ/aŏx__֬e_Nz&p;l%L<9 e`BHHaaaNjY .*6?Ae/α/lw7}ûvu?N|1}}f0klOȫ>zaV>YvJa}qO/-$\DgJ{j $>~6_Sop,|_NC'^s KEFϝ`9|MSqbOޢx _kWf4J\lj|5evc!* K AM?8M; ?3 gfz}-@~Vh,e&,'GPugw''{~|n`2El"T9nZY?ڵ //w4eevP4ً1kIj.߅ex?xBCC4iRfogѭAVVGә1.ʸ-nՔ'@r 0)a4}wh@6\KƔo} [j5wּlf>C!?p e]"]_+51%,zkKQ>x#-GG¯7r>;vrc("ZWh5]f٬=E1wNM;SIcg;PSѶQn.)Ru_+`9#[Yi![yða-[ Wt#k'X>m%ZKߟ=⹖)ٖ@EIn$V<ݧpDN_IPoo*i]KՌo+M;ܻѰ Rʉ\6̷:$E=v*}"&JkIo{ ZkT\TwzGEӢ0(PwN%lmAϵxpqQPxMTѺZG"7@f̪jAU|̛ҪVI\^7Ռْg[ɧ]揄#,%ڛg5Z b̉ZcMӷ%~Y͌27/kNOa|w6_2(VDWwʲ{/jw\rk͟eyi?ow|m Nt'<Ƈ1fmN RR03+顁[[냿@eF`:*h/ /=ys?Elm\˳a'6MgMTur) ]DOyQ~i%C&w~u@;#co_n,9WgϜ{4MHvMJb3L̟??6ə3hب<ӓ%KV:o}etSN'=G'9ɫAoj#:-Fb:*K2pp!u挈dlwe٧cW/#JbY=;^$INmG""lo^vdpbOj>+׎5]ٴpL[Y/̲L(^Ƽ:%%dy*VWPҕ)|˅0F4kDZg{lҮz zgw[%ҭ]M(Ś16PQiH[tnZ5n+[\~'{]6'QJXhmCp9z"O+ݻru/@LtJ>({ooOO6n܎ŢriTbJd!JQ,N=`eJ&O9$$mZ!<'H9MW${y7"x _9Qj=-0/cÚƚ}~~u($8Qc(dCc;ȬK{^5snǟ"j"n#g(׶~ 'y"ΟrGqU9fɭԫVka2dD_L7 P}]{#ӧdEEUrcvW3^5/W Zpn~qopFBa$p%r%RUKF0,uF8囧\:5g4>w/o8~]>@yi .vp,c!kCy^)f/1`^UɔYb)sf>jS oxX^(탞Ps㞽:A 8ӧ?iFG&,(S̘̖7hZ\t<Ȟp);c(L)?g>bd2cQsZZEΞ¶vIb4bVAngDs}ٶ2PT9٫A#gLcmvP19Qoj+{QWEAQ4贙& &ŮjZ\\QPLtSP4 ZF~ZMf eӅ&Z ܝj 6;e}ZS8s'ZRssiDD$Lz FsٯKOϲ`ySiڬ"*>!ww_D4yҿFFb zM3)OTbޝ )3GVQLadً ًAAXly2Em6d`HD7]P-:QDYӲ~Nɖ^FUDE`b]  GC!R2QYCdY)s ]w5ל6ض6UYr\2c@w'>AGAa,0H  B!i4v/-! $͚6F#  4AA en2  v3Zj٩(5ʕ+G޽AA5kHzE jKAADT%  EAA AA(rX`  <ԬY58 6AQQN% PP1Q  BѨXH(4  %'JA0   S ϲ4  ܃_Wy  B!TF% P@ UT*l ݗn~qނ  ?b2.@d1JVk;PX ,m]AhwAhի `7.eVZ)[ca }N(H>o G :ZGP|AA GL2- L.s`hXԪ Ao D^ |yYck PhH(fYMK=xj[e&hAg/2_>]^ G{p& 2tI}gRJ8i̼4ZqfwxloKTMF7?{+㭧_W瞢{n֮}ՔcgNPDDkEAj`..BiNǯ M-n=]˴7*FH4E՞Lwσ*R\Ne[0@4(;U{|NDj-\;LG)QcKͩS>;xۑ[>nU[r+^mYx \p2s:&c^5 Qos+3~;GE>%U[>u+䏢h/|\c*PN{z%*^FbXvV؟iS9KZ n=*aтPsQR s9P xrմ+u*~D(ʘgfL1Hk2ێܖ8>y ذ \r Fu#k1w Xn!c8:"?pycڸ߹z'}'HN7'Q=D4)-C Ӆ,؊.87^Avz>$CN'?lFM]zPȺm)کC|ʩJk.esL=7J-qq>x+Qk*&N5ܲyrYLa+rL:@B#U釫$\}^^NscYɊmC U}h%$mOtHbZ~MxXP ݳ&nh߂Ś2CQUm\!I/GVpnVzfOKx=z|vn|J{)-#,&4.NM8a6u֎I4q3]eiţ"{֞\^/EnFQEA/.M{9V؅A-@+$yV3Ͷ hy+OCiZw&\c+#LTEa`Ju|Z'a IDATTZ%!iN$7#&^qӧOs!~x[H,OuVKy;\P~{wEAX0fhmv5м^=5;XTy4:to<ҋhѨfT~~OA]x-rZ wOs:j=ޭ-I;XڻY~.-낟ޕR=WqydRzVx+_˗ZHD7r8J4j1sFoͻLW)ܓp+9|Ovg ׈s”m\BmG?\FD[(hu"v5stS@ς0J ,O>2u{2dmF_"ػyouԳexh!-M~1-+Jkp)^K֗Fnq9 _ׂę*9۵UC̟"mẻu>)U}{bHJJ"9M%5ry\+JިyJ Ncٝ|xq@u.o<\y֑ƚ}, h=JQ% ˢJݬs;>_r-,mjM9aWꃮc7DK9D,`Zw |;- g3h֨!mb;_tNW[X9#<ߟOXiǙJw1{M| l拌_/xmE< > bZVzt 8Gx4 gXwTKǗOgWO':EA 8N_JBU-y $Yr^ IW;xh8.Iъ#6I>#n3u,UNߋaJM!%źS8Rb9&*֦͸h[Cޚ7G$v/,8cQ6יȁ#J˳zi~~!#K")*WJFĻ>|[))܉b_T,\l\ǭ,N&,)] q(^AoTJժ)uEUD/ 6_=ZڏJ]G}X˦QAo{Gqt`jYzɜq;\$^^yU,N珚;5luTM]ʉs! wAw 6P8ӟCһ0h=i6!L[>\8zcr0Z~W\P͋CeH#ppg暷P?i^W7S#S- 5~R7773ofP ~}ZLKLZu!y^ɗTW3[R,Ϻh4q .ɺ)ぇLNjM׺^h/Z}Xз܉aŶ,]3&Lȡ=01EV>XHodQGAx(^jϤIǏqNWTRߊHK{M-})utiҽik;SB-ʟjB;}Cj;V$jXų dEabҤIKA9J~^zϦ8pk.[Er`DjcIRߐ9>ǒ9k{:NO2zQ-D]B [?_my|   MQh(r (O4Ngh2ŭР?郆UیfTUͲ\/C8)%GMUT'+h]k5=qz"&J|Kת2EA ",ז&f|-GSrP58̊m7(3sɟvaiyct7JUL܈}4 ʕgeY` "AmDGG߻Uh8A £$T@'% £7|# PHGAA P  P(Wq1lSA/]ޘ.¿HiAj֬YCHH=PQ色f'0  <^@%OR8:k-y[_B+M9Dī33G_q,3sbqɧX9#? <ΠRiD'$6 )Gfun㇮:޽wp0AUHժUKBQN( r49F_+ 8y+{k3[eƆ9xH o0_?1ftsos7]cKb~ʻ]* ѡKSBrT'% Bѡ{\!FX| 6Rt~80_Zǜ]~<7,O vN:ŔМ,p? nwյ1>TB˾#N%ȄX  #rc p"]OdQ{Z6ϧB6k]=&T ͨe992.)cŸW8~=c835 gS P0fڅD5(V1q#0&5gDOΘWs6dVur+jpnP n`ޙ?.|$g]A"QQ:U)##E.U4߱:2}'N]Nw%Md K(ߗɃB:O nQz6b #GLXOFq֯ᨱ PJ))TLN@3F 9܅s-MhN bH-Poetգ}XZ jUB@0Me_Úh zLW*/_\U-"߂ 5F[Og |6_6WVK۲d@*d>@[)%t Ij -Vfv&1}`K÷B}:FUW .E_TL*K.Azio<U(W3hfի=(UR繜^FbXvV؟iS9KZ n=*aтPsQR ;ѫ7:F41o9C>w8OWtʨS!+' 4άNRQNÀʸyy% ?FL79bq 'CqtNE~>O>Ǵqs3K%zW#bvh2]f+4 nMfqEg1ރ:w}~}~s/~ѣ*OtL2 kYx]3qo(|I4N~aIg7_tUC!r74gh'Sٕւa]ʒmk2ێܖ8>y ذ ؙ__6mqyf6!t#nnL:Gof.bTfDjǏ/U釫XOtHbZ~MxX ݳ&nh߂Ś2CQUm\:E+5{z"U1_ nLU &}]FzsEEPǤKҗʣwEW8z+W=[3%V;z^P*K;wRt[~ FίYLi]Cpjol;cHS'*KP-U+&x) uC5. Ow~wh᧷z.,WG%hR\!ɳ%lj_nU63 D+OCiZw&Aߟ׻׸bV"CzKz5J:=Eu`h(4(!S9}4O⇧KI;Ϛ }h^z,7Zm:7FF5qc-$CjDxG 7-L×ipW[OӦh/I{"1 ?w= OQ=9avOjK>.x}K˺wTU\s.ԳRֳ"=Ń^tM_(B?%ZߗÉWURNQٜ3oejJt[F-_x-hf!|v'ϵt3^P˛$:*SW#5Xp֣+P`"C ꩻYva|mÙ>h`lS#h9tR"^񗬯0rݽg\ye ݼ1(]?^D2dG^y35Ү3ʞ4} vSm?bESGŧ=3׼IK|z?q.'45~R7773ofP O˗ivi1?IWZ0azmӿ'_FLR]YTmVhwnuK=β<뢣-lx$7>395]zQhIbbAwsûr'o9jQsL׌ S;rh?zLL}Utskͧ?wazlf1B7@ *NZ=&MR?fQZ'sC^{;UūN|@}V{ﰚbnV6UbmUQ=TUU-+˯G_IՠGl{? GiٯujRz0xS6?qxrO q"C@Ft)-A{ ¿uo&4ư$F`긕x3Q[Jn> mR۸T}!IgX9r A1E8OW숌$Iov*M8BB8qpuYҢש%fXTRA֦;@őyAA;S3|QAԭ㳆r* ɷ1fwlP˻"ḭ3*/Bcvkǀ& p* |; Lgѡq5sU1v J :O1 >o߬*LoZ}.sgһ p*Jw?B4Zwd9\*fxk(<-~קB?˗[`pż$)Uյcmz0cx^m_uAӥAx(WܽPVOTQ3-jKI2mۇR j!K)vFK\*"^4+Ebǂͨ^h84FJn3gt#qOKv\ _cNgpTڐat ؔ  <"*J)JOJڮx+ #C:r)_,7;g҇3m'?1!Wy.V-9 IDAT*3WW.#*[2BWG0s}kX:\(t1,vN:Ŕ̠w}%s>VAQP'JA+vDFy$?2zUE`h!8|~8w UE\:*Օ,=Dj:3 `^Sc'bćDqwLj8ڌY*6% R6&JSz РnuzjPZ%!VǛto*2 9QI <@*J}PQF?{wVE?p=^.& +.k)3 M,sK_%K,\rZ澔h"ႀ\;?@DeqR>̝3s̙{?3gH)iUzysifl%-wՕzc7z+֯2M wWCg',]V@9aK+߼nCW,z=sHuUiԃ)y=ijVkEnsZhՙaf25c:=mi8}oNݬ.]Y ozx_`sePnh%yE[b:@cݑ[C~Sqd[ufF W+q3v</-O{Rގ_"#&E٢iv,kg|If ms6u_ݽ{z_T*L@:;nz' 5xd>G{Lg,oL#Aݒ vDvEpr^ Ϟ.>Ϯ1L+7TPw2W8foLU)0tWYEb֏/ nn-VLkLȾa((v)mf'r}n؅iW0XUl!]l->bꮡz0y]4|~߯&݃_\rB<;-QR( Pmħ w0jA &<u}[dxj-q ѡ32_EE株p K\f+`q:Ɗ.I-+'nqLBB^kQD`g}Eq/<.#EAQU,`˂c,>όI+|Z,(&+-:ĥ~8M)ᅱKKyQbCG?ْ/{2JJw{Lj$zKc)J`6,/t/~ZX8u/er3͈ƪ,fH*dSusZv:ݬ}yH##EWr2/OgZ\.xc4R h+u염ϲkcځ_ԝ9Y-l H9Q}   2U2}_,ŪBeqvLy &e`rى\N^y(Mg+ac@ѢHN޷EvR,I9)#bGil<}Gx|#wS>y[HJT"2]b~\TOՋ|A3kQdA iF孿[LM]՗Մj_MZTvL9m u?ܼ/->ȏǨ_VM?B?ᇼx^H%HdάCyd&$˪2 X?[L, ϰiOp3+['"lY'N5ZC@[챏W1DUKVv<~1÷=|yj/Ǯelqr4@f.w܈i: ts_Yr[ W^Uśo5 x<V\4jsw;UmYf`uLU<@ Au]~ !$((( [vdRk2Wf=3~9@Y ~A?q-HgR>iʔ9v(NRn.v5x~|C{ٱ}\Nݫ!DfJ,BNL8ͷog!5kiLjFd|弝gymgo]FmZpcF_Id^2oy{/RK5>Z9⹤1*w: !STZrb7䀆R͗{e4oTcpmdHoQ԰&DZ+8d1 /5of{_B! *1.o5n5sBB9ny9sc֒rѲ+Ce;wzb2wpocvqd/ !9^C~$*{L&vn0-]|(w2c̏jwO:JH.,27Fb(!BhCmX(!J[HHQ1I,o4928+}LmnCe JNߪ!u@K 7ț/ 5Cp(XPۋ f"%PBQ'HJkCudz ANgtO /4'ۙ^k*hAKkzJ&k܈[VK>i7h\McoƴR`o}/3Zê&g2pv!ocY/<\^R7,X@ A!3(;+`>L)Bɉޅn.gD!D !nRBZhh('N|"ۖ333BB<ԓ$AHI!!$zҝ' OOO)!Q[Ը4UG~932?4/k(ly[arHakwk/'IB!nR;H9c]7*hcXטSӌQ5öMdzȞHq393XB!D㋯/ut0ArVe вq߯[GueQ|e9b.m FɹhR6eKWq$%1əL2֤LwBQ0u'ysz䦫bnCY~2Ur[=yPS9h *ā]tT6!B%;2e+'Lg_Jak`м휉?NV: w|7gL':KÙ;9w1Mpc"p'QGX-)^co/.]&Z; 0؎~uѸÍ9W~"{sF.a@so\?~cgkd&J;9ӒotE'BHd(}ή0 ;O0)<:auSoJ:fv~fnG\&Ti?Kg넭2 YɈ-J Rs =z g\x"҈?u c+MM-k+ٙWJ@[:̉Ζ+RLB=&.^L)A҇g_w\B <sz*F})UQ ombPP4 .PRFTm#株]}0߯pbCmB[<as_Գ1k"/>utm#FLsG!+V|a21ME\/,BnRD=LPSS'%y?ex@d~>6siY;=5;{5]EYt̕ks Yf)y$?]&g%g/StEUUxX<⠰s,3MD3&k&Ji!D34읆Ƥb-\5q,TR#2jr8< oS7_ׁ9郿;A|*v!6,r2Jޠ~M09+gCW!p4 -DZ5U=`$adڻZZQbɟ^ٙJ}ٞi<wk ڷvBDeE2bjl|3?FCdjn.]Y 3OQpf_z>ϕsi]5/%kp_ o;!8:q [+oΨ8y(UM[9w&8{cX5i#{~oq|}*\ ez|w91q;l""b89 kgOPGg׀*+Gu=?Hc$J)j)UV^Tt7WQ+cFq瞬{̨6` G,k#o li2C ~'W_.LYOBVmsQ9tvڰxz~#nj)&LmkǺ(`8M&zsozg۹25{s||4hsjS"Gb3q4Bj>\bT dkܞ|K)6{3z xICY}zu\ ayi;0GfcпMEkSoL֞#!ʙXQy{j@Z&\N.bN8!(Ti޶,o} 5Eg4ai{^jRp K\V b6un]eu5/Bu^LhiTrTisx (@y6i1h4=Yec:{,fe‫=͇ZK,y@:tfXjoz-5'>ʋ>>m{;1JBH% fTk6GDTՆ(= +q|Zvץ{sytvNwÁLq4qާPWtt *(2!K[3`}]puʥ;Sd'r9g܅ϵkk3SwsfAB(̰Z6d5 bWMeYg~eL[}YY܊= wwGV>F|ѻ*%~y[R4KT(aAjC; 9Oo`Y'N5ZC@[ӭ^> ̤dYUZ 'BH%]}:מjyZL*/7z/1'MvBǿl1-f4t22`Eau틟! Yp,wc|} `&/揻/-xd2x ::sƅOwd/W^xzz޵ӧ[&(X#5o2}%6^ɕMCyq-kOk.pB NhH8w e!ϠR 2ĸN5pNhR*15Ch@TlJ  jٟC'7]v#灎5ҨI>M N@l! T2M$ܸ96t9Y5MyLUE_N0nގT%[yE1&yX+{_Ou%5_)!%,$KhnYDȔѮ0})a$SSAs&&SۧRg:}[drQH[EsfAw /b 3g'uÏDhym?/Os' -0d_]j4Gpc..euUiw'G\|ZN襒 !OB) 5kȏDw~n0-c⟻X^y-YޤVy5>Vӆi{s?@atZInpơ-c<]gq}'=r?_3PݢKZ4rvc [}eTkadzԜ_uך@WWwį}zw+i% BB٫*Z__͢#PB R˹^[i[2vhi<&TqaNNfKes XÂ:ol ̦ϝhD 8SWD~koCW2MvX|A 6KM*Uu;.ӭK59G.㒎V6ƣL61B9ȰJ2(JmRBJ%Jc_v5uJZ^k\D[ } hϗuͨə;GWf8o׭viB!QO%-z=iFU;-QM ןOK:%ͣeFJ fo=>Zf q$B^J;B93௃i6' ޛHfvLZHڻn@_Ŵ<e|mkʖBB<+h ߽oճ ֡~ [Ȍd)5>{-`5y:3fJǪ+ J YEIT/yz>X v%#gpb;zEAq6.{׌P {/WE?x8'n;qaV^vɩ90L]eUW6|}0sG6*#zX/W y~~?ٱQgB!ATF1.H=w+nOi6c*0;)UTʄlf_\Gf .In{Qa[`LVR FbGbr /2gC}Bz̳D}VN?'8 wǾ:n<)2Εe ! 0u>bpo791+Edr^㍟u2~0-nFs]FXXaai-\MOWkM9tSd\Ɠ,{+͞Y{vI ݠf<󺊴 ^!Ŀ82u+%B1wīf-jUwRsw5RW ht ј`RBNU ׳QˬeWWGHް z h适=ijVkEns Ihҕ DZIS13& i%GJaNt6`$tEPu9[IhW1Gt+?*\^JJN+Y!ijDi mq1aZ>Uh__q gR9\Tegg_fCD?E޴m +[|*AMɨ^_0 ixF}f"ȹʤr Gym,S.T#Wv2g@u ;Sv0N=!&GݧW:lMd&h,hזKP!3Dsci4>5-vYɷ2`{v!sFcޘ%DTԴ,9gK%TqaNN^΍[da77?h p>|-^EEWT6p45ѥl2N=1s%9y B'6kn[ YzU GI߃:8Xk$`@̝=}RܭX%5'ǥ 4+Y!3Dv_QܓL3Y<؆N^#zhmYYuEK(1}-{(~+fz^K)?,M0=c~%2~YK{XA+.p\9X`aaK>ҌwFY498zY|*NЬKܲrv'd.$ݹBQrBV)(0qUZE ߕxH:ʶf/Ppح=Yݻm+%惻+dY ˷E#mi˵!hS4Ayg '"tG[n`FgDy1l:>Hp #sc(m>9w-we͎s9gz.'}ǻֳm8ugFݽmYw,~lOBD !B<iERGsrB I!xݝƭirf䡴7z:Jbdߢ΃BʅBy(žK`X?^xuИSɫ[-3n >μv,t>j`%S !uvxԹ_O+j[V:FMsu)KDP~qKizL⏉J6K&DPB!x =cAn;׼&qT3ņe^#!['F"(!!!!RB玣sDi-(kkIytN n^wصdҜ,VJ!Yll y5r63bS0Mؽcͳ/qNҀw&'_ 'iJ=s!;kA;kf|g;f=906rxb,X Osui;\dGwse B̃TszcLuS9KB!x-y cyY77EsFe@5BF,)Z*uܶQL|KNgIB!Ŀ4R^(|<+R-^̱l6`:G/.>͢ &,9OB!xʔrwW%a,$V+d$+F޷Fv![rs)<<ڵkKA!3L#E B @H1=}>ccWH S&~U<m%;fKBH%Ŀ%]#R'gwB =B/x ?LWgbUoqF~mecl J!As$;[cgl+٬=M* +ehAQ,p4#TH@;LНU([և_gNZ*mz0# {&֊j>- 53akV}2)L03}hrt:{ڢq:ߜLOUlJ>Fjv,kg|If muuUBH%xmHYYg[ mVfۿC:rr29fW 5SŦ!TD9M1vl0]&n oܓozn;W ]%Olݶ=&*[٣ʊ:M^#iO'f郕nr.1)jݿlD=?1S FMTQ 0N} i#M__cU \:AO8`ݛY;.pu(q2:+/P׷LxJk6ס32_EE株p K\Vpzh8- spT^=XET1Vt)ON%nY9aw{=N\HȺ?F1эVԺW!$zhLj1Mq?NewѩR FДͤLP@1")ҙ;9rhZؠ{HgDy1H0`0HTFx<~ͺ?V*쌳se[h0)SKܼݢTku-&ϥZ6B A?ck_VԬQ&G_̤W}yFVgEQ37l0eZ./S3ē#Ke+qldYUZ 'Þ- ϰiOp3+['"Y~H+Ms>]>|0Zh L}ҙzX]v;`'D9»>m{;1`p[40 dT2.p\9X`aaK>tX}(K"+hVqZ`7Q*g'FۛhѨ9j B!AԣQ1heVv|cΧ>/%}ٵ̨/{iF孻9z W:3ug8G`V x<~X:Q}   2U2᭿wZ*Tgʔ(zJ}Ѝ\[[D)*#W!QplƜK]=+rO:A'Kv- 7ɲ!OFS{9v-UggXƴ'ŭ?ۍ,<6U2 s7.w܈5dRB!A=?.-]dҏsj=SE^Ff$SL5iSݱPL]:Dn^>(Bv#凑/S*ŬLMf\je|*Lߋ3818 `Os\CDi0-ߎe>ٯ07M&mnǠ *fF1k\:ūK uFzݻr0鱞=68ov"<ǣU IDAT%BAԂH^--+zZTcQ+e_VWvVGjwבuU>RTU͈P?DK3wznu^*嚩-:saj'Ta#ɉW tR-k.}J:4jcbmZ7Qv^U3̷U;˶ꪫ9ΪiWL!B:%ţ0kKB<2.$F];yMҴ|""oe1J#wnOUuV_ng:llQRo;piңpp5?>{ޗx6 U*+3=FN]ĩW?]"ZUn`}'nO/;4-l~d8_G"5h5eb Qp]uf-piyB?{?pw"bAPAE,E јh~LTb4j c7&DXEņQ:?@5ywvgfg>73x6y$jCfCA'8ezqRKV),7/p9x#{~)A zqsi;ˊ};0rl 'l!nO7¹vD=xkZj|6mPPBQ({3x58ĔPZ 0=3Z_ft}WWaG pí4m\x Bpb4Os,Ub.C;^*x@J(!xu)kP|||r|K7krE3GRSP!!! !D2G0ac/Fuj{yB(yHI$& ) B(!R@ !QB' BH%B!AB!xAŚ̯V|٫wv%TQzr 3sucFx8=lQD^s91"kh0m'dlxe3_uOykm<{Ũ̗CI'!D==߳70?Z0 'g7&d`G~h?VO(6X)口ˎo&iI<=weJ ǃ8c1s{KB!TtgE+tWXGL֫ZmWSmn‚FZSF_Ndy5.ս2};Chgԃ ըYشԏbaQp}cpUf^:CK`̙RB ɒ%k#b|Fґ_̃S4[3?cܿ'ji/ۄ6ʀ2!B_ J%iӻXe:)@͓(f]&VL1tI\ȨWM˝'5*X<.!8<_ IPBRϰ;OwU̼T9 ቂ ] V{z)NiurF?)C?Biԃ1Q^^^xyyV0v#7 % mIWmrXfI!.;? /Xش-UG9~vnUZ sB!$z޴i8yȿfZ1тb݈krvҿдqw4v~3IRQB 9a9댡abɄߨE+s:S0kh=au8OLK}|ͪڣye?~ŢER@$BH|{cqg&gNԥ]L %@n|L, ݁iT3z+#SfU+2i*ŭA[31$BH;5t|Ȍ|m?8&77Xd彜;WMOiHiLXٞ RW^85j#=C|V0N2^P H !xadxȟ.GQ4;| iЊU>9v48qk v(B("%snfK~v:z]nQc}7(Icָ=س8vVhOgӇw2.U, )k#3razU^OTt}p5T8 ~uu} ~W'F++P9}{*XjPLi;$p j˸3h\2-r!l)͊O*B(%nmO'nFtՔ$b88$;O!8q; vm86|E9޷+g˲-\Mߜt_fJ*weET-|[JzJTDE W αj$t+OrZsҍTU>f/:tcd9B!^ ʺ`F/g#+ |p2293{PUzA j (6#ʨoQi~}.$ilYN,vX׏+Mஹ|ܡ!^jPセ|Oioӥsfa_7r9Ac~CY39-[l=0}TS zEYRo~cA'lMMr~?o+Ҁo~1ZP"L͟ oԱ4|\:LnbS1.=iRpUPUM:_5+LM18s;=zVoMkݽ(yBLoSRl3e [xs1<ֲBOXV?6q>g[{$s|[utT/ò9۹t78PKq-bStQ9[IɕJs˻e0{cc.u>1c4vLOJJ|_3.C\V>ˣ2Q}v˭oS?Z=u,SﱣOGֵ#Ѥp5'>o̘܌zh {00L.zϮ,9]rr38%EO0 ̻6耳{FV>nn)#̤{z'ƓoӥZ}y,?odw5crfj*їlCB7y jv~(5 gKDĮ)t^#%{˺Fb=!N5frKW- \2ԋU[,u; _ƥ KP&yw) ~6VOiE[TKZ:L&{Rxq+G_ݘ2]B$Lݚ-#?uȻD5#7n,dD<:JժZ/lHZq90Fp$㡱 tUc܁[}"m6.=Z:UÒ4TUq~}Yf{̉{0!(52kd\TSz~l>ATDwnsaz!7 !x}(qB#Kv/>bfh.pk'mD_flcKz{cB戶R{;*޾'V$b5 ]g\Nz_$yEW!oBF#9ɵXT`X*e5Y&ğ[IY]֘3diX~?M1m69t2[1o'1ӕxbd0C9agRp7wֱڷ3~sj!Ƕ0op&^!BӈC,lVÂ{:)i vꑣ<\Y6 ɱLzE)te !))I M! AA~&LcYبNm/XD A!  kYZqQ@JZ!BlATHH|i(!BrBBBpss`IQB!xe@J(!BH:ATy&S}v:CB!Pq l(55 :s~̫bJAQv4vՍ6=mi"yT̪jKY#B3zс3;OE̹h!'n ;yFIIyy䒂E{1?Sɘذz=ғlKix"OCP6+9g%Ѣc?K[q!Kϋ:+Γy  ߈̳e.pf',_r|0q'zyn8Y`:}ľ.Yf!N-o((%3،aetU-7*b@կe'/-#<0+ىEs>Rws/ z6UQ>|>g>3*vb(kF4EzKG"liƧ9=FbכqYؗ:6r9$y:-U }9$F[&pn6,Εˉ>ZAQp@pZ:5FC9sEƣ\Ng{Z>O?Y_̈3'Ю3K>ɸ6rk v422;Y'V8HZVC((Ț뺜i,L,: Syh@?9uo!"EܬU.޸ɕu)UT.EMJPkf_XH7[JgխlQTZ$jDS TޟŐ%{|#uiQ'9tKIFNjֱrf.,Z&ob"Չ>q1{A'.2?ŸOeF\t*g:ր}L{D_?’Y<|l$11DV6-s3[ףrePp. J>ǺUORȫu.y+]ĉϫ!uu}զ߃R}=j~R\ P=# y"fK;iz4AUsWV{A9+W#ڌ}*rs/uӤ&uVˀa r սUԺf/N%=zKyuJ%S›jZ%[c}F(M WPmϟ?󜧪wΨ9ΪKjtBϱaznz'*@XYOjVXzyZl`|~r#C˨eVs])j ղ&5ae۬cUMu95jzm FULԆ ԵQijԾ/wT\u-IKI=nqU AZSKw|讪9V/S8r+-}jbVjշԴNjniT3wkm"V1TmT矎K?1Uo#?yOtuVۖS|ƥŨ@\"T9roS߷T[Ws^E!syISLS;YjX9Ed}=n)Y}LuOՊ.NIy%岺ZXQT-\WYlV߱tVQ_u4UTe59%TiXq}!{rT/ ]37[3?yHnK=ZT)!*Rfy{ L8Ӿ-]XV  jv~(5 篕]S\DzW`j#1Q׈ye1Ӌ_g/S~ަ \˥9Ե4*[IP&y<0r\"QWsLnRҷlYvS[ѐxlOcl3:-9֮= Y.R0wJ5l KFM8s<7[G6ǎ&RQY2K:`U I&Z!$iT>qĸ@>33R`Oցs۩#\qE݊~^iۿI/-Sv3&A!|y z?]!lg7a}y77>x[{we3wnm1Ӑk8/I1;G :>6A=;-oep7?`XNU(:fP]7"ݝM]t^(;Q8l=)Dkž-ʉ Z(d[mR:_)1; f7K!rWHiB3{#ʭˋiR ˎ/0`Ο?t.n͖|]">r&qbNFģӫ[]AkKYc?.Sqey/}Na?Lr/U=KPU5뢿{_fwH(oKlI#>}BkaŽaVK gb [,]WL4henNW?ue?CE;Qo\3KӰ[:bdJn-ݳ=N~W7,!~ojYҠ_-BlVg思Qy16FFx5rݿ###ly;?q+'4fqV: IDAT?gR.]ݱP\}*iù|76wȕ_Y3TW\[$Xh.XBAi ~^BbcbS XЅʠ0yMr_?jHwKrѢE*Z"nq^,QߌA30ht/ȪInۗ A9v{'nķ]h~WPr=F=,59USr-ǸӞx7sx]ܭ5hVfוC ysOs({c\?C5v9&R$8ŋOĭZEGd) Bbt:;١լ bk1HL=\8}(T}6Te8&YQn̾.z0yc?'.$KBy.=^?ZIx=}t%Ѣ0r*kD\M};3qK' -+32xu807th-cp?4>XéKǙS#D}h.]ҥҡ8iwog0Mh~kmZs2EAIeVtǷ96}Y|6>E1ͽ\ԂҐ[q^bÉ,cTgTk%dGY;t :;^x}cǨoZ [dѠ)܉JB}]Xr0}+\ SG+–1aalYVԇ<1%g;S-"#@/Qy{ZЯF#9ɵX2ϰdUjγ~MRQ?Pc; oe߻1C6iח坞L\Ag8z3򨖷¶T'{YogV0BmaM+Kpm܌Nt'f1zJ#<<6p&w{#Jﻈh˯TNG{hjW4~&)0*i-eLMl֎0 $$$G%g{\w\/]3umAxiYw4*5/N)R3cĢD)pr*Eq3 ;]w8d-D7).提ln')2)w/TeţXIbop1Z Y"/\Ĕ=o5E[Z,f.(fgue-ƶ_.ѧ1E5|ʯP׃Rp>\^3oѰgڟaBpo9#5MXϩ ۢX!uaք ,M >؎؎~?X6tm5IcɻUurOpǽF/ǻwaP9 5xbpk6 ~W粸5+m5MS0=ߎP&%q?,g1y4u^LYJ:ý=wdr A,:/Q$ދ!բ Ζ<8L+T{˝ZT4OL=Qލfȿ>u8Q)<5o˱#@9Vm`⾓n1#o)wsU ;O%zi\iK.ٵ41PND'p7'V3noܹ'sb󣧁XfKMI>˷͋ȈbAY8r%N5δw3C pݗ7,F%,)}]{ aߗѧoxm?s{ULDK9Ãix3sk~ka悍%XyFRߍw3 X7 P y^MwխdiI5vPOi8kݽLM(Y"jR$O`}sc ^6sN]p6ܺ xe." OHu+„YX,y?й 7$kKMo}u,䂭)VmtO΋jӂ٫?"qRM){$;,9OXZQ7D%SK\our4Λ^Ss^ckcI֟ykNj2>aEaĉPW G2̞6 ҙ[lTU!}j ߞ(/_דz*w{k,WBc̑"Z@M%Ubc(qժUn3l B-oaْt F/[FfT}E`|ցM}=)>4z.L_HD !x:LJ`K@-u*t 6|OKB!kDg1g!!el(4,F/ۭW!Bgw:AB! 2ݝB1G'E5 bFp-HdJvb$H8G&4t6`U+ )jiIɺ ]>ϙ}co((vT8yB6zDQiќOTas\ ZO:xODb!g?n@{%.&LD ŹnlO&P}\q+AoScy B! Jw}=bȇ `@7*ToIxc?(: G-oR>,xYʨFEbSI|'7(4MGѥOe:qwgڦ;L})7|xAx &wHMB!c B!L"BW̝"B!ī굽;O!yzΓ1QB!D !BJAŚ >Wl80hB!^ pLsq BO@%jwS#B!zM`p0oYβci 8}hZi$OY}ǫ~a0 #>`d_>߯cNgG /B^ۻ ~w`✷0r +2o'ES~ԭ(;mFW|@=,Q9>o@yZ{ GUUBzM"}Z2r Iey ḥ eƬ6p-fԣƝuD +=[2L(,B_zw)XxZйz ֭6u$"TLۚ6B!Dn͖|]mMm7ms2"^%vχjN!0FP꫱\%v $d"ASfxK܊*SD`\ z6ޥ^|3J !o<ŎSWTz0u3-1b%$v2bZfYRaBB!$B!x1d!B2^B!7CO;lMcdN.>Ĺ*:Zm:Ϸ5*(>g_ / -M]]\z噎) 1x w`p"ǎXB!x}SPg`;]sljMl*X^&Y641x>o̘܌zԸ_a%_g>_^ A%iӻXe :*~y_eʈ#3޿Ɠo!tz:}ޥ0 be>R-(4MG-8:.B_H(XxZйzn2EFbCi[Ӧ+xʑve?! L0y4 sD]&t<9Cj4IC[ҷlYvSJB!^b~;[e|{.y@m}|MzŜGW!$(OJzTmjEw $ (#;UEfHk}cj;pӿOSƷ@G륆 !oL1Ta~DSmI)ŧ[V #2?&ueS]=Ĺ.bHr G Jhj@gz;sO]8Q U};k5NIj%H B!ޜ \Gr$*k˽Υ?ΰdUjγ~MRQ?ytunƬٍɛs%/ǭ7yMZNbk:̅a¼ 8\`:0¹vDǡ3vY#kNS*j|+N優>>+P̞6 &Lȱ,{lT̝'B$$B! J!0"B!ī0w=) BFx}B!x^(4P (XPfIJa̬&x̼XB!x5( ș3 :Ž~0h3"RB! *wVθU{40g6ltI݃[ JPgA*p-mT2GVHQPz?H e͈攷HoQYؗ:4r9H&BW%AOHc=)* Ņ0B#f!(BM*jF}hc|wֳ\ĒNLn?HCwe!=oWx&Wߦ Ɗ\!u̝=pH|h4:<,ӗ6QZ9ߟvk#Lqd&ݍp#cx2wmT #ʠ<ͼkSQ 8K%B!^Goy (@1dwl x4xܬ1: *~BB9a¤l*\FӋU[, ڶƻe44E !|"NgB h"7n,dD<:JfZazTmjEwͪ1-N>6NQl&BW4RqY2mBZEHv/>bfh=JVQd\Nz_$yE6Te8&Y gW!Fg9s23g{w/dUjγ~MRQ?AϛΥ sgnFp':ձڷ3~sj!Ƕ0op&xbd0C9agRp7+BRD*љaN?5uчsu`yXaW vd6&k~axwm X_r~fZ `戗/_h3"|8ڍ=L{:FV J!xݼ~s)vtݯҵ M{ 'z/ɲt1b ^6*i?y3'K!,{*! s !B<7\Ű^<O 5-=Ɂ*L{A+CIHY=ic}ǟ}4ۇ6w+_l=˕KA,V󍴂Ǖ#+х'ES~]S~Sڌ>D\avk\1~NBz BqMÿMB!ijtgJ`t;#|\>)7K]6l).SO@bȇ~`@+_>+Ne?czfn7i c}> -FW2Lz@~dOnM_\"LMb0(1翳DbOIDATǃ<30 f@Y *]ePf޵Gݥ !x}wQãZK&q9>gKTR!B iCƔS\QuW.cHPqUSc^ٛ*ƫ}e?! 0aR}WM*A9]5 $r;0H#b4M$1@#|-WhSdqҬŀ-[m[ݲ}SBB^-F*)ɨ듉K#m HdRWQ{ h 0ܜ1U=K}{5 ^EF)ş=P"7nɿRԌ}=(&.K8Hhs=ncL?Ṇ U?yӇ70O_1S'j:vd|7cMǹtAۗYƂ= ycԁOD0f T~Ї/+ߪ\Fȱ-;MgqìñJYyI**2rRp~ fY o~cXu(R`Ob=Fxx(7lL+! P[ 4V?.;Zϊ),B ; ցŬ]ߕ}Xaꦀۻ*C$rLhYE)*V{ttiZKYѹ!Sgl:ԵM7NZ_s^8+8Rnzl G999'豷64771[=em|iߚ3{,3F%lB!b֟c@Whnn~릦 ̚5+O]^>'=zt{755mmlCǹqRLۣqp>;.y}+2 sty"ןvFN{=IM=ffn~zF26y xUnP@7AB@0]yѝPʻw.F5Q@НPy%НP(! kX y%НPyeN5Q@НPy%НP(! kX y%НPyeN5Q@НPy%НP(! kX y%НPyeN5Q@НPy%НP(! kX y%НPyeN(! @Ź͙3G %=]v]cǎ%DZX,Ba헅%p& ZZZ(U__̚5ϙ6mZ͛St555u:DuE R](bTW(! J>H}*ѝG'tP:Z[[?8@7~X*q&  nv[(v3@(! @(!n;_ ( ۾@ !}f:@= A4}~}3gL}} .MMUkiyA2Q(-;H`'BſFwx/^\`̚5H5+#eP#P! E›P#P+"1znN?j*D-uڕP#P~G @(! (M۝4|'Ex~=G tCYfOrkra{e%ce]sz& BG }3-!m?ϛ)_JV_oNN5/fv_||OǦ*e̹OW>X1 2:Ql/%iϗo>gN>2ss㵇+fw>zK^t{SO/T|ْLq\>:p@bKM?MU)eqbvg~gOܯCF^G̺btd]O#?ky8njIUUm;,^&BeLq܁[A:>=EKߞz*0m<,&$۝x9$rY_1ݞI7[b燵/bk>?,`Vlhˋ?f& (8/gdGe%y!(/[-φ!U5{6K׼ci8hl,R0t@ټh]~X|6WjUYlIQRSH1Uyi喬[|Sn'յJ/)w:13}3y{B奪fi_5ۼy]5Śf*ߞVeJe--ݛ[=k^mBYCodъuY~]6lO\1!R|tyjtʙaQkֶɗ`g'󮛚W/:+7ԹgaMn=/de{{V./Y mfhj Y?g#^K=9GcOϤm'zo)\6ڴ)k[#O(Q]ը̈́+/,˕G4}dϠ?[ۦ xvQ= 3z_97_'傻eφ뒌{=mI&/R8)s矑 πj3) o/wK2Ѷͫ= .d}p]iW\|;"Levz8&W-Wcˌ$,\uk'_Lz=(wtvFߢl9PgvBrD3kCu! E@=d'2 Dt yeHH2gΜL6gkkk0@TC+^š܊ Q(F$1WV:F"D#\ȢA˙n!O<!qALQB DQwA`\Y DtIݿm$v4D6;ڌ(:a1pv]gIENDB`fontmatrix-0.6.0+svn20110930/help/en/images/glyphs_comparison_typical_view.png0000644000175000017500000012030211217643650026157 0ustar malexmalexPNG  IHDRpr 7?sRGB pHYs+tIME(tEXtCommentCreated with GIMPW IDATxw|dW}69M/+Jzlܻ1$B N BIpb'wb[ +6ojZ:}-ܕ^;磕FWwι3̩lo/"J@J@@J*|'E!ͥ_@ p)qJ𯶎e(9U)3#"v_RJ"359 P AXX$IID3L{+w$Cty~0|C(Rr)7JJ)>J""Rb;i1(}KhY{(鍡|UnJ:@X}m75k~"Ϸ;?qҰJYT۶'St<kSU IR2I~=(̖~lG833X|d(kkWWo6OW-֜÷=uzk_٦Q;~wz8|K\u=;{;]x-ȽMD'(7=MDX䲺_w6G. OvWmH?cksS?ˇ%_|7e{χnPY%/SHxkWJgLm_ [|+:szvĤ@g{sPai Ck[O~Gʍozc^ZB .LJf<ůO߾} /<>}^ǥ$A$80gF\Q8^ܥ$93\ 64FD ;Hdmm O;:hN%)I$!%ɧyatt?ܳk⑳:׾fz:›r˃N9s9TO0yJB,P,8)N&ylodnq¤xu$F{[&%ѡCwPN{o!kZ(|QTơ6k jđPe7@EDJb{!Pwy D]v֜پu^.E!(NJyĥ%gYz$o"7'yQ4QGP}<:`DmfJ$Jc$;;:ޜPJ`3އZd3v74R>Lî{ $s^ .ssd"sٰq=}m_Ό]˶ᮞak.+*#3}mcHzⲿ6Ǿ@ƞ}8Y[rs/mˉc*}/|/+p5@5yC);_`՗7?̮!֊K=[nnӖ?\$"KC=u[ <>;&BhV6=r?׏:li= onƾδu,%D4;)0c(s~@K";v C,n}ٕyr4t,tQMɗM㡄aN\A495lJyw,Q邻7p]ع5k(xP*uʙ{;;;=W(uܶѠ|޻(˯m[wek~ɥ+"cbz𱻟ݨXk# ^ԛ`oe/u׈9 |xie眝~:mPi=[SW?I^E-DJEjUwr])͙_oֺ?y'/yT񳼥JTD@L?764#+ܖ}?|\3G,?]/g<ܹ1-"c깬uoվϗ֨l>+KIZә_WILwmmoSo\"~+g6?/ykoKߕ:of3ݹ4]W_fMOXWɣ5xۯQغgy,cKi)i߯UGܖ{4kKԮo-7hbr=[p͙:#ϻn~-_>N:6зmN^z&\8'Mox~?;߼~'>un'X/e(=9ȃ?P5]5C*ځq\۱Um˲gyw*˛[d󽼥4vxA`OpRyw*)PN9Pr>fy@JP,4E'b[(w/sr}J7{; (((+o:)Mnº챝]i׷+}uw^y5W]u? wK}?69<䷦?{G~ܲ<kكv}yGFkyVc`ѳ?󃳉D؜__}]{rtFj^y(WTu\x~[+NCNw W^Ə|w~뮻?|Ɯ c?-Ekxݵ^sO绷|;񭡇z]{-c}+xM^q?=j1 ]}[8pJF~u'e{G-zriS${쑻x럼 ϻ 0@c_wǺG</(<_ZJ3~q]"1gz>#?̷>bw^^O?^8mo_u'ſ Sv}W?KMm/36ޝ/ʻ?{│DDJ.yg>,wtW?Y=͝_{wp}oΏ(~ Zm(|*S.6yFK776^7p""Yxe]!Έ5ݖh!Q>h#k.lҙt5~tȼ7^n0-:+|7|nc>O|0{nkxJ/?}'%qt2r]a4yIJ-=+@{3_HwoU{Ny"R#"2{ƽ؃g{;>:N[m-Htd,vΝWѡ1R|/ò㭟 ybYK;wCџ,D=sFy$UQ?ݐrgEK+㨉D~?czM0shlcύ}Ĺ#07NےHw?Psn~t4Bo}[P4گi@^ dɇ̣(#Jk7yU"ЊO: w|7BkqU ^{cEx?PYwCPkxY~mvWp&~׽r'{m5+#?ߌ‚헼8vӭwW= R -_| +iu7tr86зmN^zm˼ߧToru{V=?ӿx#Қ)8۽/'C<Uu]3􀪫xǵ)[%۶,^}ƙy7֋Imc-u#5P`(\޷!嚏~3BJ8z,Qpr((`!:Yr~$J@J@JJ@J@@J@JJ@J@@J@J@@J@JJ8>%J@J@JJ@J@@J@JJ@J@@J@J@@J@JJ@SQ0礔m;#RKD޺+Bx?bJD0uB@ &pDz,۶m۶,˲r\*3cD9R !fPƘr߯=w[(aah{X@SKii BP,m޷py`PQ}V뺮fSlt]W%ٸ p0Dm P%,˦iJBŢeY^R5Mb';/_5M;OiYi^ДRX,p(:!A|>tPw̢p8WR(m;JMNNz]aDX,Da$( 4GEQt]чs|;J\.7;7(H%I P+̔2L.#"UU9U 򧪪fG)eTڽ{woo(uuuxܛ~ .Df2T*555ld2Ă;f8LfrrqH$R__L&# P,5E"4+Ζ[\'d2K]QJpTfG^ !L,-GN'&&A7P(D3smFD(,˚OR!+)P( \ם Bmmm @) SSSBA4LEQh4-}}}===͉Dp* !)BUU èC7Rf'''EikkkmmE% Pr]wzzzlllzzssDȶvJ@NJJE1 EV:M8{hiiA%̽l6;666::4 kT˫zMMMb@9P(GFFu=Kce"moɒ%MMMVp{%% 0 ]קVXL&Q&@ 9<<<<< (8M7nlllI@ lݺubbM0W~555(س8MOOh44 sk 6mC@@ % `i`X\|9>/͜'L&/ZJ8f^8   ]0ǤB!뺮ށ1}@ 3~UVa P@rǶm۶gC5M3fpEns9M^tgr\(%c-EQ4M4m ` lڴW P@RZU.8aH6 yxiomrٻ,4|>fgs-Sd2[,0 (B\u'655E"P( gOƘ뺮xVRP(x29(@`(RSS366fU0(\5MӶmuhKKK<b';A} `pvtqrD&-ONx7{ƍk֬PU9X,ڶMD Gx-Sd2L&;;;-JRTQ0fxƧrOOS`тX@ n&Y|9IB===d癒sFlryaѨ'_?{Ly8T俧-xmO**Ya V@EBnl2?Z[[-[NmPk'pjLH!M9VxgZ(f$Q,JLRK,b󩹹yҥ)h:NR5IM_~S-*(2̢EPȔw! 0+JSRybS- e@ rD"с@<@ ` `VPgK|Y/ /X(&4˗/GQLݝNu#G$c*IMEG}GWY{jZO3FX0L;4`ɒ%p8$i/5&4#P, |Ӻ1j*!DTk=@pPoJ*`>c4(mێtuu(|EO?P(yb8B2XG/֕\~#PT\.٩iobXWWW:=P(%CSFuߛ@ P B8Fgoy0e0, K.1jWL8TBi=L B49uuu=sm95773P_)rHۑ )IHr]sd9dlGr8#cD)# c6c^:hG. J0t]ڹsgMMo0OMMա8WPɒ%ˎtَt\ ,dy,"4X@cH׈#"Cc ǕeG:.9.Y,t^LT˸ B,UΨ^}ve@ P8N{{;b(HJ*eC+(oL(M (ѷ\+ΌC'bYNǝQǴe@c+&Y u4(o(t݌@ Pie+cl֭ qz0䢾㨠|IJvl˚jVOSC`K[ԥ-* Nk"F&•JġVyZj\N~ຎ㴵(*E$imm00FJιiccche[ ´U[ު.S2eg.֟X54ƕp׍IeSEkG7%@* ---(*Nsss__뺊w`0gϞVTJLiKFM[ڢ*J,0]^5b]P©1|7c}>̲CE~^WBuu]XFS1g<+7\zu++)MZҨe'\?ox 2˸"r 1r J) }d&vxVr"v9TGr$tq[J/ًݯs_ʶa{Yل?PWTfFccc>Bl6[,QSҖSIweWE:3ВTiՁ+'\.ڜQsRyŒDRJ۶t[heYR [?g%&iwbWG.YeDU;v3|)6qem>U,갪K BxT*Axww7jʇ%9evM_ ١ AOn.u4 >|"W1rh)˲QU\@~EQ_E{%w_9SҒg-6&^Pgц>4R"Pud2[Uթ)T;e>3pU35uA{2Xņ8z~yJثT*`꠪j2,J<@ 066j Ӓ~yxY ctE9ӏ-1]hD7˲QUϽ޺[h2EgI"MFӮe;`C?\H@ cm[4zD٦f̗ݫAjR|mhLSئhD+˲a(^o0QM+vek +.^aMYeC`MPG>U*]}}ۭlF&q],|e^]p6Wk#)?^ae94'%/9O<mbc:==j: %͓;.e~;`@ OFQC 1fJM&&&PMVɖh{_qH$r\Co{u]fS"SK^GI-rH-@u}`0xbVxGgȴd{ޑYl҆pFn8v&304(l5ͳ)wϽ ;e }Do~K!doZ˲BT*JڶJ!Pc7@5gJR ˲t];0/zeI)Q5BDoN^fd?=QCC %%J8lp P'$; `9rX>%%!mۖeٶ s]Wz_x?Y8*-@ sq/,z,*rٚ-9gFqΉȻ?UuB!$P%(!DT2MX,BP,}CE BhO%T-˲L4MP(xѲ,/,rUUUUy(`/qr\&rD45M x*ift:JJ^SSb Pl*d2RJEQTU hppryzzztt4((ix\Q P!9999665M3 h {9T*iQ,p|cKJ|Kf'''GGG]UU5 F" B0e !4MD" j!TL&344411i(\ם/ˆab PQ)ÜP(!@ GkjjjϞ=L0D"#`>@ 7tzΝb1 bIWx#PGPMRP֡HRoll, b TJSɶ={ 꺎n,lP1\ڽ{555s T(JS`rrrRx<}n8===XLu P1HR/2c 3o뺽###h0  P1d2/ @ p}Jp#B_.ݻwqMP@sWnM\D4i}C-d *Cty !v1>>L&EAo3%\o6]FGnD\ױGC3mo޼P(`67=M뺦#֖#\ײ-RJ Umƍdz\BW#"!H P/Tzw&ٴia\!lvG1 1\QEQ8sƘTYض=<<@ [b "r]׶m۶vGq({pii{_,́bqxxO@FFFvر't[U.(j8D"`0 "d}.RY$"%)Dʎ$"ۑBRɒ!(*;.Ҳ,˲D,2IխlK)r+q> y6BZt9.ٮ,G ICBHGJ!㒐1pT )UΈ IBKBRg P"PTL&e˖x<@ҤT*e۶hccc"F *LT!l˙Ȳ-K4-Y,K,ˎJ%׻RSr""}s'og$$)H1FphջUSYpAHQ)<%’6lذfs8drѢE555~ ʙ"gʬ)2E90-YeɒK 'E!1F3RpR91 a!%+6lúW,˥RɶD"qi"G68fM9HiIM%3gkLSY`S8S8J(N5˲^z%0@>F4Mu}ɒ%uuuȑI9w<-I7]Y3Ufh95m@ cm_^UP(T}NJY,KR$YjUMM jT?+)]i1r&݉Td,b %@ŵ ƍ(W_e֮X"NӒ#)w4%L:#) i*ٛ @ PmV*D{fPhllloohS"_Ɯ{i71UUUA%@^`qr\ Xvm,C-̿lQu 8i7hu7O U4Mo;*PJlnnfx_9lcOEPg BJ*&ܲeK r9555-Y{̧ɬ1ls,x#JT*%x8^5ko0(p^vK8&h%Nc"ɄBk睤QwʩHyg`qg˖-hY¶L&ںdɒ*x8!mM0l. P,H۶mWAcibqʕVdMg{,"$$`bX.>[o%~TQ(0uw*}=/MuYUW$lK}v`)M(8畾$<6ﱟ\VUhTU QJ "˲S M̃KLQ6&x܀@ vޭiTR i~t/7 h~ۀ@ 0Mstt1w]7ϯ]i$M`F]$\I$AD ">%/ڵ0]QJN;;;cjd{b<xWRJ$ŸE@) HIIHHblo:t\sdD Iޡ™ʉs9*i*]PȔ~&''kkk+!dٚ6&ܿDߛYwQ)Uc$GH%%BH!HJr  T)TTi SɘU8UnTqFޤʈHST IDAT)L9th֯ BD;wB]*X,rWXsiON )$4˲H%ە ))B: x`!tЙ1G X# (fMOO]q4>슞NO΃/-%liZdIGHWPm7&d D@8.}}}=%vvvb;9bM%dTd%Y0#vR<㼩M(8%( BrGOiFKK `IIR~ZTTVT(˜),ʶlLz}Dx"&JaddD}ϓbq͚5Q$ʁe62 iꪌ5͖c2|\ JH @5pZMl9\v*h롶M(ST*e@9w:A#E8-i>'r^ ֗H$l:#sGLyc^]d?baPF@I!ԹP` Tʦ|1EuGTd*Z"3GḆv C?P9d2w-GlNÂ3.t=J^4MAsBM04vƝ2\ bMgI#cVۇ&bJJJjϵMo#e8aF'#(̾r̖vV4 ^ݐ 텑kt4S(9].IVP R ClBJ#|G9ZGPR!Q9 P8MF_w-}0)MJ];:_s? "̦9Ed(sTXrKlt 3ʃQɭ۶,XE4PSYN09p P"P870Ia GÏaޞO>s'B8gtz<֧A dM ӦXAGtʖ;|t` @<$ᶱp0ׯrU.Mty6d}h̙@BL&#sYlnABJJDV䵩HI"ތ^@ `@iX@@ G;,4OF%!O%m6>\(sc,3; ]}{9!^'+2/wM>{^kV$~=$V\sڬS<:>!qX-a]JP8oƈǁKD@L??*dCu)W>/?3Z &I}cenu3l]MF6`Զ/]|hJ JsW0˟E<|(ڴR pa0.[`܃@ l|rMey1I!=Kudy}OGm|*=I!Fۿs9˾qFIo-_0yĪ_?w.۳)T/r9Ϲ_S7w=?Fao}_yagFRxt]pAmyP"YnJd0\%o|>t`qN՟?}ɟ~4asO#|7ڑ~I?%!\^|.zeWB_{y6v51wv-[HK! [ON$2Pt:]45.Pb1 FBN9o0ᱵi\}&ȤY⎷B狦P0RK0ľn4ď@ +_E;oʟ<4 jW}W'BL Uzr4I|sN(L&TN &5^5#_4gz5yڔc}toqd>*^]9(ѠId$ZqEL}cqdՏᧄ]S'R9F8gơj:>s߸Kֹ_R3\u}]Z*)`Kns s8@@97 gKF̦=^gB32 GJzJ-8cxK[_+}ӻVީq9wc!ǺF.k׍qƹ쪾YkpnZ7/8K*Scj燯-vp[<yg:/3| 20 |gٝiib Jf6qb% P^$s6?FOv\0Moџ/xH_}//7N9g\Ǎ!N.58 iey9WbvNת__*iN8qvc'.vqg@icUL&,SU(SZ n@ 96m{ \n 2TNM'+9G}A9 &$:)!>П]V|2 RNM=TD"P]^$`E!ʔ@2[0(DE,onShirNrl@ (},FiS0$Xp7Z((ðꘗcSiF"{7~tܒREJs6 $麮i*^zzz$Il!n֌@ `{PȾL^Tܹ;."z#\:*(lwGoEQv܉J4{{{].bH P%|>JFme?A3,:ѻr(DR[\M6*si&MhA`͵25wgï?73#W^^ƍ9MnwΝEEEСcǎL&QwSêZ2me֖`m)@I9{\~U\;67܇B{|7֭[CZ%Xv}0j(!˛qϟ`iŤs.(Av(-2sijΛLPV%bqqq2,>R]vڵ()'d4&uvwJvL) vճ^]?_B&j PJʎkɹCӴ 6L<M&ٸqc @[VY芏.vFYWq;ʑO'cq2y7tnݒ~(ƮҶǩLyW^_iYI7Λrŕz!̞7oʯU#$.INǾ݃U`9΂7RB|>_<oiiA4׭[t:eYFiXVa@4-|8h} )!Ĺg]xi_Nqå_yaO~)} Msw~5;X;/^4"jN}tݏ.ό={%gN-[&*#ɭo4Zzd^ジc*wל=`KKK4EkkxPVV2uWof@JD,jFaٗ}yYv6wnfpClwՏ9?zW:uBr_YpEW\sRMw;_ߒ 7+LbÛF%B [,M?{MgM a%F'R)ջSz oذ!LbԥPժR@IK &LŢ'J:5#մɩ\0c* " %!Rv8pBļ)sJH;ol5f*4^5yl#ep8VZ :Nccc$z( ) oUM &_t6m%t4m=@io?=z,%y}G#޽,}JBļ[J,=\^ /9mJp ~ϗ-ªUtc^SSSGGG(D( iͺ碚7 r5PrE#7OG=7mF]eJM=wO/r7|q᥿?&紋A1~wEZᙓhc:gz^/|͚5ifP{{{KK ҤEAj4VJ%ڴq;^Y(GXoʩsW ɿ|rJ̍ŒbNsɶ^:o r~GX,VSSS\\o'_I*|Л`^:ۍPeĈ9(~4?~nG `X"H~Wv򞞞P(US(?2u)u]}^Mi֊CBUwa3%9\j$x^EQVZӃ*>t^:cEƹnX/6vk>4v'ƈ"p@rbi{ zVo֫IfLٗb+itEaq"I"P؜+--ʱDQ ñXlٲecƌC]J&Y~}:4K XS! i%H.cM޴8hEQ gܹS4EɩFJWUxԨQGwwwCCC)cѡBI-??????dޢL&zꂂ5 ?i:c{D8p_CbdVqv/D ƮhjTgc0R*ni{A> G"P)5ܺm[Qqɂ_oXnӴwlllt6>}խX"Lz<)p8**++svH)XLe0?=L%! ()I3G9f*[[7yNsmedJ0 ÈwH(Y'CjoD'._\\MZRx۫s~`e4ݺuk*.yx<.IR]]իmQ>tj?%%%G$*c#\šmvmXǘ2Y|ca~q.IJK^ IDATv[fJqq:Ǐ_n]0%7M(2yWWWsss&q\L& !'OLn;[jyιG(B_KfǢ@bJoիY81BZkȮ>s{舘D] *6O/^ݷO=gB(nnnùc(`0m۶痕ކatttB\.נ-N5M>}(v $Ym,Xoo<[jA}>3L[.C7v[;=$E^'HJx<7&DK8DbڵTTTt~U<$ d2tzԩNE)^Tv5Z/&i17wReT}xkUM댚]1Q"Y')D,ފ@ 9|ے(^ܼe˖P(TXX <uuuܹ4ҒPdrɹ:ˮ'?͆I*K-h|F5ޜOhahI81 8q;@C@Rag4Lb09 B(E"TR"P"T,ѢȊK KqE")FY@IKzEdon׬8Bnq\'N\fn({f5Mhmm@ '>$KkD(ߵ)iF1c`I^ 7֪^gQ$D✘3N'ɳdz"BI(%T[팘+WnӚv>Rԉ3w%rM04iڵka(nf&10dY@d7iL&Dh4$I(*7䳦cHdĈ8^,k\~O~D$y6~3. W[*}YC.nshIc> {ɡ@1$հkzjη/VX +iU8yUwX/|G!qᢅ-J$DbѢE -c &b1M?<% MӦM4iGǏV M0uDL_8uiRӔQvx/}zf~|a?uXOr=v߸qn髯c6۟?V{e:#{_wԩE%^Թʫlk׮j 1h?^)R˗69/3g1zW׶=y'0N~ŷ|d4pA $$k_-YPdE3MM4U4е ˞#9gGBFEO+1=pz}yzۋ/jTpѕf̘nݺH$ |5D8K֢sc[:cM8=1%1r,RB\ unge$UM_עk:$Z+X4t[Y JѤOpW/.5Rrw[` ۟wrX8e9+L2e˖-`p8LmTVV4r$E'y;Mri5^>]8}ڵh4`e2D"QQQQ]]mz(JwA.`Y:o1+SnǑ|O㹹_@?9ndjft^/]xUw1I:e0OQNsڴi^tSaK׾>QL)*zK5MzU܉IQR!4AyJ6$ukVL!DQF644D"ߏ.+4-֢ղE,].dʣ|g29J!!7D33jE]:`DB!P  TWW444z^m(L&3LQQȑ#e㳁BC0cDL>\1M2yX%>&G)) Q=É6mZggmےɤE|Bϟ8qFBKymPWl >$&# Hp):R'68v(JiIIIQQQgggSSrH$t:'LA?@wԖH}IIH*#H5>Tw\7:AA(---..hjjz^l>HT*Nc|>TiXjzU/^иHO%̩ʸry0g\/0V퉕 VSt:J|;kaQ$zqRU8) {6{,Qҙoj?/$X`Edǎ--- \.Á(NnI$B3lPJ 0\qIxI"6RP!{ɶ8$TAݱpnx4t]OӚc= CU U+U6iD,~ MUWINpTHVg鴪l.@IU[[k&Jϲ)cF*wiy>AyaK<<0Z)5j S9qxU[j.9wZ8\ 竪$tb]e2L&z8 ]SJQM9y:FR#wVmm.PuҐWC)sBiVTU(y,,}h@IV;p8UUUUUUxw׮]XL$EQNӠ1MSUUM p\ٍaS9wm,QE"n: c$d&Ik<ERi;PJ4>UUUFzzz!$9nf&1 0 BH0,)) BXCHMTS$&e;zͦF.C"B.*C9Q xFI7j$,D, >I(_Q3⼱}\ƻoo  Ȳ\PPPPP@I$fnIDQ6^ q0TUu4MA`^^G"-Y 㤫숰]Fk\(J,RD:d: ]&# & d0n[{iUTb#`D^ǟyZָ7H OcVNA;= 7^VVVD___,u]$A.z 0M3 o!ao PRq52!Dy,c)Oބg$K%Q%=%ɈH)#s"PbD$ F$qPSiO yh#\$N:+Su;`L=B÷ED+'d2͗hTEQ)V=;$sn3LTv@ ;L dZпWzIk7 dDݸ1RH"4/%"u+.b#[۞X˲c(9"%,̃b{8K7t/{~E[~^y).>rJꩆxz/~; y׺NSu•7_7+a`0 !ifevۘL&L&UUvf({ߒu3cl@{a !N3].s7 ÖA?Xʣ\\͌{Hjg}y/&-oz=D|uʙs/Y?Ԝ;8罷/}3'~.uiB(~K3jj6kf{niIٿSJaqOC 9';bF6t]?@y3.җh[^ߒ 7"I=~v!\wUq6ℓObv'ɱsngx/?]cf8QJDn=02 ܀QX?rr Ʋw)m=\%.uOkN=cNw/mK{xʣlL4M;_|ϽHzE]=5(l:ȣW|i~usƩ+MI_yŋ1C`@֦t[ryu( sK$YQYq8dY}02tMSUM ]0yO8-H <J@J@@J@JJ@$d& !?:M8nj b<M%];;PU-Jm3`k=4$MBEW~ݤNz ^ѳ'\X=PTӌm\#4>r8y:pG‡HXwRNǎ,CW{7eSG{DBu'X pd,.5c(=X8d]I!4fLjۼ+w1zV9vt9կiO{Vݑ7nBeM%E}gm[~{A?qR/ Â(Bvywq#ĐD?2wې,; Bֻy9~ֻuS+Oջb"%FQ:O<% tǾkڞ*ufeDFa*QhW斦͌H:,*.;GRQ>kڙV er-]RtBDOR梳/?C(\#.$ʡ' B2hm޺cq=܅.#3>3)(,!K%o&h`& Pp^Aͨ:I㱨IC}$u.W6fJn.q)Nզ\}T"FL$ f:6%yM]`,4=~{sc*p{BMܼwqJ u7}bq5QWe2y݇9 &ͨ+g: ܌Zٕ*|Xr(jdfT]Gv!wc&sU駝3O+'"G|!: N<nӅ@<$+(% P% P P% P%% P% P P% P%% P% P%% P% #>.9w(z}V;@ΰXw+gw{hk\y[} @yPJT7:=7]uO)Tgő_`IDAT[y77n>HP !SB%S?Nxo) QvFak;YSvzri}汗>(gw&앑%ppI{(gԼZs1.B2;^k=cv芿{;TyW/xzsǎ뮝-:3wC?ܿwlvP;=x5>֛/SW&t0IBi½%!UyV]3ɺt[~DW,wՍ|fޱsW_'I5hwo+qwyާ*H,HdڞzunAѽ&`yS$;niGJ7j+//v}}MW BݣSgH 9%{PtB=/}40dF҃Ƀ @?\|̾ݞ~W=ڰ@:Eŷv~^ӳ% ɶZ7嫷մ';Qߞtv߇{mN?CKOJ-yq_hNY߯m3 11BE7t2{v35ZOs9aNwo_٭&Pa{>%' a4bӼ/_8* Ֆͫzu9[?/;.<}}>)uˏs Ɖ Hgb=>/w֦vɅ]{<z_9u:{Ȳ,ˊ($K'94t]4uMƍ=; @=X6;rwwy$tV"VJ 螁jpJ"P^aQž7~:PmgZ(*lg'gg.@(Z(S 38@ {EA-PNmN8@ `5"lwdnaw7Td*rݽ'l 2J;PR*I;*Id&>&f P*d4M%Ix %D7iH9@1*RB 6eTmoAk)͆΃Ff bv7Z[x-[ ȒL7ؾP"dz\C޾u[c_49?B`pȑ%%eHp#nztw3رc|)ODa,lԴmdةf ⡾f+дm % G ٥) gΜޛo-KRUU{ :hJn%E$o~銓K>w6ӯsM̟lA<f${qciISf\c%/mKƞo3҉V!d T 䉺m\R\8e"QcPBJA ,,7?Rou/t'z̎_:喻.+hN*5zV̌QoC+sn2pwSx轪k|÷ϩw\\*T,o X$pѵB`Iq,I{E)l]:[Ϭr 8+O`ھ'LCzL3<fͷX>QG w@q #ܢ<̩잕 KKD5dpJ)!TVWVg9J@FM#+{ucbѵ3+#=Ts_w>ZKJS/v?쫯^0"+q C?ms>RG|a3X~$٢:O[L.*qA#gGW-B9DobOp%C }x|wlڰqmNw ]'b=y7a_xa?we|2;xV<@Y7~">RGfu572:DJPf pB>x/{J dZ(%(g 9|6L8JΝ!{I#B-oZ :QWa-xPnf1'rۻ&ʼI.4---@)PA EQDz^*+"뱾x ** PZWy$ڤۓ~?`,$ggVl@iѰ&BOQGN,zhۜRJSl΂EY:^YQT"j_⃔,]ۈHB)IJB )xp$OuvrI)Cg[q͹c gՅQxY@[~(\2863ywI9gL{$n㒿͖Μo|>f/_뽆 T5%V&$e7vfm=!fsf ڣSXCIN^VUurZn *Ԉ'6͸ρ ;sZ[Q4:R "..q΅RJ !%炤L I$IrjjܓGAg7wح*҈bF9Sw:3L6gyP#2>錌Li짜q93inÎ<9|%޲3N xԑKQι2$$?"q뜃_2$MCLg[>SsO;さ3FDbcm?9Iܙ׺s1$0¡`$cL0ADL0)%U))?sېRc;m@4aJ]0fԾwTБ,\U"%#jjFqs3Ɖ96tWq=T[~)o>8[lvQ6ծiӆ9wJMM59/S W%3"Jk᮪H)5HwbIIfph۾ّ_PWWA/3ǍX,F:nkkى钌jH"3glLFlZÈ((8ե_uLW+\h}vg]%IlE˫=jw]6nz ]U+$nOK) N kUV$'<6|!dCCCYe||Օ3&sY4k?d3F$]sE5ܵˤ*R$[,d;2"v췃tJHD(œ+5ܙ4rPMSUU'wϹ{9)L&ޞUi>P&K_ ?~9а:!#۷kهr39B[l0&tCCMffkqsn] liTU500ȑbJ.^\+}毷Y,ľF[;USv@iYqzNs2tt86Ӈ*a:] h&m~`kY̖r|]lzMJVVU}ɧ_ld.~S:T. M^ 6NRΘ]ApL&u &;wf95I4pd(uͦR|]\os(tsB9ƌ3wݷf3bR<`1&|]c03҇ƴc($KTU꺞7@с^iH- ]?~;'O\mME :ZZ:a|&XVc$j*_XT^gv>bdqhwVc,sU޷ hjk;giwls`_>L!)5_T8(^zn9*οe+-r`Wc,qO}fժD3m(ʔQh'ҧd)ٟElsrDՎVM{3Cl{߸{G+&E?$=`Ŷ1 ωR<ު[\#_}7:vuNZ~H[uG{GgW~~a|ɳo~cziQ^K?7eׯ]9ȟ P&9:3-Be :k/ກ'լ\wάT{bxHDcm]1>6~`e`BRF}ho}/\]ȨlȌ ;'K,$}o"g HS3JS)ghԾ!*U{?ϡzC pHP_\VX斫C%_*F<?'̮QDz}S҆/eZ@Iăf_xUcq뜃_2$MCL <7(1P-Q3'MűH \K~V{nC)||jqo-3"[S7M̱\|@"9*䊪)~ݓ^xٴ*KK$OJyߵO{++oY46"uA ;2R>wi62xvvv[ݎ*{{a)KUOuT'.>xsͻq]Vݏyu}w:?iu"oٲeEY8.x_ۅ]s7]Onaͤ˦x%gGgk˽ҳGm[xO7wO?Pll1x|19&c14hEKJ)w_緎+|!*x~ z)>|V}i.PWcJ-\ᐱҩ$"w^Wp/c,4,r2 K=/P֬85czGFv#G%oRMf oh(tjXh؏?>BQMX!5?}}aJ8YO+ؗ+zZ1"Pfv8)3q(\qdzh U@ ?=^bTIENDB`fontmatrix-0.6.0+svn20110930/help/en/images/glyphs_comparison_two_glyphs_of_same_font.png0000644000175000017500000005540211217643650030406 0ustar malexmalexPNG  IHDRw3REsRGB pHYs+tIMEtEXtCommentCreated with GIMPW IDATxwxչgvggV޻dIe˸qӌ ̈́M.i@H!^ `^FFzo$V3G~#x};(bC_;;;E",˲J" Ǔ)EQt(>4M40,8RDQEQIZmBBl6Lz~"jZd`+**@߁F,xUVެ aHT:,;\"HOOj:A$$$|5%%%;;[Q&%EQ Tu:$4EOWA*[Lڋp8W{|@߁bNT*l6Ed2Ut%˲pr~Vi9%B8^q"H 4MKEAj5Iv/0wNPg@dR"#HAA<-;0xB h8& pq N77/^/aZh4Nӓpvv6l[@߁Ah<χB!JUVVe(B!rt:hD/ , O L'<!e@~~~vvvqRQQAQT$Id2MYYYPS \ Eɓgw4+++h4:000::JlM$qfzs3 xtR\Džy桹ztɒ%6P5eecXee%;L3]$~d ZmYYق px<_n`qq%JwxVS iiif… KKK#v$MnOOO*Ssq\QQŽT?88&V[ZZ  ;0iZEEL8˻5(,,+t:t(>bTWWOjk;,*=ڂKn0͛WYYɲ|S^כZQQ)D+J F)))z>Ѯ.BH-MӡP ;;E;qɓso88~$/Ra l6<;0]~cQYGju^^^FFq\]lE)ðiZ}zeI,,,x<v$i0&|,cF 3a˲F2ޭJJNNNNNFNa jrA`ipOJJJJJJLLuT`g444|/ɢ4M)HcJj{E:Iq*i坫b1z8CJ2ek(JJH?T*FCF~8}4;;;;0U!+; /ajZRITH$²,MhyZu:F1 pIEaاPE4b1e)"I$IѨhZ`h4V5555--MfHS\E EIJQ3M8Ka3ad=JjvAJbbfjFѨjN']+4ah4^o0FSDQdY60 0|>9666::t:#ϙj}f)<`0(ؒKA_8F"<)))11h4*8z!fl6eH?2::v***JKK@߁O4 B~EQI%$QNt___律‚/&q4MKajMLLX,f9b^^^>gΜ9s$''c3A|>ؘdHjIѺƱ삂|4M,J~hLLLV5(JraXYYܹs,YbX@߁i)~_2+p'IRZÔsO#HuuybH ð,RRRRfknwkk Ν;WXXxUW-YDeut:ʺ媫 B ,ϿDłh4ʲZNOOONNnl]]ɓ'ʖ/_h"NL9h]u)\sNqY2g$IIe.4:uj555r+}.yrh&IRc6<<|ȑ_,+Ez>77799Y\EQٳgO<ѱlٲ~XGFF1 }ʼPŶ#G^s5˖-ҶXǥ$^0|{ 6D,VN<_[[{Q VXpH!%bNNNFFUX,v~;;;{Æ %$ ni|uFO>~xzzUJKKgۻN$y>333++Kc67lPSS3V&w`CQTWW W>|ر+VdddyIKKQh={vϞ= zW^y%?@߁{z oVFFƆ  R̼ PRRhAmm?_^^~}:::blaX4}wkkkׯ_UẀK0PjzE꫇ڸq5k@Y4t:/EynIv/T,eT^ڗqT@XKń'm7i$b999999/h.,,G}p8z{{I4L;wj 6dee][>E*+$QMa)pr\.z=d|KǃHE%'I $*Gb1$=.< juIIIbb/ҥKnE _ VE?QO8qoyѢE JAKIF7ds9:::22R222222RRRRSSzGQIUBtdir:.v\.Z-}^^^IIIJJć E"bV `ǎΝ{/_3 L:,v[lA.n.ljh2t:V?a8f6wq "$?IUnw  V;nHruwwwvvrW)E1sWQQs~ڦ&_秨T2eCP^^^nnҗ{?ljX,knn(*!!A8qbƍJeTF̴lÇ={rٲe(APz3<<,V2ovtt?~lll…K.Exy>X9s(_0;w|G/^ 9;0q\ZVqH`^Eq˖-UZ8.999##C@RTWk&'Q~햲kW|gϞ={lBB’%K!A *++f]]]/ꪯ}kE922bZommݱc׬Y#3^WE3g;vl޼y֭ q\ HII)))Qj޽СC}f24M_p8?w֭[eRPXXh۵k7lذf͚s眓H$b4.hgΜY|ʕ+e^+b  IrܹJSϟ?nذo?w`fBQT}}TLFх(?kiD"HDD|̓^wu7|?tww3 c2aHx455^Z~=H$q+0lll'Xx=L# K}]/xqMA AEEEv]QGǎ۾}ҥK f:N&(:n ,"t۷oxxiyIc0|˿o@w`z.i7Lsϸ1f, ي?O.nmICa٬tɺW^Yhh4UWW+M" Ï?x^^֭[AA߁X[[bQ;P߰aC|9E1 83,[lӦMSjW4h4Dv6o,'&Fy)}щFO>drrm( LoGOOOBBRtӟ-Zv-Y EEERy߽{cǾoUUU͌/agΜٿTgRYd/ >ﳗ^ͦThn>nݺK0̜9stc622SO%%%}ߜJPwwJ ÜN/rwJt8;wv~_ p$mooJ_SO=rʫ*~@ ***nM6}+_$ill0Lao#k0  +++fh[n$W*3Q[<  2x~_|Dfj?w\A4t…W\q_waٺ^.֭[W]]_B,wrFFFaf۶mv[vvvfE NOTVV"ܹ3lݺ ILL,((J$y)w`E MMM7n, egg+-laXwwѣGz!&$'''&&"dk4M6kZf7::-[<H@(B_߿s-[?t"Pw72g3%%%<+Mt07biZi+WLMMݵk ;p }}}*K/t5oDМ^{-55u0L Iaðoe`$ɶ6.~Ç#8<;L[ZZF0 ;vW, fee!, 8paB %%%!!!Irƍ_ǍM&S @Hyl>3<`@߁K Qd}饗.dJ@a|ĒGjvuuEQ],[_a}. 4MEo߾ŋǯ.+M/탃qj㦴!ׯ?qĸ-wuu!tC9sri@߁KBOOFA1p8֮]0**-- vuw L ߓòҢy9rdܖ&"(6L6lؾ}; ;p N!gF={p :HaYt^{0L$L`ޠ IDATYr5 h!u놇`@߁IGG`@("VWWDz%K js;l  C$xߩSnq[Rbe˖0]DA WZu99[L&SWWB:y󒒒";h4p8r"|+VӕeYJ߿[oqb6,Xpq[JZ͛7wotuuiZޡ+V ޳tttr IIIh4˖-;s挜d2"+(((//w`@D(zhC֮];n(,ˢ>|x 3G 322FcGGYDV iӦ~D@p$~ Ԍ2l6:â(:t6^:VFA8ðK>}ZNK488§^yƒ(0 322;v쪫bL.Vknn.ԥ#++ V a .\jZ=66 7pAH}3<`0!}qG$)ouuYDEł 3Ʋ,Z_VV&Fq\]s51Mөh.b999rb1ݎ@ZWW>hZ+hz=ZTPPG_(. me~޼y2%aj:- )))h|yyyGG*1$IFQU-n:$ꆆkM$3F겐V`0lh^/BG .<<;\.4s|B^G먩I\tf3uuulL$E`@߁366… UUU͙^DQ꒹y 8n6,0 t~]+r B ]9'~!& =pQlh+_ߥv> HrL0V<_^, .VѨ'>$%YVVr}Ƃl466VVV\EQ0g.;&  a999t:ۍ8>|A߁9CߥH1hVRМ^p! "ttW94M oq@AA b [Vkl---h7 @|>I deeɟA@+KחvE$!!@VV|^9Nt:]aa!ld}?@M:e$, 7uttH]vf3+IIIICCCb14/ yжlJB+> SGߑkx)ʒp8QQQTL&l0 9aXOOS HDˢVtZB:@Mߥb7+aYeY3J;3S B(~'BzJ*.. }F0ө(FN * jIIIJ D"ʠi0&&&o9<< Th43v(*RJ@;} b14}y(EA@ErRRR`ZmZm28N4B_6- /ӛh4z -~CѠ;afYѮT (Bjz^/EQh3yP005`0(kZ`+3*~G\cEq erI;'ɤh X,֗t}@4?ch]~J`r YߍF"]V,>C`qUϧ(~y~"̔UT*F8t;>ۃw <"}";3S$'Mj5Z 3W qLy;r TقW9Y r PHQ΢T\ > 3SSRˍF|Gxȟ}DQfE׊)kZ" CբAK4L!wr;Sdl6+g& la4}GHhA^_䙙hDRmY h;q%li48#jh=>yiZi%HA]E$T% j"VT2}GeYf rbz= yLq:WAgL$ Tߑ$IEǃLDߥ`@g]X AN.)jYsM^;;0~Gf2&J)wD5 W}"EG^_yH0ewgo"v8>]yY FQ# 3@ߧ7 ӝ@ުϞ"]. rTwdZt{$}]LПQZ, 7MY!=G 促)dGNEig#E4Zaa`33{@q( #}Aq "![| >Z t!\Cr۔$?>P8ZwIfXRlAgc>15Zw86eH*µ ؂:jlr7SYߑE++&E /YA9^0i $wsR9~G+TLMgٟbp,'kI+332~G\Ơy9ځ h}Aq#<<0 促C`bޑaED#Agiv!B`0LO$WMDa*,w!y}7MY&RAߑgZa@gWϠd B0XSuoeEQTL$~|0^ $4bs Z n >5ayÑdR {,^nx.z='&&z^EYVs 0= )w }u 4kjB!Eתj2eYH4FEGL&}uhZH  JԄeY4݌D"J]E`΀Rt:rjf|v?0 3pl6+wg`@gc\Ej3Vw`w4}D"Jtw3$ ")SAG"E뫢(8vBxe$&&N[,589!=+w @|$/و^GKMlR$rIׁR 3Չ}b0&'~PO f;rql/YfS8BcZ%TP((FEMEd/r 41(kJv^JJ ֔i4}y(ߟ >KtU^=M333GGGap-r%&&*A@K}}?++poV#BGRXS (Mh8M`@g)$Ij44ߞ 4}0,==}xxkVd3 c4 !@>۱Zh˞999J$th<#Zr $$$';lf<.(@KOKK%֩C,Cv;h}].hDK@gf-E$Iݮ6QhKL5}Gܤ4~8Ni12^Ag;Fy,EK)O)}GKAQ/WM`΀J2hMNNN)iii###0XSgX_KӴbAɎ",NBBJJXS$m6[,C^..H9yF9ò,ZGAZ[[+++a@g;V͂p:cHfdd?t*wA$klFK'"55U$|RGAAAww7 eG:Mj_ȋMMMUUU0XqG\TIRfwtt`]vBc e˖`_hMiiLW]b1t̹sH]ZFVRR"1˲J𓨭-//t@߁@:HF)--mnnٞ χp5550Rǃ nLif9|)8'''OB IN,a&Ӊ&---eee2fcXjj*B/peѢE0RTTT\t^MMMa&X,F4rYUtg|G ,wKIHHAyfsffUVJR2a.\\@SVV&1M:'N,_F )))hUڗ/_~I5A襪mD˜IIIY7eddM?}}}χ}⑓Vk޼yNsttTNcNf$Y^^^WW#5i<ѬfA8-3ɓK,A[ FjEj%KN:%3~gm-w…`O&~93RG"tH{oݺu0R˗2FzzXъ gFX,%GcXff&B/Ν0R$&&jZb}rkڱ1KNNl---0R(NmͳBNDЊ۷o}䒗|'NiBZ/+W`&+"B.~xb9iVt4g{<H{}!+(**RT2 $922p{^{mmmm8 vww?nX,Jyo}J(yW\e5 e14h|h̙3g.]*e4_q\V}qB99ۗq-~`\j4 BtLQTssۄeY0߿ʕgPFIOOGZW\qinoܹhN yJ\KQTnn.Ŏ9r0(dgg4(Y4rNzGHq|ՇaD|>|rOdOӡCΝSRRKJJZ`q$ez+W0.h( 0 STT4nP(CQoq02 ¯]ܹsrv0 !VYY)F3g>åKk,+oYSS#?Zm^^Bo2wygܖArn{7a/Egppme5ɜ BEEEjZinw}7 ;0QqGκbŊ.9q nZ2wTwÁv,Yb47(`09;va@߁ JURR$ݻW[h%e8 "k|+񛉢HQTqq1½uww766r-0L!))b J.^8h4III_,D 8pWBłŋ/x]wA;;p1)))FJTni޽ 7I %lܸq_4 BzW\," a*;p1  :ܹsrBrs8z( ăq/>X|)7P(//4(_z-[<}'BѱowB$EQD W_}UEn VXM*JNEfҾ &wCDQQBWPPq[L^4;;NМkY8.))Ax㍇z Tzo v!ۖ-[vލv&aX{{VEߎk6~P(dZvg;a@߁KXLb0W^yerp)?9rrr֮]s0!t:~lVz!0v;3`eٲ2{۷oA]w ;pi@@i.9s***^q d2",~cccPAWTTT^^?mǞ={}Q8 RSSBo… N!!4A|@ $ JE_,dff"83C&9n6܏w}7;;*4]QQl;3\L&Saa!vP(t̙ 0J?$G}Gpf* aQ__߹sn8mDQ '2 Oo޼9))  deeYV2V[b#/;;l&k%%%0R$!!Akll-v#tII<_i0 kkk( X__ߞ={|/SO=5|XS}8z2ܹp|ׇ1lٲիW?|9rp\ Jyl—OHH@[S}WOiƠ~[I266FӴ"o7!!!55uǎϏsZvddy+Ky>.\Ws#BkklJfo~ƷM`DtCg?@߁)FR%'' (!55Uٳ&΅*J9h4jIUIIjo[UUefϠ<!kkk-p8Vf:?JlAUAȿ0''gddɓ555qb@z BIII+777++׿uqq1ھi˲.\F~ĉ<qQ%2>׿' b3^iY` f"F^xAo\FqܹJcƶ_[n]hEQD{コGy$_FiAV9k׮'x!}.'>j*AرcG x-  Tx7|L-_  P-0k6::ai:,X!;vxT&w`Zt:[[[V7wQ_[+EEb2z~iǿ0W~ɤ4v8/RII-K*ժO:K/g|}4d2)=g>q\0lJ'{=ŋgZZZ(ZRYDQh[n4 4Mo۶;Nqqt9t\EiKCCkbŊ+V jy󔾐< /;}fȹ/g׻ ҩ~Nϝ;ϗoܸqet0<666vɺ+V\s52ge`VVVAAһ=r/䃾.Ѩ(CC?~k_ZYYi322wrwɂ5k,\EQu:|麺3g΄ŋ_}}i{AYYr4M⋍?O`;0ҩLE[wwkjjnE^0[,L.SY=wܑ#Gzzz/_jժxw:CCCEIʟ`?沲e˖A$I"l|駥SJ "q}}}|^_x ,0`0##Cok̤-c;XGGN3 cǎ:thƍ F98N&&&l69Z/bkk'|844TVV6wh=0@y<e h4z~ܠjparYCCCO?j}GN@߁I4mnnR'y5/bEE_?+8?z.o8$hjjjjj----++KOOOKKKKK3cHt,bP0 CAZ6 EQ.8Ξ\hlPQQh(ݻ7mڴfxw3<ؽ{W\iӦYu!LaN`PJO>jժ+V@PeDH$RXXhROmۖy`0f"r[###z+Zv eP(JKK8m۶\oMDVT&IQ<ںgټrʊ (n%T0--M244[oqk֬"hHvEoyȑ#4MXbѢEO5<D͕%466ݻwׯw`& 8 EiGꪫ/_p"YYY24On櫯Ziw@1V_].kkkVX1i( ޽$q "B :D0i:W.:+k3ʎsտU[˺VkfG+5EV*===EJsN7|Wf@ǏGEEmذA&a^ m}}}&FJJƈUV?Cf}i4Zlllxx;nhhhjjZdɆ C ?f2j٭IԤRRRd2H$AOgX111nWՍMMMT*UPdggϒf|\b!ou? ûw4… e2D"CKDX|>ߝ ZqllL.Xn0cVN4ͿFׯR4555!!a֮>#""Y>44˦˗XB*b0FQT7_fRlmmU B022rgo\.ĄjuѺhlooW*fY&)T,c;mԍN3AكdX>|ӣRϟ# cbbCNfMLLvA.c?uqq[[Rh4-JNNhk\.b1z`0޼T*gjuOOO__J ![KNļy8r/_._RD"QrrrJJJ||<| `fNv t*JR 0P.`%[̓9nѺnl6{޼y,[QQQRR w9$ؘj%~*w 7B8N02ixdb2l'FP(drL& ,T*ϟ?_UU5|c|wv;9v:>#Nsjk'e6 f39Bcccdsr&*xQ677߼yԩS*p{||RPxz=zT___]]NKJݽ{;wzZveN87@<@jժ7nx~bF`}񹹹]]](,xcP~ƍ5kx~ӬP( gϞx(/ fRtt7oFFFRGiii6 g 0?3;vxta>}ZT; Ϟ=rL~E "1?~abb۷oOKKj˗/ 0~?ttkV^== Fff&A.]2 t: {NGFFݻАf|*VRRyӂuuuO>U(<5;hÇOr{IBBBXtiPP*w?ݻwgΜ(ŋr<--J|߿rIĻ۷o---͟?dRT,a+(@L?uYg=hlmm b8!!aaaaXAwaَ9~l?jp8|>?,,7bh4rs7;k``T"+q8:Nt:VhZdlVܗ @Ѿݕ+Wl"?}ի555l6{TrBn٦R^^S_ x5k?~h4q_HHg-`lڴ)==K~~~VVVYYt@7n\~}YYvX;Yn]^^^YYٗ/_P @[VVVT*T>E.ܹϨ |JzzO<сjdA@W^UUUai< | ˭NJJ:xׯQۼysJJ[[[lق=:w!H.\0::zaZw+xg$;;[*;wիW[n `#N>\QQq; ܸqիW#"":?`% |GpppAA+Wh4޽{o޼i2P@m۶K.Y,»wZV>޽̙3vEYsX?0+꺺BXl2w_ 7>>ˆׯgdd$''S( w9Jr\n4oݺryffP(D}0X\`nSKK۷{zzx666665A\;&|; |; _k\RIENDB`fontmatrix-0.6.0+svn20110930/help/en/images/importing_set_tags_1.png0000644000175000017500000005052111216441647023767 0ustar malexmalexPNG  IHDR_i:sBIT|dtEXtSoftwaregnome-screenshot> IDATxw|enz %t Ezr;zvO={{"ҋ*%#ٰY:yBBuup =:B4l~6 QRC+.Д WѪUkJ) @QQKvRT>cRШ^ Ue4au|#B!^T]iQr:Ʊ. Ty %P jŐ>"=;7ί&[{8+G ")P1دU\&%%B РMJù1 gM0/H\C~9/X@׏/ BӕzI3=Jsv_C'ie(o'-gd̩3h). "t]WUL4MSXPHJj &L@xitTes2B'dEETiԈ_}EjFvb3_)gϲgl&G&MXzR)*̤'cJ=i*J F[=Χt6̤+W_q;? 9 !BiBV(LUh,_KFꫯaWݠ!iKf؎=tɫ|4 ~}}i|4d1O={^69ޜF^/Uz_C%@zo9‹,y |# pUV=gS7[x|XhpśwSËq;<{{_mKȩс1nR{z1kXXpja#CIn{^>sXHN@Zgk= i9\x;},8mfkrtkR3EX# .C Dl٠Te/ EQJ*:waIJJ`ΜXxR40y6 ٹ'53_~IFʫG43>JJݺ9xl6 lHrz˯9t4s<^XW?T/'sI.\8; 20iRһlrK6~<,Z^VgG3ڙDzf6׼\+ijKd /Lf ݺt҇`y|J7C[psvmQxj7A`]ӯ`={?cיtBdZ)59>0kr[n:z6q@nxn UUnGȟ@ln~s-\+Ihd-\Rwu{ 1{tRRgTmڴMЁ}=n\})~^ӿa%,\^W:܂KF46)Z=a43oۛ^w1IuU $N-&l'r z6հ:ܐy'Z @3ѝTS=c sRQi99rInQR;_m7G:T3&)ʆM) ,W<Ƒૃ.pS^-1S2}Xa9S|W{1U~U?BbNzb_owf o0?1Z>y<~J_6Z~n_RJq5Zyal߾:t`y\wxLi9ÏW_ͩ]\v8{+lߓsjvd$` dVRԥ {8^R(I"T|ynJiqTr;&=x[*pztlK~woCu>}~Uf[Uclrߪ""l^?kߋ8{>Ù\^oGgkpf[FZ$%/#"jQU(:{qZXtVd PJ X|fWevЕB/dVwo^),֭|=|8wﮰ dsѹ'}(N:ގ@ì4zx#ؖ9B# G?'G8w2$ص۷m8s{)ߗ~cvVj]]Ni]}$JU,[\"t^H@b̚ٳfK_^/yYB囋/o!~}OA8}9exT|Ӧ3{n"wSatbk7s(2%mgKh}nl_|ωzVoRk\|t|nKR!Sns!>8 g]>eGm-HHrZWϑs?k_ދ:<-WwW8& j_ Sd[~`Ir!DHYֲΞ5MQz%F*\\rKJw^΍#wcb}>sf .R߫RnlB7>sm=_N?$^w-'нk8WCd]N<^4 gpp/TOIe씿3w3\+ es/E~k|>oO$_5^Oo|q[^/RtWN{#7թŻy|8?u |6?HP_:9W[Z9}_-&=c(H90{6"C kl693fԿ^ϞbGOgW58V+?Gֈ1}xw]륺|vCe%m(U|Ƕi5HuwuDXPb䉍WbU}5lݚzCPm[4񧤤An&P#MO&.`굹ϳdƗ2CuL&nMsx1ۿړ&ӹ2sPqi i eH_;k8{ RT͹-wTwIDP|bU)=ʊQyD2wX(SRRg=vgعp95;S;x>VWWECd"̵7_B,4 Z{O[K+Nfx|jI~|̯qd1If->@*q %{)gMD %iîJll߳{_R59 R{wOb:*DYVe+d(쾇߆ŬҨRi:vϵz޻1aE*0aXuuͅ|ѕ^Fd2zAB[k jX}DFXBB^@2T#O\7QF3Bm>`υƎf+VxU[jU7oN}ݽ;G ;zXhDzoӆC֢ZDe "l^A0?Y'F:;`0{6UM.]?p )^jBl-_άSSlܾ۷j҄޽KJZBJ=`+Zr 8ϑkYv-'F Z"k@jw(!DcڰHWeJ1,\ b6S/3vh0t(Urr< 7Lv-ėr6޽TOJ"aC/HYC B!\)ѸP )g4QT[~L3fP'=fӇ=z`NJ[!OlE9]):+Yr% 6\-+ v{G 8o7LNݪUiм9 Bʣ[w)Cў}R?q}˖x2L&ԩC\J֭R!b,YJtA;ԄfeѰS' LZ9OBetPޕʘ6Ɇ;>کdиW/M,/q ;Aw#張n~3g8~=+֯2}:Wa˖4ߟΝ1=[!ivry+8Y$4ȠQv42͚yQ!AhJB^ll޿ꉉ4Φp RjRBAy#'MJ;Q\̉Y};.uhФ !gOY_yJ6mB]nWAPs~Of5,YGv4nݚFQ}{Y_veJ#Y<w嬺ΎGϤZ,4̤Q4:yB3][-Ĺ9Y흱ZٸgAkj&'ӸaCwFIQCmBa#DCS׬[{2p7rf"J7kF}߭Y_`A Eq 'xj1ܯNdߊ,\j(7!CӦVM38Ary˹ʕ:[f˼y0o 4Wi:))ӽ; aY4$+ \$;\P XaW_^j4iт~ߵ+&KЖB8Mӂ8dFiOW%KiL&gdGCղAPre/ʬrEoہ0giEN LZFZq'Ay \,g%;YRª;YcڇJNNMza$zQʦ +,Yr8r; b~>׭cuX^x5jӲ%M ey~!M鍍Gpb-@ Z>CJbcl_9b6$36mh:l54в"hqP^d%Hܬğm6ڽ{繁D hv40TY_dhڰX]+Cܤ Fn˖XILIZT+ٵl;.?$+1֞i/.fm,۶ mLꧧӤIK=ey!b@ӆciн4z4MǎS ͹ {M>2Ċ@bo~F{V@⪜>5kXf gq͚4mݚf١Vd1孁>o-<Y s˞x&Ofket=wBtr[, HXhVMڷСToci`q*_\ROhAoegFrvt/$< Z [~{5H|F?ri/E^2!Dp|-I_NxɿqVh&w8GCe%s$JB1V.x!Dh5(]\p睾t/G6=:+q $Q $BDxDԺ5/zPgpi?l$ JY IDAT@o{N6W3!P=noC v3nߴDߠ{X4h44j* ]ޒ`"Di?رǏgěoz82:M|3>95NRGh[* a6l8j^.ZĖE8>?X~;N>y'#ɓ#u* l7TBL@TFsnФMвiqe2.n}eQI %-w|^ޞB }(tw'`ba$k5-$Iyet:}π3կϰGEE,qV[ݽ! !B>5toE@Sr* 3[x{oq޽M4S 2"'C1ntv"Ȍʇr.xohqU~/ڥk7߫bt=OxD{pm,ٸWbd> iÎur0/}9fG#vm>;zfS;iIIy]i{5!Qq,;pA5k7JV"D+6`3g⋃ѵըWs 7ؙ3dȔG2k<0+T` $BDSIyrЀ^~fW\Pb7;vPl璦i{-4-wofluueBӴ ŌǞz3ڥejԈ7n$Epˏ6ßz*= ^z_7m K!BдP\xp-~%^$l+V Mdlj冁%+" =Keѣd9lDaG^z`|QTl6Zid%BĠ ;gFθ=hVMj_rBO@ա.X@"ikV+k.m2K hP.jтI+VjKT.ġC1|/!Lӌe(Nͭ6hITfnF $+"ΚO\1㧟.3"<hi<<{CyȖ)m5'm *Y$Y` ƠbkMR,lRp?v'(8q1թC4^5U.ȿB!HӰzc]sMy &QM)ۧfޱc;iڔ+SZa{  <]hȬ/!)Ay_ƚKqLRlSM&3djLL4\? )xj6sw`pd6&qԡĬS={rJYBaW:(?_lM8 &>7t7|H^=JBYb9\~Lk"]@)kFlٯcOԁ-Ӧ1lfW_>ڶ-:eLHi]Xw䗇'OfcܓihRhwntj<駔yڟe(ş. ?-!R[x 41bٖ?dĭS򕫓c H4ߵ+kz۶4KJy\ŴkЀo{jL /$YIt^"~ (54BR%ѣH4gΜ ëq|a^R U_rL!"2 OvFsX^2̻~aÿ[vu|0} 6M(?eܓ_~0>˟r,g/DU2{yӦ1CPђbR1rY6,l7yvuI "2*U@ e%O?}"4M6Xj>/?9ۍf%d6iRd%BDV (]\=j9'_Eifs1\p )Ğ:sM}fwIV 88V)R?P4e%-G|f3qc}QeoHZe0%DUr{ZZ {V0*7?=i۶iW0g}O7A$e(p6+)BDF5ʼҵuM' SׯOG#@4fZ-{렻3ONpȑ $9qPRL_i-.q#O4xe%K)f?p ]hBDN\gwtyyKU=^Koj`nuN$yqP͙rΞV}mh:R [f)EC0'CV5tYIxiBOr)޲Ǔ;Bݽvb\a N~͛iAw߬f~~Y;f3S^xk{L.$$'O*G; `Zlf{kWqztMŽJox<\3l;D?rbYO<߳hY6 HV"Dt!Zd_|1d}S MLd=7-d}ǥO<#wĹ顇hA3F& M&'&2t~'YwRľLIB^~U7 oHLU}Y^^ȳwqǎ[v}Tǎ jΘAv8oϛ0!?`e%Ҟ;wf$8-K;~<6(?k|y?*+w걷[H (RS (E) pC)mp+-({pv "H$9qPo.-M%Kx}{CocFZ,a54ZyYB>3g [BĮ ('MGjZ2]f}|jW5eχzLyI pg%F !/.JB&ߏGV`Rt&M}|v:ÇY<ӿ?RS?B=J, K"DdX"݁Pt)=ڴqM qɧߏhiPcvՀw/x;-=pByyO.>I!_\f(yy 8g[( l!#a"wAwvq!Dxm@nAėoΌLyki\NĠr$YqP,q}nX.x׮ec* G":L3n&ϗ ֺVfoT\:%=>hRPe%+i4:Csժ_󧜷D9"h[f(}{*#0uc޽nIV"pT) @RӦKlշown5?C}<\9HV"D4uތ$Awrv]ζ}^ˠ“JP򮸂9˖Q`=֑xG/r-?GT` $BDSޓ;2 Tʶ"(~FRO6omHn.CӪT+Aw{kves`ϗ,V% ^6@6̘Ac?Sv)_3eѢiѓWOۃr=6?y!bW(vmol6.c<+ii`3lX;&J)WFh;J}P >~x駹Y39swl\ٮsmzQrKs,MDȩhFo7q#?>'N`-)VR01cb;J)=lAw>!DxI@"uk{o6wq`e$@"D E;r%8-W(w !"G(7hJG{aӺ]zd%B' (?@mtyhV"S/ (;۵+_2H (ܜJ!"GJ%vʔt@"DI@#GJ<#YP*!}嘻:,Y‘JF)؄x/T` &BD (̝۳@?wD !%y㍼n]m!Jb3y }]%0yrxt@"DdH@s|&d}]#%CF^s 6]'%Nm[.3c0DCJO B=Aw#$+">H@3/_/BPGYCnݼXH9!DI@[w2f%dG!OJ(w.hْNarlFCҸ1GWƩI "2$0):gfra[<@R-!`F"a^XH1+ V0H (1Huz& #`=J4/Zw!cROH`RJ*<@oFJ QJ1basY0tw~j*5lA (1B)Ņ [٦S&qc?B"e2et*pn,!(br7D.oˬi@I!D $D1c-)Ui.oA`DU#Z5R\<Dha!D $D!]YEE2@[rKnnؐMJ1@mB@I@2[{_W *#%DDH@"wvȌ͛_-*ܼ< !AJ֣Z-s&r 2X"PPcCEd%>"LL$U+-!AJ=w<ڞ`:+`+B`AC|YI'ul%!DH@7]3fXJ\!0@B`q=r ҨV %̾6I>jl@]n&ZB0\w~ķrw7!DH@ E5+X4{"$3}>>jViiz#& (!qU>[YrۧrNr[4#!D0I@ f1tHl>_id%Z_!!%D x\tF:+!D(H@ +VЫW/}86^If;& (AtԉBHVc9k[!'%lN׶mr\HO[z@K !BMJSft?PLPrhZ&%c8/+.T`˹.5lc-Bp :֩7+MV]n.>& (ЭVTAUtϗ\ ᠻrЪjBRHJb:t$5ZZ|YP PJbaC0ć2nHdz!?)h,Ƞ0Lr{H!DH@Ra 2xJaݝf={QBP| VJ.oZ΍@ @ZHHJ"$@)ť ,K`ĮuVK !BIJ)HH]@\Bmd!R\S ?Eq0bնZ$Ń32BVe/g//+ d6!D(I@qMѣ~@\g%un`mBP|s_eb!DT`W\'WOZPե 3~c!,CY]fj*da!e|>>I,W9kݨڅ ],X$.˅p*p(s]lEP.ǿqH\[u4VlI>x=.INvQNjVfE!D8T-pox<&rq8m`Bp;Y^W)wzX$.E[Fݺl]..s\3uVd%v-`BpTeo0]$=m5!D8U/9g{,8+ + 0!D8U/~眴b![F @DuJVqPv̝#*b!,Wܬ,;$({>`s $O{;vh!D$m@9z5=wu,h*dz!bF\7ӥC^s*p4WuHBeQ^=%y!Dewp.:jET֩ oK:DN,O\u` uGH8Az8n o/5{&!DE@ X&GxJ"=H{ΚըArzzjBC]钖Ɓ(&'E ((J)z$$`" 砻'}f!Dl@QJba$.o#V/o9K59D !B%&R 4[ U kU.fKLv8]I$Uf~ZXc0}{є8k& Zzxޜ&$,hw7?(*.q{pOɉ tjӊTRkgU>RXg2\8 vl6ǏE ٿn^Hd^LBJj%E.+8+oYnV\%żtVlLjU7(,!>xJi*/j%%QyUTT%Khު-c vl6W.ey\6 E/.QL $$r_oLq~CЧSJ1.9L*ӣxõV4[[ncϞ=w-֮_LcP߸b;KB];ښ55Q 쾽ht$7TiP$obIDAT͖KHꀢƬ,9q1~͗\ϗi@FzﲦVR: b^'c-g'SO^#J?,oYnA:eHوr%ԥW?aAÁ<",> [ oE YnEB=CYqe l{z&cJ ZJjKJS-b;eos7U&/oC.o.#9:99'JVj 6жV;OнEQL{kB7JŒE&UFݽeyE "Δ^3q[@w 2D݃'kHwAěqa (;ϧ~Ŀ}Ƥi/qFGK!(.W߾~}gVMSHWJZVrM%l6+&~WĄ4]]~R|yUry+8r6h&٬^W`Yi,5nN?M+]9ssB:g6[}1?3dAmv(rUGy{G$g3g7ed2EkHIJѣ 6gMjRii~'^g5oNc$+Y]Dn"BJjcMl +V JAA>%w$Wy-Y~Ow4@)ItjۚԚ?=5E?zv02\kY6 II%E{ˣE,KB"}VL2@4SHQ~j@O]FYLHwAġL32#ݍJ+hE/)cjvLN/J,"D J@u.Ld-߷ǻj 4h6BՆOQR LQWZׯ.!BP@ج%[leYc%ΗgeX^>aZB%CU6Gb"ΒAwWuȠ{d .!BP@IUÆz0zneYl\RH\N $gOMFVVm#!ZM:>(͚Ѭ}fcײel;6q惇s* G^nƑB:>76frv%kW.2>vۜ FqV"'/w;EYIJKͰa6 ql/[Ɔ={8^RRh>oJ qϬi'BHWOZ.]Ǎq76֯gӡC.;-YI|hZ:)UFBrZ٪[I ;/fylز'NxAкyHwAB( 4ٓf={rp 6ϛdžEظs' *_,oŖ/W/ (RU㼋/漋/޽l5 V۾}p$4 ע:8EkG=kײa6l#G(r1 Wˌ , =!YLgmےݶ-"-\Ȇ ذu+NBw3"////]ul6a6[LQBRU~緹sٰx1vPa\ފ#t(W>n58H9#;wal6YÆ}8m+$j&&RUHwC9je۶ԭ%O !!O5EE:۶m#77SR_68ݸ1ޔ>UXlܴGR4"$xr#Q (ǹ+%0Q\RLL&:vQǎ  lmS"Ÿ۩S * LR ݏINv28KLI!o  Rԑ#ǖ.e=.,tcn!@ Ujצ1t3[~l6[o̲өn!@6oNKZٹ|98~SDNp*㨢TlN֎,٢ tmli4Lmٺd,mjl2閭_Jn*n%w(TdP=8| W>/' 3Dd(Pp:m܈oFnݸA?Oؘ#O#(wɽp!ky5S#.jm%;>1aq%ʺɹ~/r8xhs| FoN"LE $+,zvob(DѣCx=YxC1Og=wn~ /ȄN2+d$BO{;cuu32Bt)/-{{D9J;>HJ&:wz q(P3+U7jfAl @`o/vT-[A᫜Ú~d^MsJ}WOѲKxs>qR(Plc]c##xOO7 _o"bhLȿ ̠a }y|}i&@I)ޢ"jw젖x=3gdbO 8i͐ŰIJfE :P $k8$;7)PRi,`YEz;իA2޵M79|jONrL|x +΁is>mfaٿB6'~Wn)ɟڅ,+Fٻ4O?:%-IlT@'))aˮ]l(N3tg'CCsZ/*sŠ| {xaՉg-/y RA>5Oer8WVR\Y׀8'Njk#C߰a.rg+L@.y\!t('\aPVW$̲쿇(hҥlڶM۶p`3/3~0ss-Ka  R"^ tvw Ôޠ".yF"8NVTWF(]ǎ7^ ixR/':!fwW2 ˅3+^ro>\0L;JC&"")D"""I@PHR(PDD$)("" I $EDDB"""Ih;y IwNCDDT=9cCiܵuIENDB`fontmatrix-0.6.0+svn20110930/help/en/images/extracted-font-editing.png0000644000175000017500000015205111220414321024177 0ustar malexmalexPNG  IHDR? 5sRGBbKGDC pHYs+tIME5ltEXtCommentCreated with GIMPW IDATxw|-=HB"6D44E@,XgWĆ<AAzQ1Bz#dn6!1x̽ss9s-3uc AAA0>ZVfo&AA#GqƜ={sqfΜɨQ{kޠ %͍7L0P?OjH!=h 9{d/w;&>'8Ej_ZgG`Krq- V{GπTv}({@wұÚʹ,zgkNfUmkwIqs$͂8sG^ Gor}[zɜ?f}ᬪ_7BFjZ%ꤣ:4_xo؟l-g~2 TKׁfݹ-u;Ubv5`*E4N;W&އ)>s2a„ (_([7n^ ovvۆ}7`۰a F"s o~yZ?1/ Їc4 ~=h йl~t^r(~?7]Xz|ѣ#(r8&aS7hƭ4G%̟7,jAwұ%×fw/]9m)J7{%dK Ӭ뭌5l,ʄ0^\knq^{{B!u >̴l,D,V[r}'|2>ȧ6Tmp+ !/@׮ݨSkTonݩS.۔*a:`O>}7v?ְ`pͳvR6FԞ= q''Nof{hب1+/+'>ηqܥܹs9;v~51ǠV.>o*z 4g!No}[߲z ~~];+%- Sy)ޝD{E0o`?o?Vke}Y$濎T;F/{Ԗ$G@ N\[\+iHoHҏǙ>3]}(' \ob ǰn+ nD%`ztZ17Q|0w aɿ֔|u(:o8N:5D5VcM,n~K˷@'8"://TD-]rs@zL{k,Dϙ[{ya>^s.@Ӈ}LVlm-EYBN.}y>=ԁ/c8J^ U]^w%bu刵ա1˿Фi}MN:,ɟ bƌ(WT`mێ&27qq:Ґ5=n{ȣ |V-CPӰX,ErM5y޾};tރ&edÆ5ܹӡko8YhرӫW//^ҥKYx7?oN~"ut\ח,XJ<}=Kq׫hQ=ً-Lm&{ j+:e2zyQ@FZ^h{Hx,^^]7[Ϝ2opG87_d/M 7utKg a sAMfywnowۺ7Nq.;頁l9YA㡇zO >m402c˯[so^[imsz@BRKS fAqƥt»5GNk8αU9sM_ gNeIطSuZdZ* T)ӷ=˫*n|1y=vθ x7ӧOч0~DԩOd`g>&(_ퟟOz~X;Q@||<w͚l;`4|||6}m"ZH6L6oooKkel߾\GwJ[_I\Lb1'_ $#}<>NoS/ `|>)'##;`Z.n4BuP0]"VTBG  FJ_RM7谤啽vCja8+ W64{FqE¿}n7[p㐶K~%0wN;Pgb.qO>Iއ7&هxmEr+C:{Ѡ|~^s>7`"F{_ɾSؚ)\J篇+ i}gtJvFSa~:HtS4 ДˣnҌ`rV!͜W.N1-6rxe?yEOKKGDk/2]_FrR 5u5-,Ye]JԊNMf?@qW 2ܱ+(~|OhM{N8ᰓ=V] {#lMl᪄qhfjКmcvԝNr9C1[,Τ\x4=R??ojU>|yF-sj4Un*Ӏ3fxbFɌ31c1zhFI^^sYX5Fo=z;& i}M%=% k@3NJ"L2jӤyRi[xgvjON|#v}'c圼OɇZMng!|Vޣ6cA]:t=K8M5Lit096Yu۲ CO!9],=sqE9ڔ56&.jM6CCζ -]G3O j D;95?A-nbsȊa#(Z3!H@H:v?27ܛm^D@+nY/y`RCcs*^/paYkA%O)6X TLV-_N&е]oh֮Vp|lB9o+whԨ 6dҥeظOY3LT2 y~Ĕ_,EzD1떇>s@Xˈכ7edk%F>"9d*AR򮜕' 9L/~H?oy~xl S)4iȏv!Q72mnR4#^&ɼf HGKWp2?Ptb!1g)r4 FJHMN3AF;y]3-Ovo\m`yK w&}ٞE)/|{gt_|JTRnS=g/|F;|wˣ*q׋evvGK'Aj׾;Cުk%481n6vMi <YU8kA9`q{TTZv.qlԨQ4lذ!ѽۯ&\3fBWg86H L{Fhe`6[5zѡPf kF/nm+fE˷u ( ق.:cA-mߝJׁm#)?y =y4T31xC_@lN^~}mjaЙ2Oy呼axnkD3BCZ0/T@ 'b@>]hۘ:u3;Z5Gxewc"J(`h4bkh!oH?SfKB-t<4>|GNfYYy[ZS˨yso7v|}M1{f5K.veb"L:{]jweaµFߞLJ~!#D_aH.w'a ;%*66Fs]\y_bZLJ:Ws48̪?3er}W%<#7psc{upn9kS'+\F۝71ّ\{M3û0髓TlR Ӓ1!o%3m\˽o""Ҿ@#;e?s6SK>#Z2sNJ c9/ȡ}BA%obƨz$~} XPք[Ԇ{8SO CKY=-Oq,لϰ;<;Z͹\adYOI3p*rW>![s{ywb;p0аo,\\-;L溺+DŸ$lNَ7#l:G.Y{ ѕE t7u])| QӔ`cؕ/Χwv"]+)_Hpurk?)[v!n͐}жm\؝;H07>Ql)0:zyyOr;k' 5k˛0LLU,Κ YcG6ӆFpjF.K%/o/M,L-!HJ9/o@3w@4G5¤%b nNXw1y |@[N$V@Tr+ tuE5 =>4-Ƹ\1F9g>[:aLuK(ę]cq$o(MB}ʥoɼN^ܔWxO. jCdZvk"Ưn-ܹk'2wEq)")}I_˙gٶ4TwhCӡ]g+J!1}04`Q_Sт]ZfHr_ IDATwڵgX'?e ;"O츜hv{5>EMѪ%ԑ ]vn[qװ|oJ`A u?~zNO̽rsC/~4;fJf?e5Vkr, m7fP2Ƌ*e!J^#x4D\q^G3ӬX*›@.:wo'w-ӣS*CY.G}F"^/ޗڦL[\cjz'mΩo^OLRDs*jpS>=`ݿz{z{w˘/:쟖sn_nݼ Ņ <+;3ڜ^AԹ}lU)RbVyfhScB*0'] =1 !ʝl_yVC:ߑamNh6quPf햫6ſC%ԑ ]vnt>ʿrBLp)BF2V6QF4jԐzdCkdAf"{lږǷNᄇ֥_$fXRH z|94 rbuWXr)SEQ!% +;k )Ǜ _˰u`^W { ,ey7Qp.|4Z*?Ɯfh#,cqܔeGw.XRNE CXhpe?醃Rl1o>[41^E$Za#\rE^,apBӂ>$?Y]һLurզTF9eƒ̅ds M F Pm=JD:O"^I]8W(]0ggεa&/ 5_>pcOKd@)ky:֥ |3CwY[IT˕F%ܫtF~_fCD0˰Bd\<ι3JC ,U*"3~c\6Pf ΄/k;ix@͎.qk4V}wCQP^}&7@U|915Θ˙ƨM02_ܚ }{ bB _!U7pS}#'ZN{r٦Tb]}u>\\6} _ Tk*|КV]2h9)s>>>ܽwǃ>&Nz="? [P9]A 7>FƳ@́\R+XJ2d݊;JΊ6^S #4LΜe87U1mjFTԇC,z*m=_KNl87vy]nPSNq cIߞd5[qU]MqwK2X8OG M#nq0JƁV7Du mjџS׷;et\[.۔JZ_6=LN1"L BE)N۫}A\~M=< ڣi:/‚ yliAtiksgOOJE>= P!\77gKijӴEz 2Vf `pZ 'M d"\>JO_FR_oW0ԲLFj6> PKVVFnM0Ϊ\Sdh#bwYU{’F9~8}c^NFc\,l"ݚ4iㆴcyA榺]0vnV̊Y֮-Z4YѼ{|͏\i-ny޴kٌV=XjsEP7S.M98;ml,Z}xsA?ЏVO{ciTAチc 7^]Od҄c+yP5}?Q機oᵉ0VwdN&8^;MN̻L,o>ӇX&N^%[oI>n"mGmǸgR(Ǐ`뾷8$"A(?ZȎN/>ƙ޸q~IKEʚ)e w_S;n-e(rlcs82ٕ]ō+ꣽx@:Ԛ|Kq\>o2lRCL'֯/k̆g`Z2 `lOy};3o_SH{ Byj^ϗ1%ԯ 7K3hxdF}Ɍ)4mSn| $P23iۺc;Gh0MFӕ(&JF0[z͗UMafT{xm]y8˳'yt~oRo tk@ʹl$!3nfcK~NKz-PY=^{سg{r: j{x]{]d[b/Xc9:!ĀWa aQD}7?.ð^ak3ygo}i7wRRgPp$FsjЅ Yw< H3?1 s?rd*'=]K\#Gz!jBѲejif훭Z7OmMxuMj]J5z1W Jr_jM&nTӻ UnUu9DWEW=EW+୊rT5+j |U>8(G>]CKgosfeJW]ɉ!1 }cftJ5];eT)8< O,GA^> c07|ӓ^MC%u,?c^z^^!M9m~brx<۫"""OwoPc4kQye:ʧcǰz<^0XҲγfN&OZE'C\f{5u0T UտSkoE.sj6ɰ)kzX&yW OK{|7:Z>ρ*jwB#J!>'o]n| $PQcWGOh|yoCQP; ޷?<ۺc;Gh0MFӕ(Ȯrz []@;>}r.jSuU}4Zߟr8i/=]FRТy3盛<ʪAk5|vsК3afT}sNi:Sf0_9'+RJƫOSoDp[U\UUO2I9^TV5Z: {uZEkVb^Wy*}x=.j[}x-ߧP-7S4oִMD Iq4GԹϪvդju/n⭾ 7*@|TUy\0naUYPPo x^9FO-ЫWXՖCtUtSt6_j{\66 Q׼yRgUsU9>=ۧ8m/_9JܹsTfMּYSuI; oGe*Mʱ4inM,$x"'x~M7{hJ]H#hެAk, &  x0 0_K;buss.oēxl$U5KqG^GSO{G^+__~dUWS!rT:O>d]@i=PΝ1c^;geԶ(WX35")GESOU+B3gNϋ܁{/Ow9qV$+  4ڻԨ oFhh(nͺxIAAd{]A(^=K\=Wݾg$HAAc-^Û}l+0}@8z-&ei"'A(,IB+eǚ8FG/,"*ѢHv#LrG؄iӫK{ gˉ!1 }cftU$%>#Q ?2yT,iڐХ#+k4REbB {7Ln݉.n`ѩslc'\=ofyRlIJmbh-7ٶt8=_E?6qj  sIAXsa`_uBHL"Љx/Mo7 {:(3&:O\'}%njO:SM =cύwSSP<K*FEEY˶t&"Y|v%D} "^wzuA>ڝ`lp:Jѱ i~41;^˃+v3vstq  y``mJ |8fSd$H2;Eo*sD7G)ٿ ]ܞ4>8O*E\'\=ɢ* vfLmr6C#"Zçsy:ւ1;]n ex|5iscWTdg~ jX z/nW69zJ9OZtx׹O⚳30 C@3nmNo(&5t Oh11qsj : -٬fEZ=JZ{PKϞO *J% 2\WyPwqּnO)a[yEDez ǡi#rApZjی]Q^3O}EPQJ}g.-Bi pWxK1!V}nOߒGo5V:OzWЧ0M5̤0C'77ϠID*]9\'{p8HC%d,s U"6e_ݦe# WOlrU/bËD]~\YxBAAiLAAj"Id0  P4a& Op51@4Z48z-fAtIJ6y %'A(7*NŒV ]:v:^H#0A]]tӒ9YxBfhT90{`/:]CIM䰵0A]]i 8&3t&"Y|v%~u8W E++ هǛփ#Gtq&K Tvs+ڎ\I>NDMu lA(=JZk dW D ,c$*LDA|xxAjY0A]ݼ'AAR8   04AAZdК  P-^Jk  ǙyӒ kb  NWAA  BMG%AAj,2-  P-^tb  5E ZAAj+AALK&  X4Ms 1AAO++   ZAAjūɴd  B w)U)|0+aGQdAAx5>8Mě#.8uZa1  j-~͙s`8MjӴIAAlW>sށz7Z6U{y{{"V  o5e_},3-q&bAA<ܵf mK_nfрtɌ"Y$%  xk56薧XK<$Xt1j?AAA{Ak2L+ ߕ)_.w`^&  xkm   5]៊Ԩ oFhh(nͺxHHAA!of/h.n3~jIAAoe@O@ȖED˴d  BM0xsbH jCm-acft,=!    P ^ShA1pٻ)Mu"%AA ^V3âR|!oG  Ӎ9WmM<["ٯ}se'Ǣj*`uЪRfaZ]ϮUtLGU+Vgiu(Ş=Jﰚl'ŪBvWs/^V<♓ȿJ|W}СCرcu<0[mf2fLQCU{V*00P5iD͜9S}Ѯ ɯjoQ;yH nRJ՝b|՚?btoh_Լo/LWGQ7FK5jwo "##U޽ՀСCըQԸq\ 8P[} WWW̌`5ra0pppcǎxxxO>}pp{ b꤉<;^ܼKctz-v 8^{NŊ:-]RRĢEǺ2c .\iӘ>4qrrֶ^Pǘ+0̡37nVUU999$7 1117sMXXFs[z;33{+>͙={ұcGZ[CC111dee_CoT* >vVTM2;ٖsfTI۟}vߦ_{ԩ/.pwwAwo=x+,,,޾ΝK߾} ᭷7ݺ b=nν>JϞ=ٵkӧ3j(jĴisR-۷IG8Byȶl_} ό*i!""5kA`mmh4 @vv6DFFRRRÌh3wxx[tr?=ʪUXnz333|}}U*00B̙Ü9sP㨾ՕbeeTTTgs}ZrxB%ci .JgXËx F^h`Y:{1^}1''K;>gWަuwMx5}!R\f `ȑM>4#++0 hhh`ԨQ8;;pBf͚ݻYh;Vop4h_#((Heu,]zLMLh}泶ih.FR"JL8sss.9~QA9~8<m<<3-G݁]Q׻;;*`}פ:"Ru:5&u$5dEIӋp۪RP5ݾ! ^iM!C~~>˖-cзo_\]]4NGee%SN% Ƈ /0lذV-[0r6F''''OrA)ZFmgg Hj}4VaA% Nb˷7={4.V U@z#t[ u%|Pnh[^=p^¯eeeko 777ƎK$LH߾}y 0Uj:z(fBr}6T*>>>GZaFS.GMpZEJѐGxx8999t֍f]qqq׏vvleU7]!7XRZȊ !́?fM %0TTK! 99deWfmY]8;hIyi96n#44TWG^^TTTPZZZjzjS5666t:)$777z=VӋů-ft;-. &ܮ_;R<݉ym*'mEd(v <bksrEW$-{SS7c<?fff NNN899뱲Ɔa3TSK d8V{h>q>LEE;v ooot:bZF]fѬ*9˱۩e…lݺ3g6`Сt @Ϭ3hlz[ D״ :;aZ~UäY7{%Eq Xp!?cǎU\={ۛ0>׭msL1o>" O<$''sAt:ݻwV򜝝>|8Z^z~>s_XXɓ`ڴi-!44{2ccBMxMptш.P;{39PBsNL?w"dfffGFF>>>n:LL)WRn1|b}lR_TNx. ~W[lٕ~i9q{k׮ 0@i4 }&Mbɒ%y6\8?׿u ǪU`XX~c{^bb"#GÃ>}WbO2x0l޼JW!zŋ)oC+?5`h4?Պ{qse5!č;w`~n^^{!Cy=k6,"e~w?>}Q<ի4hݺu3][[[BCC)**",,-[te||?Yf7i.CeVZӧve4{*(&OLLL QQQ 13Vbe9;x !@47`]xϱ%fQ=cԩm?3aaaDDD0m4E-|jkkٙC$D%Ta96X`kv;vͭM,M|Ju^}qrrz 6pA B4U58I,ۙàIĮoG7۾};SNeܸqFDpAA6m/TxݛŐ!CشiSL'Qee%i/łr)trvt8Ϲs爊nݺ秈:t+:t]!/o-dT>ߓzfecq4QR]O~ڵiӦ1qDDFFf͚6v/۷o...l߾Mܟ3gΰzjJrr2|b&`%p`صkgΜaՋӧO+fa#Dt ۠D&\|+D~&Lqvv6Zkjjشi>&LhW}ח3h =_~yB5$ݻ}^ ݷ&(*Oa02g… DGGs1E,뿷 2D^|hk,v)y Xv{O?F8( 1bƍgs^ ۶m駟f޼yW*8|||prr2 9u _܃V{ pt+ȑ#|W)f<܌ͥJ$ O!~󄅅1j(ymlmm{ٳgeee#evoSO-eL*U*NřӦT٧IIIL4I^h+ O!JJJ "$$Ν;}ɤgV+Wdl۶MXaƻuc#YP[Y+?|0WޫYxBfȑr=('N0h :lmm뮻UÇ3g3f̠iVQ.1!|t)#G2k۷0p缶*NOOLJ0y Ld !qqq0}tEL_VVơCHLLHtٳgҥb.++Cy,)! իB0e ˮ:ܱ29c0ػw/;vp)whӊ9rbgݽ{7d?}v8@CCvssc۶mlٲo7Ò%W߲Ymc#ֹ^L:޽{V W!7'o13=ҚmSpp0ݻwSN755Ν;3k,iˋG*n333… ͽǾt*+~HHߺ &Bq+(**⭷ޒ-xo`0\'hƎKUUWDDGG7Gω'VTz~ ؙA['^t)NN=Ԕ+..f۶mZJ1.4z IDATm`߾}9R153ydw. ggG^Q\\p7, bZn#foHpN޸o\\Ѱ~zZ~i&/_7B(FӐ!C4h:N644g}&ͻE;wcǎ`kkMLLҥ =F3f^HJBi)ll`--yge˖-ѫWf [w}B;ZM׮]Ss||<#Fo)={ȑ# :TQ0zh^u|;-'KK/]|۷sy&jO?'|"aW~-@0l0| / M[n%99*EֿzjΟ?߬cʕL>WWWV^ݟןVeա?|+**ضm{e޽v+hnaaatM1CN<ɨQ31k׮MtoK0773K.M)֜}(++?gϞ=&GZaFS.GMp5(VZɓʢo߾`Ȑ!ڑcǎ)HKK/ޡM6@~Ο?޽{9u.qxg())ԩSDFFbjj+zdR5`AUREyT.1PRRB`` ɸP B0aBCC11Q·; 4H6;ҹsgN>.4 //2_ur#;;L[tbtuo v]ŽBBѦN`PE_Ǐg&W_ȩݎ?ѣGIJJ׷E .he2sn/4!M摕քP.@tt4!!!;?? "Ml"ݺuCѐ?X&&Va}cR7~<+h X[[訨3fVS '''\\\HIIQdYYY\R]!W :ĀWw]]s̑6~[t:ݻwg۶mH!^!ڻ3f(nJΞ=Khh4?,jjjYOB BwǎW^;))'*j`133ݽٗm.v"&&.\hJĄ)SHwŎ511aҤI-BM<ŭTUUɓ':t4=TN7Ǻu뤑B BGxEu9ƎF# A67{{{Rdnnn;w ii&r̚5 333x'L Ml!ӟ;WR1~x6o,B4MքPD7 `KBƍ ֭[B BƤ$E޼<<==yfZzAUUݝSUU%BH5kVVVt:՞ΰaä-l̘1dff*vFB[|?/5Ba9 BBBxF/Bl5PK~7mJnll$.nJW3-B~IK׌hpN!Txؕbmm2k:u򢴴Tؐ*B~ RӡCE^YYV da!^Sȭ]@'6&r0r%%%PRR4XZZѡC{Jf !x&1lv`(#v>rEWQQ"k/--Urm%%%SNdg_F !xϒOS|O:}y`+Du*kҚƧKKKE^UU4Hxz*{XCΝHF !KALX|\oe5 B_hPlD#ʑ#G[c[im4[ fETWW+~NGfB^'PjY{~~>D#,,,((ȓF !xe !Z-WjF !xe !`k"qA+0)kП*>(yIACZ-rF;WBaawYNCӈcH+ŅRlllFBcxj55H!,߂*C e299Ky\ ! x(YvB/-_'v9j T/IIk)Iߠ*'lNQc.}aZ~R3X!cx//ٸz<;+CB Bj,pհc>-ᤵ\n ]S˜pl:L ׹3]=~4W!WԔZ{9ЪԘuX pZ.  ̮|_ c¯~\E[yG;~4V!W\qd{5 w"H8iepl ~z-B B5VVVTTT(vFC}}4X #,D,S\I/BHRºcըj_UU\(+^#booOaa4Hab? rW!W ё|Xann+++qp3Bkine5!NL#M4Ř)r:vtF !n/^š_!K(..VdJDQQo"B\C4 jjjSUQQQI(*yHٳg++DdggGQQ궲! FDCjjjYxk\IOO\,,pCaa!D!^!$_gϞLY{~~>={& !$ V)/3334LMf$t=;;Hxh<D#pŞ511!((H(+D['V)--U\$%%I[YCCي uuu(BH-dgg+n,//GGGE.-C޽QH!^JuBoS:pgΜ RYdHI9r4Qqg`0\'0N;v$++KqupAi`+KN>"kOMMeĈD!ĝ^![f EEE(nNG]]yyVxJF'MBHSոڃ8vLvuppP\ݩ}݊{,h[CܱAgu|VD0,*p!i`+:{6^ܹsL0A(kc+-46>谲c~hz.5JkB(իILLTT*aÆ?H[?jʢK.C(~u()-e!!sڒٶm4۷Oqw?… yB[ `,=»qqqk |+W dzرcחNq#+w}b-++3gJxbyu;~Dm@F0XQVV a˖-p *++t966'|V+ BZI,ʆ! AB4 ݺuĉ5kH[~b꭪Kxks(Ұ]sN)ʪGB(Ydd$44(g藺P6oެ{,X S !n/]-rttCQ Qj&L_- lF⢈z+++)((੧ !n/`W@n=1$EDDpaMii)}4m޼GGG̯~}YyB f~ge;sh0Oy]Bt邋zT*6*֢"yGqBXgڧ|'><0hf5YiMeڼy3RYgyKJAbb"7::^{ F#Bܲ^9T-&2a5?p$ Dttbj믿&--Mx>ܹQY__Ν;O077 !&B۷o,Eԫhxy饗yw7`F_gtt4 ,`Ȑ!4!D^YxBCRyf~GQs\\gΜ޽{~ƋT222xWiB K`ӓg}Vw|MoSK?O?ajj*MB4m'd]!ڬhRSSTDnnn899_HnQ||<;vK.F[cCC}|ݻw !!^Yx"ܜ\Rvh/{e5!sssm?@]]"jW^!;;[x ?Sfر̝;W&h{c?!Dѿtž={Q5}8wᔗ}G|c2yd8q":ΨjgÆ ;,_SSSy!$ !JkG}ƍ9~bjg„ 444pB _|agٱcƍcmTǰGra|AyR!$ !ڦ3grQٲe Պ[Vӭ[7F3;wfܹ[ ZOVP֦C;{,?gܹ3w\zit+fFMzz:]v'hinep!č /̨Qԩ"jWTx{{MEEgϞeTTTp=Jhh(ݻwY,']{eP&'I-qw}{nvArr2~~~ 0ӇjRSSOyרK.wPZLPCsMtCFFٜ?xN8AJJ ;vSNtڕCIIIdDGGBBqǁr*r*˒#(į>⿳\OqvNl>V1 5?bBB: IDAT凉9*,,$++x˩ kJн|͎k0 } kkk`FeeeDEE{G9Wy*^c{>(D WqrEW$-{SS7U۷Bܦx=-rZ}f$'[֎t !(0p]9@"x}i5! VIH`撐/+^;5%K俓J'!M:s ;wdǎ0?f=9msl:L?] e &dzNQ#55}V0qBqKW)?R{1|;ٙGHBPll,7no!33ݙ7oLWۺJJ +:,xIl: .CEE+V <<\.PB{5CA'aoZ:Yz5K.___˘1c~s!ss𨫣FXXЯ55Ҁ&o{gF#F6)3ݵtf6}:ii&H-J[n ]zCktQ:cS.0 7w0~.u%7Iۆk[s/;bQ8!$>c-[^gϞ̟?Q53cVYes,Ï7*N8DZgŊ?^.^u,`0cjbFsq ,HwLi}xX^]OWQül۶nݺ1k֬f_lVk}='Ic3@8F =j ť#@zz:N"%%???O]=Aeɒzľ[yitr!Z^o &Hୌ'|y\˅pXuا&D{g^ubbbׯ=P,nl$ut:+芋?PZZӧܜ_~9s`kk+GP~9} }7vHK% :5& u$5^ 7R2# Avرcoc1o޼fp=uuu9r{` >>8::J--%11DX`1=z6c3y$5 Pܾ?X.8Y/x,z8^  .9osnWg+D[?ODDAAA-OHH`Ϟ=o#y W 3,kE?"99ooooqss̬`0KJJ Ν___֭[GHHHYB(DC9/elGzrJk/f;/^tv 5kUU,xӷ9ي1e`N`m54l2yzyj-kjjعs'%%%O8; VV2n"fMJKWeXnݕ}?8q;v`kk;:uBca6f/--%##tRSSGwer7P| TZ9 ]U@ v'k}WoMbVQ`sq ;;%%%DFFũS055%%EAAT룏CpN޸-$VZuz~.\ٹs'Zz=8;;7Y`y-PfHBpu,@Q__O~~>999deeJ͍{cǢ,K?'O9yzw}xks(˥U?8UGZ:9c D[a0xwYd x lذK2׻7;PZJ'>3GK?~ahXv5KIIaѢEdggsArssh4_kk>S?%8ʶ]H+LHii)QXXHnn.%%%œEsٻﰨ #Abڢ&&h5c&jݟl%M{""(tPQ(<8ws3g B_xA套^"!! m۶pB^z_|)v}$'۷o㶫W2m4)..&%%2*++155KKK111icllA')c0D PA5'S5555T*j5*j*++)//_ssslmma褡 p2^\!x$׀!_ؓwȫ#PVXB{>}Z+2K6mȈҀB!++ &OLMM ...:SfCCCBBBزe o& 2B-Bt9vs611!88dBCCIKKB!Wq'FCrr2:Y~CCC:tرcի6,oBHBK/ajjB 33aÆ~RCTT4B BյE식7$,,0Ν;',BYNNNXADGG3zh~ѣB!W֤hG2gp'pbآl~iFŋ/Hpp0˗/J!xhaw%GTkx{Y $%%1rHؾ};>|X3B!W(}Αb!ʸBm۶mۖӶm[yx79~_!d0o8BWTx]E `Q:>ˀ(++ɉiӦQTT3< ^7]))\9+FL8!hM1% |L;S~*3T %vʊ DII [\r'x!C0|p<==u?ο"#M֩S]̌ f{}A':N4c mn T[ժƆbs=㉌$$$x )((y OJ"nTVoccVoDԩSB Bd7҇.'b슛ŽD"VY+s O֖0zꅇK.LJ:/`=7ap` /TRB k7z~t<R~999Cqq1}Ỹ8*+hgGZ Հ `jJ_wwv$'󂿿TBHB45N>MPPTR(ّ [[2?1=w$ !Β! B0WWWPWECf Qϝflff… 36*;Λ>,_}'OV!^!c`|}}ILLjk10༻;KǎTf&7>Lqښ={2tPƌCrr2ӟe|lٲWJ !^!ȹs稯xHJj5yxt*77'HF`eeELL FFF 4_|?SSS,YBΝf,^gJ!1Be˖  yHjųO?f zTtU<###v>__i"""Xp!B^ 79%0ii$'St;ڴOE,,qa,6!ݻ7ׯ}K<j5jjH74\O#^v y?KKK JbԨQ.Z4?q'NNHLѣ εkf1~iX!x++ >gƏ/F_M ssxȰ{7߿.]йsg^y"""8t?(--wՋ>}ЫW/,,,+W>  @~~qqpayy2[!n'cxh!vڅRZJPrJg̘1\p?TUU'B@@:W&55USSҥ#II9 @6~+ xWٳ̏`ٳWVJ !$ !Zƹs2t9|0j=zP\\_[ne899SO1|;F]Cd?ޫ6eve,^̧AHъPH8yK C.\ZfÆ ѥK{5^wuu%++,"##9q.11`oн'~: +YOxRqSbab4f]^θ132=8Yu|̸ʻK.]JCC7on5߾c;$$=O=8v<;փ§#'' RSqÎ;^xKykccX!Dw{4?HmٲeL0$?.k'1b EE%LR\?|gfbݝRBwޔ*e믙?>lٲaÆa,={-`$o)cc2 twk|'zzp$!ZN:ž={#!!A~$~ь3X|9tܙt&Nر#?xɛ٦δ+,KYElTAHHlܸ$V\ٳg5{lN<|G2h 7oRQB 5y)連m6~8H&֭[B4M5ræ"5׷k/RhI[KYB֬}PXX̙39r+Vɓ[P`diD##dZVСC/bܹH% !oUerQ)'fŷLTӟDAAkײi&Kwؘ,-00 Аt͞=ӽ{wvMVV~~~H !O$YSAW ÊE#SPyBn=z ..>s.^7|޽{ReCC&3,WUBy9FF+nXl&&&ХK&L@߾}Y~ wB<wr1|g>g!P*L0T\”)S8t֮7=Lof؊ bJZO>!;;}]ڷoŋQ*qBWBzμe72b_x8V"**ǚh4qP*N;Ñ#Ggƍ޽۳`jjj!BGubۛk3fPD W֍2==G◭[ooona͚50^YxB(WVVZJJŷcǒ7s&Y86x0 1SJ\85J~e[j^^^Y Çbxe !o5q,^Lqu5lx.iD?)XuB}ﰊ]RJ*Q޽{G/3qDrssbxe !o0:$NeÄ (+cפIk~=|˗HqR⾎=Jbb"ڵߟ 0!,sg}VV(yfFSw/t[̙óC'_L_$22Aqe!ܼr}ቱ,ڛGX O|* O!kgr2}q05wv]ĹLR[UUx{{ӷo_\]]픱1gJRyCGMLR$S]/&00OOOz*#yཹċ3=:.xq'N`Æ ,[ 333ڷoSO=F_MMڵk\t/bdd?I~oL _=Zjf9 "5Ʈ_{ݻIL4o .o>˱\\\חE)JfJq/ePe`Ax/O?}^!Zh6l%KP*2ao}F$''sEx΀ӻ[)]8n/Cd|دS~ڝ;wsL>ؿ?| EEE8;;7চqB<FFFt֍g2o<>!}kq=ܞ$ !W߲rJСƍVkˬRHNNҥKTVV2zh}=fZpau;m-{RRHʽ e|`vz}Ҁ0`| eee_#FT*3gѦ/wÕ(?t8]+++ƍǸqXx1iii߿>cǎabb~AJ`>c<<<߿T: =羏X_ Bp,Zйsg^}{jrIHHח3gs= HO?0^~y#AL2)S@\\cѢEڵ n!97ng!**6mHQmqׯcxnS9s'ǎrA7**d:vHnݴz\.@ff&gϞ%'']~=FMmEjkwظ_Kmm-$$$IYYnnn=666rjd4i} ={6gϖFͿ?EXX~~~=P(ǬY<Pd[[9s5kVuuul޼O>7^Z#118윙9s&mNbpu|t\;w.Oc5-`̙Zu̞=Y'J2*{e︿|f}ړeu_Q}gCCɶlvl{x4Gkܹ3o66jmحӬXsss׍sf-.\p ,, vbԩ\t+WvZ;Fzz:uuuDP6|פD[v?(?)ePL )"8K qrf~-wG假4$W>)ɶlھTߡCJJ6ᇳ(&$$wwwry{/Ν;㧮hy222(((ɩq Y(1KIIU5N՚Z9cձ)Bx$C~Ӏ%d$۲OMmg ?өS{}YDGGҽ{w-޽QPp+zz>DFFfM6EEEL v͒%Kعs'{ţ׾}{\\L={C|@>377Fùsx7 77;;W,z )//'$$W_}"ⱺc*nL)/ܧM:K=zSVy籴VWWsQT*Vbȑ҈߭[7= Z^ ##GRRRkcCx8Kǎ{3ydY8Dl7_O7IBUUU1c ֮]Khh_HHH̞=SSSiHT?4n/All,_cffv$Ғ=zi&BK_+DKtܹ7\]mRTٳ{{{N8Anݤ-۷ooOzz:))):t JLBWZ믿~\xT(!'Æ ͚5kxg%j˗s'ؘӧO RTTą + !z{=VX tbӧOse~*Yn]vB^[kk>ד'ɩUו-+W>G@O@R?~<7o&,,Ln}}=;wDPp) :Kl10 1B޽{Y|9ʺf˖-rB^!k3f 3FEa۶mߟ+Vȯuَq#z_'4i.]b۶mСCjbmmtQ!t *++:t( 2DnUU?O?4W6nsV^Mtt4 :JOxx8iiib~Xsss^!Zf̘1ѿ/ouu57nߗu5NP4UՌ;(:D׮]ҥ˯^M۹!lj- L4 'O&??_'®ZfӦM|v[ݟR*ڵ\OQQ+V\vU'OD B_Nb:wԩS>}4 (( .֭c-*`eeEJJ4xk׮]|wӉi?NHHs̑w'22lXv-ֶ7I==bbb+xEEE1j(x4 ˖-9=Ejj*UUU\D/+++\" ,Dk ҚkFݱVWWs9֬Y4/gggٿ?gΜa֭TUUXZZ& +Dk "uKTT:QǏ3sLCݻ7888zjRSS% !? !~:&MDC2`ffԩSįbhhHTTDEE>#)^!ăXt)Dy;Ɨ_~&oӳgORRRb۶mD2`- ^JюdiL!$ !?={Dyڵ+}(JnJ]]և[p,4FTJB^6mڄ#:QޘfΜ) ')CCC㱰`֭Ze p+9, )n^ 1b\G'z/˯⁩)>' N2j`^bll bݣP(8wvaלBCm23UqK;ЦM؅\BBB-E.t?9>`Bz5ræ"7_ؓ}4w&+ qU\j5%WqHٌeGpphR7W lhоoj5HBHͣ^SN̊o)?@s$! 'Vl8OssМ6: :5X 8::re+[yy9HBIMꃮ8;y5F`'#x0];&>퉍 *0JtŐ,HuN-Ygj]h׮4-&*]\#?//5$C9f=h4uq6Zul)n(G_%+J&Jqq1UUUZURڷ тruue„ eܐ_8]12\Q :0dE)Ҫ2Ix?cߖрc[̴6\Q L>7(%oAvvV;J!WqSZZ\ ;Rqj+JaL%'ܗDS*ڑLϕ0pV|@,..;;;i !$ !nھ};u,d7eTqYRbs5 +J& /?j-FUi׊oErrr?~4x5jLc8Vb7zLs›+J8cgF]sYQJ49G(ĄroooErrrׯ4)JkBܟ'&d`icM'UCrzOVM*xq+LƭY[l/ $Dk ҚƗ08z =r*[Ig֗ߟKC&eJԍCy),,Pfh^!eggqFl޷*"Bu">}hiHѤ xUqkCs~+r%z-i!$ !~o߾^ ӓ")+ϟTS4>t>NJ87".]瞓B~z-u焠ǐ!Cعs4hЫ=7k.^!}C/JbŊxҦMf/ǹs;w4xcǎSSS3e𠨨Xi@d4 ׯӳYQ]]Mzz:&MFBAEjjN{̙̟?_P4LMM177or4xj޼y$''TO:ENNMbɒ%7kHLLd˖- BHB<ÇZ֩r/Xz*iDX~z111t {{{i!ZkքuJ%>>>$%%T[F믿.(Yfѽ{w $%%qi!ZsքlBll,:Uj._̒%Kcq)~u֬刈 88333i!ZsBzm۶ݝ*BϏl޼YRunh5O<{eJV[[/̆ 5jTpU"## BHBΈ#pttߟ/i`@ii)*&LwիYj)Ȅ{wҚ%DFF*l300aÆqQ:uw}cţҥ 111L4 wwf-ͰJDD4xNVZ"66H.\bkkKv dٲetRmE4 ۷o'((Yf1p@ Q͛7ƩS+hjڵ#..hbccu~ $((pڶmG}DVV4v U__ϦM =nnn<3iӦV^^ƍ ::ZKxk`<qtar!'$&&~u~eذaTTTرcټy3jZfΜ9xzzo /Vի|sIi0!$;yy%` !?RUU"0j5/͍^{ݻwRuH}}=wfܸqtڕp ij>5A 99[OrAi8!Z9!III׏k2dڶm"???夤$8q"O<Gr hZ g۶mѥK&NجS+;v+W4BFP7n^^^_o ޽{1]:veС׏^zaff&E3l޼cnn7cƌ6)))a׮]XYY4'.񗍑\) dq)^З<dddš5k2d...-n?J%L<ܹ#GCӧ O>8::}Qppuu]v>>k׎Ӯ]fhG2sSXiG{ nO$''sEILL$&&|ptt}K^8pzz2Ӧ~>d5!9'O$%%CrYzEǎ[xyyB]]EEE kkkRSSQTk///\]]qrr ggg\]]qqqiI⑆허qTeGz"++t"%%dkkklmm2d=OJJ ǏƆN!WX+Di߾=DFFFtt4{ϯm{2epv[9=={*(zU'Bxq4_K q-l!)Iπq |h&MDTT]t! sssi9```H 8p6y?%N ,իW9y$q9LLL4x|"DKu2vOp)v0 R+$.ҥK$%%Q__իٺu+w IMbﻯ [V%˗/?sN(,,СCvnnb,Iڶm˙3gfܸqp:wLǎ]%J:4ƢHrz^QsY $<<\!uP%/NL;ʒgHL]dbbݻHJJblڴ :t耯Z_BU/ h$!!+WѣT1<9FcoyzZL NԩSh4"""6m֭ʪqZM/ ;w&""[[[!zrx#5,'V}ҥ a,)w I:ԫ%gU'ofj8 wF_=_} œ $DP(ׯqqqsa}]ӣ]vkggg_<򐛜8?Kn*o7jH,dDZCxB =_ߚC=z\~.&0TeOO酗o>xԀX1]Ħ'74l㇃j3Bhi>?ODDDPTT+xxxHϛxh<\Ҹ[sIN|dFzz`s*50+Uy h+4ՙ1w3M)ru҅9t1ΝCVₓ...iӦ+\UUָ"ގ; +Ds}x”Y~{kcnPYMI v)Y37qv6^#G?lJ._PBcOeElHh,,,3f cƌ ;;H͛ѣG)**ggƋT*$33J8p2:z5Bz>a~N)s/s[kpkj4䛶#ÈTTgW=xx>cˢy5%fŷ@ysuuggO!Ç~ȥK8r ggg޾q]4 %%%撓Cnn.ոիԩt iӆE48`48?2T(y[=cn Э)~IM]q+~ RI>}8rHmDEE_@aa!booG[MM PPP@aa!Ř쌋 7nOڬ]U3 zu'Њvz|L& f1=Psq11AbuA O[bN2k1RZw/G:?β177W^Ջ?呔Djj*HKK20lnn)jݔiNW eE \Қ'T*Uc-++J kkky ҍvIϭ-#y߃}8(Ls׻?]ۄ5! O!# 8W^y4+'55˗/W_Q\\LFFUUUS]]1cff`bbqq/MtŐ[mŌ*kUTVV6^ Ecwooo\]]xʹ40sىBj%Fj+RMnݺK_Fm(E'HcoGIUJ E!XTIHD"J-JAPb;o/B.q}|?)w|N~pO((~_uuuSsswbt۷OW\АH$%Lc!vL=v4M0 )4'S>'U&d2L&a};L*H(LNZֻn;~ϧ Sq ̡D싘. ^M^<௙B/}f9R(RH!)JW? hсk:)]~]JRV:V&Q*aYNdǼ[70 Dn[.k}TeeeZa|~^q~2I*>{`Sk\@"_Q{.!U;`/s3csW57i)w6S>ǜ, Dx㉕8PhwězF'6ٍ',˲'V~Z\>M!=🧵_8P h<z+XE!/'@%^ x/@`ě;8qBGM0E P@띮mdt\88-;'UW9?c^k[:FQ֪! p6/ ^ xpۻNkov/Cp;ޔ>x'T0JR8! ݷ>JA, i( -ןܡW3T*YoW5xEGCNu5*wIFٽz5FpBf tiy|7a/@i-^Szct|Ýv"?&?ҁgӎ/_S)wSuj7c {E=t.('TPw|]^"pY, O_`0{޾4B;ԣv3y ϢHp@M~$s%Po~Йk XTW(ᄈVsd++ ]h: `^Rj.UK5q.ڨ'Jo4b gu;MEkV]jݵzzG`XVaCMn*p O6 4/'D75x}񄿄J`mܸQxj<,9ٍ's7X=K5,4=˯y7'ٴZw=kh<F1xFpXyoҢN>/xo^8& ^8"Nv (;]%CLaW0KPM5PPOު?;3jmmUmm7Ѩjjjf>G5!W㪪*;;;|0!nd/Ub8SYY*WVQ0gcr6СC:s֮] 6]I>aڙzzn$۵k.;vlVcvWLo$с z|^. %ݻW7osyI@!#GL {Q4N%IjhhP$z'-[hϞ=Tzs  /_VWW^L&c?nYɓjnn: Ғ]poo?L&#eܑqqi=Z~' i P®$թJVww4MC˖-9]Y΋(+_VYYL&{O^W>On[eS۶m˹Ӓza7[,ӻ+׫%K(HhppPe^re~Bkn%JR0TGG<(˥@ P(իWO9az;'JC.]:it=w*p؞0 ={R__oh4Ca̘OPӃ($xMI* e?$Tt#Ʃhjl(utIENDB`fontmatrix-0.6.0+svn20110930/help/en/images/browse-fonts-names-tab.png0000644000175000017500000006423511223375754024155 0ustar malexmalexPNG  IHDR,#_sRGB pHYs+tIME;wltEXtCommentCreated with GIMPW IDATxw\Gǟp"Eػ.15c%X{^׎(**Ek;zC̱70;}ݙ:~x/ R~Kﰧ!XRƼ  4V/(BA"A!A"A!|sF6{²<] P:-*-Sf-_f$KnG.LTYPr&^\u)69Đxuf5KύjNt3;z24AC[ѣNfFi>s_k6u^g&CIi?qE]}3ke <׷f/6W9m u'@Az}u^)0>pڍy}?嚇 '4b.,omLߠiK1M,VjlPzzϯtk~ohRO&vs:oXE۾ +_KPZ >,Wg{иfN:e9WR:>[@(# Q-'Qȓ3G;(nH4eN /VP}#- Y`͊:74I(̷EbX@DIhW^SlܤZͧ Q=fa,JbE~ue}7C[}[WJ(J|ԲLa@l<ˈyMg1RTƎghT0z#_67qÐeکaa]9w<8EOiKabJm4&QZFN#㙂3jBdޥt)g \My< U.{$F+;~x/.o Z4xv|kwpE% Aa#RΠE (BAP"DE (BAP"DE (BAP"DE (BAԋTM.=^b5nF/(ThTQ'a@8eYB8lox<>E}פi|PC!Xj KkOea)X pt5S$Kmj(hcWOS-akpII{ @VD"IfmٲFR BJU[tsK~M Ksk 0sB]BBT`ҡXBuU{H{viK-(-ۖ1_j =n>K`B".Y&==ɨ$˯QZvL?]xI~mNio0E↣%_lѩ3uIh|j=9=Yg̢:$;W ;KM峃_fѕ񃓤B׈ͺ.^Յi!+{Asg`)b]"8@6{NӺ *C#ߵ{8b8꫊vEVBԐGlkfy{cP;080%3h`rMFI5^dt!sv/4lXjB`oY{2"= }[gŗn<.P+{E xW3ݵ];kh9y=@ξN8 \}scFS5Z0heeM:5x۪4p!;6v8Cuccl/[kA:4}s~|/M߱qJ ܎",3l̓Ư3U̬u/,;eBmiɿ\ Yk٦F4mjg͚$?eXؑ͡KľG.:oGbg˱&2\mDݳwϞ*!0 /+J%xTISGQ8K:oXE۾]jo1r4~NOo ^V)t} 9Ѡs-F ڬ?@}}{/=y{N4%P\3LH̼:XOTV{Q)U}ݻv:t?@P|ؽ ԙ.Zp}7V}Z,:}!'vwָƼҲ8xy{4ԥHʽ  ðL.eafL@|<6lqaXðLV_ɱcgNZu:ܿI p(ȱa"{|aY2,CX Wfq={۷ٳg --w={dʋlf*H'{sJ233oLhԱm *]Rֳ{@3ɇ R5#6ޞ]Ю{ ,e?dpd6%2 #"V& 'q,.Vrh)"Ӕ9RĻv͇ʹ6ȡ Ga is㤳b2UдgzJKKKKKիW^=5Xz-]0X߾qˆ!Eْs]'wfN~Mt\: B7|`MiRQJ@ sC;k;G%&:livBhvӆoָNb nL.X% ]Ӌ.B4Jc 3[Θ~c ug}mvrӇwhY6a]hhϞ=d9F S;iH=hSF_{ۋ3=:2xR*n޸>qRܾy˻Iݾiuut.V)V[{*kkl/$F`, !>+WX^YV["Y[%1ɐV2m EhW,l%#ԧT'~l肉.'BJhvܶ:ƕ7{7y0썛w7.xs@U +{C]Fh`IxHQVLw;0,ð233-pS?ŨkU^]v}_G[E٪T&'Gذi+kRko5 zUj',gzWNmgէ;6T0W#S[p3zt~"a,.**nN G$;/&x8لesペA>{ =n|^ͫRz ({N|wŇQ)/g1{6zY'k"Vj+ԯ3;88|yhNPomc-bFLi0oh^3M$Zw,B֩ReT\ :E"_ ,C-|Q*KTK4y3'wҌ<-J+c@O",iX ]5{v|P3JsD`&?x".+gO9k2~p¼kY^[CR=ʻ5)E\DBO"D! (BA""D! (BA""D! eHcYZ(q[ױ a&E!G<#-,eJJ@T褥KkZ$ E޸!Äfnٽ`XIݺr><<Ņ !'$KJJn;Q DFڤ$+UJlH!lQ@XBg"BAP"DE (BAPP^;!Eayj]/2P@.Ӟfy~m}xߎ>>~f]L`b?#F_.ǫTJm_615s҂O|ҡv1*|N T}}puNb^67-REȩ3 ˉL}ۉ8͈8탧:{a%N=}@m]h.FXcA"U2_Oc9Zdz韰 :=8xa38 @*'$H D0-}lz¤KP?K E;Gbڔ,2MEJ>@)yOYo1cKƪ@cx{̻GM!ሦbzGvo.ZxA*•sЪu ^ÑmJ=loJNbW;N{@'$8'n9 zB)oO"Dr!EQɂi RAiZg AAE=|pN]OP=R<_uGEHa/_ڿ;(JOOZ"BS˥6˨(D|fϏp#e'iX \~)ۃ (BA""D "DE (BAPU sT.4?W(/%'%Vdh7TK(ʐ+7B[{7oϣybcÞ~^?ʊ011ޫi eTbk="8Xpo_eJ7(H WP)K$V6|*D,hDb3s+h-e>-5`Y&!!.}Mr!* 8S*+YJUFo_By*vGxrYFqJIƫTJD_AzBYz C '$OH w n<2[1]g<:9٬%a[wTA!_#7[W]q5CT)7ޔWMS S-'h.CB@So?i$ϨAM-uxMmNl˫z3篶^0ci K֚)oPDQ5)wK4}".f;zL\,HI]$&< +BJb74Ȯ4}B~s^mDF]szޞQ??gkJ 2t " -DfOZ70R4U9//zjHu&z- @d_h_:~UG-w}8܏URVzvoe|m&kW^k8gCbS*jՃV C˗\ӏM\+{grп7"3c]DayI7vߧ>/G1K/eZjȳ6vbZ~LH`!ߴ`G'cysiASdRh/sֈ9]Dވ9+>{Մ]ʄW8_/zXH@A3~3Aϧ5nit{k-qFxƵtfVҟp6&.թ-zD?=fqOL=OIiR@s^S?uGϡ3tXitF.+)Fn|#m rԀT\~ V-u~|`Ls6e_=H~6ս~5~DcX#ğ[ кkh!@T@#^[762V g77[iGHMZw.aX*4 QVj۴0LY.w߬Zg73(8s-^Sy-An΄dy3 ϵ@\லF'Kpʤ4E 7HPקg@HvENrtz|BYtC^&7I  5ٜ*9o#9aeNs<ϤY XzYO,GpS$‚jZ]n? pOzJӴvݭSRw6ovns:uѧsGK=zy<󌶵kk\mQ$#Qeu^.Þz9߮}TJy4Z 8Ni?ZWd㵴߾ZR ]=aeaA*{8J*x? P* +EX`_BR2",XDx GQL"!B@PaOڶC*o'$U|#_9 )h70ru`Y"dT*XK!Vt/-RY8ͫOTӵꄣ bdd#~kAsq"D1b APE AKXw-t(;|RU)g*kkF&XHUÖVv<4ESuJrx\FeQ1*fR>}B5J5T=KPY^Ng՚Ŝ~YL'D B@e.paNRB+G2 *)BL٩ r_"x}BHakjb)!sO Y)e٘w|ngkiiiH+, %'͙$ƈ{bNLl_kIʬ꘨˗m=ctŤeoy:bw VPPѮ,lίKt;<8.ٛ--)zS{=LK0[Yeٸ{eL.@ D&+~b U9!|c{: E0 KaÔQq 77#kkqo4$]\t$h*[@ f"d\l ?zQyT \j23 ʲ޲l?=/ IDATj?W=67gGs)B %%死QM5uuu}";WhӪ!\̗MPBvs {"P1,Q)Ue s\Uww)QT|MׁG镪 Mv#5T՚>>-JןTIWmg_cF55!!9Bhrݘ긻Zѵ7._ѥSGBX,XȻƝ<~iaH>{B&򁭗黴D {lѥ7B%*kuZ7*ھ75)Om?QEi[7վqCG2dlrΦBVvbvs>ej@`ߎ3Yqn;yD,7k͘kV^еiע-&iK1q!{-Y5? K8B{Y]^ ەzO]tûq?2Y]Kmƍ͖^{!z?N]2 3&10ӆrh&4GLTyhʾEQ))8q8b`Qm۾t͑n}Qiv1b.-t*NQiohjB>kĮ#^`و=mwIi:ڊ7':82 U2lİ au]U)Q dTp R@ʝc 奓t{F1%a %lޣ C !(E޻ ;+Km$Ϩm֎byȚ Q~qO'p4ѿvVFfؔ7$CfL5)߯2I2=w%Gq4VMgP(8.EB Ա(!jN-)ٵSok kwUӧ~d|(V  ( ½\32VħWNW'x "jڢ6&)ړU<]Dt?QQSG5h{p-QKr.oO2~v:Մ4 :o+}iVﯧ穠 Ƨ(mF@ӽ4 |-}JLpRm Pq9@HP*/V+Eߤa:^ʣ(Zst]hhh) h i<tc/#=ɽ BZ:4_f9)*1cHHJ)@(BJҒ'*×dsO;2ZǀG7z#4eƍ̖c) q-M}"8h# |{˪QS,gg? Ufhh2nl:GH(߿To(ogŧhJbU-i@S`hԨ$V˺oOI̋$6m9Ћo^u4%14La).1a-K(U|qA=OUJOc@S x(Nvѐ}|sɂ?R%~k/.Z]GP_/TC R(M9IEQzFΦ72)Yvie~͂"]; nk4oɟ?PNӴǀѻ-W1u)Uܥ{%4O&FLa k.(wqЦh?b VJ~omq:!ybYB|ho\ಾfgտMW Z:)mj_k Stg f9@?dQĵ 4}8_ޗ:$We\tI97@o{l`PAu(TaiO]R5ؘWHKG21HNrpB ;T{nb=ppa7A"9:O*ĻS-)j)coXb Ka}! w}N~Y QHBN('9oں.v}eXȦUk#(|u_\/˼CKw-ּ[a3z k7o#""f/M86Fq>i҄Skk#"et:%QH4l;H4uѤ6,v-s:a|'x94Ezyڨ\(W+hp?)5!Ԗ633 YF{ -z/ +C,#O}%ASNKz|:ܯ//v-=qm[0kdҸ,꣗oضfRMqҝU_7mM/N^il!^tBP1}aGtN6nBNd8%Y8oVK{+N$A`tN t%PE]k6iH%кX'~Duں]K6nG9N(2kS=}7#e9Oyc3p܂Q*2B5x؀A#~^v+7'Q@KLT\=an: 2MP:4h9pt,&UHǦ(8.]mW:_clr72ujvM<4.x..vx&ht/#F^M~qpвM7Mb72yĮgutyyB#OċOYv콂e ={,kH$*ίz}sWY֬mhaubբ/ӝ*T|# > C(u Z+ e};7W $SVO,QГkd*Zw̟==f¹ګUk:8y[)oQ[9%$]_&٭KSo|cxzVn5 uY1.]P+'M4mjPaH¥$ cjgߴP]cOƼ{]c>zh*N`of9**;ݺ`̢u$_/oRNΉGO%p̤L:k\ӠV'IWxpi5f/CDzZC,{L򹪔ľ]@jOƸ$R4ˑg7_,#%ɦ~5ׯXd_R۽$z 6omzdMzeF Jex:x*R]ˮs׏%:V pM)dQF޼#{cB#އp7 &mH/=q6 esG4])rkFt& Ɵw%Q)I@xWy*z2!vNSMW/ߘAA@)@R(j{Mӄpl Uj\lɖ~IuT8mׅ{5Q{95Fͣ\k610aX&==ǣute*+ͣ G o;))۫s=nGhJ$捼<9pEQ(B)gH Ν:&%bUc)=u ˩-Mͬj!UU|>_(|WeXQ)U8Bbz Q"HRсm.Y|.H"|E#D㏾oЫ5ʫy;O\w3c|S>;Xl;~ةO{Z•PUl9"~ohkV!ipB[y)`̗lCZ~-@:.K3mo:r=^8zrY2-3qf7 ==>!`U@#<)l#纣'O:f|,"3oG>FBTjOȱ=ݴLhm{$AUx.\h:,zQ~/zy{V78гͧ!k_p 4gf} nB h-s^Bb2z6"(ߟa\T6Ssv 7xXeGtX3Fuї>G/hTNq>(1oǎ>:u0B~~v>POOӟw.`/1SE[.EdۃcUvضCi)K{eoG.&|"tlKup({}]mٚPF?oGn#΢d~W#_uEXD֡``\./',z>' >rՎE zSG7u ׈; .YonQF*حOdW";m8rľ%ý|jpY b&VϽس _u,Z$\] ̐(<3, %Y/icO: @I}5 *EB(qԲqC\t 2^VϩoϦ IJsK[E l3dm@ I]F{\Om~2dg|̈́GwHYcgX2+6hc" ZpGv,ʘc2 Fl2&%{߶m% z,XO͏}53UiLcQ`h<8_ͬڶ?9lnf\U_%w^wbʃ9Oe79K%s!#|Wtm:bR]-f+:@ЀX%>0`Sއ%(,zvwO~OWj9t,Rϐ}x"\!醞Ɋ/:]~eڧmZ׽Ak.N9s;FE1N%3-(xI5Rwoݼy͛g3s_o *2y¢)5ݶ]Dl٠\(Z՜m?*Aǩe ۥvGw:eѿN}/o4^k+1%hr7_K.nW8zُsښ0%BB?׷Kﰧ_ B^rS~ yO.?ݲM+;REm->wzwxZRbGQ;N+}i!+{R 1:/ P< +a_V(*RTU"ceW/i7+_h X_Kef2WfY]Vߒ3鏧8U/zh(+鏧 z~H=/[m{a%Uen j@PR]o U",NzA`8Zr`z EX8pf=Yxwh_qs[ SjЪu'$~.r>an`|l[V9S%;{`wG0U=0w0g}l38GF','UOIaGԿ^|v×? ;tL {ֱ]v?8'[gtל]Syً-+'\paPPPHH)_o )G ~|eb#S:<Y럿,`8Ztwf -9u(NLQ`m{S3kE 0eeGPPB)_iizz;ER@ wAV@^vM")؟zf}|TT#mj؂A<ACuLfvzBK{~;RiDEP x ;EY/x[Ծ9C΍@vWrlW@=@|l36YaE f֗EX(e&nI"D G G}{Dz/ʻ RW )ߵ'd6+Wo/ZBT*?y2&~C IDAT? ѳb#a2T zJ EQu a5{Dv"N!ײ>3->P2I@Qw%[:,QϞ|vmP HF!)Ty7DVWXxz2XׯseF<՝珿4Hk#f8=wܹEy 3mc*`l]{97^i`.mZtUZۈt= h.ڄq'ȣk}+8|,O~tUm g7WϑHJl:rLc^a%'cJOE9԰T*۵rqpʨ}AGuM9\7ԓ?2a!و;ןGF:O\woi|˱V:a-~>A/+!^DaejJuǙ[[[Y cNadrr Ǭ?Eᅱ}Z1aw5@.)V@@qloq+[`|Në" Hs8;CCCBHJJʵ7j:;yܭN3[ hJs vN1庄Xu`'̹km͉蹲 劮n&---/*ڌU:-͵Ъug Q-g)|h皈AO=^1{qD@+PJ'ﺟ44ps W'@oNy%57"s7䩄3gg&11^ݺIIff\v]cuf=Vbk̐4תCs6~<1~!vvk AV6(jcML[hVb`QB I",Sw3_aEb)6j W`*|ᨇ:5ZQR bla(t٪k#dIٳQeITe:]P:lo\Z*XWzQ<t0{6T#ԡtfV}<5?p> v?v Ɇڵ;\Iko_?b5iL7`%?00P./<& ۴mC׌ti'ם[%3L, f3V}'h`?j٦M8";m8rľ%ý;:w`X\XH鲿qMr( ΨCy{>3hbk5\f>m@ nQEAAAMX*'/HlrbO/hskhd/Kl&Av8s'mY _p)"̛|'о?$]֯i\?{g͋G$蛧MZ3f ).-wz)E1@_F+t4G6K))+JlmqD˹#A`/ ޔKlS3Zg^y|CY˛)haeq|nR;d̎7&81iNOEgK"+\_v2>RME&-Yj&fFV|l3zX `37q g PcE J!He.A" +wo)H}GPάG0? ѯo]b+gKewFv&,Gz.=J(ue qݻ>[E1*s<%?(Kl\WCR'@ 8AI?,-0p翰tT?$\ꓝgxm~[VTdHԧNWp_ܾZ<77ҽ!޿|Ř9Wm|~n)ݦ9)jLovӲi 4K`b/h rykN&ղYK'KVt.k޼ -ZZHHȤIM *mk\QxJ'm=vm{u < b0ʍ8ފfk먖&wmgCfu:+վ=VI79Gs~"{VqDnb:>(cGPc,uss65hҤIU-CS$)#s9+6ʺ15|zIYKni7էMuywHt6Sn}S{f}dZB=Yx&&-=&;9 pm.~}lbQB"ݠէ1 {{©8+zu2eQNv~#o;Tӧ_6iOBo Vp o 82_ڟ;eˡ',Eٳ ,dDe<>"MѴ_8I@V7g"hޝtk&3ߴ]~gZ{Y;;#..g{v~qZ>uu-u; {pyˑ ?NQ2{^>3`({^~"izC{R5DX΍{}'I6^}y+Z(7_E"P$ Bc0ϫ5jJVk8ګUk-) T]<ٷw IPӑN2'keE)6.&̚V{V$LB6h5 JB VG{X")*C~4&| vC$aYB^da";k ]q-[BOM99lYAL`+웴ٶ| >;ޡ*eg{z"(ncfkA$|O~*qq/9!aLk\z36fH]\ND9yX(TNELE=mJÊtGHY"kWpm !@R~/NճRHj0"[5m\%]㗒  WKavtƢm180E>@df%F^E_"$@X\yt^ڬ̞|gV<}W‹13qD ൯JYT\?FX25/,Xו[Rxv¶ c6g BZc^jDI "`y Cj͓l[3t<&0&n>t `\Z̚odTٌ-pW"bc1$ 9[_zj~]ta6dvWY)SQCưY.`* lLRTd<6" ꌇͺ40@3 WKZ~\|4 ȢUWsa啅jLlnocTb +5vLH^!'!(ʲB4˧U_L̓%fqP)ʺ.2E@˂B"PfE8ptߧ?Qd޼𢠭fڻ+^#ߌ͔맓d˜~AL_ #˴T|F_→m#'ռ lF;BJÙU?:wvg>i~afG)ci(YCgXva >N㯒sg#Ζ=KCB-J--+ ,ZUPX ה5w&r5!$֌慊vӰ$݂^.$BΡzzޟ/n23rb 2P=DHY^jf%|7wU[mKL5rΒRN+;JRP T|;i e /{  B@B 1!cB$BPy]R]05i k?xzNO}>*(^!eM61%,~->0tɣmoҐ)Ȼ0AʭČAqU-&Df* ?0n2zt!fjjs)=#'O[@7I:qۏϽGaȴcUwG]ADRO5ЪԬq/D'G[ _;郰E[ɧ .)J0n%9ogk60Ž![b&MmI UwG4ouTdQnbpժUU!Ƥ?Dt*ƕ2K`8#H|yMH|pWD2a;X>MflYxaumDk)լ$ymo&&y-3f fϊa?gs=ط|Jc?U2膰^2֒=ɲ⟔(7iɱ+O?r̕])デd֤_cN0gkt0ˮl;(1njÔƋ uX aJ1@"1aM >|o/_GO(ߠ{鉏$d!*=wȖ;i2B"4uܥ؝~k@aX>?lq ɞ.Eu{Ìw(;z/)ɎZ2%]_mSƖ}dvV}JAcabj5 ,S8E!A=fbbbb3PK–;1n* Zx۸̩*K#I!?N9H ֠$N}:#$uiccл1- %PeDg"yZtOwc!va)sB {ABcJ]1e'Oo!%j]̎j8k֬7]8 <9|а˨O|$iGv{24Wk\::_p1ϔUӉDt!QegbեTȠYpk7M2߁/pE4#jwaO`=K9{ܣD`@q?Ξ} `):Vcra?{rtNOJ1)*=dػ$3%y Lϯ%z6me'}MgkiEe&sY9OneqDy3:ϡëS}#2)c%]{5 *5d Z P @bWNص^/+T9ުpvclG̚2c mlmڷow?/]:wP pwwkU'jH˫@G*eG64"I_%S}ֿ@vՙi廂߹Je^ŧ3]Ӈ])+L“zh!@ $@ޮwKZɡw+g'Ge1 ! ;٥{kںL7Μnd*(z2*ҍҩʖPiMKsx4rvr %W!P]DQ޾DLB4x֤ [)i ]Qx%D\뻹b |`0`:Ȇat}eJ\MDt'j )(Jbi/v嬇Hd$+UECF3ړۣ?C0+wySmQP uGAaNڡ$$$$W>v(/TQ+ h%,+HFNuZ#Z" 9˕?z+Q !3s&Mwݣ괦VEMIINCv݃Z繄Oߝ괦VŘ8YNvǮ}Hҡs\JY(i iBHDelŘqܝFF5 JB JB JB DB^vc ^wIQ?8;*8`RLAm3?v1:&L3spے.}kT"LLw zGso[;glx 7"Q_EwL9bJbs1* rжIKڄpLt!禍-4Dޟ 6;Mv6Yֿa! C Q[8~H?JV@AԠ4c>}ٛ b9,_;p|6@QwǕ Pٰ& n+CF~}.㜳_ z2(@~#Z/$?¯7}ooRxbEe+Vpe|Uz6:5ﰟ真id͡ar6/ajP~{LڮW_q*b3Ч\%krX9Iˮg^qYY2rI>7nresX±RW*CbOq4pH E|FԲY#=+>[YI Y;f#foUUdrQU̦h}12 8'&]M?v QS[7&]أ^O=s0dX=ae,VfOzKj;J0&y BkE,|f^Y}-zVeIDAT`Bx%;Lj sv,fYM-`/u+X:kAzEO#ܺ;zZ)yV";@B0.y/GtN_,`Xy_2c^k+P\,~ 0ЮO=I-=?gko|isG.O. ȯ  +uaB!HwK01{~_| G`ѩ#aI1kiJ>~cH DW!ĀlZ9[2Xtj۞s{|3-NFͥT%e;NZ\ !\^Zrȥ[jJ{S/G1!hrr9?SUE]OWaU(`GiJ3^ 2MBI^?cppsTT"@+l]Vo2(Ŏv7^&֙tey1j/JMQcB'Wn b] (ّu;}-]UWr{9 6Sx(*BNbӾ:"갢ݰƦPocu.'*F"Ŏr"(0T4W^@u-]UiWde)wָ|RM.4JR5g )纘|]k§ ^2 tnnƐ-jsɋ#3 ԎLab/91"Ʊ+%M-i0V$훳,Xmc &`9!Gg#`ɪ—1W PZXpv`06Ov#ABal{~eA[mvԚoZL>|4^"i.S1Qaݴ`}OA["Γuc0!b_N@XNm'麡Z5&i0qD3"L tL>^&*pNBQ0XZZ :t|:.(Afɒv &PQ6(~wS5 >]M*]~1aMNjd8? 1^>3`(ખ+/4Q Mm6m::%uёo7ZkJEQ}{>T9GmmBXFTtGD 6jW{R [ӤպB-3Juxd_>B4M5<6(Sn}kVn7Ml mԽGܬg5m ) B(ś'!d44[WjJPQAcMi4YP@Vxhw4j5*vLKﶬ~y]n߶v üSR^^-Ө@,5mظQ|||Fob\-) j:i m<=E(M0][BZP(ZxNFAQo^Z OFPoDmlsuG 5F``JJW;1O=006vꝿG? ykM뎂ˆ046)(jN*$$9 ZRPC63ˢIENDB`fontmatrix-0.6.0+svn20110930/help/en/images/glyphs_comparison_points_and_controls.png0000644000175000017500000004224711217643650027554 0ustar malexmalexPNG  IHDRnI}sRGB pHYs+tIME;tEXtCommentCreated with GIMPW IDATxiTչ/w5]]=WO4 brINL3ܛ<ɉω7񪹚8E$NQIhni2( t׮>TM]]jbE!(.,Jp; w; w@ w@wB_ѷM *p%޽{%I:zhZiӦ)9t:a*L+W~S$3_'"og:;9;_~eEQz{{f3Z0-KrPhժU_җ֯_~eeexeYFJKK^F'd#UYd\<8.L{ފ )B.+++nkkniip=ztڵׯxF"7oޖ-[u饗QCCî]N}mm?o|Op"(ʊ+N<9o޼7ft:$t:-,,˲,s9spDDoIwӝw^OYt뭧SQEQ$Ie9XeIXt:N NjZm?wV\?awP|7W^wQ3 ˲1 ò,/O%y@"vCOD(upܿuuݻKKKS^x<3gy4Rt^-IRt?Ȳl4Vb1L&IB{UW^O@E)~(SEEFc6N0L};Ċt*?L&ݖ(--D"{wAEeYYZZjѣ;n/5rtCDjOd2~dr\jVp.;lD"8vLJ>qFwZ dv=z;\y7.2Œ&eNrlD@e)d.yΗtNVя~t||<mݺѣn{xxt*b4 nt7)ed2|EEEee뙤R?N{;(?z/to9ϙp^dYNRlVUWWogyd2-YCb IR$ ~?f̘L eflaxx8Ϊ*Kz>Q=EP(p~^1b^`EIla]]]}jD>d2Q+@OklR-E (dR\tݰaW_.< ܋_,{g⊖|4x$Gfk+u\N^N]/zz[oQK -Xy(5k֠p/ފ [c#_2IB==T^N]GUU()t:UVVΘ1Sf>~oof&tww/\SW!On/r񆆆F;?pRP(4MFS?^SSuAz5M"d2 AzY  Rp8,b!!AB HY6Or\qܙ~lI EܴiSIIɑ#Gj$qfybboƌ?g!пR,38eYMӒ$#8JE"L&ň(_dZVnw>\SVf+++]]\bX8Ar!w.MR, <0<70$)ZǕ[,u[6n`X2(  >b2ZFy.%P8L_2C䙆eQ~J>D*8.jh4/6EVX @/8TYI/H=npG_@f$Id2JJJfh4 oluߦg%K<'J%D",.mCKxÇDaXf2tX&J>YRRR[[[ZZZd$I;^|' $l6p8fϞ7 xnw*ErnR͔d^,&)N?䓙Ln9s*NiD".]j}pG# EQ(NHEQ~$h4r'bPU"XzF[wAaAnhh(<Oj;ڪ~x!NDp8M&NQ{IY-АVE8,VZvD (ŋs\8a…NMx<FѤR)U(Z@ pW0m=$%;K.-8/L&sĉH$_A=&  ***L&SUUCgdR"Hp׮K;;]>@>ĉPopE1ƹsT@ NXrۏ?saMSVVtҦl6[Gh$8p͇p'Ξ}n&gIѴ_~^wll6dr…?<lbbbummd4R @5rN\.׊+Flj졗^l6nW^y#'CA{<6{lIǏS:M桍Ώ :;/dgt:DVwrXlѢEǍR4_qD@j.Zh4,V]D&nphzx=ѣG,X'+Ǧp&.B  ,Yd z6I2Lǎ)+4l\.V{aT/7[lYOVo}^xaIiK/'46^_~K/CZ(b8h4Ǣ@KRKK̙Kn ,[_1 c6{zzdY&na֭BqAuLUȑ+$]r%a) jZQGkjj_BCuwwY-;.YxX,?n˲;.?E"o`0477&|޼yccc>l6R)">m~^L0>&S`z̔PéTj||ϯdRuttsbH)71L[[yY8FSYY -Ku'&&x;+Wf___>۝d Pe1'#kvDA ^w\ 4PG0ukmmu݊vPU=pl.jd2 ap=wz$E\.WUUjbX,8;%?' pǍF#VPZD,`0D",5px7* tTp(Rh1 hp*(X]u)+++ 5Man eƌ mVp^<Oii)FvGfXeY60e$Ir:ޮR;2G!ad2d2iQ :52 l2>>^Ge0wJH.neYz*=䓂 B]x<Bh4'j XL&Zm k4ӑǘڕHvZM7'^ jeT'seZjjj4MVFLFףsIf@Œ[P[+V{ mb@OL^yݝ_&&ˀq!˵Zo~k׮}嗷lق&CR4{6?NG?N'O^ i+TYJӝ9s&K-0~=4^MxXY _';:zԧPil@AEGy^?~mm- DDK3fX,Rix>tH"*--3- 9k]ՌF,dmy>HvNFc!>1UWSK ͞~Q&C=D%O2N+fXk׮EK /&;i"1瞣'~kzalH߾dX 4ͩaM6">m$L= ikqسgPME1H,_z{{xsPԢ xE1? ?N#psc4 8K$D w8psd/Z症\t)nFtk:<PZKtW#LD}Ȳ q, ~L&Beh2,O&Yrpp8 A8t萈%Hp fF̈́ps.YD0OC7L[ejizz睂;>ON}=4w.%NSm-}EUYYv ;hn* yv]. UϷ4k׮]~UW]up8:;;O^7n?~8D"۲eK,X044hK<8k֬'Ol6EQɤt:D²`^il"A_uwRy9Sss{<cѨ?вexG>lgs_bE$y?O{AHәL& f٬ /aYeYbY4_/L:|DDPE|sTVQjL~B9yWkH$2gՊRޢRX,D |L'h4}>(=t;ݹsggg{]p8˲<[VlpB'7Λ7鍊n:|8 B/B;::vgDQEQFu S!sI~kמ2Hx-¹p6<O2',ˁ@`hh(Jiڒ A}^xo0t8pWd2yСիW844422hV+Z1EQt:j L撚:q"n_-S$RUUdUhWzzrXZ߾P@]reegYA?6F.j蹫hwwS(DrIs6K'NЌd2aNLSݻfs9zkGY,'$'"6T\7h]l޼[o=qD(?dzzzl6.$Ix<--- r=lݺ5H|'"EQt:*D^oSSŋOGs<`&*{@ e2ήZ5 pFCCC*ttqH$sGn؀P5 \(vuufU^u+f϶nތ@Q` pse.E ܁ɤ+))QKmo/ٗ^* Lmx >fd2g?/@E"H$T\ ,KѼyhP V__hT;vd;֐pB徾>٬fvU 1>>.˲qhh&544NZ@_l$OѨk%QEQw8^cN&n, bX6U׺튢r*4No||\u;r$I˅n;o~_}w_JzUd6uhM;%[n㸵k @DH8u-NM&& E@:t:]WWv@ûfK/466/H0w 71%K7!l6f5N].7w/h4rB# RTA0TJaȲ,Iv@ittt wu g2l pغuk.rOQ/H X`vZRπK/4<<ǿp8Ђi_*GFF-ؘ`PE@O+W{pk+++m6w!Q%IRŕɦ믿~͚5$!pFN3NhՁf$f4N`0iM(y^QIL&۫pB\l6c;իefΜ)~֯_L&ULww(XgڵtZEFD jƍD1^Ywx?}D$l pH$Եb.cFuK}REQu)LRVW;Nu;)p u`@ k̽2p깏jD"G*IR]]{YYVQ零2}dH$]&CXA֡ c [B3(~%aEwe(FEr -8wZ ͨ26X(^0t%SGի)ЌKR6E3;qzH+\tt׬ٳ5^K۶&D.IO/}Ԥ̞5KNު(eYE\]]>P@OauEN&A>au½ JFFFP@O`0ah4p w>F:z>N%`Jժ+5 ]]dYEd2p<`P]2 NE,q? K.Qט̙3sH*8. p<{UWPvww,{aeٙ3gpy^uu0 zj(J,jmmm 'ܹsEQLyy9˲Dm deYaۇ+%p :A7ǏF( j8N#Fq``M~7lذux &p/jYjAJ$e|||…V½n={t:c0YhѡCf͚U__Ń d2{j& իW_"p:ǎ[dɒ%KP@ϽTUUim<7#D"@#Nl6{ ڊ½@kdnѢEdrΜ9 'N'(]]](f2&& eΙ^7lV--_<`hh$ɌVWW)'`4튢>@ϽUWWhdۭh~ oTWsv$pW7NWVV;U͉GQLn``D"隚:%EQ&&&<qF__WQ;v튮XfvªţGfHK L[G{/~jizq$}2bYf9rDRLyd&&&p}}(JzeY6;vx 7͋MLLxum훻w;XʑӽSl6K'OR}ϱcdn`i`sZZ6lݛdz}tnܹ_j:>|VuN_`65 w{,]ˉ~jvtt0Z-T45:;- Zh>v.K}=mޜ\&C֬YiӦŋwww_oSJ\.ܼsNA[A뫨VL@ jm6۩jO?teeO-oUUU_E+hNyZèMwx<,˖͎k\xٳyYST65%%%Q<$t:xf|.¶`2X|?clM#AovnOfl.yjTfqz%Ih4'#l*G>d = I*2ͭ(qҥK4YDWE1LLLȲp8vl6G/SCybD<D"Yd2Mre2d2tbtvA"e9L|>N'VZ6bzN#wM?L_5І 󽊢ft4D"Tyl. D"JUTTw՛;w@oo/0pd2˲|UW-\Pt:%Ie9?6z`0 eYؼ\}v9ڤJEEQ?$ͦRT*_Ǎa{Zm~m;v޽[u]Sr SX,o&)?@&n۳gN+ɑgĉ`pܹ]]]tzkUTT~<95Lrx<>mJzpA^;1]!k_&~-ںX$ͣ5kΗjuuuGmw1y<|Fj>*U/K/Ç>INvEQ"oٹsg}0iMt{D |`( 44ŇL::WMwDP(t:9jp aR~;1n[ʲcV\U)2(B!z'W^y%*˜xuWG˷e~M)b)fͪ<111j?NH<_Mۿ-E Nsj:&L3kYYYcc#A|R/EQѨ Cˉ( IN6 Nsɒ%sp{(Ahhh{E1L5QK=˲>SO}ӟ~Q@Y8Nա _Px~/;vx衇P@9x66ϲ,"~rdD"|"Xljzc/"OׯY_kjj*++GGG93͓D1zWV$fPHoua!IǫEIFFFƶmTSCѨ(g_0ZYY99s,vp½؄az{{{/R^/b>y7 Ss3mmx\ܲʿIwd27L&H9bh]p:<EM$Iv۝w9|QyKkkkwK& YQsTN_i'FUU]ihZZ[F Z~sz="N_?;;;k06>>z93 :{W ͛Gk҆ tN/;|yf?pL%͘rZ3inTpAUe G?ߓDdZVkSS :`0`D=l*r@.NIDAT+0 v't:g')~!T*Et 9^wNGuutꁞ4JY:͗@E1J L&M&SK~0P&O~hZڼl]{FcctSy9'> ܧC, B~?c8}tU0( (͆@  Nuo$I@|@n. piѝOR&ZVC7=ng擟ܹs8O/\.N׳:l6Аd2FX,O Ga/g%"ŋseYVAbcYeYt:E0lmmO:}7C6m(7d2ׯܲeK8_j0x Ib^bE(;wn8t,q6::ZRR244$˲|PH`lc#GƆʲ}}F1pB"rz~ll)g(eeeT*w~i$;zpVz}{_Ow; w@ w@ w@w@w@p;p; p; w; w@ w@w@p@p; AwM 2~IBHJJJjjj|;=z駑cW\>uرcNgAAA<{U0Ib ( ݞjXJS@\|x!n6av)>';**]iÁ}ȈW_zvy7iiiVh4ӂ8klli:##cɒ/VY6tX r/$e/jU|`Z&Y qÇƿ G}4rw}wĉ텅&L;rz(FO|0L|]fʲlxD eܹǏoiiٰa^tT*|:/޽lQQw2B$IheYBHfffff^ĉ/ĉ̙"R1XtC=4wkVTt:Ծ"˲z>''p|_H4hР &\r˖- @)gs&wuuuttr-wyСCoFH d2L&eO:n)$eYJe|{oǗjtttT*7ӋH$ ENNNvv7{FUZZ:uT pE=o^x ]8D" [jժsP{Rq\:$y^ѡP(]axâ(gee}OcXsssVVnE!݇~x]wB֮]ۿt:)RTXWdJby ###j:p'+2%%EDѻ[Vc{ހp8L),,Ȉw5m4pkvͯEQK,?0CB(,,t8wӟ8s.++j,˪A bp8T*KKK- !6hHA'>I<g}- .71  '<)Tdy^C :|'Vh:;;;;; '.RTZZ"B8^tm:;;ǸqL&6EY,V_5jŊ( |2=avC&4MyDOO:uȑh4گ_?@"IR  VUU,(RezH~+dpIn„#&1c`Vgϲ#Gl6n߿?*mIK#ÇeQw̟yh4j:߿_Vb1 a++#MMD n7WR@7 0o Trdt_M#P0?WTرc Q՞RQzYfWHl| M]`2u͟_&UH$2yd$#GC2n\~2&g}v7LQQ ^{M[SsMoիW'H, M{&vQ|>3<3k֬g}ĉǏ#ܹ3g8>x`[[[eeeUUUCCN֭[_| +{/]^^S\_xӦM@/ B~ǎ'Nhkkkkk;~; !8n߾}>o߾}&NO|$+dJKK=~t*jJ255UQm6l]]])))@ ~oNffNh4)))%%щbQF?qbVVVz,& O Kl4NڧOd] ~z}YY7#>^ϗ"@Ӵf/O۸z9;|X,_wu}ŷp8\WWz|OMM1LЧQݹ;`Ȑ;ﯪZ`Ayy9 (ʬ˨ nGUV+~kMMM{޼^~y<͝;7559FÇ߱cGWWlԕJNWXXm۶fܹpk~{Jaș'<۔,))#+ޔ>kW]ȯB a{ml 6(ʛn ~T*ܟjذڇpW*9sٳGE#d# />ܷo_BO.rA8p)Ssrr5sb1Te 0 #G<} j9l6'}*}F-Zt${OS MB JKK;;;IjZOjΙ3gշ~;( 8 $I߿?reggO:uÆ ~h4<g{{{AA)SщwHޥzk˱E5o޼}%l#U*BhllkK׭[/s=b?YQD e;iҤxFK˕c`ۅB4${ (LÇ777اj 8狊PV?VPDl`8,X`߾}qj2EEEZrСO<wH*p`0`B&aeeebJI@Pbo.;\d(Fђ"LIMM H%aY&;#GBdr`Y61ۦP(DQL؉#@'u n<33J!ܡL`B5ORuvvaKp̌o I&%%e٧zr'TgIq1ޞVk:jD4M~?O{m7bw{BDa(oR2͢(JE~[o>@!{͛ɨQzdLGuOͻG{o_BhHI;BU*p2eʈ#q ֋\pDC!O~" G; vլ^ݪՎߺn򳟡6i^yjL-[322~_öm$- ܳS2z;ϟK.iovH|_OMCb| HBH4t\jlƪ\{QVF:4:;cwܑ~%S5S>K.3f 'H. N>+=NPB!NB>dLr9s[M ?Ȳe!CСdZrhDF$ȑ# JpM n%*'<yiR]Mnl=?S%^/1֒|)ʜZ(Z}j~~nGa N=yy6]Ǐ'̌Zt̂~%Tʼn<(D"K/E%L`Ғo?#UwY__ΈNK;T=B@ ;Fpz= ۼT1r.=po6v;Fp6RN仄(i:`pP(N﬛-dY<++ p3oM;˲ ]]]/;i;o!0&IբpFhvML "p}2vls;WP"{0d=(c q:D6m _}TvSSO׭X9T ;"+T$K̑{,;rH[[: ?f$cEQJfX>RB1|pl 8(I8ZTR#dX!5ܺs㍞yeF ߓ#R0is'f ᇍ;D:thjj*: gĉfsrDQΝ;13(ΟB0`wawHpawHponnawH*EiZlpd wAP;$[G"lpdgu@@R8p`D p*++rGb;ysssQ;$Ǐc;$2-"kG雚0r;s̞M,H}V7dȀ+V LmM͜eJ-".w_|1==;8/ڵ0 y $m'ر;3g*;F'HNپgYD"k׮x FF)((عsUW]f͚9sXo\bĉf͚cΜ91cN8p8AYYY7n͛'OgM>?; Äa?g+us199ιsYE3g6hew޹sԨG%MMdnD =!?cǎ B---FX,G,cYeP(h(?/)JE !?OW,[Wv-!D9pc_~ɛWgƍ-R*`p޼?Tj%ϗ zr@۶$>"᎞a֮];~o,"0h4Bp8D$IiJѣy)+3VTDmxd-]ǔF HSUWurKDOtLF&M"˖!R Ybh4% IDATxbxd4T*JJ:>'.ϧ?a߾λ Luia9lQQb6R{dޯ~t)I"%%dHA'`0=O0$rJOsT7w<8mDJ"~H4 >2 T* ZlBeenbBCb! %IR(JR՚L&r²q:~_P( JeX poݏ>zFnrB!JhRSS/%P@ù뮻f̘zѣGϝ;;' 3aJjP:;$(Ǯ]srr$I nt T*u:wB 8=:X,t:EQTTFk (nٲe_~_ommTTAh~߾}W_ ,j4ݎkw+WΜ9󪫮"D"6z= ?,ˮYf޼y&߯hRRR>aÆ1c̞=D"NUp+wysw׫v;*w.,,,,,u\:K.o.KNZI@04Moٲ%33STb]@˞$I6m"dggL&_ ? D7ɔmZ_>^zf t>}X,$;`.ON|O,t3ٌUWpX** RRRp-'_|Aoozu=+..mN](vZ,K.% epΜ3K˺u%T/2Q_|ʼn?(2|x~'9޶b!uV|J$?KZkyKK֭[V+EQXv6),rP(t7ُ<"u~˽J`ܹ%SVf{]"m? {7Ƭ,J 6ĪUV^mۛ-ZiXb!DV4әW___PPP__t:M&˲Rvh{T~QSkkWPwu^wܫuL4qFa~^ {ҊF@ %%p"pfs4EeYA8$yϧhnbT*]]]J8J$IZ([Zʒ{, ڴVDQID' n۶Lg^$YlY0,(X' ^j5JRTj:Z?g8y'ٿ,\H ))/Mƌa|0M_nooy)L R '}iii6MRXbJ`0FѨt:ݹ\Wd8ߐ#^;w ?WTps;½D0/RRRz排$bX,t`RRRfs};O9O s=dժU&LHKKX,IvOO>~taX8d2`?z{`Yv͚5SN=tP2U#W>=9<[ּ<͆@@'5kL0aڴi4 j:iBy> Ine8.%%%77n#ɆM6M6Mk4VLСCK,O_xRxjuaaajj*2វ9R\\<~xQq#FHI}p~͙3'###$577wf3A$)4z;s ,T߾}3+++M&Mu+VUտGȞO>1}|@mwiZփ\Zڗ^[d@jN}ѷh4J'Nv5i!BMMlJoEcsWss3Mrȑ#lyO_]h8d|t.½bMMMr_)nݺѣG_r%gV{oРR Lq\]]СC/dڽ7FNhoEQdYvĈHv;[]]Fzcǎ\qa;[0tݮ}͚5Ao$̹^/ ,'?] ; Br>p@^^^aaa4-//`@wzy%˧O/4 LG|p8j`ꫯ>+VE1j4,t%W{{ZQVdz뭷t:nD"%%%8v YEbȨ bʕ_}Մ Xj? /.ewjΙ3'~RQQ aZ\477w`0_h0trl $%;|.~S8D? I& $IbXpGK7onnn>.BR) p8--M;=;SGtR$˲V{o_.^x„ _}U| xdtW71 c0L8?… -B BEj$0yyyS^71Yf]{tEIxlS܁Blz;0V[ &NhZ !(~;˲ p[v!B!m1'`GL>=+i e `kǎ~m½_b$I,fdd+𿊋u:pXFh"Z;ܹ86MMM:.n%$In_(ETAyMOj~af3#w/Zp8,pY`AFFF$IMME?`rbp8Rr-(OFe7^PPT*y7G;tuuQ%ۗkahqw'ƧeqQ9;|t1+**BbA' ;F*J#wJ%ӣE~a]UnڴaL ;L>]R1'OR_ۻ{eY#w;||V+m  ߖ~566T]>KɎeZ~~L zWt195ڵD& m￟׿2JI^9y`ٌLG^zIx%ee;J"?wǎmE9,K/|6xI8Lz )cȑ˗ Os3$0aB0UTƍEãJ*ikZaZE{~2l߯dwޑKû-%hР5k޽.G x^-HGQ^/p7PbpMfdKTRRHOOWVU^hѢ#FPT])/. 7?"Tl6755ɨw_jredd7BcQ B<ϛL&nj}>L일^/d~az\ST*13##mmmJZ݄K8N,D"ϧQ @_@cǎX,Yx^! ---[vm|Bl6wښ(BՅMp9NRXx… ѨZVTwN؈>MpJ2/B VSS;OkZapZ["$v@_pUUU j4tk$I' 4!+JKK/2BHJJLˎ3 ]]]H+1(½';?Z``Y6Wꖖ~sMKK$Ijy aZdff2 #FӉ} ˲ px޼ySLٶmjq|(JRa=֪ueees=?½Gj,(&tnh8p`EEҥKǍ½eeetAo}e=ZĉD I҉'z}MMMiiu{ {ny^v33,˾=ЁN<D\.zkmm:p 4eET*m6[|71h4寿z$q8&\\PbٳfT*-PsqI٭s΂TE544zQp1Ju։' gAEQv9Əm6҂/'O2 d{P(pX(jҤI7nǎòQ[[[\\lP @',ms$I[lIII)))A5.{<+2\.r5D"6{N8aZ1Dg6M&q}-))YjqɡCn0w.9qTT.4/[vu0|.I3aXh̙C 2r$IO'V](Dv"k~pgNT`Zu:]HQԭ__t7*v:aÆ)ag`]F &gG|*%%$;`$m޼&; ܓu:?|5o4LYYYwfyu޽N 0G4L{Ųn]dHfh\'4ˢp9z>==}۶m@ +ÑHǏAE={D"V{+I6?ɓ[l QV\ X *nϘA$ r$5}7Aùꪫ6mt:KJJT*Uܶ_V&h4{$].ݻNfcYVR 2B"ϼyΕ+-H빬X^^={L^|1!jE2k?ԐK.!g8R Q}Æ W\q CMqk׮Nj 8ӧONNNO|H$ho^ZZ*jX,ݪU>L JK]-۷oE׺Fɔw\˖]ӛ6?WZmff&2d9FʹjO;v,%%%"OR?>ؿ? .liiiiiKOOO3I:;;t6ojjjjjZrJp8\QQ?,ZthFS~ iNh;`PNӴ鼸2bL^v5”ULOOt6-)Oljj fy<uuu)))Iyooo1v{ǎ[`˫.TI4ݺu Zm$&&gܓ/_f"˵/\-;$azU )q?v:.ZeZ3ԁ@ )oCߵkW(4h%\BӴVtp(^OӲ Bh4 8(33/..;0]]]W_}u|+:g`H{5M}}䒄Idz``u-̹_^aa!M˛uq7cƌ{t˲h8p8l6FI@ rAPߜ8N믏%߿ߞ؃$pfS{bYrnlIyqG2t:ÑhLx:%IRT.eKKK(:w{O;wncc֭[=>3{,kooonn(*%%bL&pFNx}b`0^o(R(Jd2]MAhmm-**ꗰNDtvvرcrss{=NV;*(((yJeq0SIDAT6-`h4j$F H4JC~p ,2 0|)JBDXͻEQzZ6)/=isѣ%6~_ZUV4-0`P$QA$Iz^V4MӴB(JT~{{?=[կ"_|! Dp8tA METWG=zw7s̹p5}6ٳ?#ۧO^^СC~7|ݯ_?0Lzzɓ'/5k\{)SQF>|8~ ˲v](/G ؾ}UoY{ft޽SLٴi?3fر_~.KZ,۷766ԩ֭X7tLWAՋ7ߜ1ujkq-\8W=/^駟7^8w!}͋eg7?9;aŋ_~=_X,Dzl~~w~.G"AzMI:->?W7ݛw=D( ?SSG qE! ~g999FooC#1-# eјYWm-->׏U9[i3/Z%!C > p!},^X?rCtT7$K.Ew t/L\$wA|T!Je;v >/##w}eܓˮ]_T p^w\<ϣ0Ɋyכ߯_?=3 !:nƌ555>!(|Ҽaذa9rG%K3bû1  rssq)`ޫt;3 utt 9$)=СC&{og6GUU0f /,¤?40r0p@AhNOOxiPĉP(r ^ҥKcؤI͛ł 2jiP( t:h(n8}{>oył~9Cf?aܴIsMdҧO̹YVՍ; ! "//K/۷ n; b]_}%Ο~(/`nׇbMCҏM?7ԕ)eK{aW=3`t<[\۰H >yބ׭VW$)0l}ﱱ,KӴD"q嶶K.uuu-FXO0e+;%}vJ/.?6KO.GaYx6LݫpCP . H\}PoN ܝ[OZsdzi/[nw8Bt:]QEEZ4u]7 `0ғ'O>}z]]]Bʎe$*48+.ojp4Y%iѲk0a?]]~CZ`f:5`+#27(X*BRgkU8ӈ;DQQQQQQUUatznn.J($I֯K{zZ][Uy-BP(|>_*<|޽{~?{t;^Q-/>R5~iɀȊ%ѩf9!$OПyXӊj/cbc|Ϧn2L&)>Lʲ,˲*\?}CCB,ӓD^tOٶ8mۖey< `0\vIzzz<{ 6|G[~pҒ%Xrϵt5˱4cǓqk(|b8ɲ_h 9S sXȑ#Ǐ߳gϡCȲBs\.4Mu]ץ\.W,/NU̙;gV~{?8X;ض8}}}'Nhnn>vX P~TRGMԕpX%mic_ 07m;;)y3ach)XRy˦ &&&֭[wtvv !檪]u۷?~۶m/^ܸq;w볳%%%o޴i`4kkkqFccc<쳱X,3g~d2eBx<200e˖+Wl޼cddI;wvww:u'w.4FGGoݺ 5Mxi>/|j&qݺBst]_u8^p@Jdr~?|\.z(mڵk||͛>ߕH$.\cǎҗkFFĆ UԈ}$Eסٳgq ) طOlNG+qwqwq  ĝM@@;;;wqwqwq  @@@;;qwqwqw  8{0 CvٝHʫw2Lqwq s-IENDB`fontmatrix-0.6.0+svn20110930/help/en/images/close_to_system_tray_warning.png0000644000175000017500000003231711216441647025650 0ustar malexmalexPNG  IHDR/sBIT|dtEXtSoftwaregnome-screenshot> IDATxwgf^;8z"4X(h$h챡X%D%~c EEJQD"H983W\|?,{>{?gqL8~B!ZO|gU|/rJB!P4O?+}qc0y͞8!B4cq;~w~ G [0yB!DKJa׮S(bGRXVFrr>\*B!"mc&7o`wrIy=y!qT< ޯ\^^W|Vt +pkt~X7q[P/KaAIŤ)EעJ-IJIdwRwB!ϑV q!_*T,Wx ZW~ NDkm$&j,=xVl۽t qH TPD={XPHB0v4AS1#B!όכ@aaAk]_(건rpW(HII!??/y. ~ bС :3pN:6˞Iӳl 2m>/m !h Zk>GkC@ @Q(P PJEtf-`0Xa xO߿?qo{eqDÌ&蹅[.Xf}a&|IWyI[vy}edSV\FX% '58RS|,: ұw.b<3| \xh4~)tr\Jk]c=Pc^KПr/>p˅әs'_idX|:YyIu_q؋YP)$$y1YێOFZoclx!׎$IBL!!&Zc9.QҊ˗sƙᢋ.ݺ*멼}Φt2 `ڵ?~7}$}-5toY&ucyyl"Xtszaك9|efUV9xA[xza|ͭ$׸k\n9|VHxI?!9Ne*Um;w %KHN1b(."<|2/2n @s,7`_J*xꩧ޽;Z8yX2Uz=THdn^\2ݫ9ic1؅}pUYG;7sQr\Y X7J+{GDʗuXYL%vcՍcϳ+/|XN4Mff|1V?-ǐ\ۂݳo1Cb14 O;'V)ֲ0Ne*yCh vOsxR/Jx=^,kXq@8GҲJ 0زe ibk͞>_ցuz9m7_Þةv=Hq8} |6Nzl}ր χ\R ?s|p8#BFĪuտo$$$0)Џ|ϔ)Wz8zkⳈDJ9 }97ϑÆqYs]š*ő:{VI)6o$+VpG8v,`vqʛjUiP…,SJ Gc$w$`;aTX@`lc=,RvCrߕLH[7L?Qz +Cb iVifyu#2:N?-Q]!fu{֕R_}Cjj}~h~Z;&:`uӕWOR '֛nbɒ%8 Jqi{R&c; (9E/gE`w~?@=2u] ”$ībH#n:[? W\{Uu.!c;^hr%}Yw?svȮ8[:묱;Zc(/'^)"owRPأu*Ue~j9pOy@V?'s-AÍ;:W/<˹4r^oǝsE/Kޖ|ˍtaOc]wU$xtQ;.fNiⲌZQ=؄+#~z ڱDlNۊSn:"rc!vІeH:!8ضCi,Ɩ}m V~ Ӕvw7=[M8~..iH2RJJI*- GXڱ>Ee!23؅B' 9^)\ u64Mv$;%o0HRIl}F;2| _BVת+-v㖪5{|OP06ʐcuB!Dpc{_<̾+NS}**nʻ!?_9{46)! gB!AŗcAB6B!q]!h4`EB6Bk !mE.'مB6BK9!͐sB!D!BD: !m؅BDjB!DM!m[ISP*¶eBWo5^!h۴ִh|Xaaj]!L tiA BqAVr &͟o:Wb=rLjB>5VnX瑲mZR֍˿Ǧ;_B 5X-ynw18[4$vn SaTAqY~V`ø>{ق'{ LeO3:6erSӲ*E}غ"}at/HW3l#OVey8[JRqZcVUG2X^gSwݵsD& VykVTDմOm(M3v]^3f@Ea]270T))RsDvMe; 6vӿk:EV8ot+kwgp,Jae#^H@=,ڴ7ǵ*_"P+coG2g%聨tƍPcincå 2"q2Fe*;Qyh"y3v]X@!]!?GeQ :"ݷc[X]'^>F2OopX<ӏe(8ak~\J|uw:TRv-j+**WjuM:jާYDZ#'e?&0$Np3prW^\:ԟU}ximܐc|yih#bpm(j쁖M-OMk]Uӟh[8n0~p7XO8{G9lGcOK9l˵l|ԋ2Iiנ]8sT&gJh]v*T\l廱vw2,:RyϮv^"r@}{ԐJ1+^zOX> n0Y^w Сt57|󇁉is,U.sPԑ*_״W>M}Y{$a*n]oۖLѾDfXיS'a(wތc_7XGk|(|R5|kӐMMA]Mk]~ߧ njAYw+4q{2 v30T4 #:WV* n hʂ [#ϛɸN%,"pVL8޼,^GXnih՛؎,YGDٻz%퇓pi/rw㼩S۶&I_?.^Dvಪˁ-QiIeQa/]DpЉH8Je9l{9^uy}˹Rܴ7KXavXž,>m0 {z:϶!|=FrI-yرq"}|y!{-y˧؊"lp-lhZ74iCYQa_CL%A mʰ TL9}3y=zZ-ZKC˹"oΜܓGk<=ÒWd/>=s{:qژ$fLy5[Xw1w3|]`` %xz@J/MIT4i־?"~>к^!=VkLgSECV. Ik&8CTScbn,5`j AY{ypIC-6׽=J-RR|ewZ6> i}<1jߜ=_S4#L.ۥ=;ru*n@GlZ^GeX²L0]2=hڌM!k;āVo-Dima8;]2|ѻY&pYњ2qV20ƥ$zmfT*»70XR2˿W^ιTx\kkMow7(VDL<ğj:(d b5`2erHM4g(ED:g&c֭.2qL\A0d_g`e!bӎGz]Ld8m2gL>:VTҡl 4lO6% B i<Y.t/c>&ө֚HWk{kLh FsݶuPPT&cE{Cbch6.eY>< Wf12Hp[x3oyf@&q:gt:mj@%=)廗^կ 71i 'li 5F| %Ѥ 5o͑֘֘&43}=M1@כKܧ=ሃiFkίγmvӷG;R|nle)1}=%<'+*aG%e`g{K^I@8K{I;#%m&DY4w̓O>1^v᷼2|m.,D@sU_)7 :o`.:Y4=5b,|oȡ.Ƅe| 6.`l,s`Xr/}dˮ^yiCv3j $^:,B[0/I=f+yalBu__y]3z<ޗlOԔ^IW~ŝBqcȬ.nYy||q;~,YMGC^whxNJ# }2gw/߁eUIDAT7M?||Jp̕ y$iit/ǩrs9t#L`G tĩE3Hbq'0KvϿE g'e*OSvb-12Ոݧ7 ^#:ZCutx`cĺ66֘ ~؞OFvI͞rw@$i2hGW7M%1Syp ܶd2w_7 Չ3Nerf}Aaes))11t¢z>j)ZyiVNo2m.]BXYm+P Yu};YkQ}>xog"}gz,̩0٨]-!yn,ºh*w ALg ivEa欲uMۋLl!b;ضM؎ G"BBa˅etlHwӛ5ݕx1*Ͼ&7KY&w2J'S4g#9$ld\D8edo+4p-5ޘks>gO"_'?R _?|;Np7d%h w_FħD}Z~ҡl|u~}%׏oHn`> Rnڛ%0;W,aO(t DT͟VGub$9B9~~\XˁUCT}P_\{T[QqZ7])8\N9T,e*v70T; e'kJ18W _0sٯXǙFOL$jJeeg_rݬVκb8 9e;.00dzx¨+S ?rɸ1u~ :+ a$@o_tsSywQ N6&oe^@q|-eWϼִ_\}8ґm.3݋8.w;on@nY[Զ gNɣO5tzaɫʨ p)~7u'QSӼM]ytwSYM"6z^]V8-֨ߛZo=:{ra0 0 sUvKo/nWl@;>GCTK-jNz$ H}-ѯ[:)$\$Ml Jnk)L7 a׷L-CbC/ˡZ*/m E4X-5FI/k1/]ٲ'O)IrcҊ7&)S0R,h <{HwήXK-T޽s^ox{.FЗĻq4;~b$ ͞^!|Zj#Be8eCr C٭;Yzy)BBr}Oa׏(ۋ22PF`D!dN>R(BZZr}9h){b :s6qm];tk !:i,z.E){M{գ4oBBC: y3O5Q7Z8y{1])B!!F떻-TAjfO;jm52+Y\)BT::\8eŚg"꺅aYD{ Jain#Bit8ћ؎{Vgy͔1< Bkv4c  KII 3:e~ 0 L0JB!ϒ)88CĶql;{t[}rBKy+߿HkEnĴD$+ťXUM4LL B!~f`5~ =bۉ=|("tF҅عDhShAklj?z Ilؒ?ٸ5˰3rf|'6v=o*B!D[7ʕBhSY}i41M˲x<ٝ$!0b\.\. ۍ o&iD;ISB))M(Qc`&ic&.o8WT9s40aVz^B!~RM?f4ZcvcM}MmBA a. !5YxRXV!k솁'BDܭ~i弸Bq`45B!h %]!h iB!C: !mRRcB!K*B!SO[C-CR`:Բ3rPĿJJ9!M1Qٺ~h qJkOlD5<' 5_dm\F6ѽs:'B6$ݼfMSPRcBq(+* 2kzvgr~kk_l6BCU~qQ\.!@؎>J8ӲmRcBDt>"Br~xlYrB&,a|^=&[ <2 :ePQT zӳ*isY ~Sz{1'29Ly~9C}C;;8u4ƤY_ S2BCSb_ѭk7A$`6(( 6mE )I^!0n3N eAGWh¶H;p\.aOp`wJe?> sZWWdr7!M)a[5؎&d;ˀDV>B;tL$?bkTi :|BV6 d;xJBG}WN_madu"`D1Ճes)<.ץH [TƲ5ݷc4Vܒvx@valFĠܲo1o1tԎXI9!MC;84e^/G cnJ׮])٬ݵS) Ed`Fޡz𲳔TمB42&cϢKDClږä#3!Ҽ. 1EziTOJcԹCxvp=<~S1#IUz2Zqs3xv#\5ȇy<1!h}PκMg S6Lvhw0 0PJT͵aW1{(ow_0ˎ𡴃֚Z;#􏽹jyN!DcimD"0Dœ<=$PZ!P 2L evp\Xa ^zN&^Y=H 'Eyv8k\) !hZ7]vl"0Hp8Ҝ0J;0M6-U1MZKά6y3R.;u!Nk%2, e IDATxw`TU3L*$ER)+( H,((k\ED ,Ҥ(*!!BOz̤1$BBI&39S⺾to !֮ߤ}XOrLB!jpUZC^א\׷~5UyBT]{ ߮sNp5":wfxB!+84'zNAE)n_t];wjf%GbpO8N'ɰP2́Vy!]DB׵ \zB [dׯx- IpL* Yd DxiXLFBQ5tEip5y?*(VS(]BmpnHoBhh(ϟZkzfsm_vש4҈PUB4pF2hv /dk:V`EBT:9 y?ECgş݅EQsv͎Q( ;vcǎ0s&cg\q8T'kISggBy| ծeB9\<=p n`y顿B\Lut3&-((ł X-Eq  'PV?Ξ=j-tVZ̳#9kc4}JxwR¶Q{Gd`/+_I O;reǻC]!yThV9Zmt1c1vX́蚎lf̘1}yu gp7$b s6ڵnG}nn_$( Cp΅ܼF:=*|EB70{RC 5cuC+b+_s>>=>aS (klz_yr$~ t(SKb]za~u^[N^JP3?S [/Ah+olޝ>川'i[].*MoGrrZ=>ےPQm8N箎du~֭ӥk73@m۶Qku"C[KC[(}{`4iBs0'q7&d,EYx(g=o KHC%4:sq9Fܨ?uD\s?>OO=- ut=sym|oNf@똼Hϱ11)GWq5Աz>xg;:ui8tǼ^>?G%`utL-l)ޔBE4y[{v'Vݍf;=gCf؍~=n'lZhx!yTYf,lsEQ1ٺeyCa>3Oۡ6-\B?k@rQ N]sdпw|׷|^N'/'_|vs\5%\m?ik:?C@ij`nɭC,h g,4V Z?I`]/*1[rQ_IRn6=@nAG7d.ʙe+zuR[Qn(@Ts"4;c1(\!h~Ͷ􂯱߻ b)jݒj݊)S&a6+7:xֱ0D<evKDDcil,+aa%=wٜ1Zq>@=K-K:'34FgFub8pS ԍ7cf &n}O0%.@c?;GQhNGgs%wG6\zI+;nfѢO_H>KlHqRxuGϝwN 0*' 0 nE߾F85$ =tfHx:~6R8o/.z/zN'Av6*j<|1n݊EQ`ُ?`8B^2HdĨE;9 Y~V> dnI3[~r!.M?oOӒ LE6c< `97;:D8oKH75C8 ;v @s`;dhKDsj@ٶmWP5k6zfJ*G:SȞ7u!. 0+ NkH\}ߟcG9xX &~;'8td'y_{\t\ϰo|h;ƴv0Ok@NX;o` -!j )xzzU\.VmqlWK}۴Aӈ%2;l,ּFI~R0I4hUkح4L&ԲٟkU=DZb0b4`NN-o`dT)G~É~ѝW*  ,\<Ž)犯tt:qz  F %[ՅөLϻ; «\wrb#]0BZH4OA³ `w5(up7 6QcC-:eC`*u)B!Ũ*~.BhP!~AvD!t@BMץG"L!.B!A&ۅBL !(lBQ#BQ>#BQB%_<$y ȼI}tRT'a;=9ArLߴ,?w7q'w2^CZCƤmQ)ZR??s&0{z/X93qTq%ѱɊֱ)ҳ4:ƣ!_8 Uv㹗\ad-K4ph9l \> l&hsCdqC~]\!-ү.y".ѸFN/B}p_W2س91B˿2N;#1]gR"lz}EBKClLo_₫$FWkz!Za6 OK6e㓅[)e/Ÿl42_̱=:@4g6Zsno=n)Ռ["E# +e9{3]O̶? '֬</>ٙ:ٍ!~_ږt r> ۑSֱ`*8zF(dĩzliַkot;'}Ţvr.xxdm鐱Q=Y~Fr>ZӝDvQ1mwsGi59ҕu FƮ!緙9LٱH)KOi~b3?Gki=n+R Dqe\NtHW-1]BfmΕ@ AxZ6ܯ@ܐw| d¹zңo,=oȉ$rpIfsӘg wЖԨaE!.S:uZ=Obr8Bpmt+d'Ν% l8M>S=21t˘ 8ۂ''?H%zuptq ɣ''fX%.nv3g龌>t ]&Ȉ0Cތ[+xhHbr~b Ut L剞yuul8$f>;9լ;"p2{gۛ?!9 /t,}?@P@Šd\랢O$B\j:N[N.9GaR 4]N$Q nj9vhYGXw%Z.%GrsIs>$Y"`90n|;M jD1S/@K_,4~f܄F$.%AeX-֓@jD1l,=JVEy r u8pnz `}x:䦲x=[fIY/NGzӯYzs3:T7W¹kigfF}u-XFT8g|1!43-ya./}WފH*@!QK"G 1P%Brb3Ԗ< k~5!˷p92]C05wN0P ӃDpGk ưzF@'F; gt&&!T#z߆4HohpW2Q63(T #I+w:K_- l,`9k ߚ>nMp7ҾFuRB_ w<+y̼+n urџ9:7{-B(!][ zkva-/>IxVU\؛ܐ Uvj'||HrCǎ>mm:SאVR7'{Hw(h8vg{_N+YNf;өu1vKKgaA]\y6=wb#m ye)P-[ :swY q6nE]ϧpzv:'G ފjzy/K{)|,W\MLE&?hXNOs導UdH]wz>ɀRG! c;$3lN" #טC 5oCw34k߁޾iQh7)W ? m'yNh Wvhny{=MeXĐ6 w@ {b\e<," %j>/==r 77 Dx?,~U|>yLu.W^RE!8ʚ7xDn}d"W tXȌҼ}#ޡNqoe^u/Xעe|vK_d0b;E./s9C̈́OڑqSE{Y^8>iPlFQtvm/Re?Ͼ~^- ~ߋ҈!.GDiI*[s[Ew !D_Q:jfLK]!D,+_*2%oHBOz$B!Iz$B!#B!'!>2##rJ#ZXoџ;wy!kM (+6(Oiy>PƳdBrv!gq=9?U I@zԉ!Q#vs_%c-Q/:{aD4᭬)}YѲp`lGll 3u}AtjKƝk,Z:?B&4˸/I@8β{3V!c!BCiPtr2[ncŷæ-?~ә'T+ت1OcqH'gqwp ݂Rtsj<= .rW8&yWJZqoyF҄@b?[ʡostyGl3߳yyƬ=L?b9+}/?Q8*BQ3t:9s~́͵ph2;~g4w[S_-P 9)Xbv/8F mG@Q>=ɈMTir".Hv $y?ޙmϨ[ @zl#s>i'$gat[1fHKkr$BZ1޼}43!i2Ijq6[RG!(kiy= RջӦ=u]ljilܴ.ͫhqRMb!yf,-nI)DxgNAU <x+wRG@t&;cߺղw6cGH,y[\o1Dq?Cї -luf3q})[G!(Ap]}eO9w<6nq<{q _ﭙ I`dyIƦ[IRA"qs3,[Ms|ç$yѲit@dd6Ff@rn"*Ҍk*=7I"K߿q75kٗhsQ!JC4ƤAZd4iN BxzIth$5(e+'c<%UHFl6@& S$XF,ƪiBu4WE9Y8~"C O<i?) m9{xkX9b45vh؏'KQ!JCu4]CTtڴnE@@&0آ9VY|`iFF~>&Ʒ?qX2΍ccƌ- x#=O-Wέק+BRU|u]w1E%ݐX(  *dt>^ʑ4*xBOFw[G0vlJ|;jTZ0gHΈlx-Q`PWՄGأL[V晖tr~s')wmI1dHąCNˏgmm U]'pbϿ f/y|&KY 4_,޾?u!>(uzn9N@B #{|'[B+JdwǯDԊVtN_-,xz13+ 鼏T"N% VZl֎{I5=FѼఖw-G "!UBKuIe[ + +)l :#ER(*l|`bc>n}6 QޛkI5*,Zɮ`W՛f=6 1TB דV:>)Jsq(k9F"T}s_ch{gd8B!UrTz߅ʹ[nnhM\\9ZHHUd{m ;y0ӏEۼֹ(*!DZle"vNd5s'!UBthVlR V (*߯/gVVp`рSyVFEk5 BT,#_IHRE~+lUIH\VB!@EIBKD!*#B'Bz$:J¤b&kkI !j@0^ۂ$LJQ[)Je\[<$LJQ(Tvo 0)!DmW9=Zl%aRBZ#ֶ`+ B,:^ 5J¤VE m`+ B/(]\҇HU9I6`QcI !.# HI0)!D;I2# !(iHB4$B!E!"V^InL^/g5uŒg0p~S_/!*Gr[:w֟:(#giUp-+s"oȻO>S{xa*^LUbUH)%7cT2^m|L-Wx 7%׿K"s/P/?Q8*^BQFy(ZIS܋e۔TJCRm|L-WiHRӎi.&/بz !DYBPP+c^U];VI5 0uQL\߾$*z !Di(TZjIڙSL&C %,, ٌ9LzXڴjjPG6$-gTy5kٗhsK!*!Qz\ I3#)WwubѐT̢yyNpB?/Zͣ%[m5[ LKljxwЀ+oU.:+j"C [ h Rc>a?Xڡa?X9WK!( b2A\H#؝O`p*16 GwjwJW~ VBQӭ\ )fFS;6;V݆fٙ)jd!# BrD!DHC"\!BQ.Ґ!(iHB[yuwv "}|z^8BT4 vKlҁYUQ͘mhllseU5B2`+o箎VY3oKfٺZ^S!KW\t>vzZW*(>iڬ3w^U F\b0۫ `{}mxR뒽56zeQS>+xHlJ\Ql;0sZk>O\Ξ&ncb DDrǤ!(J2r2L&L 0>לNlv6͎n`+!UO!" BrD!DHC"\!BQ.Ґ!( KM !Wlނ$lJ!`+o.MHؔB V[IؔBlU`+ B@l哄M !j ; BBlU6%lUj6%^IB\&$J!D$ BrD!DHC"\!BQ.Ґ!(iHB[y% .kcxkGE+W Blނ<BQ$تVҧ7bЪYJ8Wo̘odۺi۟J*TRR!*H5w+D`++@j'@*`l5{)GӨA [VKl5nFN[#رq*VWƟV,l5VD_cVm#M8 ǩhPPDqd`/ ;0kTZ0gHΈ BQA*![ɤʃcSWVk3YӋ,T"Nhmv.::YB0wȯnKf=z,}Et !DHBN>tsrC$wuY:%A`bgp Me׋9-˟,!"l73-M"bLV9KGo+ЪySvj: b,"Uʆ|]+Ъt7׻(K0*V%6$> : \j ~⣉n7~,W>izҖQ!DT좍HJ*<5WG2,o= ycbEW^ Gg !(V͑ tSQ\SPl?/~}R-yDK/GJS휱f%5j@m ZEA<,|̄[w\c4.+og a/ǖNo)=Ț# _?#0h|e!DE,m_>hTV'89:K׹q,5װWo̘odۺi۟JR*T2B?Rѭ<9IR̉<~ǬF\f}l Aӓt8qQ4C;0g)*8dz+~wK.`+,M;kуRѽ%U@Q=Q_o9k_ 9ky[cJz!N|FSF QScٰmv|n[vcOOԌ균B>O4C[y_{%3#%2kX`%Be7T\^. Ie[)mS*Bq)(n@}D_K48*=!TEUAQTU1 CU]%UT˨G"/y {hK-37j B\&URTݰY0^DUTjwCB** jЖRȖ -5B^* Q*"JŏpSX6&^/<nhAѴUvfVJ$QTE5_U y7&-TEu7@GR`a#/O)J~>ql~_g _d~"~$KQjKuϏ FTT=!P(?jVơRU"ޮ%kQVN[1hbȄ.1Eh~Cj&<TWXl6gw;cn܉o'>Q;qׂ˲->B7p}AtjK~C9i2Œ!g#G@UW +pMJײIJwB?) {r,VDlv;G&$x[p/c\1O7~8vfYUm}V?zG\WpU <)*(~g[_UEE))ʟ<džYBw=[~;ogD# m{K!,R/ݺuaO;ٴy3od4Ҵiݺv&*ny A1ds8^ڀ*ϧg߇2=|hTe o3tv5>g.K ިyWeCJQ\ٱ=q15F cE7`p%\*U:GR)J*Va\['L!D٬lvlEEiw"3}[vvDQkqBш̐h2PxAR[BKĿ?QN~7$k2s]=B$Bz$~J!D5UnHϋ&1~L~`:[/yKr(:jOM) w;g7^弿{~<j~zSGNöEk4WHv & 7=\nuk?U_EnJP,S>j_Z:SKO00k)_Y7p|trvV=jk*;&3FkVS[z® (b1Vˎ QI|EYyv=ɽj!!$Ȥ0ࢍ2/_ _⳰dmUx 8D`5'L" @S?YaJS|=PO0+kIӧhxqfFpOm|~0+sCf>Eh a-7coU1qTi\[aN-[5T}8:Q$=|3ˏpZʶm߫6^7lnKGAr?zvzꐚ"_=cX =ZI~\{&Z$oFJCO\V6G'.IsOno{+߼o`*k*\xEA!$ޛɋ?og7y:h"՗BP!\U!{[;ǢSߦ ݸ{`ݦZKpј.ބL oɚp 7`ȡ0% ws3w"7M8;SOAI ,nw:pN4B'g33:;nv9(޵Y3;7G/4{KqhvP6H%[;m)VWP^ơbA11zGvQz1K İj6-9S v6nބ5~01uw*׹QަR,+š9)-NqCLS 4LıܓAﯸEKS)mٷ۹Om|_}L50;}T9MS=>8|`.eg\al׃I f8*aN yt}DFMJ!›r SnBά ##A~_;[֬>g);N7l<1fSTn51=w>#=z"Asdv^mlC~cNͫ/fBIzJ1VfOGLt0cc yOczh4 ϯ04BD,kcX _gHv-av>GM%^MgFA~{1:KIKMV,} ysݓ=^~ʅgbΌ&62c^͞Bl\M/ZlܺpWj?-c-܅c&1!cͽ{6y!)/dswGRL]Rޖ}D:&yw︉^Зz7˼'gKZ gIH ܳixzinY:d2/ 3ִ3*d, >4mt!i )WSgF m/fIDz7J(^Zt0;=Zn}&{~G"#O``?ŋKsᓏ<+γ!#B"hT4BrF"iRHK.m !XJ{ϜfqehxH)$BMg4h2m(-20{/#.h̖pR{}~^9Szh2;'A^K!Bh] li>R)1("{/Dⅴ&}Ӹb5(%B"'RHBD BH!B)$B!|"D!O!!>B"'zoi!hB;!-,\BhV@>1΀IENDB`fontmatrix-0.6.0+svn20110930/help/en/images/browse-fonts-folders-tab.png0000644000175000017500000004735111223375754024510 0ustar malexmalexPNG  IHDR,#_sRGB pHYs+tIMEtEXtCommentCreated with GIMPW IDATxw@G^ػ5c1&1j-J(bc "˵ݝ;hE\X$f~5؃$^1 5 ))l[ꆭ[4'{`%Oږ\f~>ikiW9ꫯyHK>yd 9EC3ƵgKmKj{;Zj_9c{'1(#;ܺTM7&ߙ9 7/=jmw^)>&l ƚ,I>޵ĩM~ՐC_<.gV}˿ ?o6mm3_npκ"ɣw3yb؉g.& ͼ}>*jǼMG~[ڄCqzsa=~'zӦPF/w^1C \cqOОA(м6'I<|Oj@ŎxʔK69IҬ+5mܺ~zi;iݛ=F};+okUT}c@Lt½EbU'&TFwFUH]{H {ԷNhBR61U@0عQ}YD)ĺ@ݻn晻hZY-qBj+i%ZaV{P7,ZӒ5?-Yxb:?_9c"yRޚnV.fj_ܹm!_ԔttϾx7ڗwd9Ȁ(jk:v鼦u3'}ړΨUM{ < ܵg֩<-$X"+~dyuh"#۫1p&{IXc0~pSwb;1 $ss vj +3=e:]Ocm~]ߎS`y#m%3VuO=z"dwO#H$h%@V^:s<::qƌ 8+Ff<\zSKSuj$!K7%WiiFVd2E=ߴFHV}[tjOFf]ldVӆ.FrW*+6պcR*+ J)ϛՌE5#뿣/ܺX "V\<4ޓ9;d]/\Z!Rxt9-`/{VtSg:eupn|ԠQ)i:8!0;-f{>De5zLnӷD*E9L ¢rL)DV?~}E_Mϣ&jI"&}d^8[b'ΏmP}12E3ue[j2\=W{]xz3J B3#f}\b툢`L^rbv^skSĮ؜: _}y ̳#R)6!x췟=xرE.6g?}۠ȉ7r<.gke_^7Mn2eUyͭ O]/Zc|Wyd)}.,Y|QiÝg~~;+\>t#ç \PECӫzىg.& i?8^dxOg6-l[ڋߙ.*hqSY?G\~`CHUJmFdʡ7qf +56/sG;"zPyvSNZ:2log'.uZGrĦ\_d?Rz }{W`ؔL+ӬdDD (ܽokUT}+G oBN[fn_&%42)MKvPcňNơHug6+hfzB6;s^c+H9?Â\[)o\8YO"*r Layʦ=LVSܺ5=[< So:dСYYYYYYC2t}1YaA?.yZPC."|ՅS.T+w=aD+/K RR3Ϸ `S׳/{Wxq:Fx>kCyRƵWݘ?zUC7 opmǁu!̸ JC)v\?/~5`S/e;H^3F\3n/N 5LJgm@ & :dHK09'~ft`)7o{am_,˱,m_nf)?S^~o2n۱'Lx߷ךX׫7l= 4hyӦmJp){xΊt[>ih{Û8psң 'B_..*ZTQopvD:Ky]SϬN3]M/v񪔩WZ KX-Vu#yGK2ZnNj|Tϓ0H:RMfN¸4kksUC N:QQ܊}3BCMrY8J0ZvfѯE9gtU4jN5!!Vֶ7Xw!CF&%r!+xܥ{)]:ܹۧEYs% aqQ U3}-ĺ V G[>u+vm f/966g\⌵akR8vͷ&p!~5P*lk8E APE APE H9RQUX!"ؤ}ʥXiҶ}!O*'+22*##(Ʀ^VvL RwQ"dwO#H$bB$Zyƍ329!ۄii]zULh߹gFFFTR*f J)NboM|+>OC2W69r }qTi ǥ2.~2r߻3ĺy:~1;{aS5(Pe9ETHHR2QJL)x{k72)Skن#On #c–0Y(q}A )Zr Ja)e3D)UIQ *z=pu$(2>KKˠ|bA-HFΝpo?ׂmௗ~d/RńKF$vl֜ L"~΄;[7~HMG)K58X\{cvwM06_nKPQn6qFRe#!X#!6E1"HEGB!T !ٙ4ÅV&YC !!h Ja[7"L; -BF,SNdT_;VBCMrbemۨqVad2Xb:$H F.W(bNA!A"Ƶ@PE ӲM`A/ʅ/AVKOKqH ;8֭H*Ł{(ªK51"K+sё#x7r嗰&Bog귤Ke^bWHHM4 T˿ޘՄ G_O^dE|e@ Ylq2,_ͨ;b M}5bkYOҺ)@\Tm^{Jbͫ4)vuQ>=m+w\}JFOYlU=9z_slZ5KĮnЄ X39͝u[-f}h#YqlμE$,(0Cܳ)jHo Eb6Vܼ/ot2haGkC6aNX}ֺ)']}ɜݹs1O/>S}mrj_:j=ƾ|"Ԝe4yoly >?gcS459txDj-%}n3E72XF}F,2b]= U=: 9`xc[+(#c2vʫmfnjh򜴻UodL3g[\ =/;i$_ ;_ҖЌ+~8d}\|潵+Ϸ-kQsȂE mBe6]ZHҲͮj4ɗSpƥE&DԳ9,:um`=d}gigoH8彯[qfzyI/i/g650M}$2"\fe1sgy yO:5OMs_Nv.J zdtV֙7&{3z:dG_|ҡLx_8ʑx~ w7Vm{yUݗ]EKleQ?_?հ<զ>:zt+ӜTJ5us];"Z5O:~KGR*uDuNU][x4)P6?ƮvۡuR TbM `⤜^gsx^HgIT8t&^ն֡Kk-Exݗ2Go1ƅLnnRSs[swuJ{FŽwcF6'ĸ>C~q/5]qngK rnlߧ7 aMWC'Ni_Öra BTڐQ^4NƷbF'~ߩ#K"|^[t v5yR_|$NJ:x4tr >LkF^~ 0]sRqh{+I;g:O 9i׹->n-X1yE~WSFdtZݵHhy5= =zlǸ+DWE\}  T?Hn9/>nT/9G/6=!KդOp_h[;0f0_!ޓ8X;ԝ>]jʁۛXޭz뢦$6 [&6ZͪѢ K_M 6 [ ;}y_iӾŨ-F clʲX+mGk+[pa/Kmkhc+h#> ?x~:KC' f/NoN&0u !;Z34S'wG6&3.%uEb'ơ_>p*LG 1"e"Œ^tā}>a(3BJa68\Zmo+k*˝-+@)|ި߰iqڄ]E|8;ˤQk 䢔~:1 pZka/t3.BY̶V*tή)_uKB`pOzzwX 2,l3}Ep#ݓ3!t;X"SM؄"&tuҖJorIQum(|t;?/zK󼼸U I?yZd:2 m6d+Lfv] v"U_MaQ]ǍŶ C{.rβ?T ;VECɡ ~x"$cB+"%>/mXL~2SȊ>,+!?;4P|PWUlsV{$M~9 Pe̎ofmPClCfrqf/Zc|W5)/J988E1S>fvbo6_`gL)gKm3,X=?ח#6߷eVdUIܺyCro(\)GJ .]:}KGDD^K2yAm~޺齝/zN2\w];?@lZdi_:k!%"v}VMaKidRb D: /\aW: !]S0jn"xRm1۸_(VK:׍v4icc@*M:jð"nv?EЫw kq4VQ#/}$2Er.iG&i)U@Ί쥄ϺhWkR"AΝS(N5]EUrom4}2=~^I?`iNR[߯F]9&dS! .9ޤQ~Oʵq`@*ubؑK Gwٍ(X>BOnaյ0G,ۥ>"4B@&h*5>^,ж]fFJXVj9j999QQ;@qDX7uQ䖂!ȟB o: jdYMsLĈ,ʘY#?wsM-5/ ˎ%iV  WTeRP Ten4"4aI 4w56zŵS&`~<`^/Xmaoi!3'N<\./D%wƨSֻۛ 5%zH#0nӑxe_kkb" +DPRC0M};;@3FZֹ-brM 銗w U,;-KP}3%2|fC[f?k w]@M G/'j&tޞrPZ>;ZC0g^c/m׳_/v3V5=MKSnΞKF$v{A}+*HazH=NZu[a'/qRE^AS/ߠ!ٲ-^@0 H$Zo{B"H7?~w13!iִWG'TjXcE"N6oڔ12ħb ! !!݋yiRB˗%IxoU0`HgDj9-$25@%8 BDX,So霒j./o(jf6$u$Q'=LӠϸON96!|CFa_5F!_h]`{,𛥡4`[Ӝįz<УSÖ ",?SI.:|ojѯԫyǧߋJ[b'0,8`XHa4HGf=geV8!"RyEX)MG՜=Vȱ"!95 2yEbAJ (Bt^EXAV0gu~iK6/inuAGz_O}~ҿǩ!ոMXz56_ET򘾠a4#gա?ugi5pjow dE|vh7qɼ̮ŋ<0m|Ecrf qi9ݝpLu uRR DovvR0  m=~{=OD}]W#g|r2b83}s*.THhl7T |m웛=DdH U"HUit^TM:BBou] !@ :8q9v R;f_t}~p O9e| RET^ :s8ХFY&0999bsΧNVrɊؽ]AA}S%YO>:&xbD𙷷zߠ}9釈R\IFW~Ki\![V}3Y"Q>}1. ",R&ѝ;wnظ!ŋ W3fGYK'/E9afW?>mc7ے2}޵f mJ ٰgnC>?wgAZ~ia5Ӡ z5xѣFu])N.+?BQ/ھՀܤ+u RVq%Ls94k.'Ae'A1cy7D"#qo)T 1]\sm꥚O ]9t8e̎ofmPC{Q^#~69^ oy{3j5#no6^̥GU1]!gc^R=uc^?FPq( !HhS";qD/ڵkc@PeBڵQ`"AS/"xLԋ^EX.TGSiЀ"h-LG (BKԋz (BKa0Qz:+}(ʒV]S/pMhTyS 41 4f^QKM@S/"`ԋ+4"(Š!z`*J׳^4" zװ: LXwbꗎdg2ݹs \xcǎ c/Iu~ҦȴfFk5+L[ S; )V&D%ؕWWN qj; y^œjK*K1?$k{4Vzͯ<@o1Д圯iM8Ȋ:kߚAC ƄeǒyS5 5o?Z{`٦Ssʤ>0fjȊ͏6r`^}G~+N|M =d&VY{-Laz_߾7{7I&S߾5z]It릍w^g[ 5rMT{4k``䷣DZ}EA&ܘ=%hRp\تk 5rgltb^4"fQ\S/4ES=hE0`ԋ+ 4"( MAS/"xLԋ^EX.T'So@Ѝy I]8cYn]aQZ4VzeV=æM8~Ԧt/%"|xX L cD5O])z)ѭ",Ria%CFARMMn;uQ%!aI edb66=?ϏkBW}"Oj02id tIח1}ÅBEu1oC]uQ9:SGkq;n|ԙzøv+Z}y2(Ь;c:אd!M+ב9z'-߰/?iu= ݺ({DJZ&N2n|ѳglJՃ (a1JktM nՀy,U (OGWջOֆ5[D)g,4VUSؽv. knϘ_ȢL41 4f^QKM@S/"`ԋ+4"(Š!zMhEPB5r;xħ.xk1®Q^H-LG+79h>c69tY*UC.Ta0p-zje.a]aM&^1yHHppoCQupn5qTW;:2nqʦlq]J0l>.KDȎ# $]ğ=8vkʆ`$,<B!$_<,C9@wI^Rk<'ʃWnbm=W&_6#a駣nUK߳f*eԡO5u MכpFCCN*-]Xh}<[գKM^L;mMB¦R߾7{7妗~4^Uu1/hXi뢂75q H::稞lJK )%B$`\S/TOf" MGF=8+h[~PgFCf2pΚ{ib`WwL[u{ m°?Bɓ>Qޚ)[A2MaKidRu#>IDAT6Irг#g@P:Jl;ݱ +H\lלԍf.$,r#U/<1 i$z,*j%~g񗽝|g=hބU* [5]u)M9޻],JL&HD" Mlԋ`:j AVhEP za^EX"DS/bMYPB(J⌊DSo2*ь[V_ PBkBSo2*Ќ[v*FV 5A h-|R]:ZP0' au1Q!sEkh͗nwpS.F3nkWCGEjH51p B3n 6}4h=MUԛ ͸%(m3 h-U 2!U1bLi^r8o 5q/h䍉\Ƀߘ& 8{ D>A)ea)ԋ(2"}_zT~NiqPV g{]Bn) .p%j~@,3"10F,L1MުRÇ^9VDu_?!Qi4Z3O-ǫTjPhz+vv0 Rk=F}wBzsy 8&h/8Am; ѲϮ2Oـ)[p+Pe0"'O8y2a40D,!('N=Eڬ;p;M^b0}L7ۯm41fڳKhEl,f[0VQ/q@.\pRnԨÇQW^svvҩ#|X_PH5ZaI]^ 2uL©8F*"$f͘ʤ-UQ=NNm۶r5'Ož58;'DSoU5o$/D?)PSDŽzFy}4e k7za]+ݾB` V`t "&եUfZ&:摧[==E">BSo5Zћ;^-2ߐ50_0rwqlj _SP߈bo/mձC5$b1FBid5YWav_JY1 n@k?O [zZo7>`[9{WUy-^a ~%J>5kԬauy  8ȗ7S21œ!3t!Rcbخmu9NK)F T>F3zQH=v(m޸BNSJF2V "a %!$0"$2*&uXT^z(d2?,k 8A:6ӻɩWnZ~(CD T5H.OOQEؼQ#F_aMB06/^{ߴIrz5R."2:u ߽wg^)]6i˗՚f͚gs\;͒ho/Jj5 aF,[[[ǗURqV-Fg_ɤ|>Z i왳磢tܢE3ڊii91e,*Q2,%%ՂƷJ%"q&32:|$9bm9$!XCXղZ 2}+b*UB,9H=wH$?lߖae.u'rsumҨ!P5s;vU;;+'\T$IHJڹ[ÈĒX{;ۆ XHhtT,xyyI$⤤V ){NH!/j,?R;Rwtƶb80DXǛR;]<0B!kP\&.ebv$` 3 HD^ IDATxw|lIP!^E UiދWA\A b~UDi"`)Hj $$!=dd& ~&;3(ONsB zU/iB!eoL$bB!dPtmr'];׵ypB!BHwrN]\VXwh׎=*1c؜sӯ)wlW寺Gܞ5|4V+E9CEBq=4ͣ,$?C.H9 Eљ;w.<+~1Y3g痒xΧk%]iѤ1MzÇp80xyyڛo26! xQ⎳kzjL_9vɸ.#a4Ǽ<\"Ouy޼W޺rF _{YH!WϵN+GU@bwb{9r4_/^}z[jfy䲞x^ bYHhh($&&p!wFQx1<#|4>G7ǰcK>{q*-7qߟB !^-ᵮ6ּx?6e5y<^["=Nk,5qS8FȓJ@rNeT>dʹ5E)=l^Oh!^;XD>;Ԓ 1_k9AZjMUI͌|J|yWrdX},V!QU5?`뺫4D~۶mq[<4b$f~u۷o/1vq%6/V(/YH̜9ڵk5K(^}{>׿L>7~ѿչ'cS|H#t]n~C.=DɈĐ ܊6[ЦӸfɸ.-h!V%,=# ?.*jtQcc-_<:>miuQ9/U81G>LՉv?򒗼%/yK^RU}Zm[bۇm[8K\~٬%08}4FUINL#ג@LLGrrRlܞOglݶf-_uɛsߠ6&k.(xycm\e%j@AF X8ʢ[I^<&j` w[??]~~]ģ{([ G3c5NRm4@X}B5ųe_NXΨFT[SO{}6Kc+Bqiu }r,4"';M3v+||I iKlpxlSuػch-caDR F`\&eԓUc/ $1Kd2f% | Ld0@YDŽB0Bd fHXK+CxYb"1Kd28t X6 cك_r4ϥL· W&䍷Il!BTMu3QCq:-|4֮ɓiӶ-C`޼%%_%u jZ]l,Oi.h`|noǫP,7{Ըg-剨sd :dƓЌ$dAŏ8GCG.zŶ]>=8B}VHݳSMۨTgw^;#o icIgʕZ!ǩ\C{$ʊk^Xv3WoBt>kԌkݵȌR0Qw x%f`VϘK?϶mp+ w8u'V3X?/=s+e n)vv_1sJf+C.ˌAP1Cjau ILeFwqj`4{a2CCٛ>] ΊфTxTq{yшTpDA foySQYEa \@q_ktc'LfB!.$'הT!B b2 |5wVe!B! QZA\!BQ~:$B!A&!B!\ !BQ\=Rt-B!De@B!B4 !BQ1d@B!E4 !BQ1Z!BʚZ}5EqбK B!nV$:`B@BlydYu'Ku\q$Bn:Ξ=[a\f͚Ѿ}ngÆ e:>߈hD10(Ep- 4.spB!L&+;U!L(B!r_^cny4oN|j6]A:U w -yc,wY:o92ۄ/ 叏TVƓ96!BkzxJAz}1.Tz~J렕Ta]D|:}[=O{~2yGТk'=ǞDgb¯ybɴlslB!7]3t='[؃q|+w&Z^$suw+|-R|0ȰqU/[hѿJUzM^Bq# U8'&qp8uݕ| :[s5=rVp{;n;nnuo8OCIۇ 8nM R@M#~LlMDmB㏏&q2KC {Ɏ%p A+4>/nh>L:ۄ;nmw6 kLZ?S&VNcWl}qv}_y[gc"(۩Ѥ,CB!K+ ̎;~:Qt{{"##0b{gS%օ{4{61L;,T׏3.o>[@Ut` w}NETs*\zC+:f1Q 9Y^>C0uFWJ@CeQjAi'bl4A d,RtPq5>95e#X.qe5B!'YGUURسw?ǎ j?1xy{S-<,<}n.{=WxUs8 jR#M+wG2; chcZ}@|1QW˞̱q:\8@nnsHƩgsAlNOC5,l66b)].6IB!.I5 npfee'е[WZh#Gٹs7oфVI(LvQ5W0L`yO^eJAzONcm:?ǢHJHw͵qT5 }W{EiWKwgwUUt]pWT A(eR&B!.ɕ$뮜̠uNxno/3nm7leƭ /k*^Z@9;"/vL@!U8ruIIF@7tK0LxU;G= 6_CR3/Zu#\uCX6Ks8 ToߌdpeM^+_B!čD\:h:ժWKN4nɈ ֡[.ԨY ]Ky^<.48<]s5srT6TT~>][dǯ yz M$XβkIz?1Ӹ{I9R0'6β{G6B8V}8dk~%+U\߻LRkc;BVw+}lB!t]G5̀@&lv%|hؠ>6 ]/YJfMeKoC.2]f۔^xdsדϺ/IFő !kƍ$''WvWaÆnٰaCRlLF&&//oPWv^i`nCu:q*NU^メ :*o/*xWk!BQ4MC 4NCe 誊C_˟ϕ{@I}B!DsN'ʚn4㚞M)(:ʛJm!X҄ʎB!BpZӌE:{ Fq`B!t~L&u!((cWM4cvv6'O:YUU9~8 Zjwٽ{7M4ȑ#h]9z(ҬY3*DUW^VV'-Zv>>t Cm躎` 22:{ _fKvv68N8A&M3==*U`2p8먪ʹs0 4k֌ BCCIOOw\"׬YmےH|| BժUhӦ Νpx<={ z Ibb"躎$77sѬY3Wj+fcٲe 0Cp9hƙ3R%8j:U3gDS5t=WBc1^1kRw/ c%/ (aLf!ri}f/wd)9H޼v=-zlMMZŻKQxX&<2?W4TӣXȻ?T7 7X4MLJn L&Cu"""HOOVZ?~ɮ]&,,`Eߟ<Mvv6lْ<ߏ(:-[PjU<~HMMuY&7oAF݋(DFF޽{ !-- ___N'8hР???F#YYY:t$Zlɉ'S_2t]g4k֌Ν;Wv8׀KRprh43Uo}fً`j.t 2=ΗjZIUrfo,=]T l_W*|hn28GG1Bb0߿ڷoOnn.^^^L&U@۶m ",, M3n~t ZjEa6=J TBΝ tp9ܜ IDATItt4*(߸[G. ۛ-[b M6.ҥ 9994i.1t}.77ݻFBBB`0вeKw;FGGЬY35`zi3g`0Wv8ׄe_EQ.B\7/w~|4ڮ >#L'c~ |?ϲOgp,$3'|ȑ\;~=o>g/; &hk1bs ]qEO<#LDĸĐz ԗ3~~$CE3?] 9<1IO~!f,>Wr+kl9Sٹ>[7&0?'ǯ׷/kCbpU.^ϡ2f+01 @ ;IuϘBlMdTvu‰um%_0,Fc܉5J{d*V_\x( zhժٌXrd.뙿k;vler͸f]t\3*8tZס~_2w(&g:6 ~,V_Oo"4ǿ~~fE׾XʕXI4?[Gz{|>y,}yqgj~V>~fK"~RS̛Ԍh2/`kH.V|s=67{iWY ?{?7֑~ /w".];1Y}"Z៽4)BqYf[F ZhAƍ/]RSSHOOgҤIL8'VvX׀Jb2k @Wf4WBJjk3jMnǸ>8y%59gؓvŬ9mK JЯ+=wGQV'ƒvpwZx+:\F^Al>jWbF^Ou {pf#iWA=LN5Rԇ9MV̵o%JQt?y}B! 44ӧWvלڵ(xtTU\7?uZMg'q>RѼ/Ydb᲎cL{[^AI+9"Aup2oίP}IGuN)Tf0ht ]dz=z9\Fy+t92pfKB!`f,V Ve,p^z 2׿5[W'jgzM4셢o3 R2Mq+P)!.q5vo[EzxfB k}#S+5qv_Efj|enOz6hF!B\J)lύut [d#gcf'1Y~*=ߜ@0t1{k6˘7Q g^O<`38~G2B -CKyLj!|3?5g-e\Sf=w3jQ(E;.wNn~]ql0cq  buxRTi?*K{zǖ }!+)Rr_?/_RsvШyNvCˉ屡SWsUkp_c?fO_0_ESd˸YdףcD oƍ$''WvWaÆ%YV6l(iFfwtp:8W '=!Pt4UQƗ$Pby7ؙ3m37ڀ@-ӿ>ds֬Y믿r[o7]U]ҹsg>,xի_&//gy޽{ӿ֬Y>|y8p@%F)%P ~cΜ9>>m 0o /x<,X#.xb6m[56m6mb޽̟?-[wޝz3|ԪU+oV.\\x2/,{SCBw}?M6 ""Э[7[v;÷~{O> <~[Μ9sY&[nW^RaÆݻvڱh"<N6mZbyƸqܱ0kגǂ ᫯bС;vt:7o{l6ٳ3gвeKyV\Ν;5k `ƍ̚5_~ܣ~zԨQ,_L-Zݻ4i? ^z4lؐ7?--hϟ@pp0{宻bݺu,YMeh۶-< ZlɆ hѢ۷g֭TREqMKB($B]{_z%RSS&-- +WrJt¦M.۞hdҤI̛7Gy{;v0r{^yҥ  2}tvY{4hvtoM6%Oj*222ؼy36mbٲe?~x?_giӆ}ĵcǎs ºu9r{dȐ!͛pСRMڵ;ŋs n6~W֭/{iׯ?9ww}7Nz{!WϵBM 2 kpkӽ{+ߴiSԩ_|ަicǎeʔ)Ŏ70gwb tR222<+p͛7gĈT^=z+\?Ǽy歷رce6۷ߧNOPP=Ýw~߸qcիEtQEq'֡o6ӧgdd0c 틿?.\N:3(FѣKB0H=",, \ˆ`„ X,+++jժu jvSSS=o߾#)-`6 .+p8,S/ˆ 5kΝc߾}|77ӻwoקf͚=z*<;~3}\DvJ5]6PUFǎ?~{q{={63gtow8/=#Fp!1LԪUs璜_%66֝i}]:u\1bDW ! ( R-t؅F]`!MX%/<3|'WNY(6]iEDDLzzGx)aaa%A,hРfɓ'Ko.\p'!<<0rrr8{;NUU=~P)wǥ4Nj?yG?~;-E1( ~EL;HMIEAu:q8vv;v*>~ѣ4TMqƗ$wӕB[JHH !!x_N.Sܽ… \pc[yȸb(_+wBQ^2B!@QB\_dnaQbcc8q7__AI:דI&1iҤC܄UvBƍ݃r_ג.D!B `Z!B AZ!BP岄B!WdB!B\=(B!DQd*>!Bq+R^E\ !?`׮]:uD+TVZjUXBH͵B\VZ;æMشiׯCvs kO!{B\u̙3o-[Ɲw SHKKYfUUeTRHt]`0*^^^l6fsWfM"""4 AVVVUz L2ϵB8Z*>,[le˖lذ~:upӴiSIHH_M4aӦML</㏳gڵkǪU1cQQQ :___x F߳B(L[ !kŊ>|ӉiZ8֮]Kll,f/^zӡCf͚iѣתV֭# Yf{n8s ǏZj6 ֹsg^y233öm#;;~ؽ/!!۷Ӿ}{ :u* ԩS9r[nuRwIk!(O!kaaak~Ȑ!={5jо}{wiGzz:iii̝;>>33b>bЫW/f̘1cXd )))(BJ"2B!n&gҡCmFZZ!!!|,[2|l6)))N8zBhh( ۛʸE!GB!OM4)ܩS'/_Nxx8 ,`ԨQӣG^{58pڵEݛpz… iР{fsmQvmiٲ%7''N$&&={VB(2B\Sl[=܃ٲekt:C4zͣ>7/.ްa'|'> ݻwBL'7;}vbbbѣZo찄oABL`` ˗/jb0܋! (`Z!n>>>>B((B!SO!BbB!z\ !͝;իWWvBqMZ!n|;fox衇߿?˖-]ρda!MI4 !Mbɒ%9wyooo{9oZ⧟~"&&+Vpcp8!553gЫW/ f{'##{x)S/һwb )SxXbfX,VXABB&L`̛7#;vg,XЦs=?L~Yt)Vh, iiiDGGcZIJJ_~vΜ9[owI||}իW3d}QTUeEv+O>X,Ojj*DGG7|C߾}y裏2gΜ2|B놢T|Bq3}SJV+}C~zBBBcʔ)ԭ[///n ))}v f͢o߾۷-[p~iڵk?(1Fzz:O 11~;w.dذaX5kзo_֭[Yhv[i+Vرcl߾09 3gGƔ)S/V_~%9997gRN֬YӧY|9<[neuVټy31113ƽ}Ϟ=>}}#=Bqh׮k׮eMjj**'N$..֭[pBV7|C=2d]t!((7x>}ɓ'sHKKN: |Gl޼[o3glj'8qtR6lPl{ԩp|||܋z̝;+W zVʊ+<֭~mUUu')))ݻTmqի c…ko;zl6v\~K>_!uNQZ!n۷og۶mԨQbGԩS%''xL||<ׯ믿ɓ={[n`Ο?tڕ;vVӴhРb֭o 4Lvv6*?XhǏgر,ZȣgϺ{s;vH```k >xjԨ3gXt)~~~k&MChh(ϟ'++ oy_fM;m/H'tRV.2ʐ=) ( d)( ƒTOh IDATe!,*(R@V([(CZtM?B}}`{J޹}m-[ؼy3#G$88p\CCC&55jԨ`Ū5jk.rss)QnnnرCYVhѣ666\t'Ny'`Sl=wJ^ǧ\ԨQZjQ\9j֬Iٲe{TROOO6mpA\\\Wm۶QFҸqch4t6m5k֤k׮k׎FKժUPڵcҢE ^yϤI|򤦦̺ut쉎V?<==)S̿n'::oBRR8u,}+l2a20FF#S?.`l/O%l60+?z4Z-aYQ~Q!4i,c)Ν;رgODDIIIzJժU[nawJFRr::mCjJ*f3 =Ý 0 LjW~ޖB`t!DQF!B!(ώfsyǛWrr2O:vUBݜ~B-X˗+ cÎ;>>dggccc$Qؽ{7ߟl8@v?ߟ<z*ZBVcT*111lܸ'Np5~' m7̙3vJHOO'&&wy=zņ hժ*U",,˗/s%ٿ?\v`i۶-[lUV1|eڹs'GfΝzBBB7o&''~6o̕+WXr%^^^%!!A[Z!iii̟?2eСCʗ/O:uҥU+RV-իGٲe c6Qdff2|{9΢Epww}oINNg߾}V333`׮]V#gϞtؑHJ֖(z$v)3{f lܸl6nXu5L|2u!((Hj!A\ !3|򄇇hܹur eiܹDRdɒoߞPF @>}>}:` @׭[ȑ#Ύ'NаaCΝKݕ>z='NGɆPB_NVV{ejժT^k׮Rpa(W2j(e˗}|7N:E*U6liii$''Vh4*BCC=zՕ$bccWG4Z!...Ԯ]?~UX|yƌî]VZӰaCf̘~Htt/_ҥK[ܵjRL_tʕ+3fnʚ5k(Qhƌ |%aِ!Cx7QTԨQ3k,K.ѷo_fϞ /WT,\^zqiذ!cƌaռ[qazEj՘?>իWɓ,\A)IYnu 0vXy7ѣǏy愇rJJ(Azh֬?ɓ'+cԩoqzQ}ﻂdb# yR24xs\ !BQ\$B!Hp-B!D1Z!Bb"B<z=鈎&::*7&;;V @\\~<==N"##]6:p,Y˗ mױcGȔ)S}9ucƌAK/b vԩSyO>|}DD~iBǗBhݺ5~-˗[WO>+WΪӧr `I=m4y%J.M2e߿qvADD'aaa;v *Uh"K.UҲeK^x>c<<<+Yoj*É'`ʕ]x_;vV[lقjYP_5k_~4 6lȑ#+A׮]={8A1cǎq% ]B<$B+V,t|ܸqV򽍍USd53?֩S%!Kɒ%WfRfM߿?nnnwhX\9 2eJsС~-/^^ɓ'1Vˏ?huL׳m6ٺu+V*??1c'X뭷_\ZG%8v/_&77'N:!o\ !SG ϝ;ٳ4ի,(Xd:uDnݘ6m֭QF\3gΐdRHNNo߾oߞrq ~md#G3i$lllc|׀e D\\ϟ5k/سg3f̰j,ǧONzfРA%y*Uhٲ%_~l߾{Z^4mڔm۶qԩñcǘ0a7=WYfV:991dڷo϶m?BCCشifbÆ L6+WJƍ7o +Vd֭l߾!M24 !I24>z=qqqxyyN#!!ooo2 z=j'''eVTR%ʕCr%j֬Jܠh,7^rZjaccCJJ $%%QT)(ScN+jFdBXnKJJBHFF666.]Zggg?fPdee⢜wRR...t:j899jVdR{zzNBBkF+c)X7nˋ,.^H:ujdffbgg%KΎ$J.ŋˋΝ;3w\*Iƿ>>V]\\,( ߍ9V*jsu ~(&^ -o?'''B"JF WA_6_}҆%BB'B<$B!Hp-B1{l.\!O, B(7nLHHȣB<$Bh$88N: JCH`` bERR , 55g{/o)ϟ?OϞ=0`?| L6 +[ܝ9s3|pBBB~xW0`gϞe…L0ϳ{nzň#tj5j[ljK!'[B<~g&N… y饗x"\zU)׼ysƌÅ h޼9ӦMcܹ[|7xxxdؾ};GQvHOOvڌ?Fʕ+֭!!! VX?:t?d͚5JȘ|rYd Yf̝;N:quZnСC1 8pŋs-ZDrr2`n(B+W% gwk׮1f%}y9uUM6`Cbb"DDD`ccTB DFF{)YpUUVj*i1,,*{B<$B@@@ҢE <<QCB)o>ڶmK\\?~L|Mcƍh4uƮ]pwwWꤤOLL `IDJJ8wk&<< *аaC_Ή'prr"00eK>FCٲe `߾}.]//ׯ_g޽ WWWٸq#Zߟ;wCƍ8vիW͍}GVIjj*닯/=F,TB:u͋$xj̵B<%VZŏ?Ȋ+;dHܰaF+W퍽='O&)) nܸ ؽ{7SLѣ^,>RRR|2$''3gYv-ӦMcݺu8pSNᡌ`0Ŋ+0 8={k.BCC9s /2ggg D~~>͛7nݺL&={6K.eٲeуK0c  ʕ+rie˸r {JѣquuEo\\9s!''AtBGڔZ!7n~`ƌٳ2M4$رwww=ѣܹA۶m[ʕ+СC3R$..Ny\LzA@@ݺu5 fۓAɒ% "##L7nL6mRҞ:ؼy3` ❝1-o?#!!!p jo|ٲeIMMʕ++VB!Fk!x 4o\Y{cx{{OOO/dEUM2epGU~ꫯޱRV-*TXҟ/Xʕ+FC||> 0p@۷/ƍcٔ,YT888PT)JW^j f͚ѧO^{5\]]iڴ)C 7oV̙3^I&q UСC,JYZL8u\t ???w̙3h"fϞԩS9x &Lxi!$ yP 4JF!B!C\ !Bg)B!Dk!B!B!B B!(&\ !BQL$B!Hp-B!D1Z!Bb"B!Dk!B!B!B B!(&\ !BQL$B!Hp-B!D1Z!Bb"B!Dk!B!n2UB!BG=!hh4>a!#'>$Bq"akkKJJ]R /_ !x BgR=x" dffrV"$$(6m&MR!/Y"xlٲJ*Snݺ$$$мysZlI˖-\2qqq(*СVFQoonUwӦMh44hOO[!2̵⩓Sr+ҡC<[E)SL7F,v~Ve >B<^$B3fǩS[.FbԩܸqW!#⩲j*\r2'O]v̘19s`6ٺu+'OFp_nUlٲ#Fe IDATٲe fug}G}``ԬY5k*̞=^oaԨQ!B!\\ !*SNrtoݺ1D=רQaÆ1aǯ<6|g|g5V!Lu B$~m={6Z~ѢE O'!Z!IZZ={d̙ʞڿ.?#BAk!caÆQ_7o^cO9 !r=!@k!c_~QC!0w!!B!!(>~PqC!B'_hޅB!xIs!B!B!B B!(&\ !Bg)\ !c*</8::Gʌ32dPޏYfѺukT*Ǐ'55gggV\Yl뼅i&O93f̀Yͅf fo/޽{<իaaar95k~ZFRBԩSL0[[[ ݺuJ*X !JEV|Q mۘV |%/3duܔ#x-: ^c`G^ԃEiwE>ԱhuvC;bOjR0PȈSltCl ! & 't:hРDFFJn([,)))J")ܒ%Kسg ~!OھV|O|~m2gE11?IskՄrIEW)iQa$ }Ψ`Ťu\?y c^۾VlcwNey =~38X"kUU߬'ȑ#$''3m4nJPPZÇl2;VXCQK.Mxx8[nek'''nܸO?ƍYx1QQQdff>SB'+:8oatrmo]Q $EVО)aIT= ChQ*P;=G7ʞ2ŐsB Sf̘oK.Fl\΋8FRA)澣L/:\@y-_4{{kj'r)rs,/|@=VT`ڷ^ayvyqW$NYJtץl}śmaĔ X[3}-)}VoĂ!F4N>˥KWk1aPzߕ+(kw}ڦ" q3l&8U$S?uU2 Zʐ /6-ʆ2M)bso 8A&75îwd2PL*fѢe y~wN8N/ym+JM_Q܆0p R01WU߳{nvͮM|[K,7rro*(+TCm9KXrMpBk>=FhY^v- { `nݾLFײqr;{/x+ wܞ2  IMn`K"~+$[v0c$$$Ҥqc7jGIԯCV-IKK@ ͘MFLf BU9C˙YM/X>8sl ;C0fr[aŭ=*S6wo&&睫һN: {S 8W;P619: 6'箤7&-G/NKR/1?qa \c*O{ч9ޜOpn<ׁnP^9l ^eqL&J]t)7kJjUd2bV[-S2M&%B!)e!76ӐW~A'̲ړvS?9nH>T:c< Ǫ WFNwMn]Xksa}ᇓr o {ΎЍǘ)%"ވ NJ53rݽ.96~05640jNET<ԛEOFrL]ٖ3=n_mSqd xPmj52͘&T&5fԬQ{{{,u=UTF%!f, B! ׭^~= MSV{!(^G"`kk-66k@h6+RQBh0`01 xzz*?E)BARRңƿRjU֭9p*ZԬ\mې FAO~~>|qp+ ys2)UZeC]S~&qy (& Ɍdd`?fAld6(BFe˖ѽ{wf͚E~~>K.?*w!ʠAطo#Ç:tjժe,_~%ϟpww[`?D~G\c[ӹuBbY;}3P6,WL936˲'ɺuذa!!!ܸqlllPrw}Opp0#Gʕ+zt:yyyf󭂽P4jԈu1n8Zhٶm?3Gۛ/tVZŐ!CR mڴ^z̛7xy&OڵJ*,_^ό3ܹ3/"jɉxw֭[Yx1gϞϏe˖`c'cǎl6}vΜ9ݛʆ (UgŬ[ggg~7^|EBCC~`ǎ9r'OvZYx1Ng۶m`oo;hԩ:u$;>sΟ?;ׯW_3g8w-ZߟK.F!??3g2eظq#W^eС:tH.]|2رCrk4!/ B>rdkrc0>g2|p^+*Tzlܸ quu`̙Ҽ3n8x Ξ=Çٿ?oYYY(Qӧ3xB}t:IKKCѐ'ZVK9z(/_fذayn7nP͓'OdْIws-z ҴiS4TPA+##TZ-666DFFҳgOoU'??֭[Ӽysj8<Z#_URcǎQdɻ-xt$)g21rrsYU(DlP >p k@Nфh$2ODZlh4ivء>}:mۖsiii%;x ;w,[p|||eYp!cǎ4oޜ> &@>YfՋWRbE:w̻;Czz:W^eŊ$&&rYV9''k׮ѢE Fȑ#u݉DGGHVVcǎUBɒ%`0~zrrr:u*NNN8p{{{+o;*WLN_> "77xf̘ALL QQQ8;;?NcӦM`kkJGGG.^ӸУGeG???6mļyի4i҄`FٳgquuUfօGqfTj1LZnӡ7`h4*ԶmҲP`BŊ@ףqpp@Vhid2)K j5t:1\~e˒Z[[[`0JRnf,=skmllqv>>>z4޺JRʫjj~ ` ??_iSacc-)))xyyPdffb2(Q2q fsssUf lggx{{c4ckkKVVje^ Zzr.zs璞μys١Rtsa,X͛_)V|yˎbhƴHK/ѥ,ݟP8?dL΃ٙd=fJ΃ّdCۙ: ^c`G^ԃE'ӉN;йO0ˎfpQgG1 )u:%*z\l;=yc {g+/.9D2͘ LFq O7wQvO0,F222P5LFfAf vvv899)U` '''%/(RPJgooU]'''J\0*UR덌un-_p~(wAF`FOOO2h4o]6R0c>>>5Q{xxh4&Ăשs/Y$tttXV$1U|B+0hWܜ?ͽ0gE11?IW%_LET.&^3Kپ7/a̫5pyc+0h6vdYP6gDD #]lՁţ42&k#&̀l^Lqٻ\f#&37oB< GM6zBvxط0U6`7 y.CQ{ШoâH+hϔɰ$*m!?Ԩ] {ze燻\eOJbȹ Ø/_uR 5j+̘79r뇪Mn6g2 ob6~\ !EMvx6C~oRtܙ_5g,VwLNt:aP:8nL K7Է-e rtOW?Z{,zvD}9ƲŔ͹U܉.\:pOkcw3s+tԙW"*ɽ-t䥗+9EBdGes[k>z@6CFr:?6^-)u>^X=_{Pałmdɠ8{,YYY >* Xn[v=۹|}Ixx :vZ,e¸~pֆwjWsr݄6%ָckHGgLi~N6_ivXGtEvjՇIkgp,%ЯJ OcDƙ0Nl0s+dN.pS ހ71?zbͶ]lYkWrY ^aX^]lHc܊Zڷ^!0UٟI읲_uVt)?Sh%1=גg;cZԲSi[<;}KJ ݾ5g~tݪ~͸~Ńc(|!L0WWWBBBkĴiӔ٣}$3gHNNc))),Yww5nȬY m[3 {1f._L^HOO}߿o:thܹs\rr2[l[} !,C1/|R8?q'7c>K] MКO<ɚ峹ޜAB% T߷:)+OѦ>R?7kڹ&=I'}W֯]pkhT**Ͱ\TvLcԡVѿW`PTF0M}xƗ$iU6iHU?[%p ŃNMnk]EvRn3/ '5RolU6i H{wpzwy]]{f7r3 7KpD;0." bhbR**SbZ6ZjQPUARb$+P!2eKG$PIy>y>9͛7龰0$ ׮]̌?q1|/_ŋ:t( 4'44]һwo֬YL&#""yahh=999piU?@^^g/HR ^:`.^Ǐ111ڵkCrV IDATIJJuҒm۶K>>ܹ\1Ǐ޽{tޝN:pavލRdNMk1!a(jw.V[1|} AAAot%|}X`5%6@'y& hlX$\(SSʟ2;v(9 imBJh7i#[gwA}` IL˩Ѳz1'{@*yvB/R[[e~I>#j8GP)|*YPabVZ[[ddd| ^^^i,\,H.]Xf R7bggGJXnfe CCC6mĈ#077gʕL8ŋ~z߿?Ջy͛7ٲe ;w/dժU$&&?ӦM+͛?I裏.]y@vAZZc֬Yo>122brA-ZԩSw%++ ???233ڵ+L4MR7o̸qh۶&#>>C?k%Xv-5chhȌ3 OSZA)fKq:^-\RFPS+Hƨ*ADfoА~͒q؏'hXIu̥ TCT*wUL%ø2]r;:CkJwşsI9Wک8CZA`R1}<t2MXry_:H˦HMi?x7*a M~s1( Ts%_R uM䣦 G k~H/V/>>777nܸQDRd9rn޼Ibb"gڵ1t b ͼyXt)L:LM]oT\m۶i`?###Zj*UA\vv+i!Oѭْ^b?,5t]D(0Q,o\tf^CFbg7a܏. OOlyyWC3COl4.zfۘspzZ/t9\FkZf8N̙)5qgWyIERMcو,1k@_<`lʚd ~$ [bouv^WRt_qI֡IÇA~ԪU \ H C&CRRIII(Je…4o۷ѣG4i҄ׯ")) $ R;wJFFۗ#FvZ:fffőO9311!++Kw,Z#G2h J*hiiI*Uwϟg֭ 8xÑfwww144ˋaÆFTT?ݺu#66urZn˹sܺu T9|0*U";;Hh,--5O?%**T5^ xColۿ`6Zφ=oytCʺ7BO*Fd߼ ~'Kpp0nsN7oNNؿ?'zb˖-X[[s}ٱc>\t}j26ၾ>Ot+++6oL*U2d=bΝX[[ڵk4hfׯ_ѦMtttHHHחMr]HO$''m6ͨL^^wweBBBhڴ)\~۷oӫW/6nȅ x1\|~M3%!!;DZȟ"ҸqcҸz*ݛÇ駟ٳ':uf͚ѥK"##ٵk9rBDgMxpJĀz]h| *W1@-=QV[X\:DǎquuEOOd5IŹ4fff >ݺu]v4k֌si544 kkkONϞ=111?޾}wwwHOOgƍСCڵkϝ;w4vooo6mڄZ&,,3fC۶m=z ׺aHJJbر 4?dB QTcaaA.]hܸ1wܡjժ:uT4Yk׮Mӧ'OBS~-iX 9k׮]vX[[ceeEǎ^:=3g`nnRddeeGf8z(NÇd2d2u}w 2%˦m _ɲ+饧XN eZqHP{i[׊# ώR@\5-c$A f|T;bS% ˚˽/A ,,,xAF\#F`۶m튧kקRJ脄MYcAܼy~w ?ݷZѣG`nnNTT=*sWre8y$ժU#!!LVx hڴ)ǎ$v3R---UǏy5kD.q'66yaiif_AМVx:zI&EιvK///x5&&&9FTbnnQT\~###>c=ʝ;w1c~-:::=zT$3gi@ * ab7in>͓cf$-"5@KBI,(Oȥ8,¸WFDm͐K@ou}wnDNͩIAÃv1c lmm133cL2oF\fff;`kkKDD --)S0x`v튛K.֭[ܿÇ3sLر#UTa̜֭9ׯchh?oGQ5kTʕ+W4e|Gܸq &puzT*iӦH"!!!̜9 .н{wRSS56lxÒ%Kرciii#hӦ 5kw%""KKKGxx8YYY듛ˑ#G4Y.{=NW"|m hyOBX5cg!1zO ސGfw:/X+['=Qn>x#ڌY}, 0;nbv+ftƸ`z_d柟;U b5xVgF#6+oFIn,Z#Y1cѺE%6|}ru21F$Bv$` 5]jЄ>S~LjK- ŷ?ЫI# (ϟ,_dxMAnoX䖸ʰ:Ó_oO`t@.ѢF;'*OT#$?I鄉AqZI\+ CQ35t܊ "((}ۿӲnj?+YCȫ7a@cC  ԹB}Gb{؜@6IZF>0_$h<-BՅ^Ọzϖ+2]JASjѧ|/eLzpJaW@IJ@?yaVZAJ6FUHT '2~kĎ~zZ/t9\FJ%{F@gd_ISן/$wGnn.cΜ9/5j4k셥CDD۷ogҤIZnBBׯ/rA^UוZs\hϨe3$!z֓yuw!~} m;U3c޿Pw |m|V9<}Ֆ/UgOL|} I"v: A^|gTVk׮%<JGGuvMZn /M_[.Ύhab7in}ak0-!x`_j%[BItt/Oȥ8,¸q^45C.ͱ_s_*+wc>.̄FC݂PFbۡ`ERF *5bĉTZ$133#Au+ IDAT33d̙T*eԩ,X PN>Zj_9sp!S'O$22cr:;]vÃ0MF@@-‚sȪU\2'Nʊ/a 8q"999Xl֭w̚5+VÜ9sH$xyy'M6S޻w> +++ 3go>C=5kժEBB^#yO*R)'}&VИ }<= ag\]\6hB2ŝOTHx|삳ݙ5U|ǮUWˠFHQZ6`{Iѱocٲr<{8q #󧽨 _\qrre$>?K%;#9[RDpXO\]}:WzQuoS8Э?c^'P%_b+¿vc&L'SNQX---5j@~\|hոqcڵkGVVazѼystkkkzΞ=˭[>}:^^^ }9D*SĆ):|'&I~.1f5 WHK!< 6jtAL];C_8j:H$XaM ЫCN2~45#ةRe _ev4Ԯr휨h?QYԛCH1mƑYKW+ mV\g„ |G Ґagg}!!!Bڵk9y$Ν^|Аgϲ}vr9<ɓr oߞX FJJf)ӤIRRRؽ{7-[cbccݻ7w!99@:w̜9sػw/[O?-RҥKiѢE5SRR2qNN666N :Fj{|<*`un:yPfbGѮx 6?y% `}BJh7i#[of˚) `^(ܳ5dhSTՅ^P/m*ҫKW( mR)C o߾лwoM 0i$?~IIJsN/_NDDCx{{FҜ?m4ܹâEApazѣGVt҅ cP*hii1l0Q*1|5F\#Gk.̙C߾}۷/|l޼[i&j_}6mٙD"ۛ 6PfMF$$$PNb޽ڵ gggtҥK ݝttt5k:::j[gdd0.[jѧ}/eYkJZXS@.-J*Qq@S %O*r$tnlAC5K~$ێR]k's)2{9!*KSe=c}3FP2;c*J͉N!6.c\p-5}.8McTǚHE?BZMjF`R{b dW+i2.jƓK.Q.뵔T^Io{K&yӳq5joռ[.u,[L~@N;w.? 4dȐVre1#G%MMMYp:СCsΡVaÆXYY1n87oN5^tH}^^^XZZ2c fΜ OGرA1hР"/ܷ 3f *›%yD*a=ZUcS䑧###--)r\5D%EU(Z=!U[%=V3F?dYjBܙ~]cQ`H Y6`O!#[1հqGCЧ'<<롯܀n6L =3l{`[m~9 8D[K^N]؟Zr@VZ/Ύ`YOmL 7/?JͿb,s\-YM{xO1M\d0jnWJfB i93׵4JcKjz-+ Ř0a4ѱsf͚Err2HС v* ڶ\qU Ւtd2207MUJkcպ[So٧'?{mӨi)Uz(#?`"By$)u?oƾ39m6ZZhdhIIJIrG#jSը *\(rߠa}/6tDE͹.;"LaJTT CCCtuuĘeM[?]d_Z M\-q $^6}mK"O]I/iL? GZm_+'<;JEbhqִtOD;k3}~dw~߫1*|^M-FOه`o'xL=&~k-qEP^O[_T,UH$\q{(6yyHfJhӦehkfA +e b.GO"$-"5@KBI,(Oȥ8,¸WFDm͐K@ou}J]daGЕDfB#[cKDNͩIFYt^T?C&ӦG7CeYZSS۷7ݺ9!ik Pvε 1b0Շ'!'fH?#o^$:[J:z1wM\NrD* qu2`mEBҭk _ӱ~ZQl:題ttffwc\NqTӶX13ƅӳ9@K^[ \Éǹkuf/.EMֽ̝F4|-,ʵ[^)x)e C΃g+ u J؂ Pv6h+թv^9*@ȉkHC྽l\7I2:`ֆ@ \ޑp;U1AP"9,hV.A?0% qe$_N'Lz.neR8eî}6N&uuQt[H,gSȩ+8WsN]j f[260`={vof;`E)RRy%yH6S/(WeKV+++U:uѣGVɓ ,A*,C2; ])=s=%%(b/;+t0% &a?#< lxլR&=F\oTm/P7^MXFyd:$k 2?u}b`,S9S%ZhDrĴzcI0ƹ8RSw2KW-ϓ[+@OF~z? >+%o<>֮]y=x`~Gϟ_.u( ʥ,A‚k1!a(j.F%bM WWzȺͪ9ȧnd]ʨcl螧;%6@'MhlXd ^ӧ'չQ!3hWkڵk|L>]s OlٲRɪUHLLv̜9onAN O0_˘_*]a$)e*L|q>w*-1ze샿R ݾ}_~_~___:t(O< ???.\Rd;v[rI~VZŽ{͛r/^Hzzu,Ǎ͛9<lذt/^AʠFΧ!U[%=V3F?dYjBܙ~]cQ`H Y6޸(^CFbg7a܏. OOlyyWC_l4.zfۘsp`ܮsf;kiٕFgz-+ӼG%y={LR %qbhhȩSQW\ʕ+ԩSm۶T*@__}}}Sn߾͝;wɓtmҷo >Au+;}|hݶ=(<҇ +8\L&G\&GU_o(rrP(rUP~) ˗/ƍ9'NaÆ?0x`>SSS~w>F7|Cʕiܸ1'N`ٲe899l2|||ݻ7mڴ^zsj׮ {/^?N\\ܛnkiذ!kJgļg_^z|o~ҪJJrr_ Z*ԯ_DΈ#ToߞSNR| ef/P(vZroݺEJJ yXA( [-L2™2|)-c~ &/rٳ &GѦMlll8y$;vښu1h E[[͛_Nzz:R\6 4 77777T*<|-[[C B7\]7A1cƼt[˗ITTk֬AOOWtRtuu[.ӦMqԭ[0._L6mT)?w})ڵkҰaCWΙ3ghѢ lp- KKK,--5utt8p 'N$((sαb 裏-KOOO#@v* o7>ZA(?֜>}8r:::oY bZ-ciiȑ#t3Aȵ   Cѹ prpu~<SjFRŃq"Up`O%H Tn8:9ܛKBIU~Stq3=z`cg&&|JW=9BK?"{gG{\|ŚɔzC΁'/ޤY݋ G'\fI PnAAJP~#rK} >M_ȓeWQr:-iq @F˴-kgGH Vښ|gm&ϏO7{5R߫ɺ)0MiDVu-qEP^O[_UHrɧ叱t6֞U_b*2) PJ&vQӔ6'1l|81ZJbAyD.a9e4"2 hlk\R}sTU2W"ec>$2_5$rj4oNH2ëP&psMφHWpzg!$zޟ %jsqqq>}ol_t3AAIЍ>Fӑɼ'!,샫 Mbմ"_+.8;;ݝAQAXp9)?2R%_! .!}kb µQ{؃F0;ze LWǁL̟J'|Wsqɕ!|͑r-{Io)X8'..b>+RRɺq֟kQ̒\KҎRp;<^)}PDʉt3.Į6UmmDŽhޓεc~z7oZ ?/~1GJyP>qwwo߾8::ǠA ˂ ѣNNN_*֯_ٳGϞ=_Ue;&DQ@A h'uڪs[\]-ܢ"X[v Jm>~&Oܐ<?~KR܈t\r*slj5kQIPf:ߏL b7 ؗ9r(h~q GXj&JdEbc7?2 KzFӞq ȼZ| } eh6u91JEYH\+W).k^ѬsgQH-mLό Rx"Gl wL8mτRS\޽{DFFDnn.aaaٳBJ%'Nܹsܿ_~ """8qJI&1sLT*'Nr;Ftt4/_&++ IDAT___;w$--MJ:??2etaaaǓŞ={z*Νp]N>ӧQTdffhڴ)#׼`N> @ll,۷o'11XJ,vɝ;w8y$7odݤȝ;w())^J`` O<Ӥ֣={p޽'UO׊dRc@cxȹyÓ>ߞ$Oܗ*WzeWb kUIYb- %la2C4 :6HIjT^ ̵L \]]reu ƌD"A"о}{_Nvs >|ٳg3m4ĉtmmmgΝ9ryFaa#z¸u<`С̚5߿?ݻwիЧOT*ٳ':::|@6m8~8wܡsԭ[?-[pQk=z+ .]ιsҢm۶$$$p18z(C A[[;RXOOO !>>ÇʠA{qyΝ˶m8t$-- ooofΜSؿ? .lذ"|||Ŷ(ϵ`P3lVe|F}Vًl6* q"q&i/Վ!̪WRRRæEo(E[Rl tO*֧͔-{~Spd˻cjqBև$"B.bџR=̡LzUEs)orx-2L7C{yR1Uh¹V;Sbktu{2J_(+|2_[?wD.]￧UV\xHRaa! EE~pp0K.eܸqmۖ͛Gzz:0j( u1ydԩCtt4~-hтիGHH[nE,.T^Sǘ1c8vvvvXZZrY?~LrrKs̙3RV-_>s!00Zj쌏|...꾺?~JEvv6jRINBSSS{HLLdذajIKK{)F"pE$?Vvؑxqssc`aaAFF7o,[T333ܽ{ , {Ur^1c[6ó~6#T'x9UJNv5d9G{/umɞSIw苍YhQ[#+P=se',x U2HV ٯnQ2гueT>Gr 8vBgkSPK)O8~1bߎ]Dž:yDL('S*! 9X*ޕKy㕧p95c(+%6<ٺ(QR}6ć㑿*ԶaԀ/N:{t] 8BG}ؚaMw<}ΪTj"0sꎇg/6b~*#ը c5nnt{Achb+՜bv$lnLqg/<{>㊲ Jq>:[Ywe׻s)oxL|ӵWr *-K~aI=pcͪ7V-``O◚ Z?<3ۃoy>+++FEqssK.hтSN,[ ̗_~I6mWٱcQQQܸq[nbeeE0aׯ_gذaL< t!C@,DŽ ߿?ԯ_8j׮ٳٳ' ,࣏>"66+W.))^zܾ} ҵkW.\&WڷoO߾}L8B%4l-Z~ڶmKϞ=qvv̓'OFqLLL3gL8͛_&iӆk׮agg7 4`Ϟ=d2֭)T^\ΥKpvv&,, www:uȑ#bll͛7o֭-={/49ZhJw[-[afFF]Im?j(;L?04VqуʤH2dȤ2Ē_E( rEEiZSf̘Jb #(( M Ν;Wn6664i/s7j_~JXU*}1b+RdHDJrJN tCC ۵mۖm+/ ~L63Ӵ17oU_ZׁŁ*n' Dlʖ`FeHK?"9 HKKc۶m`eeEQQٴEQQQ̙31ٱcGeݻuֽs%Ν[؜9s~^͛7`~28C)bSIIIڵ땟M6%KKAƵt#&&FJӾзo_J%˗/e".\M}4.^H߾}EEE:t޽{9>`d(((Ã$|||8|8L8wwwRSSQ(rlž={#**gұcGСS{utti޼9S%>>Lqӧs5.\;?~cӦM,[>}|rW9Ofƍݛ={Ȇ ?ŋ9r—Bh~iժ;wJd2ⰳCRʇ~y&ZEs/ ׹؊.5`k$ t BPJ:ej0CcXv$gr#98!}& +gffRPPZ.r.\`X[[#b]]](**B[[3n8z ؽ{7999c4ihhhЭ[7֭[&rb1gΜAOOӧOW_aeeUF:T$44pQT9r J;լYL лwo~GBBB;v,>$''gggV\?ժUK];w3;vxeD"^z$&&R.s-9z<_;p}/+VcW~9zIbԚ~f)Fg+%QE R赖CGqtj&voD*߫(1SǏqLÊ@GP kdQ Gw ɫd'\=# 'O7 <<;;;7n?ϧjժ1d6oLNNϟ͛SXX111aРAl۶M-CR!ܹ3ڵ͛7SPP5Օ 6pBy @qҒuֱpB x1Ʉ.޻woZlI->}:>A888O?1w\ի\.gŊ1zhuLILLD*9wGaƍ,X PF u%Çၛ'O&11tttX|9ܼy4?~ 鑟ϊ+ذa&L@$q2;TA̵æ>LtrW^3ﮠ؀X3 7\ Lw *kK#cd"@ *O(oOA n6:2f 0[3:vٳgÇe \p7n`oooVGEEaiiIrr2 4֭[ԩSSNC022իHR ~:#H{.FĄ ժUʕ+{+}ynόӤI6lHzz:u@*@||<|RF͛7dذaѴiSzEsӦM֭[\|P(DFF2~xǹiӦt@X,իdffbaaABBfff4j@jciiɝ;wRD޽+U,F@@Gl63$:"(I?S)l)V/Y ቇ;n]]`,Ew~j W3KʬkX㤏׆&h0[:٥:9?MĻy3}Ұe.^ .T 9+G=^uVCIK94V<(Ww~[w,of.=]iPYY>\nGO]p ^Q|?/?_=G $ X0pGGGuڸuttDOOkkkD"hhhKƍ/9D1E"5D-ɉjժP~}u?kkkH$ ]]]ի乒"3335k%yϡ4dYv^ lذuҠAD"Z 2:cdd 4@CCz!'"kkk$ R>SS2k" ߡ"Ě5(ɤH (3GzFKARg9r?f?烸#{5%J"ILAbeq%?e#iς_/@yƱ@0:rc&lϧr48eC[b W(R81g-]ְ?x?Y54"^+Wy[HCۘ=ҟϥ5(@k -('D8)7L<ͬJWzO hӦ ֭cʕBp*R) K9|!WnӧZr_zO< /\*W4~@UKIJ g$nIy4Е><>mlaSʀ#C_WV˄>$KXTϽ)G.*s9^Uz\/=Gε q5[ӧM>/'Ϋb]gj_7'9fbҤIT^o믿baaAVLԯ_d@郛Vry-2!swےb@ $S(w/T}*9%א!Rr^< }3sj7}ywOEm,lͰAL;ػtš湗u,eKT!m1LH+jT14sib$44:/Q+gx+FC RSDYcK7bu?b>cܦx3QG/闖-zWv.r+O2o3#~`+}d\>I&@͚5y&?c]\\ҥKINNfԨQ&3gΤvڤ3yd,_MMMrrrprr",,QFѲeKf͚EZZSNE&ѽ{wbbbXz51c uN4OD"aӼys,--Yv-eڴi$$$Ю]; Bڵ"$$0Ry㫯nݺ̛7cڷog}ĉYb{wwb@ԲESնWåhٺ- Th軒~P()PA{zU{38zp7RTLSTX+BXb9V W.1{eɒ%={ڵksi&OݻϏf͚QTT)]===ٲe aÆO;#GIpp07ߟ֭[OAA7&((+V IDATP~}fÆ 4jԈm۶wqtt$::oooCNN瓘HZZ qѦM")))듚uܹ36669ӷo_j֬ɀv$%%ѭ[7ƍ͛7D :VZœ'Oٳ'?k׮ښ7o2g6lȔ)Sښ}ҧO]FZ7n<|P}njժ˗oi߾=iiiQ~}h޼9 , ((?vڑE3ggf#hӦ TVwm6RSSYbߺsΑKФI<ٳgߨ}AvRA_xϕ' CG" ޖWL&#--PLG}|&ժU===444 Tړ qtڕ۷o_+7͛7JgZnԴLL&HĉnmmMvpttܹs888BjjZ=PZrС\|"u 8=uTwN:u:tf $$D-#77iL֭0a/_fԯ_ ȑ# >MMMCxx8nB.Ν;_߇Դw=wtq\)jo0:Z}D: 1 u<{DR_8JB@PP(Q*40P_; Vamm?nnntЁݻs)hڴ) СDGG3rHb1AAA̘1GGG9y$| EEE4nܘ;wҢE zꅶ6ՋCG۶m޽;yyy;vsҨQ#RSS֖8ԩ9m۶‚8&L@ZZߧgϞ.jPNbcc8q"IIIܾ}.]=RKKKqssdeepB tTJv͛갎f͚QRR'|Bzz:T^;bhhݻwqrrB&ѠAС :իRT#tRLLLU_~%FFFbmm)͛7G__,ƏOLL =Gxzzo!!??d:tD"SNAvv6||k+ Cbcc_Pahh.0W}%E>D\(֋o߫w? Z@@Jb/M6e˖-888TCaaacz?yk LLSTD<2ʊ,c.ҥwB?!Y@@@@@M~~> }! ׹؊.5`k$jw BPqej0C&JY&[lab Ǝˍ7mD"K.Ϗ r 5 3335+yAxx8CPœ'OJriQ*_}S"PXXȔ)S L[􂱰__pC@@OS&#% sCȧOmaQ&K< /\*E5OMD=`_C-y8 46/}CI.Gݒdh+}*MT>mlaSʀ#C_JJMd,rKT_:UF ˸C9yX\fh֭e̞=muuu

HmF $O9S {ts:Xvo8kQf {|Omc]P:Ʋ%*Ажq a&~5vM͹41  KCW4|>@5Go^, k-80 u36V g^bO=ʎU:=/ бI+VuFRV /g/?ƯcD-[4Umy};\-ҰqwAn#q5%o"ci|эu(~+ ]?DhHedRdHR$_W+ rEEŔ˱j`wwA@@@@sΩs[I&ygac ;^Š/FJJ#{6J2JQH*JrS(4Ex]rf̙l&O\ars_mBPЭ[7233Dzٳgӧپ}PO@@?53u<`i?0'p|`/}ԑBz=(27oN^^ݻMVsΝ|ټy[7j/H/z0##4ߩSprrz' RU ]z*Delx(Jmۆ?P˗/ <<˗/CڵkǍ7ذa999X@˖->EEEt ;;;4iB~8pЦM-[FAAgΝ( ,,,1c'&&---֮]iݺ5#FK.lܸ D׮]ټy3ϟÇȚ5kё]v͢Eغu+ofժUhkk3bԩ}SL!55=zТE uEדܹs_6mIIIXXX0gppp !!}}}5jw^ =,D@@@@3tؑ45_HT2|pS>|8;vߟ ̙3%''2e $$$qqq͉'ΦΝ;t;88еkWvի|b``-[2dNblذv1|.]JϞ=quu%;;TJqq1lْyaffIOO̙í[Xx1>>>ܸqTJdd$cƍ <'Or߿'Zge/^ѣ%99 Ϫp=177'33Ν;SZ2mw/^ח;&d2b1 6T=722zիPfM !!^٧{ڵ;wҫW/qj֬ٳgG$aaaA~~>ά^GҧOLX̎;tܙ0_R_"F/BJJ ޽L .MϞ=9vaaaҥK&Mn+bkkʕ+АM6}vHLL$??=z~|GGGu5 `iiItt4\r~===FIZZ۶mߟQFѻwoҰQ%%/_Lqq1111ܾ}|Y~=7nY]&=??X222̤VZH$nݺ?ܹs{ްafffL>jժq%b1;w~S@@xg4lؐ[n:hw^j׮~}v~whذ!GҥK`ccï>wF[[=zp޽;ޞ[nѤIuI&Mᅮ DB߾}q!z͚5>K.qmn݊%c\psip̤ڵkHHH5kd߾}ҷo_hժԯ_3g &&&o<~͛STT&_}KknaaϤwc\F0/w4j#R"ȧ'1I"1o"0?xlW3lznƕ#$.MDj1*.VLgfTj?DFt21h(?߷ \/DRHUjȈxuvD*TU1͚A.Jqvv.>RoٲmLLLk\$Dn?###v^\vFFFe;99믿ɜ9sWK__=,Zz_km---"RaD@@ s-;j!"NfeV|X5?㥨r"1l WW3׈t<3U"U -/С:t(^^^Ғ}zoMXgR 0}!IWZ׌Wo( h]2J` [`PYK#cd"X8%Rz-rPiJG+rEEDT,Q(傢EE"EPD PBBڶs?&p|B6&> w#s~o3 FA~?&)n>_"M) )@*$I$$-xThOj26!Y{o߿S+2|`_ڵ?[98G3AoI,ߓJo0% j[2x\'ي<7#e??oװrz \0c@q-Oߧa׼3#WV$ۍzmɖ@v [Mfwk?4W9γ$ -dbݭH-lW{xH7'Wk[Yt-I$IVn8a5$ 3-I]n~VZ*g3StH#%[HуM)O4;ןgA 97WCL`_N xfPWLL#ԣXOLv.f Ax( xѳmu@ht\y{I1qSVuA͊gdlfrr{,f.ƹ sMר'b#Ǵ'mỬ:Jռ??[Q#3Y?Rx3RY6΅?.OxH7 sEu}dp-I$Iw282E3^Mq%^ycbGyoB`*HVgcwumasmM[>є`[nc):[ ]y| jSQΟ}/–$1#^[)D{ͧY qxm4|Dyݚ{R݆`z0F u&@}R!㨛PDN,|.ulfI$IDmE.:ӰYۢ7.@5^\C#Wi[ѭ*kV`20LMfFFCkvnjbYlԮ]k I$eΟ?_(HZlY\97~Q.h2c60{x`20 )VłjnR~B_3G碨46 $ <׮MGozIaɦl?Ռ<׫0*f;y$~݋}wbIS޳Lcy{{n8SWvՃO3TXɺWwzq#cSP 98) MB3($Itc~ s'Vr)͵9w?Dq7_ `]RZ'8ϊ؋l5ѩZab9)H[#?,Ʉ{=JJ=BwnK:qbȹ߲5(ownLB賅(zkb03 ht^4D$In(z\ʖX*WMAmO6N><_[^[!=%CjqaE,ɮ^qZCX{ảLGcxѨuۋ:wGY묜^:wQJK mݚ*82n89㇢ BՊp|Pζ㊜-D$I9*M) )@*)r+Mmg&93yܽ􍉡Љ㲞Sn`%nK;>}zӫH^^q R ѵ2u% )x֠o 36$o_й6q̘;pG!5#PuBEnt#(M]k_*|hF_48?⌬ЄQ\5tEԆˊqp2p{a0cYM z<%&1l(>{.B YstMyߏeSv 6("羠i~(Eokm[9oB(1fxSojoAʋ8?{1>W$óʻ:M 䶰6}Qď-}uƌhEW0M{IT-W1L}-W<>}5̀sO>NaKHл=t*_-~wTK8̲a iw\l%X!y C0^ƎI#i q"(UW}Y HDxѝ:0U ED'$Iҍŝ."N seX":o-|vwmtԙږyo /tk+aPY?i:P\ &zիWm_*c֭L<78~~~Ku]pfϞܹsES%I +eI˖-|͛7h{[f2fɌd`2aT 3fbbڰlԪ]׾x葊_\anjAH I5.>-W]{xiFEEQo͛?pmVZ7VרQ#̙È#8u5;o͛uVT€={6 6dĉ|$I7w2ɽHWUM_lF8S\ggҘWEtIE9w. qZB*]v1a„r?/]t;Zdƛ7oN>|8/v_j*V+ǏgX, $Ik0 x=s U>V+'7Wl`+ , $\aAݺu1c;wdժU1%G۷gܸq1c 8… iܸ1uaܸq<)SдiSqLBݺu2d7ndƍ?~S{y|rw@Z1cׯ_~s{DD^^^L:]vrʫDGGpBv_|=S$ITɺJ! zuB٦-uȁRTa.z#r (?*75bǎ\pe˖̼yԩ=[gc|G?aƍ4iҤcO8_p8|tؑ3fi3gDUU>s&NȦMܷڵ#FgϞ=={o|X,ӹsgN8̙3yGY~=;w&66ݻ~zV^ͺuhԨ˖-{eʕerI$;gA8FWl_$Ik׮,_|I6mIIIk׎˗/gfΜ́==h +@$o߾(~>cF| lh{ٳi֬v[cx'6m7n$99~UVqt=zJ*4k֌gvZ~ׯ֭[믿ʕ+K.2|pwߍgtYג$pDӄ"М4l!vzPz."S$IҥK:t]5ݺucΜ9>7ޠo߾:;;۝ 8sLڳtRw P>}9=zW^iӆC0e^u4Mc|dff,#zPPPc]}955SRRWw֭#55:J$U4EwY(*pk@䔇ܰ%I޽{y zWenݺTU&3dgn w_n]fΜɫÇYl>}0bZhApp0iii%nԩSi۶-K,ng,Yœ9sJ~I"rf q."S MBa,9$IHW]g0 L3g~ՋX8qzM8.K, 6u]s^|ݻSfMz!oҥKvg$I*l!h06@F`4], )-\K~:v纆 Ұa|I'NMjծ͵@ΥKYz5&Mr .9~mƎKbb"_|cǎ_;,۝$I9㇢ BՊpς{YtC%;ے+e-Dג$,X2p@BBB3gyjl.ތ,ŵpBӧx{{ӭ[7/^̅ Xd ׁ7mڔ@ e޼y%>g dggk.4M#..H Rh_J$UFB(^pt q&%a,V[IOvwVf ŚQ'NpĉBty*^ឆP$, q-H}g,[mc͘Fj׮ImO'\]Edn$d~ݱij@XX(w셗6%SS} 6Fc($gYY2Svu~7]p-I$ݜl z}QBWu(lV+>IXh0[ ,4BANj7}aXD6b`0Tt2r8۳-7sתBʽƚq9m }Q>֌r>Ʉu9$IReVاR\33"3Ret 1Q@%:DbavN9pPPP\߅>Ǵk!((o(^*&@D \}\PC:J?l|vjowf `c,[VHd9GM5F+Io" }\3%L~q,db+B̵˱8f]gOjZ'՘WӧUcWp :U+fmV .;COz_n!m*?k2daqC@SiFGVe0(z MMCUš+3V(h!T)C` =v\I!K7X܁@QrfP@B3(VsخP@@븮Z(sɃk{ ~ѽ Q#71e_5iO@a,;@&̣.q6lrxƳz.Ǜ?s`"P^#gng=) f@嵥m ?H!$^^qZCXܿ=G&6/)u& g~Ap}-[xEL }cįc.q/MH( h>2 Eտ9Z[BՃoEAT䶆͙4P5BQP[Ѓig\ he)n;#C\˵艢A(7|󵦹~Of9eٙ$*90X* n%ؗAd*vôz- ЎʤNL̐i#[_[oĨQMYZZly4φ5Az@d8S&Uh)ZHVQ!D? ǬeZUAMGY:wQnA0z O.gW˃{3Զ7q.'ռ~q3MNf!ssyJz, }N {mtOmZ ٓғA j^VWC%b'MO_?;)kyYrƆFw{)z =̧Kw#t :>&S+,>O`1|ԖI$˗ iBNN2 Kfؕ@-pwV6*;k F(a{^Q4hlMӳъpFztDUq8lm'G%33S_]U$@7jxN IDATբ-1{yaI29_wpM쳳C@ EA8&'o`SRE*Ct]Zra #oTh?xX#C1a"|?kI>E:T|{w&o̔/Q߈<0{!5tǥ8ScA ߦOUk>g!L-݁Gc3QPY ͪ.d{^[DE㨛gxt`X$>ߓwT%u 7I Ƈ9{[?מy 7s'7gZԋj#e?ob_DZ>S'!7A d tD8L8 Kγ$ s'>^Jȑ{ jzqK2s6IO\vyd*Stn PP7 aBMXFw^&b;Q. Aӝj{fO xbCVQyBNFvO#\JLt4læg4 Ua4Ml(I$_Je6l F󍜹Ωs9w ZLQ,N*Q0M97wc2hـxyxeBTZWGK 0:H$MU0?-S5bjQj-ץӹ:zn~VZ*g3@!DoKr <6PCy9=` KTއC)ؑ})OȎg'}`8mIʽ h ?iDҼvkI4z)~NDzGbB{SI҃k"߭6B`ՆrK"zfPWLL#ԣYA_}Y6'ҧ{Ṧwje1XH!iW:RoA=$~z% <6^oˠ Yo=jLbPh}7W-`HPzE|ʸ]ڲr{jOVxuL"#Pn0OɗR9H&MY-$geVн$I;[Q|p!S 4o֤v*.)qh*k -<āP0LrDɃkZXXs$ Gjiԛj@{@{MzU TC3u.浯vn>Po93s8NVk*Qá<%9XmO8Ca@jØO2,⊈(= kÏO)jN%v j @BJټ\!TUԹĜ׎qy+D2E lXJjcD8W< 1;.AfNmZMBVWk:Ka OY$!Ȍf9DZd?7'8~ ,wb#&Ei y]} Jjy}' ozi**ePQ1QEs<F:USQ|..$K4OmP?b Kx"h;fΊEoफ़k*|{c)=+M+r~e6=έ]вeFn6 Š`ڱM$I ̒mArrJE7ˆ+ߎh&f͚p)-k獂!_TS)E ?,cYfNgpc4|S>zUƝ+SզLx P"&˞586V;yE:<;Ӵ@n [&|i81E,H>)ޭ='A)?řnS5oǂ1XhxFc+3@?^ycbGyouamzE?n;|\/ 3){1^4q'QUpVK8̲a iwPt^'I~?yv [ @ڎxސ78˧/sa4Ҹ{_(ţ(U g%ݯUMXlG_fDR&҂{b:26i<<Ҷ6%X{fTF%߸`AgwԼ̢5qQN);U!c[<GicԿI?t S\“f\׍}ѻ|Õ;яBeʾy7m썿zzC-}Ɩ^&͆+wYOr}2{gNSvJPOɏgf|QT^fV'ȿ/^W8/mGIiW%>fM`ćNq@@s?CQEӧCs˓#<Ȏ)# EEӚKv1j G߈CSQX9}v( )yhŸO?b̐$lRgye/: >=mݻb28u>Dwꀢ(zO g0jgtZ*-l6q̹nJ( vʾ?sQԯG奏$v%~Z9:46\hZw^xW_j^x0vfy@n3μ w_gŃriSSW_Q5ؚ^v]QeU+uV/c( aҩ{ÇX-ҩ#&L(OQ (͊& e,{sT47&s%^Pȶܯ#~jExxhr*c?Ƽʥv/Ҵ~HѴ2fJw@[F#a8:' ^fMȳ߭vfW˩[# G>G$Iy |}}I 6шf(t6πmֈywTȗxyijEnU$IJlV 6!]g0t53#W@nN$I\K\Vt3nz:u&H$IRpԒ$I$I$ %I$I$$I$I$]#2$I$IkDג$I$ItB$I$I*wp8n+P ύʾ.u~dp-I$IRR5t9JZڥn I/ Rˮ}]\K$ITT&$,d&p,,~ݲǏӴiS|}]vȚkI$Iʕ}2+%/:uKXm}]vZ$Irif MPke_]q:?,D$I$If?'+~44 T TU%< s&]+w2$I$醐38v-aCQ-ʶ1E$jTɲ^f3y]ȲI$I*cs*2*33F n.\H͝[G͗?tuFE!eJdR-Kf%I$IԎ͝˱5HpU 0( >>t^}`̘m?HrZcDT^ bWп3QyeZ$IJ+3!]O$/8 =<Βrg5.R_ӽ[wb Wfw/}cb7t"̍[W~=Dhx8̓lFj +)Wl.^$#JFl 1rh*0WHը(g7s.;gSr,3qO-u#3ג$I$Uj*l_Ej6fxD𭃙%jfqt󿭋u yL9ֽ Goև,&@Mf2d6]zm]nzb*P5ͮeiL xoYfRZ$ۍx+lO5];BmEPArZ$IBUUx#2PUhW5 B @T}=jp.Â~eU%.>'TfeNE`t8P[o_IՎÖO۵6ǐܣ%Ut5g}]ޞF!~0"êrYJL EO3>nBW#NղbOpg`jb A0ࡀwOGxny05ג$I$]x+r8v&!(*z@A~ __ge9n\tzW%lUC%"nH@8.s臕Wቦih/{-85[N:ȺxlAڗX=Gw|g_Hxl@+NǓp<.ӡߊbtL+ӊ=3޶>|@jGڢxA5|0Nc ?—L|2r%+Z$IBÙ-gX(}.^:>>gZ//"p%ZaOçx>|.3箾.xi9.ņ'1??BM}ir%:o-|v I$ITŽx'.giヷѠg2ѳ6iQm+Eͤu6U kEq8l6l6;6 o:7 %8 !Fшd(7N^ψ5ג$I$]!='8'ҏABzG /SfR.anc[Z-x5zGA%3+bpF@Bhj]~|H9$I$IGkY=hT2W+L0FEQ0fzi\ FF%M[l*9oVג$I$]*,_ FblQ~~e#kI$Ir,U Z$Ir' %L9جD>˿_Iu#kI$Iʕ ;-[h6fᏽT(d eWܾ. %ۻc0 ,+Q$^ 6N#[ ^A/aN[5.e<?2 j6:/MۚJ)Y.ϲ:_sv{zFՔ\\^-?QJ FuzFW&}HzgӚ79ljkD\@%*PJ5T"q kMljkd}zN=^z8_WGIENDB`fontmatrix-0.6.0+svn20110930/help/en/images/glyphs_comparison_typical_view_th.png0000644000175000017500000005141511217643650026662 0ustar malexmalexPNG  IHDR9mDsRGB pHYs+tIME!苛tEXtCommentCreated with GIMPW IDATxw|^GOUzd[r/c'JIB %eY^`]X²˻/mB,l -$$ؖe[͖ޞr̼\Yپ<}[f93!G[A9=AA伐 {PJ)x$Op]B0-!yB b^zUPυ<a; HN5wTdBo< !>D׼n  |:6@y^8$8)BW[/KB!E"j %JP($KDlgAr.Du] ' Oǟy -ڢNoZjqU|/_U Hk%@wweMo-\i-JpEw\M7~O kp/jLJ5[A\wି??OC}CC{8;PT*efҍuo񆈕tsv卵?/4-QD$I.8粬zM_f cM(d )$Y5ŵ-NedMCeb9C-_sY(3tu;e:(eN"i ! @* Ar11816M0Az .8|2O9cr |(`qAˏ lbZ_S J9N()-MҸt9瘄 9.\p.do1Ӳsf$)Z@BW9q:!Ū7\{a ѱ!eW9mcD2_ѻ^/֮.kѳhuCc;̓Vt>r^S^ <~O7Kc/stai^Aߋ-1ka{fr'>WÑm/׶6-4 YC`G:GQU&|bҩh$ilZvֻ0| ͗z,. ާ1;3[gSTUroA<\|;:RѶЙ?иhՆtg7B9mf6̟\hl07{b8nd^{AH(Lq^VL;Ŵ3Op ) ~wBO>_B v#K|n _w}|mA_3{?O_?.h ~?"S szSC%%#(Ћ̷0/RÝ~;?lXs/j T/{=]㾽h>_< `=xwڲOlmFWm~G>P/S{=?zh_x@5- qd 2 B9Iѧw^r ~^/_*>/cW6[M _vo.t; {ݗ?x.zw1ʍu?e+׮~Z>?7%➭OiP"[M%#2 B)$v'4  @heWᑻi% $ T,)h u[-_y׿Sۙ'{>p"`Ƥӷݿ3}o׏{ 0AH}w7,)DmyLAUҁx=ޙ?T4UUr]yRp[ _xKSe=,.-]t᯿ ,n \|_UWP֔hU X? ۴~zjêyaM)zAIUSXNO)5K.XNj~}SKj%AzFUK@֔_PZ~9CU5 UQ 9`؈i4()p]׶-UUKL>3+w߿Z.4ޜq/?|ߟ"C-\;Wow OS9gaQ6UjnuSm <WjAFAP(AP(AP(AP(AP(AP(AP(AP(AP(AJAJAJAـP"E B B B B B B P"P"P"P"P"P"26r\uǶm4m8cccJ (***,,BP(9GuRm۪j&Iaa,v2R%Oav[[8p8׃:B̪8늢躮 1ՑD"9㕕x{AD2)DΡ2P=C/XFe40J$SU0p8k/G\hQaa!%BL>?f_WURUUJCBЊ+P+ѣGd4F~>>YWWjHYb4ie L? bB %DBSM&J#$F TN)UCR:>>^ZZz,x<94m``@y+{L Q6)[y@@DAS@"&t 6O0 80G$m~dY<8DhQhmTF4Q(J}^zgN}}}eeessuO7 PQ|tj刁qvlX8TV3hԘn`W_Q#Sv8 !G&+zXZZ%GF/x'M6t\U 6tvvJwڵqƜ6p^|(`C 6P$Չ,C#ʴT5ܭGB"(!!ӑ%X)oX.@Y\\\__cԿx< p(1 -n e^QTTX]]J:(yj!,; _0W,yI}y{#0b[,Ҽ$I+M+6tvj]E(Bիdr.BP"AbvAA| ,** 4mxx8_0b4-*ezkdq+T/ӗ9(Hh4:On"N%m 3(s B7Տys!@ 9P OZE 0PT122/KlBHQj{l&ROF-XBI@k̹rEDr?>> 9c!NBFDss<͜XXDL\z(2E(&L(HYޤЦswrat: ´=At,SJ<&R^J9GE1M3.IXH](Wwipp<ȆFA^qm2׳Re69[AA&UpUmLʄq!Rp@'<{z ]NB '<7A Ŏ+?ɵUVo_s*+z#iɭ\!! !#C#2K%]߻qNP( O6#l\&O8a{q¹`͸% %E)PDR" (!+&<L~U۷Yۙ#d2YXXPXXDrH&`c,DZ$-8h Q$UH Q,Nwa~,uwT8cYVVrʩ~(D|0Dt҈$K^gwQ(s68W 񪪪5k֠7mmR$SU!o]NUCYq@$,u}ƍ}X BXp=%Q ш.&"/T(ݻ77dcccqq1dϷ8)/Ia'@r~@innD"ۮڗT*~YE娷C #4QB@`P7cappqM2B۶7n܈dnY;ۜmNX'Eʹh?P[s-s IDATS*a,;C3euRbPk=z$?i^x!dﶙI^, w ׅM8J$89Wʐ:66i&T\a(,pfj("r<ea1`\0.J@"@%"A))HHHH$B&su(2%D U!BNwT,JXR*?>Ϯ,Đ!HrǠ L DWJaDtֈC#YVDړ(YA___Ij~b:JP EH%%1Z. $] ,y.FcP(sNw"Xj:9V+ĴPRԕH%q#Q@!ǎ4-C*y… r۽,zR4zeu ӫ@@sҶmuUǗBǩ~;~/"A`,/Y6U*X2ɮN2P%s}9p* H/UnX1(62<Al8iz&2wd$v9`̔*6ip/sJu/*limrm3BHz$<]%F ҃Ly|Ĺ%!3r{G0 Ϳ;H&|n~=mf//|#+/[qfL?eY9S(s񲇓b{X!DP;!m ꯎ?=%߽J)wnʌ~Bkbk&p}Ża:c Gl_|]__Iʛ>WuVޖ/gv eSS)2 `ɛ@q;+-Jϟ88[5Gk[}̇.YSu8g~cCxFwH8R=A~xa֑$wK?;߼W64ʫ>O,JqrM7 ӯբ< kE-ɲn/Z5r[ۯgaLApNmhְh;; W^pN ZX`[imiպݫղ_A O|r~WR$)s Ru~)9$2*s>3kbE_{,yF$8cÿfإ$UN#/r;yw|򋊢0;?ǜd'>ǜdç䥓w:4'sJ[vOs< K-B(J:64e9'3R\r@gPry?J=)ٟwj`mڦkn<+ f݉RgN>-`RQ?%$ImJ !dg DcVA %\ƼُS|^9ex`c3sByӍiq.B)DuMasPEEqC۽c?%f:YU]y3Z[4d2GKy<0uZ(Bʂ¢9 =(״TVY\/hF _I9ͤab / nduˊ,vpdH+UU-((ȿ!+~J1&A^&0UDu}xx8/gF^3'\BBB -)FFFrtPJ\O e 2?cv~,˹+%EkBB9p',񮮮P( ԕ/ | dţyfN:Jrל T(AW82)..\s>>>Ӳ2͜F9}XD G_J<Bpggg~% !<|!@W H*$ǰs ssN-o߾\7' /3B)˲nSL!+4 52!$߿?׍۶<qj:܅M9_c˳$E|OC+u]]3gT !JJJrT.K---h40L&@z##C^uYTW֔/)_^STQOch;O~Po6$ԓSXQN4ÄUB޽{p~o!Is ôEUc87}OdJ]I}^hXWe!@3 !C "234jkkDKDvޝS”7r3.NSκP*Ʒuݲ#-]z ?|oo7={_<0p[v?~'r33 u=s;q%ѣ9ImmmTmt.=$m?2Nc`.ط>_noJ#-?< 1*I<ͷկ&!0MKմikF1M0$ӦT1dH;"Ӕ9^qZ[6PtallСCc]6˔۷ogy XbrɊ e*LIV2m&P߼Ɉ4&|P$STu9OScccHid!ƒkdi92m$=:gke: wڵtl ˲|;7,/-۬7ﲡx3 %Jac|ȌZ|,(k;W244k׮x<*)-lG{̴ͷ~LwҔ@en>t H,WWWKR#Hʕ+A&D~ے~_/Qv4$D zp2m;s4i(n 0/vd2WSSgSU^|E +mϛNۧz(ῢr%!4DtJ) #ϳ=q*=:ynow`/Ӳą"̠PB{  K ?,*WVgnZjΝbCtRcYB'h4:n`iii +k喣<ٳl2 ʕ<Gf{:#C,"VI w]9bWgo{_nQgZO=U5+c%K:::faaڿS0(;w/V%]v_h48ՎpLL*ڵkW 7XYYYVVvږN}ũ(ʀ*UON-,/[29o~R=,<={ٳ^z6tPōY%%%Tj&+'MKߠ۾}%%%g~m#gfggh4=+?ٶaÆ;9ɄWX}l"3 eHGJR,~n=\ a6}c,iAb!ZV 1#}BPJ8%ػ/]Lhxm;܎4`(4T$xҴO~Ӌ.lվUm|,otO`/ŋرEk6Y$vuuL׼TuOl{$l\B)DL@@% !.[ ;u?_}a]p$)((0n*NRdRP(]H$6nܘk℀"Er" bBXHcqDt)R$zxx<D/ maFh %H2a5K&ڬk~^|Ibp~53AW{sZim]^foK/׮=Pk{39b_ O7ӗJm={vܹ=y/G[n59 ظq-[f>m+ x788B(iԟmp~ƘeYI$˲_97Ϳ 6qϓ!\JTU&tbH,M=UEҕt0Qv̌dy[y[ |C˔~̾~C]ͭGؑ(?8_>[IUo~S{g6?n1(t{oWիPB}_^,eL&s^MR!IR(]fc1u]eM$IR8HdjMs{OR6me9U iplBWI0T^#)~V-f:m#@؎繎8>]]3Ysv es.v1 izg//-Iqlυ+4tt(eB]֢:.q1u;URRRRRrrۏ _+!;hN hƘy7n'[r*T9kBB{q5=~+SgSm;%٫rBQݽjܵY՘(́0*=%!۷"IYWc#ÚᵕDfY 3˲BE]4߶7AM HNtd4%T>pu<+--6/QR!^/D[my3UUmZbn`UU7lpȑGSvOe+6gA,{+e)[\J[X; .QgCE]aS^:s/5550',Mh2 B_|z5nGw[UR%ɸkՙt$&r7AG{YcdY :::$IE%2JrYNCZwBZW+DHIK,Rn(4Ҿ#P"6-KJJ,Xѡ(95D)IҲeq!9 C;.jjw+릉5Q Mܥq)sP(D.,XPZZy^$k%V%K]M"2Ċ"h. CIˤDڰXN q/%rଆ!qH(UU}ϛLFc+WGBt]ollqEQ2secZevAAŋ VWW}oMR FRyg !65j҉ɼE PװK_?O'cgw-~6Qzݒ._XJ|$INE\KNk9iz4(**(U: :1> DB*W-M<.,G8uR%rCTubP<ȩ$wk+_woZk۲ʔTxTz觏78\QK6b~ clllltt4T*SEeY)Tl2o8y1JaH?| )%L^T>m1l$]DŽc/PD(Q$*+4j-RT5Y3J;OU\0δ|37JbAAUYs/j~,~ͧ>vx89HTTTw~&t:mY8ڶ_x-P SM"H(}~mFB4Sn76o_`3pf*뙦9j䄼wy`嚒[Yo>ޞ|*Q?wt*Zn|Jg{_R\@"̓X,vЙ/gv 3 {++VzEx-Gzcvx 9̈́\qL˲E}$C EuN)$r@!l< ^RڼMTQQYS\RQ.2a*i֌c=DCU0'myte% `G:GU(q(8+V_pss&=M]g9264 AAA$K!OofN*9>>:2-4A GGj`dxptxP*^٭:{%U dۓrr`QR- yzŽoHkSr}+bB$I RI$*'SB%Rrd|J%Y$4Nm!몚v+ǾŋIּTzwabIDATHj4biU{W6YB9־q7y,/lNqWֱ}0bG^>Bdnqg3J!p"l{*2Oo#V4dE^gn߹iqTV\&; 2!$@Q(]3޴c ϹBk;y]7o0ӖQ -%D g3PJO'{3-9W zB^ko*͌u.yWޣ6ƍWYw^fõk6{6\WxbW7]k̉RRBڂi6 ̡6zDXTTbSO{ Hnqu_P(*'6`ZiKݞ9/fE$ JJ(dr9pғ,J A %J=,B% Aķ()H  4m1BIDe I(贐EJA)%TTʴB)o@ei]c'J2-AȢ$i7{o}Kˁn͒$88J׾- ¤њu $6), o;qʪ,Gwzxc$\oJIEe嗽?ŋo9!M;z,W/w󩣑XӦ-)P˴ly6zVb2[RtrNNB uV(EV&oDV>x-A y PPP1vnAtKne Fno?b}{~_-jO`0m{Q_|&x8@ ?qRQSjqeEħIrxVǹ8d83q.8cVr!W(Đ\J%tN!j.4<|PJ$/PN'qh'v&BU3 l8h́0BpϴIQuUv,9˩0YnymoopEfuT M-8sat: ruɒŪǍL9{5q'A(,.o#OF̣K_7*Y9!…u !DU5UN,{tw^'kGH#EJbP(j9G%bKm@[Q[OX_mT `EQCHB la7}}IBvKgfw3;s;ソ)i7!k]5v{)]mz].!.Rʠ2Psdu` N c&c&' RFEAvz܁ (|U:j0uQG59rDPH%8a؝[[['v=}GIXr!u(!]k~MvםRNeN(aB7h6z6E|| [na L`"FE`/J,ٙ3Xh~oRB1oIg_?c*#0R *{ΟϬIGEp\MZūTՍ?O/J$;zUPG>Qc<-' ”  =P&PMU R(!=CPBF2PA?(e bCԳ`!QZZZxW娓U3A02DIQDQ H{*\({U2;-u{rz9rJ!Wlu!|[I%'h|\v~?g.4p.3Gҩ %_cLM\(9Nju5UUglɲ)9u(\(9Cfoj_xoXkK dtMIJI$YRz@N\RB?E͜2zޒ*I;"$B?Y+lrbX3S}QZ.45jumq]oɸq!]Jh,E]*sux\5q}| O tHub2ԤiWJ9,"ƹEo6llҡ>@O'&˻-SGcǴ-}£4i#Kˢ`ɉ4yrIf}pzcZbKmʔ`+y3Bʇ򻩡$W<~`)I9*zT|o΀c>(_4DÕ[pfO|jfxO}qӂIDhEt< Iⴧ6}k k#̪ 4*iek׮˗=鋈(B.U?掿׈(R2-9j[)M]Mׅf/uOی?C lD8VB(83{:wL<%f7ew,{- rXJ(4מQginjcb]߯],*5@JH~ԒwrTJ5 6y5a@iaRei 8PPb'8[@R(&L4"`qD0ƺf͚{`M!X$Y s+IV{KP}P歓lL3uy.ɟ͙`;6oT.^haeS%}P!&IY!>_4o<%=QcYfus讧u͛}KVL!_D)KИ)3yp{4 Ög$bW:)-?ޕu}rNU {3mA J^]9KO% 1r3ģTem3L&eÆ (0rnާO%DE -T,?tׅ*+6zYPvɥ ʆ Qd?١7OJ 6YlS2-~ Qr߾|O$EtWRe-WOkeo` LjziC PXr`~┎.eAcJ%BYkXQ^6z8{eEٵ~7g$s=?q$I&f\^0J % 'C({X" l_:A7=r(؊~]Gp}c]׵+L!a ($_^C"7tтWzFIENDB`fontmatrix-0.6.0+svn20110930/help/en/images/font_book_in_evince.png0000644000175000017500000043061111217643650023646 0ustar malexmalexPNG  IHDRAL6ӯsBIT|dtEXtSoftwaregnome-screenshot> IDATxy`T?o+%}_ @1 ZkjbinU[ֺTZmkeBCv}%3I2/%&}{{w޹*`i"vD"H$36|yI"H$D"ќ8"v ³fN3L`D"H$D&;\b:wX[Q c$vnGd`Mwg4[(W_ͷWQZtH$D" V!ܼaNI1E<[-ư ]QX>۽=][E87(5̚9M :w5e8tX,1 L6 A߬Q-H$D"i;| ahNHvMueSAq E0~޹{Ç&0t]6r***ÁNK.DFFҥ>,H$D"ՆW>UMAdq \⯉ c,kƼdx  ""'v^s~^8<0n6jy雧Io3/D"H$# o|mq*4 1 N"##M*((DDDf EQ4=jmߠ=…c4d2aݛ8WDP.Eae3>hBFHn 7#;\kK:xq`s'Lݘp nc)dӧ/w6Qlu}l3[Sf^/ 3);@-yG#&WC :Ư. 7bFoʡ%D"W4}!WF-.>;(4{ԨTnF,^.J/_ּnc+  pzo޼(2&L[ndo h6(d6ؾ:eq ТgZ-MύlL&0Lա|P4;>滽n(c&MtN]GEe4???RS%{>C@_2-d)HDÊ#&#8>L!󮢟C%I!߼]#7OL-H$DNGګ[ԍ+׃wL0^1¢!w2a?EGGҥ_5+ K/r8~_!|_o{Cx###Ww3lPj6|w}+\ץ[<n)dK `28{,B8SRRv}J֖-,[g޽9?HʑÇayp0q!`mc曯zFglz:_q$#hCmjfˆ`0`LI!lu W u2a?Ҟ3o!JNUq3@@ۃX["/:dRܓ.q~':p)4wGǮWoW'M`D"H.t| a |~׭sfo#엇{K&Y[WlvG'OoVQe">>ի7rA~!pk Êh0Exd֖1 cZ3g\i.^@1{1`s͜LY 0DE%q } ֵzu k)50:'o>*}_>ao_IJ0*J$D"0 >~?3'L" BQp.ؕ_VNVu͚ɦJ1f/I9j]nO{_Ko&(?jf]aVme/&/s_}F@_gōuqHF'z Ǘ>]{_P!gH$#  /CЦj b/N 6AY$qw!62k4QSRe>ͧZ=#18XO?b.@g =0ځlÁ1OٱP f&6;V/y7`0T:v+V@3vK$D"9Opwm_Da)|xs(PI= XL0AϽ'\]Cqm@0EHJJ pBL13+qOqN} ހoߦA^J茞QӆD"H/~ =isXgsep=XBQ,zvl@0ˤ국]"H$Qt: ,[le|Yj4^|-mYn"πp5wSk("pRTw&g ht;Vѧ1JuoU0&ҫZ{o]+TwD"H$Ia\(>iDM.o?8M N"\+S G~db*{7ꋇ1r(q ؕ󩨮j^bI?eë,[\SmGTysHM+H$DYpkʽOfK`ݥOLۯab05?:Xǹg|#j8s(O>&bL֍ы~|z려%n(j˸| .Ig㓯U)P'q#P_Y~چ.~zp*/o؝Q) ;I&p.glwCr՞,zx;&LG_=n0%D"&-{Ѕ{UMv gǸE~ab8ޔ5Rz=]9Į{2qÕK)k9g"^} GalRE$nd_DN\#b\E3$5ݩbG^D*a1CC22:p!$2+o,.3供V.vU$H$D渦Ok[<4˼u#R(mxO N%k)4 6n O*g{N)64wg,*c(sq ԕoRoT6UF}5yq$d3bd3a$2bj TcFLz%\z G%;uT^FTԫ(_]L{׋؄tn/NUD"H$I;bh6S8nƵ9Po[1˟yEHyzyv'XxQ!=CdHa:GZ.RaTAzx>هG0) j\̾fN@w \u%Z)rCiD4gp{A RD"H$vD$ߦ<E3{J<*Os ^ѓ8"a <fAb^UN ٸ?)3&x` M/h.1cNr838T/ET\b\(zha:ͮM^163y6{]Gss ݭKXK T"?#?#?#?^pkm'\L#|vTsuu0eF| .}~"c㷣y(Fen&n#w#d)6a$\1]OìC]rݏ a`evW+v5y}Eö+,?7XzSOD"H$PD1Sժ&W"#2Ggc4~%D">Fѵr xŀך)y6o{ѩ-pfPMMD"H$!et(iel}y6$D">Fi[!,H$D"3[>M"H$D"9BԐD"H$ C"H$D"i7*+*;ZD"H$H>m@~D"H$DnTTVaΖu.D"H$I띃D"H$ %D"H$rP:ZPeXUJPWAkZER@QCI pN}$*NUjE[7U5z IU5u֪l==Յ&oEsSM{yd ?~mhړUYKQA4ZYR* A j4P޴BE:U\ Q }݊* 4r87-n f Mٯyt;Gä-P+\sC~E=TkOMj&DnSsD!ahCm/$4&q84 FLh ZVvfj/n j }-ތ ma*jGKUG󗩷G UTke-5z}6Ox8P||߈hRRgGдVt}LڼUPVRMڲ`w WH=ߖ,LL%mirW`2pPDqᖬm!iԁssyefKUcӚTGFt쫪BZ{p8 !t͊ XNk4;5_ O1!qʩd-tVv.OZps}I{C#Bmu|(NpF׵"-c*c/گqq!FyVߊ)(BUeЎB P&11AMBPV^Auu-BmиCC A҉bF=h*Dj.q5P@h se9)ж7,*v aFbcc(?[a~)jQU]b=onV0#]$#סl/ׂ1RLILs:OBKbBx EH<{ixcL)@(WqCU!3*Aez^{* aIh"CE#ىQ㩛 2Kpk_hlUޡjeٲk=pt(x(6Q޸ڱX*U1*!db#GUZhRZ)aO-jzO9d _D#-;`E;-& ˠSSQYEB|CM0DP ˧(]GnTuԛfhUsr{ mNa4Sqx1Θ̎V9ZhH"Dt+%HyHbI\*SПxĸa.iK\ҏcD" !x1[+I1<e(Zd_5^:e-ICzȇD"a6p(&}0IbB @_UAޱRjԙxt B2˅zCn\nuѨm1 ܗƈ#4lu 8QAK*I\ T%W rrvZ.FEV>EP\ӧ9A bJ D9r.L7Q,Q5; Vd`.M,}^ANc2:_@CZU5N~s K9ft1 {=MXy̫&/SP`;i ئw0nlwmݧb)?m% CϹ,V< {j S\4ܗfq/)O7L`գ/>@??Ö(\3M9CTI5]JW#A3sN4C*@Xj9}`9J9%@ ljG2_Fc 0 5Q7hv:m; `;> WGeGѺ9]|r0v̕W q#kkZ2@ Omp$eQ ӻBctJlP\g`7CgH#yѠkf',,!y)RG"Z1DpLP{ 81@N맱dnZ2z1G/˒'W0(7SN c\&^3蝟p$ *4s~ o ZlS,9EgS"|M\ԭiw?ʽ|/8j |P`7cs0Uω3aOiq"FS.ᖟ_Z'dfįAA߹=?j{ߟ;f8++` z=Y[tƏOgml|lۥjj+?k$]U ՍSZi T,ZhFkFjߝksHb]z!q7%C8O;'-~[uf]Aԩ㩪zN.qlۖKq8\2p[RKLɌΠi}>sqFS8CC-om{ceܦ}#/C8ialJ~35v\͒/?(?@ߟ`%s]|$0Ĭ}$|؍,i.{0_; >D>tcڱ k9y{:*U% ^Cj^_ nO?r<0n.Io[o?9nOrgm'e0jH""ٚǿT`B:Q]A>HM᠝!LJ+:w߭ˠߖap &e|X4ѕdSkan=i#7-5&" TSxr/<[S:@OfL w&Nł掫{} }'^cZM74JYc,&r ix >weʂN ̽z! V]IQ%) z:v@`G  uc+DAxg-DĥsoT`Ai$ ۭ 4R+B祿'ú=AI\=˧"{)LrƉD(-IlF&eHڇPuwFz;w`sɡ1ko{pfdrj= >:`QlDsQƆg{xsx+Is-s^ÑM)A7#mo%-G} iA\} l~VtŒ?;e !MJy#f4˟{g IrK1|4ݭ;x̙V< TE̙]d'n\NfxdmI*D"k\[bs Ns&ؚ֖c_Sv(GAk\5>ZQKkyyD1b8ƏA1}xTsaD N"\";y*PŌcac]=h0iSScFESI1Y8:Nӧu'0 0`׉.x(:EѽWa^Duqp'A|:Nky΍D3qD^wm_fVvgnx!V|S]yirom#8K9~"Tr>Mn!ekpij9Z].- R%VeOi[w:ۜ-&ch N@3jpqf &3&@~yQ8K+\ E!<2JKZLo\|%H*L%("x޲zUD,\;"4|e+JoT(!_r 3k3l]b#|[ BmmsZԷpOS^MƢ̯DչPx)zah5|i CT&WGT5:vu*fYw*ιa+; 4=55ȹ!n|>%ϹTL CCm Sk -BEQcٲ 4ѨZF(bZy׉w-Ru i(ռKDFDOnKyAI;ʋI'*4TlMC?kny>j4 (Te|V}:4P  R(9Ȼ&uee-l~I8ƉBMa $F5جrֈym` JֆPP.IP{I &q49'6hZsjEAדҫNjp8B\/k눌lG$ZP_Wp8h?y&>dрlMth$Ppʹh.4܃$SZR*H(`wA]z[4B8;[HBi KBimvѪHED" iD8'y1H$DrhU‰M*irUf3)XUk7bTgFgz̀:i^l;ǎ# f _PB B$HGjZLPsj0Ä{SNEt+B8_h_hțI [ИQs=)DCYV$4VvΉTMj9Z%t@\לv35C_8dA #Cu]orVI`\WTG!:: jM'V9+#\ȰbD"H:-GXkحE٫xz㉂rS[*Plu+uiWڔ/$fVz[v4i5zo&]ppE(xԠ<&64t];%*WH\T"z9Cv-XnʈQSb%xk#TB6H^LC:JhPynjeh*:;sݛʶS"j+Bp*N"-!EӇ04"17լBZ(]k-ʠmfusljU>yjs@_2QTxPMo'VEHTM( ӧwsD"H$IvN0kD"H$D.|+tr9RD"H$ɅN$H$D"PGX"H$Dr!=D"H$ H$D"\<D"H$ɅV@_D"9_yhok[D"TOC[YYؾ}{ H$Xz5FP'[Ls۝KAD"qҙm/T,'H:+BDH,qD"t>tgFNl#rD"H$DH$D"\H$D"\`("=D"H$ ][M&H$D"ttH$D"\p(vD"H$BCtrD"H$ 9XN"H$Dr"OH$D"\p$D"H$,rDյ,k6SI$I :uWB*lV+ErdپrI|nakv6'N 4£G9ST8;[4f#{vcNr ֮[Ǯݻٵ{7555%gKVM Ofyt4GRUUѪH$܇TVVz h6mjHN<٨p-n9N}}=GU E `ijkkIJJbtZB߸^WPj%66))77/FbB}%..RzAӇ'O;%6t'bbc}ѣ(¨#X,@J^tţ{7fҿ_?TWdO_7eeehtݺʮݻr^zJmM P^QArrG?h$CjőD~<:WUU}, qUѡJXX:spmm-]v`$CSEEGGcFfqXV϶]q8B׮]lDz9=1ѧ TFtf=zivGfjFITTVr!t:F9swNUu5C}uu5=] 8_EFFIXXl6{$nvIdd$5 4ȳ[fqI TWW@^~>F(ĭAɜl3PWWW˗s1Z .`I֍۷fIhlaBF4@4b`t7 JXXX+J^G7Uz0b"]|{ͪUTWW, ?OFF3fl1 ;c\4չ8q4|EBp+XQVw6fFۃM&E 6CDƨQ41%7[nd2u>};c۶mM7 dO ZJo0nKp:, v5 9XXb_5˗/jrA˗/>]1MmENNNiׯUVZRSSCYYYOUsرVܳ'>r)//3uYsm>vo=a}bн[79Yػw/7ndڵܿx1/^h$={wnf3X{._gɒ%}ݔ>mձ1999WMӧOv?jV\yrO=[L݇}ݼ;笃7BƏO~~>O?4 o7v~ӷXݻww)Fj%;;5kִ{r|1k׮n3vXvڅje̙DEEfl6SN͔)Sĉ$$$ҥK)**"3 }a0dÆ X,&L@NN111>|vZl6f+W]]͆ 3gIۭYX~=&3fի1P\\LUUѣ߿ܹslX,Μ9ñcǨdȑ7?~\T5seݺul6СC=6~ٳ'iii۷gb6۷/ǎc 0?rh42qD >|8TTTЧO֬YngԩX7n9Ob0:t(=EEE;#G8Q$&9~Ŋ1sL >}p8zѣFvv60rHnJee%ݻwo߾$&&˨Qسg1v֝ iii;Z InfyZLMM f+{Xl[nEK/'|BϞ=O> 0o7̉'Xf ]ve֬Y?~-[ЫW/233)))aժU 8)SOi&E]ɿKz[(DEEѷo_L&#eee5嗢(NǙ3g}͜;v,aaau먮K.={`Ŋ(e]F.]شiyyydffMqqbϞ=̘1Fnn. ̙3+W2ydgLnL>ݓϪU0\y|2c >3ΝKdd$_}B.Rnd!߿4[laرpNjz!vի9v^{-;v[n￟Xӆ餦RQ^N\|g `w7{fٲeޓos!))3f0j(V\lja޼yőٳ2e ̞=Rcǎ۷ogܹm;wK/ٳDFF2g3HKKc͍ʴrJϟ̙3o=Ϝ9sؾ};C/g0sLVX ۷/"%%Sw}GUU%%%`ۙ={Omۘ;w.s`5-~O<4ku֑Arr2`֬Yf۶m\z:t^UUʼn'XjӦMc|wŝޛիW3|&Mw}G$)){vOMM%33i&f̘ٵksjR^^ݻ;w.iiiSSSٳ)((agϞMjjG|=zI`0я~Ę1c%..W_}'b /p7멬d…#iDEEQPPW\j=v'ҭ[7t:G!##ɓ's)N<ѣ`deeQYYɜ9s=z'E]DYY#F`֭lܸE֭[IKKcʔ)̘1\|AV\ώ;|ʼ}v9~'ys NM)-->੧b̟?3gp5PRRkoիYz59/޽qTTT`\|TVV2~x s^\>6ơoɞ={رck׮<^;w9p?O<| =OjE]Drr2/سgWwexzZOyGCEEEFvq|<#8 9v~;qqq,X,YBii);wd$$$p1z^1t޽(y#vRfΜɕW^޽{ j8ph0`4֭[u)_RZZܹsYz56+?.T|W7555v͗Mii)k֬~wޞnܺz4x`ˆlvڅhlۋRSSLyyG}Nttc/˭;_7***ؼy3k֬G۔fիϾ/W2KNNv֬YC]]B.bk6oӧ=ܝ^pØ1c(++رcY&`̛D TWWvZVXABB/&G(//aÆd233Q<.\ȬYشi&M`0^K/__~L>ѣG ˢE0aL<'$o%77[nt* 7ԩS)--%::Ν;7n Ǐgر1x`bbb< z"""^ .[2Zf͚Ebb"sfܸqرt>+ŋ9tӯ_?:ʸ馛X,PPP@TTCK/GfƎK~~>dgg3|pYl -Z<ڷoݼy嗉aƍ<呐ѣ=oM1"??qQ__Oaa!SN\ƟikΝ;=9sbXnd;vѣGSWWfcǒʮ]0\ve:t5kDGGSWWcDaX<t$--3{ رc6mɍeee-NriƌCiiiqs|h27W$yW9r$C ofΝ&уzjN8AII ӧOf$j_eeeXV}]RRR/[yg())w+uR F:z"bF]R !!Bz!יd2&Qz-{̙s: 111DGGUUU ҁccc$ r^*kdd֭mϩ&.E022TTS-͑H$bWW/^DMM@ihhؘBGGGĉ)--%??LLLb@011]]]z`pNN...ؐK[[vvvB{o>^y“󩭭z))/Jhii1BTWWGKKKr9H$(((ggA;[ZZJYYXXX(+J100&L&# ]]]puuEKK 򨪪]]] $%%100@`` 0rHr9`iit^zz:+md$%% ]FEEǏАFRSS=z4CRZZ* hmm%%%!nBOHRRSSgر8;;S]]͵kT8K.؈+NNNHR:u*477seLMMf̘1Opp0---dddͤI 996L6 2a)yyy2yd􈉉a„ cL&cH$000!h ...CWPSSCII &LK033ח.^HXXIII8::Nii0vQWW'aڴi$%%FKK %%%)-ʢS QߟY>PSSFFF̹s022bĈ2qD:;;z*OnܸuuuRVVFVVXXXtR6nɓ^|n|}}x" /\-^^^/𛖐0ٳgIcOb ,"]򰵵S!ٹq1ܹ:ze.QXX9D~;i ]/SrfGEDDDllڴ'/"?qmF7$"""SQQVWW#ɔ*׈LOOO]&qa9‘#GUy]tuuW_cA9[}nzn}믉Q |C4voΞ={x78~Ҟ˛oƑ˗//22RXg0_~%C~k6nȲe~!"w6ԈLqq12J%GrwxdL>uuu^J]]ӧOG" &M"++6IJ݅Uxxx(I JASSrlmmTIRΝ;>>>Z1_xUUUaիWihh`Jebee#mmm$''cmm@ll,̙3G3j(Τ$>}:rl:::֖ߟΟ?O__ӦMV 777?]ErX$=:;;ӓXab_uujWWW]FUUrhiiaB=---δiF0Q .+//gԨQ y崴P__E4?4}}}c``@{{;FBWWMMM䡩4,--qqqA&q찵%++ UUU$ IEEwkݺuC m+W奤ͤIXr%O<R^zEĵkpuuĄ\B__Ǐj,,,~:!!!ttt6~~~rRRR066\ΥKH$;]]]FGGo HpssjܨCEEuuu|ڄ1+W`llرcQSSCi- Yى:D8W7SPP@GG455 TTT닊 X[[AMM nnnTTTPXXGV*6655#666deejjjH$ƌ ^Iyy9XZZRRR"h+>3E_=zȝ͸x!jjjhjj"hnn(㉂9s&~-0h;c *++$$$/f*++1c ^\\̬YHtvv`R!Maa!(;vf͢!yE,,,pvv(4555k֐jll,SL2Nb̙TUUԤ$KBLL 066$,--4i'NDLBZZpAAAӧ  88H())o MP#++|}}9z(!!!hkks5{!$$<`Pwƌ)))>}gggF-S3gחx-cǘ8q" ϝ;-Ú_dդp)|||Ύj\]]oŋ|G̝;4NC}YA]/ **XfΜIjj3uTXp!fŊDGGS__ObbR[d2 JJ<|B_~%QQQ۷T@.l2:4nGG$''s|}}innLJ6qLADDGUU7n@Xp! ߿~lP>S*իxxxPSSÇbdd999ٳ%KpQAn׮],]C ?'N`ӦMر,"&&FnEgNNN8.r!·HΟ??9HA[[QQQP[[իWАlQSS$ p (**hu%JFhjjh@w  $ jjjw!~'pJUMMMTTTpH!!!$%%qI mmm!"(3QUǓjkkx"  G]]qqq+I _hjjNqq10)hKrr2\|Y,+++F=UUUJ"##|2eeeߛupp Kj 5j`7-"GA]]*VZ?Lrr2ZZZ=zTpm311a֬YhhhpINNf̙xzzR__ϢEؾ}𦭩ӧOΩSR5k+=$(=== <<]v͉'x'HOO'22uOQQ㏳m6VZŪUɉ/Dyy9cdd믿{ァd {nDC1TWW)ݰao&7nח>]]]XII W^OǏSSSSO=*>>>|BϞ=[UVP]]̙3 FUU^yVX`4^M6h޽L0сo&L{CkjjXd 듗Ǘ_~I{{;jjj,ZZYz5/RB1#rg!·w  (++Ącb~~~Ɂ;.]B.M\\픗舙aaa̙3~3gRFŋxSJss3---\pA̚5Fjjj022 ???yΝ888ȑ#QWW'::{4Ԥ:8p>>>rx޼y2w\.\@ll,B;144d<#QZZ*LꫯhhhU^TJnn.nnnhhh`aaAvv6--- @'77D|}}3_~'TԩBHXYYqqSUUE?MMMDEEJbb"EEEL0aH@WWo^԰رcxzz2yd!ÞHjj*իWchhT*Lyݝ___!έ"wjVVx :|H"??9s`0XTTDff&roooƌCjj*ׯ_GGGѣGS[[Kvv6gF]]}}}ncܸqBގ\~Yf eŹ0z&귴cccF) #Gd̘1Ġ] ";;\䜤8W;;;Ν; vvv888/XmJRJ.h"7nnnndggSRR_nOKK#G¥K(((`ȑ ѣGGqq1&&&Bpqq!&&D>*JHHCl;;;011Ņ#GGAAAAAJ ;;!JaQ===w3~ .CW0T*eܸqL<UUUBCCimmuuuΝ;1/"&Mؘ˗/xbF%ӧO,Y&L6}JA܈#A*2|,,," #&&|Mݙ>}:q2fƏυ x B[[0,,,_,Xʕ+qss#!!3f0j((//_Lq`0дƆz̙&SLASSWWWf͚B555eѢEhiiQ^^o{p_777QSScܹ0a„!}~3Ƅ ֬X+W0m4֯_ϨQppp@WW0lll033#** 6l I0aR'''H$[H$ {{{qrrbڴiakk˔)S6m舞CGgwuL;VwNC{:n IDAT(). =+_4ԸS%::^\\\hJB P__ŋD% +WACCTVV }~9%I5?*477ASS--- F50(Jkk+!ANEEՅ#477#JoiMF*܌\.kPgg'ʹ---#u5ZJ*A6tuu iߥ a`d\.gͼ[oO{{;mmm4662vX.]* ;T.SQQA__}}}477 u)ƲlJwii)HRf͚ETTSYY){nkkC.+?-~Lƒ%K믇M Cd2 .((`ΝJ'E\@62c ,--immʕ+L>`perhh`ìLՑeKRΟ?ϴi8zٷ$kkk9vK,%0ǎcB0Cyy9gϞE]]Lƌ3ɓ0a&$$LF\\aaa={}FJJ 555rYeMXX`h2#_p>SHNNF*r $??dA+ÔԩSilldԩ^.f͚;7|/?ٶmNNN|;d***뮻ؼy3W'|FΜ9{ݝ$###yXt)#%%###jjjXb;wT:O>ԔÇ3fٴiTUUannΦM?>wƍxyy멫#44'N`gg'^Ο?O``"wb |ikk2KLLdF||`S(-- 55kii)Hs9d2mmm=3gPWW7L&C*2}tnŋ x\\eeeߏJr3崷+eynjÈ#fܸq9\NFFrs WWWՇw܊>GGG5j]8WTTAnn.r:ƌ ;vȈ#E-T*[6gggttt7nyyybhh?444䄵 ~noo… ruPC&]]]{シkbaaܹs';;LƂ  AMMG}\*֭cユ& pttg,_z |||kkkRSSV:G&1aV^-dL[ZZa``^^|Ea}w022bɓ\x022bٲel߾Jpo vލ K,TR)>>>deeIPWWǚ5k3f }}}̞=g}^!00===jjjx嗱F(g׮]r233n8XlF"00sɔ(Ņ0V^<3BƻSA?Jf]8:: eK(a3zhXtmU&X?Lii)233#44T0*(^VVccc cڵ?X ſ{BZ1;;;d2ܸqcccihhEx( Ą~PC\.'++)Sr3bHKKߟt)((@&իWqqqĉx{{%Daa!]]]7NWaH#ؐByy׵4lllc+I(񡹹{{{r9gΜ'''֭[dž hiiUUU._B\TTlٲE-8;;Igg' ,7nҘf#ٴik֬!;;֭[{ァTo]]{HRqss#::lLLL9cǎHJJ"++qq=z4<O>/tvvEcc#'Nd߾}ƍ#==ooomBvvoѢEH${$%%D"Qz`hllܜUVyfٿ?_*r!jFOYYYڍ7ˣ[[[***())! 333INNFGG***CDa CCC[[aBKKK044L$`-55\%++ WWWLMM>222(((ɉF"GVVcƌ;;;bccS \+\vJPSS5556:99QXXihhjȱ0 1c`kkRP\\&ƍ#>>R$ B6Aq6DII XXXǨ%(羋9cjjJVVǏ֢ѣ'22VN.] \]]1b#G9fffw;I ^4鴵1rH.\:&M&~m,,,b…!XXX@FFǏFQQQaԩ +ƨSWWDŽ cر444? mݲe c111hHCCkkk~***(((`Μ9!(,,$00cǢFMM AAAF}}=`ii),U<,Duu5l߾ѣGcffwwwYGGGHT(/^,\k}}=L2E6700+U J(--eRSSäIPUUͥ9s栯T*ܜ "˹~:~~~mll,XׯS__ݝ:;;ߟ.LLLprrڮFXXVVVxxxڊVVV+<ݱCCag1T4zǻ|r9 S89s-ihhիtvvpiIbƟnlmmIJJb̘1iݟ}+W5q'_1k΢E}_ ٬Yff܄m>VZ+"g勈B@7&%%Eo>Ǐ+M5'O$11Qa8߃;vSiۥK8vsصko4? b |ꢬLT L* sV[DDDpn?ׯ_G"PPPc.jժ[j[%0k؛+|mJ_|8elٲ_|9s000+7o'c rh˖-CMM mmmIHHMMMr9O=}<~~~TUU)hO?ǏH$!$$+Wr>Μ9 /@?NbӦMֲe^z%9wׯ7n6l 222xG񡩩 SSSpuu^% QQQԄ`[("G o3555她S 8q"aaaNXX>(087iӦ)3RQQ$&&2bUl1bx{{S\\̵kpww'##j!C:~xᱧ>C:322000@]]ILLѣ,XT8{,ƍOOO:::HOOg޼yDEEӧ133ҒW2c ̙3;\ZZcǎٳ```T*%((4ƍǵkÃXn< XXXqrr?^@GG+VPTT_|H?0mFaׇ'XYYړhhhEtt0ё  www;ADp'?[[[233Ņl,Y%%%H$@.cff3I{{;xxx`jj&1qDam0}}}^}Uݙ2e [n%(( }]&OLii)_0$%%+++.]JNN?VVVL2~///]Ν;Yf΄ ~:R@C* 'NŅ)SJZZ555C\DIchqyoEDDN 5<111|[ʕ+Ylv⭷"00{Qإ755 .f""w*jܡotww 6aaa|9jjjDLL̏޵_"""?1hhhMhii%-HH$?x:::?uuu1Iee%۷o'77{{{6mڄ+ 777ظ8CSSS-}IOOtz aڵ<DZv5SDD/3g޼yu]DFFn:,YBQQ)_RRBqq1NNN888NcPSSȑ#ywٶm_}?\AGDDD"ftuuݮW^yݻw+Č ''+m "++ sssΜ9Ú5kضmpL}}=\(444F'<<///"##Yhoot""""C㉌dٳΜ9C@@|-WTTrJl""""? 1 no 9r$ >w\]6liii̞=@_+W8w=455 9VDDDN{\x7/%i #33K[[E`ż{.w08'4-X8T.Aw}Qٶm˗/-$"""{ aqq1km6~ߣ"""9?0.]Dpp0ٺu+9yyyNFFƐ2|IV^͌3paaaSOQPP@RRK.e,]h裏~+u9t g}:K.%,,xaÆ!:gO>ٳ8, hmm+++beeڐ ٳgyרWWWAJByp""7q'"r?Ÿ쌶nIc,D__q ٮoll1 pS) sqVEDDD~ b  88߻"""""""")r"""""""""I@XDDDDDDDD/%a$b ,""""""""D ~&ܒ˗/ [gׇT*Id2ߏT*E.ӣ,oQQKff&ݿJY"""ʤ .677*Akk1WAvvmݺ~:z"=b |9s ?8?8| |'o~'xM6ur}|dd$wgwK>ß}n\\I;vL%ѣG9{bkk }=_*PYYIdd%++lѠ@ݻ֭[Ç9.""'vڟ@}HRΜ9ϫ!''55=.;;[dn5^y.^ٿ//a̶6ѡ033}R)NB___#|ywXL4 dΟ?χ~ mmm ԩSINN)Sxb> ;v,3fw֭[ٹs'DSS׿X\ IDAT'$**V<==… =iӦARR_|;v,RݻwS]]qqq>iӦQZZJzz:'Ofܹ|tttׇ7'N੧Ύ^{f/_NPPtvv~Z[[166fÆ gZZZX~=EEEǣ«JZZs%11ӧO#xIII!''\.]ٳg144dÆ d2!66cccBCCcq-[ƾ}(((`L6M^]xꩧ`Ϟ=SWWGVV@OOwww9Bkk+[nI&{n 5jӦM#66ΝL&C*RRR§~J?*W^%""~i8@ww7X[[3{lⰲC-DD~O"""8uSTT1555=zpXXXp.]Jll,,]v9*˗/'!!2!""͛Gvv6~!#FP|d?~v,X@TTvvv$''3ϐ R6"""H$,]T)8vuuHEE=Z^TTDff&R|||HLL‚<̘1VZ:G%KP[[ DEEabbBUUWVSTѣG&//4i沲2~G&Ϝ9s"00'''$ ՜>===HLL$<<CCC HNNȈ RWW%SNKJJ k֬ʕ+ȨQ~C,FfnfϞΝ;#** ---ٴiݼ[O,}}}ddd܎/f͚5o`bbرcϕƶ6\\\PUUJf̘AKK sΥH8%nnnr>-[Fkk+GEs鉫㣗_~___NJvvP_hh(>#Gdĉ+3k,tuu9~ZXXÇYt)/>GGG155eӦM,Y$^J{{;UUU_g}Fww7HDDƜ9sGGG(--U^ 88I&QPP&/棏>R̂ hkk… |rvZv܉>.]`ƍ,[Ν;Gaa!s<̰uYmdee%j08---̙CRRׯ_g…hkkPYYD"A__￟իWse֯_Yv-999sQ$ 46>>|8UUU,_W"pppzn6!!!瓝M||***>}:zzzR__='N`ܸq-̐?pN:JbL6kݍjYY))):u)Sj ˕+WEEE u2tPJKK166f_gÆ 8q''' B*쌫+N6mļyHNN֖ݻw₻}y8y$LқJ%?t3 '55[P(hll'$55>N,Xy(--%77j9" 7#77|}}5j 4\x"ѤejkkoOKK w&66$** &77 ͍vٰaEEETUU'Hɉ pwwߟH>sYqKjkk[[[BBB066V6,--uf蠩 \N\\C A܊\d2Ǐ8p]vT*Z ???0aΟ?멬c;·{駟m6GѠsڟz)ϟϮ]ظq#1112h 'oƆSN1p@Kgg'm6ZŅf166͍Nv޽x ޽SUUZJ%466"immQ' vb466Gqq1_} JD"LJsqA633\gPiaa*@8pTVVT*Zj/Ygdd711СCBjHee%B,FFFdee%ky饗DPDyy9uuu:g߾}ڊ2"d2( ٳgGٙk׮~^yRRR?~} Ι0FM=HMMsh d/TUUѷo_R)rsssPT兾>ZBqpp144R|}}Jjjjjdkk+/BzSS#jZ7vJEvv6R///r9agg𙾾>r\'}2aR.(T*Q*XYY= yyyxyyakkKAAjikkښR$ ԄnWW 硰6l~( MLLT 7VLMMY(X]1k4quuEVP(BAQQ}ښ4 @;Vxh4XXX ^@O^eUU~~~H$G?v솙w~[yW7.:{:9/,!RXX-ڊ:VVVH߾}^{yyjE(=TUUQSSCPPFFFQSSC```lkkNeee=2`Z-YYY8;;*Agg'EEE 硶kkklmmh4dgg5%%%H$!oTh+++۱F. 466"Hprr9pwwR\]]j477cjj.v֖Q*̘1L!J{{{ɡo߾n:|355s =o "033#77777J%ۛ"^uuu z VK}hkm71o9p/'EDLFddȯ^Ł.qqq3ýԇޮ!"rnnn+.;@_8]9w?:$5557U}H/@pA tj}]^|EyhL6m믿U[7ݾhѢ[֝?kz_xmFss[Qլ[-"rkRӻZ8p?svu8~ _ק|h…3{5[{Q]]̙3o[sEH["w156Ƶk8x /}DEEl24 kg222xꩧׯ3qD"""8|0̅  bԨQtvveXp!l۶ V\)_v|x'yٻw/EEE-v}YAzvIUU999̙3|95qknn&''^{ ###mƵkXh444Çy衇8x ϟ'22'=[lĄZ,,,8P&**#GP]]M}}=*.]dy9rIIIL6Gqq1> TWW#Jj|wdgg3w\<==)cǎq^z%GII ,̌cǎŘ1c(++e˖!ؾ};ZK#& v9tW?I/}QvѣGgժU_Vyyz6oތD"_3MMMe޽,_ 6O?oAZZ ,]3tP),,‚cccþ}HHH@P{nYhi„ OOO~mFBBÔ ~UIuu5=Ç'55?ݼy3jkBErr2Ν#**zBIXb ̚5,[FŒ%K(**/`ܸq,Z[[[֮],X#F_R]]M\\%%%ouVA⧓ mmm |W@Foii)MMM8qWWW^|E  8̟?QF~222n8| s\?nnn?O>TVVg1qD.\-}ܹUV1at}$6nHww7NNN[;;;-ZDXX˗/‚͛7~L&wܜNo.MՇ)seڵKMعs'cǎ^֖7|GGG^|E:::Ohnn&++'RSSCss3ΎyβenG·BUo@رcr9BYY6mbĈٳccc)**Gɉ{CCC)((M6܌cٲe¬<SSSioo ׯoښ 9s =FXXPoBBӦMC"ʱc077?333Goxxx ۷/ <+++ ,,A6 ~ZG>?? #..###R)eee<ڊ;JX^mO>H222xgz$//m۶+dLMMcĈ±K==="##qsswwwx 6oLRR\|PJJJ5kc/wfÆ 9rsssz4F{%zW!!!sJii)?8MMMۗk*%"r7䄃K.O>;wk׮Q[[-2h MFee%'N`„ $''NRRw=suړH$tuu=&L… j'==P̄vvv1n8ppp 44DBrr2r˗/Ŕ)Sعs''NYF}} fL0fa{mm-R0Ν;wyLOO'** '''PՔp맓V&H 44Z0`&&& FBϲ`nlll ܹs 2Ν;D"!$$OOO044‚Hhll455amm-c"""tz)))ȑ#BDD 8sssZZZ066S0 C.ɗ_~\.VpH$!ȆܛH~~>CCCA[O>455q! )//H$̐!CŅCi&xӉ۷~zR)0zh  iӦ Zt6ms='؂={u nfyyy3gXf < iii ǪT*Yf !!!ذ IDAT`eeELL #G^[]rE(WQQ!KNN>駟FPpx 8}4?nnn mr9֭[GXXnnn>|[r} 3 o`` _"СC3fαRVVF߾}111!** .R` NTrYz-ΝKNNAAAdff 76 gСNKKÇ3f UUUMoVGh+Wpyl?NKK 顧'EO7ED`ٲe޽QFHhh(ttt!v0a}1333bbbjBtuu1|pr0xWimmSSS~;v, <4BOO.aekkիWg#F J6l$$$zjE{j'N'x!C3ϟT*FTс 0l0uryy9*{[{{;]]]tttT* '''JT*r deegqy###LLL"--vF3gHII]gg':ӧRNggAS$88h,--uQ*h4JZZrkkk|vtt󝝝tttp^n:;;[:·DD__aÆaaaAGG2|p8v΄PVVtwwg撝Mpp0>>ѿT*s8|pd2:Oqrq,--yAuvv DRR E({q:edd҂-¾(@444pYJHR=J``t~Y+** {{{޺KKKqrrfU% LQGGRqi=z4&&&$%%T*5j/_(,,,Π'ի,KIIccct$d2)))pcddDQQ`aaAii)BpFFnnnQRRBvv6DGG3dRSS#66B3gpqqaȐ!@Yya7o֟.CJJ wߡhpqq8%33SJKK<^J}}}HIIՕF̉'xB.SQQAff&}իr @mm-_5%%%bRSSw}ZՕ$<<<(..B]DpvvfժUrhhh ..333tyyy!HDBNN{TʥKHOOf97ĥRXt)uuuj"''SSS\BJJ %%%׏n{Cղo>***hjjŅsq)̙3劊Ig?Oyt W\-!,b؝ իLKK ۓ VIOOBښnd2 j,,,jى-JK.aii)555\|{{{Z-ӇlAFV.*-- *++cՅB===\]])//###*++ΦO>:УhIEVիWjtwwT*P(077_f6d2ЫokkK~~>@cc#K.MVŽ'NZ066 իRUUD"͍5k֠T*J"T)**BR5 ltLN8oAS__:jkkz* ***(**SøЮ_7WZRHFf8#|;j,\///BBBP(,_h}]fڵ*>carBBUf͚5tww Gjkk?~}pB g}ӧOb ټy3yyy½bҥ\zkz=˗ꫨjΝKpp0/FR /(o$nzLp9޾};׮]+VP^^Nrr2oVVV,]q_&.^Hee%۷oȑ#GqY4 Wk*ro o#Ÿ3d„}Ϟ=̦Mذa/^ IIIѐ?g'''ޟ+_VVѣqtť)SP=xB?ٿ?={Zf„ ˼{hZ6mĿ/Μ9T*%'')S퍫+x{{{nlllسg455&h"Ϛ5 ;;;×_~T*e޽ 0lsssбOxYp!FFFh4155EpiRSS)))Apo߾(J̙&&&cgg7/_&,, Jr3b9 w]Gߴ^iooo'/̚5 \.(ikk#77z___HOOgɒ%ώ;شiVVVիW&"Gk'|9JXXX```pl >)Sp)<<<cooo. [oajjJee%)))S]]MYY'O$''ccc)țq!ƍǰaøpо 3R$%%077gƍ :T3gPYY555,_3vXP(;vRIMM%22_~0lmm4hYYYh4.]1fܘ8q"d2ߏJؘz<<<t썡}ˋ={0C=\΅ pvv&77CCC|||qppӓX͛'κp띩 ,,SRUU 7\ WWW\]]祗^ѣ455+<ӦMرc=zqAzz:'OMqāmDp5녁Ɛ!Cxg7o1}tAﶺRlBXXɷ̡H$rĒkff&/^b:;;yUs=ǬY077gذa>|hZ"""7_qqq䠯ϓO>1455Q[[KAA]]]455 :̞=ŋ[twwcddc01qDf͚ܹsuFzihhq{xxppB믛 saܸq XxsaAZF*RYYR$66g2h ƞ={?~<444΀D__ӧO HR***pvvɉ fΜIIIڒK/Dpp0dggx[+K} 5rjkko*g?Çof͚[hXt)FFF;V Ƚ$/j^y׈ᡇUUU)KvZ)_52i$*ѣع=3·sssW_~?y$*{ T ʕ+{2c eѢEqܝG}&::#""CLK"EDDDD8eee̝;#G2ߤߛ1? ;80yd̙ñc1b3g뫯'33wiCDD#Q ^xӻiٛ!""B #9 IDATQ,--:݋B 33bccr FCVVcǎ`̘1\t'Nsq!Z~ƌ|Gފ%¿xyy8b |YT*O.s!Uy T*NNN?_ |u...:tB+WP(===OV1ܭaF(,,$))zӧOn:aWWWOC=]VOWW-883g裏bkk FO=~x:;;9rFFFvvv9r$.TWWh"o(s BOOf̘tڈe֬Y ϑubiiIVV _)nUNDDDDDDD^j|رCCCq6mĹspssАX033#33ggg]g}̙3IJJ777"##)((`ǎlݺD".M<R +?N*:f̘inn\[T^^Nff&}!!!j+&Mɓ'9s 6663|p>cV\yk.>`ԩ޽(}W\ի9u>>>(JFEss-c:|-."""""""rkfoFQQ???6ọ>Jll,駟Pʊz#G2~xeĉ߿F#.Hx衇عsVeܹL8N<Ɋ+na09zhkaƍǔ)S5j/BƍEL:8 ?F̓>H@@?ӯ)'"""{hj͏?xZ{U=Oz' J" %@BM#ED,_`XPDybAJ $@HBz!uI`⻟X s g=gRLw'j5yyyǏ"V۽ ܺu?Fvv6ZT"=kC?ȑ# ++nݺѥK?ȑ#ԩܜxlll:t(vvvıcRN`GPPL0Xf̘ARRdNA, H$oFHHHU8|ѷo_͉*3n8---lڴI0yX޽m۶b Ο?O\\}FO?ÇY|zn./_r9_~UwٳgSլXϐ@H${R044X8qhii]Y.\uUT$$$ХKzzzkȓ5͍&qppѣZ~]]]V\ɂ hjj"--[޽{9s VVVL6ÇT*ǽ&KKK$,,0.]ʸq8s gΜaϞ=S[h͛… )++?7n~;|0+VLpPTZelllڬN:O=EPP{ET̮]X`p˖-0l0INN&00fX|9AAA{q =z4SOѭ[7Μ9CKK Ǐg۶m2m4AV`` ; zMii)#FuF\\ ; ݻR )S`gg9QUUENNo&ΝCR+wAMM HRf͚Eqq1QQQ`eeEΝqIIITWW3e),,ӓpIx뭷=rssS]]ѣ 孷"<<ÇGbb"ޤ2n8ȈPj5ָ655ʤIӊtm"""PuVy9}4̝;\F멯W_ //ϣP(8p \.Qrr2vvv=ǏS__K/޽;tڕ^z;wkH}}=Dq=x ç>W_uareŸ1c0k֬6l@@/ߟݻ3iҤ6.]D"_fҤIEmޝn|}}~.ܙlܹ}ք0l0X|9?瓒¤IuH$mu|ȃ0c ƍƍ333~XXCHhnnW_}aÆ@mm-'OdҤIlڴSҥK>}:/_///-#СCL&3|p֬Y9r7o$%%GGGmdÖ-[̌8ᾡ!̞=իW3~xd20`Μ9èQz*l۶I&QPPUUUۓĸqp׹y&sE.#HPS]]͡C1bؐC~ݝTjkk100 99Y8#JؘӧOcjjʻ̙3hcjjzߍO>ӧ#L:͛7ACCamm`[ٳ'gϞe7'''k<==iii!==b<==6mh4ƍ]vѹsgRwRoc[YYѭ[7\]]8p [n% ˗syzs=يؾ};VjӎdggеkWeتT*ի!&&F׺jl:88r˕+WP(|wZ&LΝocܹDDD`llLcc#(JLMM3*sss._~hh(ތ=3 >}w}z""""-K;wG100@GGCCCBBBH$3euFee%( }͍)//G"`jjʙ3gqrZMuur###100@*biiIMMJB__J%Պ_]]allLssfff`ll.jZibb">>.MMMtAгEw|mmmijjBGGB[Q( /wwmm-zzzXXXh~oZZZv3LFAP<);.HrF] f'n]]]IHH[n=vDDDDCXDg̞֭=[} ᠿkă2b"##ٺu}<<,X "O,iCDD֖_\.GV9066nϢV{bDDwy\t TW!)//'00:p%6l&JF.xboewyݼy3gδɸP(3gAAAU{w30dȐncc##00{77 ڮL&ɓB)j?IDDDnĐE|/_͛###rssvÃp$ ӧO',, Yh$$$0f9s ;vdԨQ>}\΄ Vo(//GRQ]]MLL =JBWW]wKdff2qDttt{ViBjj*"HRN:3LnܸéG*2x`_N~ &pӇBBBpwwՕH޽;]vիHRzꅏ dee1l0 dobhhݻw >\_WWGHHƆ7o2vX(//~3g0o#Mݻvk%fJMNNDDDw.믿3Э[7Ο?ORR.\`ĉ|7Z㉎O>(J $ ~I(gnnɓ'1bG͛73sL֬Y#$'>> 6埫RXt) yyyXXXdO۱cϞ=^|EV^AAAo>퉋PZZqqqs% n>}122ƍ~-WN://7PWWGii)p'{kNr _}nnn8;;STTĞ={x ''jIHHؘ}iEy2 a%ggg*++9}`bbBuu5666jP*;v2𠺺   loK$j5TTT ֭IIItIHӬ `ooOBB]vƆvU*IIItkkky&:uJ,$K.ammMǎinn&--MkjgeeѡCLMMСs755 ZRcǎꊵudJ%vvv$&&ҥK2rJ%l$''舃݊ ͩEVVqvvgggR)攔***dЭ[7111I_׿oB͍2,--Q(PUU ɠ IDATB&9===RRRDBMM FFFtܙR嘚ȢEW/IC!,""8y&q~466qF裿Z Gi柀#TTT`aauXj"<<Ӻ&HHNN~ԪϢT*)++xdT*! ,h  '''\]]BPK/D@@*Zu*++0aO?47n4暾>#PH+555֭߭fϞ=ZcϞ=aiӴڵK~tuEE!~G/3~ BBB4h6mҪj*Ν˹s""""" *++)--vҲ2|wpE222=zPXXqSr F[VVƩS%..&ijjBRJRRp'שSu_}111… T*"##IOO'..l;QN}\|D8Ο?/ojj*BVUUHII dddpYN2s!˹x"ܼy vJHHb|||(,,Lw)Bۊ<!L>K.˒%KMrr2cǎ`ܸqJJJ < O?cYDDDIBT2vX ,--ٻw/ ;w 3f ;w㔖"J裏?ٳ444PYY)*++cƍzjٸq#'NؘUVř3gt111ۓ# qeΞ=Kaa!k׮M6²e7n+VC|gcn߾O?-L ̙3:u L)>>> >L:;6l`ڵXYYB.o>Gn8uM6h %##\ȑ#/=T*Ņ}!8{,666|gW^O>#HÃT <cccttt;v,...eL7B_?~BM7oCL:/2p@d̞=???F1޽24hMMMիTWW~zfΜI~~>SN GGGrrr­p9]ɓIKKw۷Rɑ#Gx饗HHHo߾[I>}pttӓl ֬ SSS2e }>쳂 )͛!>|8NNNrv+!͛7[oN>}(--W_e̘1퍮.zzz8;;F!##{sss(,,ӓ}R8t/'Oʕ+өS')OA=zD4 ޽}}}fΜɸq㈌[Yd seԨQ$%%1dȐH{?h4bbb JŞ={H333qww^СC aƌ ㏅zVVV\]] bٲeܹkkkٷo֖ׯkFLL &&&BؼXZZ2rHƍ׏dz'߿`/cooORRiiiͿ/VXA}}=|GT* )--EWWgbkkK]]`ffFvv6#%%wwwzƏOUU]tӓyCMM ...0{lq)A#={I w=!:Ib#** ]]] Fss3OR{xxwv3fVz˗/h>|8dgg3n8P՜9sF$VUU#.]bС;wCȩS9r$jH YYYу\\\\f̘1\t |}})((SNP(ӣѣG( aU3gSOѣG_7 &p2 +++xgIHH1BzkאJ=Z0[hiiߟ6l؀7<3444$$$PZZJhh(?ָcggRD. &LGGG!a12 777g.,,͛kȆ;~奥Z"$͡bB $M!,$~>|8lٲ [VѰ|rwСC ={,tQ.;Ç"%99oofFF3f`ŊU5kְlٲ˽h ό3Xfc+"r7>,vBRw}ᇘ3Uoޞ7|۷j*_-N8}ؼy3m'CDD䟅#cԩlذ;srr0͌3ԩݺu###R)`bbB||<FiiiaРArMjkk<G}}=uJѽ{w\\\А<|}}inn&22>***ݺukM/_u@FR3ԧTJee%8;;s5pss#''z:t耹9666ܸqF/* Tʷ~ L&#??:uꄝ=e766+...dddPVVF~pwwgܹ|uWEff&r777d2 ~j5t LLLdSWW+닑=u->|///Mƞ={bРA;#G2`144dmRƶi-b̙/rOJKKyׯj%K0gg! |2| pgx8pÇ[sm$ 8qe˖ L 8u+W@?{Fח׳tRuΝ!̐!C2dZ>L =3gd̘1 >XvMss3 .$,,&XZZj]{#!![G'$$DaÆBJJ lܸw}:`dd#o&AAAIJeؾ};ׯ_'))F?+WT2l0 V⧟~ё瓛V_R)ȑ#qttΪU2d_5_}!!!r >`>^xˉ'h4`nn~uED6~)ϧUVaee@Ϟ=t|.{ϟo>""VX!|_yv Hꫯ000hn{2DDD9#ԔT{Knn.sU *Cqq1ӧOV.ټy3WԩSTWWʐ!CoMJE}}=7od̙ٳfz*'99%KS\nN tRONrr2888PSSC\\pM*y']}1b={ɓJ⥗^СCF+++,YݩS'~LrO999477m6jjj*锔2--,R)8::2l0IOOϏeٲej$qE } \?ʊ<ݐo߾Xkkkk&&&xyyݗ߫۞ #֭[8pc"ɐ$&& bEEEڵ+Vлwoj5RSSñcǰ (({{{mF׮]۷/?Ȉ| NNNܺu/r%ẉp֖?ӣG8Ν;@V߳m333D*;C^tANxx8iST;v~ӧw\+ҐdܸqZzzz+cǎܾ}p.]Dbb"nEB\Bmm-{eΝtAnU*PZZJEE9998::rEbbb;AFF/_Sݛk7|wuJܸq7n ɰ%''XWSDDDDD N:Wc~7"ټykeeuOڀcƌakk+у`ʀPlܸ'''.\T*eÆ ;0j(*++ CFUUEEE  疖<== ///urŅyԾȣIC>w~^6ə 4@3wƌ|ŠȟcӦM$''q?,{Uy 9w]#k:Dy`6/G3wѿJ"""BMDDDDDD>"""""""""c ))+WwHn͛7 gk!>>t+W2<͏?H]%22{R__P_"##ILL 1{,]]vn!!!Z '\]]2eFNDI`ҥ899駟9ώ;pvvfʕ-m*]`aa&IoINNjݓ2n޽9}}ONNnwƍk߾}[X|Xvߕ{ϝ%55gyF뚫p!"{$&&SO=ELL lܸ#FnDPܹs&K_|qLt+WdҤI\r<˕+WHLL‚"~mj5[lW^֭[닋 gϞÄRUUŋ_ё__+ɰ'77ld2޽;3g$::ggg {Ғ?kf͚Ν;֭۷ogܸq,[Myy9ŋ`iiIqq~7j8ݻ;w3N`kkݜ>}~z~011a߾}m X >7)))m755hxĭ.])Ν#00 &tRX`VVVٳQFf=ʜ9sXx>_J"-- nJSSe֭[144/O?jjjEOOOHfuV >ׯGWW^x$r9*rU^*F---ȑ#ꫯc:v숵57oD*Exx8 w}WV?bhhHaa! xر[ / .$>>GGGbbb(//O?T_)Jٲe ---L<tuujmۆRwRRR˜1c 姟~"22>}D"!77ӧg}Ɗ+o9z`(66D"!..Nk,[9~8 п^J||<ɨj,,,6l/_Ã+W-FLSS#,, Z… ױ]bkkZ IDATK\\r_~=zPZZFcΝL36l9s(**J/^̵kwwwttt8<]t.]`ii㉋?t^^^,^ 뇅ǎʘѵkWr9W\cǎ8;;ӷo_ qsscccr9gTUU1h 4 Ɩ-[cǎmΎv}ӦM۳cz r):vD"Ņ޽{k-yxx JYz5ǎ Lljk׮㩬 tRQ*׏kҹsgrssdG аm'~b K݋[;kIJe͍דNzzGqv]#.:z⣏>?uV>ϟ)c۶m]FbnnΌ3Xhzzz,[ Rɇ~ƿϏCG1k,leմpE&MڵkIKKcٲeR.^Ț5k8q`><y7Xb'NuֱrJ>6 !{gWcwhBe׈b,%m,Q3| >#C"I2l"JEˑNz~1ef|ys<˽='cn+V@KK} گ_?8fϞMv7n|WL4;vI˖-ӧUfҥٳ-[ҤI.]Jff&| YYY jkk cիVVV,_ &tR>}:;v`hkkԩSСvvv M0$JKKqvvfȐ!ԫW;w.@ݺuiժVVVx9vO?ÇU7lؐt 011Vjժ>>> 2uuu͙?>VǬ^}` /PVUUEKK \.~ihhШQ#Zj… ٴi͛7UV ())Ѿ}{fΜY% ]]]mUUUd2@Y(x"xxxTqXXX)PQQAUU 6nСC$O:\.K.B胁#ͱ*T*Lp☛ӪU+!d]U^aРAUDS0577GSS\N۶m5j:t`ɒ%<|;wͣN:. 4`۶mt%%%>3(|g˖-c5DЭ[7$ z80S2xQP1eZnMJJ ӧOgL'M͛W.R]]]^x!$c˖-hii1tP~|2Gf݌3???044 qvvܹstڕ,$ !!!;v@ILLd֬YܸqeeeJJJ6l˗/}srrXx1_~%;wdҥBZ@@0j(,X@fHLLҒH&NȦMXt2j(^J`` ˖-߿555֭[]6fffGaa!#GdܹL:{{{222gΜ9ܾ}/RTTĔ)Sy1͡JPC4E#˫xEDECX\ΤIXbFFF51u {'{|Ls,'DSSH r j;88yw8111rmWWj~HJKKYpG-"""򮨪ҭ[74hwwEDO!or.{*HFU׈#PWWCV7wg899@km}zl&x***1~^~߬sʕ&wSD䟈D"9r But#""u"TqҥRwBBSW+"###wNv1coߞiժNNNmҤ''ӤI:wqqqѴiSN>ͬYpvvcǎ HСcǎۛٳg )lll޽;͚5֘Ciӆ[ʐ!C?={һwoԩݻw9y$_}!!!@y~P''',--9~8R777ڴi÷~Kvv6NNNjՊ Ю];\]]]= 888дiSKdd$={$>>={V["}7xE}6}eݻ 5kF^صkWu_ZlIrr2 .dxxxpiBBBҥ ͛7ȑ#J֭Yb`Νܹ3fPTTDΝiժG~g!"Oח ._̌36*"#''QQQ$''W9oeeUE\Cݻ?H݆|G oMO1F 9ϟ?g˖-,ZLYY'3<<Əʕ+IJJ~ rrrrEUUɓ'3n8>SVXAӦMꫯvJwЁ$>/P0z* Jzzzs=1cDpB͛ŋ9|0} ,ڵk5 ;e2۶m|rΝK.]x̗'|?zbС 4۷SXXHiii 9s}Qn]!3gPSSc„ bkkիqtt$??///WmK,a\zϟO6mpppGDGGS~} BYY==="""d ΝK`` 1KrJ;Fhh(##66VWPB%ѣ?~ ڵkiذ!O~~>9 cccCݺu I&)+JhRRR!%% p^|{nr9UҌr֮]+_& cr'%%qiAYs޽LFݹx"NNNDGGӲeK222HNNFWW/Bh/00DBAAP.SPP5PRRBϞ=QQQ!""BKÆ G&ݻ'++ٳg+))=drqpp0Rݻ\.O>;w/_:vȹsX|9GMRPP@ZZǎCYYڵk+̗'OٳgXZZ@PP9AAA3F/ LFff&F"%%kkkN8,ZpU^x̙3_(--_~#jժ%by{{o>ATEꢮ*AڢE -[Y:@y6lڴIA 2| (++D"A"TUUQUUE*rQ"##oTF[[kk֬AUUaÆ!JQUUիWSPP 驮͊IWSSS0JQWWm۲cBBB8u˖-jWC@@@hhhPXXHaa!ڨR(++}a…perrr2eJhܸ1s͍O"ɈG*pBׯO޽Jhhhb _<*kjjC˖-ٶm8::2h Bب(Ӊ$99GGG|||/PSS#""ڴiC>}ؿ?#FիԩS???ڶmvUds={&俽u§=/_f8;;suG pvv׷jFsΡ/}Q\\-۶m_>/_f9r/+<==Y|9dffMff&!!!(HrA1"=7oޞW2uTك=ׯ_gرB1333ك 6ʸQRR\A4I&\tYfUUUj׮MAAjѣGamm-(}>zH;wTH^A]38u֭O'"|LEAk׮Ĝ9s̯΄D"ԩS };8P%m)lZ\ͭ9 ΝQFbGߚ c!''GHYȿ7ϟט}ED'!t{[niӆL֮]K֭8p RѣG3p@ZlI~~>cǎ͛xzz*z*%%%\~N:Ѷm[>d0uT̙3hт:PTTD`` jՊ]vq/_.䡝1c12ȁB~?///(..fРAjՊuUg1b3vJII }AAA=aÆѺukRSSɉΝ;i޼9}4\]]}еkW>3֬YCbb"2~x/{,Xmۄ2w\֮]Kvv6ϟɉ;Hll,/_[EDD8!oe]yު3n HII2%Dff&aaa۷9Ç3f 4iTL8QȦ`hhȩS_eӦMȈ}… edgg3yd֭[G&Mx5={$99 6NTT?O>aٲel߾[[[Y|9111BjiӦ1i$Ο?oߞt֯_ԩS5j5ݻ9}وT"44,vJBBbllpONN$$$+֭Ϟ=BBCCcРA@Y`` :wիWӧGEYYÇS\\̑#G(**ݝݻw )(122Ņ'N ˱޽{™3gÃ;w HHHH`„ RTTѣldeeQVV&v$$$0dd2W^E.SZZǏ@CCf͚UxV""(++ +ĉ!###tuu7,--y9<{L|Rmmm/^ʐ IDAT!2 Apʍgee巆Tl8xs]]]JJJBMM;+ P|̘1 rjjjhhh Ʉqhii Uի.8z(?ÇGKK {{{;v,7&""&M쌃o@ {ԭ[2L.]}6hhh'p %KXz5]vE"ѣ 85kקcǎOBnj#???6lHHH|'p!-Z7իW:u/r7)h@BOO---~|1c8pڵ# 3ghhhm6= ^zЩS'^|RTAh˖-0`Ν˔)Sg„ L6]vq }hٲ%iiiBsii)[SN 7+׏w2{l8ҥKٺu+| r!oNff&VVV`u+O"yO<}TTT ji5amm6deeqQ̤Ig?~ÇINN}oߞׯS~}>|Ⱦ}PUUT,--qqqQ/srr iӦbnnchhӧOԩS 8(w>XXX(8*(++C*RTT^)))WYf sosss066&##@oҸqcv!"g&-- >RSS()))l֫WFCAAनS0w4lؐڵk+|)))QPPҹsgʄR 14RȄ;+WO:( CTW[(]9Ae9x¹!C0dxԨQ ׫k…,\P8P+[___  6`dd wzj!~J=knݢG 4C @RRpQQQ¹ ˒1ydTrBUDDD8-Zߟ`\\\LJ4 kkk=Jqq1аaCLMM111޽{,( fŊL2SRRRBrr2rAg2331c޽[>ڵ#%%O[[[tttU>ٓ0^~M.]PQQaΜ9***ݻDA#11 |111|kll̝;w8q^^^31cǵkx5OJJ 'O&>>'OCd2ܹsG]"55b9z($&&RsΜ9 H(((K. AFٳgT(!8;;caa(((… СCoBusڵ?9Cǔ ^s# 梫Kqq1hiiL&#++ +++HKK+H$cbb‹/֦]]]B.Onn.PPP ={ ]]]444(((­*>(++#;;KKK^|L&CUUU ~S 2EEEHRo~~>B(ٓ'Osqq1HR\ff&r?***ddd(W<[===R)Νcqm'>>cccV^իC]]$ %%%())>}:HRO3Ud2aO>ĤʪcYY/_EjcCEA ip{yݻ;o`` ""!jjj 1P.%\ c*lRRRV*+Le+ȼfP>U`ff&a@؛dWQbZZZBZrNqURgÇ=z4PAMMMx|Ӊf()))|/ Ը8lll022T8@?7QRR`wF4111Bx*|5z%/\@ii)]t%$$pm\\{accٳiҤ ;߬ٳөS4b3L8Q8{VxBDDrL駟Xl[sU&''#s999 y/ի̙33ĝ;w ٠A""""tRRR3f ;wfĉdgg_cޭaŗ_~Ɏ;d… n"""-GO#,5#J),,d̘1ajj֭[9r$2 !};=z4]v7{-Z 6PV-~V\#XTUUfȑHRhҤ fffFHHR&MǏ144׷X\Maa! `ƍiӆ#G-'Q* R6*"˖-իW;kkjU+d Կ"""oGIquuٙ3gХK6l؀+!!!iӆ-[(Yl#G$44JV||< ڶm+x-,, aȑDdggb +BCCQSS#==gϞ Oر͛s˚5kC1`>3dr 2d|W|,XСCqqqѣGdeeѳgOټy3ٽ{w<==\Օwݻwk׮T[6ޤ)bkkys K"""!'8p DFF2}t-ZD\\֭BJ1;wތ200 ''Gυ={rjB *n޼Ixx8G&88""""{ѬY3s(++WPӧ߿#GTcܹ &Re漨:EޥN/؉ѣG ;ܫ |VЯ_?~gAQ~I5N&&&}sd2;'NȎ;Xl^^^v""""==*ǎ#??FB֭rZ^,O?DϞ=ۜQȻ)""!I'ݺu~c߾} eOȑ#ԩkN֭[7] mڴ!66Xt)$$$pv۷iڴi >777.^Hnݰcƌ<|+WɄ $,,K.Jh""")=z`Μ9x{{ f">>^p(4lPP!_AcEԔCΣG|vv6ǎC.ӷo_6mĉnذJ5QrJc"""!' ==ktR!#M621ϟ?ɓ'&&&,^\ν{044e˖BaaadffsY:v),,dB .w}'[KiӦ ]vcǎ8::r%,Y:'OPRGu? rӧ3bos^TNK.oQYK.ҥK|0>&U$QY*Ϟ=ɓ'bhh('%%F)>ɋ/8^zEbb"Srrrhڴ)jjjՖwmcuo>9TTCwwCDDDF̪쥀-ZjRP,r5whTP'lum oßSDD#+ a%!,""""""""D4EDDDDDDDDȿd*V~#H툈| &55Yf1e?~ [ݲ{e„ \xĉCzz: PPr=6l؀AAAu3g^\t)nnnBwT^R6l`ӦM̙3777bbb>x""""""DDC鉽=(++Faa!w~ku@=DW\\t"8p/_ݻG{Ν;@Q@FF_ԩSxyyWjT*ĉSZZǏ{.G%%%">ԩS ''CqIJKKkwԩr(++#44ӧOSVVVcb\•+Wp;vRpn^""""ػw2rK ^Jtt4W\ykYd2ػwP#33 rss9t'N۷oNTT|0N>׻wrEd2r\xU!&&'''O XYYzDDJn޼ɦM+Wpܹ*effuV|}}o(,,HLL|=L8ϟ!~?,ɓ'v+͖-[HKKc>x~G(..;wT*~O߆D"ao}x >4m+++Ҙ={6[˭Z iРӇgC޽KZZAAA,[W2uT=zDJJ ())Cѣ?DB`` 666ܺuFu#\N9{,ϟu1rH2e \v DqrA.z̙ٳM6UY9s$V^O?ƍYv-K.eƍ̟?ѣGSPP˗IKK(W߿?ƾ}޽{햕Ahh`#0`)))H$hРPnpK$~G8ѣYn+V`ܹ}v֬Y?>-bܹܽ{YfԩSy1]tt\^cΝ;_P@]]SSwCD䯤3~xG*VyqΦe˖oߞ#F}%?@0W>.))Q0v+*ٓjq%)))A.ӱcGa.dՆ?D"nuTd*X^U2%H捷V\\, 00jWKII\s\.)(**nݺW f̘Y駟kbd2 cǎ͊瑞μyPQQyD>De̩Sؼy3P6l/ʽ7nٳg7+++JJJ d׮]`bbΝ;ٵk۶mC&FYYFFF4oSSS̩Y5..DƍsѬ\.]Mll,ZZZSlقT*%!!NHH---JKKپ};mڴx{{d7n̩S8u$$$0d_9z(GAIIIԺrIwL<'NY?/;wVZdggcll͛7V*}vGWW555hӦ XYYѨQ#{n{޽KBBQQQ888#理P())ACC>W?g̙ԩS(hݺ;;J2x`pvvfȐ! 9rAn$%%B+++vEdd$]vۛ[n}w˗#==@ǒӧtЁ#F0o>>}yQTT%C}x{{sq&NȖ-[8}Z쌛,^Ǐ3n8ˬY;v,͛7GKKSұc**(( 6gm6nܸ#::d郯/ܾ}___~gjժEdd$\pN: uu%%%4h1sL:t"PDѣ/z CCC8tw!>>^>rWE&Mm۶@`ӦMYgͤASSW33g uQSSt9oFYY1118;;)3f`ڴiϷ~Kaa[ x444ς'Nd1rQQQkNAAAѽ{wԸ}6JJJ888㱲e˖\|444߈M6DEEEDD'Oʊ^zQ^={.ʜ$%%ݻ޽;^… H$j׮ͦM"66Tj׮VO]͛79s&/m۶d2:t@tt4Ϩ>Ǐqk׮E]]DSSSpvvӬ[.]Ю];6nH۶mdʔ)$%%1w\"##)++vhjjraj׮-m۶4lؐ &T ;{,yyy7 ǏUcll.'O}}}k i֬vvv _NH郩) ۷W*꫉ 6‹/8q-[SNQ~}TTT8qԯ__N8_^=Opp0%%%fʕ pyyy^GGG͛G׮]qvv櫯bժUdee1h LJJ u͍|lll=z4VVVL}*knnׯJDEEB7c 9w.]k׮o]711sΜ?6mT:|/_bnn JJJhjjFYYc͚5xzzV)ZKKK)@aڵP^=P˗/sz꠪ʨ*066˗BP%##CښG2n8b8K^UEC֭[[""^r9ܸqƗʜ8q>}=0++-=roaPsҿVZL6 ___?w}podd$chhH.]Xv-1UV!Jy}!22 ,--"::lÕ+WfذacKի'OVV())Ȉ#prrbH$4i"hB'R?QWW'44kkkF!x% +V@WW瓖?eee3gCvt...3n8|}}iڴ) 2#GBbb"{{{_PN&DYY{ ƍs%ƌúuOIMM/СCt҅ .ЪU+8D͛ǪU011a֬YLHHhkk  z={/WQfРA˜(\g޽X[[W_IXX{&00KKK}GWW;>>xN:Pwu}?3o]b/%֠bF+**D({X1$(VD@@^~`1'1$k,}s~g~qqq|ii)CR\\$$$ T(}ܽ{Zxٲe @:ɳgψ'::ھڵk2i٬]gΜw.x'矫]8zhyyylݺ{~n޼x!yF|F̊+0a?Ǐ˴{nJE pUZbzBKK .j* iٲ% c„ ԬY===>|8۷ߟO2j(Zn͵k׸w磨ȦM5 $?N= <<-[;MMM7?777RSS)--W^4k֌ׯs444vx{{97odܹj ---<==e׏=zpi2339r$\z0MvvN?2iXYY^VVF޽?~<666ɨO|n\ȑ#y+1ٳ'5jԐIŋ U~<==YbH$?56l@GGDٶmW\AAAyqE{&N hD̙C^]6/}vͱ(((P\\̑#G8xP޽{),,d:tHy&<ƍs֬YCii)8pKIDD۶mcĉѣASSb6oތ`Đjbܹ z%FFFbggLj#3f GKK f̘ѣGrsXr%|=zp}(..f͚5Fxx8#F`ʔ)9s7n믿r-RSSqqqa֭룥ӧOqvvfɒ%ccc T9r3jjjDDDk.N!?fժU~z /8}4k֬VZ177';;[F3gj׮Mqq1ׯg͚EZZ?CK׮]kkk^zEǎ|27nMЦݻɓ'iٲ),e"nѺukvC۷/I\\bjjÇu***Ǐ[ŀ24H$k׎;wrvJ=ؽ{7NNNQfMvݻqpp ,,ݻ u6jjժ)YfsNJ Aݺue>%00֭[ӡC$ }wfǎH$ؿ?z˗2DEE憹9EEEtܙ;wr)ZlqsscժU2mgffriLBڵIII?~sss={FӦM ۷/4h@Bɯ"Kddd띜̓'O8s_vڅLJLMM)..7nMӦMIHH 88$100ܹs]+TDBjj*ՋP:wLxxpB͍Ǝ?Jrr2ҩS'\]]$11#G`dd$ƍ2n8{7oӧetDB\\7n333QQQA^^py-...jՊ'OƍYp!?&((eee4i¾}ؼy3C}}}=JRR;whԨlNNۗÇ,loWiiitؑ(f̘ŋ)((VVVq*sXZZ;~wwwKkjjJTT'O&))7oްl2۷oQFa``@RRK텺N:ӦM*kTŋ ݺuիjՊx-[ƙ3gŅmr rrryJcy {cǎlذA 6TgϞVZ }ڵktR^zҥK_~a͚5xyyUyxb޾}K.]8p 3gΤvナ ǏGAA)SPV-䋈[\ عs';wuuuFÇ A(((^ R^=ի's...SSS;Faa`W) RYKKK[ g͚ł 9r$...lذAf?3gh߾= 999ddd̉¿UTT(++L 4PQQAEE 6T:ၪ05j ''GII ԭ['O s SWemmԩSAo%%%䄕5k|n``@͚5UV~[R#C2l0�|Y:"Z;PUUٳԮ]ȿ/IS}b9z(/_d¡޽{CR) 4֖͛7Ӯ];"*F,Yo>&M.~~~l2qvvܜhsiii|ʜf̘A˖->6m֭[Yx1mڴ!%%<,--9tӦMcǎlܸÇgѢEt֍y ߟm۶i&~W_>'O899_5jЯ_?JJJضmsxxx?̞=sΡ1ڲo>6mT ϗt 5DDDD~×t>vZ&Ö#.|/*j0a/^[w#pssɉݳgϲl߿Bխ[7vdfǏsĉG""jjjAf)** b333rH$deeU[GvіLII>TGvv6%%%'+JKK'//O8PVVFll,`ddĤI 8<"++K_unEEET*%33KT*%;;\C4u*$*+HRU|JJJ{HR>ggg#J˿7qF#]TT~ ߉/++AAAps#Jy5]v%33Sc%%%ܿ 6s-؉'x,+""Ÿ3p@իGrr2֭ښΝ;S"""hԨFb֡Iǎ#G2a:vXER *9CCCFј7߰d|}}SSSbcc={6+WiӦe,,,@n׏ NhSXX-cРAbbbBQQ56^~=={K.lݺׯ_caa!hӢE ,,,G*bkk˰að%??={2}tT'\&M+-- 333F (--QF \صk׮][#F0vXԩ sΥWWWǑ#G޽;={???8q"{۷7I&1k,ʰaȑ;W^1l0;v,EEEX[[3ev""_2 r׮]ڵJz͚5ҥ iӦeRRz|O>ݝ2PT*EQQ֭[lII K,A*pƌ?!"DDD3ZnMAAWfܸqDDDp]屴`<_N@@Gɓ'DEEѮ];/_DWW___ppp`ԩXZZ Y'N͛{2a4++ 999VXPo5x5jh߾=iFFP$oXX͚5o0lllԩ\rL yX INNHGii)Ϟ=M62cߟŋcjjʓ'OhҤ ԫWZyJӧOchh˗/FIIs"//OÆ |2eee$''ӥKn=Yxw ֮]ˢEӧAFF.\@* vvvH$\\\8{,!!! >8v̚5K<#򯤰5kPTTDϞ=i޼9 ,`ͬYڴi#7o dee1dՑJ$%%1w\͹ua7oN^HNN&88B6l?@YY̞=&Mɓ'իWD" }}}ׯOYd ;vɉm۶ɘh\p:o>ԩׯYlΝիW~)((`͚529;;5?ҥKL24ܹ=>ƍҪU+6mD͚5iԨ8::ҹsg={F>}8wGٳg>}B֯_$&&2n8 ח#G̏fff$'' r>*(--eȑ,\ƍSF չ|2 6D[[uuuvyyyhjjڵkٸq#&M"<<o8{, 2DP[nqiAʮk׮ܹswbjjJxx87o&%%'NPTT$OF\DEEQvmR)HRԩŋYf ceӏ 0hvEvyܹs1cpMZjŻwfҥcPWWݻsaLMMQVVpM&MDf̈́Ν;ӳgOݻ7mڴa̙\tg@.]hԨϟՕÇ@Z022Ғ] \+޽ˆ  %88mm* 0l0:vHPPL2/_bff*;wd…n V^/6l&e!Ÿ,NJZZ3f̠I&L2ٳgsE4445@=iܸ13gիW(*V]ԗl.buٳ<777:v숎=~S4iΝc͚5tؑ%K=)))W"lkk˩SƆnݺD"aРAU򧤤P^^ΥK022֖3f>tϞ=6lƆONnn.biiI||<Νc4hЀv'߻w۷oW1djjjL:{{{JKKwq /^ofĈbggW>EEEnҥK򢨨Gtttfl߾5kbee- 6LGŵk׸~3A^^f͚ѡCttt?̓pvvZSi [JQTTv>***PRR"?ԐH$AzozB޼y#SD"/++ >144qB_\]]ܹ3۷oGNN!CcYUEEE$Y}}}Q%%%GF;W)))A"F;! #\|ݻwsܹ}ѻwo4i+y40E?NLL ښׯO?₦&7NƍٙD__˗g.]ĉ9<͚5cҤI_Ν;3tP QF3x`zͱc\rԘ8q"޽[h} 6lM6% Q*;wp ϏCѡClllغu+M4!$$~I(Ʉ  xٳg=zObggGÆ 駟hٲ%saڵ2zh033CYYqƱl2nʴi駟4hmڴرc1zh-Z ܹs'Oһwolmmd\5S鸻CΞ=eee7Ν;ĉ?~<ݻwMQQvvv9Jll,666\~޽{GǎQQQߟÇI4hzzz2+ 21cưtRƎ-Ç]vXZZ ./hѢOroK")rrr(..D'~ؽ{wJ*{|vD^n޼Ixx83gΤ sss6mT_=T4OOwADD?FOTUV}EjԨ***k.q?G?!e˖ rh!CӚ/_͛2i̘1C&CԬʪڳ""BΝCkFEm۶}[YY)))WX!tرcz% G Z{Ν;i#Gp=4n޽VZׯ IKMM9Եw^QW[D0b )((}4mڔ=zp:9۷۷lڴ]bddիWٵk\|wwj{.qqq9_}y||<:uxȼy#88:`jjիWy͛7ʊ3gCt"=z'''߿3=_~xBPhтW^ ҧ;v,ofʕѭ[7^z֭[Yr%[lgϞ4j?~9Ɯ?7oЮ];HǎC5&&&{qaaaAϞ= ÇcddDff&\xzꑞΉ'N_ra sδiӆc8{_mQRRo߾2iׯԩS@DDDD>#tޝPJaa! .dܾ}ݻǜ9sx"̝;oooN<)XqqqDEErJ"0 BgӦM>>hӧ3p@9{,AAA4mUUUN<͛3f l߾   6?3 @LL )))\///222ˣO>t8<듕ɓ'K.HRcP~}ӫ7W?#>UV())cׯ6{fܹ 80zEDDfffMӦMq ///hᆄ|д"::6mЩS'VZEv툉A梬Lhh(C ANNN8`C:0Zh˗133#11LMM#**nݺѡCv]NmXX̾:ļy%44TMMMy-5"""-ZStuuz*DEEQN5k?3}ŋ :p(+g'44իWdddƢEhԨ;vŋ\peee߿ϐ!Cddʆo޼!33p6mDtt4 l۶ ---/^͛wHnnзo_ҥK9rZZZ4lttthҤ +++ ٷo_\\\8p믿~`޽U[XX3oF]]ggg ŋ !J 甔Kzz:֭4155{]+vȑűb 5hԨ,Y-[RN&''ݻwĤIX`Ǐ'>>yy!:u"..!CC4haaaӧO֭[Gzz:C%&&Cr]K 3f ,Zgggn݊NNNGf޼yxzzҰaC|}}_*dddmf011a˖-PaNVVRuRV-cjjJ߾}IKK#** ++++QSS eeeŽ""ADa3gʖ-[ 00s:u*eeeC갳cܳ,e%i`:B:w 7n޽{,_---:… %==KKKׯ޽{111AWW1c0tP;ٳYv-GA__3gxb&Mjjj9͛cll.ԭ[W*!I//*giܸ1Nq4oޜm۶}iw` DD0TUUٰa;vd4k֌/ ޽RA1Ã-[#eddqoߦT@-ˋ|و?NJ֭Kݺu?Z揺9PDD!553gpmԪ|l&H$n999qWDD俇 i3EEEzԩSЍٳ4lPz=_r$jժŶmpuuĉUDgϞz("""&&&ӧӻwofϞMjj꟮8q/ݧΘ1c3f ~-7nڵk[gVVV{7+r 7n?Ӷm[e̘1 0Ǔt8NJ^^?5\Fɓ;;?]_ZZa??(-SXWʺu>؟6m5OKxx8vZnJ^5k;vGGGvQ%*`www|555&OLii)kצq1gMMM/**R뇃CJrQY*INN:_hh(c׮]ď?(Aq"ZZZL>47oή]]x#IFI`` UVI>}"""{!'' """"U={F6md쐗ԩǙ>>̙3M6 i+Vr?f…8::R\\Y޼yuFS/i_^ P???AlsS9梢"\]]ٸqҮȿ1quvͬYuFFF[c|˓ǝ;w$44ϟyf.\@II {eΝ8cغuR{ oNzz:l۶m۶Ѿdzm6x)!!!l߾ ∉AQBlڴZ7 ܹs-۹(((`Ϟ=B7nӧ ++ݻw~ѣ\r]vիO N<֭[e˖&s\̞=ccc~Wf̘Aaa!Fff&7ӧӇz*5;;ڵ+z`DDgψz {{{Ν;G͚5QVVh9UUU$ xzz2qD۷;믿͍UV?ЪU+Xt)V"$$T?JJJlHiРAcllLjj*IIIϟ?K.r LMM)**bXYYzjك+V ##AAA\|Yx"ܿҰaCR)rrrHLLQWWD^zEXX)))(++3tPaU *VM*L0AU򔗗FJJ IIIdeeѪU+~: 6ۜ={N:Ƹq㰶ttthKKK"''GXQSSɓ'DDDED)]F.]Xr%ϟ rDDm۶ENNcǎѵkWH$L4G2sL\]]),,udze:v(܇qqqASS4iB^^~C_%KsN455)// ;;;Ξ=KVV]t!44{1|*}&11f͚rJ455Y=(++cСl߾ Dƍ{.tԉApYn4nmmm222hݺ5EEEXZZbeeU˗/Ã-[вeK6mJ֭m۶UR%R3ccΧ9Va,96fv`9ƐxWRJN:s;ls}Nw]\l2t"<yW\zO>%%%0a#صkꊮ.opO>!443f쌊 /^sxxxBxx8[f񸸸[oqpssSAm vEhhBN ۷oʕ+Uz*7oFWWse222OINNF"psvZ}:>>>)//ݻ >dTTT7nӧOa BCC)//Ғ#Gr=ǴvZ^ƍe2n8222011A]]N &&&鉉 ӧOʊYfqǻ/ˇ!22Ç4|'<|犈]"''_H$988cQVVFEE:ٳB[VV լ_o>dddwo&>>ZƏϊ+PSS#%%EEEa4zzz())"KMM LLL;w.SL!!!si.HС TWW[ozj %$$ 7\|z D899IIIqYɡ+++qvv&11YJJJ033K.Cv8wH$퉏CaggGYY>ޞ/MĄ8JJJ"-- qpp=z}v:vÇo͛pޛrG@@fff$$$`ddĭ["44T“ppp 114UUUt֍[Ҿ}{,XÇM"(++ӪU+t"emm͓'OHHHIϞ=iӦ ZZZ2l0011M6XZZbffFΝQVVfРATWWcff::: 2b)--CSSGѣG9r$wɓ'x{{qFڵk'l>yڷoRm;w&11MMMPRRaÆ Pؠ)mڴCzZQQ'8::Dee%^^^hhhڦNК'Ƽ J6#FL S {TI3;&"""[?UU! @w7;~-4}.m޽={E!C;E=o:]Cs[~s}!{!""""""2sL_b,J῀Ç"~vYK:uJJi3oS $~-)Y[<7bŊ߭ygq=}smܸǡmYUJJJhiiR[]GHXXnEEEZ@vA݋*EEE̙3www>jkkYp!&&&TŋQRR믿3f uuuqQRSS '44`bյEǠ4\\\C[[oD … ܿ;wj!!!ד֭[ϏJϟ /`iӦE)bllLee%uuuOnn.`ʕ\zU555Պ .\>syzjvF~~~ƍC]]]pɚ={6Ƃ a9~-O<%Y3g۷y˖-()) ĉhѕKD̯~}c<'tm$mLJ@f̘AvvZ}/+9Rjys}:UUU9tjjj,--%66=}uZBUU_~E8R=/{e󭥥űcDŽ k/WǏ7\g#jBrrr&$$ pqqAOOQ2##rcًI%KKKK.Jɣ=$֮]+>cff&ݻӫW/OQQFFFtSSS/<ݻwӾ}{(QfǎDGG3l0x aE[nK3FJYDBMM fScܹ|WrE3f 2sL>#011aԨQX9B^aԨQ,^f͚Ųelݺ\]]122jb b2|tuuqqqIݻ7^^^8q'ORRR®]ۛ'Oѣ >ǓɪU£CERRvvv}ll,[n嫯ݻ(++өS'&OsaΝr!bbbgܹSQQ}d:vȆ (((ҥK;wv;3f \xnݺL@@nnnL4{|r ͛7ɓ' ޞk׮1tP,X]E^/W,\___A;`VZs|n;Mh".].NNN|Bov>}:|:uJy"552tttŅ%K0i$v=zDmm- ,hׯ_gȑп,Y°ah۶-DEE RHJJJ:t <<8177А%K =z믿~h~hh(SLaٜ:uJA6E.ccc޽KUUԊǏ[t!==]鵳ՕE1vfږtkkkBSSbJJJu|5{kiiD"V{ڶmKdd$yyyݯ}z  XǏz*/^d„ allLVVjjjҾ}{;w.ׯ_޽{X[[3o<(((-_www,,,{nݺzzz1bY`:u"??'Oxb>ddd ={o>N8,cƌ={Muu5ܾ}7oϠASRR(--@P_ܜLLL%++yO?#:t耏ޞ'O63! > Xz5ZZZIiC.\(89s)&ccc>| eĉB]۷o‚wy}}}yyyBCC???(--濠UUUjkk߿?ǎCOOhLqk׮EEEcggǓ'OOdddb͚5梩ɰa8|0Gqq1ÇGAA Ǝˊ+m۶жm[deeoB% SN ϙ3[>cFϟk׮?n& !h">c!6""UVh"֯_ݻٵkx?kN0ydf̘46zf888{n>f}[~=QQQ\p)Sl2ذaeeeL8\":<[[[<==H$%4m>z*W׷ѣqqq777OVVG1cyyylܸsssv܉Ǐg|GB  ?5̙3֭[ⅲio&rrr,[kײtRXd ۶mc(++Š+>|x3ǓGAA [[[vI@@B{ώYDL^^qqqpQd˖-8;;#Hӧ222tܙwrAz͓'OpttdΝ"@XX:uիRO> 㩫GGGKjkkFCCh<<>^0prr"==mmm߹s'H$ݥB;wJ޽{###Cvv6666ӿ$ 梮!<ڒH$OǎPmҫWp9}uuuڵkG^ի@?_Ϟ=g155544CHh &D[n;lMv괰 "dddprrSϳ8;;ꊭmcrrrt֍޽{ ݺu===dee֭E}ٷoYYY 2vabbB߾}TGGG<==OxV|yyyݱd@47MsߵkWj mM6RgZwނ!,...۷E6l[SߌyyyjݻwQӧjjj <;םI ^4DGG&sZ ƽ{߿` Q\\̜9s011UV``` u]QTT͛еkWѹ%ᅬ#BPԳgOe̙qyZj7o$442f͍SNQXX;ÇGFF89r$yyyҦM􈌌SSS 011{PSSCNpqq֭[XZZ2|RRR022?#%%&L%)))<}www!,;;[xXXXݺu#22[[[}剈@WW}}}剉AGG_X}766ƍ(++ӷo_dڴiGHOyhjjҾ}{O>hii ohhHFF'Nz•NCCGVMMMRRR[[[bccf͚5`nn.[YYQ]]M׮]#-- wNZZ舚uuuRc5T4hg̙ 0۷s1. 5ĵ|?۷STT$#IOOg_a!q_#8wTQQQ/ ܹ#4`TWWSTTD]]qqq14_TT#k.Μ9#iS&"gp…gٺuk &ظq#DGG B6nRmޛ7oJ]DD(b 9r$L:h4e…ŠA~[E0c RRRݖ=z4'N ,,7oCؿ?v믿f̙cLj%ٸqPرcz*&Lhs :w}Grr2x… 9x ~~~PRR? ߿?}qq呑Arr2iiiTTT0sLݻ\駟Z'p֭7L0;w4L(u>֬YCCC˗/dcbb7orH,--9|0FFFՋ~CߧVQ+L6 &L[osK``8>>>|ᇴjՊ2PUUE[[HZܹs 0eee=z4'NgϞXZZRQQAdd$ DEEo! 4*z888н{w\BEEVEC ׁ`}||BWWWĉlڴ7xHGOO'Bzz:3gΤwгgO~ ??_p۶mW\ĉlݺ3339}4;vh׆.]1l۶ɓ'j*~lmm ~:'N 33eeeFcǐR"##cłMCC-BUU2FҥK9}4.]ۛ5kp--[k׮ sss~GLLLHIIٳ!Hؽ{7SLΎ˗/3yd<'|.| 7DΝ;{\t})(R\r>iӦb A" 7|jrrrpqq?dر6|'BBBBŜK.W_}Ŋ+(//JÀX~=[GJ."b&;tRKtRɕ&hחR)\@QTTp͙7o%%%/dzg9x 'Nd@Gx w>zL [<$̝Q^^]vח}K,Vhhh줡q%yM钒hݺ5Ŕ -Q^^.(Y_SSS /7o#Ge RN>>>l޼Anݢݻw+x4ƦnZH!155___a^4?> hhhϟGCCC|}}=ռ{LMMe899t***˓\r}}frrr0ydzɑ#Ghhh@GGB:v숗fܹ`ccW_}O?|WE^b i nh"Yf UUU65...ֲo> qwwg|/mn޼ɗ_~/NNND^ٳ'ܹqqF ٸq#ky~G$ z]v444pa ~S.}С1|pm۶=? ";;?+V vb=oڴi^ZXm}vNJxx8~~~9t萐2kVXu'//k׮ ˜>}:䄕... f#Æ #<}:^^^tؑ;dz1113w\Ο??]yұcG]ƲeHHH@WWqƑĪUCpѣoE>}PRRѣGrr2}'O$332V\)uu*a1ymy.b 걱aϞ=B﫤ɺ"/UUUq fΜj*jg϶h*Xf_Ҏ_]Dž~L 1CPPPJCxQСCYnÆ ҥK :99!쌯/K.EVVYYY|gꐓCYY'O#oݺP6^^^̞=KXT:ĉypqqꋋ)--EMM )))A]]r xvϟ?O6mx뭷w9jWWWk sss-[ 갲2ӽ{wnܸ!S\\ SDD͎;(..w_RSS(((O?3f̠˗cbbBAA_O&**\չtWfȑкukvwO+@Lxbhh5hjj2~x,Yŋ)--htRUUݥKhM@@o65ʇݛ7nHf6#B?˖-cٲeTWWpNS*Ç\ɓ'KLL }ԩS\|YeyFMM VZ4>}' e;"""2d/fŊ;vc_|Axxz$rЭ[7BCCٺu`Xԧ&s>7ܳgBZܹsYx1K.%--e˖/ׯ_ٙ3fb LLL͋Mv"""}!$ : ; ,18::RZZFFFH$y&zj"""K.,\˗/JMM ۷ÇS"""'##h4߹s'rlΞ=D"a/ .))$"'#ӓcDzrJ1b8;;3o<_8r`EoaÆlj'bӦMTVVo><<<6lW\!88ƍG}}= ''Ǽy6liNPQGX_oz֭/,o``@^>|8:::/_MM*""",RRR $$$ѣGӪU+)[;vHH$̘1wyY]ׯ_ ..NxkN۶mkyR["""@Xk}}*}ͤDDDٴmۖK.ѡC!EYF:WDDDe$33 6p,,,Xt)9r[[[lmmW\:E߀cƌ kef?@^^fĈ;w3f0zhRSSR2F ceekŬZЯr !!!\pA܄*""JW| ӧO hTIXj}ZZZٳ 6 ##޽{/|NJuu5X[[/TWW3`CSSݻwTLDDDLUU/^d?~\YҨ 99"""?@bb]14hw_:u*k׮呗ĉ9< dffKAAШG7|#Νc|(EDDD^-;w$(((9r$dذaH$;Ŝ9s{/""o@ KWXX 3h Z#::пfF;АONPPc)""a <ggg6mgϞɉW 6mx"⃈E o&9uuu@cкm6F ޽{SS=kQ[[ ǏFC9s7߰vZƍJ$"""wұcG.]ԩS9}p-|h<==X~=:u)""/C ͍^zC߾}QSSh"f̘ŋ[cLΝ;5ꕎEu޾}O~<˗/sm]ŷȟϓ'O.yU/~DW̶m8x 222Ցʑ#G=z Ϗ:P[[ IIIooovMMM /FCC[oE׮]9s W^ooon޼ɉ'>|8lٲ@222k W_}<|>$66pF)Ǐ$ߏ:-BNNzmllOk.JJJXx1ZznN8AJJ ?={… IJJʕ+#''ǤIزe L:;Hee%:ut3fscΝ(((pE.\ GK.XXX:s fffxzzi&t"~_~\r~qYHLL x{{ܾnݺŒ%Kpss \_Mvv6GEEE:f̘}2eTZ%--C&cJbb"zn",hy IDATY7|#8J~gurQ>|N||{wޡs}233z"##sRWWӧOqTTTNii)'//ׯS^^Njj*ܾ}G@[TTwޕCKK ddd֭[H%22|H]]8ŵWHvv6ݺuаŴ'OPXXH߾}Op=zDFF4z'11RUUEvv6|nD^@ǶmX|^zz:m۶}9<]v444Vtt4fBKK >S9µk077333ƎK}}= 01cPTT?[nV`ߟGBB蠧@\\ .DII ٵk j*u B稨(̙6:::ܺu oooQSSCAAlx 8p?gϞǏ +ؙx{{Ӻuk{Eu/z+JQPDPcc/E}ш5QcK `7ЫDDp ,m)M뺼sf]f3sʕ+z*@C!Pŵdlmm133#%%GGG3-gϞCwwwqww4nܘ455ٸqc޿ū:DDJ2d!!! 0:3񨫫 ݛXϟϓ'OHHH`ɒ%g"""8ryyy\~yaaaA@@/_dXZZ#QUUuhذ!6m"&&/nݺiѢ&MB&d444رcGzJKK֦O>###&O\+bٲe\~{a222tDEEl2";;EP(Xf R;wP(Xn>|SNqڵZ}~:?#|wܻw|TTmڴA"|rJ%? Ç={6UUUlݺLFEEK,AMM 6T*Yb_~%jjj|嗔? \$$$$ꌇ/^`Ÿ2~x***@UUt֮]KAAΝ###@*++QWW5N0qD222qՕ &gW@ 7oӄ@II W\ŋܼy988bbbPSSАZՕ8 cǎ`zmZl%%%ceeNRRRW122ܾ}H&`CWW]Ҷm[ՑH$PZZkJddd 4s8::"##k +Ww^ ȕ+W!>>www=zQ*;B[Ƅs"##>(JtH$½())˗lْ pww͛?/_R\\/^dxxxP\\ǏYf `jj~~~?{P>|2犈]}qapuuU&66V:Ұax%yyyL8CO?1i$pww̌ҥ M6e…~TTT O>Uݍ72c /eҤI :˗/1b[neԨQTUUV[槟~ŋ\pZ{.455iذ! bԩܹs___x ?GGGtB-011!$$-ZЪU+'O9&&&2uTZn?;v`dffJdd$lܸS"Jz:w-]v UUU077g߾}Ջ ФI***jMQ(ݝHڴiS]vƑ#G8p 999tV^ͼy];y% FGP(8v={$44?"o=b quuECC3336o,,|gy}4hЀ{"JҤI̦MPSSc߾}bggGvv6+V;;;$ 3g͍ &ЦMiѢWbggNJ+ͥiӦ|릦^,ܰaΜ9ذk׮_?FFFرCw˗/|I}غu+|70}t&N9#F`ƍh"u\.M6t 555<<ذj*$ M6SN|4nܘkעƆݻwcmm̀2e x{{P(:u*a0117ϟO.]8p TSWBԔq ﷻ; ,xmMdBӦMi۶-͚575jDQQO<Ғ~9|0$$$ի9z(=>N:[ɚϓKLLL=SLaСx{{-QTѷo_&LP'}}}zeGWWR˗ׯvdd$DEEN||<7ȑ#nݚǏ  S顢BHHd2ʈEWW|LLLx|///5RRRɓ'W~LRR4nܘl455qppի[ػpm<==QWWBQ3../;v?~<-""". .""Y`cƌymC EEE3"a15/"77/5H$z{WUU EDDDDD~/k֬  XM!l߾] C&98v;vV縪*k׮jɋx%KsN>-+0l0=zum?/""""" oRN8/ݻ9x \Ν;ر#P׶b vYGݻ'2:v숊 eee8p;vPVVRĉ:tHЍ~:/^DGG $W^hԨQ155%,,k?#lܸչV۷oڈbccy۶mOk.nݺB$n߾ T{nxU6o,RTPSHپ};%%%+lLgܹscll\k\|-""[_lXX.\ $$- ʕ+@u`YYϞ=ӧ(JN<ɖ-[ꝅ% ׯcooOZZ۷o?44`Ο?_oEDdzo߾Z K.|ff&?#{̙3o…  Fİyzٲeow߽6+os!7̙3ӧǏ'==wwwѣd2wNVV`dd$ Tr>:bm̙3t OqAX~=tuuuVZEÆ )**ԩS(JΝ>-Z !!h '>>FYK Rɘ1cvaf̘Att4\x[nѮ];V\IRRSN̟?8:wLii)K.K.L<vG*j*7o.ldx/^ ˱cd2GAUU'''!U*̜9Ν;rJ!.//wԩS<|D!wtڵ{xblmmٶmgϦm۶ݻlvލ6'OD* }~jj*۷ou$$$PVV&d,XlܸqJUUU,\.<STTDII قCaa!JRIIII:555FMjjj-#$[΄ 8w˗/k!eee gr^x!.HL&7bٲe `IIpM2 B!6Bٚ:}rH$TZQQŵʕR\\LAAA/_ֺޚ\AOUrrrA* y?+++),,Toaa!\.G"PVV&UÐBAS&z ʫegg#Q*SQQ!233)++C&ѪU+*++Ôw%V~@ RjtY֖ƍ;}8t.]555A@p&zur |hтB$ 'OaÆ(Jϑ#G C]]+WNff&лwo:v숋 -[$11m۶1k,݋'N$wje޽߿a r^#?fdz00a...1x`5kFv툌ǏcjjJUUdϞ=L|Wd2m_bbb*ƌ::: nݚ-Z:R'Odڴiкukߏ&uL&uָ`aaANNڸann`3 yrq&MD-hݺ5 :f͚+h|j :?k@DDΝKRRk׮ɓ',]pfϞMjj*ݺu#88[2c f̘AQQ9eee9V'Oݻ -[ܹs۷SQQܹsILLd( IHH?ѣG}v֬YL&cժUDFF2sL$ '>>'C6nȩS駟kDEEՓ C.gG=8u6mbԩ(J8r۶mu_|ɔ)S ڵkڲo>YjUOHHP#6l2#Gp 8kXh%%%B]_|/_fxxxƒ%KfѢEdeeѣGΝ;G}T; [%Kp >|Ȋ+{.ɓ'= JJJɉǏ֭[9}zrr2>N̛7DLBEEÆ ~`̘1:t?$ VryΦ{\xKB JGGGƎñ%99MMM^|IYY :___"##srr]v蠢BϞ=8p`O07ng]<|2ڶm&?dᨨC6mȑ#CƲ}vhڴ)ƍcܸq룪LYr%}%==Ld27oݝrttts r T*yUUUҨ7/--k$O߾}ܻXݑhhhP(H$R^^yyyĐ:,^^ ={Ʒ~K۶mQQQɓ':u ///AMMMo;vxmۀD"L:5kдiS޽ZZZt֍aÆ|ra&UV۷===A#ܹѣ%ǕJuq)*++IJJŅK.aooOn݄gL͛Yn}5u|wXXXAQ(ܿ <<R8L&$$вeKh޼9f͚5١0a>>>ܻwO{a|G 8*++ٱcjjjHR5k&UQQa 2uuu055{SPP- 4&8~8T2331bfffn:LBϞ=WWW $}&}Yܹ˗/3h lmmYjϟ'11]]]SNtޝ2&M$?p@ʢK.oߞN:qakϢE022O>8880gÙ0aG8ÇӧOqssחd֮] 3 ^e͚5{U˖-4hP ={‚_ ɓH$,Z4ذaCg̘/W^ 4H9s&VVV|uLDD;vٙ cر|DFFҩS'1+WdڴiӹsgFÅ28;;ɓZPVPP -[АڷoϨQ;v,6 IDATR d2***!)))s1)..חѣG3p@9ugϞRJ%weʔ)ݛϟc#Gݝ/^fBUԤԘkH$ͅΎׯccc\.Ύnݺ1m4!#:t@||<9Iyy92 KKK*++)//'<<###ٹs` {2P(ܾ}+++033֭[t֍X@[[~744LLj֭QQQtܹ&Ʉ ҥKMVx)**JcnnNQQzzz蠩*rCCC~g5kFAAzzzӪU+!m۶[:"o-gΜ!::MMM}w.i`:ݻ6ÇӧܹsssszEhh(...B۷177iӦrQٳhd2nJ˖-yI-7ɂ=* 88%ݻwGSS~MMMa2ڵk]JJJ W^e˖-d2Ν;{TVVbaaAZW^%++QFC>)))͛annNf͐Jۙ={6`ooOׯ@'pttΎvqIkQӣG>|H\\ChjjҫW/LLLغu+1`122]b۶mR^^СCIII!,, 0h iذ!޽?  RɃ+WЮ]ZaYYY8p?sQVVWs=<<022B&q!@EUU;wٱcݺu#!!Bd2ݺu4o---ttt055eǎ|魯ƻ4""""]@Oee%'OGZqyy7yB""""""b444!""sN<,&Jjrd%HOO |#b y=6r֭Z'&&Y r.\ӧO_nbb"O>y Tʝ;wHLL<}SN \ZZ邢ē'Ox葠>QQQQ:uJXfILL/!11 .P(<]՛Ar劰/ Toz !;;69u`h@zz[q9㷮ӧ|W8qBOJJٳg))JRpn!&&Fx={T*EPR ڝ2 ./6/[L qDD U& 6m'+LzDFF J%|o." o c.]Jaa!W&33bbb(++c̘1<{y:®`R`Μ9{Χ~ʍ7dxbڴ\vI&gd2III駟K|vBKK VdӦM<{N{UUU?EEEY]g\!x|!ϧŋ#˙8q"<2O%)) sssf͚ IlٲUR)gFKK3f ٴi/&MMM>}JO>!44TK,UV̙3)S2mqnݺ͛79uPJ_PYYIQQb֮]+&jii Vϟ?𪪪>}p]-/"Of {YlK [.^ȱczkbԇ > jd^xرcסP(hР=?y7s0ۗ3gΠͱc}.`FGG˗@& kqS3f k׮O>UVѣ"''_.Ĥ֗Ȉ#{nQQQDEE&ѸSQQZixGUU*"""YfѴiSz*|=zd.\*ҰaCJJJP(/^lj';v,~~~߿$ZlR7*666о}{[[[ t-BEE+W?5z5zdϞ=tЁRiԨ5 OOO._LTTpy郯PGyy9}I?ΥKРׯsUL".y۸q?ٳ?~#Gf222dСBٓ'Or!'H%nٲo0qD:ıcLjݻѱcGR)EEEDGG3uTTTTz*gܹΝ;ݻud['''>}ȑ#;w.AAAtRA<''˗/ceeEǎ:u*SL!::f͚MXX_}۶mёϟ 9>>p9 z*6mbرуk׮1x`7oFFF۷[[[rrre 2XI&|GCCCŋtuuuApm/^̍7())̙3ٳg3h ANtٜ>}"޽ˮ]5kJ(ڴiüy \NF|2{u}RRR8vXZZa\]]9z(z"665kְfZhG^k- A^|)3* qsscڵ,]z>|(R~vZ֯_q B0 Ւ@ ÇӫW/R)O>CѫW/R`e2[K6n… iР[ӧXXX@V꽮*** j4:$226m (// 8q"V믿ĉtЁnݺaeeEff& 4 99Y,..f׮]EEETVVO?NJJ ѨQמgRRRh"K.\Hnn./G\|Yr%saĈlذÇs mŋ2'$$}J >5kְi&ѣk׮`'ɏ?ƍF ppp <cƌ!%%CCCiذ!fff1GGGTUUYz5| -ݝ]vѪU+=rݺuL6 333ŅZnewΈ#s666]c5\)͛7gɂȑ#5k/^L'//iӦjo-z:u\YbSL?{2oSɉpZlnnnL< ׯcQ% <7o zzz|ᇌ7ǏsN|||1bܻwu։)g0b ņ  `ܺu f͚ <gѣ(JFI߾}155ӓ~1d.]D"a$$$qF8q2L|uUfϞͪUptt{Ջ{all\/5ӤI6nȀppp`˖-gJ[[[:vH߾})((`ʕrƌCtt4˖->}p}RSS2e X[[!|}1fܹCJJ ~)<~R=IҢo߾k/fǎ|TVVs,YBZZGӧxbΝ;D"MX9(++cڴi,_Ν;Ӿ}{ DNNW6UΘ1={F^(,,dɒ%x!"6q *++QUUʕ+uH\\\ h<<<UUUJKK3߿Oqq1zzzhkkrJ***BP%85rIM"j?##f͚#?3dff윗$'' ZcffƆ hii՚ńj7˚$IJ455ILL555 Vy fffذayyy4jԈxܐH$KСCk׮ ۨdeeѶm[^|Ittth### tX1+++ɓ'SZZJII ZZZ?777"## prrbŊVY3s0`8;; 5&KKK!~ՔDBjMO?yVLXXX-[{踣o鉍 ***xzz'SSZ3 @ƍFGGGGG ԩ:ue˖bccP˩U֭ZaÆҵkW122S>!!MMM̙#Hzzz TUU}}}444ܹ3Z|||pqqZsmmmv*Xijii{6... nbbRҥ XZZҭ[7^+@i׮zzz r&MPWWq쌶6jjjеkW  QUU???' w7~7l>}Y ;9oĄ`*++QSSۛdGWۇ9ׯ_g|5556l!M6jR455i׮( ***t"L\.ˋ2nܸA #GrlҤ !!!駟 CBUEEQQQꢡA&MʊޫQTTDpp0J1cJ300 ''fKKKquu֭[Z"%%HMMˋC___~zyЊѣGy% B[NNPhd2Ϊ*9_ ̙Cjj*eeeB=Jld2yyyݜ={Ыڽٳ/ۂ`є內'HRYlϟ'-- TʠAŋL0zԩgԨQH$ZJKKYhImҥXYY1c }p!LMM ;;gAFF7odƌ̛7{rJձؘ+VЮ];VXÇ\C||# ƬYꫯXh2ӧOcnnN6m(//DΝ̙38p ̟? ;v,ׯ'>>dJ%[nܜիW_c gŊ\p 5yS# QQQo---bbbhܸ1~zvJee% 4 66֭[QHHHSX⏋y^xg888P\\ TCNNj6HPճ)7رcBA@zz:ӧO߿V*qqqlRÃ?̚5 '88???$ :::9s=zAAAmB!dl޼޽{ӵkWIHH@WW2d2 Bp{ .$88c &&& 6͛Ν;W_ | k׎Z ի,X>8;;S^*\3 h޼9nnn̚5> ###{=Νʕ+ }п}rA"""8p QQQd.]J^^ K.H$֭[0޿>s6nq3g˖-C.3ezemϸjq022"88xQUU%((~q<<<(//4]#""@CCCCCRSSiҤ^E^^|DEE!(**bH$rrrdF?QGXoݻl۶ 6`ffFBB.]bٯ=g͔#JY|o1{l/_.XE3x40E Ɓ8w~-3gDMM ӑJaOPQQa޽3f0|f͚E`` ~~~hhh5~~~Hƍ===qcΜ9|x7#,";55TVVT*uY}d?wi?N\\Χ~wڅ^^^QEDmޥ1T4j 4Ri`w͛#J144 W^BA EDDDDJر.occ{#""OD,'""""""""D EDDDDDDDDȿ1W""""""""""J@XDDDDDDDD_ɟ*P(DDDD~RwwADDDDO ն IDATEYb6o;!""""""""D $qpp@__O[EE?^3oE |-r刻~r,--ܴiӐH$hjjyɓքPXXHll,coo\>FB*r>=NNNlْ>}͛7qrr+**?>EEEZرc:ޠA>C=?-ڢT*x=[TT󩨨`ڴi,YEWu[呜?͛73f ׯ_gժUB F^+ .\@EEp͍QF1p@H$\p#Fjwޔqy444pqqAU5VVV鳆|Wdff̙3sN}WSSh޼9\p{{{ QWW⿽"""""""""¿DTgz쉺:GL47:::abbύ79r$˗/ɓ'4o߿?B[ ĉcaaA\\\9sx:}H$Fp<55}}}ӅcMW^MPPٳgO""""""""v@ 99]]]عs'{8;;͛c``1cw޸D߾}8s UUUﺺՋ??RɤI۷/`\]]k377`nnÇc>>L&BzDϞ=)..ڵkUO>5zݻ :X6{߸q#rꃈvhҤ 2 mmm ?\k㪪چGdFpBMœppLL4NS4MIS{ ;ĩ[# )sVCs$EdEA@+SɸH{ֵ\.MMM,YŒ3(//'66A#G`ff+B``}{fjj 8q'Nː!C8rGaXYYn!BoO<'NCrr2>z_1bgՕxzmBCCc„ 5ؿN~̨nЦO>aaaQɓ'ILL]vnR*V!,033_<0b-ZDHH:uR0Ŗ-[kЏ \~;;;\]]%*;w|r p݄ ^/?J>z/׍9.] B!fFxܹ̝; .^QQQ̚5ݻw%555 2A?fٲeDFFr-ZjիW1cNҥKfcsrr8z(!!!\x{{{:h OOOvŔ)SKKKϟϕ+W;[B!HmnÇٳ' K.7۷oӵkWKEE.\@WWAnwڵF /Я_?̸p}ѱcGzA6m(--%<?~֭[;ǎW^lذ5~~~xyyLv(r!B?cŋ7o/&**0d"##]6lcY!BI" ښ4RRRƆTB!iDDDuuuߢ2dgΜaǎ7o^^^I~(z!B!1b %--Kb``)SCBBu]tASS&B!$)=zyssscDB!12%)B!%IB!D$B!h$B!͒$B!YDX!B4K !BfIGƍlݺ۷ @@@ ^z={pZr%111mP(Xlǎ{LQQ\\ƍJ_۶mcժUj֬YCmmCtvAAAK.%44ABܹs~N:PcB!D?B555 4OOO/^O?ٳgK/ѻwof͚Hb5j%yJ~ѵk366&..ӧO?hȇҗ.6lUUUIuuC㮢"_N˖- ŋ \~>]]]222Рn޼IZZfff={+B<)#TVVFff&ӧO_ϏWrFSO=@]]K.eժUs6l 99^zݻS^^%<<0sL΄ p˖-cҤIꫤ+Njj*˖-#99JygPTL4 ***x7xwhӦ Ƽk]~?gΎ ;hiiilݺU}ӼKL>_~͛7cccǏ祗^Օ({9222b߾}Һuk;Chh(wf͚59]]]LMM`qJ%cǎŅ7nܹsqtt?~=L:.]?pQV^Ν;?~+++n߾M@@@/FGGmmmpss`޼ylْΝ;ӲeKKVV}APзo_x% B,I") ػw/?37nh.#FP';wTB__իWT*9+uuu`nnΤI0331c[n6557oR^^>C˖-QT?cǎQ^^ɓ>}:TFE.KKKLLL077GTT*G___l044TU]]ѣ9r$捎offVw+J222r o&3gDSS ud}PSS>룫6uuu ^FFFTUU룧GΝٿ?/zY){n֭[@eT*ԘB!?V۶<ӽ3RG;[o8pqqq\t Ԕg}Vӓ"""~:*-[$..cddٳg111~4hݺu#((CCCƎ˄ P($&&R]]M>}PT$%%ahhHǎw>󻳿gΜ!//nݺqUtttׯ...䐖F]]nnndff@V066VߋB… hiiMyyy ccc߿? YYY$''cmmMii)ZZZо}{MMMPTiӆׯ* ;;;ڶm =\xb Fjj*XZZbmmMII :::߄lll066--- (//u磥 eeeiӆW^y`r XZZ%zzzп.^HVV bdff2`:uZZZؐVݻ7.]"77:@jj* 8DhѢѳgOq[M6o^;8ǾB7Sx׀DžQyCo[ԔDD%ѻK׿1/u8\r/&?ɺuXp!888n%Kメcw,8ҦYb]6\sIf-x! !';T!S'u~Y!ģ4e233%KH,B<&kIS B{&zr֭[mp<11;m""" !== *++S\p7o6z. E# MnRR$%%~㇠;c!͕$YAA<033ɩ;ҪU+*++Ã~[[[>3Ӄسgz6a~"""=W_}9ccc"""عs8::|ǖlْӧOo߾2Bw'K#$qvv&%% n:aС̞=AQXXᅬ7TTT0|111rٽ{7 ,`ƌ|888pu|||ꍿ|rxشiswt;~8\222C6m֭&MbѢE萜ҥK9~8ahhH||<_j*.ׯcccYhbMNNؘ۷3{lVZEDD˖-7`:uJ=n^^kBo QQQyw&&&nݺT*5k(Jm;_9pѣLJݻwѣݻ7˖-_~TWW-((7ޠO>RRR裏СZZZx{{Ӷm[nݺE߾}4i޴nZļyO)++#-- HKKSNXXX0o޼ϡwychh'~B~Φe˖lذ͛73g$--Gr-ؽ{7b,[,(//9s&!!!TTTS8wzחz0"""8p@s}p322Kll,W&==f͚XoS\\ԩ̟? &h"N)UUU_Ν; fϞ=ҧO6hwEDDЩS'^}Uuic[[[bccqtt$66BQoSUU͛7ټy3.]bܹ8p]v5yDEE_*l׮]>|lٲzKLtuu~7RYY駟fڴiٓ+WKUU\|P***pwww}Gtt4-BS_%KR6m-"''* 0aPUU9/"۶m#== УG~mۆ=ϟϏc6,+Ν;GϞ=Y`A!9D1 J%zbƍnݚ@RRR?~hkk+T*ٰazK[Ruٳ?NB@ jߦMvʷ~ˍ7P(7#FpEtttdѨT*é`\t,pttDOOO=|@nn.9992x`>3z)ttt6mtRRx{{cggGDDL8`P(iӆ|>|:p5ӱ`ݻJ<<| B!$~+X{8wcznܸq },qDGG{)atYY}ۙ0yd.]Dtt4&MR|2Æ {d1 !O Y%%%b n޼KKKZhqXd &&&deeѷo_RSS)**ߟ@󉉉ޣ ٱcXZZϗ_~ `Ŋ'|_Mdd$.}}z=B࣏>BSSRIΝ;v,666r;LHHcggGmm-K. |MAFF+Wd۶mbxpqqiJԩSYd }'Om6uر#'Ndƍk׎ f̘A`` fff ,\zR>Cu?EEE,_SSS}YLLLXv-ƍիL8QXQQK.%;;+Ww(++So燑L8>333nݺE>}qofe4444iEEE]wwwN:Ŋ+ɓlٲYf?66ssspwwG[_{AÝYA!Gё˗/S\\ŋիL:U]P#??{9,X~Ȇ HLL{3{%//:ĢEظq# vuuޞ;vpQz)>#G!//ORɭ[6m $OIDATő={eԨQpA>sΝ;ܹsyg dÆ :zCٵkGiCVVV/ĉ̙3 N~~>QQQ?k쌮.G駟&##d>c<ȡCxgxILL/DCCvs9.\C?޽{cnnκu֭NNN 4֬Yùs!//ooolmmqvv`ʔ)㏬Yooon޼I~~> 2 @tt4gϦMMM~mv޽{qvv;vлwouN/^իx뭷޽;,\1cưh".\m!D1ҥ :ܜ-ZbTWW3{l._=EEE mٲ"<==iٲ%R8 000N]ڶm.PXXB)((`ǎ0l0LLL077GTIuu5uuu} J%),,---W_{CjՊJ%ZZZ`aa-[8~8+(( ֮]JÃbff&#GCQZZJqq1FFFtQARŮ]gܢE LMMJKK)**{3fi׮]emmMee%6Prr2;w‚4>B!Ds##DMM gϞ`f^{5zAVVĠűc077ʕ+sE󘛛MDD555:uJ.===ڶm#""ggg455Ybfff77>>e˖1n8ZlIYY׮]SĞ:uJ}lΜ9TUUϾ}?~WWWbcc"&&FfĈ <NVXd V/ !O&)!el޼ZGm̛7]>1?ǓBB!BI"ݼyqvvu=omll*^ ֭[cmmMΝ)--L47ڇ1ӦM>N=klii%annܼy333׳gOlmmgڴi[{bJJJ;-~]t(++cʔ)dddP[[˶mXf T*Р!B<(Y 7776mDYYӦM#)) ke°ĉ|Ǽܼy5kwQRVVFXXz_keeŮ]g̙tCԩS;v,6mbΝhhh0n8 cǎ222EPP]]Maa!qqqTUU牉a̘1P( !! Μ9B ,,Sxb,--:OOO‚|/_N~~>|=z{>N!|RP1Դ^deeaaa.s9994H+**(--ESSMMMVZŧ~ baa)%УG87|ӧ'KKKuIQF1`M_~S*gkkkR={kuuuTVV6_|=IKA !͓*5`41tP/W.] b̙2{l : Ԭח>{AR_h=eggၶB__^RyR !⡑Du̙3GNNN899ux}Q!H""""Xjڸ3m42:}4* x](**b͚5|TUUQYYI-ٗJBWW77GpB!|kΦE]???ɓ'>55z/!!!|x]'B!Ɍ222Rg޽;2}tbƍ}6^^^`iiym6l@xx8Æ ߟ tttؾ}Mdd$RRRˣSN)B!ɖPPPӇǏupwwرcՋ 6Ի///[)m֬YxzzԩS9z(6zj<== ԴLB!h$hرrE͛ŋb 2A5ha~wN:O?šCظի+WGքB!I" ښ4RRRlofccCjj*Yjlݺ^zTK9b!B'kPPPQVVƷ~6ǏgȐ!9s;vԻf޼yxyyFdd$koCCC~gw}GXX.\֭[ӧAs2c ŋ9~#g!BI#3JZZK.)Sχp-tR6Ξ= O?͖-[h۶-Grr2]ti03'O$##+VV!IktPո Ic111[n"R!BM !BfIa!B,I",B!%IB!D$B!h$B!͒$B!YDX!B4K !BfIa!B,I",B!%IB!D$B!h$B!͒$B!YDX!B4K !BfIa!B,I",B!%IB!D$B!h$B!͒vS ڦC!HOwP={>YٺᓦA!4MjӺ՝B4+34uBѬa!B,=6au)4q$B|ȌB!h$B!͒$B!YR>upS!B!c oq!BXi4uB!B Fontmatrix User Manual - Comparisons - Comparison of fonts

Comparison of fonts

When you have narrowed down your search results to maybe a dozen of fonts, you might like to compare them side by side.

Adding fonts for comparison

Go to Playground tab in the main window.

  1. In Browse Fonts sidebar click on a font that you want to add to comparison area.
  2. Inside the tab pick a fonts size of interest.
  3. Click anywhere on the canvas area. A text cursor will briefly flasj to indicate the place where your text will start.
  4. Just type in some text
  5. In Browse Fonts sidebar click on another font that you want to add to comparison area.
  6. Keep repeating steps 1-5 till you are done

Comparing fonts

Fontmatrix takes a somewhat unusual step away from a traditional table way of laying out text lines rendered with different fonts. What is suggests instead is a huge zoomable comparison area where you can drag text lines around, freely regroup them and pan around.

Contrary to Sample Text tab playground always uses native Qt font rendering engine, so you can freely zoom in and out and never see ugly pixel blocks.

Having added a dozen of text lines rendered with different fonts you surely might not remember which one is which. Just hover on a text line to see a tooltip saying which font font was used. Location and name of the font comes as a bonus.

To move around a rendered line of text just click on it and drag to wherever you want it to be. If you want to move several lines of text, press Ctrl and keep clicking on text lines until your group is selected or, if they are already nicely layed out, draw a rubberband frame around them to select them. Then drag them all elsewehere. To remove current selection just press Escape or click on blank space outside any text line.

Navigation in the comparison area is easy: press middle mouse button to pan and use Ctrl+mouse wheel to zoom in and out. You can even do both having a selection of text lines.

Cleaning playground

To remove existing text lines select them and press Delete.

fontmatrix-0.6.0+svn20110930/help/en/additional.html0000644000175000017500000000103611217644147020667 0ustar malexmalex Fontmatrix User Manual - Additional tools

Additional tools

Fontmatrix contains a number of additional tools to help you be more productive with the application.

fontmatrix-0.6.0+svn20110930/help/en/additional_editing_panose.html0000644000175000017500000000370711223375754023750 0ustar malexmalex Fontmatrix User Manual - Additional tools - Editing PANOSE metadata

Editing PANOSE metadata

While PANOSE metadata can really be helpful for searching for a font with desired characteristics, not all of fonts available to users contain this information for a numer of reasons:

  • not all font types can contain this information (PostScript fonts do not have PANOSE table);
  • not all type designers care to fill in this information;
  • a fair amount of type designers do not even know about PANOSE.

Sometimes PANOSE metadata is present, but incorrect.

Fontmatrix provides a way to add missing and edit existing PANOSE metadata in a non-destructive way — by storing changes in its database rather than in font files themselves. Besides this non-destructiveness also makes your changes comply to most proprietary font licenses.

Pick the font which is missing PANOSE metadata or contains incorrect data and choose Edit > Edit PANOSE metadata. In the newly opened dialog choose new values for PANOSE variables of interest and click OK to submit changes or Cancel to revert your changes and return to the main window. Return to Font Information tab to look at the PANOSE summary in the right column. From now on whenever you search for fonts using PANOSE metadata, these changes will be taken into consideration.

Currently there is no way to reset applied changes other than reimporting a font. Please refer to "Managing fonts collection" chapter to find out how to do it.

fontmatrix-0.6.0+svn20110930/help/en/managing.html0000644000175000017500000000206211150577440020335 0ustar malexmalex Fontmatrix User Manual - Managing fonts collection

Managing fonts collection

Importing

For this purpose two means are at your disposal. The first one is to select the entry Import... from the File menu. It will then be asked to choose a directory, which will be explored in order to import the files it contains iron — a way to ease, Fontmatrix conducting a recursion in the directories contained in the one you have chosen. The second is to import a choice of files in Fontmatrix and do a drag-drop.

fontmatrix-0.6.0+svn20110930/help/en/management_importing.html0000644000175000017500000000205011220414321022737 0ustar malexmalex Fontmatrix User Manual - Font management - Importing

Importing fonts

For this purpose three means are at your disposal.

The first one is to select the entry Import... from the File menu. It will then be asked to choose a directory, which will be explored in order to import the files it contains iron — a way to ease, Fontmatrix conducting a recursion in the directories contained in the one you have chosen.

The second is to import a choice of files in Fontmatrix and do a drag-drop.

And the third one is to use context menu for files and folders in the Folders tab inside the Browse Fonts sidebar.

fontmatrix-0.6.0+svn20110930/help/en/contributing_translating.html0000644000175000017500000002067711225423631023700 0ustar malexmalex Fontmatrix User Manual - Contributing - Translating

Translating

Translating desktop entry

On Linux systems .desktop files are used to build system menus that lists applications available to users. Fontmatrix ships with such a file as well. It is located in root directory with source code and gets installed to /usr/share/applications or /usr/local/share/applications, depending on your preferences.

To get localized menu entry you need to do a very simple thing:

  1. Open this file in your preferred text editor and make sure you opened it as a UTF-8 encoded text file.
  2. Create a new entry which looks like "Comment[LANG]=A font manager", where LANG is a two-letter code for your language (as referenced by ISO-639-1) and everything after "=" is translated.
  3. Create a new entry which looks like "GenericName[LANG]=A font manager".
  4. Save.
  5. Test by running 'sudo make install' (if Fontmatrix is already installed or just 'sudo cp fontmatrix.desktop /usr/share/applications/' and look in the menu.

Send the updated file to us.

Translating user interface

The very first thing you need to translate Fontmatrix into your native language is to get source code from the current developpement branch. To do this, you need a Subversion client (svn being the regular command line client). Then type

svn co http://svn.gna.org/svn/undertype/trunk/tools/typotek fontmatrix

somewhere in your home directory to fetch source code, so that you always have access to it.

Then you will need to install Qt development package that contains Linguist — the application to assist you with translating. On Linux start your package manager and look for a package named something like qt4-dev, install it.

The next steps are as follows:

  1. Go to the top level directory of source code.
  2. Create the build directory eg: mkdir build and cd into it.
  3. Run Cmake command with whatever options you want plus -DTRANSLATOR:string=LOCALE, where LOCALE is a two-letter code for your language (as referenced by ISO-639-1), lowercase, e.g. fr for French or de for German. If necessary, you can specify a country code and thus form a string like fr_FR
  4. Run "make translation" to create a new translation file in fontmatrix/src/messages/ directory.
  5. Open your fontmatrix-LOCALE.ts file in Linguist and start translating.
  6. To test your translation, run make install in the build directory. This will create a binary file called fontmatrix-LOCALE.qm (and Fontmatrix itself if you did not run this command before) and install it in the right place. If the LOCALE for which you translate is not the one which is set for your system, run LC_ALL=LOCALE fontmatrix to tell Fontmatrix to load that specific LOCALE.
  7. When your work is done, compress this fontmatrix-LOCALE.ts file to a ZIP, GZ or BZ2 archive and submit it via patches and patches tracker or tell us about it on IRC and we will help you to sort this out.

Here are some tips to help you make translation better.

Translating Fontmatrix takes a while, so it's best to translate those parts of user interface that you use most of the time. This will give you a false, but useful feeling of accomplishment and motivation to finish the whole work.

Test your translation as frequently as possible. This is especially important for dialogs that you rarely use.

Make sure you find a good balance between short and easy to understand phrases and words. English language is known to have relatively shorter words, so in most cases your translation will make user interface a bit larger. But if you start using abbreviations or shorter synonyms that don't quite fit the context, users won't appreciate that either.

A lot of translatable messages use variables like %1. Those are substituted by some values. For example, in "Block (%1):" (Glyphs tab) this variable is substituted with percentage of a chosen Unicode block's coverage, e.g.: "Block (74%):". When you type these variables manually, you can make a mistake and the trick with a variable won't work. So it's better to paste original text to translation entry field by pressing Ctrl+B in Linguist and then replace this original text with translation, leaving all present variables intact.

A good part of translatable messages are names of Unicode blocks and OpenType features. Even though these technologies are meant to serve wide world community with all its complex languages and scripts, it is typical to have little to no information on them in a language other than English. This is 21st century to you. So please refer to good solid dictionaries for correct names of languages that are used for most Unicode blocks, to Unicode specification for the rest of the blocks and to OpenType specification for names of OpenType features that you see in the Sample text tab.

Translating documentation

The documentation is inside help directory and consists of menu.xml file that defines table of contents, HTML files with text and illustrations in PNG or JPEG files.

Every translation is kept in its own directory named with two-letter language code like ru for Russian or es for Spanish. So download source code, unpack it and start with creating this directory.

Now copy contents of en directory to your language directory. Before you start translating, open help/LANGUAGE/CMakeLists.txt file in your preferred editor and replace all instances of "_EN" with "_LANGUAGE", where LANGUAGE is a two-letter code for your language as well, uppercase. Then open help/CMakeLists.txt and add another line that looks like this:

ADD_SUBDIRECTORY(${FM_HELP_DIR}LANGUAGE)

where LANGUAGE is a two-letter code for your language, lowercase this time.

These two files are used by the build system to find out what files to install.

Start translating. It's best to translate table of contents first and proceed with actual content later. To translate table of contents open menu.xml file in your editor of choice and translate values of every text attribute. E.g. for <area text="Setting up" file="setting_up.html"> translatable text will be "Setting up".

To test your translation open a terminal window, go to the top level directory with source code, rebuild and reinstall Fontmatrix. After you rebuild it for the first time, you will only need to run 'sudo make install' to update files.

If user interface is not localized, you might want to do it before translating documentation. Some users might complain and tell you that user interface in English is a de-facto standard and thus localized documentation should refer only to English UI. But this is just because they have grown up to use unlocalized software, so don't worry, let them play silly buggers and move on.

Some illustrations actually display other applications like FontForge which may be not localized for your language. In that case just use already available screenshots from English version of the documentation.

The English (and Russian) translations have screenshots with Dust theme for both GTK+ and Metacity (and GTK+ engine for Qt), and Droid Sans 9pt font. You don't have to try to reproduce that, but please be visually consistent across your translation.

Please keep all of your illustrations below 800 pixels on the longer side.

When you are done, archive help/LANGUAGE directory with your translation and send it to us.

fontmatrix-0.6.0+svn20110930/help/en/management_tags.html0000644000175000017500000000376011225423631021707 0ustar malexmalex Fontmatrix User Manual - Font management - Using tags

Using tags

Why

Tags are a great and flexible way to manage your fonts collection, because they don't set restrictions on a way you categorize fonts. You can use tags like "Fonts I bought from AGFA before it was acquired" or "Slab serif fonts my wife hates" or "Fake italic fonts I wouldn't use for my own dear mother" or "Fonts I designed for COMPANY_NAME" or "Serif high contrast text fonts I'm allowed to embed".

How to add tags

There are two ways to add new tags.

The first one is when you add a directory containing fonts (and the Ask for tag names when importing fonts options in Preferences is enabled). You will be presented with this dialog:

So this dialog lists all the tags Fontmatrix knows about and allows you to pick one of them and/or add a new one. For the latter just enter name of a new tag and click Add button. The newly created tag will be automatically used for the fonts you are about to import:

Later when you select a font that has some custom (that is, created by you) tag, the Tags pane will have this tag listed:

If you want to assign a number of tags to currently filtered fonts, use the Edit > Tag all filtered... command. This will open the dialog already familiar to you.

Editing and removing tags

Right click on a tag in Tags panel allows to edit it or remove it from the database.

fontmatrix-0.6.0+svn20110930/help/en/additional_extracting_fonts.html0000644000175000017500000000455711220414321024322 0ustar malexmalex Fontmatrix User Manual - Additional tools - Extracting fonts from documents

Extracting fonts from documents

This somewhat controversial feature, extracting embedded fonts from documents, relies on PoDoFo library and currently works only for PDF documents. Support for XPS and SVG is planned for later versions.

To use it

  1. Choose Service > Extract fonts....
  2. In the Select PDF section of a newly opened dialog click Browse and pick a PDF document of interest.
  3. In the Fonts section enable checkboxes for fonts of interest.
  4. Click Select Dir button to define directory to which extracted fonts will be saved.
  5. Click Extract button to actually save embedded fonts to the chosen directory.
  6. Click Close button to close the dialog when you're done.

If subsequent importing them to Fontmatrix makes sense to you, do so.

Several things should be mentioned with regards to this functionality.

First of all, fonts are rarely embedded fully, so what you typically get is a so called subsetted font, where only glyphs actually used in a document are present. Here is an example:

Next thing is that Fontmatrix saves these fonts to PFB and stores some useful information like instructions:

Finally, for those copyright concerned people Fontmatrix actually saves this bit of information:

Please note: Fontmatrix team strongly discourages users from infringing copyright. We implemented this feature for fun and education, not for making unlicensed profit from someone else's work. If you want to create a derivative work from a font whose license doesn't explicitely allow that, do contact either designer or vendor beforehand.

fontmatrix-0.6.0+svn20110930/help/en/contributing_testing.html0000644000175000017500000000475411220414321023014 0ustar malexmalex Fontmatrix User Manual - Contributing - Testing and reporting

Testing and reporting

Testing

Testing is what helps making applications rock stable. Since we a re a community project, we rely on you, yes — you, our dear users.

We don't really encourage you to compile the most unstable cutting edge source code, but in case you find some bugs in the latest released version, do not hesitate to point them out to us.

Crashers

So you found a reproducible way to crash Fontmatrix. If you are on Linux, please use application called gdb to create a report which in programmers lingo is called backtrace. Here is how you do it:

  1. Install gdb via package manager
  2. Open terminal
  3. $ gdb fontmatrix
  4. gdb's console appears
  5. > run
  6. Fontmatrix starts, a little slower than usually
  7. Reproduce the crash
  8. Go back to terminal
  9. > bt
  10. Copy the output using mouse and paste it somewhere
  11. > quit

If you are on Windows or Mac or simply do not have time to fiddle with gdb, at least own up and tell us exactly what you did.

Reporting bugs and requesting features

You can submit bugs reports to our bugtracker (no need to register). Don’t worry about the "Undertype" name, as Fontmatrix originally belonged to this bigger project.

A good, useful bug report contains:

  1. List of actions that led to a bug
  2. Backtrace, if the application crashed (see above)
  3. Information on your system

Typical information on your system we would appreciate:

  • Linux: name and version of distribution, version of Qt, version of Fontmatrix
  • Mac OS X: version of Mac OS X, version of Fontmatrix
  • Windows: version of Windows, version of Fontmatrix

If you want to request a new feature, use the very same tracker.

fontmatrix-0.6.0+svn20110930/help/en/setting_up_preferences_general.html0000644000175000017500000000246211217644147025022 0ustar malexmalex Fontmatrix User Manual - Preferences - General

General

This tab has just three options.

Ask for tag names when importing fonts options defines whether to open dialog asking to assign tags to the fonts you are about to import. See the chapter on importing fonts for details.

Show names of imported fonts after import process option defines whether to open dialog listing names of the fonts you've just imported. See the chapter on importing fonts for details.

Show splash at startup — disabling this checkbox will hide splash screen that you see on start-up. Displaying the splash screen doesn't make start-up any slower, but makes you feel that the application does something useful while it's loading. Which in fact it does, just not in a visible manner otherwise.

fontmatrix-0.6.0+svn20110930/help/en/index.html0000644000175000017500000000332511223375754017673 0ustar malexmalex Fontmatrix User Manual

Welcome to Fontmatrix help system

Fontmatrix is an end-user font manager initially designed for Linux, but now also available for Windows and Mac OS X.

Its highlights are:

  • works with local and remote font storages;
  • features activation and deactivation of fonts based on tags;
  • allows finding suitable fonts by constructing simple or complex queries;
  • allows refining a fonts selection by comparing either glyphs in details or text lines;
  • supports searching in PANOSE metadata and allows non-destructively editing it;
  • has advanced OpenType support;
  • ships with sample texts in gazillion of languages and scripts to assist testing fonts with wide Unicode blocks coverage;
  • features easy templates based creation of font books (PDF).

If you have already used an earlier version of Fontmatrix, you might be interested to find out, what's new in this version.

If this is the first time you ever run a font manager and you are wondering what it's good for, please read this chapter.

If you are already familiar with font managers per se and know why you want using them, you might like to know what's so special about Fontmatrix.

fontmatrix-0.6.0+svn20110930/help/en/why_management.html0000644000175000017500000000766511223375754021602 0ustar malexmalex Fontmatrix User Manual - The very basics - Why using a font manager

Why using a font manager

This question pops up every now and then. Really, why? Aren't people just happy with what they've got? Isn't just installing and deinstalling fonts the usual way good enough? Here are several reasons.

Designers working by contracts are doomed to use a variety of fonts, because every client is special (well, at least that's what clients like to hear, don't they?) and has his/her own preferences and ideas about what suits and what doesn't suit a particular task; because design tasks are actually different. They really are.

So we are talking here about collections of fonts that are as large as 3.000 fonts. Or 5.000 fonts. Decorative freeware fonts, licensed fonts, very expensive licensed font families with over 20 faces and so on. Keeping all of them loaded in the system is likely to slow it down and make browsing through fonts lists a living hell. Which means you need some tool to activate and deactivate fonts selectively.

OK, so convinient activation and deactivation. What else? Searching. If you have over 1K of fonts you might as well want being able to find the font you need as soon as possible given that usually you have only a basic idea about what you need. So you want to compare them: type in some text and see how all candidates render this text, then pick the one that suits the job best.

So, that's it? No. How about grouping some fonts? Think of branding projects. You create a whole package — website, brochures, business cards etc. — and use a fixed set of fonts that you worked out after hours of being shouted at by a highly paid manager in an expensive suite. At any time you have to be able to quickly enable these fonts in the system to create a new brochure or a new bunch of business cards for this client (big companies do reorder them once a month or two). Font managers are here to help you by providing tagging system.

Now imagine that you work for a font foundry... Okay, okay, you hate these big companies, they just don't understand the digital age of typography... yadda-yadda... Whatever. So, your job is to promote fonts that you do. The most convinient way is to create a so called font book — an album displaying how same text is rendered using some fonts. You want it now and you want it quick. Font managers are your friends again: you filter the whole collection to select just the fonts you want in the font book and in few more clicks you have a PDF file ready to be uploaded or printed.

And the last bit. If you ever used complex design software, you know that sometimes it finds a corrupt font and refuses to work. The traditional way to fix this is to remove one half of the collection and try again. If the application is still refusing to load, you take away half of this half and try again. So after spending an hour of your precious time on this stupid research you find the blasted .ttf, bang it against trash bin and think: "How could I possibly avoid waisting my time on this the next time?" Unbelievable, but the answer is font managers again: they often have built-in font validation tools that help finding problematic fonts and deactivating them temporarily.

All in all, if you are graphic or font designer, you just need a font manager. And if you are just a user who got this fontmatrix package in his Linux distribution installed by default and are wondering now what on Earth you are supposed to do with it, you probably have a good idea by now.

fontmatrix-0.6.0+svn20110930/help/en/search_in_generic_metadata.html0000644000175000017500000000227611223410305024035 0ustar malexmalex Fontmatrix User Manual - Search - Generic metadata fields search

Generic metadata fields search

Upper part of the Browse Fonts sidebar allows creating complex queries to filter fonts using its metadata or tags.

By default Fontmatrix searches in all fields. Click on the button saying so and in the drop-down list choose a particular metadata field like Copyright or Designer, then type in text for the query and press Enter. Every time you do so, the new query will substitute the previous one.

If you want to create a complex query, use the logic AND and NOT switchers. The whole query will be displayed below. E.g. [deja][!italic] will leave all DejaVu fonts but italic ones.

To clean the query click reset button to the left from the field displaying final query.

fontmatrix-0.6.0+svn20110930/help/en/viewing_overview.html0000644000175000017500000000236011223375754022160 0ustar malexmalex Fontmatrix User Manual - Viewing fonts - Font overview

Font overview

Basic information about font is summarized in the Font Information tab which is open by default when you start the applicaiton. What it lists is:

  • full name of the font and its location in the system;
  • glyphs count and type of the font file;
  • information about designer and vendor;
  • URL of the license and/or full text of the license where available;
  • PANOSE metadata, where available;
  • terms of use (embedding, editing etc.).

Because Fontmatrix uses Webkit for rendering this information, its appearance is somewhat customizable via CSS. You can create a custom CSS file, save it to /usr/share/fontmatrix/resources/ and choose it in Edit > Preferences > Display.

fontmatrix-0.6.0+svn20110930/help/en/search.html0000644000175000017500000000141411217644147020024 0ustar malexmalex Fontmatrix User Manual - Search

Search

Fontmatrix provides several several ways to refine your fonts selection while looking for best fit for a job.

You can use either generic metadata search or PANOSE metadata search first to go from hundreds and thousands to tens, and then use either of comparison functions to pick the font you will use for actual design.

fontmatrix-0.6.0+svn20110930/help/en/scripting.html0000644000175000017500000000107011220414321020536 0ustar malexmalex Fontmatrix User Manual - Scripting

Scripting

Documentation on Python scripting isn't ready at this time. Please come back later or ask your questions on IRC.

fontmatrix-0.6.0+svn20110930/help/en/font_books.html0000644000175000017500000000132011217644147020716 0ustar malexmalex Fontmatrix User Manual - Font books

Font books

If you have a large collection of fonts, e.g. if you are type designer, you might like presenting them to a client in printable from. In this chapter you can read how to create font books that contain specimens of your fonts collections and how to create custom templates for such fontbooks.

fontmatrix-0.6.0+svn20110930/help/en/management.html0000644000175000017500000000105211217644147020671 0ustar malexmalex Fontmatrix User Manual - Managing fonts collection

Managing fonts collection

This chapter explains how to use Fontmatrix for effective management of your fonts collection.

fontmatrix-0.6.0+svn20110930/help/en/CMakeLists.txt0000644000175000017500000000270311223375754020435 0ustar malexmalexSET(FM_HELP_FILES_EN additional_db_check.html additional_editing_panose.html additional_export_for_packaging.html additional_extracting_fonts.html additional.html additional_ttf_tables.html basics.html comparisons_fonts.html comparisons_glyphs.html comparisons.html contributing.html contributing_programming.html contributing_testing.html contributing_translating.html creating_font_books.html export_fonts.html external_tools.html font_books.html font_book_templates.html index.html interface.html management.html management_activation.html management_importing.html management_tags.html menu.xml news.html output.html printing_fonts.html resources.html scripting.html search.html search_in_generic_metadata.html search_in_panose.html search_using_bitmap_samples.html setting_up.html setting_up_layout_engine_options.html setting_up_preferences_display.html setting_up_preferences_files_and_folders.html setting_up_preferences_general.html setting_up_preferences.html setting_up_preferences_samples_collection.html setting_up_preferences_service.html setting_up_preferences_shortcuts.html setting_up_preferences_system_tray.html style.css what_fonts_are.html why_fontmatrix.html why_management.html viewing_glyphs_chart.html viewing.html viewing_overview.html viewing_sample_text.html ) FILE( GLOB FM_HELP_IMAGES_EN images/*.png ) INSTALL(FILES ${FM_HELP_FILES_EN} DESTINATION "${HELPDIR}/en") INSTALL(FILES ${FM_HELP_IMAGES_EN} DESTINATION "${HELPDIR}/en/images") fontmatrix-0.6.0+svn20110930/help/en/export_fonts.html0000644000175000017500000000162011220414321021267 0ustar malexmalex Fontmatrix User Manual - Exporting fonts

Exporting fonts

Export of fonts in Fontmatrix is tags based. That is, you can only export fonts that have a particular tag assigned to them.

  1. Choose File > Export fonts....
  2. In the newly opened dialog pick a tag.
  3. Pick a destination directory.

That's it: you will see progress indicator, and when it vanishes, you can go to destination and see a bunch of font files along with their thumbnails that Fontmatrix generated for you.

fontmatrix-0.6.0+svn20110930/help/en/basics.html0000644000175000017500000000127311223375754020030 0ustar malexmalex Fontmatrix User Manual - The very basics

The very basics

This section explain the very basic things about font managers, Fontmatrix and fonts. If you don't know if Fontmatrix is of any use for you or need to clear up one or two things about fonts, you are exactly the person we wrote it for. Thanks for reading it!

fontmatrix-0.6.0+svn20110930/help/en/creating_font_books.html0000644000175000017500000000304511220414321022557 0ustar malexmalex Fontmatrix User Manual - Font books - Creating font books

Creating font books

Font books are probably the easiest way to demonstrate fonts you designed to your potential customer. Fontmatrix makes creation of font books very easy.

For example, you need to create a font book of all fonts your company designed in 2009.

  1. Go to Browse Fonts sidebar.
  2. In the tag dropdown choose "Manufacturer", type in name of your company and press Enter.
  3. Enable And checkbox.
  4. In the tag dropdown choose "Copyright", type in "2009" and press Enter.

This will refine the list of available fonts to just the fonts that were created or updated in 2009 by your company. Now you probably want to get to this dialog:

  1. Go to File > Export font book....
  2. In the newly opened dialog pick a template.
  3. Click Browse... to define name of outputted PDF file.
  4. Click OK to create the font book.

Open the file to check the result:

fontmatrix-0.6.0+svn20110930/help/en/viewing.html0000644000175000017500000000104511223405771020222 0ustar malexmalex Fontmatrix User Manual - Viewing fonts

Viewing fonts

This section of the user manual covers viewing various aspects of fonts, from summary to Unicode blocks coverage.

fontmatrix-0.6.0+svn20110930/help/en/style.css0000644000175000017500000000003311147562706017541 0ustar malexmalex/* Fontmatrix help style */fontmatrix-0.6.0+svn20110930/help/en/contributing_programming.html0000644000175000017500000000137011220414321023650 0ustar malexmalex Fontmatrix User Manual - Contributing - Programming

Programming

Documentation for potential programmers isn't ready at this time. Please come back later or ask your questions on IRC.

The plan is to implement internal plug-in architecture to make programming new features easier. If you want to help the Fontmatrix team with that, do tell us.

fontmatrix-0.6.0+svn20110930/help/en/setting_up.html0000644000175000017500000000142511225423631020732 0ustar malexmalex Fontmatrix User Manual - Setting Up

Setting Up

Fontmatrix is a very configurable application. Most options you will rather like to set up once and forget, and those are available via Edit > Preferences menu item. Text layout engine options are of interactive nature and thus are available in a separate dialog (Service > Text layout engine options) that always stays on top

fontmatrix-0.6.0+svn20110930/help/en/additional_ttf_tables.html0000644000175000017500000000073611217644147023104 0ustar malexmalex Fontmatrix User Manual - Additional tools - Viewing TrueType tables

Viewing TrueType tables

TODO

fontmatrix-0.6.0+svn20110930/help/en/setting_up_preferences_shortcuts.html0000644000175000017500000000252311217644147025441 0ustar malexmalex Fontmatrix User Manual - Preferences - Shortcuts

Shortcuts

Here you can setup shortcuts (or hotkeys — whatever word you find more suitable for keyboard combinations that allow reaching menu items without actually going to menus in the first place).

The table displays actions, shortcuts for them (where available) and tips for actions in case you are not sure what a particular action does.

To change an existing shortcut to a menu item or add a missing one:

  1. Choose an action from the list
  2. Click "Change" button
  3. Press the keys combination

The new combination will be displayed in the shortcuts table and to the right of "Remove" button.

To remove an existing shortcut to a menu item:

  1. Choose an action from the list
  2. Click "Remove" button

The shortcut will be removed.

Please note that all changes to shortcuts cannot be undone.

fontmatrix-0.6.0+svn20110930/help/en/viewing_glyphs_chart.html0000644000175000017500000000247511223407216022775 0ustar malexmalex Fontmatrix User Manual - Viewing fonts - Glyphs chart

Glyphs chart

In Glyphs mode Fontmatrix can display a chart of glyphs present in a currently selected font. It also groups glyphs into Unicode blocks and displays coverage of that block in %.

Clicking on a glyph in the chart will display its larger version with metrics and category.

If you are not sure which block holds the glyph of interest, switch to View all mapped glyphs grouping and in the search filed to the right type in beginning of the glyph's name. Fontmatrix will automatically complete the name and if the glyph is present, it will scroll the chart and flash that glyph a while.

Clicking Copy Mode button activates the entry field which you can use as a digital letter case. Just enable it and start clicking on glyphs to copy them into that field. Then select all copied characters and copy them to clipboard to paste elsewhere.

fontmatrix-0.6.0+svn20110930/help/en/external_tools.html0000644000175000017500000000173111223375754021625 0ustar malexmalex Fontmatrix User Manual - External tools

External tools

Type design

Fontforge.

Fontlab. While on Linux and Mac FontForge runs just fine, Windows users have to install a lot of unrelated software just to get FontForge up and running. So proprietary Fontlab package looks like a reliable substutude.

Desktop publishing

Scribus.

Adobe InDesign.

QuarkXPress.

Vector graphics

Inkscape.

Xara Xtreme.

Adobe InDesign.

Corel DRAW.

fontmatrix-0.6.0+svn20110930/help/en/what_fonts_are.html0000644000175000017500000000071111240532002021537 0ustar malexmalex Fontmatrix User Manual - What exactly fonts are

What exactly fonts are

TODO

fontmatrix-0.6.0+svn20110930/help/en/why_fontmatrix.html0000644000175000017500000000563111223375754021650 0ustar malexmalex Fontmatrix User Manual - The very basics - Why Fontmatrix

Why Fontmatrix

So, what's so good about Fontmatrix in the world of Extensis and Linotype?

It works wherever you go to. It doesn't matter if you are Linux, Windows or Mac user. You can keep all of them around and still be using same app everywhere. We don't try to look too smart and tell you what system is the best (though we know :)). We just give Fontmatrix to you.

You don't need to pay for every installed copy. We don't take to masses this marketing desease of riding the gravy train. We are just and not greedy. We love great typefaces and great designs. We did Fontmatrix because we needed it for our work. So we simply share it with you. You are free in your choice of ways to thank us for that. As in the ways of not doing it at all.

We don't do marketing brainwashing. Yes, we don't use words like "best", or "cheapest" or "bargain" when we are talking to you. Our job is to be passionate about typefaces and font technologies and to put this passion to a good use. We are passionate about libre software, because this is how our team came to be, but we pass it only to the likes of us :) And we know when we see them.

On Linux this is currently the only actively developed font manager. That pretty much sums it up. There are simpler tools like FontyPython or GNOME Specimen, they still work, but are not maintained much. Which is a pity, because we'd like some sane competition.

You can actually affect development of Fontmatrix. No, we don't mean that you should immediately stop doing all the excellent designs that you are doing now for money and get to coding for fun. We do appreciate interesting ideas and bug reports. Nevertheless, if you can fix a bug or implement a new function, you know how to find us.

You can use Fontmatrix in your native language. This is exactly where free/libre software shines: both user interface and documentation are localizable. UI is currently translated into 15 languages (and counting), and we are really sorry, but this user manual is available in English only (as of v0.6.0), because it's a brand new manual and translating takes time. Since we rely on community of users and developers rather than on venture business investors, you can actually step in and contribute translations, if you really feel like doing it. It's fairly easy to do that and we are happy to assist you.

fontmatrix-0.6.0+svn20110930/help/en/setting_up_preferences.html0000644000175000017500000000210011217644147023312 0ustar malexmalex Fontmatrix User Manual - Setting Up - Preferences

Preferences

Application's options that you will probably setup once and forget are logically grouped into several tabs:

fontmatrix-0.6.0+svn20110930/help/en/contributing.html0000644000175000017500000000120711220414321021245 0ustar malexmalex Fontmatrix User Manual - Contributing

Contributing

There are several ways to help us making this project better.

  • testing and reporting;
  • translating user interface and documentation;
  • programming new features and fixing bugs.
fontmatrix-0.6.0+svn20110930/help/en/output.html0000644000175000017500000000115311217644147020117 0ustar malexmalex Fontmatrix User Manual - Exporting and printing

Exporting and printing

This chapter contains information on exporting fonts, printing fonts using various view available in the main window and creating font books in PDF using templates.

fontmatrix-0.6.0+svn20110930/help/en/interface.html0000644000175000017500000001553511223405131020511 0ustar malexmalex Fontmatrix User Manual - User interface

User interface

Fontmatrix has both traditionally and not quite traditionally implemented functionality.

Most important user interface parts you will see are:

  • Menu bar, on top of the window
  • Main area, with tabs representing one or another mode
  • Browse Fonts sidebar
  • Tags sidebar
  • Status bar
  • System tray icon

Menu bar

There is nothing special about menu bar in Fontmatrix. Menu items are logically divided into 7 top level menus:

  • File menu collects everything related to input and output
  • Edit menu collects everything related to items currently selected or filtered in search fonts sidebar
  • Browse menu has command for navigating inside fonts sidebar
  • View menu controls visibility of sidebars
  • Scripts menu collects everything related to internal scripting
  • Service menu groups various additional tools that you don't usually use on daily basis
  • Help menu allows to open this help system and an About dialog

Main area

Main area of the window is using tabbed interface to split different functionality. First three tabs (Font Information, Sample Text and Glyphs) are related to viewing fonts. The other three tabs (Playground, Classification and Compare) are related to refining selection of fonts and selecting exactly the ones you need by means of comparison.

Main area and Browse Fonts sidebar have mostly one-way connection: changes in the Browse Fonts sidebar affect content of the main area and not the other way round:

  • Font Information tab displays a summary on a currently selected font.
  • Sample Text tab renders a text using a currently selected font.
  • Glyphs tab displays a chart of glyphs present in a currently selected font and grouped by Unicode blocks.
  • Playground tab allows previeing and comparing single lines of custom text rendered using a currently selected font.
  • Compare tab allows comparing glyphs of fonts selected in the Browse Fonts sidebar.

The only exception is Classification tab which has two-way connection with the sidebar: it both updates list of fonts in the sidebar to filter fonts that have particular PANOSE defined characteristics and reacts to changes in the sidebar.

Browse Fonts sidebar

This sidebar is the gateway to your fonts collection. What it does apart from letting you search for fonts using metadata queries (discussed in a dedicated chapter) is a) listing fonts already added to the database and b) listing fonts available in the local system and mounted remote systems. This functionality is divided into three tabs.

Names

Fonts that are already added to the database are listed here and sorted alphabetically by the first letter of a font's typeface. They are also grouped in several levels: the first level in initial letter of a name, the second level is name of the typeface and the last level is name of the variant (style). Activation and deactivation of fonts is explained separately.

Clicking Collapse or expand opens a drop-down menu with items controlling view of the hierarchy described before: you can either collapse or expand items up to the first letter group (upper level).

Show face boxes button toggles visibility of checkboxes in front of font family faces allowing or forbidding you to selectively activate or deactivate them in the system.

Previews

In this tab Fontmatrix renders samples of a short text with every filtered font sorted alpahabetically.

The text and font size of previews can be changed below previews. If you use some custom text, you might like turning on subtitles for every preview telling you what font is used. This can be done in Display tab of Preferences dialog along with choosing font and font size used for those subtitles.

By default however previews render names of fonts themselves. This is done using special commands with self-explanatory names: <name>, <family> and <variant>.

Folders

You can preview typefaces of installed fonts listed in the Windows Fonts view, typefaces of fonts listed in the List view, or you can select any folder in the Folders view preview all typefaces located in the selected folder.

Tags sidebar

This is where you manage tags and assign them to currently selected fonts. Detailed information on using tags to manage your fonts collection is provided in a dedicated chapter.

Status bar

Status bar in Fontmatrix isn't really used as extensively as e.g. in Inkscape. The left part displays hints for menu items. The right side names the currently selected font and lists amount of currently filtered fonts.

System tray

System tray, also known as notification area, is usually located somewhere on desktop environment panel (or one of the existing panels). Its function is to hide windows of applications that you don't want to see all the time.

Because you still might want to control some of these applications (even frequently sometimes), clicking on icons in the notification area usually either toggles visibility of the main window of an application or display a menu with various items. This is exactly how it works for Fontmatrix: right mouse button click toggles visibility of the main window, and left mouse button click reveals a menu. Since this is a highly optional feature, you can enable or disable it from Preferences dialog. Detailed information about this functionality is provided in a dedicated chapter.

fontmatrix-0.6.0+svn20110930/help/en/search_using_bitmap_samples.html0000644000175000017500000000230411223412750024276 0ustar malexmalex Fontmatrix User Manual - Search - Using bitmap samples

Searching using bitmap samples

If you have an enormous fonts collection, you can search for a font using a bitmap sample of one of the glyphs. There are two ways to do it: you can either feed Fontmatrix with a ready bitmap file or use Grab mode that will fetch a bitmap image right from your display.

When you have the image in the raster sample preview, click on the glyph for Fontmatrix to compute its bounding box. If Fontmatrix got it wrong, enable the Tweak rect checkbox and drag corners of a frame around presumed bounding box until it's right.

Now type in the character that is on the sample and press Search button.

You can also watch a screencast demonstrating this functionality.

fontmatrix-0.6.0+svn20110930/fontmatrix.10000644000175000017500000000752211024047070016606 0ustar malexmalex.TH "fontmatrix" "1" "Updated 2008-05-18" "Peter Linnell" "" .SH "NAME" fontmatrix \- a powerful open source font manager .SH "SYNOPSIS" fontmatrix [\-h|\-\-help] .SH "DESCRIPTION" Fontmatrix is an open source font manager originally developed on Linux, but now runs on OSX as well. This man page only provides summaries of some aspects of the program's use. It's main purpose is to make sure you can find the full documentation quickly and easily. .SH "OPTIONS" The definitive options are in the program's usage statement. Run: .B fontmatrix \-\-help to view the usage statement. .TP .B \-l, \-\-lang xx Overrides the system locale and runs Fontmatrix in language xx. The language is specified with the same POSIX language codes that are used in the LANG and LC_ALL environment variables. For example, English can be selected with 'en' (generic English), 'en_GB' (British English), 'en_US' (American english), etc. Similarly, Deutsch can be selected with 'de' or 'de_DE'. .TP .P .B \-la, \-\-langs\-available Print a list of languages for which user interface translations are available. To use that language run Fontmatrix as 'fontmatrix \-l xx' where xx is the short language code, or set the locale environment variables as described below. .TP .B \-v, \-\-version Prints the Fontmatrix version number and exits. .TP .B \-f, \-\-file Open the specified file. It's possible to simply pass the file name as an unqualified argument instead of using this, though if the name begins with a \- you will need to use \-\-, eg 'fontmatrix \-\- \-myfile.sla'. .TP .B \-h, \-\-help Print a brief usage summary. .TP .B \-ns, \-\-no\-splash Suppresses display of the splash screen during SCribus start\-up. .SH "ENVIRONMENT" Fontmatrix respects the standard locale environment variables. Others may be used through underlying libraries, such as Qt, or by programs used by Fontmatrix. .B LC_ALL, LC_MESSAGES, LANG POSIX locale. See .I locale(1). Fontmatrix uses these three environment variables, in the listed order of precedence, to select the language (including the user interface translation) to use. If none are set, it will fall back on the locale set by the underlying Qt library. .TP .B PATH Fontmatrix may search the PATH for external tools if their paths are not specified absolutely. This is currently most likely to affect you if you have multiple copies of fontforge(1) installed. You can set an absolute path to the correct fontforge(1) in your Fontmatrix preferences and bypass the .B PATH search. .PP A few important environment variables from other programs are summarised here for convenience, though you should check the original program's documentation if you are having trouble. .TP .SH "FILES" .TP .B $HOME/.fontmatrix/ User preferences are stored in $HOME/.fontmatrix/ on Unix or Linux. Most other paths are configurable from the Fontmatrix preferences. .B $HOME/.fonts/ .TP .B $HOME/.fonts.conf .TP .B /etc/fonts Fontconfig, the library used by Fontmatrix to locate fonts, is normally configured with files in /etc/fonts, mainly /etc/fonts/fonts.conf and /etc/fonts/local.conf . It may also use a config file $HOME/.fonts.conf and fonts in $HOME/.fonts/ . See fonts.conf(5) and the fontconfig documentation for more information. Note that Fontmatrix may also use its internal font path to locate more fonts \- see the Preferences dialog and fontmatrix help. .SH "RELATED SOFTWARE AND AFFILIATES" Scribus \- http://www.scribus.net Other affiliates may be listed in the footer on http://www.fontmatrix.net/ .SH "BUGS" See .I https://gna.org/bugs/?group=undertype for the Fontmatrix on\-line status tracker, which is used to track bug reports and feature requests. .B If you intend to submit a bug report or feature request, please search the bug database first. .SH "AUTHORS" Please see the About Fontmatrix option in the Help menu for a list of authors, translators, and contributors. fontmatrix-0.6.0+svn20110930/OSX-package/0000755000175000017500000000000011641435631016376 5ustar malexmalexfontmatrix-0.6.0+svn20110930/OSX-package/linktools/0000755000175000017500000000000011641435631020414 5ustar malexmalexfontmatrix-0.6.0+svn20110930/OSX-package/linktools/ingest.py0000755000175000017500000000313511420054616022257 0ustar malexmalex#!/usr/bin/python import os import sys import osxtools def usage(): print """ Usage: ingest.py bundle [-x lib] [-s fw] Copies all dependent libraries and frameworks into the app bundle. System libraries (/usr/lib*, /System/Library) are not copied. Fixes the dependencies in all executabels contained in bundle. bundle: the path to the *.app bundle -x lib: dont move lib into the bundle. -s fw: only move the referenced libarry file from framework fw into the bundle, not the complete framework """ if len(sys.argv) <= 1 or sys.argv[1] == "-?" : usage() sys.exit(0) exceptions = [] strippedfws = [] bundle = None argp = 1 while argp < len(sys.argv) : if sys.argv[argp] == '-x' : exceptions.append(sys.argv[argp + 1]) argp = argp + 2 elif sys.argv[argp][0:2] == '-x' : exceptions.append(sys.argv[argp][2:]) argp = argp + 1 elif sys.argv[argp] == '-s' : strippedfws.append(sys.argv[argp + 1]) argp = argp + 2 elif sys.argv[argp][0:2] == '-s' : strippedfws.append(sys.argv[argp][2:]) argp = argp + 1 elif sys.argv[argp][0:1] == '-' : print "Error: unknown option: " + sys.argv[argp] usage() sys.exit(1) elif bundle == None: bundle = sys.argv[argp] argp = argp + 1 else: print "Error: more than one bundle path specified!" usage() sys.exit(1) if bundle == None: print "Error: no bundle path specified!" usage() sys.exit(1) if not os.path.isabs(bundle): bundle = os.path.join(os.getenv("PWD"), bundle) if not os.path.isdir(bundle): print "Error: '" + bundle + "' is no bundle path!" usage() sys.exit(1) osxtools.ingest(bundle, exceptions, strippedfws) fontmatrix-0.6.0+svn20110930/OSX-package/linktools/MachO.py0000644000175000017500000001450711420054616021757 0ustar malexmaleximport os import re import shutil def findFramework(path, name = None): "find the framework folder for FW name" if path == "" or path == "@executable_path" or path == "/": return None elif name == None: return findFramework(os.path.dirname(path), os.path.basename(path)) elif os.path.basename(path) == name + ".framework": return path elif len(os.path.dirname(path)) >= len(path): print "MachO.findFramework: Oops '" + path + "', '" + name + "'" return None else: return findFramework(os.path.dirname(path), name) def stripPrefix(prefix, path): "Returns the relative path r such that os.path.join(prefix, r) == path" prefix = os.path.normpath(prefix) prefixLen = len(prefix) path = os.path.normpath(path) if path[0 : prefixLen] == prefix: if path[prefixLen] == os.sep: return path[prefixLen+1 : ] else: return path[prefixLen : ] else: return path class Executable: "Represents an Mach-O executable." def __init__(self, path, kind): self.Location = path self.Kind = kind def __repr__(self): return self.Location + " (" + self.Kind + ")" def getDependencies(self): "Return a list of MachO.Fixes describing the dependencies." "Uses otool -L" f = os.popen("otool -L " + self.Location, "r") result = [] pat = re.compile("\s*([^(]*)\s\((.+)\)") for line in f: m = pat.match(line) if m != None: result.append(Fix(m.group(1), m.group(2))) status = f.close() return result def applyFixes(self, changes, log): "Uses install_name_tool to change the links to dependencies." "changes is a dictionary mapping links (as strings) to Fixes." args = "" for dep in self.getDependencies(): if dep.Link in changes: args = args + changes[dep.Link].getChange() log.append(">> " + "install_name_tool " + args + self.Location) if len(args) > 0: os.system("install_name_tool " + args + self.Location) pat = re.compile("(library)|(universal binary)") if pat.search(self.Kind): relName = os.path.basename(self.Location) # FIXME: rel to fw log.append(">> " + "install_name_tool -id " + relName + " " + self.Location) os.system("install_name_tool -id " + relName + " " + self.Location) def findExecutables(bundleDir): "Return a list of MachO.Executables found in bundleDir" result = [] pat = re.compile("Mach-O (.+)") for root, dirs, files in os.walk(bundleDir): for n in files: p = os.path.join(root, n) f = os.popen("file -b " + p, "r") m = pat.match(f.readline()) if m != None: result.append(Executable(p, m.group(1))) print "found " + m.group(1) + ": " + n f.close() return result class Fix: "Represents a fix for a library link." def __init__(self, dependency, versionString="?"): self.Link = dependency self.Location = dependency self.NewLink = dependency self.NewLocation = dependency self.versionString = versionString # not used yet self.fwPath = None self.relPath = None def __repr__(self): return (self.Link + " (" + self.versionString + ")") def isAbsolute(self): return os.path.isabs(self.Link) def isBundleRelative(self): return self.Link[0:17] == "@executable_path/" def isSystem(self): return (self.Location[0:8] == "/usr/lib" # also matches libexec or self.Location[0:8] == "/usr/X11" # also matches X11R6 or self.Location[0:8] == "/System/") def getChange(self): "Returns argument for install_name_tool." if self.Link == self.NewLink: return "" else: return "-change " + self.Link + " " + self.NewLink + " " def findLocation(self, exePath=None): if self.isBundleRelative(): if exePath != None: self.Location = os.path.normpath( os.path.join(exePath, self.Link[17:])) else: self.Location = self.Link[17:] else: self.Location = self.Link # check if done if (os.path.isabs(self.Location) and os.path.isfile(self.Location)): self.NewLocation = self.Location return True # search for frameworks in /System/Library and /Library fwPath = findFramework(self.Location) if fwPath: fwdir = os.path.dirname(fwPath) self.relPath = stripPrefix(fwdir, self.Location) for d in ["/Library/Frameworks", "/System/Library/Frameworks"]: if os.path.isfile(os.path.join(d, self.relPath)): # self.Location = os.path.join(d, self.relPath) self.Location = os.path.join(d, self.relPath) self.NewLocation = self.Location self.fwPath = os.path.join(d, os.path.basename(fwPath)) self.relPath = stripPrefix(self.fwPath, self.Location) return True # ok, try libs lib = os.path.basename(self.Location) self.relPath = None for d in ["/usr/local/lib", "/opt/local/lib", "/usr/lib", "/opt/lib"]: if os.path.isfile(os.path.join(d, lib)): self.Location = os.path.join(d, lib) self.NewLocation = self.Location return True # not found return False def moveLibrary(self, destBundlePath, stripFW, log): "Copies the library or fw to destBundlePath." "Also sets NewLink and NewLocation properties" "Returns a list of copied executables" # dont do this if we are already inside the bundle: if stripPrefix(destBundlePath, self.Location) != self.Location: log.append("-- ignoring " + self.Location) return [] if self.relPath != None and not stripFW: # copy framework newFwPath = os.path.join(destBundlePath, "Contents/Frameworks", os.path.basename(self.fwPath)) log.append(">> " + self.fwPath + " ===> " + newFwPath) if (os.path.exists(destBundlePath) and not os.path.exists(newFwPath)): shutil.copytree(self.fwPath, newFwPath, True) self.NewLocation = os.path.join(newFwPath, self.relPath) self.NewLink = ("@executable_path/" + os.path.join("../Frameworks", os.path.basename(self.fwPath), self.relPath)) return findExecutables(newFwPath) else: # copy lib to bundle.app/Contents/Frameworks/ self.NewLocation = os.path.join(destBundlePath, "Contents/Frameworks", os.path.basename(self.Location)) self.NewLink = ("@executable_path/" + os.path.join("../Frameworks", os.path.basename(self.Location))) log.append(">> " + self.Location + " ---> " + self.NewLocation) if (os.path.exists(destBundlePath) and not os.path.exists(self.NewLocation)): shutil.copy(self.Location, self.NewLocation) return [Executable(self.NewLocation, "lib")] fontmatrix-0.6.0+svn20110930/OSX-package/linktools/osxtools.py0000755000175000017500000000712011420054616022656 0ustar malexmaleximport os import re import MachO from distutils.dir_util import copy_tree from datetime import datetime def findDependencies(exeFiles, exePath): "Return a dictionary of MachO.Fixes of all recursive dependencies" result = {} # allow some sloppyness: if isinstance(exeFiles, str): exeFiles = [MachO.Executable(exeFiles, "executable")] elif isinstance(exeFiles, MachO.Executable): exeFiles = [exeFiles] # go through executables and store Fixes todo = [x for x in exeFiles] done = [x.Location for x in exeFiles] while len(todo) > 0: current = todo.pop() print "getting dependencies for " + current.Location for dep in current.getDependencies(): if dep.Link not in result: if dep.findLocation(exePath): result[dep.Link] = dep # check if we need to traverse the referenced lib if not dep.isSystem() and dep.Location not in done: print "- adding " + dep.Location done.append(dep.Location) todo.append(MachO.Executable(dep.Location, "lib")) else: print ("couldn't find " + dep.Link + " -> " + dep.Location) # forget any system dependencies for k,fix in result.items(): if fix.isSystem(): del result[k] return result def ingest(bundle, exceptions=[], strippedFrameworks=[]): "Moves all needed non-System libraries inside the bundle and fixes links" # step 1: find all executables executables = MachO.findExecutables(bundle) # find the bundle executable pat = re.compile("executable") exePath = "" for exe in executables: if pat.match(exe.Kind): exePath = os.path.dirname(exe.Location) print "using @executable_path=" + exePath break # step 2: find all dependencies fixes = findDependencies(executables, exePath) # step 3: move all libraries which are not excepted log = [] frameworks = os.path.join(bundle, "Contents/Frameworks") if not os.path.exists(frameworks): log.append(">> mkdir " + frameworks) os.makedirs(frameworks, 0755) for k,fix in fixes.items(): if fix.Location in exceptions or fix.Link in exceptions: del fixes[k] else: stripFW = fix.Location in strippedFrameworks executables.extend(fix.moveLibrary(bundle, stripFW, log)) # step 3.5: copy aspell dictionaries, hacked for aspell via macports for now, #7371 aspellsrcpath = "/opt/local/share/aspell" if os.path.exists(aspellsrcpath): aspelldestpath = os.path.join(bundle, "Contents/share/aspell") if not os.path.exists(aspelldestpath): log.append(">> mkdir " + aspelldestpath) os.makedirs(aspelldestpath, 0755) if os.path.exists(aspelldestpath): log.append(">> copying aspell dictionaries") print "copying aspell dictionaries" copy_tree(aspellsrcpath, aspelldestpath) # step 4: fix all executables for exe in executables: exe.applyFixes(fixes, log) # step 5: write log logfile = file(os.path.join(bundle, "Contents/osxtools.log"), "a") logfile.write("ingest at " + datetime.now().isoformat(" ") + "\n") for e in log: logfile.write(e + "\n") logfile.close() def createSymlinks(bundle, links): currDir = os.getcwd() for lnk,tar in links: print "chdir to " + os.path.join(bundle, os.path.dirname(lnk)) os.chdir(os.path.join(bundle, os.path.dirname(lnk))) print "symlink " + os.path.basename(lnk) + " -> " + tar os.symlink(tar, os.path.basename(lnk)) os.chdir(currDir) def relinkOld(FILE, LIBDIR, INSTALLDIR): #LIBS=`otool -L $FILE | sed 's/\([^(]*\)(.*)/\1/g'` #for LIB in $LIBS ; do # LNAM=`basename $LIB` # if [ $FILE -ef $LIBDIR/$LNAM ] ; then # install_name_tool -id $INSTALLDIR$LNAM $FILE # elif [ -e $LIBDIR/$LNAM ] ; then # install_name_tool -change $LIB $INSTALLDIR$LNAM $FILE pass fontmatrix-0.6.0+svn20110930/OSX-package/linktools/mkframework.py0000755000175000017500000000474511420054616023323 0ustar malexmalex#!/usr/bin/python import os import sys import shutil import osxtools def usage(): print """ Usage: mkframework.py bundle [-l libfile] [-v version] Creates the directory structure for a framework. If libfile is given, it will be used as the frameworks executable, otherwise the framework will just be an empty shell. bundle: the path to the *.framework bundle -l lib: copy lib into the bundle. -v ver: use "ver" as the version instead of the standard 'A' -f: overwrite existing files if version exists """ if len(sys.argv) <= 1 or sys.argv[1] == "-?" : usage() sys.exit(0) version = "A" overwrite = False libfile = None bundle = None argp = 1 while argp < len(sys.argv) : if sys.argv[argp] == '-f': overwrite = True; argp = argp + 1 elif sys.argv[argp] == '-l' : libfile = (sys.argv[argp + 1]) argp = argp + 2 elif sys.argv[argp][0:2] == '-l' : libfile = (sys.argv[argp][2:]) argp = argp + 1 elif sys.argv[argp] == '-v' : version = (sys.argv[argp + 1]) argp = argp + 2 elif sys.argv[argp][0:2] == '-v' : version = (sys.argv[argp][2:]) argp = argp + 1 elif sys.argv[argp][0:1] == '-' : print "Error: unknown option: " + sys.argv[argp] usage() sys.exit(1) elif bundle == None: bundle = sys.argv[argp] argp = argp + 1 else: print "Error: more than one bundle path specified!" usage() sys.exit(1) if bundle == None: print "Error: no bundle path specified!" usage() sys.exit(1) if not os.path.isabs(bundle): bundle = os.path.join(os.getenv("PWD"), bundle) if bundle[-10 : ] != ".framework": bundle = bundle + ".framework" fwName = os.path.basename(bundle)[0: -10] if not os.path.exists(bundle): os.makedirs(bundle, 0755) elif not os.path.isdir(bundle): print "Error: '" + bundle + "' is no bundle path!" usage() sys.exit(1) versionPath = os.path.join(bundle, "Versions", version) if os.path.exists(versionPath): if overwrite: shutil.removetree(versionPath) else: print "Error: '" + versionPath + "' already exists!" usage() sys.exit(1) os.makedirs(versionPath, 0755) if libfile != None: shutil.copy(libfile, os.path.join(versionPath, fwName)) os.system("install_name_tool -id @executable_path/" + os.path.join("../Frameworks", fwName + ".framework", "Versions", version, fwName) + " " + os.path.join(versionPath, fwName)) osxtools.createSymlinks(bundle, [ ("Versions/Current", version), (fwName, os.path.join("Versions/Current", fwName)), ("Headers", "Versions/Current/Headers") ]) fontmatrix-0.6.0+svn20110930/OSX-package/linktools/mkappbundle.py0000755000175000017500000000362111420054616023270 0ustar malexmalex#!/usr/bin/python import os import sys import shutil import osxtools def usage(): print """ Usage: mkappbundle.py bundle [-b binary] [-i infofile|-v version] Creates the directory structure for an application bundle. If binary is given, it will be used as the binaries executable, otherwise the binary will just be an empty shell. bundle: the path to the *.app bundle -b binary: copy lib into the bundle. -i infofile: use "ver" as the version instead of the standard 'A' """ if len(sys.argv) <= 1 or sys.argv[1] == "-?" : usage() sys.exit(0) infofile = None binfile = None bundle = None argp = 1 while argp < len(sys.argv) : if sys.argv[argp] == '-b' : binfile = (sys.argv[argp + 1]) argp = argp + 2 elif sys.argv[argp][0:2] == '-b' : binfile = (sys.argv[argp][2:]) argp = argp + 1 elif sys.argv[argp] == '-i' : infofile = (sys.argv[argp + 1]) argp = argp + 2 elif sys.argv[argp][0:2] == '-i' : infofile = (sys.argv[argp][2:]) argp = argp + 1 elif sys.argv[argp][0:1] == '-' : print "Error: unknown option: " + sys.argv[argp] usage() sys.exit(1) elif bundle == None: bundle = sys.argv[argp] argp = argp + 1 else: print "Error: more than one bundle path specified!" usage() sys.exit(1) if bundle == None: print "Error: no bundle path specified!" usage() sys.exit(1) if not os.path.isabs(bundle): bundle = os.path.join(os.getenv("PWD"), bundle) if bundle[-4 : ] != ".app": bundle = bundle + ".app" appName = os.path.basename(bundle)[0: -4] if not os.path.exists(bundle): os.makedirs(bundle, 0755) elif not os.path.isdir(bundle): print "Error: '" + bundle + "' is no bundle path!" usage() sys.exit(1) binPath = os.path.join(bundle, "Contents/MacOS") if not os.path.exists(binPath): os.makedirs(binPath, 0755) if binfile != None: shutil.copy(binfile, os.path.join(binPath, appName)) shutil.copy(infofile, os.path.join(bundle, "Contents/Info.plist") fontmatrix-0.6.0+svn20110930/cmake/0000755000175000017500000000000011641435631015414 5ustar malexmalexfontmatrix-0.6.0+svn20110930/cmake/modules/0000755000175000017500000000000011641435631017064 5ustar malexmalexfontmatrix-0.6.0+svn20110930/cmake/modules/FindICU.cmake0000644000175000017500000000453211476762013021316 0ustar malexmalex# Finds the International Components for Unicode (ICU) Library # # ICU_FOUND - True if ICU found. # ICU_I18N_FOUND - True if ICU's internationalization library found. # ICU_INCLUDE_DIRS - Directory to include to get ICU headers # Note: always include ICU headers as, e.g., # unicode/utypes.h # ICU_LIBRARIES - Libraries to link against for the common ICU # ICU_I18N_LIBRARIES - Libraries to link against for ICU internationaliation # (note: in addition to ICU_LIBRARIES) # Look for the header file. # find_path( # ICU_INCLUDE_DIR # NAMES unicode/utypes.h # DOC "Include directory for the ICU library") # mark_as_advanced(ICU_INCLUDE_DIR) # This is a perverted FindICU since we rather look for ICU Layout module FIND_PATH( ICU_INCLUDE_DIR NAMES layout/LayoutEngine.h DOC "Include directory for the ICU Layout library" ) mark_as_advanced(ICU_INCLUDE_DIR) # Look for the library. find_library( ICU_LIBRARY NAMES icule cygicule cygicule32 DOC "Libraries to link against for the common parts of ICU") mark_as_advanced(ICU_LIBRARY) # Look for the library. Again find_library( ICUX_LIBRARY NAMES iculx DOC "Libraries to link against for the common parts of ICU X") mark_as_advanced(ICUX_LIBRARY) # Look for the library. Again find_library( ICUUC_LIBRARY NAMES icuuc DOC "Libraries to link against for the common parts of ICU X") mark_as_advanced(ICUUC_LIBRARY) # Copy the results to the output variables. if(ICU_INCLUDE_DIR AND ICU_LIBRARY AND ICUX_LIBRARY AND ICUUC_LIBRARY) set(ICU_FOUND 1) set(ICU_LIBRARIES ${ICU_LIBRARY} ${ICUX_LIBRARY} ${ICUUC_LIBRARY}) set(ICU_INCLUDE_DIRS ${ICU_INCLUDE_DIR}) # Look for the ICU internationalization libraries find_library( ICU_I18N_LIBRARY NAMES icuin icui18n cygicuin cygicuin32 DOC "Libraries to link against for ICU internationalization") mark_as_advanced(ICU_I18N_LIBRARY) if (ICU_I18N_LIBRARY) set(ICU_I18N_FOUND 1) set(ICU_I18N_LIBRARIES ${ICU_I18N_LIBRARY}) else (ICU_I18N_LIBRARY) set(ICU_I18N_FOUND 0) set(ICU_I18N_LIBRARIES) endif (ICU_I18N_LIBRARY) else(ICU_INCLUDE_DIR AND ICU_LIBRARY) set(ICU_FOUND 0) set(ICU_I18N_FOUND 0) set(ICU_LIBRARIES) set(ICU_I18N_LIBRARIES) set(ICU_INCLUDE_DIRS) endif(ICU_INCLUDE_DIR AND ICU_LIBRARY AND ICUX_LIBRARY AND ICUUC_LIBRARY) fontmatrix-0.6.0+svn20110930/cmake/modules/FindLIBPODOFO.cmake0000644000175000017500000000330411151346464022205 0ustar malexmalex# Directly borrowed to Scribus SET(useshared) IF(WIN32) IF(NOT DEFINED LIBPODOFO_SHARED) MESSAGE("FATAL: Win32 users MUST set LIBPODOFO_SHARED") MESSAGE("FATAL: Set -DLIBPODOFO_SHARED=0 if linking to a static library PoDoFo") MESSAGE("FATAL: or -DLIBPODOFO_SHARED=1 if linking to a DLL build of PoDoFo") MESSAGE(FATAL_ERROR "LIBPODOFO_SHARED unset on win32 build") ELSE(NOT DEFINED LIBPODOFO_SHARED) IF(LIBPODOFO_SHARED) SET(useshared "-DUSING_SHARED_PODOFO") ENDIF(LIBPODOFO_SHARED) ENDIF(NOT DEFINED LIBPODOFO_SHARED) ENDIF(WIN32) FIND_PATH(LIBPODOFO_INCLUDE_DIR NAMES podofo/podofo.h PATHS "${LIBPODOFO_DIR}/include" "${LIBPODOFO_DIR}/src" "${LIBPODOFO_DIR}" /usr/include /usr/local/include ) SET(LIBPODOFO_FIND_QUIETLY 1) FIND_LIBRARY(LIBPODOFO_LIBRARY NAMES libpodofo podofo PATHS "${LIBPODOFO_DIR}/lib" "${LIBPODOFO_DIR}/src" "${LIBPODOFO_DIR}" /usr/lib /usr/local/lib ) IF(LIBPODOFO_INCLUDE_DIR AND LIBPODOFO_LIBRARY) SET(LIBPODOFO_FOUND TRUE CACHE BOOLEAN "Was libpodofo found") ENDIF(LIBPODOFO_INCLUDE_DIR AND LIBPODOFO_LIBRARY) SET(LIBPODOFO_CFLAGS "${useshared}" CACHE STRING "Extra flags for compiling against PoDoFo") IF(NOT LIBPODOFO_FIND_QUIETLY) IF(LIBPODOFO_INCLUDE_DIR) MESSAGE("podofo/podofo.h: ${LIBPODOFO_INCLUDE_DIR}") ELSE(LIBPODOFO_INCLUDE_DIR) MESSAGE("podofo/podofo.h: not found") ENDIF(LIBPODOFO_INCLUDE_DIR) IF(LIBPODOFO_LIBRARY) MESSAGE("podofo lib: ${LIBPODOFO_LIBRARY}") ELSE(LIBPODOFO_LIBRARY) MESSAGE("podofo lib: not found") ENDIF(LIBPODOFO_LIBRARY) MESSAGE("PoDoFo cflags: ${useshared}") ENDIF(NOT LIBPODOFO_FIND_QUIETLY) fontmatrix-0.6.0+svn20110930/cmake/modules/FindM17N.cmake0000644000175000017500000000141011015114753021337 0ustar malexmalex# Finds m17n Library # # M17N_FOUND # M17N_INCLUDE_DIRS # M17N_LIBRARIES FIND_PATH( M17N_INCLUDE_DIR NAMES m17n.h DOC "Include directory for the M17N library" ) # Look for the library. find_library( M17N_LIBRARY NAMES m17n-core DOC "Library to link against core M17N" ) find_library( M17N_FLT_LIBRARY NAMES m17n-flt DOC "Library to link against Layout part of M17N" ) # message(STATUS "M17N INC " ${M17N_INCLUDE_DIR}) # message(STATUS "M17N LIB " ${M17N_LIBRARY} ) # Copy the results to the output variables. if(M17N_INCLUDE_DIR AND M17N_LIBRARY AND M17N_FLT_LIBRARY) set(M17N_FOUND 1) set(M17N_LIBRARIES ${M17N_LIBRARY} ${M17N_FLT_LIBRARY}) set(M17N_INCLUDE_DIRS ${M17N_INCLUDE_DIR}) endif(M17N_INCLUDE_DIR AND M17N_LIBRARY AND M17N_FLT_LIBRARY) fontmatrix-0.6.0+svn20110930/cmake/modules/OwnIngestOSXBundleLibraries.cmake0000644000175000017500000002544711173040456025375 0ustar malexmalex# # Somehow "backport" CMakeIngestOSXBundleLibraries.cmake # rename in OwnIngestOSXBundleLibraries.cmake to not conflict if already present # # Only for the Mac build. # # Depends on OS tools: # otool # install_name_tool # # This script ingests libraries and frameworks into an existing .app bundle and # then uses install_name_tool to fixup the references to the newly embedded # libraries so that they all refer to each other via "@executable_path." # # The main intent (and simplifying assumption used for developing the script) # is to have a single executable .app bundle that becomes "self-contained" by # copying all non-system libs that it depends on into itself. The further # assumption is that all such dependencies are simple .dylib shared library # files or Mac Framework libraries. # # This script can be used as part of the build via ADD_CUSTOM_COMMAND, or used # only during make install via INSTALL SCRIPT. # IF(NOT DEFINED input_file) MESSAGE(FATAL_ERROR " ${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): error: Variable input_file is not defined. Use a command line like this to use this script: cmake \"-Dinput_file=filename\" \"-Dextra_libs=/path/to/lib1;/path/to/lib2\" \"-Dlib_path=/path/to/unqualified/libs\" -P \"${CMAKE_CURRENT_LIST_FILE}\" 'input_file' should be the main executable inside a Mac bundle directory structure. For example, use 'bin/paraview.app/Contents/MacOS/paraview' from a ParaView binary dir. 'extra_libs' should be a semi-colon separated list of full path names to extra libraries to copy into the bundle that cannot be derived from otool -L output. For example, you may also want to fixup dynamically loaded plugins from your build tree and copy them into the bundle. 'lib_path' should be the path where to find libraries referenced without a path name in otool -L output. ") ENDIF(NOT DEFINED input_file) SET(eol_char "E") IF(APPLE) SET(dep_tool "otool") SET(dep_cmd_args "-L") SET(dep_regex "^\t([^\t]+) \\(compatibility version ([0-9]+.[0-9]+.[0-9]+), current version ([0-9]+.[0-9]+.[0-9]+)\\)${eol_char}$") ENDIF(APPLE) MESSAGE("") MESSAGE("# Script \"${CMAKE_CURRENT_LIST_FILE}\" running...") MESSAGE("") MESSAGE("input_file: '${input_file}'") MESSAGE("extra_libs: '${extra_libs}'") MESSAGE("lib_path: '${lib_path}'") MESSAGE("") GET_FILENAME_COMPONENT(input_file_full "${input_file}" ABSOLUTE) MESSAGE("input_file_full: '${input_file_full}'") GET_FILENAME_COMPONENT(bundle "${input_file_full}/../../.." ABSOLUTE) MESSAGE("bundle: '${bundle}'") FIND_PROGRAM(dep_cmd ${dep_tool}) MACRO(APPEND_UNIQUE au_list_var au_value) SET(${au_list_var} ${${au_list_var}} "${au_value}") ENDMACRO(APPEND_UNIQUE) MACRO(GATHER_DEPENDENTS gd_target gd_dependents_var) EXECUTE_PROCESS( COMMAND ${dep_cmd} ${dep_cmd_args} ${gd_target} OUTPUT_VARIABLE dep_tool_ov ) STRING(REGEX REPLACE ";" "\\\\;" dep_candidates "${dep_tool_ov}") STRING(REGEX REPLACE "\n" "${eol_char};" dep_candidates "${dep_candidates}") SET(${gd_dependents_var} "") FOREACH(candidate ${dep_candidates}) IF("${candidate}" MATCHES "${dep_regex}") STRING(REGEX REPLACE "${dep_regex}" "\\1" raw_item "${candidate}") STRING(REGEX REPLACE "${dep_regex}" "\\2" raw_compat_version "${candidate}") STRING(REGEX REPLACE "${dep_regex}" "\\3" raw_current_version "${candidate}") SET(item "${raw_item}") STRING(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" compat_major_version "${raw_compat_version}") STRING(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" compat_minor_version "${raw_compat_version}") STRING(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" compat_patch_version "${raw_compat_version}") STRING(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" current_major_version "${raw_current_version}") STRING(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" current_minor_version "${raw_current_version}") STRING(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" current_patch_version "${raw_current_version}") #MESSAGE("${raw_item} - compat ${raw_compat_version} - current ${raw_current_version}") APPEND_UNIQUE("${gd_dependents_var}" "${item}") ELSE("${candidate}" MATCHES "${dep_regex}") IF("${candidate}" STREQUAL "${gd_target}:${eol_char}") #MESSAGE("info: ignoring target name...") ELSE("${candidate}" STREQUAL "${gd_target}:${eol_char}") MESSAGE("error: candidate='${candidate}'") ENDIF("${candidate}" STREQUAL "${gd_target}:${eol_char}") ENDIF("${candidate}" MATCHES "${dep_regex}") ENDFOREACH(candidate) ENDMACRO(GATHER_DEPENDENTS) MESSAGE("Gathering dependent libraries for '${input_file_full}'...") GATHER_DEPENDENTS("${input_file_full}" deps) MESSAGE("") # Order lexicographically: # LIST(SORT deps) # Split into separate lists, "system" "embedded" and "nonsystem" libraries. # System libs are assumed to be available on all target runtime Macs and do not # need to be copied/fixed-up by this script. Embedded libraries are assumed to # be in the bundle and fixed-up already. Only non-system, non-embedded libs # need copying and fixing up... # SET(system_deps "") SET(embedded_deps "") SET(nonsystem_deps "") FOREACH(d ${deps}) SET(d_is_embedded_lib 0) SET(d_is_system_lib 0) IF("${d}" MATCHES "^(/System/Library|/usr/lib)") SET(d_is_system_lib 1) ELSE("${d}" MATCHES "^(/System/Library|/usr/lib)") IF("${d}" MATCHES "^@executable_path") SET(d_is_embedded_lib 1) ENDIF("${d}" MATCHES "^@executable_path") ENDIF("${d}" MATCHES "^(/System/Library|/usr/lib)") IF(d_is_system_lib) SET(system_deps ${system_deps} "${d}") ELSE(d_is_system_lib) IF(d_is_embedded_lib) SET(embedded_deps ${embedded_deps} "${d}") ELSE(d_is_embedded_lib) SET(nonsystem_deps ${nonsystem_deps} "${d}") ENDIF(d_is_embedded_lib) ENDIF(d_is_system_lib) ENDFOREACH(d) MESSAGE("") MESSAGE("system_deps:") FOREACH(d ${system_deps}) MESSAGE("${d}") ENDFOREACH(d ${system_deps}) MESSAGE("") MESSAGE("embedded_deps:") FOREACH(d ${embedded_deps}) MESSAGE("${d}") ENDFOREACH(d ${embedded_deps}) MESSAGE("") MESSAGE("nonsystem_deps:") FOREACH(d ${nonsystem_deps}) MESSAGE("${d}") ENDFOREACH(d ${nonsystem_deps}) MESSAGE("") MACRO(COPY_LIBRARY_INTO_BUNDLE clib_bundle clib_libsrc clib_dstlibs clib_fixups) # # If the source library is a framework, copy just the shared lib bit of the framework # into the bundle under "${clib_bundle}/Contents/Frameworks" - if it is just a dylib # copy it into the same directory with the main bundle executable under # "${clib_bundle}/Contents/MacOS" # IF("${clib_libsrc}" MATCHES ".framework/.*/.*/.*") # SET(fw_src "/Library/Frameworks/${clib_libsrc}") SET(fw_src "${clib_libsrc}") GET_FILENAME_COMPONENT(fw_srcdir "${fw_src}/../../.." ABSOLUTE) GET_FILENAME_COMPONENT(fwdirname "${fw_srcdir}" NAME) STRING(REGEX REPLACE "^(.*)\\.framework$" "\\1" fwname "${fwdirname}") STRING(REGEX REPLACE "^.*/${fwname}\\.framework/(.*)$" "\\1" fwlibname "${clib_libsrc}") SET(fw_dstdir "${clib_bundle}/Contents/Frameworks/${fwdirname}") # MESSAGE("") # MESSAGE("fwdirname: '${fwdirname}'") # MESSAGE("fwname: '${fwname}'") # MESSAGE("fwlibname: '${fwlibname}'") # MESSAGE("fw_src: '${fw_src}'") # MESSAGE("fw_srcdir: '${fw_srcdir}'") # MESSAGE("fw_dstdir: '${fw_dstdir}'") # MESSAGE("new_name: '@executable_path/../Frameworks/${fwdirname}/${fwlibname}'") # MESSAGE("") MESSAGE("Copying ${fw_srcdir} into bundle...") # This command copies the *entire* framework recursively: # # EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_directory # "${fw_srcdir}" "${fw_dstdir}" # ) # This command copies just the main shared lib of the framework: # (This technique will not work for frameworks that have necessary # resource or auxiliary files...) # EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy "${fw_src}" "${fw_dstdir}/${fwlibname}" ) EXECUTE_PROCESS(COMMAND install_name_tool -id "@executable_path/../Frameworks/${fwdirname}/${fwlibname}" "${clib_bundle}/Contents/Frameworks/${fwdirname}/${fwlibname}" ) SET(${clib_dstlibs} ${${clib_dstlibs}} "${clib_bundle}/Contents/Frameworks/${fwdirname}/${fwlibname}" ) SET(${clib_fixups} ${${clib_fixups}} "-change" "${clib_libsrc}" "@executable_path/../Frameworks/${fwdirname}/${fwlibname}" ) ELSE("${clib_libsrc}" MATCHES ".framework/.*/.*/.*") IF("${clib_libsrc}" MATCHES "/") SET(clib_libsrcfull "${clib_libsrc}") ELSE("${clib_libsrc}" MATCHES "/") SET(clib_libsrcfull "${lib_path}/${clib_libsrc}") IF(NOT EXISTS "${clib_libsrcfull}") MESSAGE(FATAL_ERROR "error: '${clib_libsrcfull}' does not exist...") ENDIF(NOT EXISTS "${clib_libsrcfull}") ENDIF("${clib_libsrc}" MATCHES "/") GET_FILENAME_COMPONENT(dylib_src "${clib_libsrcfull}" ABSOLUTE) GET_FILENAME_COMPONENT(dylib_name "${dylib_src}" NAME) SET(dylib_dst "${clib_bundle}/Contents/MacOS/${dylib_name}") # MESSAGE("dylib_src: ${dylib_src}") # MESSAGE("dylib_dst: ${dylib_dst}") # MESSAGE("new_name: '@executable_path/${dylib_name}'") MESSAGE("Copying ${dylib_src} into bundle...") EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy "${dylib_src}" "${dylib_dst}") EXECUTE_PROCESS(COMMAND install_name_tool -id "@executable_path/${dylib_name}" "${dylib_dst}" ) SET(${clib_dstlibs} ${${clib_dstlibs}} "${dylib_dst}" ) SET(${clib_fixups} ${${clib_fixups}} "-change" "${clib_libsrc}" "@executable_path/${dylib_name}" ) ENDIF("${clib_libsrc}" MATCHES ".framework/.*/.*/.*") ENDMACRO(COPY_LIBRARY_INTO_BUNDLE) # Copy dependent "nonsystem" libraries into the bundle: # MESSAGE("Copying dependent libraries into bundle...") SET(srclibs ${nonsystem_deps} ${extra_libs}) SET(dstlibs "") SET(fixups "") FOREACH(d ${srclibs}) COPY_LIBRARY_INTO_BUNDLE("${bundle}" "${d}" dstlibs fixups) ENDFOREACH(d) MESSAGE("") MESSAGE("dstlibs='${dstlibs}'") MESSAGE("") MESSAGE("fixups='${fixups}'") MESSAGE("") # Fixup references to copied libraries in the main bundle executable and in the # copied libraries themselves: # IF(NOT "${fixups}" STREQUAL "") MESSAGE("Fixing up references...") FOREACH(d ${dstlibs} "${input_file_full}") MESSAGE("fixing up references in: '${d}'") EXECUTE_PROCESS(COMMAND install_name_tool ${fixups} "${d}") ENDFOREACH(d) MESSAGE("") ENDIF(NOT "${fixups}" STREQUAL "") # List all references to eyeball them and make sure they look right: # MESSAGE("Listing references...") FOREACH(d ${dstlibs} "${input_file_full}") EXECUTE_PROCESS(COMMAND otool -L "${d}") MESSAGE("") ENDFOREACH(d) MESSAGE("") # Output file: # GET_FILENAME_COMPONENT(script_name "${CMAKE_CURRENT_LIST_FILE}" NAME) FILE(WRITE "${input_file_full}_${script_name}" "# Script \"${CMAKE_CURRENT_LIST_FILE}\" completed.\n") MESSAGE("") MESSAGE("# Script \"${CMAKE_CURRENT_LIST_FILE}\" completed.") MESSAGE("") fontmatrix-0.6.0+svn20110930/cmake/modules/FONTCONFIGConfig.cmake0000644000175000017500000000403310752273166022655 0ustar malexmalex# # Find the native FONTCONFIG includes and library # # This module defines # FONTCONFIG_INCLUDE_DIR, where to find art*.h etc # FONTCONFIG_LIBRARY, the libraries to link against to use FONTCONFIG. # FONTCONFIG_FOUND, If false, do not try to use FONTCONFIG. # LIBFONTCONFIG_LIBS, link information # LIBFONTCONFIG_CFLAGS, cflags for include information INCLUDE(UsePkgConfig) # use pkg-config to get the directories and then use these values # in the FIND_PATH() and FIND_LIBRARY() calls PKGCONFIG(fontconfig _fontconfigIncDir _fontconfigLinkDir _fontconfigLinkFlags _fontconfigCflags) SET(FONTCONFIG_LIBS ${_fontconfigCflags}) IF(BUILD_OSX_BUNDLE) FIND_PATH(FONTCONFIG_INCLUDE_DIR fontconfig/fontconfig.h /opt/local/include NO_DEFAULT_PATH ) FIND_LIBRARY(FONTCONFIG_LIBRARY NAMES fontconfig PATHS /opt/local/lib NO_DEFAULT_PATH ) ELSE(BUILD_OSX_BUNDLE) FIND_PATH(FONTCONFIG_INCLUDE_DIR fontconfig/fontconfig.h ${_fontconfigIncDir} /usr/include /usr/local/include PATH_SUFFIXES fontconfig ) # quick hack as the above finds it nicely but our source includes the libart_lgpl text at the moment #STRING(REGEX REPLACE "/libart_lgpl" "" FONTCONFIG_INCLUDE_DIR ${FONTCONFIG_INCLUDE_DIR}) FIND_LIBRARY(FONTCONFIG_LIBRARY NAMES fontconfig PATHS /usr/lib /usr/local/lib ) ENDIF(BUILD_OSX_BUNDLE) # MESSAGE(STATUS "fclib ${FONTCONFIG_LIBRARY}") # MESSAGE(STATUS "fcinclude ${FONTCONFIG_INCLUDE_DIR}") IF (FONTCONFIG_LIBRARY) IF (FONTCONFIG_INCLUDE_DIR) SET( FONTCONFIG_FOUND "YES" ) SET( FONTCONFIG_LIBRARIES ${FONTCONFIG_LIBRARY} ) FIND_PROGRAM(FONTCONFIG_CONFIG NAMES fontconfig-config PATHS ${prefix}/bin ${exec_prefix}/bin /usr/local/bin /opt/local/bin /usr/bin /usr/nekoware/bin /usr/X11/bin) # EXEC_PROGRAM(${FONTCONFIG_CONFIG} ARGS --libs OUTPUT_VARIABLE FONTCONFIG_LIBS) # EXEC_PROGRAM(${FONTCONFIG_CONFIG} ARGS --cflags OUTPUT_VARIABLE FONTCONFIG_CFLAGS) # MESSAGE(STATUS ${FONTCONFIG_LIBS}) # MESSAGE(STATUS ${FONTCONFIG_CFLAGS}) ENDIF (FONTCONFIG_INCLUDE_DIR) ENDIF (FONTCONFIG_LIBRARY) fontmatrix-0.6.0+svn20110930/ChangeLog0000644000175000017500000053551511216117121016111 0ustar malexmalex2009-06-17 07:28 oeildepierre * src/fminfodisplay.cpp, src/mainviewwidget.cpp: Fixed - generation of html for informations panel was broken (svg block was repeated) 2009-06-17 07:01 oeildepierre * CMakeLists.txt, src/fminfodisplay.cpp, src/graphic-resources/html-css/fontmatrix.js, src/mainviewwidget.cpp: Added - a default javascript file to be loaded in font information panel 2009-06-17 06:31 oeildepierre * src/graphic-resources/html-css/info.css: Updated - default css 2009-06-17 06:24 oeildepierre * src/fmrepair.cpp: Fixed - #13570 : Database check doesn't update font list 2009-06-17 05:27 oeildepierre * src/about.ui, src/aboutwidget.cpp: Forgot - more splashscreen update 2009-06-17 05:23 oeildepierre * src/application.qrc, src/fmnamelist.cpp, src/graphic-resources/splashscreen.png, src/icons/splash_fm.svg, src/main.cpp, src/prefspaneldialog.cpp, src/typotek.cpp: Changed - splashscreen (graphic and made it true by default + added SVG file to repo) 2009-06-15 15:37 oeildepierre * src/fmnamelist.cpp, src/fmnamelist.h, src/main.cpp, src/mainviewwidget.cpp, src/typotek.cpp, src/typotek.h: Added - restore to last selected face 2009-06-15 14:20 oeildepierre * src/CMakeLists.txt, src/dataexport.cpp, src/fmencdata.cpp, src/fmencdata.h, src/fminfodisplay.cpp, src/fminfodisplay.h, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/messages/fontmatrix-fr.ts: Refactoring - method to generate html is now outside FontItem 2009-06-15 12:51 oeildepierre * src/mainviewwidget.cpp: Fixed - latest commit had disabled glyph name search 2009-06-15 12:22 oeildepierre * src/fmfontstrings.cpp, src/fmfontstrings.h, src/fontitem.cpp, src/fontitem.h, src/graphic-resources/html-css/info.css, src/panosedialog.cpp: Fixed - display of FsType 2009-06-15 08:35 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp: Added - search by codepoint in glyphs view 2009-05-31 17:19 oeildepierre * debian-ubuntu-install.txt: Fixed - instructions for Debian led to checkout the whole Undertype repository 2009-05-23 19:20 oeildepierre * src/fontitem.cpp: Fixed - #13552 Crash with "index out of range" 2009-05-23 15:41 oeildepierre * src/dataloader.cpp, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/typotek.cpp: Fixed - User samples were not saved at all 2009-05-23 14:56 oeildepierre * CMakeLists.txt, samples, samples/CMakeLists.txt, samples/fr, samples/fr/CMakeLists.txt, samples/fr/Mamere, src/CMakeLists.txt, src/dataloader.cpp, src/dataloader.h, src/fmpaths.cpp, src/fmpaths.h, src/mainview.ui, src/mainviewwidget.cpp, src/prefspaneldialog.cpp, src/typotek.cpp, src/typotek.h: Changed - samples are now stored at system level _and_ user level to allow easy distribution of large sets of samples. More samples to come then ;-) 2009-05-19 13:31 oeildepierre * src/scripts/import_tags.py: Updated - import tags from pre-0.5 database (the XML file) with a python script provided by trs 2009-05-19 13:07 oeildepierre * src/fmmatchraster.cpp, src/fmmatchraster.h, src/iview.cpp, src/iview.h, src/matchraster.ui: Added - you can now grab glyphs for raster matching directly from within fontmatrix 2009-05-19 08:44 oeildepierre * src/scripts/CMakeLists.txt, src/scripts/import_tags.py: Added - a script model for tags import 2009-05-18 20:45 oeildepierre * src/CMakeLists.txt, src/activationreportdialog.ui, src/fmactivate.cpp, src/fmactivate.h, src/fmactivationreport.cpp, src/fmactivationreport.h, src/mainviewwidget.cpp, src/mainviewwidget.h: Added - a report is displayed when errors occured during activation/de-activation, simplified activation code. 2009-05-18 09:33 prokoudine * src/listsdock.ui: Finally got around to fix the blasted capitalization on buttons captions 2009-05-17 19:31 oeildepierre * src/CMakeLists.txt, src/altselectorwidget.ui, src/fmaltcontext.cpp, src/fmaltcontext.h, src/fmaltselector.cpp, src/fmaltselector.h, src/fmotf.cpp, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp: Added - some test code (deactivated) to deal with alternate glyphs 2009-05-12 07:38 oeildepierre * src/fontitem.cpp: Fixed - glyph names were not correctly extracted, if at all. 2009-05-09 18:06 oeildepierre * debian-ubuntu-install.txt: Improved instructions related to building and installing for Debian users (provided by Nicolas Spalinger) 2009-05-07 20:12 oeildepierre * debian-ubuntu-install.txt: Added - Debian installation instructions 2009-05-07 19:13 oeildepierre * src/fmlayout.cpp, src/main.cpp: Fixed - a segfault in Ubuntu (systray) 2009-05-06 09:39 oeildepierre * src/typotek.cpp: Fixed - #13487 : Doesn't look for fonts in ~/.fonts 2009-05-01 15:19 oeildepierre * src/graphic-resources/font-sampletext2.png: Fixed - added missing icon 2009-05-01 15:15 oeildepierre * dodict/CMakeLists.txt, dodict/dodict.cpp, src/langs/CMakeLists.txt: cleaning 2009-05-01 15:14 oeildepierre * dodict, pythonqt/src/PythonQt.cpp, pythonqt/src/PythonQtImporter.cpp, src/CMakeLists.txt, src/application.qrc, src/fmpython_w.cpp, src/graphic-resources/font-class.png, src/graphic-resources/font-compare.png, src/icons/font-class.svg, src/icons/font-compare2.svg, src/icons/font-smpletext2.svg, src/langs/dodict.cpp, src/mainview.ui, src/scripts, src/scripts/CMakeLists.txt, src/scripts/fontforge_subset.py, src/scripts/fonttools_showxml.py, src/scripts/xetex_fontbook.py: Added - sample Python scripts Added - new icons (panose, compare) 2009-04-30 13:50 oeildepierre * src/mainviewwidget.cpp: Fixed - [17:03] can you please correct wrong behaviour when face checkbox is turned off and user click at that face 2009-04-29 07:49 oeildepierre * src/fmshaper_own.cpp, src/fontitem.cpp, src/fontitem.h, src/langs/latn.dict, src/langs/latn.match: Added - display glyph names for unreferenced glyphs 2009-04-26 23:04 oeildepierre * INSTALL, src/CMakeLists.txt, src/fmpaths.cpp, src/messages/CMakeLists.txt, src/messages/about_people.html, src/messages/fontmatrix-fr.ts: Added - configured support for Czech Translation 2009-04-26 22:53 oeildepierre * src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: Fixed - a segfault when closing FM 2009-04-25 20:16 mrdocs * src/messages/about_people.html, src/messages/fontmatrix-cs.ts: add new Czech translation 2009-04-25 14:07 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: Added - collapse / expand for names list Added - show / hide checkboxes for faces Fixed - some splitters were not correctly saved restored, if at all 2009-04-24 12:10 oeildepierre * src/listsdock.ui, src/mainview.ui, src/mainviewwidget.cpp: Fixed - makes the search character field hidden by default 2009-04-24 09:58 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp: Improved - UI of the glyphs tab 2009-04-24 09:04 oeildepierre * src/mainviewwidget.cpp, src/typotek.cpp: Fixed - "activate all" was broken, do not know exactly how but its work fine here and now. Added - a confirmation dialog when importing a fonts dir 2009-04-23 16:10 prokoudine * help/en/management.html: Mentioned editing/removing of tags via right click on Tags palette 2009-04-21 11:37 oeildepierre * src/fontitem.cpp: Fixed - badly designed code hopefully re-written by a contributor 2009-04-21 11:35 oeildepierre * src/CMakeLists.txt, src/fmfontstrings.cpp, src/fmfontstrings.h, src/main.cpp, src/messages/fontmatrix-fr.ts: Updated - French translation Fixed - some translated strings were not available cause a missing Q_OBJECT macro processing 2009-04-20 09:32 oeildepierre * CMakeLists.txt, cmake/modules/OwnIngestOSXBundleLibraries.cmake, src/listsdock.ui, src/mainview.ui: Fixed - MacOSX cmake specific issues and UI tweaks (let me think to import the script avox wrote to build an app) 2009-04-20 09:30 oeildepierre * src/fmglyphsview.cpp, src/fmglyphsview.h, src/fontitem.cpp, src/mainviewwidget.cpp, src/typotek.cpp: Fixed - bug #13391 : Scroll bar doesn't work in the glyphs panel 2009-04-12 08:48 prokoudine * src/messages/fontmatrix-ru.ts: Updated Russian translation 2009-04-10 14:48 prokoudine * help/en/search.html, help/en/setting_up_layout_engine_options.html: a bit more stuff 2009-04-10 09:47 oeildepierre * src/fmmatchraster.cpp: Fixed - matching was very bad with little samples 2009-04-10 08:48 oeildepierre * src/fmmatchraster.cpp, src/fmmatchraster.h, src/iview.cpp, src/matchraster.ui: Improved usability of the font matcher 2009-04-10 07:16 oeildepierre * src/mainview.ui: Fixed - default page of the main tab widget 2009-04-09 20:54 prokoudine * src/messages/fontmatrix-ru.ts: And how could I possibly not commit updated Russian translation when an new major (yet not quite functional) function was committed less than 2 hours ago? :) 2009-04-09 20:49 prokoudine * help/en/setting_up_layout_engine_options.html: Ah, the user visible header was supposed to be updated as well. Silly me. 2009-04-09 20:45 prokoudine * help/en/menu.xml, help/en/setting_up_layout_engine_options.html, src/layoutoptions.ui, src/typotek.cpp: Initial documentation for text layoput engine options, extracted from an old IRC log. Features TODOs and human unreadable text :) Also improved corresponding menu item and fixed capitalization in the dialog itself. 2009-04-09 19:42 prokoudine * src/matchraster.ui, src/typotek.cpp: Improved naming of the new function, added mnemonic keys, added tooltip for its menu item 2009-04-09 19:20 oeildepierre * src/iview.cpp, src/iview.h, src/matchraster.ui: #13325 (…) missing files 2009-04-09 19:19 oeildepierre * CMakeLists.txt, src/CMakeLists.txt, src/fmmatchraster.cpp, src/fmmatchraster.h, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/mainviewwidget.h, src/puzzleviewimp.cpp, src/puzzleviewimp.h, src/typotek.cpp, src/typotek.h: #13325 : RFE: Font matching / locating based on bitmap image 2009-04-07 19:54 prokoudine * src/mainview.ui, src/messages/fontmatrix-ru.ts: Added tooltips to meet some concerns expressed at http://gna.org/bugs/?10531, updated Russian translation accordingly 2009-04-06 14:14 oeildepierre * src/fmfontdb.cpp, src/fmrepair.cpp, src/fmrepair.h, src/repair.ui: Fixed - #13115 : Fontmatrix: find double fonts, delete fonts 2009-04-06 08:53 oeildepierre * src/fmkernfeat.cpp, src/fmkernfeat.h: Fixed - updated kern feature extracting code with fixes made for Scribus, hope nothing is broken :) 2009-04-05 18:20 prokoudine * src/messages/fontmatrix-ru.ts: Updated Russian translation to match recent changes in Preferences 2009-04-05 17:20 oeildepierre * src/fmpython_w.cpp, src/fmpython_w.h, src/mainviewwidget.cpp, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: Added - made the CSS attached to the info tab a prefernce. Just to find generous designers to contributes style sheets now :) 2009-03-31 16:27 oeildepierre * src/fmkernfeat.cpp, src/fmpreviewlist.cpp, src/fmpreviewlist.h, src/mainviewwidget.cpp: Fixed - font item was not selected in preview list when selected in name list 2009-03-28 05:10 prokoudine * help/en/CMakeLists.txt, help/en/additional.html, help/en/additional_db_check.html, help/en/additional_editing_panose.html, help/en/additional_ttf_tables.html, help/en/menu.xml, help/en/news.html, help/en/setting_up.html, help/en/setting_up_layout_engine_options.html, help/en/setting_up_preferences_display.html, help/en/setting_up_preferences_files_and_folders.html, help/en/setting_up_preferences_general.html, help/en/setting_up_preferences_samples_collection.html, help/en/setting_up_preferences_service.html, help/en/setting_up_preferences_shortcuts.html, help/en/setting_up_preferences_system_tray.html: Improved menu structure, a bunch of new files to be filled later, some new help content 2009-03-28 04:39 prokoudine * src/messages/fontmatrix-ru.ts: Updated and improved Russian translation 2009-03-28 04:31 prokoudine * src/typotek.cpp: Fixed a status bar hint 2009-03-28 04:26 prokoudine * src/typotek.cpp: Added quite a number of missing status bar hints, marked a message for translation 2009-03-28 03:46 prokoudine * src/tttablewidget.ui: Fixed templatish dialog's caption, added missing mnemonics 2009-03-28 03:34 prokoudine * src/importedfonts.ui: Fixed button layout in the dialog, added missing mnemonics 2009-03-28 03:32 prokoudine * src/importedfonts.ui, src/multiprintdialog.ui, src/repair.ui: Missing dialog captions are present now 2009-03-19 13:14 oeildepierre * src/fmkernfeat.cpp, src/fmkernfeat.h, src/tttableview.cpp, src/tttableview.h, src/tttablewidget.ui: Fixed - correct building of kern pairs table from kern feature 2009-03-18 14:40 prokoudine * help/sr/CMakeLists.txt, help/sr/Makefile, help/sr/index.html, help/sr/menu.xml, help/sr/readme.html, help/sr/style.css: Committed missing files by paragn's request. Soon to be removed/substituted anyway :) 2009-03-17 23:22 oeildepierre * src/CMakeLists.txt, src/fmkernfeat.cpp, src/fmkernfeat.h, src/fontitem.cpp, src/fontitem.h: Added - experimental code about kern feature 2009-03-14 22:04 oeildepierre * INSTALL: Added - more details about installation. :) 2009-03-14 11:34 oeildepierre * src/fmfontextract.cpp, src/fmfontextract.h, src/fmfontextractorbase.h, src/fmpdffontextractor.cpp, src/fmpdffontextractor.h: Hm - prepared for a generalized extract fonts feature 2009-03-08 13:55 mrdocs * src/fmdumpinfo.cpp, src/fmotf.h: more fixes for gcc 44 compile issues 2009-03-03 10:55 oeildepierre * src/fmfontdb.cpp, src/fmfontdb.h, src/fmpython_w.cpp: Fixed - better remove 2009-03-02 18:54 prokoudine * src/messages/fontmatrix-ru.ts, src/scriptconsole.ui, src/typotek.cpp: Fixed a couple of old message bugs, fixed capitalization of some captions, updated Russian translation 2009-03-02 17:10 oeildepierre * src/fmfontdb.cpp: Fixed - finally wrote the implementation of FMFontDB::Remove() 2009-03-02 16:49 oeildepierre * src/fmpython_w.cpp, src/fmpython_w.h, src/fmscriptconsole.cpp, src/fmscriptconsole.h, src/scriptconsole.ui: Changed - execute scripts in another thread 2009-03-02 15:35 oeildepierre * src/fmpaths.cpp, src/fmpaths.h, src/fmpreviewlist.cpp, src/fmscriptconsole.cpp, src/fmscriptconsole.h, src/scriptconsole.ui: Improved - script console user interface, prepared for scripts distribution. 2009-03-02 13:10 oeildepierre * pythonqt/src/PythonQtSlot.cpp, src/fmpreviewlist.cpp, src/fmpreviewlist.h, src/fontitem.cpp, src/listsdock.ui, src/typotek.cpp: Fixed - size of icons representing previews was not correctly updated when changing preview font size in browse panel. 2009-03-02 10:02 oeildepierre * src/fmglyphsview.cpp, src/fontcomparewidget.cpp, src/fontitem.cpp, src/mainviewwidget.cpp: Fixed - issues with dark themes. generally tried to take in account that people use themes. 2009-02-26 22:10 prokoudine * src/messages/fontmatrix-ru.ts: Catching up on recent changes 2009-02-26 21:57 oeildepierre * src/fmfontextract.cpp: Fixed - a better fix for compilation without PoDoFo 2009-02-26 17:58 oeildepierre * src/mainviewwidget.cpp: Changed - make the highlight of found character longer and does not clear the search field anymore. 2009-02-26 17:16 oeildepierre * src/typotek.cpp: Fixed - font size combobox in preview panel was not updated when font size of preview was changed in preferences dialog. 2009-02-26 16:58 oeildepierre * src/tagswidget.cpp, src/typotek.cpp: Fixed - a serious slowdown when batch tagging. In fact Transaction{Begin,End} were missing. 2009-02-26 10:54 oeildepierre * INSTALL: Updated - INSTALL file with instructions to activate PoDoFo support 2009-02-26 10:14 oeildepierre * src/fmfontextract.cpp, src/fontextractordialog.ui, src/typotek.cpp: Fixed - cosmetics about extract fonts dialog 2009-02-26 09:26 oeildepierre * src/fmfontextract.cpp: Fixed - compilation without PoDoFo failed 2009-02-26 00:20 prokoudine * src/fontextractordialog.ui, src/messages/about_people.html, src/messages/fontmatrix-ru.ts: Typo fixed, added myself to the hall of sh^Wfame, updated translation again. Pierre, you still need to fix the build :) 2009-02-26 00:00 prokoudine * src/fontextractordialog.ui: Added mnemonic keys and dialog's caption. Pierre, now you fix compilation that you've broken :) 2009-02-25 22:59 oeildepierre * CMakeLists.txt, cmake/modules/FindLIBPODOFO.cmake, src/CMakeLists.txt, src/fmfontextract.cpp, src/fmfontextract.h, src/fmpdffontextractor.cpp, src/fmpdffontextractor.h, src/fontextractordialog.ui, src/typotek.cpp, src/typotek.h: Added - first bits of a font extractor facility (now just half work for PDFs with PoDoFo) 2009-02-25 22:20 prokoudine * src/messages/fontmatrix-ru.ts: Consistent commit message saying "Hey! I'm yet another Russian translation update!". Enf of consistent commit message. Thank you. You really may stop bowing now :-P 2009-02-25 22:18 prokoudine * help/en/CMakeLists.txt, help/en/font_book_templates.html, help/en/font_books.html, help/en/menu.xml: Not a huge surprise, but kind of nice 2009-02-25 11:18 oeildepierre * src/mainviewwidget.cpp: Fixed (perhaps) - a weird segfault when asking for the QRect belonging to a QGraphicsRectItem right after asking (wasnt necessary tho) to the view to make it visible. 2009-02-25 10:41 oeildepierre * src/fmfontcompareview.cpp, src/fmglyphhighlight.cpp, src/fmglyphhighlight.h, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: Added - search character by name in glyphs view 2009-02-24 11:50 oeildepierre * src/comparewidget.ui, src/fmfontcompareview.cpp, src/fmfontcompareview.h, src/fmshaper.cpp, src/fontcomparewidget.cpp, src/fontcomparewidget.h: Added - tooltips on points (coords) in compare view Fixed - colors of glyphs in compare view were not user defined 2009-02-23 20:47 prokoudine * help/en/CMakeLists.txt, help/en/creating_font_books.html, help/en/export_fonts.html, help/en/management.html, help/en/menu.xml, help/en/output.html, help/en/printing_fonts.html, help/en/readme.html, help/en/resources.html, help/en/search.html: better menu, fixes 2009-02-23 20:10 prokoudine * src/helpbrowser.cpp, src/helpbrowser.ui, src/messages/fontmatrix-ru.ts: fixed misplaced references to Scribus and updated Russian translation 2009-02-23 19:55 prokoudine * help/README, help/TODO, help/en/CMakeLists.txt, help/en/additional.html, help/en/comparisons.html, help/en/index.html, help/en/interface.html, help/en/introduction.html, help/en/management.html, help/en/managing.html, help/en/menu.xml, help/en/output.html, help/en/resources.html, help/en/scripting.html, help/en/search.html: Split help_en.html intpo several files, updated menu.xml and pinged CMake, created README and TODO. More fun to follow. 2009-02-23 10:47 oeildepierre * src/listdockwidget.cpp, src/prefspaneldialog.cpp: Updated - tootips of input widgets for the preview word to reflect new features. 2009-02-23 10:28 oeildepierre * src/fmpreviewlist.cpp: Added - placeholders in the preview word which is used for the preview list: "" ; "" ; "" 2009-02-23 10:25 oeildepierre * src/fontitem.cpp: Fixed - In various places, outlines were not set to Qt::NoPen when glyphs were rendered as plain Qt graphic elements. 2009-02-22 15:16 oeildepierre * CMakeLists.txt, harfbuzz/src/harfbuzz-indic.cpp, src/fmlayout.cpp, src/fmshaper.cpp: Introduced - special effects in Debug mode to help tracking down issues with shapers 2009-02-22 13:59 oeildepierre * src/fmotf.cpp, src/fmshaper.cpp, src/fontitem.cpp: Fixed - in FMShaper, logged char was stored into log rather than lChar, which did break the layout 2009-02-21 22:59 oeildepierre * src/typotek.cpp, src/typotek.h: Fixed - preserve visibility state of docked widget across runs and even across a hide to systray/restore 2009-02-21 14:30 oeildepierre * src/fmotf.cpp, src/fmotf.h, src/fmshaper.cpp, src/fmshaper.h: Fixed - namespacing of Harfbuzz was too naive, and even discarded by compiler 2009-02-21 13:23 mrdocs * src/QHexView.h: fixes gcc 44 compile issue 2009-02-20 17:17 oeildepierre * help/en/CMakeLists.txt, help/en/index.html, help/en/menu.xml, help/en/readme.html, help/en/style.css, help/fi/CMakeLists.txt, help/fi/index.html, help/fi/menu.xml, help/fi/readme.html, help/fi/style.css, help/fr/CMakeLists.txt, help/fr/index.html, help/fr/menu.xml, help/fr/readme.html, help/fr/style.css, help/hi/CMakeLists.txt, help/hi/index.html, help/hi/menu.xml, help/hi/readme.html, help/hi/style.css, help/nb/CMakeLists.txt, help/nb/index.html, help/nb/menu.xml, help/nb/readme.html, help/nb/style.css, help/no/CMakeLists.txt, help/no/index.html, help/no/menu.xml, help/no/readme.html, help/no/style.css, help/ru/CMakeLists.txt, help/ru/index.html, help/ru/menu.xml, help/ru/readme.html, help/ru/style.css, help/sv/CMakeLists.txt, help/sv/index.html, help/sv/menu.xml, help/sv/readme.html, help/sv/style.css, help/uk/CMakeLists.txt, help/uk/index.html, help/uk/menu.xml, help/uk/readme.html, help/uk/style.css, help/zh_CN/CMakeLists.txt, help/zh_CN/index.html, help/zh_CN/menu.xml, help/zh_CN/readme.html, help/zh_CN/style.css, help/zh_TW/CMakeLists.txt, help/zh_TW/index.html, help/zh_TW/menu.xml, help/zh_TW/readme.html, help/zh_TW/style.css, src/icons/help, src/icons/help/.directory, src/icons/help/document-print.png, src/icons/help/exit.png, src/icons/help/go-bottom.png, src/icons/help/go-down.png, src/icons/help/go-first.png, src/icons/help/go-home.png, src/icons/help/go-last.png, src/icons/help/go-next.png, src/icons/help/go-previous.png, src/icons/help/go-top.png, src/icons/help/go-up.png, src/icons/help/help-browser.png: Added - first batch of changes to a more structured help system (2 - missing files) 2009-02-20 17:16 oeildepierre * CMakeLists.txt, help/CMakeLists.txt, help/en, help/fi, help/fr, help/hi, help/nb, help/no, help/ru, help/sr, help/sv, help/uk, help/zh_CN, help/zh_TW, src/CMakeLists.txt, src/application.qrc, src/fmbrowser.cpp, src/fmbrowser.h, src/fmfontdb.h, src/fmotf.h, src/fmpaths.cpp, src/fmpaths.h, src/fmpython_w.cpp, src/fmpython_w.h, src/fmsharestruct.cpp, src/fmsharestruct.h, src/fontitem.h, src/helpbrowser.cpp, src/helpbrowser.h, src/helpbrowser.ui, src/schelptreemodel.cpp, src/schelptreemodel.h, src/sctextbrowser.cpp, src/sctextbrowser.h, src/treeitem.cpp, src/treeitem.h, src/treemodel.cpp, src/treemodel.h, src/typotek.cpp, src/typotek.h: Added - first batch of changes to a more structured help system 2009-02-20 13:31 prokoudine * src/CMakeLists.txt: patched optionaliness of python 2009-02-18 17:01 prokoudine * src/messages/fontmatrix-ru.ts: Can't keep myself from updating this translation. May I pass this desease to somebody please? :) 2009-02-17 23:35 oeildepierre * src/mainviewwidget.cpp: Fixed - default size of the welcome message can be localised, and set in preferences 2009-02-16 21:37 oeildepierre * src/fmpython_w.cpp, src/scriptconsole.ui: Changed - import PythonQt before user script to save hime this pain 2009-02-16 21:29 oeildepierre * src/typotek.cpp, src/typotek.h: Fixed - Python related slots not created on some platforms. Mystery 2009-02-16 16:18 oeildepierre * src/fontitem.h, src/graphic-resources/template_oneline.xml: Added - a couple methods from fontitem available in scripter Fixed - oneliner template was broken 2009-02-15 21:22 oeildepierre * src/fmpython_w.cpp, src/fmpython_w.h, src/mainviewwidget.cpp, src/mainviewwidget.h: Added - access to updateTree from scripter 2009-02-15 17:39 oeildepierre * src/fmpython_w.cpp, src/fmpython_w.h, src/fmscriptconsole.cpp, src/fmscriptconsole.h, src/scriptconsole.ui, src/typotek.cpp: Added - an over simple editor for scripts in script console input tab 2009-02-15 11:02 oeildepierre * INSTALL: Updated - installation instructions to reflect new Python integration 2009-02-15 01:57 oeildepierre * pythonqt/src/PythonQtSlot.cpp, src/typotek.cpp: Fixed - PY_WRITE_RESTRICTED not being defined in Python < 2.6 2009-02-15 01:36 oeildepierre * src/typotek.cpp: fixed - python related include was not isolated 2009-02-15 00:43 oeildepierre * src/CMakeLists.txt, src/fmpython_w.cpp, src/fmpython_w.h, src/fmscriptconsole.cpp, src/fmscriptconsole.h, src/scriptconsole.ui, src/typotek.cpp, src/typotek.h: Added - a console for the scripter 2009-02-14 20:48 oeildepierre * src/CMakeLists.txt, src/dataexport.cpp, src/fmfontdb.cpp, src/fmfontdb.h, src/fmfontstrings.h, src/fmpython_w.cpp, src/fmpython_w.h, src/fmrepair.cpp, src/fmsharestruct.h, src/fontitem.cpp, src/fontitem.h, src/tagswidget.cpp: Added - FontItem and the database wrapper are available in scripter 2009-02-14 10:38 oeildepierre * CMakeLists.txt, pythonqt, pythonqt/src, pythonqt/src/CMakeLists.txt, pythonqt/src/PythonQt.cpp, pythonqt/src/PythonQt.h, pythonqt/src/PythonQtClassInfo.cpp, pythonqt/src/PythonQtClassInfo.h, pythonqt/src/PythonQtConversion.cpp, pythonqt/src/PythonQtConversion.h, pythonqt/src/PythonQtCppWrapperFactory.h, pythonqt/src/PythonQtDoc.h, pythonqt/src/PythonQtImportFileInterface.h, pythonqt/src/PythonQtImporter.cpp, pythonqt/src/PythonQtImporter.h, pythonqt/src/PythonQtMetaObjectWrapper.cpp, pythonqt/src/PythonQtMetaObjectWrapper.h, pythonqt/src/PythonQtMethodInfo.cpp, pythonqt/src/PythonQtMethodInfo.h, pythonqt/src/PythonQtMisc.cpp, pythonqt/src/PythonQtMisc.h, pythonqt/src/PythonQtObjectPtr.cpp, pythonqt/src/PythonQtObjectPtr.h, pythonqt/src/PythonQtSignalReceiver.cpp, pythonqt/src/PythonQtSignalReceiver.h, pythonqt/src/PythonQtSlot.cpp, pythonqt/src/PythonQtSlot.h, pythonqt/src/PythonQtStdDecorators.cpp, pythonqt/src/PythonQtStdDecorators.h, pythonqt/src/PythonQtStdOut.cpp, pythonqt/src/PythonQtStdOut.h, pythonqt/src/PythonQtSystem.h, pythonqt/src/PythonQtVariantWrapper.cpp, pythonqt/src/PythonQtVariantWrapper.h, pythonqt/src/PythonQtVariants.cpp, pythonqt/src/PythonQtVariants.h, pythonqt/src/PythonQtWrapper.cpp, pythonqt/src/PythonQtWrapper.h, pythonqt/src/gui, pythonqt/src/gui/PythonQtScriptingConsole.cpp, pythonqt/src/gui/PythonQtScriptingConsole.h, pythonqt/src/wrapper, pythonqt/src/wrapper/PythonQtWrappedVariants.h, src/CMakeLists.txt, src/fmpython_w.cpp, src/fmpython_w.h, src/typotek.cpp, src/typotek.h: Added - first bits of python support through pythonqt project (included in source tree as it’s not widely distributed) 2009-02-10 12:44 prokoudine * src/messages/fontmatrix-ru.ts: updated Russian translation 2009-01-28 17:28 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp: Simplified welcome message (get rid of resource html files, with the idea to get them as home page of help browser) 2009-01-28 11:27 oeildepierre * harfbuzz/AUTHORS, harfbuzz/COPYING, harfbuzz/README, harfbuzz/src/CMakeLists.txt, harfbuzz/src/Makefile.am, harfbuzz/src/harfbuzz-arabic.c, harfbuzz/src/harfbuzz-buffer-private.h, harfbuzz/src/harfbuzz-buffer.c, harfbuzz/src/harfbuzz-buffer.h, harfbuzz/src/harfbuzz-dump-main.c, harfbuzz/src/harfbuzz-dump.c, harfbuzz/src/harfbuzz-dump.h, harfbuzz/src/harfbuzz-external.h, harfbuzz/src/harfbuzz-gdef-private.h, harfbuzz/src/harfbuzz-gdef.c, harfbuzz/src/harfbuzz-gdef.h, harfbuzz/src/harfbuzz-global.h, harfbuzz/src/harfbuzz-gpos-private.h, harfbuzz/src/harfbuzz-gpos.c, harfbuzz/src/harfbuzz-gpos.h, harfbuzz/src/harfbuzz-gsub-private.h, harfbuzz/src/harfbuzz-gsub.c, harfbuzz/src/harfbuzz-gsub.h, harfbuzz/src/harfbuzz-hangul.c, harfbuzz/src/harfbuzz-hebrew.c, harfbuzz/src/harfbuzz-impl.c, harfbuzz/src/harfbuzz-impl.h, harfbuzz/src/harfbuzz-indic.cpp, harfbuzz/src/harfbuzz-khmer.c, harfbuzz/src/harfbuzz-myanmar.c, harfbuzz/src/harfbuzz-open-private.h, harfbuzz/src/harfbuzz-open.c, harfbuzz/src/harfbuzz-open.h, harfbuzz/src/harfbuzz-shape.h, harfbuzz/src/harfbuzz-shaper-all.cpp, harfbuzz/src/harfbuzz-shaper-private.h, harfbuzz/src/harfbuzz-shaper.cpp, harfbuzz/src/harfbuzz-shaper.h, harfbuzz/src/harfbuzz-stream-private.h, harfbuzz/src/harfbuzz-stream.c, harfbuzz/src/harfbuzz-stream.h, harfbuzz/src/harfbuzz-thai.c, harfbuzz/src/harfbuzz-thai.cpp, harfbuzz/src/harfbuzz-tibetan.c, harfbuzz/src/harfbuzz.c, harfbuzz/src/harfbuzz.h, src/fmotf.h, src/fmshaper.cpp, src/fmshaper.h: Updated - private copy of harfbuzz 2009-01-10 23:56 tsoots * src/main.cpp, src/typotek.cpp, src/typotek.h: When minimizing to system tray hide all windows. 2009-01-01 21:11 mrdocs * help/help_en.html: some clean ups to make the writing a bit smoother 2009-01-01 18:24 mrdocs * fontmatrix.desktop: test commit and fix a desktop-file-validate warning 2008-12-29 18:05 oeildepierre * src/mainview.ui: Fixed - added comment to "Script" message in order to help translators to do their work ;) 2008-12-27 19:41 oeildepierre * src/fontitem.cpp: Fixed - prevent a segfault when trying to display a font which is referenced in the database but not actually present on the hard drive. 2008-12-27 10:33 oeildepierre * src/fmpreviewlist.cpp, src/listsdock.ui: Fixed - removed horizontal scrollbar in preview list 2008-12-26 16:52 oeildepierre * src/mainviewwidget.cpp: Fixed - commented out some debugging code 2008-12-26 16:49 oeildepierre * src/CMakeLists.txt, src/fontitem.cpp, src/fontitem.h, src/glyphtosvghelper.cpp, src/glyphtosvghelper.h, src/graphic-resources/html-css/info.css, src/mainviewwidget.cpp, src/typotek.cpp, src/typotek.h: Changed - Name of the font in Information page is now "typed" with the face it names. It does so by means of inline SVG. 2008-12-23 15:02 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/mainviewwidget.cpp: Tried - Always display filter operators since having them hidden in a popup menu got myself confused - comments welcome. 2008-12-23 13:42 oeildepierre * src/fontitem.cpp, src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: Fixed - tags filter is now a choice in filter field menu, it makes this part of the UI tighter and it was the occasion to make tags support operations. 2008-12-11 15:23 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp: Fixed - checks if the font choosen for the welcome messages can display all chars required (though not shaped) 2008-12-11 14:46 oeildepierre * src/fmlayout.cpp: Fixed - used to crash when layouting empty glyph strings (doLines) 2008-12-11 14:27 oeildepierre * src/fmfontdb.cpp: #12687 - more about properly escape what we put in the DB 2008-12-11 13:46 oeildepierre * src/dataloader.cpp, src/fmfontdb.cpp, src/fontitem.cpp, src/listdockwidget.cpp, src/systray.cpp: bug #12687 : After initial run Fontmatrix crashes each time I try to start it 2008-12-10 13:10 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/mainviewwidget.cpp: Changed - logicals for search are now specified through a dedicated menu rather than incorporated into text to search. First consequence is that they are now available for Unicode search too. 2008-12-09 00:14 oeildepierre * src/fmdumpinfo.cpp: Improved - added support for more english_ locales acceptable for dumpinfo 2008-12-08 23:41 prokoudine * src/messages/fontmatrix-ru.ts, src/prefs_panel.ui: wording tweaks, translation update 2008-12-08 22:58 oeildepierre * src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h: Cleaned - tried to get the Preferences panel a bit less messy. 2008-12-08 21:22 prokoudine * help/help_en.html: mention 'Edit PANOSE metadata' for upcoming docs hackweekend 2008-12-08 20:07 oeildepierre * src/CMakeLists.txt, src/dumpdialog.cpp, src/dumpdialog.h, src/dumpdialog.ui, src/fmdumpinfo.cpp, src/fmdumpinfo.h, src/fontitem.cpp, src/modeltext.cpp, src/modeltext.h, src/typotek.cpp, src/typotek.h: Added - the dump info widget & classes 2008-12-08 19:17 prokoudine * src/prefs_panel.ui: fixing layout while I'm at that 2008-12-08 19:05 prokoudine * src/prefs_panel.ui: smaller font size and wider sidebar. makes RU UI not suck 2008-12-06 18:00 oeildepierre * src/mainviewwidget.cpp, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: Added - forced by the howling crowd, web browser for external links is now a preference. 2008-12-06 14:32 oeildepierre * src/fmpreviewlist.cpp, src/fmpreviewlist.h, src/listdockwidget.cpp, src/panosedialog.ui: Added - tootips in preview list (can be styled in config file). 2008-12-05 15:59 oeildepierre * src/CMakeLists.txt, src/fmfontdb.cpp, src/fmfontdb.h, src/fmfontstrings.cpp, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/panosedialog.cpp, src/panosedialog.h, src/panosedialog.ui, src/panosematch.cpp, src/typotek.cpp, src/typotek.h: Added - in-DB Panose Editor. 2008-12-05 11:50 oeildepierre * src/listsdock.ui: Fixed - (UI) made the reset filter button not expanding 2008-12-04 22:01 prokoudine * src/messages/fontmatrix-ru.ts: updated Russian translation 2008-12-04 19:55 tsoots * src/messages/welcome_fi.html: Added formatting to the fi welcome text 2008-12-04 17:49 oeildepierre * src/panosematch.cpp, src/typotek.cpp: Improved - adjustments in Panose matching, including changed the default treshold value. 2008-12-04 16:41 tsoots * src/panosematch.cpp, src/panosematch.h: Added license notification 2008-12-04 16:24 oeildepierre * src/listdockwidget.cpp, src/mainviewwidget.cpp, src/panosematch.cpp, src/panosematch.h, src/typotek.cpp, src/typotek.h: Added - introduced the UI part of the panose matching 2008-12-04 15:10 tsoots * src/CMakeLists.txt, src/panosematch.cpp, src/panosematch.h: First bits of panose based "similar to" filter 2008-12-04 14:11 oeildepierre * src/mainviewwidget.cpp, src/mainviewwidget.h, src/parallelcoor.cpp, src/parallelcoor.h, src/typotek.cpp: Added - current Panose filter is indicated in filter label, not exactly the best place. 2008-12-03 23:14 oeildepierre * src/systray.cpp: Added - assert on FontItem pointer in Systray::newTag for debugging purpose. Fixed - the ugly faked tristate check-box in systray tags menu 2008-12-03 20:44 oeildepierre * src/fmfontcompareview.cpp, src/fmglyphsview.cpp, src/fmlayoptwidget.cpp, src/fmlayoptwidget.h, src/fmotf.cpp, src/fmplayground.cpp, src/fmsampletextview.cpp, src/fontbook.cpp, src/fontcomparewidget.cpp, src/fontitem.cpp: Quiet GCC 2008-12-03 16:41 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/typotek.cpp, src/typotek.h: Added - change preview text & size in place. 2008-12-03 14:24 oeildepierre * src/CMakeLists.txt: Fixed - Generation of QM files under MacOSX 2008-12-03 13:47 oeildepierre * src/CMakeLists.txt, src/fmpaths.cpp: Fixed - QM directory was not correctly set nor QM files copied in this non-existing dir on MacOSX 2008-12-03 12:22 oeildepierre * src/typotek.cpp: Fixed - directory settings for MacOSX 2008-12-03 10:26 oeildepierre * src/fmactivate.cpp: Fixed - there was a missing definition which was masked because in an #ifdef APPLE block 2008-12-01 22:37 oeildepierre * src/QHexView.h, src/fmactivate.cpp, src/fmpreviewlist.cpp, src/typotek.cpp: Applied - patches by jghali regarding Windows related stuff 2008-12-01 13:40 oeildepierre * src/main.cpp, src/mainviewwidget.cpp, src/mainviewwidget.h, src/messages/fontmatrix-fr.ts, src/typotek.cpp, src/typotek.h: bug #12232 : RFE: Check symbolic links bug #12361 : Show total number of activated font faces 2008-11-29 23:19 tsoots * src/prefspaneldialog.cpp: Dirty fix to the shortcut dblclicking issue. Double clicking option removed. 2008-11-28 12:22 oeildepierre * src/parallelcoor.cpp, src/parallelcoor.h: Improved - made the classification view refreshing quicker 2008-11-27 16:16 oeildepierre * src/parallelcoor.cpp, src/parallelcoor.h: Fixed - prevent the Classification widget to update when not visible 2008-11-27 16:01 oeildepierre * src/comparewidget.ui, src/fmfontcompareview.cpp, src/fmfontcompareview.h, src/fontcomparewidget.cpp, src/fontcomparewidget.h: Added - possibility to offset a glyph in compare view 2008-11-27 14:04 oeildepierre * src/fmrepair.cpp: Fixed - system fonts were listed in check DB dialog. 2008-11-27 13:51 oeildepierre * src/fmfontdb.cpp, src/fmfontdb.h, src/fontitem.cpp, src/typotek.cpp: Fixed - prevent tags to be inserted twice in the db 2008-11-27 11:06 oeildepierre * src/mainviewwidget.cpp: Restored - display selected tag in filter label 2008-11-27 10:10 oeildepierre * src/fmfontcompareview.cpp, src/fmfontcompareview.h: Added - display advance value when metrics is activated in compare view 2008-11-26 12:38 oeildepierre * src/comparewidget.ui, src/fmfontcompareview.cpp, src/fmfontcompareview.h, src/fontcomparewidget.cpp, src/fontcomparewidget.h: Improved - usability of the compare widget Fixed - metrics in compare widget were not scaled 2008-11-25 22:51 oeildepierre * src/fmfontcompareview.cpp, src/fontcomparewidget.cpp: Fixed - compareCharBox was not correctly filed Fixed - compareCharSelect (slider) and compareCharBox were not synced 2008-11-25 20:27 oeildepierre * src/comparewidget.ui, src/fontcomparewidget.cpp, src/fontcomparewidget.h: Added - a combobox to test if it’s better input than the slider in compare widget 2008-11-25 16:13 oeildepierre * src/listdockwidget.cpp, src/mainviewwidget.cpp, src/typotek.cpp: Fixed - a couple of preferences items was not in the good place 2008-11-25 15:30 oeildepierre * src/fmfontcompareview.cpp, src/fontcomparewidget.cpp: Hide code that dumps compare view into a PNG when current character changes. 2008-11-25 12:53 oeildepierre * src/comparewidget.ui, src/fmfontcompareview.cpp, src/fmfontcompareview.h, src/fmfontdb.cpp, src/fontcomparewidget.cpp, src/fontcomparewidget.h, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp: Improved - visual aspect of compare widget Added - sync/unsync selection of character in compare widget 2008-11-25 10:02 oeildepierre * src/fmfontcompareview.cpp, src/fmfontcompareview.h, src/fontcomparewidget.cpp, src/fontcomparewidget.h, src/mainviewwidget.cpp: Added - show metrics in compare widget Fixed - compare view behaves as other views regarding zoom & pan 2008-11-25 00:39 prokoudine * help/help_en.html, help/help_ru.html, src/messages/fontmatrix-ru.ts: I will keep adding chapters until it really freaks the hell out of somebody and this poor sod ports Scribus' help browser to Fontmatrix :-) 2008-11-25 00:02 oeildepierre * src/fontcomparewidget.cpp: Fixed - segfault when removing last font of compare widget 2008-11-24 23:54 oeildepierre * src/comparewidget.ui, src/fmfontcompareview.cpp, src/fmfontcompareview.h, src/fontcomparewidget.cpp, src/fontcomparewidget.h: Added - display control points in compare glyphs widget Fixed - bad first displayed glyph when a font was added to compare glyphs widget 2008-11-24 22:04 prokoudine * src/messages/fontmatrix-ru.ts, src/typotek.cpp: Deary deary me, Pierre has committed a new feature again and introduced a typo. What do I do now? Fix it! Translate it! :-) 2008-11-24 20:12 oeildepierre * src/fmfontcompareview.cpp, src/fontcomparewidget.cpp, src/typotek.cpp, src/typotek.h: Changed - Add action in compare glyphs now picks up the selected font. 2008-11-24 17:34 oeildepierre * src/CMakeLists.txt, src/comparewidget.ui, src/fmfontcompareview.cpp, src/fmfontcompareview.h, src/fontcomparewidget.cpp, src/fontcomparewidget.h, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp: Added - first bits of the compare glyphs widget. 2008-11-23 17:32 oeildepierre * src/mainviewwidget.cpp: Fixed - no-return-in-nonvoid-function /usr/src/packages/BUILD/fontmatrix-0.4.99svn/src/mainviewwidget.cpp:2101 2008-11-23 15:27 oeildepierre * src/dataexport.cpp, src/fmfontdb.cpp, src/fmfontdb.h, src/fmshaper_own.cpp, src/pangoshaper.cpp: Fixed - a couple of GCC warnings in, mostly, unused code 2008-11-22 23:38 oeildepierre * src/fmactivate.cpp, src/fmactivate.h, src/fmfontdb.cpp, src/fmrepair.cpp, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/tagswidget.cpp, src/typotek.cpp, src/typotek.h: Added - support of system fonts (linux + fontconfig) 2008-11-22 10:21 oeildepierre * src/main.cpp, src/mainviewwidget.cpp, src/parallelcoor.cpp, src/parallelcoor.h, src/prefspaneldialog.cpp, src/shortcuts.cpp, src/systray.cpp, src/typotek.cpp, src/typotek.h: Added - colors of the Panose graphic can be set in preferences file (~/.config/Undertype/fontmatrix.conf for Linux) Changed - ordered settings into categories in pref. file. Yes, it means that you’d better delete your pref. file first and run fontmatrix to let hime regenerate the file. 2008-11-20 23:02 prokoudine * help/help_en.html, help/help_ru.html: small fixes 2008-11-20 21:51 prokoudine * help/help_en.html, src/messages/fontmatrix-ru.ts, src/tagswidget.cpp: - fixed a typo - fixed errors in help file (content to follow) - updated Russian translation 2008-11-20 17:26 oeildepierre * src/listsdock.ui, src/typotek.cpp, src/typotek.h: Added - a view menu 2008-11-20 16:48 oeildepierre * src/fmfontdb.cpp, src/fmfontdb.h, src/tagswidget.cpp, src/tagswidget.h: Added - remove or alter tags 2008-11-20 11:58 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/mainviewwidget.cpp, src/tagswidget.cpp, src/tagswidget.ui, src/typotek.cpp, src/typotek.h: Removed - obsololete Panose button in main dock widget Fixed - unbearable slowness of "Browse folders" Added - geometry & floatness of docked widgets (Browse & Tags) are now restored 2008-11-19 22:34 prokoudine * src/messages/fontmatrix-ru.ts: updated Russian translation 2008-11-19 17:00 oeildepierre * src/mainviewwidget.cpp: Fixed - what has to be fixed! 2008-11-19 15:24 oeildepierre * src/fontitem.cpp, src/mainviewwidget.cpp, src/parallelcoor.cpp, src/parallelcoor.h: Added - initialize a new Panose filter when selecting a font Added - remove property values from the Panose filter Added - select property values on bars of the Panose graphic 2008-11-19 00:32 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/parallelcoor.cpp: Fixed - panose field names overlapping Added - save splitter position in Classification tab 2008-11-18 17:38 oeildepierre * src/mainviewwidget.cpp, src/mainviewwidget.h, src/parallelcoor.cpp, src/parallelcoor.h: Added - Filtering in Panose actually view filters the current font list, over! 2008-11-18 15:52 oeildepierre * src/fmfontstrings.cpp, src/fmfontstrings.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/parallelcoor.cpp, src/parallelcoor.h: improved - display of the Panose graphic 2008-11-18 13:38 oeildepierre * src/fmfontstrings.cpp, src/fmfontstrings.h, src/parallelcoor.cpp, src/parallelcoor.h: Added - more bits about the new Panose widget 2008-11-17 23:26 oeildepierre * src/CMakeLists.txt, src/fmfontdb.cpp, src/fmfontdb.h, src/fmfontstrings.cpp, src/fmfontstrings.h, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/parallelcoor.cpp, src/parallelcoor.h: Added - First bits of the new Panose thing. it’s rather a backup than a commit :) Note that the DB has to be erased once again to see it in use as the old way Panose string was stored was wrong. 2008-11-10 20:58 tsoots * src/messages/fontmatrix-fi.ts: Updated Finnish translation 2008-11-06 16:53 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp: Fixed an encoding issue with Type1 fonts - now when the Unicode charmap is not actually present in the font, it’s indicated by an asterisk. Removed a couple of qdebugs 2008-11-05 01:52 prokoudine * src/messages/fontmatrix-ru.ts: yet another Russian translation update 2008-11-05 01:07 oeildepierre * src/tttablewidget.ui: Added a splitter in TableView 2008-11-05 00:57 oeildepierre * src/CMakeLists.txt, src/QHexView.cpp, src/QHexView.h, src/fontitem.cpp, src/fontitem.h, src/tttableview.cpp, src/tttableview.h, src/tttablewidget.ui: Added - QHexView widget by Evan Teran to show content of TrueType tables 2008-11-05 00:49 prokoudine * help/help_ru.html, src/messages/fontmatrix-ru.ts: updated RU translation quite a bit, made RU help's template match EN version 2008-11-04 23:46 oeildepierre * src/CMakeLists.txt, src/fmfontdb.cpp, src/fmfontstrings.cpp, src/fmfontstrings.h, src/fontitem.cpp, src/fontitem.h, src/tttableview.cpp, src/tttableview.h, src/tttablewidget.ui, src/typotek.cpp, src/typotek.h: Added - list truetype tables 2008-10-27 14:23 oeildepierre * src/fmfontdb.cpp, src/fmfontdb.h, src/fmfontstrings.cpp, src/fontitem.cpp: Refactored some code to improve performances and make it easier to understand 2008-10-23 16:15 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/fmsampletextview.cpp, src/fontbook.cpp, src/fontbookdialog.cpp, src/fontitem.cpp, src/graphic-resources/template_default.xml: Fixed a couple of memory leaks in fontbook generation. It’s now done with FMLayout. 2008-10-20 22:20 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/fontbook.cpp, src/fontitem.cpp, src/mainviewwidget.cpp: Fixed activation of entire families Fixed mem leak in font book generation code - thus broke it. 2008-10-20 22:16 oeildepierre * src/fmfontdb.cpp, src/fmfontdb.h: Added some caching in FMFontDB - might need more since sqlite is sometimes so slow 2008-09-28 18:06 oeildepierre * ChangeLog: Update changelog (and test cia.vc IRC bot) 2008-09-27 10:36 oeildepierre * src/typotek.cpp: bug #12232 : RFE: Check symbolic links 2008-09-27 10:27 oeildepierre * src/mainviewwidget.cpp, src/mainviewwidget.h: bug #12231 : different fonts order in Names and Previews 2008-09-27 09:55 oeildepierre * src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: bug #11447 : preferences / example : unable to delete 2008-09-18 20:38 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/graphic-resources/html-css/info.css, src/graphic-resources/info.css: FIXED: Characters were not interpreted when the face was not mapped with a Unicode charmap 2008-09-17 18:44 oeildepierre * src/fmactivate.cpp, src/fmactivate.h, src/fmfontdb.cpp, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/mainviewwidget.h: Clean-up activation code 2008-09-16 22:34 oeildepierre * src/fmfontdb.cpp, src/typotek.cpp: Fixed a typo which prevented to import fonts 2008-09-16 13:53 oeildepierre * src/fmfontdb.cpp, src/fmfontdb.h, src/fontitem.cpp, src/fontitem.h, src/listdockwidget.cpp, src/listsdock.ui, src/mainviewwidget.cpp, src/tagswidget.h, src/typotek.cpp, src/typotek.h: Stacked filtereing is back Fixed temporary fonts (folder view) 2008-09-16 09:43 oeildepierre * src/CMakeLists.txt, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/tagswidget.cpp, src/tagswidget.h, src/tagswidget.ui, src/typotek.cpp, src/typotek.h: Tags now has its own docked widget 2008-09-15 18:56 oeildepierre * src/fmfontdb.cpp, src/fmfontdb.h, src/fmfontstrings.cpp, src/listdockwidget.cpp, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: Search is back ! 2008-09-14 22:26 oeildepierre * src/fmfontdb.cpp, src/fmfontstrings.cpp, src/fmfontstrings.h, src/fontitem.cpp, src/fontitem.h, src/listdockwidget.cpp, src/listdockwidget.h, src/mainviewwidget.cpp, src/typotek.cpp: Numerous fixes related to the new DB backend 2008-09-13 14:51 oeildepierre * src/fmfontdb.cpp, src/fmfontdb.h, src/fontitem.cpp, src/mainviewwidget.cpp, src/typotek.cpp: Fixed slowdown at import 2008-09-13 13:12 oeildepierre * src/fmfontdb.cpp, src/fmfontdb.h, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/typotek.cpp: Tags continue to come back 2008-09-13 09:48 oeildepierre * src/CMakeLists.txt, src/dataloader.cpp, src/fmfontdb.cpp, src/fmfontdb.h, src/listdockwidget.cpp, src/mainviewwidget.cpp, src/mainviewwidget.h, src/savedata.cpp, src/systray.cpp, src/typotek.cpp, src/typotek.h: Tags are back ! 2008-09-11 15:07 oeildepierre * CMakeLists.txt, src/CMakeLists.txt, src/aboutwidget.cpp, src/dataexport.cpp, src/dataloader.cpp, src/fmfontdb.cpp, src/fmfontdb.h, src/fmfontstrings.cpp, src/fmfontstrings.h, src/fmrepair.cpp, src/fontbook.cpp, src/fontitem.cpp, src/fontitem.h, src/importtags.cpp, src/listdockwidget.cpp, src/listdockwidget.h, src/mainviewwidget.cpp, src/savedata.cpp, src/systray.cpp, src/tagseteditor.cpp, src/typotek.cpp, src/typotek.h: ADDED: first steps to an independant storage backend. Now it’s achieved through SQL drivers (default to sqlite). WARNING: a lot has been changed and it does not work pretty well. 2008-09-03 15:07 prokoudine * src/messages/fontmatrix-ru.ts: updated Russian translation 2008-09-02 22:03 oeildepierre * src/CMakeLists.txt, src/fmglyphhighlight.cpp, src/fmglyphhighlight.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: Impoved - copy to clipboard has been turned into something like a virtual keyboard 2008-09-02 10:18 oeildepierre * src/listdockwidget.h, src/mainviewwidget.cpp: Fixed - previews list was not updated in time 2008-08-11 15:58 oeildepierre * src/mainviewwidget.cpp: FIXED - fall back to sensitive Unicode block when the last selected one is not covered by the actual font 2008-08-11 15:27 prokoudine * src/messages/fontmatrix-ru.ts: updated translation 2008-07-30 09:39 oeildepierre * src/mainviewwidget.cpp, src/mainviewwidget.h: Fixed - changing font size in preview did not wait editing was finished 2008-07-29 14:18 oeildepierre * src/fmnamelist.cpp, src/fmpreviewlist.cpp, src/fmpreviewlist.h, src/listdockwidget.cpp, src/listsdock.ui, src/mainviewwidget.cpp: Added - possibility to hide tools of browse dock widget 2008-07-29 11:22 oeildepierre * src/fmpreviewlist.cpp, src/fmpreviewlist.h, src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: Changed - Preview list is now displayed in a QListView 2008-07-25 23:03 tsoots * src/main.cpp: No need to be this verbose. Removed extra qDebugs 2008-07-25 21:54 tsoots * src/main.cpp, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: FM can now be started minimized to system tray 2008-07-22 14:06 oeildepierre * src/help.ui, src/helpwidget.cpp, src/helpwidget.h: Added - url display and progress bar for help widget 2008-07-22 13:25 oeildepierre * help/help_en.html, help/help_fr.html: Cleaned - help files 2008-07-22 13:22 oeildepierre * help/CMakeLists.txt, help/help_fr.html, help/helpbase.css, help/img/fr/catalogue-fontes_fr.png, help/img/fr/editeur-collections_fr.png, help/img/fr/fontmatrix_fr.png, help/img/fr/import-fonts_fr.png, help/img/fr/preferences_fr.png, help/img/tab-left.png, help/img/tab-right.png: Cleaned - help files 2008-07-22 13:01 oeildepierre * help, help/CMakeLists.txt, help/help.html, help/help_da.html, help/help_de.html, help/help_en.html, help/help_fi.html, help/help_fr.html, help/help_hi.html, help/help_nb.html, help/help_nl.html, help/help_no.html, help/help_ru.html, help/help_sr.html, help/help_sv.html, help/help_uk.html, help/help_zh_CN.html, help/help_zh_TW.html, help/helpbase.css, help/img, help/img/da, help/img/de, help/img/en, help/img/en/fontbook_en.png, help/img/en/fontmatrix_en.png, help/img/en/import_en.png, help/img/en/preferences_en.png, help/img/en/tagset_en.png, help/img/fi, help/img/fr, help/img/fr/catalogue-fontes.png, help/img/fr/editeur-collections.png, help/img/fr/fontmatrix.png, help/img/fr/import-fonts.png, help/img/fr/preferences.png, help/img/hi, help/img/nb, help/img/nl, help/img/no, help/img/ru, help/img/sr, help/img/sv, help/img/tab-left.gif, help/img/tab-right.gif, help/img/uk, help/img/zh_CN, help/img/zh_TW, help/js, help/js/jquery.js, help/js/jquery.jtabs.pack.js: Cleaned - help files 2008-07-22 12:50 oeildepierre * CMakeLists.txt, src/fmpaths.cpp, src/fmpaths.h, src/helpwidget.cpp, src/messages/fmlocales.h, src/messages/help, src/messages/help.html, src/messages/help_da.html, src/messages/help_de.html, src/messages/help_en.html, src/messages/help_fi.html, src/messages/help_fr.html, src/messages/help_hi.html, src/messages/help_nb.html, src/messages/help_nl.html, src/messages/help_no.html, src/messages/help_ru.html, src/messages/help_sr.html, src/messages/help_sv.html, src/messages/help_uk.html, src/messages/help_zh_CN.html, src/messages/help_zh_TW.html, src/messages/lupdate.files, src/messages/update.sh: Shuffled - help files 2008-07-21 11:35 eclypse * src/graphic-resources/fontmatrix-synchro-icon.png: synchro icon 16x16 png 2008-07-21 11:34 eclypse * src/icons/application-synchro-small.svg: synchro icon svg 2008-07-21 11:15 eclypse * src/messages/help, src/messages/help/img, src/messages/help/img/da, src/messages/help/img/de, src/messages/help/img/en, src/messages/help/img/en/catalogue-fontes.png, src/messages/help/img/en/editeur-collections.png, src/messages/help/img/en/fontmatrix.png, src/messages/help/img/en/import-fonts.png, src/messages/help/img/en/preferences.png, src/messages/help/img/fi, src/messages/help/img/fr, src/messages/help/img/fr/catalogue-fontes.png, src/messages/help/img/fr/editeur-collections.png, src/messages/help/img/fr/fontmatrix.png, src/messages/help/img/fr/import-fonts.png, src/messages/help/img/fr/preferences.png, src/messages/help/img/hi, src/messages/help/img/nb, src/messages/help/img/nl, src/messages/help/img/no, src/messages/help/img/ru, src/messages/help/img/sr, src/messages/help/img/sv, src/messages/help/img/tab-left.gif, src/messages/help/img/tab-right.gif, src/messages/help/img/uk, src/messages/help/img/zh_CN, src/messages/help/img/zh_TW, src/messages/help/js, src/messages/help/js/jquery.js, src/messages/help/js/jquery.jtabs.pack.js: others ressources for help (js files + images) 2008-07-21 11:05 eclypse * src/messages/help_en.html, src/messages/help_fr.html, src/messages/welcome_en.html: english and french files for skeleton render + welcome_en.html 2008-07-20 18:56 oeildepierre * src/fontitem.cpp, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: Added - font selection for chart subtitles 2008-07-18 22:16 eclypse * src/messages/welcome_fr.html: nomsg 2008-07-17 16:56 oeildepierre * src/fmverticalbutton.cpp: Centered labels in vertical buttons 2008-07-17 12:33 prokoudine * src/messages/welcome_ru.html: Did a hackaround to XHTML code to make bullet list appear :) 2008-07-17 11:27 oeildepierre * CMakeLists.txt, src/CMakeLists.txt, src/application.qrc, src/help.ui, src/helpwidget.cpp, src/helpwidget.h, src/messages/help_da.html, src/messages/help_de.html, src/messages/help_en.html, src/messages/help_hi.html, src/messages/help_nb.html, src/messages/help_nl.html, src/messages/help_no.html, src/messages/help_ru.html, src/messages/help_sr.html, src/messages/help_sv.html, src/messages/help_zh_CN.html, src/messages/help_zh_TW.html, src/typotek.cpp, src/typotek.h: 2008-07-17 09:01 oeildepierre * src/mainviewwidget.cpp: Added - ##RESOURCES_DIR## is now an available pattern of the welcome file 2008-07-16 14:53 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h: 1) in display setting tab "Edit" button's translated caption doesn't fit the label 2) in sample text tab of preferences dialog the Apply button is right above Close button and not separated by a horizontal line or anything 2008-07-15 18:13 prokoudine * src/messages/fontmatrix-ru.ts: another Panose related update 2008-07-14 14:59 prokoudine * src/messages/fontmatrix-ru.ts: small update, mostly Panose related 2008-07-14 14:58 prokoudine * src/messages/welcome_ru.html: added RU translation 2008-07-13 09:54 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h, src/mainviewwidget.cpp, src/mainviewwidget.h, src/tagseteditor.cpp, src/tagseteditor.h, src/typotek.cpp: Fixed - bug #12010 : Répétition des collections dans le menu déroulant 2008-07-13 09:21 oeildepierre * src/helpwidget.cpp, src/helpwidget.h, src/typotek.cpp, src/typotek.h: Fixed - bug #11969 : going back to main window from help window 2008-07-11 20:35 oeildepierre * src/CMakeLists.txt: Fixed - missing keyword prevented to run ingest script 2008-07-11 20:28 oeildepierre * cmake/modules/OwnIngestOSXBundleLibraries.cmake: Tried - tweak framework paths 2008-07-11 19:32 oeildepierre * CMakeLists.txt: Tried - seems macos cmake wants absolute paths 2008-07-11 19:26 oeildepierre * src/CMakeLists.txt, src/graphic-resources/fontmatrix.icns: Added - application icon in macos format (icns) 2008-07-11 19:15 oeildepierre * src/fmpaths.cpp: Fixed - missing #include, was hidden by #ifdef statement 2008-07-11 17:56 tsoots * src/messages/fontmatrix-fi.ts: Updated Finnish translation 2008-07-11 17:22 tsoots * src/messages/about_fi.html: Minor tweak 2008-07-10 22:19 oeildepierre * cmake/modules/OwnIngestOSXBundleLibraries.cmake, src/CMakeLists.txt, src/fontbook.cpp: Added - cmake script from cmake project to get the libs in OSX bundle right 2008-07-10 12:48 oeildepierre * CMakeLists.txt, src/application.qrc, src/fontbookdialog.cpp, src/fontitem.cpp, src/graphic-resources/default_template.png, src/graphic-resources/fontbook_default.xml, src/graphic-resources/one_line_template.xml, src/graphic-resources/oneline_template.png, src/graphic-resources/template_default.png, src/graphic-resources/template_default.xml, src/graphic-resources/template_oneline.png, src/graphic-resources/template_oneline.xml: Fixed - template files were in a mess, hope it’s fixed 2008-07-09 23:50 oeildepierre * src/fontitem.cpp, src/graphic-resources/html-css/info.css: Changed - style of the information tab to fit more with what I had in mind: clear & compact. Need to be polished and made sexier though. 2008-07-09 22:08 oeildepierre * src/CMakeLists.txt, src/fontitem.cpp, src/messages/fontmatrix-fr.ts: Fixed - TS file was not updated if not a fresh check out 2008-07-09 21:43 oeildepierre * CMakeLists.txt, src/CMakeLists.txt: Updated - cmakelists to install resource files for mac and win32 2008-07-09 21:13 oeildepierre * src/fmpaths.cpp, src/fmpaths.h, src/fontbookdialog.cpp, src/main.cpp, src/mainviewwidget.cpp, src/messages/welcome_fr.html: Fixed - various issues with resources paths and encoding of Welcome message 2008-07-09 17:28 oeildepierre * CMakeLists.txt, src/CMakeLists.txt, src/fmpaths.cpp, src/fmpaths.h, src/fontbookdialog.cpp, src/main.cpp, src/mainviewwidget.cpp, src/messages/welcome_da.html, src/messages/welcome_de.html, src/messages/welcome_en.html, src/messages/welcome_fr.html, src/messages/welcome_hi.html, src/messages/welcome_nb.html, src/messages/welcome_nl.html, src/messages/welcome_no.html, src/messages/welcome_ru.html, src/messages/welcome_sr.html, src/messages/welcome_sv.html, src/messages/welcome_uk.html, src/messages/welcome_zh_CN.html, src/messages/welcome_zh_TW.html: Added - new files needed for new Resource file-based stuff, more to follow 2008-07-09 10:24 oeildepierre * src/fontitem.cpp: Fixed - Technical part of font description is no longer presented in a separate div 2008-07-08 17:08 vlada * src/graphic-resources/css-info-property.png, src/graphic-resources/css-info-propertyname.png, src/graphic-resources/css-shadow.png, src/graphic-resources/css-tech-info.png, src/graphic-resources/html-css/img/css-info-property.png, src/graphic-resources/html-css/img/css-info-propertyname.png, src/graphic-resources/html-css/img/css-shadow.png, src/graphic-resources/html-css/img/css-tech-info.png: Of course this will break css formating rules. I know Pierre will correct all of mine mistakes ;) 2008-07-08 17:06 vlada * src/graphic-resources/html-css, src/graphic-resources/html-css/img, src/graphic-resources/html-css/info.css: Reorganization of graphics. Default dir already got a bit too cluttered for my taste. 2008-07-08 12:52 vlada * src/graphic-resources/css-info-property.png, src/graphic-resources/css-info-propertyname.png, src/graphic-resources/css-shadow.png, src/graphic-resources/css-tech-info.png, src/graphic-resources/desniinfobar.png, src/graphic-resources/info.css, src/graphic-resources/leviinfobar.png, src/graphic-resources/senka.png, src/graphic-resources/techinfobar.png: RENAMED:png art (serbian->english) TWEAKED: css 2008-07-07 22:33 oeildepierre * src/fmlayout.cpp: Fixed - under certain circumtances, the text layout engine was just crashing. 2008-07-07 22:17 vlada * src/graphic-resources/desniinfobar.png, src/graphic-resources/info.css, src/graphic-resources/info.html, src/graphic-resources/leviinfobar.png, src/graphic-resources/senka.png, src/graphic-resources/techinfobar.png: First phrase of css redesign 2008-07-07 16:44 tsoots * src/messages/about_people.html: Added my homepage http://www.tsoots.fi/ and blog http://blogi.tsoots.fi/ 2008-07-07 09:04 oeildepierre * src/main.cpp, src/prefspaneldialog.cpp, src/typotek.cpp: Applied - patch from jghali correcting minor problems 2008-07-06 20:45 oeildepierre * CMakeLists.txt, src/CMakeLists.txt: Tried - getting a universal binary for OSX 2008-07-06 17:06 tsoots * src/messages/fontmatrix-fi.ts: Updated Finnish translation 2008-07-05 16:45 oeildepierre * src/CMakeLists.txt: Fixed - progname was defined after having been used 2008-07-05 13:18 oeildepierre * src/CMakeLists.txt, src/messages/fontmatrix-fr.ts: Tried - preparing an independant bundle for OSX by copying Qt frameworks and libfreetype 2008-07-05 12:41 oeildepierre * src/CMakeLists.txt: Tried - preparing an independant bundle for OSX by copying Qt frameworks and libfreetype 2008-07-05 08:34 oeildepierre * CMakeLists.txt: Fixed - check fontconfig only for Unices excluding apple 2008-07-04 23:49 oeildepierre * src/mainviewwidget.cpp, src/mainviewwidget.h, src/messages/CMakeLists.txt, src/typotek.cpp: Added - better handling of url loading 2008-07-04 21:53 oeildepierre * src/listdockwidget.cpp: Fixed - removed "any" and "not fit" of Panose combo 2008-07-04 21:23 oeildepierre * CMakeLists.txt, src/messages/fontmatrix-fr.ts: Updated - FR translation Tried - order of incantations in cmakelists 2008-07-04 14:45 prokoudine * src/messages/fontmatrix-ru.ts: first update of RU translation. more to follow 2008-07-04 13:23 oeildepierre * CMakeLists.txt, INSTALL, src/CMakeLists.txt, src/application.qrc, src/messages/CMakeLists.txt, src/typotek.cpp: Cleaned - In order to prepare .5 release, cleaned up cmakelists 2008-07-04 08:37 oeildepierre * src/mainviewwidget.cpp: Reverted - accidentatlly commented out the slotInfoFont() call 2008-07-03 11:41 oeildepierre * src/fmlayoptwidget.cpp, src/fmlayoptwidget.h, src/fmlayout.cpp, src/fmlayout.h, src/layoutoptions.ui: Added - max space compression is now available in layout options Fixed - layout options emit an update signal even when not set by mouse dragging 2008-07-03 10:20 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/fontitem.cpp, src/mainviewwidget.cpp: Fixed - when switching rendering, was hanging 2008-06-30 21:16 tsoots * src/prefspaneldialog.cpp, src/shortcuts.cpp, src/shortcuts.h: Remove & chars from the action names in the shortcut preferences 2008-06-30 15:25 oeildepierre * INSTALL: Updated - requirements for building 2008-06-30 14:14 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/hyphenate/fmhyphenator.cpp, src/hyphenate/fmhyphenator.h: Fixed - bug #11936 : Hyphenation is incorrect when there are accented characters 2008-06-30 09:26 oeildepierre * INSTALL: Updated - removed packagers hint since qDebug is off if not built with -DCMAKE_BUILD_TYPE=Debug 2008-06-30 07:42 oeildepierre * INSTALL: Updated - requirements for building 2008-06-29 22:03 oeildepierre * src/fmsampletextview.cpp: Added - a closedhand cursor when holding mid button and over a sample view : panning 2008-06-29 21:39 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/typotek.cpp, src/typotek.h: Moved - the layout progress bar is now in the status bar 2008-06-29 20:23 oeildepierre * src/fmlayout.cpp, src/fmlayout.h: Fixed - layout was left unchanged when options were altered 2008-06-27 08:45 oeildepierre * src/fontitem.cpp: Fixed - crash when attempting to show a single glyph of a PS font (was trying to load TT tables) 2008-06-25 12:43 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/fmsampletextview.cpp, src/fmsampletextview.h, src/fmsharestruct.h, src/listsdock.ui, src/mainviewwidget.cpp: Changed - layout is cached 2008-06-20 11:01 oeildepierre * src/mainview.ui: Get the tab info back as default 2008-06-19 22:44 mrdocs * src/mainview.ui: tweak to the vertical button 2008-06-19 20:54 oeildepierre * src/hyphenate/COPYING, src/hyphenate/COPYING.LGPL: Added - copying files for libhnj 2008-06-19 20:36 oeildepierre * src/fmverticalbutton.cpp, src/fmverticalbutton.h: Added - vertical button 2008-06-19 20:21 oeildepierre * src/CMakeLists.txt, src/mainview.ui, src/mainviewwidget.cpp: Changed - almost finished to make button texts full words 2008-06-19 12:09 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui: Changed - textualize buttons of listswidget 2008-06-18 15:26 oeildepierre * src/fontitem.cpp: Corrected - wrong glyph "preparation" before rasterizing 2008-06-18 13:09 oeildepierre * src/mainviewwidget.cpp: Avoid jumpin’ UI 2008-06-18 12:48 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/prefs_panel.ui: Added - hinting mode selection 2008-06-17 12:55 oeildepierre * src/fmlayout.cpp, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h: Changed - preferences according to alexandr’s mockup 2008-06-15 00:12 oeildepierre * src/fmlayout.cpp: Fixed - computing of length of glyphstring that begin by the second part of a break was wrong in distance method 2008-06-14 09:14 oeildepierre * src/listsdock.ui: Fixed - weird button size on OSX 2008-06-13 23:09 oeildepierre * src/typotek.cpp: Changed - location of the DB on MacOSX 2008-06-13 23:03 oeildepierre * src/typotek.cpp: Changed - location of the DB on MacOSX 2008-06-13 23:00 oeildepierre * src/typotek.cpp: Changed - location of the DB on MacOSX 2008-06-13 22:36 oeildepierre * src/typotek.cpp: Fixed - a path in MacOSX block 2008-06-13 22:31 oeildepierre * src/typotek.cpp: Fixed - a typo in MacOSX detection 2008-06-13 22:28 oeildepierre * src/typotek.cpp: Fixed - a typo in MacOSX detection 2008-06-13 22:12 oeildepierre * src/fmactivate.cpp, src/fmlayout.cpp: Fixed - a typo in MacOSX detection 2008-06-13 20:37 oeildepierre * src/fmlayout.cpp, src/fmlayout.h: Added - a minimum space width in TLE, so it prevents over optimisation 2008-06-13 12:11 oeildepierre * src/typotek.cpp, src/typotek.h: Fixed - print family was looking for new line character to make chunks, that does not work fine with the new text engine which is happy with long paragraphs 2008-06-13 09:54 oeildepierre * src/mainviewwidget.cpp: Fixed - wrong default transformation matrix of the absolute view 2008-06-13 09:19 oeildepierre * src/fontitem.cpp: Improved - visual of the single glyph view 2008-06-13 07:51 oeildepierre * src/fmsampletextview.cpp, src/fmsampletextview.h, src/mainviewwidget.cpp: Fixed - view was not updated 2008-06-12 22:35 oeildepierre * fontmatrix.png, src/icons/application-fontmatrix_128.png, src/icons/application-fontmatrix_16.png, src/icons/application-fontmatrix_22.png, src/icons/application-fontmatrix_32.png, src/icons/application-fontmatrix_48.png, src/icons/application-fontmatrix_64.png: Generated & installed new application icon 2008-06-12 21:22 oeildepierre * src/typotek.cpp: Changed - target the right place to put activated fonts on MacOSX 2008-06-12 20:24 oeildepierre * src/fontitem.cpp, src/listsdock.ui, src/mainview.ui, src/mainviewwidget.cpp: Moved - file path in info tab 2008-06-12 18:42 vlada * src/application.qrc, src/graphic-resources/font-playground.png, src/icons/action-copy-char-24.png, src/icons/action-copy-char.svg, src/icons/application-fontmatrix-systray-vectors.svg, src/icons/font-playground.svg, src/icons/fontmatrix-systray.png, src/mainview.ui: Icons redone, icons updated, icons added a.k.a. How-to-introduce-bugs-by-just-adding-graphic 2008-06-12 16:24 oeildepierre * src/fmactivate.cpp: Added - MacOSX management support (1/n) 2008-06-12 11:54 oeildepierre * src/fmsampletextview.cpp: Stop redrawing text sample at each show event 2008-06-12 11:22 oeildepierre * src/mainviewwidget.cpp: Fixed - view was not updated when the shaper type was changed 2008-06-12 11:11 oeildepierre * INSTALL, src/messages/CMakeLists.txt: Introduced IS_TRANSLATOR cmake option 2008-06-11 22:14 mrdocs * CMakeLists.txt, fontmatrix.1: add a basic man page for https://gna.org/bugs/?11692 2008-06-11 20:47 oeildepierre * src/mainview.ui, src/prefs_panel.ui, src/textprogression.ui, src/typotek.cpp: Tried hard to improve toolbox 2008-06-11 19:34 vlada * src/listdockwidget.cpp: Renaming "Unicode" to "Unicode character" 2008-06-11 11:57 oeildepierre * src/application.qrc, src/icons/action-copy-char-24.png, src/icons/action-copy-char.svg, src/mainview.ui: Added Icon for CTC button 2008-06-11 11:56 oeildepierre * src/messages/CMakeLists.txt, src/messages/fontmatrix-da.ts, src/messages/fontmatrix-de.ts, src/messages/fontmatrix-en.ts, src/messages/fontmatrix-fi.ts, src/messages/fontmatrix-fr.ts, src/messages/fontmatrix-hi.ts, src/messages/fontmatrix-nb.ts, src/messages/fontmatrix-nl.ts, src/messages/fontmatrix-no.ts, src/messages/fontmatrix-ru.ts, src/messages/fontmatrix-sr.ts, src/messages/fontmatrix-sv.ts, src/messages/fontmatrix-uk.ts, src/messages/fontmatrix-zh_CN.ts, src/messages/fontmatrix-zh_TW.ts: Changed CREATE into ADD for cmake TS macro 2008-06-11 00:10 oeildepierre * src/CMakeLists.txt, src/application.qrc: Cleaned up cmake and resource file 2008-06-10 23:54 oeildepierre * CMakeLists.txt, src/CMakeLists.txt, src/application.qrc, src/main.cpp, src/messages/CMakeLists.txt, src/messages/fmlocales.h, src/messages/fontmatrix-da.ts, src/messages/fontmatrix-de.ts, src/messages/fontmatrix-en.ts, src/messages/fontmatrix-fi.ts, src/messages/fontmatrix-fr.ts, src/messages/fontmatrix-hi.ts, src/messages/fontmatrix-nb.ts, src/messages/fontmatrix-nl.ts, src/messages/fontmatrix-no.ts, src/messages/fontmatrix-ru.ts, src/messages/fontmatrix-sr.ts, src/messages/fontmatrix-sv.ts, src/messages/fontmatrix-uk.ts, src/messages/fontmatrix-zh_CN.ts, src/messages/fontmatrix-zh_TW.ts: Switched TS files to cmake management 2008-06-10 23:52 oeildepierre * src/messages/fontmatrix_da.qm, src/messages/fontmatrix_da.ts, src/messages/fontmatrix_de.qm, src/messages/fontmatrix_de.ts, src/messages/fontmatrix_en.qm, src/messages/fontmatrix_en.ts, src/messages/fontmatrix_fi.qm, src/messages/fontmatrix_fi.ts, src/messages/fontmatrix_fr.qm, src/messages/fontmatrix_fr.ts, src/messages/fontmatrix_hi.qm, src/messages/fontmatrix_hi.ts, src/messages/fontmatrix_nb.qm, src/messages/fontmatrix_nb.ts, src/messages/fontmatrix_nl.qm, src/messages/fontmatrix_nl.ts, src/messages/fontmatrix_no.qm, src/messages/fontmatrix_no.ts, src/messages/fontmatrix_ru.qm, src/messages/fontmatrix_ru.ts, src/messages/fontmatrix_sr.qm, src/messages/fontmatrix_sr.ts, src/messages/fontmatrix_sv.qm, src/messages/fontmatrix_sv.ts, src/messages/fontmatrix_uk.qm, src/messages/fontmatrix_uk.ts, src/messages/fontmatrix_zh_CN.qm, src/messages/fontmatrix_zh_CN.ts, src/messages/fontmatrix_zh_TW.qm, src/messages/fontmatrix_zh_TW.ts: Removed QM files 2008-06-10 19:10 tsoots * src/CMakeLists.txt: qm files are now generated from the ts files during the build 2008-06-10 13:29 oeildepierre * src/fmsampletextview.cpp, src/listsdock.ui, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: Reduced or removed margins, made the toolbox behaves the same as in digikam 2008-06-09 21:09 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: Improved settings panel 2008-06-09 16:23 oeildepierre * src/fmsampletextview.cpp, src/fontitem.cpp, src/graphic-resources/info.css, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: Improved UI 2008-06-08 18:16 tsoots * src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp: Added hyphenator to preferences 2008-06-08 12:12 oeildepierre * src/dataloader.cpp, src/mainview.ui: re-Fixed bug #11468 : Empty sample created 2008-06-07 08:37 oeildepierre * src/dataexport.cpp, src/dataloader.cpp, src/dataloader.h, src/savedata.cpp, src/typotek.cpp: Increment database format version and filter loading accordingly 2008-06-07 08:15 ale * src/fontitem.cpp: fixed url detection for IM Fell English (https://gna.org/bugs/?11667) 2008-06-06 14:15 oeildepierre * CMakeLists.txt, src/mainview.ui, src/mainviewwidget.cpp: Cleaned CmakeLists to have opengl optional and missing qtwebkit detected at configuration time 2008-06-06 13:44 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: Changed tab widget into a button based system for samples page 2008-06-05 22:26 oeildepierre * src/fmlayout.cpp: Better default values for text engine options 2008-06-05 16:22 oeildepierre * src/fmlayout.cpp: Removed debug frame from sample views 2008-06-05 16:13 oeildepierre * CMakeLists.txt, src/mainviewwidget.cpp: Switched to new text engine 2008-06-05 16:05 oeildepierre * src/fmlayout.cpp: Fixed text progressions in new text layout engine 2008-06-05 10:20 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp: Fixed wrong displayed font size in absolute view 2008-06-05 09:48 oeildepierre * src/fontitem.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp, src/typotek.h: Fixed bug #11091 : set default OPENTYPE GSUB/GPOS tables 2008-06-04 19:38 oeildepierre * CMakeLists.txt, src/mainviewwidget.cpp: Added: give a try to openGL (tm) if samples are available 2008-06-04 18:58 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/typotek.cpp, src/typotek.h: Fixed sample was not printed if active view was absolute 2008-06-04 14:06 oeildepierre * src/prefspaneldialog.cpp: Fixed bug #11781 : Crash: Adding Sample text without naming it first leads to crash 2008-06-04 13:43 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/listdockwidget.cpp, src/mainviewwidget.cpp, src/typotek.cpp: Fixed bug #11791 : Browse fonts by presence of unicode character range 2008-06-04 11:58 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/fontbook.cpp, src/hyphenate/fmhyphenator.h, src/mainviewwidget.cpp, src/typotek.cpp: Fixed wrong device dependant display 2008-06-03 19:45 ale * src/listdockwidget.cpp, src/listdockwidget.h: reload file and folder list in the folder tab 2008-06-03 17:49 ale * src/fontitem.cpp: url && regex: bug with punctuation at the end of the line 2008-06-03 09:58 oeildepierre * src/fmlayout.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/textprogression.cpp, src/textprogression.h, src/typotek.cpp: Added support for various text progressions in new engine 2008-06-03 08:11 oeildepierre * src/fmlayoptwidget.cpp, src/hyphenate/fmhyphenator.cpp, src/hyphenate/fmhyphenator.h, src/typotek.cpp: Added a loadDict method to Hyphenator 2008-06-03 07:56 oeildepierre * src/fmlayoptwidget.cpp, src/fmlayoptwidget.h, src/layoutoptions.ui: Improved layout options widget 2008-06-02 20:19 oeildepierre * src/fmlayoptwidget.cpp, src/fmlayoptwidget.h, src/layoutoptions.ui: Added layout options widegt files 2008-06-02 16:50 oeildepierre * src/CMakeLists.txt, src/fmlayout.cpp, src/fmlayout.h, src/typotek.cpp, src/typotek.h: Added a specialized widget to tune the text layout engine 2008-06-01 22:49 oeildepierre * src/fmlayout.cpp: Reset the text scene at very last moment 2008-06-01 22:43 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/fontitem.cpp, src/mainviewwidget.cpp: Improved layout thread management 2008-06-01 20:47 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/mainviewwidget.cpp, src/mainviewwidget.h: Moved layout process in a separated thread (2/n) - thread interruption 2008-06-01 16:44 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/fontitem.h: Moved layout process in a separated thread (1/n) 2008-06-01 14:08 ale * src/fontitem.cpp, src/fontitem.h: fixed the regexp for url detection 2008-06-01 10:14 oeildepierre * src/fmlayout.cpp, src/fmlayout.h: Improved cut-tree 2008-05-31 18:54 oeildepierre * src/fmlayout.cpp: Fixed second part of hyphenation not loaded in "= =" line 2008-05-31 10:32 oeildepierre * src/fmlayout.cpp, src/hyphenate/fmhyphenator.cpp: Worked on non-standard hyphenation 2008-05-31 09:38 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/fontitem.cpp, src/hyphenate/fmhyphenator.cpp: Fixed hyphenator returned lower cased strings Improved performance in Layout by caching distances 2008-05-30 21:12 oeildepierre * src/fmlayout.cpp, src/fmotf.cpp, src/fmotf.h, src/fontitem.cpp, src/hyphenate/fmhyphenator.cpp: Fixed second part of hyphenation pair was not applied 2008-05-30 19:17 oeildepierre * src/icushaper.cpp: Fixed ICUshaper did not put the chararcter into the good field 2008-05-30 18:27 oeildepierre * src/fmlayout.cpp, src/fmotf.cpp, src/fontitem.cpp, src/icushaper.cpp, src/m17nshaper.cpp: Fixed ICUshaper did not put the chararcter into the good field 2008-05-30 15:44 oeildepierre * src/fmlayout.cpp: Cut tree if OUT_OF_RECT 2008-05-30 15:14 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/fontitem.cpp: Fixed crash when no hyphenator has been instanciated 2008-05-30 13:48 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/fmotf.cpp, src/fontitem.cpp, src/hyphenate/fmhyphenator.cpp, src/langs/dodict.cpp: Added hyphenate (3/n) 2008-05-30 07:48 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/fontitem.cpp, src/hyphenate/AUTHORS, src/hyphenate/CMakeLists.txt, src/hyphenate/fmhyphenator.cpp, src/hyphenate/fmhyphenator.h, src/hyphenate/hnjalloc.c, src/hyphenate/hnjalloc.h, src/hyphenate/hyphen.c, src/hyphenate/hyphen.h: Added hyphenate (2/n) 2008-05-30 06:34 oeildepierre * CMakeLists.txt, src/CMakeLists.txt, src/fmlayout.cpp, src/fmlayout.h, src/fmsharestruct.h, src/fontitem.cpp, src/hyphenate, src/typotek.cpp, src/typotek.h: Added hyphenate (1/n) 2008-05-28 22:21 oeildepierre * src/fmlayout.cpp: Minor adjustments in TLE 2008-05-28 22:16 oeildepierre * src/fmlayout.cpp: Minor adjustments in TLE 2008-05-28 18:52 oeildepierre * src/fmlayout.cpp: Minor adjustments in TLE 2008-05-28 15:10 oeildepierre * src/CMakeLists.txt, src/fmlayout.cpp, src/fmlayout.h, src/mainviewwidget.cpp, src/typotek.cpp: Added qactions to change TLE parameters 2008-05-28 11:58 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/fontitem.cpp: Fixed a memory leak in Fontitem::glyphs() 2008-05-28 08:42 oeildepierre * src/fmlayout.cpp, src/mainviewwidget.cpp: Improved performance of TLE 2008-05-27 22:51 oeildepierre * src/fmlayout.cpp, src/fmlayout.h: Rewrote a part of the new text engine, could not get rid of performance issue yet! 2008-05-27 21:55 oeildepierre * src/fmlayout.cpp: Played with the new text layout engine 2008-05-27 16:41 oeildepierre * src/fmlayout.cpp, src/fmlayout.h, src/mainviewwidget.cpp, src/mainviewwidget.h: Played with the new text layout engine 2008-05-27 12:48 oeildepierre * CMakeLists.txt, src/fmlayout.cpp, src/fmlayout.h, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp: First quasi functional new layout system (need -DNEWTEXT) 2008-05-27 07:06 oeildepierre * src/CMakeLists.txt, src/fmlayout.cpp, src/fmlayout.h, src/fmotf.cpp, src/fmotf.h, src/fmsharestruct.h, src/fontitem.cpp, src/fontitem.h, src/m17nshaper.cpp: Added new files for new and separated text engine 2008-05-23 20:21 oeildepierre * src/fontitem.cpp, src/icushaper.cpp: Improved sample output (shaped) 2008-05-23 19:37 oeildepierre * src/fontitem.cpp: Improved sample output (featured) 2008-05-23 19:00 oeildepierre * src/fontitem.cpp: Improved sample output 2008-05-23 15:33 oeildepierre * src/fmshaper.cpp, src/fontitem.cpp, src/icushaper.cpp, src/icushaper.h: Made ICU shaper working 2008-05-23 08:29 oeildepierre * src/fontitem.cpp, src/mainview.ui, src/mainviewwidget.cpp: Added "copy character to clipboard" 2008-05-23 07:17 oeildepierre * src/dataexport.cpp, src/dataexport.h, src/fmotf.cpp, src/fontitem.cpp, src/importedfonts.ui, src/importtags.ui, src/listsdock.ui, src/mainview.ui, src/mainviewwidget.cpp, src/prefs_panel.ui, src/textprogression.ui: Prevent playground sample combo to be oversized by long sample lines Quiet warnings about severals "gridLayout" 2008-05-22 14:45 oeildepierre * src/fmotf.cpp, src/fmshaper.cpp, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/typotek.cpp: A bit of justification :) 2008-05-21 21:53 oeildepierre * CMakeLists.txt, cmake/modules/FindM17N.cmake: Really fixed bug #11708 : New compilation problem 2008-05-21 21:28 oeildepierre * CMakeLists.txt, INSTALL, harfbuzz/src/CMakeLists.txt, src/CMakeLists.txt, src/fmbaseshaper.cpp, src/fmbaseshaper.h, src/fmotf.h, src/fontitem.cpp, src/harfbuzzqtshaper.cpp, src/harfbuzzqtshaper.h, src/icushaper.cpp, src/m17nshaper.cpp, src/mainviewwidget.cpp, src/pangoshaper.cpp, src/pangoshaper.h: Fixed bug #11708 : New compilation problem See INSTALL file for shapers support 2008-05-20 10:35 oeildepierre * src/fmotf.cpp, src/fmotf.h, src/icushaper.cpp, src/m17nshaper.cpp, src/m17nshaper.h: m17n shaping implementation, it crashes here. 2008-05-19 22:52 oeildepierre * CMakeLists.txt, cmake/modules/FindM17N.cmake, src/CMakeLists.txt, src/fmbaseshaper.cpp, src/icushaper.cpp, src/m17nshaper.cpp, src/m17nshaper.h: Prepared field for m17n shaper 2008-05-19 16:53 oeildepierre * cmake/modules/FindICU.cmake, src/fmbaseshaper.cpp: Activated ICU 2008-05-19 16:49 oeildepierre * CMakeLists.txt, src/CMakeLists.txt, src/fmbaseshaper.cpp, src/fmbaseshaper.h, src/fmotf.cpp, src/fmotf.h, src/fontitem.cpp, src/icushaper.cpp, src/icushaper.h: ICU shaper 2008-05-19 15:04 oeildepierre * cmake/modules/FREETYPEConfig.cmake: Use built-in cmake Freetype detection 2008-05-19 10:12 oeildepierre * harfbuzz/src/CMakeLists.txt, src/CMakeLists.txt, src/fmbaseshaper.cpp, src/fmbaseshaper.h, src/fmotf.cpp, src/fmotf.h, src/fmshaper.cpp, src/fmshaper.h, src/fmshaper_own.cpp, src/fmshaper_own.h, src/fontitem.cpp, src/fontitem.h, src/fontmatrixshaper.cpp, src/fontmatrixshaper.h, src/harfbuzzqtshaper.cpp, src/harfbuzzqtshaper.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: New strategy pattern based shaping infrastructure 2008-05-19 08:03 mrdocs * TODO: test commit 2008-05-19 07:39 tsoots * src/fmnamelist.cpp: Testing 2008-05-17 12:07 oeildepierre * CMakeLists.txt: Increased required cmake minor version to 6 (cmake 2.6.0) 2008-05-17 12:01 oeildepierre * CMakeLists.txt, src/CMakeLists.txt: Now use the cmake built-in FindFreetype.cmake introduced -DSHOW_LIBS=1 cmake option 2008-05-17 07:35 tsoots * src/fmnamelist.cpp: Make next family/face work even if there's no existing selection 2008-05-16 21:05 tsoots * src/typotek.cpp: Oops! Face sounds more professional. 2008-05-16 21:03 tsoots * src/fmnamelist.cpp, src/fmnamelist.h, src/typotek.cpp: Added browse menu. Browse actions will need some more tweaking but the basic implementation is in now. 2008-05-16 12:17 oeildepierre * src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.h: a bit of cleaning and the splachscreen checkbox in preferences 2008-05-16 11:18 oeildepierre * src/mainview.ui, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h: Added an entry for preferred name scheme Re-designed sample text preference tab 2008-05-15 20:42 oeildepierre * CMakeLists.txt, src/graphic-resources/info.css, src/mainviewwidget.cpp: Improved WebKit support 2008-05-15 15:45 tsoots * src/CMakeLists.txt: added QT_QT_INCLUDE_DIR 2008-05-15 14:47 prokoudine * src/messages/fontmatrix_ru.qm, src/messages/fontmatrix_ru.ts: updated translation into Russian 2008-05-15 13:47 oeildepierre * src/fontitem.cpp, src/graphic-resources/info.css, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp, src/typotek.h: Improved WebKit support 2008-05-15 12:38 oeildepierre * CMakeLists.txt, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/prefs_panel.ui, src/typotek.cpp: Added WebKit support for the Information panel. 2008-05-15 01:50 tsoots * src/fmnamelist.cpp, src/fmnamelist.h, src/mainviewwidget.cpp, src/typotek.cpp, src/typotek.h: Beginnings of the Browse menu (next/previous family/font) 2008-05-14 14:40 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/typotek.cpp, src/typotek.h: Added SFNT family name scheme 2008-05-14 04:52 tsoots * src/prefspaneldialog.cpp: Use ascending sorting by default 2008-05-13 20:25 tsoots * src/prefspaneldialog.cpp: Some more shortcuts tweaking 2008-05-13 20:10 tsoots * src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/shortcuts.cpp, src/shortcuts.h, src/typotek.cpp: Some more work with shortcuts (it works now but still needs some tweaking) 2008-05-13 18:30 tsoots * src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/shortcuts.cpp, src/shortcuts.h, src/typotek.cpp: Some more work on shortcuts (will work soon) 2008-05-12 19:03 tsoots * src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/shortcuts.cpp, src/shortcuts.h, src/typotek.cpp: Some more work on the keyboard shortucts (still doesn't work) 2008-05-11 22:07 tsoots * src/CMakeLists.txt, src/prefs_panel.ui, src/shortcuts.cpp, src/shortcuts.h: Beginnings of shortcut handling (does not work yet). 2008-05-08 10:13 oeildepierre * src/fontitem.cpp: Severe performance improvement 2008-05-07 22:08 oeildepierre * src/savedata.cpp: Panose was not correctly saved in most cases 2008-05-07 21:43 oeildepierre * src/dataloader.cpp, src/fontitem.cpp, src/fontitem.h, src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/mainviewwidget.cpp, src/savedata.cpp, src/typotek.cpp: Added Panose support - Database file format is changed - 2008-05-06 10:50 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h: contextual menu in Folders view was mispositionned "all fields" completer now gathers all completed strings 2008-05-06 01:21 tsoots * src/listdockwidget.cpp, src/listdockwidget.h, src/typotek.cpp: Fixed the File>import which i had broked with the open() stuff. 2008-05-06 00:49 tsoots * src/messages/fontmatrix_fi.qm, src/messages/fontmatrix_fi.ts: Yet another update to the Finnish translation 2008-05-06 00:13 tsoots * src/listdockwidget.cpp, src/listdockwidget.h: Folder view now defaults to user home dir or the last used directory. 2008-05-05 23:03 tsoots * src/application.qrc, src/messages/about_fi.html, src/messages/about_people.html: Added Finnish about text and extended the self description. 2008-05-05 22:44 tsoots * src/application.qrc, src/messages/help_fi.html, src/messages/welcome_fi.html: Added Finnish welcome text and beginnings of the finnish help doc. 2008-05-05 22:00 tsoots * src/messages/fontmatrix_fi.qm, src/messages/fontmatrix_fi.ts: Updated Finnish translation 2008-05-05 21:54 tsoots * src/typotek.cpp: Only show progress bar if there are more than one font to be imported. 2008-05-05 10:41 oeildepierre * src/typotek.cpp: Added negation operator in filtering ("!" prefix) 2008-05-05 09:16 oeildepierre * src/dataexport.cpp, src/fontbookdialog.cpp, src/fontbookdialog.h, src/listdockwidget.cpp, src/listdockwidget.h, src/mainviewwidget.cpp, src/systray.cpp, src/typotek.cpp, src/typotek.h: Avoid all tags to be displayed when deactivate a font. Added "all activated" to tags combo 2008-05-04 20:30 tsoots * src/importedfonts.ui, src/importedfontsdialog.cpp, src/importedfontsdialog.h, src/listdockwidget.cpp, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: Made "Imported fonts" dialog optional 2008-05-04 17:09 tsoots * src/listdockwidget.cpp, src/typotek.cpp, src/typotek.h: Finished up the work with folder view's context menu. Imported fonts are now shown to the user at the end of each import option. 2008-05-04 15:58 tsoots * src/listdockwidget.cpp: Avoid crash if there's a right click selection done and import is chosen from the context menu. 2008-05-04 09:55 prokoudine * src/messages/fontmatrix_ru.qm, src/messages/fontmatrix_ru.ts: Updated translation into Russian 2008-05-03 17:59 tsoots * src/listdockwidget.cpp, src/listdockwidget.h, src/typotek.cpp: Added context menu to the folder view and made typotek::open() import single font files. 2008-05-03 15:57 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h: Initiated completer thing for the filter string 2008-05-03 14:45 oeildepierre * CMakeLists.txt, src/fontitem.cpp, src/fontitem.h, src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/mainview.ui, src/mainviewwidget.cpp, src/typotek.cpp: Added field selection for the plain text search 2008-05-03 06:38 tsoots * src/fontitem.cpp: Added tr() for "Category" 2008-05-02 11:02 oeildepierre * src/application.qrc, src/icons/action-empty-128.png, src/icons/action-empty.svg, src/listdockwidget.cpp, src/listsdock.ui, src/mainviewwidget.cpp: A bit of UI simplification 2008-05-01 20:44 oeildepierre * src/typotek.cpp: Avoid a segfault when a temporary font is imported then manipulated 2008-05-01 20:29 oeildepierre * src/application.qrc, src/graphic-resources/fontmatrix-tag-graphic.png, src/importtags.ui, src/typotek.cpp: Cosmetics 2008-05-01 19:31 tsoots * src/opentypetags.h: Sylistic -> Stylistic 2008-05-01 18:38 oeildepierre * src/mainviewwidget.cpp: Get rid of Qt::NoItemFlags because it’s not available for Qt version < 4.4 2008-05-01 17:10 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h, src/typotek.cpp, src/typotek.h: Added possibility to import directly from the Browse folders widget by means of Drag and Drop, certainly buggy yet 2008-05-01 13:48 oeildepierre * src/dataloader.cpp, src/dataloader.h, src/fmpreviewlist.cpp, src/fontitem.cpp, src/fontitem.h, src/savedata.cpp, src/typotek.cpp: Cleaned the database file format, expect some violent crash. 2008-05-01 13:36 tsoots * src/mainview.ui: Changed Anything selected to Nothing selected 2008-05-01 12:00 oeildepierre * src/typotek.cpp, src/typotek.h: Save/Restore docked widget area 2008-05-01 11:17 oeildepierre * src/mainviewwidget.cpp, src/typotek.cpp: Made it clear that locked fonts can’t be tagged 2008-05-01 09:52 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp, src/typotek.h: Added a "browse filesystem for fonts" feature 2008-04-30 22:23 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: Redesigned sample views 2008-04-30 21:00 oeildepierre * src/fontitem.cpp: Finally fixed the display of the sample text rendered by Freetype 2008-04-30 20:29 oeildepierre * src/fontitem.cpp: Yet another experience to fix OSX issue 2008-04-30 19:45 oeildepierre * src/dataexport.cpp, src/dataexport.h, src/fontitem.cpp: Improved raw font export (used for remote dirs) Fixed a slight segfault :) 2008-04-30 12:28 oeildepierre * src/fontitem.cpp: Make an alpha-less palette to test under OSX 2008-04-29 15:29 oeildepierre * src/fontitem.cpp, src/mainviewwidget.cpp: Added font file path tooltip in the names list 2008-04-29 13:11 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/listsdock.ui: Improved Freetype rendering (at least for Linux)(NO_HINTING) 2008-04-28 08:33 tsoots * fontmatrix.desktop: Added Finnish entries 2008-04-27 21:48 oeildepierre * src/typotek.cpp: Crumb was not rested when the current font list was empty 2008-04-27 21:41 oeildepierre * src/fmpreviewlist.cpp, src/listsdock.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: Rewrote large parts of the search engine 2008-04-26 07:42 oeildepierre * src/fmotf.cpp, src/mainview.ui: Fixed a segfault when the font has no GPOS table and you ask for it to shape your string 2008-04-26 07:41 oeildepierre * src/typotek.cpp: Prevent the welcome message to be displayed at each Show event. 2008-04-25 18:58 oeildepierre * src/fmglyphsview.cpp, src/fmglyphsview.h, src/fontitem.cpp, src/fontitem.h, src/langs/dodict.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: Update single glyph view when the window is resized 2008-04-25 11:34 oeildepierre * src/langs/deva.dict, src/langs/deva.match: Updated deva files. It does not mean they work, they’re just a bit better. 2008-04-24 21:31 oeildepierre * src/mainview.ui: treated a tooltip obsession :) 2008-04-24 16:33 oeildepierre * src/fmplayground.cpp, src/fmplayground.h, src/mainview.ui, src/mainviewwidget.cpp: Changed the input of the playground into a combobox filled by the sample texts 2008-04-24 15:05 oeildepierre * src/fontitem.cpp: Alternates presentation slight check 2008-04-24 14:48 prokoudine * fontmatrix.desktop, src/application.qrc, src/messages/fontmatrix_ru.qm, src/messages/fontmatrix_ru.ts: first (well, second,TBH) shot at Russian localization ;-) 2008-04-24 13:31 oeildepierre * src/fmotf.cpp, src/fontitem.cpp: When there was just one alternate glyph, it was not displayed. 2008-04-24 10:42 oeildepierre * src/typotek.cpp: Fulfill requirement for Russian translation 2008-04-23 17:20 oeildepierre * src/fontitem.cpp: Improved alternates presentation 2008-04-23 14:26 oeildepierre * src/fmotf.cpp, src/fmotf.h, src/fontitem.cpp, src/fontitem.h: Present all alternates glyphs in single view mode. Need to be made sexy :) 2008-04-23 07:51 oeildepierre * CMakeLists.txt, src/fontitem.cpp: Added OSX code specific to find what goes wrong there. 2008-04-22 22:00 oeildepierre * src/fontbook.cpp, src/fontitem.cpp, src/graphic-resources/fontbook_default.xml: At some point, I broke PDF fontbook export default template. Here is the fix 2008-04-20 20:22 oeildepierre * src/mainviewwidget.cpp: Fixed a crash due to theVeryFont was changed before we call "stop show this font so big!". 2008-04-20 09:40 oeildepierre * src/fontitem.cpp, src/typotek.cpp: Fixed chart printing 2008-04-20 08:57 oeildepierre * src/typotek.cpp, src/typotek.h: Cleaned system fonts directory listing 2008-04-19 23:07 oeildepierre * src/fmotf.cpp, src/fontitem.cpp, src/mainviewwidget.cpp, src/typotek.cpp, src/winutils.h: First attempt to have it functionnal under Windows(tm) platforms 2008-04-19 18:24 oeildepierre * src/fontitem.cpp: Chart printing adjustments 2008-04-19 18:13 oeildepierre * src/typotek.cpp: Chart was not printed when fit on the first page 2008-04-19 18:07 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/typotek.cpp: Added print chart implementation 2008-04-19 15:09 oeildepierre * src/fmplayground.cpp, src/fmplayground.h, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: Added print playground implementation 2008-04-19 10:24 oeildepierre * src/fontitem.cpp, src/fontitem.h: Defined some constants (GLYPH_DATA_XXX) 2008-04-18 13:14 oeildepierre * src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: Added print sample text implementation 2008-04-18 12:42 oeildepierre * src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: Added print informations implementation 2008-04-18 12:16 oeildepierre * src/typotek.cpp: Added aboutQt help entry 2008-04-18 11:59 oeildepierre * CMakeLists.txt, INSTALL, src/fontitem.cpp: Added hint for packagers 2008-04-18 10:51 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/graphic-resources/info.css, src/mainviewwidget.cpp, src/messages/welcome.html: There were problems with Font handling caused by new all-in-database system, introduced FontItem::updateItem() method. Played with Welcome message. 2008-04-18 08:56 mrdocs * src/messages/welcome.html: some minor revisions and some HTML tweaks 2008-04-18 08:17 oeildepierre * src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp, src/typotek.h: Cleaned UCOTN (ugly code of the night!) about random font in welcome message 2008-04-18 00:01 oeildepierre * src/typotek.cpp: Forgot to TR() the "welcome to fontmatrix" string 2008-04-17 23:53 oeildepierre * src/application.qrc, src/graphic-resources/welcome.png, src/icons/fontmatrix-systray.png, src/mainviewwidget.cpp, src/messages/welcome.html, src/typotek.cpp, src/typotek.h: Improved welcome message, especially offer to display "Welcome to Fontmatrix" with a random font. Text by pygmee, wait for its style 2008-04-13 23:02 oeildepierre * src/fontitem.cpp, src/typotek.cpp: Improved family printing,, should work perfectly now! 2008-04-13 22:04 oeildepierre * src/typotek.cpp: Improved family printing, though it remains not fully functionnal 2008-04-12 22:01 oeildepierre * src/CMakeLists.txt, src/fmprintdialog.cpp, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp, src/typotek.h: New architecture for printing, step one. Test print family 2008-04-10 13:44 oeildepierre * src/about.ui: Added a close button to the "about" window 2008-04-10 13:04 oeildepierre * src/dataloader.cpp, src/mainviewwidget.cpp, src/typotek.cpp, src/typotek.h: Fixed bug #11468 : Empty sample created 2008-04-10 12:21 oeildepierre * src/mainviewwidget.cpp: Fixed some details in updateTree 2008-04-10 09:50 oeildepierre * src/fontitem.cpp, src/mainviewwidget.cpp, src/mainviewwidget.h: New updateTree method. No more latency when select a font item, even with a large collection 2008-04-09 09:09 oeildepierre * src/CMakeLists.txt, src/fmactivate.cpp, src/fmactivate.h, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: Isolated activation code in FMActivate class. 2008-04-08 12:43 oeildepierre * CMakeLists.txt, src/CMakeLists.txt, src/dataloader.cpp, src/dataloader.h, src/fmplayground.cpp, src/fmprintdialog.cpp, src/fmprintdialog.h, src/fontitem.cpp, src/fontitem.h, src/multiprintdialog.ui, src/savedata.cpp, src/typotek.cpp: 0.5.0 breakage, including new database format & mechanism 2008-04-07 19:35 oeildepierre * src/fontitem.cpp: Check for valid font names 2008-04-07 14:36 oeildepierre * CMakeLists.txt, src/CMakeLists.txt, src/fmplayground.cpp, src/fmplayground.h, src/mainviewwidget.cpp: Added the regular zoom in/out & panning to the playground Made the OWN_SHAPER the default 2008-04-07 13:52 oeildepierre * src/fmpreviewlist.cpp, src/fontitem.cpp: Fixed bug #11437 : background actualization in hamburgerfonstiv window 2008-04-05 09:31 oeildepierre * src/messages/fontmatrix_da.ts, src/messages/fontmatrix_de.ts, src/messages/fontmatrix_en.ts, src/messages/fontmatrix_fi.qm, src/messages/fontmatrix_fi.ts, src/messages/fontmatrix_fr.qm, src/messages/fontmatrix_fr.ts, src/messages/fontmatrix_hi.ts, src/messages/fontmatrix_nb.ts, src/messages/fontmatrix_nl.ts, src/messages/fontmatrix_no.ts, src/messages/fontmatrix_sr.ts, src/messages/fontmatrix_sv.ts, src/messages/fontmatrix_uk.ts, src/messages/fontmatrix_zh_CN.ts, src/messages/fontmatrix_zh_TW.ts: Completed french translation and updated Finnish QM file 2008-04-05 08:59 tsoots * src/messages/fontmatrix_fi.ts: Updated Finnish translation 2008-04-05 08:10 oeildepierre * src/application.qrc, src/dataloader.cpp, src/mainviewwidget.cpp, src/typotek.cpp: Fixed the mixup of references to "default" and tr("default") Updated the resource file to activate the German translation 2008-04-05 08:08 oeildepierre * src/messages/fontmatrix_da.qm, src/messages/fontmatrix_da.ts, src/messages/fontmatrix_de.qm, src/messages/fontmatrix_de.ts, src/messages/fontmatrix_en.qm, src/messages/fontmatrix_en.ts, src/messages/fontmatrix_fi.qm, src/messages/fontmatrix_fi.ts, src/messages/fontmatrix_fr.qm, src/messages/fontmatrix_fr.ts, src/messages/fontmatrix_hi.ts, src/messages/fontmatrix_nb.qm, src/messages/fontmatrix_nb.ts, src/messages/fontmatrix_nl.qm, src/messages/fontmatrix_nl.ts, src/messages/fontmatrix_no.ts, src/messages/fontmatrix_sr.ts, src/messages/fontmatrix_sv.qm, src/messages/fontmatrix_sv.ts, src/messages/fontmatrix_uk.qm, src/messages/fontmatrix_uk.ts, src/messages/fontmatrix_zh_CN.qm, src/messages/fontmatrix_zh_CN.ts, src/messages/fontmatrix_zh_TW.ts, src/messages/lupdate.files: Updated TS files, and full German translation by Christoph 2008-04-04 21:56 mrdocs * fontmatrix.desktop: fix the desktop file for suse 2008-04-04 20:53 oeildepierre * src/listdockwidget.h, src/main.cpp, src/typotek.cpp, src/typotek.h: Fixed a problem between QThread and Ubuntu :) 2008-04-04 12:02 mrdocs * src/messages/help.html, src/messages/help_fr.html: some minor revisions and some HTML tweaks 2008-04-03 15:39 mrdocs * src/messages/help.html: some minor revisions, more to come 2008-04-03 15:11 oeildepierre * src/CMakeLists.txt, src/fmplayground.cpp, src/fmplayground.h, src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: The playground (1/n) 2008-04-03 05:20 oeildepierre * src/mainviewwidget.cpp: Linespacing was computed wrong 2008-04-02 11:59 oeildepierre * src/fontitem.cpp: Family name in info tab was not displayed anymore (commented) 2008-04-02 11:54 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/listsdock.ui, src/mainviewwidget.cpp, src/typotek.cpp: Search is now rather a filter, live & case not sensitive Very slight startup speed improvement 2008-03-31 12:35 oeildepierre * src/fontitem.cpp, src/fontitem.h: Added category label to the single glyph view 2008-03-25 08:21 oeildepierre * src/fmotf.cpp, src/mainviewwidget.cpp, src/typotek.cpp: Activation status was not loaded at startup x_advance was not adding in featured string 2008-03-22 22:36 mrdocs * src/about.ui, src/messages/about.html, src/messages/about_people.html, src/messages/help.html: start adding some more docs, tidy up Help About dialog, list Pierre first 2008-03-22 20:51 mrdocs * fontmatrix.desktop: some minor tweaks to add some missing features 2008-03-22 19:26 oeildepierre * src/fmpreviewlist.cpp: Fixed bug #11221 : different criteria for sorting name and preview list 2008-03-19 09:23 oeildepierre * src/typotek.cpp: Fixed bug #11213 : Tag filtering is not selective enough 2008-03-18 08:55 oeildepierre * src/dataexport.cpp, src/fmpreviewlist.cpp, src/fontitem.cpp, src/fontitem.h: In preview list, alternate background color based on family 2008-03-18 08:20 oeildepierre * harfbuzz/src/CMakeLists.txt, src/CMakeLists.txt: Now if FM_OWNSHAPER is passed to CMake, Harfbuzz shaper is not even compiled in the HB lib 2008-03-16 17:43 oeildepierre * src/fmotf.cpp: Fixed application of backward positionning in OTFs 2008-03-16 14:54 oeildepierre * src/fmshaper_own.cpp, src/fmshaper_own.h: Fixed ordering of features (understand get rid of QSet!) 2008-03-15 23:27 oeildepierre * src/fmotf.cpp, src/langs/deva.dict, src/langs/deva.match: Respect order of OpenType features requested in match files Updated deva files 2008-03-15 07:25 oeildepierre * src/fmotf.cpp, src/typotek.cpp: Fixed messy code in OTF own shaper support that should help a lot. 2008-03-15 05:24 oeildepierre * src/fmotf.cpp, src/fmshaper_own.cpp, src/langs/latn.dict, src/langs/latn.match: Housekeeping 2008-03-14 17:22 oeildepierre * src/fmshaper_own.cpp, src/fmshaper_own.h: Cosmetic, spaces are allowed in match files. 2008-03-14 16:26 oeildepierre * src/fmshaper_own.cpp, src/mainviewwidget.cpp: Unicode ranges combo is now regenerated if it sticks to an empty range 2008-03-12 14:16 oeildepierre * src/application.qrc, src/fmotf.cpp, src/fmotf.h, src/fmshaper_own.cpp, src/fontitem.cpp, src/langs/deva.dict, src/langs/deva.match: Ease developpement of match files You can set a ShaperDataDir in ~/.config/Undertype/fontmatrix.conf which will override the resource dir so you don’t need to rebuild to see changes in your own match file nor re-run Fontmatrix 2008-03-12 09:42 oeildepierre * src/application.qrc, src/fontitem.cpp, src/langs/dodict.cpp: dodict can import a category list from an FLT file from m17n project 2008-03-11 14:04 oeildepierre * src/mainviewwidget.cpp, src/mainviewwidget.h: Really stick to unicode range 2008-03-11 13:41 oeildepierre * src/fmshaper_own.cpp, src/fmshaper_own.h: Shaper fixes 2008-03-10 14:46 oeildepierre * CMakeLists.txt, INSTALL, src/fmotf.cpp, src/fmotf.h, src/fmshaper_own.cpp, src/fmshaper_own.h, src/fontitem.cpp, src/langs/test.match: Working test file for own shaper engine. Conditional compilation of own shaper related code 2008-03-08 09:53 oeildepierre * CMakeLists.txt, src/langs/CMakeLists.txt, src/langs/deva.dict, src/langs/dodict.cpp: dodict, to generate dictionnary skeletons suitable for FM own shaper 2008-03-08 01:28 oeildepierre * src/fmshaper_own.cpp, src/fmshaper_own.h, src/langs/test.dict, src/langs/test.match: Shaper engine improvement and first "rules" files 2008-03-07 21:03 oeildepierre * src/application.qrc, src/fmshaper_own.cpp, src/fmshaper_own.h, src/fontitem.cpp, src/langs, src/opentypetags.h: Added OpenType feature strings in translation pool 2008-03-07 14:07 oeildepierre * src/CMakeLists.txt, src/fmshaper_own.cpp, src/fmshaper_own.h: First lines of what could become Fontmatrix’s own shaper 2008-03-06 12:29 oeildepierre * CMakeLists.txt, src/fmrepair.cpp, src/fontitem.cpp: Fixed wrong listing for Deact & Linked items in Check database 2008-03-04 23:26 oeildepierre * src/main.cpp, src/messages/fontmatrix_zh_CN.qm, src/messages/fontmatrix_zh_CN.ts: Chinese TS file update 2008-03-04 19:52 oeildepierre * src/application.qrc, src/dataloader.cpp, src/messages/fontmatrix_da.ts, src/messages/fontmatrix_de.qm, src/messages/fontmatrix_de.ts, src/messages/fontmatrix_en.ts, src/messages/fontmatrix_fi.ts, src/messages/fontmatrix_fr.qm, src/messages/fontmatrix_fr.ts, src/messages/fontmatrix_hi.ts, src/messages/fontmatrix_nb.ts, src/messages/fontmatrix_nl.qm, src/messages/fontmatrix_nl.ts, src/messages/fontmatrix_no.ts, src/messages/fontmatrix_sr.ts, src/messages/fontmatrix_sv.ts, src/messages/fontmatrix_uk.qm, src/messages/fontmatrix_uk.ts, src/messages/fontmatrix_zh_CN.qm, src/messages/fontmatrix_zh_CN.ts, src/messages/fontmatrix_zh_TW.qm, src/messages/fontmatrix_zh_TW.ts, src/messages/lupdate.files: Chinese TS files 2008-03-04 16:48 mrdocs * src/messages/about.html: Tweaks for wording and layout. 2008-03-04 16:30 mrdocs * src/prefs_panel.ui: test commit with a tooltip 2008-03-04 13:18 oeildepierre * src/fmotf.cpp: Fixed vertical advance in featured line 2008-03-04 13:08 oeildepierre * src/fontitem.cpp: Added complete text progression support even for featured texts 2008-03-04 12:37 oeildepierre * src/fontbook.cpp, src/mainviewwidget.cpp: Fixed missing "linewidth" arg in renderLine call from fontbook Fixed empty items 2008-03-04 11:21 oeildepierre * CMakeLists.txt, cmake/modules/FREETYPEConfig.cmake, src/CMakeLists.txt, src/fontbook.cpp, src/fontitem.cpp, src/fontitem.h, src/listdockwidget.cpp, src/listsdock.ui, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/messages/fontmatrix_fr.qm, src/messages/fontmatrix_fr.ts, src/prefs_panel.ui, src/textprogression.cpp, src/textprogression.h, src/textprogression.ui, src/typotek.cpp: This commit brings some important changes in the layout subsystem (text progression). Be aware that it must break things here and there 2008-02-28 15:36 oeildepierre * src/typotek.cpp: Tag all did not updated the tags list widget. 2008-02-28 12:48 oeildepierre * src/mainview.ui: Enlarged the unicode range dropdown menu 2008-02-28 10:55 oeildepierre * src/messages/fontmatrix_da.qm, src/messages/fontmatrix_da.ts, src/messages/fontmatrix_de.qm, src/messages/fontmatrix_de.ts, src/messages/fontmatrix_en.qm, src/messages/fontmatrix_en.ts, src/messages/fontmatrix_fi.qm, src/messages/fontmatrix_fi.ts, src/messages/fontmatrix_fr.qm, src/messages/fontmatrix_fr.ts, src/messages/fontmatrix_hi.ts, src/messages/fontmatrix_nb.qm, src/messages/fontmatrix_nb.ts, src/messages/fontmatrix_nl.qm, src/messages/fontmatrix_nl.ts, src/messages/fontmatrix_no.qm, src/messages/fontmatrix_no.ts, src/messages/fontmatrix_sr.ts, src/messages/fontmatrix_sv.qm, src/messages/fontmatrix_sv.ts, src/messages/fontmatrix_uk.qm, src/messages/fontmatrix_uk.ts, src/messages/lupdate.files: Update strings for TS files, French translation completed. 2008-02-27 16:00 oeildepierre * src/mainviewwidget.cpp: Added name of the current family in the header of the names list 2008-02-27 15:35 oeildepierre * src/CMakeLists.txt, src/fmnamelist.cpp, src/fmnamelist.h, src/listsdock.ui: Typing when the names list got focus now scroll to the letter you typed 2008-02-27 13:18 oeildepierre * src/mainviewwidget.cpp: Fixed bug #11161 : FM stumbles across uppercasse letters 2008-02-27 11:02 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp: Stick to Unicode range is now the default & unique behaviour. 2008-02-27 10:57 oeildepierre * src/fontitem.cpp, src/typotek.cpp, src/typotek.h: Fixed bug #10543 : Feature request: multiple select/multiple tag assignment. See bug report for details 2008-02-24 18:49 oeildepierre * src/fmrepair.cpp: Check-Database feature is implemented, it has to be tested now. 2008-02-24 17:43 oeildepierre * src/fmrepair.cpp, src/mainview.ui, src/repair.ui: UI improvement in mainview 2008-02-23 21:21 oeildepierre * src/CMakeLists.txt, src/fmrepair.cpp, src/fmrepair.h, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/repair.ui, src/typotek.cpp, src/typotek.h: Fixed impossibility to activate different fonts with the same file name but in different directories - links are now prefixed with the target file size. It means that you won’t be able to deactivate your fonts with fontmatrix, sorry. It also fixed problem with no detection of the AFM files. Added the mockup of the "check database" dialog 2008-02-23 14:22 oeildepierre * CMakeLists.txt, src/about.ui, src/aboutwidget.cpp: Show how many fonts are loaded in About widget HIGH_PERF is now the default 2008-02-23 13:55 oeildepierre * src/mainviewwidget.cpp: Fixed bug #10791 : Using right to left modifies view size 2008-02-23 13:46 oeildepierre * src/mainviewwidget.cpp: Improved performance when activating a family 2008-02-23 10:43 oeildepierre * src/listsdock.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: Added bug #11100 : RFE : insert search input string for finding font name 2008-02-23 09:53 oeildepierre * src/prefs_panel.ui, src/prefspaneldialog.cpp: Fixed bug #11070 : preferances panel missing "Close" button 2008-02-23 09:28 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/typotek.cpp: Spaces were replaced by red squares becaus they’re empty shapes. Now it manages to distinguish between normal empty shapes and missing glyphs. 2008-02-22 21:37 oeildepierre * src/fontitem.cpp: Finally, I tried to fix bug #10568 : How to see missing char 2008-02-22 09:30 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp: Fixed bug #10578 : no memory of option choosed in "dessins" 2008-02-19 12:00 oeildepierre * src/fmpreviewlist.cpp: Fixed horizontal size and X position of the selection rectangle in preview list 2008-02-19 11:37 oeildepierre * src/fmpreviewlist.cpp, src/fontitem.cpp, src/fontitem.h, src/listdockwidget.cpp, src/listdockwidget.h, src/typotek.cpp: Fixed bug #11071 : Preview Word does not change after closing Preferences Panel 2008-02-19 11:11 oeildepierre * src/fmpreviewlist.cpp, src/fmpreviewlist.h, src/fontitem.cpp, src/typotek.cpp, src/typotek.h: Improved display of RTL previews 2008-02-18 20:38 oeildepierre * src/fmpreviewlist.cpp, src/mainviewwidget.cpp: Sync between names & previews lists was in a mess, it should work now. 2008-02-18 12:10 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: bug #11072 : add RTL support to "Preview Word" 2008-02-17 21:20 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h, src/mainviewwidget.cpp: Pointed in "bug #11082 : ergonomic request", names wasn’t anymore synced when a font was selected in previews list 2008-02-16 09:05 oeildepierre * src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/mainviewwidget.cpp: The font-names list does not jump any more when selecting an item 2008-02-15 19:23 oeildepierre * src/mainviewwidget.cpp: Fixed segmentation fault when select family item. 2008-02-15 05:59 oeildepierre * src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: Possibility to setup local storage place of remote fonts in preferences 2008-02-15 04:55 oeildepierre * src/mainviewwidget.cpp, src/typotek.cpp: Remote dirs cleanup - it works now 2008-02-14 17:10 oeildepierre * src/fontitem.cpp, src/mainviewwidget.cpp, src/mainviewwidget.h, src/prefspaneldialog.cpp, src/remotedir.cpp, src/typotek.cpp: I commit changes to let you explore the many ways FM now has to misbehave - especially with remote dirs which bring a significant amount of entropy. 2008-02-14 15:06 oeildepierre * src/fontitem.cpp: Catch starting http requests 2008-02-14 14:42 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp, src/typotek.h: Can retrieve a fontfile from network, and crash :) 2008-02-14 08:48 oeildepierre * src/remotedir.cpp, src/remotedir.h, src/typotek.cpp: Fixed multiple imports of remote fonts 2008-02-13 22:33 oeildepierre * CMakeLists.txt, src/CMakeLists.txt, src/dataexport.cpp, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/remotedir.cpp, src/remotedir.h, src/savedata.cpp, src/typotek.cpp, src/typotek.h: Step commit to remote dirs, it doesn’t pretty works now, but it kindly comes. 2008-02-11 16:45 oeildepierre * src/CMakeLists.txt, src/dataexport.cpp, src/dataexport.h, src/fontbook.cpp, src/typotek.cpp, src/typotek.h: Introduced an export-font-set feature, which will be the base for remote directories. 2008-02-11 13:52 oeildepierre * src/fmsampletextview.cpp, src/fmsampletextview.h: Fixed bug #10948 : Improving in-frame navigation (freetype frame especially) 2008-02-11 12:49 oeildepierre * src/fontitem.cpp: Fixed bug #10569 : No preview word for dingbats-like fonts 2008-02-11 12:06 oeildepierre * src/dataloader.cpp, src/main.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/prefs_panel.ui, src/typotek.cpp, src/typotek.h: Font size can be set on-view. Spalshsreen activation becomes part of fontmatrix.conf file 2008-02-09 22:20 oeildepierre * src/mainviewwidget.cpp: Styles in names tree list are now ordered alphabetically. It no longer bounces when browse in preview list and it’s definitly cleaner this way. As a side effect, it handles multiple fonts with same name better. 2008-02-09 19:18 vlada * src/fmpreviewlist.cpp, src/mainviewwidget.cpp: Initial commit of overall color sync 2008-02-09 16:37 oeildepierre * src/application.qrc, src/icons/font_otf16.png, src/icons/font_truetype16.png, src/icons/font_type116.png, src/mainviewwidget.cpp, src/mainviewwidget.h: Icons representing type of font file are now displayed in Font tree view. 2008-02-09 09:58 oeildepierre * src/fmshaper.cpp, src/typotek.cpp: At least a bit of arabic (with arialuni) and indic (Devanagari with Gargi) shaping works this morning - 2008-02-09 08:39 oeildepierre * src/application.qrc: Re-insert templates related entries in resources file as they have been accidentaly removed. 2008-02-06 09:22 oeildepierre * src/fontitem.h, src/mainviewwidget.cpp, src/typotek.cpp: Improvements for system fonts 2008-02-06 08:57 oeildepierre * CMakeLists.txt, cmake/modules/FONTCONFIGConfig.cmake, src/CMakeLists.txt, src/mainviewwidget.cpp, src/mainviewwidget.h, src/savedata.cpp, src/typotek.cpp, src/typotek.h: Added system wide fonts initial support - need to be tested & discussed 2008-02-05 20:51 vlada * src/about.ui, src/graphic-resources/info.css, src/mainview.ui: typo fixed, tweaking of main window and css for Font Informations rework 2008-02-05 20:44 oeildepierre * src/fontitem.cpp: Fixed display of shaped sample text in right to left mode rendered by freetype - when shaper itself works of course :) 2008-02-05 16:47 oeildepierre * src/main.cpp: Changed run into start for LazyInit 2008-02-05 16:33 oeildepierre * src/main.cpp, src/typotek.cpp, src/typotek.h: Introduced an LazyInit class which is a descendant of QThread. For now it fills cache of Information text. 2008-02-05 14:12 oeildepierre * src/fmpreviewlist.h: removed FontPreviewItem::dump() as it prevents to compile on some platforms and was just a debug method 2008-02-05 14:08 oeildepierre * src/fmotf.cpp, src/fontitem.cpp: fixed some segfaults in featured line rendering 2008-02-05 13:45 oeildepierre * src/fmpreviewlist.cpp, src/fmpreviewlist.h, src/fontitem.cpp, src/mainviewwidget.cpp: Improved Lists 2008-02-04 17:32 vlada * src/icons/fontmatrix-systray.png: Enhaced version of systray icon 2008-02-04 13:26 oeildepierre * src/fmpreviewlist.cpp, src/fontitem.cpp, src/mainviewwidget.cpp, src/prefspaneldialog.cpp: Font sizes as set in preferences was not took into account 2008-02-04 00:10 oeildepierre * src/fmpreviewlist.cpp, src/fontitem.cpp, src/graphic-resources/info.css, src/mainviewwidget.cpp: Due to too many "s, font info text was not displayed 2008-02-03 21:06 vlada * src/application.qrc, src/graphic-resources/info.css, src/icons/fontmatrix-systray.png, src/systray.cpp: Changed systray icon and tried to eat the bone Pierre gave me. That hurts! 2008-02-03 19:57 oeildepierre * src/application.qrc, src/fmpreviewlist.cpp, src/fontitem.cpp, src/graphic-resources/info.css, src/mainviewwidget.cpp, src/mainviewwidget.h, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: - Fontsizes can be set in preferences - Info has its CSS file (src/graphic-resources/info.css) 2008-02-03 12:49 oeildepierre * src/mainviewwidget.cpp, src/typotek.cpp: bug #10961 : Remove font -> crash 2008-02-02 13:14 vlada * src/messages/fontmatrix_no.qm, src/messages/fontmatrix_no.ts: 2008-02-02 11:34 vlada * src/application.qrc, src/messages/about_uk.html, src/messages/fontmatrix_uk.qm, src/messages/fontmatrix_uk.ts, src/messages/help_uk.html: Ukrainian translation of interface and help files by yurchor@ukr.net. Thank you! 2008-02-02 09:46 oeildepierre * CMakeLists.txt, INSTALL, src/fmpreviewlist.cpp: added -DHIGH_PERF=1 option to cmake, for now it just allows to not wait the slider to be released for redrawing items in preview list. It could be usefull for testing purpose in the future 2008-01-31 13:06 oeildepierre * src/mainviewwidget.cpp: Show what font will be removed in "do you want to remove" dialog 2008-01-31 13:01 oeildepierre * src/CMakeLists.txt, src/importtags.cpp, src/importtags.h, src/importtags.ui, src/typotek.cpp: Improved tagging at import time 2008-01-29 10:46 oeildepierre * src/mainview.ui: UI fix - OpenType features list did not expand properly 2008-01-28 23:03 oeildepierre * src/fmotf.cpp, src/fontitem.cpp, src/listsdock.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp, src/typotek.h: bug #10881 : Cannot remove a font from the list 2008-01-28 21:36 oeildepierre * src/dataloader.cpp, src/fmpreviewlist.cpp, src/fontitem.cpp, src/mainviewwidget.cpp, src/savedata.cpp, src/systray.cpp, src/typotek.cpp: bug #10854 : Fonts imported twice IDs for font files are now their file path, so unicity is provided by file system. 2008-01-26 21:51 oeildepierre * src/fmsampletextview.cpp, src/fontitem.cpp, src/mainviewwidget.cpp: Improved Freetype rendering - I know it’s not perfect yet :( 2008-01-26 21:50 oeildepierre * src/graphic-resources/default_template.png, src/graphic-resources/fontbook_default.xml: New default template 2008-01-26 01:02 oeildepierre * src/fontbook.cpp, src/graphic-resources/fontbook_default.xml, src/graphic-resources/one_line_template.xml: Improvements in font book template engine 2008-01-25 18:48 oeildepierre * src/fontbook.cpp, src/fontbook.h, src/fontitem.cpp, src/fontitem.h, src/graphic-resources/fontbook_default.xml, src/graphic-resources/one_line_template.xml: Improvements in font book template engine 2008-01-25 13:19 oeildepierre * src/dataloader.cpp, src/main.cpp, src/typotek.cpp, src/typotek.h: Some improvement for splash screen, which has proved itself usefull at least in belgium :) 2008-01-25 11:46 oeildepierre * src/fontitem.cpp: OpenType features was not visible if no search has been made - should be ported in F003 2008-01-24 10:43 oeildepierre * src/dataloader.cpp, src/typotek.cpp: Fixed - bug #10854 : Fonts imported twice 2008-01-24 00:10 oeildepierre * src/fontbook.cpp: SVG elements in fontbook templates on ALL pages ;-) 2008-01-24 00:03 oeildepierre * CMakeLists.txt, src/fontbook.cpp, src/fontbook.h: SVG elements in fontbook templates 2008-01-23 15:51 oeildepierre * src/fontbook.cpp, src/fontbook.h, src/fontitem.h, src/graphic-resources/fontbook_default.xml, src/graphic-resources/one_line_template.xml: Fontbook template engine - changes. 2008-01-22 23:25 oeildepierre * src/messages/fontmatrix_no.qm, src/messages/fontmatrix_no.ts: housekeeping 2008-01-22 23:21 oeildepierre * src/importedfontsdialog.cpp, src/importedfontsdialog.h, src/typotek.cpp: Fixed misplacement for the import confirmation dialog. 2008-01-22 22:54 oeildepierre * src/application.qrc, src/messages/about_people.html, src/messages/fontmatrix_da.qm, src/messages/fontmatrix_da.ts, src/messages/fontmatrix_de.qm, src/messages/fontmatrix_de.ts, src/messages/fontmatrix_en.qm, src/messages/fontmatrix_en.ts, src/messages/fontmatrix_fi.qm, src/messages/fontmatrix_fi.ts, src/messages/fontmatrix_fr.qm, src/messages/fontmatrix_fr.ts, src/messages/fontmatrix_hi.qm, src/messages/fontmatrix_hi.ts, src/messages/fontmatrix_nb.qm, src/messages/fontmatrix_nb.ts, src/messages/fontmatrix_nl.qm, src/messages/fontmatrix_nl.ts, src/messages/fontmatrix_sr.qm, src/messages/fontmatrix_sr.ts, src/messages/fontmatrix_sv.qm, src/messages/fontmatrix_sv.ts, src/messages/lupdate.files, src/messages/update.sh: Ran update.sh on translations 2008-01-20 21:56 oeildepierre * src/typotek.cpp: More debug messages in dropEvent handler in order to find why it does not work with Nautilus 2008-01-20 17:09 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/prefs_panel.ui: Very first elements (mainly placeholders) for remote directories 2008-01-20 15:51 oeildepierre * src/fmsampletextview.cpp, src/fmsampletextview.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: - Each rendering mode has its own page in sample preview - Zoom is now achief by Ctrl-Wheel means 2008-01-20 12:53 oeildepierre * src/mainviewwidget.cpp: Tried to fix bug #10829 : Font list starts at letter C 2008-01-20 12:29 oeildepierre * src/aboutwidget.cpp, src/aboutwidget.h, src/fontitem.cpp, src/mainviewwidget.cpp, src/tagseteditor.cpp, src/tagseteditor.h, src/typotek.cpp: - Fixed slowdown at starting time (report it to first search, maybe good to put it in subprocess when full UI is available). - Fixed bug #10830 : Wrong dialog position 2008-01-20 02:02 oeildepierre * src/typotek.cpp: Import single files with drag & drop without copy them 2008-01-20 01:43 oeildepierre * src/fontitem.cpp: Fixed a spacing shift between vector and raster rendering 2008-01-19 17:48 oeildepierre * src/dataloader.cpp, src/dataloader.h, src/fontitem.cpp, src/savedata.cpp, src/typotek.cpp, src/typotek.h: Files and directories schema changed: $home/.fonts-reserved/fonts.data becomes $home/.fontmatrix.data $home/.fonts-reserved disappears as font files are no more copied, .fontmatrix.data now tracks down _absolute_ file paths. 2008-01-19 17:43 oeildepierre * CMakeLists.txt: version increment (0.4.0) 2008-01-16 13:50 oeildepierre * src/graphic-resources/oneline_template.png: Free & free of charge fonts in oneliner template preview 2008-01-16 13:30 oeildepierre * src/application.qrc, src/fontbookdialog.cpp, src/main.cpp, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/systray.cpp, src/typotek.cpp, src/typotek.h: Added preference item for templates (for fontbook) folder. At least two default templates are now in Fontmatrix, hope there will be someone to improve them. Side note : organisation "Undertype" and project "fontmatrix" are now declared for whole application. You can now call default constructor for QSettings. 2008-01-16 00:48 oeildepierre * src/bookexport.ui, src/fontbook.cpp, src/fontbookdialog.cpp, src/fontbookdialog.h, src/graphic-resources/default_template.png, src/graphic-resources/one_line_template.xml, src/graphic-resources/oneline_template.png: Switched fontbook generation to a template-based system 2008-01-15 22:47 oeildepierre * src/CMakeLists.txt: Fixed order of libs to link into fontmatrix (harfbuzz _before_ Qt) 2008-01-15 13:35 oeildepierre * src/fontbook.cpp, src/fontitem.cpp, src/graphic-resources/one_line_template.xml: Minor improvements in fontbook template "engine" and a one-line template 2008-01-15 12:34 oeildepierre * src/fontbook.cpp, src/fontbook.h, src/fontbookdialog.cpp, src/graphic-resources/fontbook_default.xml: Important, the first step of a templated font book generation 2008-01-15 08:48 oeildepierre * src/mainview.ui: Fixed zoom slider in sample text preview 2008-01-14 13:14 oeildepierre * src/fontitem.cpp, src/mainviewwidget.cpp, src/typotek.cpp: Added (TT_PLATFORM_MACINTOSH , *) pair 2008-01-14 11:25 oeildepierre * src/fontitem.cpp: Added (TT_PLATFORM_APPLE_UNICODE , TT_APPLE_ID_UNICODE_2_0) pair 2008-01-14 00:29 oeildepierre * src/fmotf.cpp: Namespaced Harfbuzz (3) 2008-01-13 23:02 oeildepierre * src/fmotf.cpp: Namespaced Harfbuzz (2) 2008-01-13 22:11 oeildepierre * src/fmotf.cpp, src/fmotf.h, src/fmshaper.cpp, src/fmshaper.h: Namespaced Harfbuzz 2008-01-11 12:48 oeildepierre * src/fmpreviewlist.cpp, src/fontitem.cpp, src/mainviewwidget.cpp: Partly fixed wrong display of preview in left panel Fixed the non-Freetype rendering of preview when accessed by selecting font in names list 2008-01-11 10:20 oeildepierre * CMakeLists.txt, INSTALL, src/messages/about_people.html, src/messages/fontmatrix_fr.qm, src/messages/fontmatrix_fr.ts: Validated changes in French translation Began to fix install mess, and updated INSTALL accordingly 2008-01-11 08:58 oeildepierre * src/messages/fontmatrix_de.qm, src/messages/fontmatrix_de.ts, src/messages/fontmatrix_fr.ts: German (initial) and French (corrections) translations by Christoph and Olivier 2008-01-11 07:08 pnemade * src/messages/about_people.html: Added myself to project 2008-01-10 15:43 tsoots * src/messages/about_people.html: Added web sites 2008-01-10 15:14 oeildepierre * src/messages/about_people.html: Insert Mr Docs in about_people 2008-01-10 15:00 tsoots * src/messages/about_people.html: Forgot fi translation with my last commit 2008-01-10 14:59 tsoots * src/messages/about_people.html: Added myself 2008-01-10 13:47 oeildepierre * CMakeLists.txt, src/about.ui, src/aboutwidget.cpp: bug #10721 : Show version number in Help > About 2008-01-10 13:10 oeildepierre * src/dataloader.cpp: Removed warning message about fonts.data file not present 2008-01-10 11:33 oeildepierre * src/fontitem.cpp, src/messages/fontmatrix_nl.ts: bug #10429 : FEATURE REQUEST: display different font names 2008-01-10 10:56 oeildepierre * src/fontitem.cpp, src/mainview.ui: #10596 Added regex in infoText to have links real HTTP links 2008-01-10 09:53 oeildepierre * src/about.ui, src/aboutwidget.cpp, src/application.qrc, src/messages/about_de.html, src/messages/about_fr.html, src/messages/about_people.html: Added people tab in About widget. Contributors are invited to add their own entry in src/messages/about_people.html 2008-01-09 23:07 oeildepierre * src/importedfontsdialog.cpp, src/typotek.cpp: Indicate files that Fontmatrix failed to import (write in red and append "(failed to load)") 2008-01-09 22:16 oeildepierre * src/messages/update.sh: Fixed a typo in update script for TS files 2008-01-09 19:46 oeildepierre * src/application.qrc, src/messages/fontmatrix_nl.qm, src/messages/fontmatrix_nl.ts: Dutch translation by Nico van den Burg 2008-01-09 13:50 oeildepierre * src/typotek.cpp, src/typotek.h: Prefs dialog normal call was broken with last commit 2008-01-09 13:36 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: bug #10533 : Creating sample text sets from Preferences dialog isn't that obvous 2007-12-27 07:11 pnemade * src/importedfonts.ui, src/importedfontsdialog.cpp: Enhance Fonts Import Dialog Window by adding Ok button and displaying count of number of imported fonts 2007-12-22 15:25 oeildepierre * src/typotek.cpp: Check if systray exists before calling its isVisible method in typotek::closeEvent 2007-12-22 15:18 oeildepierre * src/typotek.cpp: Check if systray exist before init systray frame in prefs panel 2007-12-22 14:35 oeildepierre * src/mainviewwidget.cpp: Check for systray before connecting updateTags 2007-12-22 09:13 oeildepierre * src/bookexport.ui, src/fontbook.cpp, src/fontbookdialog.cpp: Fixed fontbook 2007-12-21 21:40 oeildepierre * src/fontitem.cpp: Prevent the sample text to be out page - https://gna.org/bugs/index.php?10576 2007-12-21 12:49 oeildepierre * harfbuzz/src/harfbuzz-shaper.cpp, src/fmotf.cpp, src/fmshaper.cpp, src/fontitem.cpp, src/mainview.ui: Slight improvement in handling shaped string - still crash, but less, and render well one word! 2007-12-20 17:27 oeildepierre * src/fontactionwidget.cpp, src/fontactionwidget.h, src/listsdock.ui, src/mainview.ui, src/mainviewwidget.cpp: Housekeeping 2007-12-20 17:13 oeildepierre * src/CMakeLists.txt, src/fmglyphsview.cpp, src/fontactionwidget.cpp, src/fontactionwidget.h, src/fontitem.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: Moved Tags to the "Info tab" 2007-12-20 09:30 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/typotek.cpp: Fixed crash when loading broken face that Freetype fails to build 2007-12-20 08:47 oeildepierre * src/fontitem.cpp: Fixed un-tr() strings which prevented to display infos for type1 fonts 2007-12-19 21:52 oeildepierre * src/fontitem.cpp, src/main.cpp, src/mainviewwidget.cpp, src/typotek.cpp: Return of "listfonts" argument 2007-12-19 16:52 oeildepierre * harfbuzz/src/harfbuzz-shaper.cpp, src/fmotf.cpp, src/fmotf.h, src/fmshaper.cpp, src/fmshaper.h, src/fontitem.cpp, src/mainviewwidget.cpp: Tried to fix some segfaults (without success) with Harfbuzz and corrected a little annoyance in mainviewwidget ( https://gna.org/bugs/?10558 ) 2007-12-19 01:02 oeildepierre * src/fmglyphsview.cpp, src/fmglyphsview.h, src/fontitem.cpp, src/listsdock.ui, src/mainviewwidget.cpp: Fixed crash when GlyphView show, and wide glyphs wrong display 2007-12-18 19:39 oeildepierre * TODO, src/fmglyphsview.cpp, src/fmpreviewlist.cpp, src/fmsampletextview.cpp, src/fmsampletextview.h, src/fontitem.cpp, src/listsdock.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: I removed tabs from docked navigation widget. Some crash from time to time, I’ll have to investigate signals & slots 2007-12-18 10:33 oeildepierre * src/fmglyphsview.cpp, src/fmglyphsview.h, src/fontitem.cpp, src/mainviewwidget.cpp, src/mainviewwidget.h, src/messages/fontmatrix_da.ts, src/messages/fontmatrix_de.ts, src/messages/fontmatrix_en.ts, src/messages/fontmatrix_fi.ts, src/messages/fontmatrix_fr.ts, src/messages/fontmatrix_no.ts, src/messages/fontmatrix_sr.ts, src/messages/fontmatrix_sv.ts, src/messages/lupdate.files: Improved handling of large sets of glyph to didplay in GlyphsView, fixed cosmetics in same place. 2007-12-17 23:31 oeildepierre * src/mainviewwidget.cpp, src/systray.cpp, src/systray.h, src/typotek.cpp: Fixed the slow down at massive activation 2007-12-17 14:58 pnemade * CMakeLists.txt: Fix CMAKE_INSTALL_PREFIX and ICONDIR in CMakeLists.txt 2007-12-17 13:46 oeildepierre * src/fontbook.cpp, src/fontbook.h, src/fontbookdialog.cpp, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/messages/fontmatrix_da.ts, src/messages/fontmatrix_de.ts, src/messages/fontmatrix_en.ts, src/messages/fontmatrix_fi.ts, src/messages/fontmatrix_fr.qm, src/messages/fontmatrix_fr.ts, src/messages/fontmatrix_no.ts, src/messages/fontmatrix_sr.ts, src/messages/fontmatrix_sv.ts, src/messages/lupdate.files, src/messages/update.sh, src/typotek.cpp: Fixed strings, some work for translators :) 2007-12-17 09:56 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp: Fixed https://gna.org/bugs/?10540 - the new single glyph view doesn't work with un-mapped glyphs 2007-12-16 21:52 oeildepierre * src/fmglyphsview.cpp, src/fmglyphsview.h, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/mainviewwidget.h: New, and hopefully better, single glyph view. 2007-12-16 13:16 oeildepierre * src/fontitem.cpp: Fixed severe performance issue with wide unicode ranges such as "CJK unified ideographs" or "Un-Mapped glyphs" from arialuni - It is now a performance issue, which I’ll fix soon the same way as peview list 2007-12-15 17:07 oeildepierre * src/fmglyphsview.cpp, src/fmglyphsview.h, src/mainviewwidget.cpp: Fixed Right-Button-click-in-Glyphs-View crash which came with answer to https://gna.org/bugs/?10489 Note that I misunderstood what was expected by this RFE 2007-12-15 15:20 oeildepierre * src/fmglyphsview.cpp, src/fmglyphsview.h, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp: Tried to very fix https://gna.org/bugs/?10495 - glyphs grid And https://gna.org/bugs/?10489 - display alternate glyphs 2007-12-14 23:42 oeildepierre * src/fmglyphsview.cpp, src/fmglyphsview.h: fixed https://gna.org/bugs/index.php?10495 - glyph grid size 2007-12-14 23:26 oeildepierre * src/fmshaper.cpp, src/fontitem.cpp: Some debugging code in FmShaper and https://gna.org/bugs/?10451 fixed (non breaking lines in font info) 2007-12-14 16:53 oeildepierre * src/bookexport.ui, src/fontbook.cpp, src/fontbook.h, src/fontbookdialog.cpp, src/fontbookdialog.h, src/fontitem.cpp, src/systray.cpp, src/systray.h: Prepared FontBook switch 2007-12-13 23:37 oeildepierre * src/mainviewwidget.cpp, src/mainviewwidget.h, src/systray.cpp, src/systray.h, src/typotek.cpp, src/typotek.h: Activation state of tags in systray are synced with activation state of the tagged font files - there’s now an activationEvent() 2007-12-13 22:52 oeildepierre * src/CMakeLists.txt, src/bookexport.ui, src/fontbook.cpp, src/fontbook.h, src/typotek.cpp: Prepared an independant class for FontBook, just to do the template importer now :) 2007-12-13 22:10 oeildepierre * src/application.qrc, src/fmotf.cpp, src/fmotf.h, src/fmshaper.cpp, src/fmshaper.h, src/fontitem.cpp, src/icons/icon_warning-32.png, src/systray.cpp: Continue to break shaper code grrr Played a bit with systray - Need to propagate activation changes in tags menu 2007-12-13 03:19 tsoots * src/typotek.cpp: When importing fonts remember the last directory used. 2007-12-12 21:01 oeildepierre * harfbuzz/src/harfbuzz-shaper.cpp, src/fmotf.cpp, src/fmotf.h, src/fmshaper.cpp, src/fmshaper.h, src/fontitem.cpp, src/fontitem.h, src/listsdock.ui, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/messages/fontmatrix_en.qm, src/messages/fontmatrix_en.ts, src/prefs_panel.ui: fontmatrix: ADDED Harfbuzz shaping - IT DOES NOT WORK YET UPDATED "en" TS file by Craig Ringer 2007-12-12 19:28 oeildepierre * src/bookexport.ui, src/fontaction.ui, src/importedfonts.ui, src/listsdock.ui, src/mainview.ui, src/prefs_panel.ui, src/tagset.ui, src/typotek.cpp: updated strings from Craig MrB Ringer 2007-12-12 16:36 tsoots * src/prefs_panel.ui, src/prefspaneldialog.cpp, src/typotek.cpp, src/typotek.h: Re-enable initial tagging. It's now set as an option which is disabled by default but which can be enabled in the preferences. 2007-12-12 16:07 tsoots * src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: Allow user to select the font editor 2007-12-12 07:14 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp: fontmatrix: CHANGED Features are applied when checkboxes are checked or unchecked 2007-12-12 05:32 tsoots * src/typotek.cpp, src/typotek.h: If Fontforge cannot be found the menu entry for editing font will be disabled. 2007-12-12 05:16 tsoots * src/messages/fontmatrix_fi.qm, src/messages/fontmatrix_fi.ts: Updated the Finnish translation 2007-12-11 19:52 tsoots * src/messages/fontmatrix_fi.ts: Finnish translation update 2007-12-11 17:45 oeildepierre * src/fontitem.cpp, src/mainview.ui: fontmatrix: IMPROVED Freetype rendering - especially with kern feature 2007-12-11 14:43 tsoots * src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: New tags are now added to the systray's tag menu after creation. 2007-12-11 13:36 oeildepierre * .: 2007-12-11 13:35 oeildepierre * harfbuzz/src/CMakeLists.txt, src/CMakeLists.txt, src/application.qrc, src/fmotf.h, src/fmpreviewlist.cpp, src/fmsampletextview.cpp, src/fmshaper.cpp, src/fmshaper.h, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/messages/fontmatrix_da.qm, src/messages/fontmatrix_de.qm, src/messages/fontmatrix_en.qm, src/messages/fontmatrix_en.ts, src/messages/fontmatrix_fi.qm, src/messages/fontmatrix_fi.ts, src/messages/fontmatrix_fr.qm, src/messages/fontmatrix_no.qm, src/messages/fontmatrix_sr.qm, src/messages/fontmatrix_sv.qm, src/typotek.cpp: fontmatrix: ADDED Rendering in previewlist is now done by Freetype - it’s really better ADDED TS files ADDED a bit of the future FmShaper 2007-12-11 04:34 tsoots * src/prefs_panel.ui, src/systray.cpp: Fixed a few typos and made activate all and deactivate all to check and uncheck tag menu entries in the systray's context menu 2007-12-11 04:07 tsoots * src/messages/fontmatrix_fi.ts: Added Finnish translation file and the first few translated messages. 2007-12-11 00:12 oeildepierre * src/messages/fontmatrix_da.ts, src/messages/fontmatrix_de.ts, src/messages/fontmatrix_en.ts, src/messages/fontmatrix_fr.ts, src/messages/fontmatrix_no.ts, src/messages/fontmatrix_sr.ts, src/messages/fontmatrix_sv.ts, src/messages/lupdate.files: fontmatrix: UPDATED TS files + a new english one 2007-12-10 21:36 oeildepierre * src/fontitem.cpp, src/mainviewwidget.cpp: fontmatrix: FIXED resolution for FreeType rasterisation 2007-12-10 18:58 tsoots * src/prefs_panel.ui, src/prefspaneldialog.cpp, src/systray.cpp, src/typotek.cpp, src/typotek.h: It's now possible to close the application to the system tray. 2007-12-10 18:42 oeildepierre * src/dataloader.cpp, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: fontmatrix: ADDED First step of FreeType rendering 2007-12-10 15:19 tsoots * TODO: Updated TODO for myself (added two new items). 2007-12-10 15:02 tsoots * src/systray.cpp, src/systray.h: First bits of systray controls 2007-12-10 15:00 tsoots * src/CMakeLists.txt, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: First bits of the systray controls 2007-12-10 14:04 oeildepierre * src/dataloader.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/prefspaneldialog.cpp, src/savedata.cpp, src/typotek.cpp, src/typotek.h: fontmatrix: ADDED Beginning of multiple sample texts infrastructure FIXED https://gna.org/bugs/?10428 2007-12-10 12:33 oeildepierre * src/CMakeLists.txt, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/prefs_panel.ui, src/prefspaneldialog.cpp, src/prefspaneldialog.h, src/typotek.cpp, src/typotek.h: fontmatrix: ADDED First attempt to provide a preferences panel 2007-12-10 11:48 tsoots * TODO: Added systray work to TODO (testing svn commit access at the same time) 2007-12-10 10:18 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp: fontmatrix: IMPROVED the glyphs view 2007-12-09 23:33 oeildepierre * INSTALL: fontmatrix: ADDED note about version of Freetype in INSTALL file as it not works out-of-the-box for at least GoboLinux users 2007-12-09 21:49 oeildepierre * src/fontitem.cpp: fontmatrix: FIXED https://gna.org/bugs/index.php?10474 2007-12-09 20:57 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp: fontmatrix: ADDED show an approximated percentage of unicode coverage for the current interval 2007-12-08 16:26 oeildepierre * src/mainview.ui: fontmatrix: FIXED https://gna.org/bugs/?10475 2007-12-08 10:07 oeildepierre * src/fmsampletextview.cpp, src/fmsampletextview.h: fontmatrix: FIXED wheelevent was ignored in sample text view - when unfitted of course 2007-12-08 09:03 oeildepierre * src/fmotf.cpp: fontmatrix: FIXED OpenType stuff was unusable due to a lot of debbugging messages 2007-12-08 08:45 oeildepierre * INSTALL: fontmatrix: CHANGED Install instructions 2007-12-07 22:28 oeildepierre * src/application.qrc, src/messages/fontmatrix_da.ts, src/messages/fontmatrix_de.ts, src/messages/fontmatrix_fr.qm, src/messages/fontmatrix_fr.ts, src/messages/fontmatrix_no.ts, src/messages/fontmatrix_sr.ts, src/messages/fontmatrix_sv.ts, src/messages/help_fr.html, src/messages/lupdate.files: fontmatrix: ADDED translations - fr 2007-12-07 20:53 oeildepierre * src/mainviewwidget.cpp: fontmatrix: FIXED https://gna.org/bugs/index.php?10459 2007-12-07 20:47 oeildepierre * src/messages/help.html: fontmatrix: FORWARDED PLinnell’s corrections 2007-12-07 18:32 oeildepierre * src/src.pro, typotek.pro: fontmatrix: DELETED PRO files, they’ve became useless - Build with cmake instead 2007-12-07 17:32 oeildepierre * harfbuzz/src/harfbuzz-shaper.h, src/fmotf.cpp, src/fmotf.h, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: fontmatrix: IMPROVED First attempt to apply selected features 2007-12-06 15:06 oeildepierre * src/fmotf.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/opentypetags.h: fontmatrix: IMPROVED OTF features presentation 2007-12-06 14:40 oeildepierre * harfbuzz, harfbuzz/AUTHORS, harfbuzz/COPYING, harfbuzz/COPYING.FTL, harfbuzz/COPYING.GPL, harfbuzz/ChangeLog, harfbuzz/Makefile.am, harfbuzz/NEWS, harfbuzz/README, harfbuzz/autogen.sh, harfbuzz/configure.ac: fontmatrix: ADDED Harbuzz files (2) 2007-12-06 14:39 oeildepierre * harfbuzz/src, harfbuzz/src/.gitignore, harfbuzz/src/CMakeLists.txt, harfbuzz/src/Makefile.am, harfbuzz/src/harfbuzz-arabic.c, harfbuzz/src/harfbuzz-buffer-private.h, harfbuzz/src/harfbuzz-buffer.c, harfbuzz/src/harfbuzz-buffer.h, harfbuzz/src/harfbuzz-dump-main.c, harfbuzz/src/harfbuzz-dump.c, harfbuzz/src/harfbuzz-dump.h, harfbuzz/src/harfbuzz-external.h, harfbuzz/src/harfbuzz-gdef-private.h, harfbuzz/src/harfbuzz-gdef.c, harfbuzz/src/harfbuzz-gdef.h, harfbuzz/src/harfbuzz-global.h, harfbuzz/src/harfbuzz-gpos-private.h, harfbuzz/src/harfbuzz-gpos.c, harfbuzz/src/harfbuzz-gpos.h, harfbuzz/src/harfbuzz-gsub-private.h, harfbuzz/src/harfbuzz-gsub.c, harfbuzz/src/harfbuzz-gsub.h, harfbuzz/src/harfbuzz-hangul.c, harfbuzz/src/harfbuzz-hebrew.c, harfbuzz/src/harfbuzz-impl.c, harfbuzz/src/harfbuzz-impl.h, harfbuzz/src/harfbuzz-indic.cpp, harfbuzz/src/harfbuzz-khmer.c, harfbuzz/src/harfbuzz-myanmar.c, harfbuzz/src/harfbuzz-open-private.h, harfbuzz/src/harfbuzz-open.c, harfbuzz/src/harfbuzz-open.h, harfbuzz/src/harfbuzz-shape.h, harfbuzz/src/harfbuzz-shaper-all.cpp, harfbuzz/src/harfbuzz-shaper-private.h, harfbuzz/src/harfbuzz-shaper.cpp, harfbuzz/src/harfbuzz-shaper.h, harfbuzz/src/harfbuzz-stream-private.h, harfbuzz/src/harfbuzz-stream.c, harfbuzz/src/harfbuzz-stream.h, harfbuzz/src/harfbuzz-thai.cpp, harfbuzz/src/harfbuzz-tibetan.c, harfbuzz/src/harfbuzz.c, harfbuzz/src/harfbuzz.h: fontmatrix: ADDED Harbuzz files 2007-12-06 14:38 oeildepierre * CMakeLists.txt, cmake/modules/FREETYPEConfig.cmake, harfbuzz, src/CMakeLists.txt, src/fmotf.cpp, src/fmotf.h, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: fontmatrix: ADDED First step of Harbuzz integration 2007-12-06 10:30 oeildepierre * CMakeLists.txt: fontmatrix: PLAYED with CMake & CPack 2007-12-06 09:13 oeildepierre * src/savedata.cpp: fontmatrix: FIXED user preview word was not saved 2007-12-05 23:30 oeildepierre * src/application.qrc, src/dataloader.cpp, src/fmpreviewlist.cpp, src/fmpreviewlist.h, src/listdockwidget.h, src/messages/fontmatrix_da.qm, src/messages/fontmatrix_da.ts, src/messages/fontmatrix_de.ts, src/messages/fontmatrix_no.qm, src/messages/fontmatrix_no.ts, src/messages/fontmatrix_sr.ts, src/messages/fontmatrix_sv.qm, src/messages/fontmatrix_sv.ts, src/tagseteditor.cpp, src/typotek.cpp, src/typotek.h: fontmatrix: ADDED Preview word can be set - has broke something I think! ADDED TS & QM(empty) files for no, da, sv, de 2007-12-05 15:52 oeildepierre * CMakeLists.txt, INSTALL, cmake, cmake/modules, cmake/modules/FREETYPEConfig.cmake, src/CMakeLists.txt: fontmatrix: ADDED CMake build 2007-12-05 15:09 oeildepierre * src/messages/fontmatrix_fr.qm, src/messages/fontmatrix_sr.qm, src/messages/fontmatrix_sr.ts: fontmatrix: ADDED QM files because there is no obvious way to build them with cmake and fontmatrix won’t compile witout them 2007-12-05 14:30 oeildepierre * src/typotek.cpp: fontmatrix: REMOVED all dbus stuff, work in progress (4) 2007-12-05 14:28 oeildepierre * src/mainviewwidget.cpp, src/typotek.cpp, src/typotek.h: fontmatrix: REMOVED all dbus stuff, work in progress (3) 2007-12-05 14:25 oeildepierre * src/fontactionwidget.cpp: fontmatrix: REMOVED all dbus stuff, work in progress (2) 2007-12-05 14:13 oeildepierre * src/application.qrc, src/fontactionwidget.cpp, src/fontactionwidget.h, src/main.cpp, src/src.pro: fontmatrix: REMOVED all dbus stuff, work in progress 2007-12-04 17:44 oeildepierre * src/fontitem.h, src/main.cpp, src/messages/fontmatrix_fr.ts, src/messages/fontmatrix_sr.ts, src/src.pro: fontmatrix: ADDED TS files : french(completed) and serbian(empty) 2007-12-04 13:30 oeildepierre * src/fontitem.cpp: fontmatrix: CONTINUED i18n - output unknown encodings rather than display something wrong 2007-12-04 02:44 oeildepierre * src/fontitem.cpp, src/fontitem.h: fontmatrix: ADDED first try to provide some i18n 2007-12-03 21:47 oeildepierre * src/messages/welcome.html: fontmatrix: FIXED forgot to add this welcome 2007-12-03 18:14 oeildepierre * src/listsdock.ui: fontmatrix: CHANGED Names list is default view anew 2007-12-03 18:05 oeildepierre * src/aboutwidget.cpp, src/application.qrc, src/fontitem.cpp, src/helpwidget.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/src.pro: fontmatrix: ADDED Welcome message in messages/welcome.html (to be continued) CHANGED glyph info string 2007-12-03 17:32 oeildepierre * src/fontitem.cpp, src/fontitem.h: fontmatrix: FIXED pay more attention of what is displayed in glyphs tab :-) - https://gna.org/bugs/?10437 2007-12-03 13:32 oeildepierre * src/fontactionwidget.cpp, src/mainview.ui, src/typotek.cpp: fontmatrix: FIXED Increase visibility of font name in status bar - https://gna.org/bugs/?10427 2007-12-02 19:23 oeildepierre * src/fmpreviewlist.cpp, src/fmpreviewlist.h: fontmatrix: CHANGED Key_Up & Key_Down in previews list browse items - https://gna.org/bugs/index.php?10426 2007-12-02 16:35 oeildepierre * src/mainviewwidget.cpp, src/typotek.cpp, src/typotek.h: fontmatrix: FIXED write the current font name in status bar - https://gna.org/bugs/?10427 2007-12-01 22:03 oeildepierre * src/dataloader.cpp: fontmatrix: FIXED ensure that sample text is not empty, even if there is no fonts.data at all 2007-12-01 22:00 oeildepierre * src/fontitem.cpp: fontmatrix: FIXED ensure that activation state is not undefined 2007-12-01 20:25 oeildepierre * src/fontactionwidget.cpp, src/fontactionwidget.h, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/mainviewwidget.h: fontmatrix: FIXED deactivation of variant is now possible FIXED tags edition for an whole family is now possible 2007-12-01 20:19 vlada * TODO: ADDED: ui improvement suggestions 2007-12-01 09:59 oeildepierre * src/typotek.cpp: fontmatrix: CLEAN UP deactivated the DBUS adaptator stuff, nobody listens on font bus for now and it’s buggy 2007-12-01 09:43 oeildepierre * TODO, src/listdockwidget.cpp, src/listdockwidget.h, src/listsdock.ui, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/src.pro, src/typotek.cpp, src/typotek.h: fontmatrix: CHANGED Left panel is now a QDockWidget, which gives much more control to the user 2007-11-30 23:30 oeildepierre * TODO, src/messages/help.html: fontmatrix: UPDATED todo & help 2007-11-30 14:43 oeildepierre * src/fmpreviewlist.cpp: fontmatrix: FIXED previews list displacement when select item 2007-11-30 14:40 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp: fontmatrix: IMPROVED UI gray out Initial letter background in names list 2007-11-30 10:43 oeildepierre * src/mainview.ui: fontmatrix: CLEAN UP 2007-11-30 09:23 oeildepierre * src/mainview.ui, src/typotek.cpp, src/typotek.h: fontmatrix: ADDED DragAndDrop to import files into Fontmatrix - http://www.fontmatrix.net/multimedia/fm_dnd.ogg 2007-11-29 21:40 oeildepierre * src/fmpreviewlist.cpp, src/fontitem.cpp, src/mainviewwidget.cpp: fontmatrix: FIXED At least I hope it is fixed ;-) https://gna.org/bugs/?10407 2007-11-29 14:53 oeildepierre * src/fontitem.cpp, src/fontitem.h: fontmatrix: FIXED hmm, we can call it a workaround! https://gna.org/bugs/?10409 2007-11-28 22:08 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: fontmatrix: FIXED some ugliness 2007-11-28 20:14 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp: fontmatrix: ADDED beginning of a "fit to view" for glyphs View tab 2007-11-28 15:26 oeildepierre * src/dataloader.cpp, src/fmglyphsview.cpp, src/fmglyphsview.h, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/src.pro, src/typotek.cpp, src/typotek.h: fontmatrix: CLEAN UP 2007-11-28 09:12 oeildepierre * src/importedfonts.ui, src/importedfontsdialog.cpp, src/importedfontsdialog.h, src/mainviewwidget.cpp, src/src.pro, src/typotek.cpp: fontmatrix: ADDED A dialog that list what fonts have been imported 2007-11-28 08:35 oeildepierre * src/mainviewwidget.h, src/typotek.cpp, src/typotek.h: fontmatrix: ADDED Finally, here is the "open in Fontforge" button! 2007-11-28 07:19 oeildepierre * src/fontitem.cpp, src/mainviewwidget.cpp: fontmatrix: FIXED https://gna.org/bugs/?10408 2007-11-27 12:20 oeildepierre * src/mainview.ui: fontmatrix WORKAROUND https://gna.org/bugs/?10396 It has to be port to Fontmatrix002 2007-11-27 12:18 oeildepierre * src/fontitem.cpp: fontmatrix WORKAROUND/FIXED A symbol encoded font (code39.ttf) gave me the first crash of FontItem::renderLine() 2007-11-26 09:51 oeildepierre * INSTALL: fontmatrix: port new INSTALL file from fontmatrix002 branch 2007-11-26 09:41 oeildepierre * src/typotek.cpp: fontmatrix: FIXED failed when there was no ~/.fonts.conf file. 2007-11-26 00:20 oeildepierre * src/fmpreviewlist.cpp: fontmatrix: FIXED give initial size to the preview list scene was a bad idea, revert to an unitialized scene. 2007-11-25 22:21 oeildepierre * src/fmpreviewlist.cpp, src/messages/help.html, src/tagset.ui: fontmatrix: FIXED cosmetics before branching as 0.2 2007-11-25 21:54 vlada * src/messages/about.html, src/messages/help.html: UPDATEED: about text and Fontmatrix help 2007-11-25 21:50 oeildepierre * src/tagset.ui, src/tagseteditor.cpp, src/tagseteditor.h, src/typotek.cpp, src/typotek.h: fontmatrix: ADDED can delete tagsets 2007-11-25 20:33 oeildepierre * src/dataloader.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/savedata.cpp, src/src.pro, src/typotek.h: fontmatrix: ADDED save sample text 2007-11-25 18:36 vlada * src/fileopen.xpm, src/filesave.xpm, src/zoom.png: REMOVED: unnecessary (obsolete) icons 2007-11-25 17:23 vlada * src/about.ui, src/application.qrc, src/graphic-resources/about-graphic.png, src/graphic-resources/about-vectors.svg, src/graphic-resources/font-sampletext.png, src/graphic-resources/fontmatrix-AA.xcf, src/graphic-resources/fontmatrix-fontbookexport-icon.png, src/graphic-resources/fontmatrix-import-icon.png, src/graphic-resources/fontmatrix-tagseteditor-icon.png, src/graphic-resources/fontmatrix-zoom.xcf, src/icons/application-fontbookexport-small.svg, src/icons/application-import-small.svg, src/icons/application-tagseteditor-small.svg, src/icons/application-tagseteditor.svg, src/icons/font-glyph.svg, src/icons/font-info.svg, src/icons/font-search.svg, src/icons/font-smpletext.svg, src/icons/font-tag.svg, src/mainview.ui, src/typotek.cpp: ADDED: Huge amount of graphic (final and sources in .svg and .xcf format) CHANGED: A few statusbar messages About screen graphic etc. 2007-11-25 16:15 oeildepierre * src/fmpreviewlist.cpp, src/fmpreviewlist.h, src/mainviewwidget.cpp: fontmatrix: IMPROVED stability and visual 2007-11-25 14:13 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp, src/typotek.cpp, src/typotek.h: fontmatrix: FIXED usability 2007-11-25 13:11 oeildepierre * src/messages/about.html: more text 2007-11-25 13:01 oeildepierre * src/about.ui, src/application.qrc, src/help.ui, src/helpwidget.cpp, src/helpwidget.h, src/mainview.ui, src/messages/help.html, src/src.pro, src/typotek.cpp, src/typotek.h: fontmatrix: ADDED A help dialog 2007-11-25 10:49 oeildepierre * src/messages, src/messages/about.html, src/messages/about_fr.html: fontmatrix: ADDED first step to a custom about dialog... 2007-11-25 10:48 oeildepierre * src/about.ui, src/aboutwidget.cpp, src/aboutwidget.h, src/application.qrc, src/fontitem.cpp, src/messages, src/qrc_application.cpp, src/src.pro, src/typotek.cpp: fontmatrix: ADDED first step to a custom about dialog 2007-11-24 20:26 vlada * src/typotek.cpp: CHANGED: Actually make use of new menu icon 2007-11-24 20:16 vlada * fontmatrix.desktop, src/application.qrc, src/graphic-resources/fontmatrix-tagseteditor-icon.png, src/mainview.ui, src/qrc_application.cpp, src/tagset.ui: COSMETICS: various 2007-11-24 18:12 oeildepierre * src/tagset.ui, src/typotek.cpp: fontmatrix: OUPS didn’t saw the tagset editor icon, it’s in now 2007-11-24 18:04 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/qrc_application.cpp: fontmatrix: FIXED ui issue in glyphs view (raised by Vlada, thanks to him) 2007-11-24 17:44 vlada * src/application.qrc, src/graphic-resources/font-glyph.png, src/graphic-resources/fontmatrix-AA.png, src/graphic-resources/fontmatrix-tagseteditor.png, src/graphic-resources/fontmatrix-zoom.png, src/mainview.ui: ADDED: more icons and eye-candy stuff 2007-11-24 16:51 oeildepierre * src/mainviewwidget.cpp, src/typotek.cpp: fontmatrix: ADDED Fontmatrix word in window title 2007-11-24 15:41 oeildepierre * src/mainviewwidget.cpp, src/qrc_application.cpp, src/typotek.cpp, src/typotek.h: fontmatrix: COME BACK activate all & deactivate all are now under "Edit" menu entry. 2007-11-24 14:34 oeildepierre * src/fontactionwidget.cpp, src/mainview.ui, src/qrc_application.cpp: fontmatrix: Vlada’s icon set integrated. 2007-11-24 14:23 vlada * src/application.qrc, src/graphic-resources/font-glyph.png, src/graphic-resources/font-info.png, src/graphic-resources/font-tag.png: ADDED: font-info, font-glyph, and font-tag icons CHANGED: application.qrc to respect these new icons 2007-11-24 14:19 oeildepierre * src/fontactionwidget.cpp, src/fontactionwidget.h, src/fontitem.cpp: fontmatrix: ADDED Contextual menu in tags list so you can add or remove it from a tagset here 2007-11-23 16:34 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp: fontmatrix: ADDED In glyphs view, codepoints. 2007-11-22 19:59 oeildepierre * src/fmpreviewlist.cpp, src/fmpreviewlist.h, src/mainviewwidget.cpp: fontmatrix: FIXED in preview list, scrolling slow down when you moved slider "allegro" 2007-11-22 13:32 oeildepierre * src/fmpreviewlist.cpp, src/fmpreviewlist.h, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp, src/typotek.h: fontmatrix: ADDED fontnames list and font previews list selected items are now synced ADDED Switch between names and previews with CTRL+SPACE 2007-11-21 16:16 oeildepierre * src/fontitem.cpp, src/mainview.ui, src/mainviewwidget.cpp: fontmatrix: FIXED some ugliness 2007-11-21 16:09 oeildepierre * src/fmpreviewlist.cpp, src/fmpreviewlist.h, src/fontitem.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/src.pro: fontmatrix: ADDED A dedicated list widget for preview (still experimental) 2007-11-21 01:20 oeildepierre * src/mainviewwidget.cpp: fontmatrix: FIXED I forgot Roman in prefered variant list 2007-11-21 01:10 oeildepierre * TODO, src, src/dataloader.cpp, src/fontitem.cpp, src/fontitem.h, src/main.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/typotek.cpp: fontmatrix: ADDED View codepoint in codepoint field 2007-11-20 02:31 vlada * TODO, fontmatrix.desktop, fontmatrix.png, src/src.pro: ADDING & CHANGING: still struggling with .desktop to appear in menu 2007-11-19 14:42 oeildepierre * src/fontitem.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/qrc_application.cpp: fontmatrix: EXPERIENCES ui 2007-11-19 13:11 vlada * fontmatrix.desktop, src/src.pro, typotek.desktop: ADDED: fontmatrix.desktop and changed src.pro accordingly REMOVED: typotek.desktop 2007-11-19 11:56 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h: fontmatrix: ADDED View glyphs by lang block 2007-11-16 14:15 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/savedata.cpp: fontmatrix: CHANGED FT_Faces are now loaded "on-demand" 2007-11-16 00:14 oeildepierre * TODO, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/savedata.cpp, src/typotek.cpp: fontmatrix: CHANGED mainview widget IMPROVED performance 2007-11-15 19:06 oeildepierre * src/main.cpp: fontmatrix: FIXED non-compile last commit 2007-11-15 13:58 oeildepierre * src/main.cpp: fontmatrix: CHANGED splashscreen becomes optional ("splash" command line option) 2007-11-14 20:35 oeildepierre * src/fmsampletextview.cpp, src/fmsampletextview.h, src/mainviewwidget.cpp: fontmatrix: ADDED rubberband in fontsample view 2007-11-14 14:35 oeildepierre * src/fmsampletextview.cpp, src/main.cpp, src/mainviewwidget.cpp, src/typotek.cpp: fontmatrix: FIXED performance issue with splashscreen - 2007-11-14 13:26 oeildepierre * src/main.cpp, src/mainview.ui: fontmatrix: TRYING Alpha blended splashscreen 2007-11-14 12:09 oeildepierre * src/main.cpp, src/mainview.ui, src/mainviewwidget.cpp: fontmatrix: CHANGED disable zoom when "fit in view" is checked 2007-11-14 11:48 oeildepierre * src/fmsampletextview.cpp, src/fmsampletextview.h, src/fontitem.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/qrc_application.cpp, src/src.pro, src/typotek.cpp: fontmatrix: FIXED In fit view mode, view was not scaled when widget was resized 2007-11-14 10:34 oeildepierre * src/mainview.ui: fontmatrix: CHANGED toolbox into tabwidget. QtDesigner is really terrific! 2007-11-14 10:22 oeildepierre * src/fontitem.cpp: fontmatrix: FIXED Font info presentation 2007-11-14 09:43 oeildepierre * src/dataloader.cpp, src/main.cpp, src/typotek.cpp, src/typotek.h: fontmatrix: ADDED one or two things about splashscreen 2007-11-14 00:01 oeildepierre * src/application.qrc, src/fontitem.cpp, src/main.cpp, src/qrc_application.cpp: fontmatrix: FIXED out of range name_id FIXED graphic ressource path issue 2007-11-13 23:12 vlada * src/editcopy.xpm, src/editcut.xpm, src/editpaste.xpm, src/filenew.xpm, src/fontmatrix.png, src/typotek.png: CLEANUP: Removed some unused icons and old application icons as well. 2007-11-13 22:31 vlada * src/graphic-resources/fontmatrix_splashscreen.png, src/graphic-resources/splashscreen-670x470.png, src/graphic-resources/splashscreen-vectors.svg: urgh 2007-11-13 22:23 vlada * src/fontmatrix_splashscreen.png, src/graphic-resources, src/icons/application-fontmatrix-vectors.svg, src/icons/application-fontmatrix_128.png, src/icons/application-fontmatrix_16.png, src/icons/application-fontmatrix_22.png, src/icons/application-fontmatrix_32.png, src/icons/application-fontmatrix_48.png, src/icons/application-fontmatrix_64.png, src/icons/fontmatrix128.png, src/icons/fontmatrix16.png, src/icons/fontmatrix22.png, src/icons/fontmatrix32.png, src/icons/fontmatrix48.png, src/icons/fontmatrix64.png: RENAMING & ADDING: Renaming icons closer to the standards and commiting new splash. 2007-11-12 17:39 oeildepierre * src/application.qrc, src/fontmatrix_splashscreen.png, src/main.cpp, src/qrc_application.cpp, src/typotek.cpp, src/typotek.h: fontmatrix: ADDED splashscreen 2007-11-12 09:14 oeildepierre * src/fontitem.cpp: fontmatrix: IMPROVED aesthetic 2007-11-11 15:48 vlada * src/icons, src/icons/fontmatrix128.png, src/icons/fontmatrix16.png, src/icons/fontmatrix22.png, src/icons/fontmatrix32.png, src/icons/fontmatrix48.png, src/icons/fontmatrix64.png: Somehow I've managed not to commit actual icons. Second try! 2007-11-10 22:13 vlada * src/qrc_application.cpp: Icons - manualy tweaked and brand new. My very first svn commit ever (hopefuly it'll work) :) 2007-11-09 22:32 oeildepierre * typotek.spec: 2007-11-07 23:08 oeildepierre * src/dataloader.cpp, src/typotek.cpp: fontmatrix: FIXED handling of empty tags REPLACED about message 2007-11-07 14:49 oeildepierre * src/bookexport.ui, src/fontactionwidget.cpp, src/fontbookdialog.cpp, src/fontbookdialog.h, src/fontitem.cpp, src/main.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/qrc_application.cpp, src/savedata.cpp, src/typotek.cpp, src/typotek.h: fontmatrix: some ui improvements 2007-11-07 08:41 oeildepierre * src/mainviewwidget.cpp, src/savedata.cpp, src/tagset.ui, src/tagseteditor.cpp, src/typotek.h: fontmatrix: FIXED tagsets 2007-11-07 00:36 oeildepierre * src/mainviewwidget.cpp, src/savedata.cpp, src/tagset.ui, src/tagseteditor.cpp, src/tagseteditor.h, src/typotek.h: fontmatrix : ADDED remove tags in tagsets & various fixes 2007-11-06 23:34 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainview.ui: fontmatrix : ADDED more info from fonts 2007-11-06 16:14 oeildepierre * src/application.qrc, src/fontmatrix.png, src/main.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/qrc_application.cpp, src/src.pro, src/typotek.cpp, src/typotekadaptator.h: typotek renamed in fontmatrix 2007-11-06 00:48 oeildepierre * src/typotek.cpp: typotek : FIXED paths issue 2007-11-06 00:10 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/main.cpp, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp, src/typotek.h: typotek : FIXED preview. family is represented by an icon of the letter "a", font by a backround 2007-11-05 19:51 oeildepierre * src/typotek.cpp: typotek : ADDED qdebug fontload 2007-11-05 17:14 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/src.pro: typotek : IMPROVED preview 2007-11-03 21:37 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp, src/qrc_application.cpp: typotek : IMPROVED ui 2007-11-02 22:48 oeildepierre * src/fontitem.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: typotek : ADDED Antialias switch button FIXED Afm are now properly handled 2007-11-01 22:34 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp: typotek : ADDED codepoint access in all view 2007-11-01 14:19 oeildepierre * src/mainviewwidget.cpp, src/typotek.cpp, src/typotek.h: typotek : WARNING IMPROVED Fontconfig integration ;-) Fonts are activated in ~/.fonts-managed directory and this directory is added as a dir element in ~/.fonts.conf 2007-10-31 08:39 oeildepierre * src/savedata.cpp, src/savedata.h, src/src.pro, src/typotek.cpp: typotek : ADDED dedicated savedata class 2007-10-30 15:41 oeildepierre * src/fontactionwidget.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/tagseteditor.cpp, src/tagseteditor.h, src/typotek.cpp, src/typotek.h: typotek : IMPROVED Tagsets, the end? ;-) 2007-10-29 18:00 oeildepierre * src/dataloader.cpp, src/dataloader.h, src/fontaction.ui, src/fontactionwidget.cpp, src/fontactionwidget.h, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/qrc_application.cpp, src/src.pro, src/tagset.ui, src/tagseteditor.cpp, src/tagseteditor.h, src/typotek.cpp, src/typotek.h: typotek : WARNING (1) ADDED TagSets, the begining & changed file format. (1) File format has changed, so your previous install won't work with this new version 2007-10-26 09:40 oeildepierre * src/fontbookdialog.cpp, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/typotek.cpp: typotek : IMPROVED including various improvements inpired by Vlada (thanks to him) 2007-10-25 20:49 oeildepierre * src/fontbookdialog.cpp, src/fontitem.h, src/typotek.cpp: typotek : IMPROVED fontbook 2007-10-24 22:06 oeildepierre * src/mainviewwidget.cpp, src/mainviewwidget.h, src/qrc_application.cpp, src/typotek.cpp, src/typotek.h: *typotek ADDED tag at import 2007-10-24 21:36 oeildepierre * src/fontactionwidget.cpp, src/fontitem.cpp, src/typotek.cpp: *typotek FIXED crash 2007-10-24 21:00 oeildepierre * src/fontaction.ui, src/fontactionwidget.cpp: *typotek divers 2007-10-24 20:50 oeildepierre * src/fontactionwidget.cpp, src/qrc_application.cpp, src/src.pro, typotek.desktop, typotek.spec: *typotek divers 2007-10-24 14:33 oeildepierre * src/bookexport.ui, src/fontbookdialog.cpp, src/fontbookdialog.h, src/fontitem.cpp, src/qrc_application.cpp, src/typotek.cpp, src/typotek.h: typotek : ADDED fontbook preview 2007-10-24 10:50 oeildepierre * src, src/qrc_application.cpp, src/src.pro: cleaning 2007-10-23 23:51 oeildepierre * INSTALL: typotek : ADDED details in INSTALL 2007-10-23 23:14 oeildepierre * src/typotek.cpp: typotek : IMPROVED fontbook 2007-10-23 23:05 oeildepierre * src/fontbookdialog.cpp, src/fontbookdialog.h, src/typotek.cpp: typotek : IMPROVED fontbook 2007-10-23 21:49 oeildepierre * src, src/ui_fontaction.h, src/ui_mainview.h: cleaning 2007-10-23 21:45 oeildepierre * src/bookexport.ui, src/fontbookdialog.cpp, src/fontbookdialog.h, src/qrc_application.cpp, src/src.pro, src/typotek.cpp, src/ui_fontaction.h, src/ui_mainview.h: typotek : IMPROVED fontbook 2007-10-23 12:54 oeildepierre * src/typotek.cpp: typotek : IMPROVED fontbook 2007-10-23 12:26 oeildepierre * src/typotek.cpp: typotek : IMPROVED fontbook 2007-10-22 22:38 oeildepierre * src/typotek.cpp: typotek : IMPROVED fontbook 2007-10-22 22:17 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/qrc_application.cpp, src/src.pro, src/typotek.cpp, src/typotek.h, src/ui_fontaction.h, src/ui_mainview.h: typotek : ADDED fontbook 2007-10-19 20:21 oeildepierre * src/mainviewwidget.cpp: typotek : FIXED sample text 2007-10-19 13:10 oeildepierre * src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/mainviewwidget.h: typotek : ADDED fontsize choice in sample text box 2007-10-19 10:52 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp, src/typotek.cpp, src/ui_mainview.h: typotek : FIXED ui 2007-10-18 16:00 oeildepierre * src/fontaction.ui, src/fontactionwidget.cpp, src/fontitem.cpp, src/fontitem.h, src/mainviewwidget.cpp, src/mainviewwidget.h, src/typotek.cpp, src/typotekadaptator.cpp, src/typotekadaptator.h, src/ui_fontaction.h: typotek : FIXED too much to say 2007-10-18 11:27 oeildepierre * src/application.qrc, src/fontactionwidget.cpp, src/fontitem.cpp, src/fontitem.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/qrc_application.cpp, src/typotek.cpp, src/typotek.h, src/ui_fontaction.h, src/ui_mainview.h, src/zoom.png: typotek : ADDED render is done in vector mode, print, icons ... 2007-10-17 18:56 oeildepierre * src: cleaning 2007-10-17 18:54 oeildepierre * src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/ui_mainview.h: typotek : ADDED Vladimir Savic UI improvements 2007-10-17 09:52 oeildepierre * src/application.qrc, src/fontactionwidget.cpp, src/fontactionwidget.h, src/fontitem.cpp, src/main.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/qrc_application.cpp, src/typotek.cpp, src/typotek.png, src/ui_fontaction.h, src/ui_mainview.h: typotek : FIXED cosmetic 2007-10-17 00:10 oeildepierre * src/fontaction.ui, src/fontactionwidget.cpp, src/fontactionwidget.h, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/qrc_application.cpp, src/src.pro, src/typotek.cpp, src/typotekadaptator.cpp, src/typotekadaptator.h, src/ui_fontaction.h, src/ui_mainview.h: typotek : UI improvements from Vlada's ideas 2007-10-16 12:17 oeildepierre * src/fontitem.cpp, src/typotek.cpp, src/typotek.h, src/typotekadaptator.cpp, src/typotekadaptator.h: typotek : ADDED lock & unlock over dbus 2007-10-16 12:02 oeildepierre * ., src, src/fontactionwidget.cpp, src/fontactionwidget.h, src/mainviewwidget.cpp, src/qrc_application.cpp, src/src.pro, src/typotek.cpp, src/typotek.h, src/typotekadaptator.cpp, src/typotekadaptator.h, src/ui_fontaction.h, src/ui_mainview.h: typotek : ADDED dbus 2007-10-16 07:41 oeildepierre * src/moc_mainviewwidget.cpp: cleaning 2007-10-16 07:40 oeildepierre * src, src/moc_mainviewwidget.cpp: 2007-10-16 07:40 oeildepierre * INSTALL: typotek : ADDED install file 2007-10-15 21:36 oeildepierre * Makefile: cleaning 2007-10-15 21:34 oeildepierre * ., COPYING, Makefile, src, src/ReadMe, src/application.qrc, src/editcopy.xpm, src/editcut.xpm, src/editpaste.xpm, src/filenew.xpm, src/fileopen.xpm, src/filesave.xpm, src/fontaction.ui, src/fontactionwidget.cpp, src/fontactionwidget.h, src/fontitem.cpp, src/fontitem.h, src/main.cpp, src/mainview.ui, src/mainviewwidget.cpp, src/mainviewwidget.h, src/qrc_application.cpp, src/src.pro, src/typotek.cpp, src/typotek.h, src/ui_fontaction.h, src/ui_mainview.h, typotek.pro: Initial commit of tools/typotek fontmatrix-0.6.0+svn20110930/COPYING0000644000175000017500000004313110704756373015401 0ustar malexmalex GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 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. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, 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 or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's 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 give any other recipients of the Program a copy of this License along with the Program. 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 Program or any portion of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, 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 Program, 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 Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) 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; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, 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 executable. However, as a special exception, the source code 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. If distribution of executable or 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 counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. 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 Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program 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 to this License. 7. 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 Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program 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 Program. 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. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program 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. 9. The Free Software Foundation may publish revised and/or new versions of the 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 Program 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 Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, 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 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 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 Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. 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. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; 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. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. fontmatrix-0.6.0+svn20110930/pythonqt/0000755000175000017500000000000011641435631016222 5ustar malexmalexfontmatrix-0.6.0+svn20110930/pythonqt/src/0000755000175000017500000000000011641435631017011 5ustar malexmalexfontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtObjectPtr.cpp0000644000175000017500000000557411145517421023130 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtObjectPtr.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include QVariant PythonQtObjectPtr::evalScript(const QString& script, int start) { return PythonQt::self()->evalScript(_object, script, start); } void PythonQtObjectPtr::evalFile(const QString& file) { PythonQt::self()->evalFile(_object, file); } QVariant PythonQtObjectPtr::evalCode(PyObject* pycode) { return PythonQt::self()->evalCode(_object, pycode); } void PythonQtObjectPtr::addObject(const QString& name, QObject* object) { PythonQt::self()->addObject(_object, name, object); } void PythonQtObjectPtr::addVariable(const QString& name, const QVariant& v) { PythonQt::self()->addVariable(_object, name, v); } void PythonQtObjectPtr::removeVariable(const QString& name) { PythonQt::self()->removeVariable(_object, name); } QVariant PythonQtObjectPtr::getVariable(const QString& name) { return PythonQt::self()->getVariable(_object, name); } QVariant PythonQtObjectPtr::call(const QString& callable, const QVariantList& args) { return PythonQt::self()->call(_object, callable, args); } bool PythonQtObjectPtr::fromVariant(const QVariant& variant) { if (!variant.isNull()) { setObject(qVariantValue(variant)); return true; } else { setObject(0); return false; } } fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtVariantWrapper.h0000644000175000017500000000424511145517421023640 0ustar malexmalex#ifndef _PYTHONQTVARIANTWRAPPER_H #define _PYTHONQTVARIANTWRAPPER_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtVariantWrapper.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include #include "structmember.h" #include "methodobject.h" #include "compile.h" #include "eval.h" #include extern PyTypeObject PythonQtVariantWrapper_Type; class PythonQtClassInfo; //--------------------------------------------------------------- //! a Python wrapper object for Qt variants typedef struct { PyObject_HEAD QVariant* _variant; PythonQtClassInfo* _info; QObject* _wrapper; } PythonQtVariantWrapper; #endif fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtImporter.h0000644000175000017500000001060411145517421022470 0ustar malexmalex#ifndef _PYTHONQTIMPORTER_ #define _PYTHONQTIMPORTER_ /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtImporter.h // \author Florian Link // \author Last changed by $Author: stk $ // \date 2004-06 */ //---------------------------------------------------------------------------------- #include "Python.h" #include "structmember.h" #include "osdefs.h" #include "marshal.h" #include "compile.h" #include #include #include //! defines a python object that stores a Qt slot info typedef struct _PythonQtImporter { PyObject_HEAD QString* _path; } PythonQtImporter; //! implements importing of python files into PythonQt /*! also compiles/marshalls/unmarshalls py/pyc files and handles time stamps correctly */ class PythonQtImport { public: enum module_info { MI_ERROR, MI_NOT_FOUND, MI_MODULE, MI_PACKAGE }; //! initialize static void init(); //! writes the python code to disk, marshalling and writing the time stamp static void writeCompiledModule(PyCodeObject *co, const QString& filename, long mtime); /*! Given the contents of a .py[co] file in a buffer, unmarshal the data and return the code object. Return None if it the magic word doesn't match (we do this instead of raising an exception as we fall back to .py if available and we don't want to mask other errors). Returns a new reference. */ static PyObject *unmarshalCode(const QString& path, const QByteArray& data, time_t mtime); //! Given a string buffer containing Python source code, compile it //! return and return a code object as a new reference. static PyObject *compileSource(const QString& path, const QByteArray& data); //! Return the code object for the module named by 'fullname' from the //! Zip archive as a new reference. static PyObject *getCodeFromData(const QString& path, int isbytecode = 0, int ispackage = 0, time_t mtime = 0); //! Get the code object associated with the module specified by //! 'fullname'. static PyObject * getModuleCode(PythonQtImporter *self, char *fullname, int *p_ispackage, QString& modpath); //! gets the compiled code for the given *.py file if there is a valid pyc file, otherwise compiles the file and writes the pyc static PyObject* getCodeFromPyc(const QString& file); //! Return if module exists and is a package or a module static module_info getModuleInfo(PythonQtImporter* self, const QString& fullname); //! get the last name of a dot chain (first.second.last) static QString getSubName(const QString& str); //! Given a buffer, return the long that is represented by the first //! 4 bytes, encoded as little endian. This partially reimplements //! marshal.c:r_long() static long getLong(unsigned char *buf); //! get time stamp of file static time_t getMTimeOfSource(const QString& path); //! replace extension of file static QString replaceExtension(const QString& str, const QString& ext); }; #endif fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtVariantWrapper.cpp0000644000175000017500000002214411145517421024171 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtVariantWrapper.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQtVariantWrapper.h" #include #include #include #include #include "PythonQt.h" #include "PythonQtSlot.h" #include "PythonQtClassInfo.h" #include "PythonQtConversion.h" static void PythonQtVariantWrapper_dealloc(PythonQtVariantWrapper* self) { if (self->_variant) { delete self->_variant; self->_variant = NULL; } self->ob_type->tp_free((PyObject*)self); } static PyObject* PythonQtVariantWrapper_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PythonQtVariantWrapper *self; self = (PythonQtVariantWrapper *)type->tp_alloc(type, 0); if (self != NULL) { self->_variant = new QVariant(); self->_info = NULL; } return (PyObject *)self; } static int PythonQtVariantWrapper_init(PythonQtVariantWrapper *self, PyObject *args, PyObject *kwds) { return 0; } static PyObject *PythonQtVariantWrapper_classname(PythonQtVariantWrapper* type) { return PyString_FromString(type->_info->className()); } static PyObject *PythonQtVariantWrapper_help(PythonQtVariantWrapper* type) { return PythonQt::self()->helpCalled(type->_info); } static PyMethodDef PythonQtVariantWrapper_methods[] = { {"className", (PyCFunction)PythonQtVariantWrapper_classname, METH_NOARGS, "Return the classname of the object" }, {"help", (PyCFunction)PythonQtVariantWrapper_help, METH_NOARGS, "Shows the help of available methods for this class" }, {NULL} /* Sentinel */ }; static PyObject *PythonQtVariantWrapper_getattro(PyObject *obj,PyObject *name) { const char *attributeName; PythonQtVariantWrapper *wt = (PythonQtVariantWrapper *)obj; if ((attributeName = PyString_AsString(name)) == NULL) { return NULL; } if (wt->_wrapper && wt->_info) { PythonQtMemberInfo member = wt->_info->member(attributeName); if (member._type == PythonQtMemberInfo::Slot) { return PythonQtSlotFunction_New(member._slot, obj, NULL); } else if (member._type == PythonQtMemberInfo::EnumValue) { return PyInt_FromLong(member._enumValue); } } // look for the interal methods (className(), help()) PyObject* internalMethod = Py_FindMethod( PythonQtVariantWrapper_methods, obj, (char*)attributeName); if (internalMethod) { return internalMethod; } PyErr_Clear(); if (qstrcmp(attributeName, "__dict__")==0) { QStringList l = wt->_info->memberList(false); PyObject* dict = PyDict_New(); foreach (QString name, l) { //PyObject* o = PyObject_GetAttrString(obj, name.toLatin1().data()); PyDict_SetItemString(dict, name.toLatin1().data(), Py_None); //Py_DECREF(o); } return dict; } QString error = QString(wt->_variant->typeName()) + " has no attribute named '" + QString(attributeName) + "'"; PyErr_SetString(PyExc_AttributeError, error.toLatin1().data()); return NULL; } QString qVariantToString(const QVariant& v) { QString r; switch (v.type()) { case QVariant::Size: r = QString::number(v.toSize().width()) + ", " + QString::number(v.toSize().height()); break; case QVariant::SizeF: r = QString::number(v.toSizeF().width()) + ", " + QString::number(v.toSizeF().height()); break; case QVariant::Point: r = QString::number(v.toPoint().x()) + ", " + QString::number(v.toPoint().y()); break; case QVariant::PointF: r = QString::number(v.toPointF().x()) + ", " + QString::number(v.toPointF().y()); break; case QVariant::Rect: r = QString::number(v.toRect().x()) + ", " + QString::number(v.toRect().y()); r += ", " + QString::number(v.toRect().width()) + ", " + QString::number(v.toRect().height()); break; case QVariant::RectF: r = QString::number(v.toRectF().x()) + ", " + QString::number(v.toRectF().y()); r += ", " + QString::number(v.toRectF().width()) + ", " + QString::number(v.toRectF().height()); break; case QVariant::Date: r = v.toDate().toString(Qt::ISODate); break; case QVariant::DateTime: r = v.toDateTime().toString(Qt::ISODate); break; case QVariant::Time: r = v.toTime().toString(Qt::ISODate); break; case QVariant::Pixmap: { QPixmap p = qvariant_cast(v); r = QString("Pixmap ") + QString::number(p.width()) + ", " + QString::number(p.height()); } break; case QVariant::Image: { QImage img = qvariant_cast(v); r = QString("Image ") + QString::number(img.width()) + ", " + QString::number(img.height()); } break; //TODO: add more printing for other variant types default: r = v.toString(); } return r; } static PyObject * PythonQtVariantWrapper_str(PyObject * obj) { PythonQtVariantWrapper* wt = (PythonQtVariantWrapper*)obj; QString val = qVariantToString(*wt->_variant); if (val.isEmpty()) { val = wt->_variant->typeName(); } return PyString_FromFormat("%s", val.toLatin1().constData()); } static PyObject * PythonQtVariantWrapper_repr(PyObject * obj) { PythonQtVariantWrapper* wt = (PythonQtVariantWrapper*)obj; QString val = qVariantToString(*wt->_variant); return PyString_FromFormat("%s(%s)", wt->_variant->typeName(), val.toLatin1().constData()); } static int PythonQtVariantWrapper_compare(PyObject * obj1, PyObject * obj2) { if (obj1->ob_type == &PythonQtVariantWrapper_Type && obj2->ob_type == &PythonQtVariantWrapper_Type) { PythonQtVariantWrapper* w1 = (PythonQtVariantWrapper*)obj1; PythonQtVariantWrapper* w2 = (PythonQtVariantWrapper*)obj2; if (*w1->_variant == *w2->_variant) { return 0; } else { return -1; } } else { return -1; } } PyTypeObject PythonQtVariantWrapper_Type = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "PythonQt.PythonQtVariantWrapper", /*tp_name*/ sizeof(PythonQtVariantWrapper), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)PythonQtVariantWrapper_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ PythonQtVariantWrapper_compare, /*tp_compare*/ PythonQtVariantWrapper_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ PythonQtVariantWrapper_str, /*tp_str*/ PythonQtVariantWrapper_getattro, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ "PythonQtVariantWrapper object", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)PythonQtVariantWrapper_init, /* tp_init */ 0, /* tp_alloc */ PythonQtVariantWrapper_new, /* tp_new */ }; //------------------------------------------------------- fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtImportFileInterface.h0000644000175000017500000000503711145517421024566 0ustar malexmalex#ifndef _PYTHONQTIMPORTFILEINTERFACE_H #define _PYTHONQTIMPORTFILEINTERFACE_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtImportFileInterface.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include #include #include //! Defines an abstract interface to file access for the Python import statement. //! see PythonQt::setImporter() class PythonQtImportFileInterface { public: //! read the given file as byte array, without doing any linefeed translations virtual QByteArray readFileAsBytes(const QString& filename) = 0; //! read a source file, expects a readable Python text file with translated line feeds. //! If the file can not be load OR it can not be verified, ok is set to false virtual QByteArray readSourceFile(const QString& filename, bool& ok) = 0; //! returns if the file exists virtual bool exists(const QString& filename) = 0; //! get the last modified data of a file virtual QDateTime lastModifiedDate(const QString& filename) = 0; }; #endiffontmatrix-0.6.0+svn20110930/pythonqt/src/wrapper/0000755000175000017500000000000011641435631020471 5ustar malexmalexfontmatrix-0.6.0+svn20110930/pythonqt/src/wrapper/PythonQtWrappedVariants.h0000644000175000017500000042070111145517421025464 0ustar malexmalex #include #include #include #include /**************************************************************************** ** Meta object code from reading C++ file 'qbitarray.h' ** ** Created: Thu 12. Apr 14:07:28 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qbitarray.h" class PythonQtQBitArrayWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QBitArray() { return QBitArray(); } QVariant new_QBitArray(int arg0,bool arg1) { return QBitArray(arg0,arg1); } QVariant new_QBitArray(int arg0) { return QBitArray(arg0); } QVariant new_QBitArray(const QBitArray & arg0) { return QBitArray(arg0); } int size(QBitArray* obj) const {return obj->size(); } int count(QBitArray* obj) const {return obj->count(); } int count(QBitArray* obj,bool arg0) const {return obj->count(arg0); } bool isEmpty(QBitArray* obj) const {return obj->isEmpty(); } bool isNull(QBitArray* obj) const {return obj->isNull(); } void resize(QBitArray* obj,int arg0) {obj->resize(arg0); } void detach(QBitArray* obj) {obj->detach(); } bool isDetached(QBitArray* obj) const {return obj->isDetached(); } void clear(QBitArray* obj) {obj->clear(); } bool testBit(QBitArray* obj,int arg0) const {return obj->testBit(arg0); } void setBit(QBitArray* obj,int arg0) {obj->setBit(arg0); } void setBit(QBitArray* obj,int arg0,bool arg1) {obj->setBit(arg0,arg1); } void clearBit(QBitArray* obj,int arg0) {obj->clearBit(arg0); } bool toggleBit(QBitArray* obj,int arg0) {return obj->toggleBit(arg0); } bool at(QBitArray* obj,int arg0) const {return obj->at(arg0); } bool fill(QBitArray* obj,bool arg0,int arg1) {return obj->fill(arg0,arg1); } bool fill(QBitArray* obj,bool arg0) {return obj->fill(arg0); } void fill(QBitArray* obj,bool arg0,int arg1,int arg2) {obj->fill(arg0,arg1,arg2); } void truncate(QBitArray* obj,int arg0) {obj->truncate(arg0); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qdatetime.h' ** ** Created: Thu 12. Apr 14:07:28 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qdatetime.h" class PythonQtQDateWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QDate() { return QDate(); } QVariant new_QDate(int arg0,int arg1,int arg2) { return QDate(arg0,arg1,arg2); } bool isNull(QDate* obj) const {return obj->isNull(); } bool isValid(QDate* obj) const {return obj->isValid(); } int year(QDate* obj) const {return obj->year(); } int month(QDate* obj) const {return obj->month(); } int day(QDate* obj) const {return obj->day(); } int dayOfWeek(QDate* obj) const {return obj->dayOfWeek(); } int dayOfYear(QDate* obj) const {return obj->dayOfYear(); } int daysInMonth(QDate* obj) const {return obj->daysInMonth(); } int daysInYear(QDate* obj) const {return obj->daysInYear(); } int weekNumber(QDate* obj,int * arg0) const {return obj->weekNumber(arg0); } int weekNumber(QDate* obj) const {return obj->weekNumber(); } QString static_QDate_shortMonthName(int arg0) {return QDate::shortMonthName(arg0); } QString static_QDate_shortDayName(int arg0) {return QDate::shortDayName(arg0); } QString static_QDate_longMonthName(int arg0) {return QDate::longMonthName(arg0); } QString static_QDate_longDayName(int arg0) {return QDate::longDayName(arg0); } QString toString(QDate* obj,Qt::DateFormat arg0) const {return obj->toString(arg0); } QString toString(QDate* obj) const {return obj->toString(); } QString toString(QDate* obj,const QString & arg0) const {return obj->toString(arg0); } bool setYMD(QDate* obj,int arg0,int arg1,int arg2) {return obj->setYMD(arg0,arg1,arg2); } bool setDate(QDate* obj,int arg0,int arg1,int arg2) {return obj->setDate(arg0,arg1,arg2); } QDate addDays(QDate* obj,int arg0) const {return obj->addDays(arg0); } QDate addMonths(QDate* obj,int arg0) const {return obj->addMonths(arg0); } QDate addYears(QDate* obj,int arg0) const {return obj->addYears(arg0); } int daysTo(QDate* obj,const QDate & arg0) const {return obj->daysTo(arg0); } QDate static_QDate_currentDate() {return QDate::currentDate(); } QDate static_QDate_fromString(const QString & arg0,Qt::DateFormat arg1) {return QDate::fromString(arg0,arg1); } QDate static_QDate_fromString(const QString & arg0) {return QDate::fromString(arg0); } QDate static_QDate_fromString(const QString & arg0,const QString & arg1) {return QDate::fromString(arg0,arg1); } bool static_QDate_isValid(int arg0,int arg1,int arg2) {return QDate::isValid(arg0,arg1,arg2); } bool static_QDate_isLeapYear(int arg0) {return QDate::isLeapYear(arg0); } uint static_QDate_gregorianToJulian(int arg0,int arg1,int arg2) {return QDate::gregorianToJulian(arg0,arg1,arg2); } void static_QDate_julianToGregorian(uint arg0,int & arg1,int & arg2,int & arg3) {QDate::julianToGregorian(arg0,arg1,arg2,arg3); } QDate fromJulianDay(QDate* obj,int arg0) {return obj->fromJulianDay(arg0); } int toJulianDay(QDate* obj) const {return obj->toJulianDay(); } }; class PythonQtQTimeWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QTime() { return QTime(); } bool isNull(QTime* obj) const {return obj->isNull(); } bool isValid(QTime* obj) const {return obj->isValid(); } int hour(QTime* obj) const {return obj->hour(); } int minute(QTime* obj) const {return obj->minute(); } int second(QTime* obj) const {return obj->second(); } int msec(QTime* obj) const {return obj->msec(); } QString toString(QTime* obj,Qt::DateFormat arg0) const {return obj->toString(arg0); } QString toString(QTime* obj) const {return obj->toString(); } QString toString(QTime* obj,const QString & arg0) const {return obj->toString(arg0); } bool setHMS(QTime* obj,int arg0,int arg1,int arg2,int arg3) {return obj->setHMS(arg0,arg1,arg2,arg3); } bool setHMS(QTime* obj,int arg0,int arg1,int arg2) {return obj->setHMS(arg0,arg1,arg2); } QTime addSecs(QTime* obj,int arg0) const {return obj->addSecs(arg0); } int secsTo(QTime* obj,const QTime & arg0) const {return obj->secsTo(arg0); } QTime addMSecs(QTime* obj,int arg0) const {return obj->addMSecs(arg0); } int msecsTo(QTime* obj,const QTime & arg0) const {return obj->msecsTo(arg0); } QTime static_QTime_currentTime() {return QTime::currentTime(); } QTime static_QTime_fromString(const QString & arg0,Qt::DateFormat arg1) {return QTime::fromString(arg0,arg1); } QTime static_QTime_fromString(const QString & arg0) {return QTime::fromString(arg0); } QTime static_QTime_fromString(const QString & arg0,const QString & arg1) {return QTime::fromString(arg0,arg1); } bool static_QTime_isValid(int arg0,int arg1,int arg2,int arg3) {return QTime::isValid(arg0,arg1,arg2,arg3); } bool static_QTime_isValid(int arg0,int arg1,int arg2) {return QTime::isValid(arg0,arg1,arg2); } void start(QTime* obj) {obj->start(); } int restart(QTime* obj) {return obj->restart(); } int elapsed(QTime* obj) const {return obj->elapsed(); } }; class PythonQtQDateTimeWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QDateTime() { return QDateTime(); } QVariant new_QDateTime(const QDate & arg0) { return QDateTime(arg0); } QVariant new_QDateTime(const QDate & arg0,const QTime & arg1,Qt::TimeSpec arg2) { return QDateTime(arg0,arg1,arg2); } QVariant new_QDateTime(const QDate & arg0,const QTime & arg1) { return QDateTime(arg0,arg1); } QVariant new_QDateTime(const QDateTime & arg0) { return QDateTime(arg0); } bool isNull(QDateTime* obj) const {return obj->isNull(); } bool isValid(QDateTime* obj) const {return obj->isValid(); } QDate date(QDateTime* obj) const {return obj->date(); } QTime time(QDateTime* obj) const {return obj->time(); } Qt::TimeSpec timeSpec(QDateTime* obj) const {return obj->timeSpec(); } uint toTime_t(QDateTime* obj) const {return obj->toTime_t(); } void setDate(QDateTime* obj,const QDate & arg0) {obj->setDate(arg0); } void setTime(QDateTime* obj,const QTime & arg0) {obj->setTime(arg0); } void setTimeSpec(QDateTime* obj,Qt::TimeSpec arg0) {obj->setTimeSpec(arg0); } void setTime_t(QDateTime* obj,uint arg0) {obj->setTime_t(arg0); } QString toString(QDateTime* obj,Qt::DateFormat arg0) const {return obj->toString(arg0); } QString toString(QDateTime* obj) const {return obj->toString(); } QString toString(QDateTime* obj,const QString & arg0) const {return obj->toString(arg0); } QDateTime addDays(QDateTime* obj,int arg0) const {return obj->addDays(arg0); } QDateTime addMonths(QDateTime* obj,int arg0) const {return obj->addMonths(arg0); } QDateTime addYears(QDateTime* obj,int arg0) const {return obj->addYears(arg0); } QDateTime addSecs(QDateTime* obj,int arg0) const {return obj->addSecs(arg0); } QDateTime addMSecs(QDateTime* obj,qint64 arg0) const {return obj->addMSecs(arg0); } QDateTime toTimeSpec(QDateTime* obj,Qt::TimeSpec arg0) const {return obj->toTimeSpec(arg0); } QDateTime toLocalTime(QDateTime* obj) const {return obj->toLocalTime(); } QDateTime toUTC(QDateTime* obj) const {return obj->toUTC(); } int daysTo(QDateTime* obj,const QDateTime & arg0) const {return obj->daysTo(arg0); } int secsTo(QDateTime* obj,const QDateTime & arg0) const {return obj->secsTo(arg0); } QDateTime static_QDateTime_currentDateTime() {return QDateTime::currentDateTime(); } QDateTime static_QDateTime_fromString(const QString & arg0,Qt::DateFormat arg1) {return QDateTime::fromString(arg0,arg1); } QDateTime static_QDateTime_fromString(const QString & arg0) {return QDateTime::fromString(arg0); } QDateTime static_QDateTime_fromString(const QString & arg0,const QString & arg1) {return QDateTime::fromString(arg0,arg1); } QDateTime static_QDateTime_fromTime_t(uint arg0) {return QDateTime::fromTime_t(arg0); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qurl.h' ** ** Created: Thu 12. Apr 14:07:28 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qurl.h" class PythonQtQUrlWrapper : public QObject { Q_OBJECT public: Q_ENUMS(ParsingMode FormattingOption ) enum ParsingMode {TolerantMode = QUrl::TolerantMode, StrictMode = QUrl::StrictMode }; enum FormattingOption {None = QUrl::None, RemoveScheme = QUrl::RemoveScheme, RemovePassword = QUrl::RemovePassword, RemoveUserInfo = QUrl::RemoveUserInfo, RemovePort = QUrl::RemovePort, RemoveAuthority = QUrl::RemoveAuthority, RemovePath = QUrl::RemovePath, RemoveQuery = QUrl::RemoveQuery, RemoveFragment = QUrl::RemoveFragment, StripTrailingSlash = QUrl::StripTrailingSlash }; Q_DECLARE_FLAGS(FormattingOptions, FormattingOption) public slots: QVariant new_QUrl(const QString & arg0) { return QUrl(arg0); } QVariant new_QUrl(const QString & arg0,ParsingMode arg1) { return QUrl(arg0,(QUrl::ParsingMode)arg1); } QVariant new_QUrl(const QUrl & arg0) { return QUrl(arg0); } void setUrl(QUrl* obj,const QString & arg0) {obj->setUrl(arg0); } void setUrl(QUrl* obj,const QString & arg0,ParsingMode arg1) {obj->setUrl(arg0,(QUrl::ParsingMode)arg1); } void setEncodedUrl(QUrl* obj,const QByteArray & arg0) {obj->setEncodedUrl(arg0); } void setEncodedUrl(QUrl* obj,const QByteArray & arg0,ParsingMode arg1) {obj->setEncodedUrl(arg0,(QUrl::ParsingMode)arg1); } bool isValid(QUrl* obj) const {return obj->isValid(); } bool isEmpty(QUrl* obj) const {return obj->isEmpty(); } void clear(QUrl* obj) {obj->clear(); } void setScheme(QUrl* obj,const QString & arg0) {obj->setScheme(arg0); } QString scheme(QUrl* obj) const {return obj->scheme(); } void setAuthority(QUrl* obj,const QString & arg0) {obj->setAuthority(arg0); } QString authority(QUrl* obj) const {return obj->authority(); } void setUserInfo(QUrl* obj,const QString & arg0) {obj->setUserInfo(arg0); } QString userInfo(QUrl* obj) const {return obj->userInfo(); } void setUserName(QUrl* obj,const QString & arg0) {obj->setUserName(arg0); } QString userName(QUrl* obj) const {return obj->userName(); } void setPassword(QUrl* obj,const QString & arg0) {obj->setPassword(arg0); } QString password(QUrl* obj) const {return obj->password(); } void setHost(QUrl* obj,const QString & arg0) {obj->setHost(arg0); } QString host(QUrl* obj) const {return obj->host(); } void setPort(QUrl* obj,int arg0) {obj->setPort(arg0); } int port(QUrl* obj) const {return obj->port(); } int port(QUrl* obj,int arg0) const {return obj->port(arg0); } void setPath(QUrl* obj,const QString & arg0) {obj->setPath(arg0); } QString path(QUrl* obj) const {return obj->path(); } bool hasQuery(QUrl* obj) const {return obj->hasQuery(); } void setEncodedQuery(QUrl* obj,const QByteArray & arg0) {obj->setEncodedQuery(arg0); } QByteArray encodedQuery(QUrl* obj) const {return obj->encodedQuery(); } void setQueryDelimiters(QUrl* obj,char arg0,char arg1) {obj->setQueryDelimiters(arg0,arg1); } char queryValueDelimiter(QUrl* obj) const {return obj->queryValueDelimiter(); } char queryPairDelimiter(QUrl* obj) const {return obj->queryPairDelimiter(); } void setQueryItems(QUrl* obj,const QList > & arg0) {obj->setQueryItems(arg0); } void addQueryItem(QUrl* obj,const QString & arg0,const QString & arg1) {obj->addQueryItem(arg0,arg1); } QList > queryItems(QUrl* obj) const {return obj->queryItems(); } bool hasQueryItem(QUrl* obj,const QString & arg0) const {return obj->hasQueryItem(arg0); } QString queryItemValue(QUrl* obj,const QString & arg0) const {return obj->queryItemValue(arg0); } QStringList allQueryItemValues(QUrl* obj,const QString & arg0) const {return obj->allQueryItemValues(arg0); } void removeQueryItem(QUrl* obj,const QString & arg0) {obj->removeQueryItem(arg0); } void removeAllQueryItems(QUrl* obj,const QString & arg0) {obj->removeAllQueryItems(arg0); } void setFragment(QUrl* obj,const QString & arg0) {obj->setFragment(arg0); } QString fragment(QUrl* obj) const {return obj->fragment(); } bool hasFragment(QUrl* obj) const {return obj->hasFragment(); } QUrl resolved(QUrl* obj,const QUrl & arg0) const {return obj->resolved(arg0); } bool isRelative(QUrl* obj) const {return obj->isRelative(); } bool isParentOf(QUrl* obj,const QUrl & arg0) const {return obj->isParentOf(arg0); } QUrl static_QUrl_fromLocalFile(const QString & arg0) {return QUrl::fromLocalFile(arg0); } QString toLocalFile(QUrl* obj) const {return obj->toLocalFile(); } QString toString(QUrl* obj,FormattingOptions arg0) const {return obj->toString((QUrl::FormattingOptions)QFlag(arg0)); } QString toString(QUrl* obj) const {return obj->toString(); } QByteArray toEncoded(QUrl* obj,FormattingOptions arg0) const {return obj->toEncoded((QUrl::FormattingOptions)QFlag(arg0)); } QByteArray toEncoded(QUrl* obj) const {return obj->toEncoded(); } QUrl static_QUrl_fromEncoded(const QByteArray & arg0) {return QUrl::fromEncoded(arg0); } QUrl static_QUrl_fromEncoded(const QByteArray & arg0,ParsingMode arg1) {return QUrl::fromEncoded(arg0,(QUrl::ParsingMode)arg1); } void detach(QUrl* obj) {obj->detach(); } bool isDetached(QUrl* obj) const {return obj->isDetached(); } QString static_QUrl_fromPercentEncoding(const QByteArray & arg0) {return QUrl::fromPercentEncoding(arg0); } QByteArray static_QUrl_toPercentEncoding(const QString & arg0,const QByteArray & arg1,const QByteArray & arg2) {return QUrl::toPercentEncoding(arg0,arg1,arg2); } QByteArray static_QUrl_toPercentEncoding(const QString & arg0,const QByteArray & arg1) {return QUrl::toPercentEncoding(arg0,arg1); } QByteArray static_QUrl_toPercentEncoding(const QString & arg0) {return QUrl::toPercentEncoding(arg0); } QString static_QUrl_fromPunycode(const QByteArray & arg0) {return QUrl::fromPunycode(arg0); } QByteArray static_QUrl_toPunycode(const QString & arg0) {return QUrl::toPunycode(arg0); } QString static_QUrl_fromAce(const QByteArray & arg0) {return QUrl::fromAce(arg0); } QByteArray static_QUrl_toAce(const QString & arg0) {return QUrl::toAce(arg0); } QStringList static_QUrl_idnWhitelist() {return QUrl::idnWhitelist(); } void static_QUrl_setIdnWhitelist(const QStringList & arg0) {QUrl::setIdnWhitelist(arg0); } QString errorString(QUrl* obj) const {return obj->errorString(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qlocale.h' ** ** Created: Thu 12. Apr 14:07:28 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qlocale.h" class PythonQtQLocaleWrapper : public QObject { Q_OBJECT public: Q_ENUMS(Language Country FormatType NumberOption ) enum Language {C = QLocale::C, Abkhazian = QLocale::Abkhazian, Afan = QLocale::Afan, Afar = QLocale::Afar, Afrikaans = QLocale::Afrikaans, Albanian = QLocale::Albanian, Amharic = QLocale::Amharic, Arabic = QLocale::Arabic, Armenian = QLocale::Armenian, Assamese = QLocale::Assamese, Aymara = QLocale::Aymara, Azerbaijani = QLocale::Azerbaijani, Bashkir = QLocale::Bashkir, Basque = QLocale::Basque, Bengali = QLocale::Bengali, Bhutani = QLocale::Bhutani, Bihari = QLocale::Bihari, Bislama = QLocale::Bislama, Breton = QLocale::Breton, Bulgarian = QLocale::Bulgarian, Burmese = QLocale::Burmese, Byelorussian = QLocale::Byelorussian, Cambodian = QLocale::Cambodian, Catalan = QLocale::Catalan, Chinese = QLocale::Chinese, Corsican = QLocale::Corsican, Croatian = QLocale::Croatian, Czech = QLocale::Czech, Danish = QLocale::Danish, Dutch = QLocale::Dutch, English = QLocale::English, Esperanto = QLocale::Esperanto, Estonian = QLocale::Estonian, Faroese = QLocale::Faroese, FijiLanguage = QLocale::FijiLanguage, Finnish = QLocale::Finnish, French = QLocale::French, Frisian = QLocale::Frisian, Gaelic = QLocale::Gaelic, Galician = QLocale::Galician, Georgian = QLocale::Georgian, German = QLocale::German, Greek = QLocale::Greek, Greenlandic = QLocale::Greenlandic, Guarani = QLocale::Guarani, Gujarati = QLocale::Gujarati, Hausa = QLocale::Hausa, Hebrew = QLocale::Hebrew, Hindi = QLocale::Hindi, Hungarian = QLocale::Hungarian, Icelandic = QLocale::Icelandic, Indonesian = QLocale::Indonesian, Interlingua = QLocale::Interlingua, Interlingue = QLocale::Interlingue, Inuktitut = QLocale::Inuktitut, Inupiak = QLocale::Inupiak, Irish = QLocale::Irish, Italian = QLocale::Italian, Japanese = QLocale::Japanese, Javanese = QLocale::Javanese, Kannada = QLocale::Kannada, Kashmiri = QLocale::Kashmiri, Kazakh = QLocale::Kazakh, Kinyarwanda = QLocale::Kinyarwanda, Kirghiz = QLocale::Kirghiz, Korean = QLocale::Korean, Kurdish = QLocale::Kurdish, Kurundi = QLocale::Kurundi, Laothian = QLocale::Laothian, Latin = QLocale::Latin, Latvian = QLocale::Latvian, Lingala = QLocale::Lingala, Lithuanian = QLocale::Lithuanian, Macedonian = QLocale::Macedonian, Malagasy = QLocale::Malagasy, Malay = QLocale::Malay, Malayalam = QLocale::Malayalam, Maltese = QLocale::Maltese, Maori = QLocale::Maori, Marathi = QLocale::Marathi, Moldavian = QLocale::Moldavian, Mongolian = QLocale::Mongolian, NauruLanguage = QLocale::NauruLanguage, Nepali = QLocale::Nepali, Norwegian = QLocale::Norwegian, Occitan = QLocale::Occitan, Oriya = QLocale::Oriya, Pashto = QLocale::Pashto, Persian = QLocale::Persian, Polish = QLocale::Polish, Portuguese = QLocale::Portuguese, Punjabi = QLocale::Punjabi, Quechua = QLocale::Quechua, RhaetoRomance = QLocale::RhaetoRomance, Romanian = QLocale::Romanian, Russian = QLocale::Russian, Samoan = QLocale::Samoan, Sangho = QLocale::Sangho, Sanskrit = QLocale::Sanskrit, Serbian = QLocale::Serbian, SerboCroatian = QLocale::SerboCroatian, Sesotho = QLocale::Sesotho, Setswana = QLocale::Setswana, Shona = QLocale::Shona, Sindhi = QLocale::Sindhi, Singhalese = QLocale::Singhalese, Siswati = QLocale::Siswati, Slovak = QLocale::Slovak, Slovenian = QLocale::Slovenian, Somali = QLocale::Somali, Spanish = QLocale::Spanish, Sundanese = QLocale::Sundanese, Swahili = QLocale::Swahili, Swedish = QLocale::Swedish, Tagalog = QLocale::Tagalog, Tajik = QLocale::Tajik, Tamil = QLocale::Tamil, Tatar = QLocale::Tatar, Telugu = QLocale::Telugu, Thai = QLocale::Thai, Tibetan = QLocale::Tibetan, Tigrinya = QLocale::Tigrinya, TongaLanguage = QLocale::TongaLanguage, Tsonga = QLocale::Tsonga, Turkish = QLocale::Turkish, Turkmen = QLocale::Turkmen, Twi = QLocale::Twi, Uigur = QLocale::Uigur, Ukrainian = QLocale::Ukrainian, Urdu = QLocale::Urdu, Uzbek = QLocale::Uzbek, Vietnamese = QLocale::Vietnamese, Volapuk = QLocale::Volapuk, Welsh = QLocale::Welsh, Wolof = QLocale::Wolof, Xhosa = QLocale::Xhosa, Yiddish = QLocale::Yiddish, Yoruba = QLocale::Yoruba, Zhuang = QLocale::Zhuang, Zulu = QLocale::Zulu, Nynorsk = QLocale::Nynorsk, Bosnian = QLocale::Bosnian, Divehi = QLocale::Divehi, Manx = QLocale::Manx, Cornish = QLocale::Cornish, LastLanguage = QLocale::LastLanguage }; enum Country {AnyCountry = QLocale::AnyCountry, Afghanistan = QLocale::Afghanistan, Albania = QLocale::Albania, Algeria = QLocale::Algeria, AmericanSamoa = QLocale::AmericanSamoa, Andorra = QLocale::Andorra, Angola = QLocale::Angola, Anguilla = QLocale::Anguilla, Antarctica = QLocale::Antarctica, AntiguaAndBarbuda = QLocale::AntiguaAndBarbuda, Argentina = QLocale::Argentina, Armenia = QLocale::Armenia, Aruba = QLocale::Aruba, Australia = QLocale::Australia, Austria = QLocale::Austria, Azerbaijan = QLocale::Azerbaijan, Bahamas = QLocale::Bahamas, Bahrain = QLocale::Bahrain, Bangladesh = QLocale::Bangladesh, Barbados = QLocale::Barbados, Belarus = QLocale::Belarus, Belgium = QLocale::Belgium, Belize = QLocale::Belize, Benin = QLocale::Benin, Bermuda = QLocale::Bermuda, Bhutan = QLocale::Bhutan, Bolivia = QLocale::Bolivia, BosniaAndHerzegowina = QLocale::BosniaAndHerzegowina, Botswana = QLocale::Botswana, BouvetIsland = QLocale::BouvetIsland, Brazil = QLocale::Brazil, BritishIndianOceanTerritory = QLocale::BritishIndianOceanTerritory, BruneiDarussalam = QLocale::BruneiDarussalam, Bulgaria = QLocale::Bulgaria, BurkinaFaso = QLocale::BurkinaFaso, Burundi = QLocale::Burundi, Cambodia = QLocale::Cambodia, Cameroon = QLocale::Cameroon, Canada = QLocale::Canada, CapeVerde = QLocale::CapeVerde, CaymanIslands = QLocale::CaymanIslands, CentralAfricanRepublic = QLocale::CentralAfricanRepublic, Chad = QLocale::Chad, Chile = QLocale::Chile, China = QLocale::China, ChristmasIsland = QLocale::ChristmasIsland, CocosIslands = QLocale::CocosIslands, Colombia = QLocale::Colombia, Comoros = QLocale::Comoros, DemocraticRepublicOfCongo = QLocale::DemocraticRepublicOfCongo, PeoplesRepublicOfCongo = QLocale::PeoplesRepublicOfCongo, CookIslands = QLocale::CookIslands, CostaRica = QLocale::CostaRica, IvoryCoast = QLocale::IvoryCoast, Croatia = QLocale::Croatia, Cuba = QLocale::Cuba, Cyprus = QLocale::Cyprus, CzechRepublic = QLocale::CzechRepublic, Denmark = QLocale::Denmark, Djibouti = QLocale::Djibouti, Dominica = QLocale::Dominica, DominicanRepublic = QLocale::DominicanRepublic, EastTimor = QLocale::EastTimor, Ecuador = QLocale::Ecuador, Egypt = QLocale::Egypt, ElSalvador = QLocale::ElSalvador, EquatorialGuinea = QLocale::EquatorialGuinea, Eritrea = QLocale::Eritrea, Estonia = QLocale::Estonia, Ethiopia = QLocale::Ethiopia, FalklandIslands = QLocale::FalklandIslands, FaroeIslands = QLocale::FaroeIslands, FijiCountry = QLocale::FijiCountry, Finland = QLocale::Finland, France = QLocale::France, MetropolitanFrance = QLocale::MetropolitanFrance, FrenchGuiana = QLocale::FrenchGuiana, FrenchPolynesia = QLocale::FrenchPolynesia, FrenchSouthernTerritories = QLocale::FrenchSouthernTerritories, Gabon = QLocale::Gabon, Gambia = QLocale::Gambia, Georgia = QLocale::Georgia, Germany = QLocale::Germany, Ghana = QLocale::Ghana, Gibraltar = QLocale::Gibraltar, Greece = QLocale::Greece, Greenland = QLocale::Greenland, Grenada = QLocale::Grenada, Guadeloupe = QLocale::Guadeloupe, Guam = QLocale::Guam, Guatemala = QLocale::Guatemala, Guinea = QLocale::Guinea, GuineaBissau = QLocale::GuineaBissau, Guyana = QLocale::Guyana, Haiti = QLocale::Haiti, HeardAndMcDonaldIslands = QLocale::HeardAndMcDonaldIslands, Honduras = QLocale::Honduras, HongKong = QLocale::HongKong, Hungary = QLocale::Hungary, Iceland = QLocale::Iceland, India = QLocale::India, Indonesia = QLocale::Indonesia, Iran = QLocale::Iran, Iraq = QLocale::Iraq, Ireland = QLocale::Ireland, Israel = QLocale::Israel, Italy = QLocale::Italy, Jamaica = QLocale::Jamaica, Japan = QLocale::Japan, Jordan = QLocale::Jordan, Kazakhstan = QLocale::Kazakhstan, Kenya = QLocale::Kenya, Kiribati = QLocale::Kiribati, DemocraticRepublicOfKorea = QLocale::DemocraticRepublicOfKorea, RepublicOfKorea = QLocale::RepublicOfKorea, Kuwait = QLocale::Kuwait, Kyrgyzstan = QLocale::Kyrgyzstan, Lao = QLocale::Lao, Latvia = QLocale::Latvia, Lebanon = QLocale::Lebanon, Lesotho = QLocale::Lesotho, Liberia = QLocale::Liberia, LibyanArabJamahiriya = QLocale::LibyanArabJamahiriya, Liechtenstein = QLocale::Liechtenstein, Lithuania = QLocale::Lithuania, Luxembourg = QLocale::Luxembourg, Macau = QLocale::Macau, Macedonia = QLocale::Macedonia, Madagascar = QLocale::Madagascar, Malawi = QLocale::Malawi, Malaysia = QLocale::Malaysia, Maldives = QLocale::Maldives, Mali = QLocale::Mali, Malta = QLocale::Malta, MarshallIslands = QLocale::MarshallIslands, Martinique = QLocale::Martinique, Mauritania = QLocale::Mauritania, Mauritius = QLocale::Mauritius, Mayotte = QLocale::Mayotte, Mexico = QLocale::Mexico, Micronesia = QLocale::Micronesia, Moldova = QLocale::Moldova, Monaco = QLocale::Monaco, Mongolia = QLocale::Mongolia, Montserrat = QLocale::Montserrat, Morocco = QLocale::Morocco, Mozambique = QLocale::Mozambique, Myanmar = QLocale::Myanmar, Namibia = QLocale::Namibia, NauruCountry = QLocale::NauruCountry, Nepal = QLocale::Nepal, Netherlands = QLocale::Netherlands, NetherlandsAntilles = QLocale::NetherlandsAntilles, NewCaledonia = QLocale::NewCaledonia, NewZealand = QLocale::NewZealand, Nicaragua = QLocale::Nicaragua, Niger = QLocale::Niger, Nigeria = QLocale::Nigeria, Niue = QLocale::Niue, NorfolkIsland = QLocale::NorfolkIsland, NorthernMarianaIslands = QLocale::NorthernMarianaIslands, Norway = QLocale::Norway, Oman = QLocale::Oman, Pakistan = QLocale::Pakistan, Palau = QLocale::Palau, PalestinianTerritory = QLocale::PalestinianTerritory, Panama = QLocale::Panama, PapuaNewGuinea = QLocale::PapuaNewGuinea, Paraguay = QLocale::Paraguay, Peru = QLocale::Peru, Philippines = QLocale::Philippines, Pitcairn = QLocale::Pitcairn, Poland = QLocale::Poland, Portugal = QLocale::Portugal, PuertoRico = QLocale::PuertoRico, Qatar = QLocale::Qatar, Reunion = QLocale::Reunion, Romania = QLocale::Romania, RussianFederation = QLocale::RussianFederation, Rwanda = QLocale::Rwanda, SaintKittsAndNevis = QLocale::SaintKittsAndNevis, StLucia = QLocale::StLucia, StVincentAndTheGrenadines = QLocale::StVincentAndTheGrenadines, Samoa = QLocale::Samoa, SanMarino = QLocale::SanMarino, SaoTomeAndPrincipe = QLocale::SaoTomeAndPrincipe, SaudiArabia = QLocale::SaudiArabia, Senegal = QLocale::Senegal, Seychelles = QLocale::Seychelles, SierraLeone = QLocale::SierraLeone, Singapore = QLocale::Singapore, Slovakia = QLocale::Slovakia, Slovenia = QLocale::Slovenia, SolomonIslands = QLocale::SolomonIslands, Somalia = QLocale::Somalia, SouthAfrica = QLocale::SouthAfrica, SouthGeorgiaAndTheSouthSandwichIslands = QLocale::SouthGeorgiaAndTheSouthSandwichIslands, Spain = QLocale::Spain, SriLanka = QLocale::SriLanka, StHelena = QLocale::StHelena, StPierreAndMiquelon = QLocale::StPierreAndMiquelon, Sudan = QLocale::Sudan, Suriname = QLocale::Suriname, SvalbardAndJanMayenIslands = QLocale::SvalbardAndJanMayenIslands, Swaziland = QLocale::Swaziland, Sweden = QLocale::Sweden, Switzerland = QLocale::Switzerland, SyrianArabRepublic = QLocale::SyrianArabRepublic, Taiwan = QLocale::Taiwan, Tajikistan = QLocale::Tajikistan, Tanzania = QLocale::Tanzania, Thailand = QLocale::Thailand, Togo = QLocale::Togo, Tokelau = QLocale::Tokelau, TongaCountry = QLocale::TongaCountry, TrinidadAndTobago = QLocale::TrinidadAndTobago, Tunisia = QLocale::Tunisia, Turkey = QLocale::Turkey, Turkmenistan = QLocale::Turkmenistan, TurksAndCaicosIslands = QLocale::TurksAndCaicosIslands, Tuvalu = QLocale::Tuvalu, Uganda = QLocale::Uganda, Ukraine = QLocale::Ukraine, UnitedArabEmirates = QLocale::UnitedArabEmirates, UnitedKingdom = QLocale::UnitedKingdom, UnitedStates = QLocale::UnitedStates, UnitedStatesMinorOutlyingIslands = QLocale::UnitedStatesMinorOutlyingIslands, Uruguay = QLocale::Uruguay, Uzbekistan = QLocale::Uzbekistan, Vanuatu = QLocale::Vanuatu, VaticanCityState = QLocale::VaticanCityState, Venezuela = QLocale::Venezuela, VietNam = QLocale::VietNam, BritishVirginIslands = QLocale::BritishVirginIslands, USVirginIslands = QLocale::USVirginIslands, WallisAndFutunaIslands = QLocale::WallisAndFutunaIslands, WesternSahara = QLocale::WesternSahara, Yemen = QLocale::Yemen, Yugoslavia = QLocale::Yugoslavia, Zambia = QLocale::Zambia, Zimbabwe = QLocale::Zimbabwe, SerbiaAndMontenegro = QLocale::SerbiaAndMontenegro, LastCountry = QLocale::LastCountry }; enum FormatType {LongFormat = QLocale::LongFormat, ShortFormat = QLocale::ShortFormat }; enum NumberOption {OmitGroupSeparator = QLocale::OmitGroupSeparator, RejectGroupSeparator = QLocale::RejectGroupSeparator }; Q_DECLARE_FLAGS(NumberOptions, NumberOption) public slots: QVariant new_QLocale(const QString & arg0) { return QLocale(arg0); } QVariant new_QLocale(Language arg0,Country arg1) { return QLocale((QLocale::Language)arg0,(QLocale::Country)arg1); } QVariant new_QLocale(Language arg0) { return QLocale((QLocale::Language)arg0); } QVariant new_QLocale(const QLocale & arg0) { return QLocale(arg0); } Language language(QLocale* obj) const {return (PythonQtQLocaleWrapper::Language)obj->language(); } Country country(QLocale* obj) const {return (PythonQtQLocaleWrapper::Country)obj->country(); } QString name(QLocale* obj) const {return obj->name(); } short toShort(QLocale* obj,const QString & arg0,bool * arg1,int arg2) const {return obj->toShort(arg0,arg1,arg2); } short toShort(QLocale* obj,const QString & arg0,bool * arg1) const {return obj->toShort(arg0,arg1); } short toShort(QLocale* obj,const QString & arg0) const {return obj->toShort(arg0); } ushort toUShort(QLocale* obj,const QString & arg0,bool * arg1,int arg2) const {return obj->toUShort(arg0,arg1,arg2); } ushort toUShort(QLocale* obj,const QString & arg0,bool * arg1) const {return obj->toUShort(arg0,arg1); } ushort toUShort(QLocale* obj,const QString & arg0) const {return obj->toUShort(arg0); } int toInt(QLocale* obj,const QString & arg0,bool * arg1,int arg2) const {return obj->toInt(arg0,arg1,arg2); } int toInt(QLocale* obj,const QString & arg0,bool * arg1) const {return obj->toInt(arg0,arg1); } int toInt(QLocale* obj,const QString & arg0) const {return obj->toInt(arg0); } uint toUInt(QLocale* obj,const QString & arg0,bool * arg1,int arg2) const {return obj->toUInt(arg0,arg1,arg2); } uint toUInt(QLocale* obj,const QString & arg0,bool * arg1) const {return obj->toUInt(arg0,arg1); } uint toUInt(QLocale* obj,const QString & arg0) const {return obj->toUInt(arg0); } qlonglong toLongLong(QLocale* obj,const QString & arg0,bool * arg1,int arg2) const {return obj->toLongLong(arg0,arg1,arg2); } qlonglong toLongLong(QLocale* obj,const QString & arg0,bool * arg1) const {return obj->toLongLong(arg0,arg1); } qlonglong toLongLong(QLocale* obj,const QString & arg0) const {return obj->toLongLong(arg0); } qlonglong toULongLong(QLocale* obj,const QString & arg0,bool * arg1,int arg2) const {return obj->toULongLong(arg0,arg1,arg2); } qlonglong toULongLong(QLocale* obj,const QString & arg0,bool * arg1) const {return obj->toULongLong(arg0,arg1); } qlonglong toULongLong(QLocale* obj,const QString & arg0) const {return obj->toULongLong(arg0); } float toFloat(QLocale* obj,const QString & arg0,bool * arg1) const {return obj->toFloat(arg0,arg1); } float toFloat(QLocale* obj,const QString & arg0) const {return obj->toFloat(arg0); } double toDouble(QLocale* obj,const QString & arg0,bool * arg1) const {return obj->toDouble(arg0,arg1); } double toDouble(QLocale* obj,const QString & arg0) const {return obj->toDouble(arg0); } QString toString(QLocale* obj,qlonglong arg0) const {return obj->toString(arg0); } QString toString(QLocale* obj,qulonglong arg0) const {return obj->toString(arg0); } QString toString(QLocale* obj,short arg0) const {return obj->toString(arg0); } QString toString(QLocale* obj,ushort arg0) const {return obj->toString(arg0); } QString toString(QLocale* obj,int arg0) const {return obj->toString(arg0); } QString toString(QLocale* obj,uint arg0) const {return obj->toString(arg0); } QString toString(QLocale* obj,double arg0,char arg1,int arg2) const {return obj->toString(arg0,arg1,arg2); } QString toString(QLocale* obj,double arg0,char arg1) const {return obj->toString(arg0,arg1); } QString toString(QLocale* obj,double arg0) const {return obj->toString(arg0); } QString toString(QLocale* obj,float arg0,char arg1,int arg2) const {return obj->toString(arg0,arg1,arg2); } QString toString(QLocale* obj,float arg0,char arg1) const {return obj->toString(arg0,arg1); } QString toString(QLocale* obj,float arg0) const {return obj->toString(arg0); } QString toString(QLocale* obj,const QDate & arg0,const QString & arg1) const {return obj->toString(arg0,arg1); } QString toString(QLocale* obj,const QDate & arg0,FormatType arg1) const {return obj->toString(arg0,(QLocale::FormatType)arg1); } QString toString(QLocale* obj,const QDate & arg0) const {return obj->toString(arg0); } QString toString(QLocale* obj,const QTime & arg0,const QString & arg1) const {return obj->toString(arg0,arg1); } QString toString(QLocale* obj,const QTime & arg0,FormatType arg1) const {return obj->toString(arg0,(QLocale::FormatType)arg1); } QString toString(QLocale* obj,const QTime & arg0) const {return obj->toString(arg0); } QString dateFormat(QLocale* obj,FormatType arg0) const {return obj->dateFormat((QLocale::FormatType)arg0); } QString dateFormat(QLocale* obj) const {return obj->dateFormat(); } QString timeFormat(QLocale* obj,FormatType arg0) const {return obj->timeFormat((QLocale::FormatType)arg0); } QString timeFormat(QLocale* obj) const {return obj->timeFormat(); } QChar decimalPoint(QLocale* obj) const {return obj->decimalPoint(); } QChar groupSeparator(QLocale* obj) const {return obj->groupSeparator(); } QChar percent(QLocale* obj) const {return obj->percent(); } QChar zeroDigit(QLocale* obj) const {return obj->zeroDigit(); } QChar negativeSign(QLocale* obj) const {return obj->negativeSign(); } QChar exponential(QLocale* obj) const {return obj->exponential(); } QString monthName(QLocale* obj,int arg0,FormatType arg1) const {return obj->monthName(arg0,(QLocale::FormatType)arg1); } QString monthName(QLocale* obj,int arg0) const {return obj->monthName(arg0); } QString dayName(QLocale* obj,int arg0,FormatType arg1) const {return obj->dayName(arg0,(QLocale::FormatType)arg1); } QString dayName(QLocale* obj,int arg0) const {return obj->dayName(arg0); } QString static_QLocale_languageToString(Language arg0) {return QLocale::languageToString((QLocale::Language)arg0); } QString static_QLocale_countryToString(Country arg0) {return QLocale::countryToString((QLocale::Country)arg0); } void static_QLocale_setDefault(const QLocale & arg0) {QLocale::setDefault(arg0); } QLocale static_QLocale_c() {return QLocale::c(); } QLocale static_QLocale_system() {return QLocale::system(); } void setNumberOptions(QLocale* obj,NumberOptions arg0) {obj->setNumberOptions((QLocale::NumberOptions)QFlag(arg0)); } NumberOptions numberOptions(QLocale* obj) const {return (PythonQtQLocaleWrapper::NumberOptions)QFlag(obj->numberOptions()); } }; class PythonQtQSystemLocaleWrapper : public QObject { Q_OBJECT public: Q_ENUMS(QueryType ) enum QueryType {LanguageId = QSystemLocale::LanguageId, CountryId = QSystemLocale::CountryId, DecimalPoint = QSystemLocale::DecimalPoint, GroupSeparator = QSystemLocale::GroupSeparator, ZeroDigit = QSystemLocale::ZeroDigit, NegativeSign = QSystemLocale::NegativeSign, DateFormatLong = QSystemLocale::DateFormatLong, DateFormatShort = QSystemLocale::DateFormatShort, TimeFormatLong = QSystemLocale::TimeFormatLong, TimeFormatShort = QSystemLocale::TimeFormatShort, DayNameLong = QSystemLocale::DayNameLong, DayNameShort = QSystemLocale::DayNameShort, MonthNameLong = QSystemLocale::MonthNameLong, MonthNameShort = QSystemLocale::MonthNameShort, DateToStringLong = QSystemLocale::DateToStringLong, DateToStringShort = QSystemLocale::DateToStringShort, TimeToStringLong = QSystemLocale::TimeToStringLong, TimeToStringShort = QSystemLocale::TimeToStringShort }; public slots: void delete_QSystemLocale(QSystemLocale* obj) { delete obj; } QSystemLocale* new_QSystemLocale() { return new QSystemLocale(); } QVariant query(QSystemLocale* obj,QueryType arg0,QVariant arg1) const {return obj->query((QSystemLocale::QueryType)arg0,arg1); } QLocale fallbackLocale(QSystemLocale* obj) const {return obj->fallbackLocale(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qrect.h' ** ** Created: Thu 12. Apr 14:07:28 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qrect.h" class PythonQtQRectWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QRect() { return QRect(); } QVariant new_QRect(const QPoint & arg0,const QPoint & arg1) { return QRect(arg0,arg1); } QVariant new_QRect(const QPoint & arg0,const QSize & arg1) { return QRect(arg0,arg1); } QVariant new_QRect(int arg0,int arg1,int arg2,int arg3) { return QRect(arg0,arg1,arg2,arg3); } bool isNull(QRect* obj) const {return obj->isNull(); } bool isEmpty(QRect* obj) const {return obj->isEmpty(); } bool isValid(QRect* obj) const {return obj->isValid(); } int left(QRect* obj) const {return obj->left(); } int top(QRect* obj) const {return obj->top(); } int right(QRect* obj) const {return obj->right(); } int bottom(QRect* obj) const {return obj->bottom(); } QRect normalized(QRect* obj) const {return obj->normalized(); } int x(QRect* obj) const {return obj->x(); } int y(QRect* obj) const {return obj->y(); } void setLeft(QRect* obj,int arg0) {obj->setLeft(arg0); } void setTop(QRect* obj,int arg0) {obj->setTop(arg0); } void setRight(QRect* obj,int arg0) {obj->setRight(arg0); } void setBottom(QRect* obj,int arg0) {obj->setBottom(arg0); } void setX(QRect* obj,int arg0) {obj->setX(arg0); } void setY(QRect* obj,int arg0) {obj->setY(arg0); } void setTopLeft(QRect* obj,const QPoint & arg0) {obj->setTopLeft(arg0); } void setBottomRight(QRect* obj,const QPoint & arg0) {obj->setBottomRight(arg0); } void setTopRight(QRect* obj,const QPoint & arg0) {obj->setTopRight(arg0); } void setBottomLeft(QRect* obj,const QPoint & arg0) {obj->setBottomLeft(arg0); } QPoint topLeft(QRect* obj) const {return obj->topLeft(); } QPoint bottomRight(QRect* obj) const {return obj->bottomRight(); } QPoint topRight(QRect* obj) const {return obj->topRight(); } QPoint bottomLeft(QRect* obj) const {return obj->bottomLeft(); } QPoint center(QRect* obj) const {return obj->center(); } void moveLeft(QRect* obj,int arg0) {obj->moveLeft(arg0); } void moveTop(QRect* obj,int arg0) {obj->moveTop(arg0); } void moveRight(QRect* obj,int arg0) {obj->moveRight(arg0); } void moveBottom(QRect* obj,int arg0) {obj->moveBottom(arg0); } void moveTopLeft(QRect* obj,const QPoint & arg0) {obj->moveTopLeft(arg0); } void moveBottomRight(QRect* obj,const QPoint & arg0) {obj->moveBottomRight(arg0); } void moveTopRight(QRect* obj,const QPoint & arg0) {obj->moveTopRight(arg0); } void moveBottomLeft(QRect* obj,const QPoint & arg0) {obj->moveBottomLeft(arg0); } void moveCenter(QRect* obj,const QPoint & arg0) {obj->moveCenter(arg0); } void translate(QRect* obj,int arg0,int arg1) {obj->translate(arg0,arg1); } void translate(QRect* obj,const QPoint & arg0) {obj->translate(arg0); } QRect translated(QRect* obj,int arg0,int arg1) const {return obj->translated(arg0,arg1); } QRect translated(QRect* obj,const QPoint & arg0) const {return obj->translated(arg0); } void moveTo(QRect* obj,int arg0,int arg1) {obj->moveTo(arg0,arg1); } void moveTo(QRect* obj,const QPoint & arg0) {obj->moveTo(arg0); } void setRect(QRect* obj,int arg0,int arg1,int arg2,int arg3) {obj->setRect(arg0,arg1,arg2,arg3); } void getRect(QRect* obj,int * arg0,int * arg1,int * arg2,int * arg3) const {obj->getRect(arg0,arg1,arg2,arg3); } void setCoords(QRect* obj,int arg0,int arg1,int arg2,int arg3) {obj->setCoords(arg0,arg1,arg2,arg3); } void getCoords(QRect* obj,int * arg0,int * arg1,int * arg2,int * arg3) const {obj->getCoords(arg0,arg1,arg2,arg3); } void adjust(QRect* obj,int arg0,int arg1,int arg2,int arg3) {obj->adjust(arg0,arg1,arg2,arg3); } QRect adjusted(QRect* obj,int arg0,int arg1,int arg2,int arg3) const {return obj->adjusted(arg0,arg1,arg2,arg3); } QSize size(QRect* obj) const {return obj->size(); } int width(QRect* obj) const {return obj->width(); } int height(QRect* obj) const {return obj->height(); } void setWidth(QRect* obj,int arg0) {obj->setWidth(arg0); } void setHeight(QRect* obj,int arg0) {obj->setHeight(arg0); } void setSize(QRect* obj,const QSize & arg0) {obj->setSize(arg0); } bool contains(QRect* obj,const QPoint & arg0,bool arg1) const {return obj->contains(arg0,arg1); } bool contains(QRect* obj,const QPoint & arg0) const {return obj->contains(arg0); } bool contains(QRect* obj,int arg0,int arg1) const {return obj->contains(arg0,arg1); } bool contains(QRect* obj,int arg0,int arg1,bool arg2) const {return obj->contains(arg0,arg1,arg2); } bool contains(QRect* obj,const QRect & arg0,bool arg1) const {return obj->contains(arg0,arg1); } bool contains(QRect* obj,const QRect & arg0) const {return obj->contains(arg0); } QRect unite(QRect* obj,const QRect & arg0) const {return obj->unite(arg0); } QRect united(QRect* obj,const QRect & arg0) const {return obj->united(arg0); } QRect intersect(QRect* obj,const QRect & arg0) const {return obj->intersect(arg0); } QRect intersected(QRect* obj,const QRect & arg0) const {return obj->intersected(arg0); } bool intersects(QRect* obj,const QRect & arg0) const {return obj->intersects(arg0); } }; class PythonQtQRectFWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QRectF() { return QRectF(); } QVariant new_QRectF(const QPointF & arg0,const QSizeF & arg1) { return QRectF(arg0,arg1); } QVariant new_QRectF(qreal arg0,qreal arg1,qreal arg2,qreal arg3) { return QRectF(arg0,arg1,arg2,arg3); } QVariant new_QRectF(const QRect & arg0) { return QRectF(arg0); } bool isNull(QRectF* obj) const {return obj->isNull(); } bool isEmpty(QRectF* obj) const {return obj->isEmpty(); } bool isValid(QRectF* obj) const {return obj->isValid(); } QRectF normalized(QRectF* obj) const {return obj->normalized(); } qreal left(QRectF* obj) const {return obj->left(); } qreal top(QRectF* obj) const {return obj->top(); } qreal right(QRectF* obj) const {return obj->right(); } qreal bottom(QRectF* obj) const {return obj->bottom(); } qreal x(QRectF* obj) const {return obj->x(); } qreal y(QRectF* obj) const {return obj->y(); } void setLeft(QRectF* obj,qreal arg0) {obj->setLeft(arg0); } void setTop(QRectF* obj,qreal arg0) {obj->setTop(arg0); } void setRight(QRectF* obj,qreal arg0) {obj->setRight(arg0); } void setBottom(QRectF* obj,qreal arg0) {obj->setBottom(arg0); } void setX(QRectF* obj,qreal arg0) {obj->setX(arg0); } void setY(QRectF* obj,qreal arg0) {obj->setY(arg0); } QPointF topLeft(QRectF* obj) const {return obj->topLeft(); } QPointF bottomRight(QRectF* obj) const {return obj->bottomRight(); } QPointF topRight(QRectF* obj) const {return obj->topRight(); } QPointF bottomLeft(QRectF* obj) const {return obj->bottomLeft(); } QPointF center(QRectF* obj) const {return obj->center(); } void setTopLeft(QRectF* obj,const QPointF & arg0) {obj->setTopLeft(arg0); } void setBottomRight(QRectF* obj,const QPointF & arg0) {obj->setBottomRight(arg0); } void setTopRight(QRectF* obj,const QPointF & arg0) {obj->setTopRight(arg0); } void setBottomLeft(QRectF* obj,const QPointF & arg0) {obj->setBottomLeft(arg0); } void moveLeft(QRectF* obj,qreal arg0) {obj->moveLeft(arg0); } void moveTop(QRectF* obj,qreal arg0) {obj->moveTop(arg0); } void moveRight(QRectF* obj,qreal arg0) {obj->moveRight(arg0); } void moveBottom(QRectF* obj,qreal arg0) {obj->moveBottom(arg0); } void moveTopLeft(QRectF* obj,const QPointF & arg0) {obj->moveTopLeft(arg0); } void moveBottomRight(QRectF* obj,const QPointF & arg0) {obj->moveBottomRight(arg0); } void moveTopRight(QRectF* obj,const QPointF & arg0) {obj->moveTopRight(arg0); } void moveBottomLeft(QRectF* obj,const QPointF & arg0) {obj->moveBottomLeft(arg0); } void moveCenter(QRectF* obj,const QPointF & arg0) {obj->moveCenter(arg0); } void translate(QRectF* obj,qreal arg0,qreal arg1) {obj->translate(arg0,arg1); } void translate(QRectF* obj,const QPointF & arg0) {obj->translate(arg0); } QRectF translated(QRectF* obj,qreal arg0,qreal arg1) const {return obj->translated(arg0,arg1); } QRectF translated(QRectF* obj,const QPointF & arg0) const {return obj->translated(arg0); } void moveTo(QRectF* obj,qreal arg0,qreal arg1) {obj->moveTo(arg0,arg1); } void moveTo(QRectF* obj,const QPointF & arg0) {obj->moveTo(arg0); } void setRect(QRectF* obj,qreal arg0,qreal arg1,qreal arg2,qreal arg3) {obj->setRect(arg0,arg1,arg2,arg3); } void getRect(QRectF* obj,qreal * arg0,qreal * arg1,qreal * arg2,qreal * arg3) const {obj->getRect(arg0,arg1,arg2,arg3); } void setCoords(QRectF* obj,qreal arg0,qreal arg1,qreal arg2,qreal arg3) {obj->setCoords(arg0,arg1,arg2,arg3); } void getCoords(QRectF* obj,qreal * arg0,qreal * arg1,qreal * arg2,qreal * arg3) const {obj->getCoords(arg0,arg1,arg2,arg3); } void adjust(QRectF* obj,qreal arg0,qreal arg1,qreal arg2,qreal arg3) {obj->adjust(arg0,arg1,arg2,arg3); } QRectF adjusted(QRectF* obj,qreal arg0,qreal arg1,qreal arg2,qreal arg3) const {return obj->adjusted(arg0,arg1,arg2,arg3); } QSizeF size(QRectF* obj) const {return obj->size(); } qreal width(QRectF* obj) const {return obj->width(); } qreal height(QRectF* obj) const {return obj->height(); } void setWidth(QRectF* obj,qreal arg0) {obj->setWidth(arg0); } void setHeight(QRectF* obj,qreal arg0) {obj->setHeight(arg0); } void setSize(QRectF* obj,const QSizeF & arg0) {obj->setSize(arg0); } bool contains(QRectF* obj,const QPointF & arg0) const {return obj->contains(arg0); } bool contains(QRectF* obj,qreal arg0,qreal arg1) const {return obj->contains(arg0,arg1); } bool contains(QRectF* obj,const QRectF & arg0) const {return obj->contains(arg0); } QRectF unite(QRectF* obj,const QRectF & arg0) const {return obj->unite(arg0); } QRectF united(QRectF* obj,const QRectF & arg0) const {return obj->united(arg0); } QRectF intersect(QRectF* obj,const QRectF & arg0) const {return obj->intersect(arg0); } QRectF intersected(QRectF* obj,const QRectF & arg0) const {return obj->intersected(arg0); } bool intersects(QRectF* obj,const QRectF & arg0) const {return obj->intersects(arg0); } QRect toRect(QRectF* obj) const {return obj->toRect(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qsize.h' ** ** Created: Thu 12. Apr 14:07:28 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qsize.h" class PythonQtQSizeWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QSize() { return QSize(); } QVariant new_QSize(int arg0,int arg1) { return QSize(arg0,arg1); } bool isNull(QSize* obj) const {return obj->isNull(); } bool isEmpty(QSize* obj) const {return obj->isEmpty(); } bool isValid(QSize* obj) const {return obj->isValid(); } int width(QSize* obj) const {return obj->width(); } int height(QSize* obj) const {return obj->height(); } void setWidth(QSize* obj,int arg0) {obj->setWidth(arg0); } void setHeight(QSize* obj,int arg0) {obj->setHeight(arg0); } void transpose(QSize* obj) {obj->transpose(); } void scale(QSize* obj,int arg0,int arg1,Qt::AspectRatioMode arg2) {obj->scale(arg0,arg1,arg2); } void scale(QSize* obj,const QSize & arg0,Qt::AspectRatioMode arg1) {obj->scale(arg0,arg1); } QSize expandedTo(QSize* obj,const QSize & arg0) const {return obj->expandedTo(arg0); } QSize boundedTo(QSize* obj,const QSize & arg0) const {return obj->boundedTo(arg0); } void rwidth(QSize* obj) {obj->rwidth(); } void rheight(QSize* obj) {obj->rheight(); } }; class PythonQtQSizeFWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QSizeF() { return QSizeF(); } QVariant new_QSizeF(const QSize & arg0) { return QSizeF(arg0); } QVariant new_QSizeF(qreal arg0,qreal arg1) { return QSizeF(arg0,arg1); } bool isNull(QSizeF* obj) const {return obj->isNull(); } bool isEmpty(QSizeF* obj) const {return obj->isEmpty(); } bool isValid(QSizeF* obj) const {return obj->isValid(); } qreal width(QSizeF* obj) const {return obj->width(); } qreal height(QSizeF* obj) const {return obj->height(); } void setWidth(QSizeF* obj,qreal arg0) {obj->setWidth(arg0); } void setHeight(QSizeF* obj,qreal arg0) {obj->setHeight(arg0); } void transpose(QSizeF* obj) {obj->transpose(); } void scale(QSizeF* obj,qreal arg0,qreal arg1,Qt::AspectRatioMode arg2) {obj->scale(arg0,arg1,arg2); } void scale(QSizeF* obj,const QSizeF & arg0,Qt::AspectRatioMode arg1) {obj->scale(arg0,arg1); } QSizeF expandedTo(QSizeF* obj,const QSizeF & arg0) const {return obj->expandedTo(arg0); } QSizeF boundedTo(QSizeF* obj,const QSizeF & arg0) const {return obj->boundedTo(arg0); } void rwidth(QSizeF* obj) {obj->rwidth(); } void rheight(QSizeF* obj) {obj->rheight(); } QSize toSize(QSizeF* obj) const {return obj->toSize(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qline.h' ** ** Created: Thu 12. Apr 14:07:28 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qline.h" class PythonQtQLineWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QLine() { return QLine(); } QVariant new_QLine(const QPoint & arg0,const QPoint & arg1) { return QLine(arg0,arg1); } QVariant new_QLine(int arg0,int arg1,int arg2,int arg3) { return QLine(arg0,arg1,arg2,arg3); } bool isNull(QLine* obj) const {return obj->isNull(); } QPoint p1(QLine* obj) const {return obj->p1(); } QPoint p2(QLine* obj) const {return obj->p2(); } int x1(QLine* obj) const {return obj->x1(); } int y1(QLine* obj) const {return obj->y1(); } int x2(QLine* obj) const {return obj->x2(); } int y2(QLine* obj) const {return obj->y2(); } int dx(QLine* obj) const {return obj->dx(); } int dy(QLine* obj) const {return obj->dy(); } void translate(QLine* obj,const QPoint & arg0) {obj->translate(arg0); } void translate(QLine* obj,int arg0,int arg1) {obj->translate(arg0,arg1); } }; class PythonQtQLineFWrapper : public QObject { Q_OBJECT public: Q_ENUMS(IntersectType ) enum IntersectType {NoIntersection = QLineF::NoIntersection, BoundedIntersection = QLineF::BoundedIntersection, UnboundedIntersection = QLineF::UnboundedIntersection }; public slots: QVariant new_QLineF() { return QLineF(); } QVariant new_QLineF(const QPointF & arg0,const QPointF & arg1) { return QLineF(arg0,arg1); } QVariant new_QLineF(qreal arg0,qreal arg1,qreal arg2,qreal arg3) { return QLineF(arg0,arg1,arg2,arg3); } QVariant new_QLineF(const QLine & arg0) { return QLineF(arg0); } int isNull(QLineF* obj) const {return obj->isNull(); } QPointF p1(QLineF* obj) const {return obj->p1(); } QPointF p2(QLineF* obj) const {return obj->p2(); } qreal x1(QLineF* obj) const {return obj->x1(); } qreal y1(QLineF* obj) const {return obj->y1(); } qreal x2(QLineF* obj) const {return obj->x2(); } qreal y2(QLineF* obj) const {return obj->y2(); } qreal dx(QLineF* obj) const {return obj->dx(); } qreal dy(QLineF* obj) const {return obj->dy(); } qreal length(QLineF* obj) const {return obj->length(); } void setLength(QLineF* obj,qreal arg0) {obj->setLength(arg0); } QLineF unitVector(QLineF* obj) const {return obj->unitVector(); } QLineF normalVector(QLineF* obj) const {return obj->normalVector(); } IntersectType intersect(QLineF* obj,const QLineF & arg0,QPointF * arg1) const {return (PythonQtQLineFWrapper::IntersectType)obj->intersect(arg0,arg1); } qreal angle(QLineF* obj,const QLineF & arg0) const {return obj->angle(arg0); } QPointF pointAt(QLineF* obj,qreal arg0) const {return obj->pointAt(arg0); } void translate(QLineF* obj,const QPointF & arg0) {obj->translate(arg0); } void translate(QLineF* obj,qreal arg0,qreal arg1) {obj->translate(arg0,arg1); } QLine toLine(QLineF* obj) const {return obj->toLine(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qpoint.h' ** ** Created: Thu 12. Apr 14:07:28 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qpoint.h" class PythonQtQPointWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QPoint() { return QPoint(); } QVariant new_QPoint(int arg0,int arg1) { return QPoint(arg0,arg1); } bool isNull(QPoint* obj) const {return obj->isNull(); } int x(QPoint* obj) const {return obj->x(); } int y(QPoint* obj) const {return obj->y(); } void setX(QPoint* obj,int arg0) {obj->setX(arg0); } void setY(QPoint* obj,int arg0) {obj->setY(arg0); } int manhattanLength(QPoint* obj) const {return obj->manhattanLength(); } void rx(QPoint* obj) {obj->rx(); } void ry(QPoint* obj) {obj->ry(); } }; class PythonQtQPointFWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QPointF() { return QPointF(); } QVariant new_QPointF(const QPoint & arg0) { return QPointF(arg0); } QVariant new_QPointF(qreal arg0,qreal arg1) { return QPointF(arg0,arg1); } bool isNull(QPointF* obj) const {return obj->isNull(); } qreal x(QPointF* obj) const {return obj->x(); } qreal y(QPointF* obj) const {return obj->y(); } void setX(QPointF* obj,qreal arg0) {obj->setX(arg0); } void setY(QPointF* obj,qreal arg0) {obj->setY(arg0); } void rx(QPointF* obj) {obj->rx(); } void ry(QPointF* obj) {obj->ry(); } QPoint toPoint(QPointF* obj) const {return obj->toPoint(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qregexp.h' ** ** Created: Thu 12. Apr 14:07:29 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qregexp.h" class PythonQtQRegExpWrapper : public QObject { Q_OBJECT public: Q_ENUMS(PatternSyntax CaretMode ) enum PatternSyntax {RegExp = QRegExp::RegExp, Wildcard = QRegExp::Wildcard, FixedString = QRegExp::FixedString, RegExp2 = QRegExp::RegExp2 }; enum CaretMode {CaretAtZero = QRegExp::CaretAtZero, CaretAtOffset = QRegExp::CaretAtOffset, CaretWontMatch = QRegExp::CaretWontMatch }; public slots: QVariant new_QRegExp() { return QRegExp(); } QVariant new_QRegExp(const QString & arg0,Qt::CaseSensitivity arg1,PatternSyntax arg2) { return QRegExp(arg0,arg1,(QRegExp::PatternSyntax)arg2); } QVariant new_QRegExp(const QString & arg0,Qt::CaseSensitivity arg1) { return QRegExp(arg0,arg1); } QVariant new_QRegExp(const QString & arg0) { return QRegExp(arg0); } QVariant new_QRegExp(const QRegExp & arg0) { return QRegExp(arg0); } bool isEmpty(QRegExp* obj) const {return obj->isEmpty(); } bool isValid(QRegExp* obj) const {return obj->isValid(); } QString pattern(QRegExp* obj) const {return obj->pattern(); } void setPattern(QRegExp* obj,const QString & arg0) {obj->setPattern(arg0); } Qt::CaseSensitivity caseSensitivity(QRegExp* obj) const {return obj->caseSensitivity(); } void setCaseSensitivity(QRegExp* obj,Qt::CaseSensitivity arg0) {obj->setCaseSensitivity(arg0); } PatternSyntax patternSyntax(QRegExp* obj) const {return (PythonQtQRegExpWrapper::PatternSyntax)obj->patternSyntax(); } void setPatternSyntax(QRegExp* obj,PatternSyntax arg0) {obj->setPatternSyntax((QRegExp::PatternSyntax)arg0); } bool isMinimal(QRegExp* obj) const {return obj->isMinimal(); } void setMinimal(QRegExp* obj,bool arg0) {obj->setMinimal(arg0); } bool exactMatch(QRegExp* obj,const QString & arg0) const {return obj->exactMatch(arg0); } int indexIn(QRegExp* obj,const QString & arg0,int arg1,CaretMode arg2) const {return obj->indexIn(arg0,arg1,(QRegExp::CaretMode)arg2); } int indexIn(QRegExp* obj,const QString & arg0,int arg1) const {return obj->indexIn(arg0,arg1); } int indexIn(QRegExp* obj,const QString & arg0) const {return obj->indexIn(arg0); } int lastIndexIn(QRegExp* obj,const QString & arg0,int arg1,CaretMode arg2) const {return obj->lastIndexIn(arg0,arg1,(QRegExp::CaretMode)arg2); } int lastIndexIn(QRegExp* obj,const QString & arg0,int arg1) const {return obj->lastIndexIn(arg0,arg1); } int lastIndexIn(QRegExp* obj,const QString & arg0) const {return obj->lastIndexIn(arg0); } int matchedLength(QRegExp* obj) const {return obj->matchedLength(); } int numCaptures(QRegExp* obj) const {return obj->numCaptures(); } QStringList capturedTexts(QRegExp* obj) {return obj->capturedTexts(); } QString cap(QRegExp* obj,int arg0) {return obj->cap(arg0); } QString cap(QRegExp* obj) {return obj->cap(); } int pos(QRegExp* obj,int arg0) {return obj->pos(arg0); } int pos(QRegExp* obj) {return obj->pos(); } QString errorString(QRegExp* obj) {return obj->errorString(); } QString static_QRegExp_escape(const QString & arg0) {return QRegExp::escape(arg0); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qfont.h' ** ** Created: Thu 12. Apr 14:07:29 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qfont.h" class PythonQtQFontWrapper : public QObject { Q_OBJECT public: Q_ENUMS(StyleHint StyleStrategy Weight Style Stretch ) enum StyleHint {Helvetica = QFont::Helvetica, SansSerif = QFont::SansSerif, Times = QFont::Times, Serif = QFont::Serif, Courier = QFont::Courier, TypeWriter = QFont::TypeWriter, OldEnglish = QFont::OldEnglish, Decorative = QFont::Decorative, System = QFont::System, AnyStyle = QFont::AnyStyle }; enum StyleStrategy {PreferDefault = QFont::PreferDefault, PreferBitmap = QFont::PreferBitmap, PreferDevice = QFont::PreferDevice, PreferOutline = QFont::PreferOutline, ForceOutline = QFont::ForceOutline, PreferMatch = QFont::PreferMatch, PreferQuality = QFont::PreferQuality, PreferAntialias = QFont::PreferAntialias, NoAntialias = QFont::NoAntialias, OpenGLCompatible = QFont::OpenGLCompatible, NoFontMerging = QFont::NoFontMerging }; enum Weight {Light = QFont::Light, Normal = QFont::Normal, DemiBold = QFont::DemiBold, Bold = QFont::Bold, Black = QFont::Black }; enum Style {StyleNormal = QFont::StyleNormal, StyleItalic = QFont::StyleItalic, StyleOblique = QFont::StyleOblique }; enum Stretch {UltraCondensed = QFont::UltraCondensed, ExtraCondensed = QFont::ExtraCondensed, Condensed = QFont::Condensed, SemiCondensed = QFont::SemiCondensed, Unstretched = QFont::Unstretched, SemiExpanded = QFont::SemiExpanded, Expanded = QFont::Expanded, ExtraExpanded = QFont::ExtraExpanded, UltraExpanded = QFont::UltraExpanded }; public slots: QVariant new_QFont() { return QFont(); } QVariant new_QFont(const QString & arg0,int arg1,int arg2,bool arg3) { return QFont(arg0,arg1,arg2,arg3); } QVariant new_QFont(const QString & arg0,int arg1,int arg2) { return QFont(arg0,arg1,arg2); } QVariant new_QFont(const QString & arg0,int arg1) { return QFont(arg0,arg1); } QVariant new_QFont(const QString & arg0) { return QFont(arg0); } QVariant new_QFont(const QFont & arg0,QPaintDevice * arg1) { return QFont(arg0,arg1); } QVariant new_QFont(const QFont & arg0) { return QFont(arg0); } QString family(QFont* obj) const {return obj->family(); } void setFamily(QFont* obj,const QString & arg0) {obj->setFamily(arg0); } int pointSize(QFont* obj) const {return obj->pointSize(); } void setPointSize(QFont* obj,int arg0) {obj->setPointSize(arg0); } qreal pointSizeF(QFont* obj) const {return obj->pointSizeF(); } void setPointSizeF(QFont* obj,qreal arg0) {obj->setPointSizeF(arg0); } int pixelSize(QFont* obj) const {return obj->pixelSize(); } void setPixelSize(QFont* obj,int arg0) {obj->setPixelSize(arg0); } int weight(QFont* obj) const {return obj->weight(); } void setWeight(QFont* obj,int arg0) {obj->setWeight(arg0); } bool bold(QFont* obj) const {return obj->bold(); } void setBold(QFont* obj,bool arg0) {obj->setBold(arg0); } void setStyle(QFont* obj,Style arg0) {obj->setStyle((QFont::Style)arg0); } Style style(QFont* obj) const {return (PythonQtQFontWrapper::Style)obj->style(); } bool italic(QFont* obj) const {return obj->italic(); } void setItalic(QFont* obj,bool arg0) {obj->setItalic(arg0); } bool underline(QFont* obj) const {return obj->underline(); } void setUnderline(QFont* obj,bool arg0) {obj->setUnderline(arg0); } bool overline(QFont* obj) const {return obj->overline(); } void setOverline(QFont* obj,bool arg0) {obj->setOverline(arg0); } bool strikeOut(QFont* obj) const {return obj->strikeOut(); } void setStrikeOut(QFont* obj,bool arg0) {obj->setStrikeOut(arg0); } bool fixedPitch(QFont* obj) const {return obj->fixedPitch(); } void setFixedPitch(QFont* obj,bool arg0) {obj->setFixedPitch(arg0); } bool kerning(QFont* obj) const {return obj->kerning(); } void setKerning(QFont* obj,bool arg0) {obj->setKerning(arg0); } StyleHint styleHint(QFont* obj) const {return (PythonQtQFontWrapper::StyleHint)obj->styleHint(); } StyleStrategy styleStrategy(QFont* obj) const {return (PythonQtQFontWrapper::StyleStrategy)obj->styleStrategy(); } void setStyleHint(QFont* obj,StyleHint arg0,StyleStrategy arg1) {obj->setStyleHint((QFont::StyleHint)arg0,(QFont::StyleStrategy)arg1); } void setStyleHint(QFont* obj,StyleHint arg0) {obj->setStyleHint((QFont::StyleHint)arg0); } void setStyleStrategy(QFont* obj,StyleStrategy arg0) {obj->setStyleStrategy((QFont::StyleStrategy)arg0); } int stretch(QFont* obj) const {return obj->stretch(); } void setStretch(QFont* obj,int arg0) {obj->setStretch(arg0); } bool rawMode(QFont* obj) const {return obj->rawMode(); } void setRawMode(QFont* obj,bool arg0) {obj->setRawMode(arg0); } bool exactMatch(QFont* obj) const {return obj->exactMatch(); } bool isCopyOf(QFont* obj,const QFont & arg0) const {return obj->isCopyOf(arg0); } Qt::HANDLE handle(QFont* obj) const {return obj->handle(); } void setRawName(QFont* obj,const QString & arg0) {obj->setRawName(arg0); } QString rawName(QFont* obj) const {return obj->rawName(); } QString key(QFont* obj) const {return obj->key(); } QString toString(QFont* obj) const {return obj->toString(); } bool fromString(QFont* obj,const QString & arg0) {return obj->fromString(arg0); } QString static_QFont_substitute(const QString & arg0) {return QFont::substitute(arg0); } QStringList static_QFont_substitutes(const QString & arg0) {return QFont::substitutes(arg0); } QStringList static_QFont_substitutions() {return QFont::substitutions(); } void static_QFont_insertSubstitution(const QString & arg0,const QString & arg1) {QFont::insertSubstitution(arg0,arg1); } void static_QFont_insertSubstitutions(const QString & arg0,const QStringList & arg1) {QFont::insertSubstitutions(arg0,arg1); } void static_QFont_removeSubstitution(const QString & arg0) {QFont::removeSubstitution(arg0); } void static_QFont_initialize() {QFont::initialize(); } void static_QFont_cleanup() {QFont::cleanup(); } void static_QFont_cacheStatistics() {QFont::cacheStatistics(); } QString defaultFamily(QFont* obj) const {return obj->defaultFamily(); } QString lastResortFamily(QFont* obj) const {return obj->lastResortFamily(); } QString lastResortFont(QFont* obj) const {return obj->lastResortFont(); } QFont resolve(QFont* obj,const QFont & arg0) const {return obj->resolve(arg0); } uint resolve(QFont* obj) const {return obj->resolve(); } void resolve(QFont* obj,uint arg0) {obj->resolve(arg0); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qpixmap.h' ** ** Created: Thu 12. Apr 14:07:29 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qpixmap.h" class PythonQtQPixmapWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QPixmap() { return QPixmap(); } QVariant new_QPixmap(int arg0,int arg1) { return QPixmap(arg0,arg1); } QVariant new_QPixmap(const QSize & arg0) { return QPixmap(arg0); } QVariant new_QPixmap(const QString & arg0,const char * arg1,Qt::ImageConversionFlags arg2) { return QPixmap(arg0,arg1,arg2); } QVariant new_QPixmap(const QString & arg0,const char * arg1) { return QPixmap(arg0,arg1); } QVariant new_QPixmap(const QString & arg0) { return QPixmap(arg0); } QVariant new_QPixmap(const QPixmap & arg0) { return QPixmap(arg0); } bool isNull(QPixmap* obj) const {return obj->isNull(); } int devType(QPixmap* obj) const {return obj->devType(); } int width(QPixmap* obj) const {return obj->width(); } int height(QPixmap* obj) const {return obj->height(); } QSize size(QPixmap* obj) const {return obj->size(); } QRect rect(QPixmap* obj) const {return obj->rect(); } int depth(QPixmap* obj) const {return obj->depth(); } int static_QPixmap_defaultDepth() {return QPixmap::defaultDepth(); } void fill(QPixmap* obj,const QColor & arg0) {obj->fill(arg0); } void fill(QPixmap* obj) {obj->fill(); } void fill(QPixmap* obj,const QWidget * arg0,const QPoint & arg1) {obj->fill(arg0,arg1); } void fill(QPixmap* obj,const QWidget * arg0,int arg1,int arg2) {obj->fill(arg0,arg1,arg2); } QBitmap mask(QPixmap* obj) const {return obj->mask(); } void setMask(QPixmap* obj,const QBitmap & arg0) {obj->setMask(arg0); } QPixmap alphaChannel(QPixmap* obj) const {return obj->alphaChannel(); } void setAlphaChannel(QPixmap* obj,const QPixmap & arg0) {obj->setAlphaChannel(arg0); } bool hasAlpha(QPixmap* obj) const {return obj->hasAlpha(); } bool hasAlphaChannel(QPixmap* obj) const {return obj->hasAlphaChannel(); } QBitmap createHeuristicMask(QPixmap* obj,bool arg0) const {return obj->createHeuristicMask(arg0); } QBitmap createHeuristicMask(QPixmap* obj) const {return obj->createHeuristicMask(); } QBitmap createMaskFromColor(QPixmap* obj,const QColor & arg0) const {return obj->createMaskFromColor(arg0); } QPixmap static_QPixmap_grabWindow(WId arg0,int arg1,int arg2,int arg3,int arg4) {return QPixmap::grabWindow(arg0,arg1,arg2,arg3,arg4); } QPixmap static_QPixmap_grabWindow(WId arg0,int arg1,int arg2,int arg3) {return QPixmap::grabWindow(arg0,arg1,arg2,arg3); } QPixmap static_QPixmap_grabWindow(WId arg0,int arg1,int arg2) {return QPixmap::grabWindow(arg0,arg1,arg2); } QPixmap static_QPixmap_grabWindow(WId arg0,int arg1) {return QPixmap::grabWindow(arg0,arg1); } QPixmap static_QPixmap_grabWindow(WId arg0) {return QPixmap::grabWindow(arg0); } QPixmap static_QPixmap_grabWidget(QWidget * arg0,const QRect & arg1) {return QPixmap::grabWidget(arg0,arg1); } QPixmap grabWidget(QPixmap* obj,QWidget * arg0,int arg1,int arg2,int arg3,int arg4) {return obj->grabWidget(arg0,arg1,arg2,arg3,arg4); } QPixmap grabWidget(QPixmap* obj,QWidget * arg0,int arg1,int arg2,int arg3) {return obj->grabWidget(arg0,arg1,arg2,arg3); } QPixmap grabWidget(QPixmap* obj,QWidget * arg0,int arg1,int arg2) {return obj->grabWidget(arg0,arg1,arg2); } QPixmap grabWidget(QPixmap* obj,QWidget * arg0,int arg1) {return obj->grabWidget(arg0,arg1); } QPixmap grabWidget(QPixmap* obj,QWidget * arg0) {return obj->grabWidget(arg0); } QPixmap scaled(QPixmap* obj,int arg0,int arg1,Qt::AspectRatioMode arg2,Qt::TransformationMode arg3) const {return obj->scaled(arg0,arg1,arg2,arg3); } QPixmap scaled(QPixmap* obj,int arg0,int arg1,Qt::AspectRatioMode arg2) const {return obj->scaled(arg0,arg1,arg2); } QPixmap scaled(QPixmap* obj,int arg0,int arg1) const {return obj->scaled(arg0,arg1); } QPixmap scaled(QPixmap* obj,const QSize & arg0,Qt::AspectRatioMode arg1,Qt::TransformationMode arg2) const {return obj->scaled(arg0,arg1,arg2); } QPixmap scaled(QPixmap* obj,const QSize & arg0,Qt::AspectRatioMode arg1) const {return obj->scaled(arg0,arg1); } QPixmap scaled(QPixmap* obj,const QSize & arg0) const {return obj->scaled(arg0); } QPixmap scaledToWidth(QPixmap* obj,int arg0,Qt::TransformationMode arg1) const {return obj->scaledToWidth(arg0,arg1); } QPixmap scaledToWidth(QPixmap* obj,int arg0) const {return obj->scaledToWidth(arg0); } QPixmap scaledToHeight(QPixmap* obj,int arg0,Qt::TransformationMode arg1) const {return obj->scaledToHeight(arg0,arg1); } QPixmap scaledToHeight(QPixmap* obj,int arg0) const {return obj->scaledToHeight(arg0); } QPixmap transformed(QPixmap* obj,const QMatrix & arg0,Qt::TransformationMode arg1) const {return obj->transformed(arg0,arg1); } QPixmap transformed(QPixmap* obj,const QMatrix & arg0) const {return obj->transformed(arg0); } QMatrix static_QPixmap_trueMatrix(const QMatrix & arg0,int arg1,int arg2) {return QPixmap::trueMatrix(arg0,arg1,arg2); } QImage toImage(QPixmap* obj) const {return obj->toImage(); } QPixmap static_QPixmap_fromImage(const QImage & arg0,Qt::ImageConversionFlags arg1) {return QPixmap::fromImage(arg0,arg1); } QPixmap static_QPixmap_fromImage(const QImage & arg0) {return QPixmap::fromImage(arg0); } bool load(QPixmap* obj,const QString & arg0,const char * arg1,Qt::ImageConversionFlags arg2) {return obj->load(arg0,arg1,arg2); } bool load(QPixmap* obj,const QString & arg0,const char * arg1) {return obj->load(arg0,arg1); } bool load(QPixmap* obj,const QString & arg0) {return obj->load(arg0); } bool loadFromData(QPixmap* obj,const uchar * arg0,uint arg1,const char * arg2,Qt::ImageConversionFlags arg3) {return obj->loadFromData(arg0,arg1,arg2,arg3); } bool loadFromData(QPixmap* obj,const uchar * arg0,uint arg1,const char * arg2) {return obj->loadFromData(arg0,arg1,arg2); } bool loadFromData(QPixmap* obj,const uchar * arg0,uint arg1) {return obj->loadFromData(arg0,arg1); } bool loadFromData(QPixmap* obj,const QByteArray & arg0,const char * arg1,Qt::ImageConversionFlags arg2) {return obj->loadFromData(arg0,arg1,arg2); } bool loadFromData(QPixmap* obj,const QByteArray & arg0,const char * arg1) {return obj->loadFromData(arg0,arg1); } bool loadFromData(QPixmap* obj,const QByteArray & arg0) {return obj->loadFromData(arg0); } bool save(QPixmap* obj,const QString & arg0,const char * arg1,int arg2) const {return obj->save(arg0,arg1,arg2); } bool save(QPixmap* obj,const QString & arg0,const char * arg1) const {return obj->save(arg0,arg1); } bool save(QPixmap* obj,const QString & arg0) const {return obj->save(arg0); } bool save(QPixmap* obj,QIODevice * arg0,const char * arg1,int arg2) const {return obj->save(arg0,arg1,arg2); } bool save(QPixmap* obj,QIODevice * arg0,const char * arg1) const {return obj->save(arg0,arg1); } bool save(QPixmap* obj,QIODevice * arg0) const {return obj->save(arg0); } QPixmap copy(QPixmap* obj,int arg0,int arg1,int arg2,int arg3) const {return obj->copy(arg0,arg1,arg2,arg3); } QPixmap copy(QPixmap* obj,const QRect & arg0) const {return obj->copy(arg0); } QPixmap copy(QPixmap* obj) const {return obj->copy(); } int serialNumber(QPixmap* obj) const {return obj->serialNumber(); } bool isDetached(QPixmap* obj) const {return obj->isDetached(); } void detach(QPixmap* obj) {obj->detach(); } bool isQBitmap(QPixmap* obj) const {return obj->isQBitmap(); } QPaintEngine* paintEngine(QPixmap* obj) const {return obj->paintEngine(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qbrush.h' ** ** Created: Thu 12. Apr 14:07:29 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qbrush.h" class PythonQtQBrushWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QBrush() { return QBrush(); } QVariant new_QBrush(Qt::BrushStyle arg0) { return QBrush(arg0); } QVariant new_QBrush(const QColor & arg0,Qt::BrushStyle arg1) { return QBrush(arg0,arg1); } QVariant new_QBrush(const QColor & arg0) { return QBrush(arg0); } QVariant new_QBrush(Qt::GlobalColor arg0,Qt::BrushStyle arg1) { return QBrush(arg0,arg1); } QVariant new_QBrush(Qt::GlobalColor arg0) { return QBrush(arg0); } QVariant new_QBrush(const QColor & arg0,const QPixmap & arg1) { return QBrush(arg0,arg1); } QVariant new_QBrush(Qt::GlobalColor arg0,const QPixmap & arg1) { return QBrush(arg0,arg1); } QVariant new_QBrush(const QPixmap & arg0) { return QBrush(arg0); } QVariant new_QBrush(const QImage & arg0) { return QBrush(arg0); } QVariant new_QBrush(const QBrush & arg0) { return QBrush(arg0); } QVariant new_QBrush(const QGradient & arg0) { return QBrush(arg0); } Qt::BrushStyle style(QBrush* obj) const {return obj->style(); } void setStyle(QBrush* obj,Qt::BrushStyle arg0) {obj->setStyle(arg0); } void matrix(QBrush* obj) const {obj->matrix(); } void setMatrix(QBrush* obj,const QMatrix & arg0) {obj->setMatrix(arg0); } QPixmap texture(QBrush* obj) const {return obj->texture(); } void setTexture(QBrush* obj,const QPixmap & arg0) {obj->setTexture(arg0); } QImage textureImage(QBrush* obj) const {return obj->textureImage(); } void setTextureImage(QBrush* obj,const QImage & arg0) {obj->setTextureImage(arg0); } void color(QBrush* obj) const {obj->color(); } void setColor(QBrush* obj,const QColor & arg0) {obj->setColor(arg0); } void setColor(QBrush* obj,Qt::GlobalColor arg0) {obj->setColor(arg0); } const QGradient* gradient(QBrush* obj) const {return obj->gradient(); } bool isOpaque(QBrush* obj) const {return obj->isOpaque(); } }; class PythonQtQBrushDataWrapper : public QObject { Q_OBJECT public: public slots: void delete_QBrushData(QBrushData* obj) { delete obj; } }; class PythonQtQGradientWrapper : public QObject { Q_OBJECT public: Q_ENUMS(Type Spread CoordinateMode ) enum Type {LinearGradient = QGradient::LinearGradient, RadialGradient = QGradient::RadialGradient, ConicalGradient = QGradient::ConicalGradient, NoGradient = QGradient::NoGradient }; enum Spread {PadSpread = QGradient::PadSpread, ReflectSpread = QGradient::ReflectSpread, RepeatSpread = QGradient::RepeatSpread }; enum CoordinateMode {LogicalMode = QGradient::LogicalMode, StretchToDeviceMode = QGradient::StretchToDeviceMode }; public slots: void delete_QGradient(QGradient* obj) { delete obj; } QGradient* new_QGradient() { return new QGradient(); } Type type(QGradient* obj) const {return (PythonQtQGradientWrapper::Type)obj->type(); } void setSpread(QGradient* obj,Spread arg0) {obj->setSpread((QGradient::Spread)arg0); } Spread spread(QGradient* obj) const {return (PythonQtQGradientWrapper::Spread)obj->spread(); } void setColorAt(QGradient* obj,qreal arg0,const QColor & arg1) {obj->setColorAt(arg0,arg1); } void setStops(QGradient* obj,const QGradientStops & arg0) {obj->setStops(arg0); } QGradientStops stops(QGradient* obj) const {return obj->stops(); } CoordinateMode coordinateMode(QGradient* obj) const {return (PythonQtQGradientWrapper::CoordinateMode)obj->coordinateMode(); } void setCoordinateMode(QGradient* obj,CoordinateMode arg0) {obj->setCoordinateMode((QGradient::CoordinateMode)arg0); } }; class PythonQtQLinearGradientWrapper : public QObject { Q_OBJECT public: public slots: void delete_QLinearGradient(QLinearGradient* obj) { delete obj; } QLinearGradient* new_QLinearGradient() { return new QLinearGradient(); } QLinearGradient* new_QLinearGradient(const QPointF & arg0,const QPointF & arg1) { return new QLinearGradient(arg0,arg1); } QLinearGradient* new_QLinearGradient(qreal arg0,qreal arg1,qreal arg2,qreal arg3) { return new QLinearGradient(arg0,arg1,arg2,arg3); } QPointF start(QLinearGradient* obj) const {return obj->start(); } void setStart(QLinearGradient* obj,const QPointF & arg0) {obj->setStart(arg0); } void setStart(QLinearGradient* obj,qreal arg0,qreal arg1) {obj->setStart(arg0,arg1); } QPointF finalStop(QLinearGradient* obj) const {return obj->finalStop(); } void setFinalStop(QLinearGradient* obj,const QPointF & arg0) {obj->setFinalStop(arg0); } void setFinalStop(QLinearGradient* obj,qreal arg0,qreal arg1) {obj->setFinalStop(arg0,arg1); } }; class PythonQtQRadialGradientWrapper : public QObject { Q_OBJECT public: public slots: void delete_QRadialGradient(QRadialGradient* obj) { delete obj; } QRadialGradient* new_QRadialGradient() { return new QRadialGradient(); } QRadialGradient* new_QRadialGradient(const QPointF & arg0,qreal arg1,const QPointF & arg2) { return new QRadialGradient(arg0,arg1,arg2); } QRadialGradient* new_QRadialGradient(qreal arg0,qreal arg1,qreal arg2,qreal arg3,qreal arg4) { return new QRadialGradient(arg0,arg1,arg2,arg3,arg4); } QRadialGradient* new_QRadialGradient(const QPointF & arg0,qreal arg1) { return new QRadialGradient(arg0,arg1); } QRadialGradient* new_QRadialGradient(qreal arg0,qreal arg1,qreal arg2) { return new QRadialGradient(arg0,arg1,arg2); } QPointF center(QRadialGradient* obj) const {return obj->center(); } void setCenter(QRadialGradient* obj,const QPointF & arg0) {obj->setCenter(arg0); } void setCenter(QRadialGradient* obj,qreal arg0,qreal arg1) {obj->setCenter(arg0,arg1); } QPointF focalPoint(QRadialGradient* obj) const {return obj->focalPoint(); } void setFocalPoint(QRadialGradient* obj,const QPointF & arg0) {obj->setFocalPoint(arg0); } void setFocalPoint(QRadialGradient* obj,qreal arg0,qreal arg1) {obj->setFocalPoint(arg0,arg1); } qreal radius(QRadialGradient* obj) const {return obj->radius(); } void setRadius(QRadialGradient* obj,qreal arg0) {obj->setRadius(arg0); } }; class PythonQtQConicalGradientWrapper : public QObject { Q_OBJECT public: public slots: void delete_QConicalGradient(QConicalGradient* obj) { delete obj; } QConicalGradient* new_QConicalGradient() { return new QConicalGradient(); } QConicalGradient* new_QConicalGradient(const QPointF & arg0,qreal arg1) { return new QConicalGradient(arg0,arg1); } QConicalGradient* new_QConicalGradient(qreal arg0,qreal arg1,qreal arg2) { return new QConicalGradient(arg0,arg1,arg2); } QPointF center(QConicalGradient* obj) const {return obj->center(); } void setCenter(QConicalGradient* obj,const QPointF & arg0) {obj->setCenter(arg0); } void setCenter(QConicalGradient* obj,qreal arg0,qreal arg1) {obj->setCenter(arg0,arg1); } qreal angle(QConicalGradient* obj) const {return obj->angle(); } void setAngle(QConicalGradient* obj,qreal arg0) {obj->setAngle(arg0); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qcolor.h' ** ** Created: Thu 12. Apr 14:07:30 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qcolor.h" class PythonQtQColorWrapper : public QObject { Q_OBJECT public: Q_ENUMS(Spec ) enum Spec {Invalid = QColor::Invalid, Rgb = QColor::Rgb, Hsv = QColor::Hsv, Cmyk = QColor::Cmyk }; public slots: QVariant new_QColor() { return QColor(); } QVariant new_QColor(Qt::GlobalColor arg0) { return QColor(arg0); } QVariant new_QColor(int arg0,int arg1,int arg2,int arg3) { return QColor(arg0,arg1,arg2,arg3); } QVariant new_QColor(int arg0,int arg1,int arg2) { return QColor(arg0,arg1,arg2); } QVariant new_QColor(QRgb arg0) { return QColor(arg0); } QVariant new_QColor(const QString & arg0) { return QColor(arg0); } QVariant new_QColor(const char * arg0) { return QColor(arg0); } QVariant new_QColor(const QColor & arg0) { return QColor(arg0); } QVariant new_QColor(Spec arg0) { return QColor((QColor::Spec)arg0); } bool isValid(QColor* obj) const {return obj->isValid(); } QString name(QColor* obj) const {return obj->name(); } void setNamedColor(QColor* obj,const QString & arg0) {obj->setNamedColor(arg0); } QStringList static_QColor_colorNames() {return QColor::colorNames(); } Spec spec(QColor* obj) const {return (PythonQtQColorWrapper::Spec)obj->spec(); } int alpha(QColor* obj) const {return obj->alpha(); } void setAlpha(QColor* obj,int arg0) {obj->setAlpha(arg0); } qreal alphaF(QColor* obj) const {return obj->alphaF(); } void setAlphaF(QColor* obj,qreal arg0) {obj->setAlphaF(arg0); } int red(QColor* obj) const {return obj->red(); } int green(QColor* obj) const {return obj->green(); } int blue(QColor* obj) const {return obj->blue(); } void setRed(QColor* obj,int arg0) {obj->setRed(arg0); } void setGreen(QColor* obj,int arg0) {obj->setGreen(arg0); } void setBlue(QColor* obj,int arg0) {obj->setBlue(arg0); } qreal redF(QColor* obj) const {return obj->redF(); } qreal greenF(QColor* obj) const {return obj->greenF(); } qreal blueF(QColor* obj) const {return obj->blueF(); } void setRedF(QColor* obj,qreal arg0) {obj->setRedF(arg0); } void setGreenF(QColor* obj,qreal arg0) {obj->setGreenF(arg0); } void setBlueF(QColor* obj,qreal arg0) {obj->setBlueF(arg0); } void getRgb(QColor* obj,int * arg0,int * arg1,int * arg2,int * arg3) const {obj->getRgb(arg0,arg1,arg2,arg3); } void getRgb(QColor* obj,int * arg0,int * arg1,int * arg2) const {obj->getRgb(arg0,arg1,arg2); } void setRgb(QColor* obj,int arg0,int arg1,int arg2,int arg3) {obj->setRgb(arg0,arg1,arg2,arg3); } void setRgb(QColor* obj,int arg0,int arg1,int arg2) {obj->setRgb(arg0,arg1,arg2); } void getRgbF(QColor* obj,qreal * arg0,qreal * arg1,qreal * arg2,qreal * arg3) const {obj->getRgbF(arg0,arg1,arg2,arg3); } void getRgbF(QColor* obj,qreal * arg0,qreal * arg1,qreal * arg2) const {obj->getRgbF(arg0,arg1,arg2); } void setRgbF(QColor* obj,qreal arg0,qreal arg1,qreal arg2,qreal arg3) {obj->setRgbF(arg0,arg1,arg2,arg3); } void setRgbF(QColor* obj,qreal arg0,qreal arg1,qreal arg2) {obj->setRgbF(arg0,arg1,arg2); } QRgb rgba(QColor* obj) const {return obj->rgba(); } void setRgba(QColor* obj,QRgb arg0) {obj->setRgba(arg0); } QRgb rgb(QColor* obj) const {return obj->rgb(); } void setRgb(QColor* obj,QRgb arg0) {obj->setRgb(arg0); } int hue(QColor* obj) const {return obj->hue(); } int saturation(QColor* obj) const {return obj->saturation(); } int value(QColor* obj) const {return obj->value(); } qreal hueF(QColor* obj) const {return obj->hueF(); } qreal saturationF(QColor* obj) const {return obj->saturationF(); } qreal valueF(QColor* obj) const {return obj->valueF(); } void getHsv(QColor* obj,int * arg0,int * arg1,int * arg2,int * arg3) const {obj->getHsv(arg0,arg1,arg2,arg3); } void getHsv(QColor* obj,int * arg0,int * arg1,int * arg2) const {obj->getHsv(arg0,arg1,arg2); } void setHsv(QColor* obj,int arg0,int arg1,int arg2,int arg3) {obj->setHsv(arg0,arg1,arg2,arg3); } void setHsv(QColor* obj,int arg0,int arg1,int arg2) {obj->setHsv(arg0,arg1,arg2); } void getHsvF(QColor* obj,qreal * arg0,qreal * arg1,qreal * arg2,qreal * arg3) const {obj->getHsvF(arg0,arg1,arg2,arg3); } void getHsvF(QColor* obj,qreal * arg0,qreal * arg1,qreal * arg2) const {obj->getHsvF(arg0,arg1,arg2); } void setHsvF(QColor* obj,qreal arg0,qreal arg1,qreal arg2,qreal arg3) {obj->setHsvF(arg0,arg1,arg2,arg3); } void setHsvF(QColor* obj,qreal arg0,qreal arg1,qreal arg2) {obj->setHsvF(arg0,arg1,arg2); } int cyan(QColor* obj) const {return obj->cyan(); } int magenta(QColor* obj) const {return obj->magenta(); } int yellow(QColor* obj) const {return obj->yellow(); } int black(QColor* obj) const {return obj->black(); } qreal cyanF(QColor* obj) const {return obj->cyanF(); } qreal magentaF(QColor* obj) const {return obj->magentaF(); } qreal yellowF(QColor* obj) const {return obj->yellowF(); } qreal blackF(QColor* obj) const {return obj->blackF(); } void getCmyk(QColor* obj,int * arg0,int * arg1,int * arg2,int * arg3,int * arg4) {obj->getCmyk(arg0,arg1,arg2,arg3,arg4); } void getCmyk(QColor* obj,int * arg0,int * arg1,int * arg2,int * arg3) {obj->getCmyk(arg0,arg1,arg2,arg3); } void setCmyk(QColor* obj,int arg0,int arg1,int arg2,int arg3,int arg4) {obj->setCmyk(arg0,arg1,arg2,arg3,arg4); } void setCmyk(QColor* obj,int arg0,int arg1,int arg2,int arg3) {obj->setCmyk(arg0,arg1,arg2,arg3); } void getCmykF(QColor* obj,qreal * arg0,qreal * arg1,qreal * arg2,qreal * arg3,qreal * arg4) {obj->getCmykF(arg0,arg1,arg2,arg3,arg4); } void getCmykF(QColor* obj,qreal * arg0,qreal * arg1,qreal * arg2,qreal * arg3) {obj->getCmykF(arg0,arg1,arg2,arg3); } void setCmykF(QColor* obj,qreal arg0,qreal arg1,qreal arg2,qreal arg3,qreal arg4) {obj->setCmykF(arg0,arg1,arg2,arg3,arg4); } void setCmykF(QColor* obj,qreal arg0,qreal arg1,qreal arg2,qreal arg3) {obj->setCmykF(arg0,arg1,arg2,arg3); } QColor toRgb(QColor* obj) const {return obj->toRgb(); } QColor toHsv(QColor* obj) const {return obj->toHsv(); } QColor toCmyk(QColor* obj) const {return obj->toCmyk(); } QColor convertTo(QColor* obj,Spec arg0) const {return obj->convertTo((QColor::Spec)arg0); } QColor static_QColor_fromRgb(QRgb arg0) {return QColor::fromRgb(arg0); } QColor static_QColor_fromRgba(QRgb arg0) {return QColor::fromRgba(arg0); } QColor static_QColor_fromRgb(int arg0,int arg1,int arg2,int arg3) {return QColor::fromRgb(arg0,arg1,arg2,arg3); } QColor static_QColor_fromRgb(int arg0,int arg1,int arg2) {return QColor::fromRgb(arg0,arg1,arg2); } QColor static_QColor_fromRgbF(qreal arg0,qreal arg1,qreal arg2,qreal arg3) {return QColor::fromRgbF(arg0,arg1,arg2,arg3); } QColor static_QColor_fromRgbF(qreal arg0,qreal arg1,qreal arg2) {return QColor::fromRgbF(arg0,arg1,arg2); } QColor static_QColor_fromHsv(int arg0,int arg1,int arg2,int arg3) {return QColor::fromHsv(arg0,arg1,arg2,arg3); } QColor static_QColor_fromHsv(int arg0,int arg1,int arg2) {return QColor::fromHsv(arg0,arg1,arg2); } QColor static_QColor_fromHsvF(qreal arg0,qreal arg1,qreal arg2,qreal arg3) {return QColor::fromHsvF(arg0,arg1,arg2,arg3); } QColor static_QColor_fromHsvF(qreal arg0,qreal arg1,qreal arg2) {return QColor::fromHsvF(arg0,arg1,arg2); } QColor static_QColor_fromCmyk(int arg0,int arg1,int arg2,int arg3,int arg4) {return QColor::fromCmyk(arg0,arg1,arg2,arg3,arg4); } QColor static_QColor_fromCmyk(int arg0,int arg1,int arg2,int arg3) {return QColor::fromCmyk(arg0,arg1,arg2,arg3); } QColor static_QColor_fromCmykF(qreal arg0,qreal arg1,qreal arg2,qreal arg3,qreal arg4) {return QColor::fromCmykF(arg0,arg1,arg2,arg3,arg4); } QColor static_QColor_fromCmykF(qreal arg0,qreal arg1,qreal arg2,qreal arg3) {return QColor::fromCmykF(arg0,arg1,arg2,arg3); } QColor light(QColor* obj,int arg0) const {return obj->light(arg0); } QColor light(QColor* obj) const {return obj->light(); } QColor dark(QColor* obj,int arg0) const {return obj->dark(arg0); } QColor dark(QColor* obj) const {return obj->dark(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qpalette.h' ** ** Created: Thu 12. Apr 14:07:30 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qpalette.h" class PythonQtQPaletteWrapper : public QObject { Q_OBJECT public: Q_ENUMS(ColorGroup ColorRole ) enum ColorGroup {Active = QPalette::Active, Disabled = QPalette::Disabled, Inactive = QPalette::Inactive, NColorGroups = QPalette::NColorGroups, Current = QPalette::Current, All = QPalette::All, Normal = QPalette::Normal }; enum ColorRole {WindowText = QPalette::WindowText, Button = QPalette::Button, Light = QPalette::Light, Midlight = QPalette::Midlight, Dark = QPalette::Dark, Mid = QPalette::Mid, Text = QPalette::Text, BrightText = QPalette::BrightText, ButtonText = QPalette::ButtonText, Base = QPalette::Base, Window = QPalette::Window, Shadow = QPalette::Shadow, Highlight = QPalette::Highlight, HighlightedText = QPalette::HighlightedText, Link = QPalette::Link, LinkVisited = QPalette::LinkVisited, AlternateBase = QPalette::AlternateBase, NoRole = QPalette::NoRole, NColorRoles = QPalette::NColorRoles, Foreground = QPalette::Foreground, Background = QPalette::Background }; public slots: QVariant new_QPalette() { return QPalette(); } QVariant new_QPalette(const QColor & arg0) { return QPalette(arg0); } QVariant new_QPalette(Qt::GlobalColor arg0) { return QPalette(arg0); } QVariant new_QPalette(const QColor & arg0,const QColor & arg1) { return QPalette(arg0,arg1); } QVariant new_QPalette(const QBrush & arg0,const QBrush & arg1,const QBrush & arg2,const QBrush & arg3,const QBrush & arg4,const QBrush & arg5,const QBrush & arg6,const QBrush & arg7,const QBrush & arg8) { return QPalette(arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); } QVariant new_QPalette(const QColor & arg0,const QColor & arg1,const QColor & arg2,const QColor & arg3,const QColor & arg4,const QColor & arg5,const QColor & arg6) { return QPalette(arg0,arg1,arg2,arg3,arg4,arg5,arg6); } QVariant new_QPalette(const QPalette & arg0) { return QPalette(arg0); } ColorGroup currentColorGroup(QPalette* obj) const {return (PythonQtQPaletteWrapper::ColorGroup)obj->currentColorGroup(); } void setCurrentColorGroup(QPalette* obj,ColorGroup arg0) {obj->setCurrentColorGroup((QPalette::ColorGroup)arg0); } void color(QPalette* obj,ColorGroup arg0,ColorRole arg1) const {obj->color((QPalette::ColorGroup)arg0,(QPalette::ColorRole)arg1); } void brush(QPalette* obj,ColorGroup arg0,ColorRole arg1) const {obj->brush((QPalette::ColorGroup)arg0,(QPalette::ColorRole)arg1); } void setColor(QPalette* obj,ColorGroup arg0,ColorRole arg1,const QColor & arg2) {obj->setColor((QPalette::ColorGroup)arg0,(QPalette::ColorRole)arg1,arg2); } void setColor(QPalette* obj,ColorRole arg0,const QColor & arg1) {obj->setColor((QPalette::ColorRole)arg0,arg1); } void setBrush(QPalette* obj,ColorRole arg0,const QBrush & arg1) {obj->setBrush((QPalette::ColorRole)arg0,arg1); } bool isBrushSet(QPalette* obj,ColorGroup arg0,ColorRole arg1) const {return obj->isBrushSet((QPalette::ColorGroup)arg0,(QPalette::ColorRole)arg1); } void setBrush(QPalette* obj,ColorGroup arg0,ColorRole arg1,const QBrush & arg2) {obj->setBrush((QPalette::ColorGroup)arg0,(QPalette::ColorRole)arg1,arg2); } void setColorGroup(QPalette* obj,ColorGroup arg0,const QBrush & arg1,const QBrush & arg2,const QBrush & arg3,const QBrush & arg4,const QBrush & arg5,const QBrush & arg6,const QBrush & arg7,const QBrush & arg8,const QBrush & arg9) {obj->setColorGroup((QPalette::ColorGroup)arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9); } bool isEqual(QPalette* obj,ColorGroup arg0,ColorGroup arg1) const {return obj->isEqual((QPalette::ColorGroup)arg0,(QPalette::ColorGroup)arg1); } void color(QPalette* obj,ColorRole arg0) const {obj->color((QPalette::ColorRole)arg0); } void brush(QPalette* obj,ColorRole arg0) const {obj->brush((QPalette::ColorRole)arg0); } void foreground(QPalette* obj) const {obj->foreground(); } void windowText(QPalette* obj) const {obj->windowText(); } void button(QPalette* obj) const {obj->button(); } void light(QPalette* obj) const {obj->light(); } void dark(QPalette* obj) const {obj->dark(); } void mid(QPalette* obj) const {obj->mid(); } void text(QPalette* obj) const {obj->text(); } void base(QPalette* obj) const {obj->base(); } void alternateBase(QPalette* obj) const {obj->alternateBase(); } void background(QPalette* obj) const {obj->background(); } void window(QPalette* obj) const {obj->window(); } void midlight(QPalette* obj) const {obj->midlight(); } void brightText(QPalette* obj) const {obj->brightText(); } void buttonText(QPalette* obj) const {obj->buttonText(); } void shadow(QPalette* obj) const {obj->shadow(); } void highlight(QPalette* obj) const {obj->highlight(); } void highlightedText(QPalette* obj) const {obj->highlightedText(); } void link(QPalette* obj) const {obj->link(); } void linkVisited(QPalette* obj) const {obj->linkVisited(); } bool isCopyOf(QPalette* obj,const QPalette & arg0) const {return obj->isCopyOf(arg0); } int serialNumber(QPalette* obj) const {return obj->serialNumber(); } QPalette resolve(QPalette* obj,const QPalette & arg0) const {return obj->resolve(arg0); } uint resolve(QPalette* obj) const {return obj->resolve(); } void resolve(QPalette* obj,uint arg0) {obj->resolve(arg0); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qicon.h' ** ** Created: Thu 12. Apr 14:07:30 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qicon.h" class PythonQtQIconWrapper : public QObject { Q_OBJECT public: Q_ENUMS(Mode State ) enum Mode {Normal = QIcon::Normal, Disabled = QIcon::Disabled, Active = QIcon::Active, Selected = QIcon::Selected }; enum State {On = QIcon::On, Off = QIcon::Off }; public slots: QVariant new_QIcon() { return QIcon(); } QVariant new_QIcon(const QPixmap & arg0) { return QIcon(arg0); } QVariant new_QIcon(const QIcon & arg0) { return QIcon(arg0); } QVariant new_QIcon(const QString & arg0) { return QIcon(arg0); } QVariant new_QIcon(QIconEngine * arg0) { return QIcon(arg0); } QPixmap pixmap(QIcon* obj,const QSize & arg0,Mode arg1,State arg2) const {return obj->pixmap(arg0,(QIcon::Mode)arg1,(QIcon::State)arg2); } QPixmap pixmap(QIcon* obj,const QSize & arg0,Mode arg1) const {return obj->pixmap(arg0,(QIcon::Mode)arg1); } QPixmap pixmap(QIcon* obj,const QSize & arg0) const {return obj->pixmap(arg0); } QPixmap pixmap(QIcon* obj,int arg0,int arg1,Mode arg2,State arg3) const {return obj->pixmap(arg0,arg1,(QIcon::Mode)arg2,(QIcon::State)arg3); } QPixmap pixmap(QIcon* obj,int arg0,int arg1,Mode arg2) const {return obj->pixmap(arg0,arg1,(QIcon::Mode)arg2); } QPixmap pixmap(QIcon* obj,int arg0,int arg1) const {return obj->pixmap(arg0,arg1); } QPixmap pixmap(QIcon* obj,int arg0,Mode arg1,State arg2) const {return obj->pixmap(arg0,(QIcon::Mode)arg1,(QIcon::State)arg2); } QPixmap pixmap(QIcon* obj,int arg0,Mode arg1) const {return obj->pixmap(arg0,(QIcon::Mode)arg1); } QPixmap pixmap(QIcon* obj,int arg0) const {return obj->pixmap(arg0); } QSize actualSize(QIcon* obj,const QSize & arg0,Mode arg1,State arg2) const {return obj->actualSize(arg0,(QIcon::Mode)arg1,(QIcon::State)arg2); } QSize actualSize(QIcon* obj,const QSize & arg0,Mode arg1) const {return obj->actualSize(arg0,(QIcon::Mode)arg1); } QSize actualSize(QIcon* obj,const QSize & arg0) const {return obj->actualSize(arg0); } void paint(QIcon* obj,QPainter * arg0,const QRect & arg1,Qt::Alignment arg2,Mode arg3,State arg4) const {obj->paint(arg0,arg1,arg2,(QIcon::Mode)arg3,(QIcon::State)arg4); } void paint(QIcon* obj,QPainter * arg0,const QRect & arg1,Qt::Alignment arg2,Mode arg3) const {obj->paint(arg0,arg1,arg2,(QIcon::Mode)arg3); } void paint(QIcon* obj,QPainter * arg0,const QRect & arg1,Qt::Alignment arg2) const {obj->paint(arg0,arg1,arg2); } void paint(QIcon* obj,QPainter * arg0,const QRect & arg1) const {obj->paint(arg0,arg1); } void paint(QIcon* obj,QPainter * arg0,int arg1,int arg2,int arg3,int arg4,Qt::Alignment arg5,Mode arg6,State arg7) const {obj->paint(arg0,arg1,arg2,arg3,arg4,arg5,(QIcon::Mode)arg6,(QIcon::State)arg7); } void paint(QIcon* obj,QPainter * arg0,int arg1,int arg2,int arg3,int arg4,Qt::Alignment arg5,Mode arg6) const {obj->paint(arg0,arg1,arg2,arg3,arg4,arg5,(QIcon::Mode)arg6); } void paint(QIcon* obj,QPainter * arg0,int arg1,int arg2,int arg3,int arg4,Qt::Alignment arg5) const {obj->paint(arg0,arg1,arg2,arg3,arg4,arg5); } void paint(QIcon* obj,QPainter * arg0,int arg1,int arg2,int arg3,int arg4) const {obj->paint(arg0,arg1,arg2,arg3,arg4); } bool isNull(QIcon* obj) const {return obj->isNull(); } bool isDetached(QIcon* obj) const {return obj->isDetached(); } int serialNumber(QIcon* obj) const {return obj->serialNumber(); } void addPixmap(QIcon* obj,const QPixmap & arg0,Mode arg1,State arg2) {obj->addPixmap(arg0,(QIcon::Mode)arg1,(QIcon::State)arg2); } void addPixmap(QIcon* obj,const QPixmap & arg0,Mode arg1) {obj->addPixmap(arg0,(QIcon::Mode)arg1); } void addPixmap(QIcon* obj,const QPixmap & arg0) {obj->addPixmap(arg0); } void addFile(QIcon* obj,const QString & arg0,const QSize & arg1,Mode arg2,State arg3) {obj->addFile(arg0,arg1,(QIcon::Mode)arg2,(QIcon::State)arg3); } void addFile(QIcon* obj,const QString & arg0,const QSize & arg1,Mode arg2) {obj->addFile(arg0,arg1,(QIcon::Mode)arg2); } void addFile(QIcon* obj,const QString & arg0,const QSize & arg1) {obj->addFile(arg0,arg1); } void addFile(QIcon* obj,const QString & arg0) {obj->addFile(arg0); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qimage.h' ** ** Created: Thu 12. Apr 14:07:30 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qimage.h" class PythonQtQImageTextKeyLangWrapper : public QObject { Q_OBJECT public: public slots: void delete_QImageTextKeyLang(QImageTextKeyLang* obj) { delete obj; } QImageTextKeyLang* new_QImageTextKeyLang(const char * arg0,const char * arg1) { return new QImageTextKeyLang(arg0,arg1); } }; class PythonQtQImageWrapper : public QObject { Q_OBJECT public: Q_ENUMS(InvertMode Format ) enum InvertMode {InvertRgb = QImage::InvertRgb, InvertRgba = QImage::InvertRgba }; enum Format {Format_Invalid = QImage::Format_Invalid, Format_Mono = QImage::Format_Mono, Format_MonoLSB = QImage::Format_MonoLSB, Format_Indexed8 = QImage::Format_Indexed8, Format_RGB32 = QImage::Format_RGB32, Format_ARGB32 = QImage::Format_ARGB32, Format_ARGB32_Premultiplied = QImage::Format_ARGB32_Premultiplied, Format_RGB16 = QImage::Format_RGB16, NImageFormats = QImage::NImageFormats }; public slots: QVariant new_QImage() { return QImage(); } QVariant new_QImage(const QSize & arg0,Format arg1) { return QImage(arg0,(QImage::Format)arg1); } QVariant new_QImage(int arg0,int arg1,Format arg2) { return QImage(arg0,arg1,(QImage::Format)arg2); } QVariant new_QImage(uchar * arg0,int arg1,int arg2,Format arg3) { return QImage(arg0,arg1,arg2,(QImage::Format)arg3); } QVariant new_QImage(const uchar * arg0,int arg1,int arg2,Format arg3) { return QImage(arg0,arg1,arg2,(QImage::Format)arg3); } QVariant new_QImage(const QString & arg0,const char * arg1) { return QImage(arg0,arg1); } QVariant new_QImage(const QString & arg0) { return QImage(arg0); } QVariant new_QImage(const char * arg0,const char * arg1) { return QImage(arg0,arg1); } QVariant new_QImage(const char * arg0) { return QImage(arg0); } QVariant new_QImage(const QImage & arg0) { return QImage(arg0); } bool isNull(QImage* obj) const {return obj->isNull(); } int devType(QImage* obj) const {return obj->devType(); } void detach(QImage* obj) {obj->detach(); } bool isDetached(QImage* obj) const {return obj->isDetached(); } QImage copy(QImage* obj,const QRect & arg0) const {return obj->copy(arg0); } QImage copy(QImage* obj) const {return obj->copy(); } QImage copy(QImage* obj,int arg0,int arg1,int arg2,int arg3) const {return obj->copy(arg0,arg1,arg2,arg3); } Format format(QImage* obj) const {return (PythonQtQImageWrapper::Format)obj->format(); } QImage convertToFormat(QImage* obj,Format arg0,Qt::ImageConversionFlags arg1) const {return obj->convertToFormat((QImage::Format)arg0,arg1); } QImage convertToFormat(QImage* obj,Format arg0) const {return obj->convertToFormat((QImage::Format)arg0); } QImage convertToFormat(QImage* obj,Format arg0,const QVector & arg1,Qt::ImageConversionFlags arg2) const {return obj->convertToFormat((QImage::Format)arg0,arg1,arg2); } QImage convertToFormat(QImage* obj,Format arg0,const QVector & arg1) const {return obj->convertToFormat((QImage::Format)arg0,arg1); } int width(QImage* obj) const {return obj->width(); } int height(QImage* obj) const {return obj->height(); } QSize size(QImage* obj) const {return obj->size(); } QRect rect(QImage* obj) const {return obj->rect(); } int depth(QImage* obj) const {return obj->depth(); } int numColors(QImage* obj) const {return obj->numColors(); } QRgb color(QImage* obj,int arg0) const {return obj->color(arg0); } void setColor(QImage* obj,int arg0,QRgb arg1) {obj->setColor(arg0,arg1); } void setNumColors(QImage* obj,int arg0) {obj->setNumColors(arg0); } bool allGray(QImage* obj) const {return obj->allGray(); } bool isGrayscale(QImage* obj) const {return obj->isGrayscale(); } uchar* bits(QImage* obj) {return obj->bits(); } const uchar* bits(QImage* obj) const {return obj->bits(); } int numBytes(QImage* obj) const {return obj->numBytes(); } uchar* scanLine(QImage* obj,int arg0) {return obj->scanLine(arg0); } const uchar* scanLine(QImage* obj,int arg0) const {return obj->scanLine(arg0); } int bytesPerLine(QImage* obj) const {return obj->bytesPerLine(); } bool valid(QImage* obj,int arg0,int arg1) const {return obj->valid(arg0,arg1); } bool valid(QImage* obj,const QPoint & arg0) const {return obj->valid(arg0); } int pixelIndex(QImage* obj,int arg0,int arg1) const {return obj->pixelIndex(arg0,arg1); } int pixelIndex(QImage* obj,const QPoint & arg0) const {return obj->pixelIndex(arg0); } QRgb pixel(QImage* obj,int arg0,int arg1) const {return obj->pixel(arg0,arg1); } QRgb pixel(QImage* obj,const QPoint & arg0) const {return obj->pixel(arg0); } void setPixel(QImage* obj,int arg0,int arg1,uint arg2) {obj->setPixel(arg0,arg1,arg2); } void setPixel(QImage* obj,const QPoint & arg0,uint arg1) {obj->setPixel(arg0,arg1); } QVector colorTable(QImage* obj) const {return obj->colorTable(); } void setColorTable(QImage* obj,const QVector arg0) {obj->setColorTable(arg0); } void fill(QImage* obj,uint arg0) {obj->fill(arg0); } bool hasAlphaChannel(QImage* obj) const {return obj->hasAlphaChannel(); } void setAlphaChannel(QImage* obj,const QImage & arg0) {obj->setAlphaChannel(arg0); } QImage alphaChannel(QImage* obj) const {return obj->alphaChannel(); } QImage createAlphaMask(QImage* obj,Qt::ImageConversionFlags arg0) const {return obj->createAlphaMask(arg0); } QImage createAlphaMask(QImage* obj) const {return obj->createAlphaMask(); } QImage createHeuristicMask(QImage* obj,bool arg0) const {return obj->createHeuristicMask(arg0); } QImage createHeuristicMask(QImage* obj) const {return obj->createHeuristicMask(); } QImage scaled(QImage* obj,int arg0,int arg1,Qt::AspectRatioMode arg2,Qt::TransformationMode arg3) const {return obj->scaled(arg0,arg1,arg2,arg3); } QImage scaled(QImage* obj,int arg0,int arg1,Qt::AspectRatioMode arg2) const {return obj->scaled(arg0,arg1,arg2); } QImage scaled(QImage* obj,int arg0,int arg1) const {return obj->scaled(arg0,arg1); } QImage scaled(QImage* obj,const QSize & arg0,Qt::AspectRatioMode arg1,Qt::TransformationMode arg2) const {return obj->scaled(arg0,arg1,arg2); } QImage scaled(QImage* obj,const QSize & arg0,Qt::AspectRatioMode arg1) const {return obj->scaled(arg0,arg1); } QImage scaled(QImage* obj,const QSize & arg0) const {return obj->scaled(arg0); } QImage scaledToWidth(QImage* obj,int arg0,Qt::TransformationMode arg1) const {return obj->scaledToWidth(arg0,arg1); } QImage scaledToWidth(QImage* obj,int arg0) const {return obj->scaledToWidth(arg0); } QImage scaledToHeight(QImage* obj,int arg0,Qt::TransformationMode arg1) const {return obj->scaledToHeight(arg0,arg1); } QImage scaledToHeight(QImage* obj,int arg0) const {return obj->scaledToHeight(arg0); } QImage transformed(QImage* obj,const QMatrix & arg0,Qt::TransformationMode arg1) const {return obj->transformed(arg0,arg1); } QImage transformed(QImage* obj,const QMatrix & arg0) const {return obj->transformed(arg0); } QMatrix static_QImage_trueMatrix(const QMatrix & arg0,int arg1,int arg2) {return QImage::trueMatrix(arg0,arg1,arg2); } QImage mirrored(QImage* obj,bool arg0,bool arg1) const {return obj->mirrored(arg0,arg1); } QImage mirrored(QImage* obj,bool arg0) const {return obj->mirrored(arg0); } QImage mirrored(QImage* obj) const {return obj->mirrored(); } QImage rgbSwapped(QImage* obj) const {return obj->rgbSwapped(); } void invertPixels(QImage* obj,InvertMode arg0) {obj->invertPixels((QImage::InvertMode)arg0); } void invertPixels(QImage* obj) {obj->invertPixels(); } bool load(QImage* obj,QIODevice * arg0,const char * arg1) {return obj->load(arg0,arg1); } bool load(QImage* obj,const QString & arg0,const char * arg1) {return obj->load(arg0,arg1); } bool load(QImage* obj,const QString & arg0) {return obj->load(arg0); } bool loadFromData(QImage* obj,const uchar * arg0,int arg1,const char * arg2) {return obj->loadFromData(arg0,arg1,arg2); } bool loadFromData(QImage* obj,const uchar * arg0,int arg1) {return obj->loadFromData(arg0,arg1); } bool loadFromData(QImage* obj,const QByteArray & arg0,const char * arg1) {return obj->loadFromData(arg0,arg1); } bool loadFromData(QImage* obj,const QByteArray & arg0) {return obj->loadFromData(arg0); } bool save(QImage* obj,const QString & arg0,const char * arg1,int arg2) const {return obj->save(arg0,arg1,arg2); } bool save(QImage* obj,const QString & arg0,const char * arg1) const {return obj->save(arg0,arg1); } bool save(QImage* obj,const QString & arg0) const {return obj->save(arg0); } bool save(QImage* obj,QIODevice * arg0,const char * arg1,int arg2) const {return obj->save(arg0,arg1,arg2); } bool save(QImage* obj,QIODevice * arg0,const char * arg1) const {return obj->save(arg0,arg1); } bool save(QImage* obj,QIODevice * arg0) const {return obj->save(arg0); } QImage static_QImage_fromData(const uchar * arg0,int arg1,const char * arg2) {return QImage::fromData(arg0,arg1,arg2); } QImage static_QImage_fromData(const uchar * arg0,int arg1) {return QImage::fromData(arg0,arg1); } QImage static_QImage_fromData(const QByteArray & arg0,const char * arg1) {return QImage::fromData(arg0,arg1); } QImage static_QImage_fromData(const QByteArray & arg0) {return QImage::fromData(arg0); } int serialNumber(QImage* obj) const {return obj->serialNumber(); } QPaintEngine* paintEngine(QImage* obj) const {return obj->paintEngine(); } int dotsPerMeterX(QImage* obj) const {return obj->dotsPerMeterX(); } int dotsPerMeterY(QImage* obj) const {return obj->dotsPerMeterY(); } void setDotsPerMeterX(QImage* obj,int arg0) {obj->setDotsPerMeterX(arg0); } void setDotsPerMeterY(QImage* obj,int arg0) {obj->setDotsPerMeterY(arg0); } QPoint offset(QImage* obj) const {return obj->offset(); } void setOffset(QImage* obj,const QPoint & arg0) {obj->setOffset(arg0); } QStringList textKeys(QImage* obj) const {return obj->textKeys(); } QString text(QImage* obj,const QString & arg0) const {return obj->text(arg0); } QString text(QImage* obj) const {return obj->text(); } void setText(QImage* obj,const QString & arg0,const QString & arg1) {obj->setText(arg0,arg1); } QString text(QImage* obj,const char * arg0,const char * arg1) const {return obj->text(arg0,arg1); } QString text(QImage* obj,const char * arg0) const {return obj->text(arg0); } QList textList(QImage* obj) const {return obj->textList(); } QStringList textLanguages(QImage* obj) const {return obj->textLanguages(); } QString text(QImage* obj,const QImageTextKeyLang & arg0) const {return obj->text(arg0); } void setText(QImage* obj,const char * arg0,const char * arg1,const QString & arg2) {obj->setText(arg0,arg1,arg2); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qpolygon.h' ** ** Created: Thu 12. Apr 14:07:30 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qpolygon.h" class PythonQtQPolygonWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QPolygon() { return QPolygon(); } QVariant new_QPolygon(int arg0) { return QPolygon(arg0); } QVariant new_QPolygon(const QPolygon & arg0) { return QPolygon(arg0); } QVariant new_QPolygon(const QVector & arg0) { return QPolygon(arg0); } QVariant new_QPolygon(int arg0,const int * arg1) { return QPolygon(arg0,arg1); } void translate(QPolygon* obj,int arg0,int arg1) {obj->translate(arg0,arg1); } void translate(QPolygon* obj,const QPoint & arg0) {obj->translate(arg0); } QRect boundingRect(QPolygon* obj) const {return obj->boundingRect(); } void point(QPolygon* obj,int arg0,int * arg1,int * arg2) const {obj->point(arg0,arg1,arg2); } QPoint point(QPolygon* obj,int arg0) const {return obj->point(arg0); } void setPoint(QPolygon* obj,int arg0,int arg1,int arg2) {obj->setPoint(arg0,arg1,arg2); } void setPoint(QPolygon* obj,int arg0,const QPoint & arg1) {obj->setPoint(arg0,arg1); } }; class PythonQtQPolygonFWrapper : public QObject { Q_OBJECT public: public slots: void delete_QPolygonF(QPolygonF* obj) { delete obj; } QPolygonF* new_QPolygonF() { return new QPolygonF(); } QPolygonF* new_QPolygonF(int arg0) { return new QPolygonF(arg0); } QPolygonF* new_QPolygonF(const QPolygonF & arg0) { return new QPolygonF(arg0); } QPolygonF* new_QPolygonF(const QVector & arg0) { return new QPolygonF(arg0); } QPolygonF* new_QPolygonF(const QPolygon & arg0) { return new QPolygonF(arg0); } void translate(QPolygonF* obj,qreal arg0,qreal arg1) {obj->translate(arg0,arg1); } void translate(QPolygonF* obj,const QPointF & arg0) {obj->translate(arg0); } QPolygon toPolygon(QPolygonF* obj) const {return obj->toPolygon(); } bool isClosed(QPolygonF* obj) const {return obj->isClosed(); } QRectF boundingRect(QPolygonF* obj) const {return obj->boundingRect(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qregion.h' ** ** Created: Thu 12. Apr 14:07:30 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qregion.h" class PythonQtQRegionWrapper : public QObject { Q_OBJECT public: Q_ENUMS(RegionType ) enum RegionType {Rectangle = QRegion::Rectangle, Ellipse = QRegion::Ellipse }; public slots: QVariant new_QRegion() { return QRegion(); } QVariant new_QRegion(int arg0,int arg1,int arg2,int arg3,RegionType arg4) { return QRegion(arg0,arg1,arg2,arg3,(QRegion::RegionType)arg4); } QVariant new_QRegion(int arg0,int arg1,int arg2,int arg3) { return QRegion(arg0,arg1,arg2,arg3); } QVariant new_QRegion(const QRect & arg0,RegionType arg1) { return QRegion(arg0,(QRegion::RegionType)arg1); } QVariant new_QRegion(const QRect & arg0) { return QRegion(arg0); } QVariant new_QRegion(const QPolygon & arg0,Qt::FillRule arg1) { return QRegion(arg0,arg1); } QVariant new_QRegion(const QPolygon & arg0) { return QRegion(arg0); } QVariant new_QRegion(const QRegion & arg0) { return QRegion(arg0); } QVariant new_QRegion(const QBitmap & arg0) { return QRegion(arg0); } bool isEmpty(QRegion* obj) const {return obj->isEmpty(); } bool contains(QRegion* obj,const QPoint & arg0) const {return obj->contains(arg0); } bool contains(QRegion* obj,const QRect & arg0) const {return obj->contains(arg0); } void translate(QRegion* obj,int arg0,int arg1) {obj->translate(arg0,arg1); } void translate(QRegion* obj,const QPoint & arg0) {obj->translate(arg0); } QRegion translated(QRegion* obj,int arg0,int arg1) const {return obj->translated(arg0,arg1); } QRegion translated(QRegion* obj,const QPoint & arg0) const {return obj->translated(arg0); } QRegion unite(QRegion* obj,const QRegion & arg0) const {return obj->unite(arg0); } QRegion intersect(QRegion* obj,const QRegion & arg0) const {return obj->intersect(arg0); } QRegion subtract(QRegion* obj,const QRegion & arg0) const {return obj->subtract(arg0); } QRegion eor(QRegion* obj,const QRegion & arg0) const {return obj->eor(arg0); } QRegion united(QRegion* obj,const QRegion & arg0) const {return obj->united(arg0); } QRegion intersected(QRegion* obj,const QRegion & arg0) const {return obj->intersected(arg0); } QRegion subtracted(QRegion* obj,const QRegion & arg0) const {return obj->subtracted(arg0); } QRegion xored(QRegion* obj,const QRegion & arg0) const {return obj->xored(arg0); } bool intersects(QRegion* obj,const QRegion & arg0) const {return obj->intersects(arg0); } bool intersects(QRegion* obj,const QRect & arg0) const {return obj->intersects(arg0); } QRect boundingRect(QRegion* obj) const {return obj->boundingRect(); } QVector rects(QRegion* obj) const {return obj->rects(); } void setRects(QRegion* obj,const QRect * arg0,int arg1) {obj->setRects(arg0,arg1); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qbitmap.h' ** ** Created: Thu 12. Apr 14:07:31 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qbitmap.h" class PythonQtQBitmapWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QBitmap() { return QBitmap(); } QVariant new_QBitmap(const QPixmap & arg0) { return QBitmap(arg0); } QVariant new_QBitmap(int arg0,int arg1) { return QBitmap(arg0,arg1); } QVariant new_QBitmap(const QSize & arg0) { return QBitmap(arg0); } QVariant new_QBitmap(const QString & arg0,const char * arg1) { return QBitmap(arg0,arg1); } QVariant new_QBitmap(const QString & arg0) { return QBitmap(arg0); } void clear(QBitmap* obj) {obj->clear(); } QBitmap static_QBitmap_fromImage(const QImage & arg0,Qt::ImageConversionFlags arg1) {return QBitmap::fromImage(arg0,arg1); } QBitmap static_QBitmap_fromImage(const QImage & arg0) {return QBitmap::fromImage(arg0); } QBitmap static_QBitmap_fromData(const QSize & arg0,const uchar * arg1,QImage::Format arg2) {return QBitmap::fromData(arg0,arg1,arg2); } QBitmap static_QBitmap_fromData(const QSize & arg0,const uchar * arg1) {return QBitmap::fromData(arg0,arg1); } QBitmap transformed(QBitmap* obj,const QMatrix & arg0) const {return obj->transformed(arg0); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qcursor.h' ** ** Created: Thu 12. Apr 14:07:31 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qcursor.h" class PythonQtQCursorWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QCursor() { return QCursor(); } QVariant new_QCursor(Qt::CursorShape arg0) { return QCursor(arg0); } QVariant new_QCursor(const QBitmap & arg0,const QBitmap & arg1,int arg2,int arg3) { return QCursor(arg0,arg1,arg2,arg3); } QVariant new_QCursor(const QBitmap & arg0,const QBitmap & arg1,int arg2) { return QCursor(arg0,arg1,arg2); } QVariant new_QCursor(const QBitmap & arg0,const QBitmap & arg1) { return QCursor(arg0,arg1); } QVariant new_QCursor(const QPixmap & arg0,int arg1,int arg2) { return QCursor(arg0,arg1,arg2); } QVariant new_QCursor(const QPixmap & arg0,int arg1) { return QCursor(arg0,arg1); } QVariant new_QCursor(const QPixmap & arg0) { return QCursor(arg0); } QVariant new_QCursor(const QCursor & arg0) { return QCursor(arg0); } Qt::CursorShape shape(QCursor* obj) const {return obj->shape(); } void setShape(QCursor* obj,Qt::CursorShape arg0) {obj->setShape(arg0); } const QBitmap* bitmap(QCursor* obj) const {return obj->bitmap(); } const QBitmap* mask(QCursor* obj) const {return obj->mask(); } QPixmap pixmap(QCursor* obj) const {return obj->pixmap(); } QPoint hotSpot(QCursor* obj) const {return obj->hotSpot(); } QPoint static_QCursor_pos() {return QCursor::pos(); } void static_QCursor_setPos(int arg0,int arg1) {QCursor::setPos(arg0,arg1); } void static_QCursor_setPos(const QPoint & arg0) {QCursor::setPos(arg0); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qsizepolicy.h' ** ** Created: Thu 12. Apr 14:07:33 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qsizepolicy.h" class PythonQtQSizePolicyWrapper : public QObject { Q_OBJECT public: Q_ENUMS(PolicyFlag Policy ) enum PolicyFlag {GrowFlag = QSizePolicy::GrowFlag, ExpandFlag = QSizePolicy::ExpandFlag, ShrinkFlag = QSizePolicy::ShrinkFlag, IgnoreFlag = QSizePolicy::IgnoreFlag }; enum Policy {Fixed = QSizePolicy::Fixed, Minimum = QSizePolicy::Minimum, Maximum = QSizePolicy::Maximum, Preferred = QSizePolicy::Preferred, MinimumExpanding = QSizePolicy::MinimumExpanding, Expanding = QSizePolicy::Expanding, Ignored = QSizePolicy::Ignored }; public slots: QVariant new_QSizePolicy() { return QSizePolicy(); } Policy horizontalPolicy(QSizePolicy* obj) const {return (PythonQtQSizePolicyWrapper::Policy)obj->horizontalPolicy(); } Policy verticalPolicy(QSizePolicy* obj) const {return (PythonQtQSizePolicyWrapper::Policy)obj->verticalPolicy(); } void setHorizontalPolicy(QSizePolicy* obj,Policy arg0) {obj->setHorizontalPolicy((QSizePolicy::Policy)arg0); } void setVerticalPolicy(QSizePolicy* obj,Policy arg0) {obj->setVerticalPolicy((QSizePolicy::Policy)arg0); } Qt::Orientations expandingDirections(QSizePolicy* obj) const {return obj->expandingDirections(); } void setHeightForWidth(QSizePolicy* obj,bool arg0) {obj->setHeightForWidth(arg0); } bool hasHeightForWidth(QSizePolicy* obj) const {return obj->hasHeightForWidth(); } int horizontalStretch(QSizePolicy* obj) const {return obj->horizontalStretch(); } int verticalStretch(QSizePolicy* obj) const {return obj->verticalStretch(); } void setHorizontalStretch(QSizePolicy* obj,uchar arg0) {obj->setHorizontalStretch(arg0); } void setVerticalStretch(QSizePolicy* obj,uchar arg0) {obj->setVerticalStretch(arg0); } void transpose(QSizePolicy* obj) {obj->transpose(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qkeysequence.h' ** ** Created: Thu 12. Apr 14:07:34 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qkeysequence.h" class PythonQtQKeySequenceWrapper : public QObject { Q_OBJECT public: Q_ENUMS(StandardKey SequenceMatch SequenceFormat ) enum StandardKey {UnknownKey = QKeySequence::UnknownKey, HelpContents = QKeySequence::HelpContents, WhatsThis = QKeySequence::WhatsThis, Open = QKeySequence::Open, Close = QKeySequence::Close, Save = QKeySequence::Save, New = QKeySequence::New, Delete = QKeySequence::Delete, Cut = QKeySequence::Cut, Copy = QKeySequence::Copy, Paste = QKeySequence::Paste, Undo = QKeySequence::Undo, Redo = QKeySequence::Redo, Back = QKeySequence::Back, Forward = QKeySequence::Forward, Refresh = QKeySequence::Refresh, ZoomIn = QKeySequence::ZoomIn, ZoomOut = QKeySequence::ZoomOut, Print = QKeySequence::Print, AddTab = QKeySequence::AddTab, NextChild = QKeySequence::NextChild, PreviousChild = QKeySequence::PreviousChild, Find = QKeySequence::Find, FindNext = QKeySequence::FindNext, FindPrevious = QKeySequence::FindPrevious, Replace = QKeySequence::Replace, SelectAll = QKeySequence::SelectAll, Bold = QKeySequence::Bold, Italic = QKeySequence::Italic, Underline = QKeySequence::Underline, MoveToNextChar = QKeySequence::MoveToNextChar, MoveToPreviousChar = QKeySequence::MoveToPreviousChar, MoveToNextWord = QKeySequence::MoveToNextWord, MoveToPreviousWord = QKeySequence::MoveToPreviousWord, MoveToNextLine = QKeySequence::MoveToNextLine, MoveToPreviousLine = QKeySequence::MoveToPreviousLine, MoveToNextPage = QKeySequence::MoveToNextPage, MoveToPreviousPage = QKeySequence::MoveToPreviousPage, MoveToStartOfLine = QKeySequence::MoveToStartOfLine, MoveToEndOfLine = QKeySequence::MoveToEndOfLine, MoveToStartOfBlock = QKeySequence::MoveToStartOfBlock, MoveToEndOfBlock = QKeySequence::MoveToEndOfBlock, MoveToStartOfDocument = QKeySequence::MoveToStartOfDocument, MoveToEndOfDocument = QKeySequence::MoveToEndOfDocument, SelectNextChar = QKeySequence::SelectNextChar, SelectPreviousChar = QKeySequence::SelectPreviousChar, SelectNextWord = QKeySequence::SelectNextWord, SelectPreviousWord = QKeySequence::SelectPreviousWord, SelectNextLine = QKeySequence::SelectNextLine, SelectPreviousLine = QKeySequence::SelectPreviousLine, SelectNextPage = QKeySequence::SelectNextPage, SelectPreviousPage = QKeySequence::SelectPreviousPage, SelectStartOfLine = QKeySequence::SelectStartOfLine, SelectEndOfLine = QKeySequence::SelectEndOfLine, SelectStartOfBlock = QKeySequence::SelectStartOfBlock, SelectEndOfBlock = QKeySequence::SelectEndOfBlock, SelectStartOfDocument = QKeySequence::SelectStartOfDocument, SelectEndOfDocument = QKeySequence::SelectEndOfDocument, DeleteStartOfWord = QKeySequence::DeleteStartOfWord, DeleteEndOfWord = QKeySequence::DeleteEndOfWord, DeleteEndOfLine = QKeySequence::DeleteEndOfLine }; enum SequenceMatch {NoMatch = QKeySequence::NoMatch, PartialMatch = QKeySequence::PartialMatch, ExactMatch = QKeySequence::ExactMatch }; enum SequenceFormat {NativeText = QKeySequence::NativeText, PortableText = QKeySequence::PortableText }; public slots: QVariant new_QKeySequence() { return QKeySequence(); } QVariant new_QKeySequence(const QString & arg0) { return QKeySequence(arg0); } QVariant new_QKeySequence(int arg0,int arg1,int arg2,int arg3) { return QKeySequence(arg0,arg1,arg2,arg3); } QVariant new_QKeySequence(int arg0,int arg1,int arg2) { return QKeySequence(arg0,arg1,arg2); } QVariant new_QKeySequence(int arg0,int arg1) { return QKeySequence(arg0,arg1); } QVariant new_QKeySequence(int arg0) { return QKeySequence(arg0); } QVariant new_QKeySequence(const QKeySequence & arg0) { return QKeySequence(arg0); } QVariant new_QKeySequence(StandardKey arg0) { return QKeySequence((QKeySequence::StandardKey)arg0); } uint count(QKeySequence* obj) const {return obj->count(); } bool isEmpty(QKeySequence* obj) const {return obj->isEmpty(); } QString toString(QKeySequence* obj,SequenceFormat arg0) const {return obj->toString((QKeySequence::SequenceFormat)arg0); } QString toString(QKeySequence* obj) const {return obj->toString(); } QKeySequence static_QKeySequence_fromString(const QString & arg0,SequenceFormat arg1) {return QKeySequence::fromString(arg0,(QKeySequence::SequenceFormat)arg1); } QKeySequence static_QKeySequence_fromString(const QString & arg0) {return QKeySequence::fromString(arg0); } SequenceMatch matches(QKeySequence* obj,const QKeySequence & arg0) const {return (PythonQtQKeySequenceWrapper::SequenceMatch)obj->matches(arg0); } QKeySequence static_QKeySequence_mnemonic(const QString & arg0) {return QKeySequence::mnemonic(arg0); } QList static_QKeySequence_keyBindings(StandardKey arg0) {return QKeySequence::keyBindings((QKeySequence::StandardKey)arg0); } bool isDetached(QKeySequence* obj) const {return obj->isDetached(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qpen.h' ** ** Created: Thu 12. Apr 14:07:35 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qpen.h" class PythonQtQPenWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QPen() { return QPen(); } QVariant new_QPen(Qt::PenStyle arg0) { return QPen(arg0); } QVariant new_QPen(const QColor & arg0) { return QPen(arg0); } QVariant new_QPen(const QBrush & arg0,qreal arg1,Qt::PenStyle arg2,Qt::PenCapStyle arg3,Qt::PenJoinStyle arg4) { return QPen(arg0,arg1,arg2,arg3,arg4); } QVariant new_QPen(const QBrush & arg0,qreal arg1,Qt::PenStyle arg2,Qt::PenCapStyle arg3) { return QPen(arg0,arg1,arg2,arg3); } QVariant new_QPen(const QBrush & arg0,qreal arg1,Qt::PenStyle arg2) { return QPen(arg0,arg1,arg2); } QVariant new_QPen(const QBrush & arg0,qreal arg1) { return QPen(arg0,arg1); } QVariant new_QPen(const QPen & arg0) { return QPen(arg0); } Qt::PenStyle style(QPen* obj) const {return obj->style(); } void setStyle(QPen* obj,Qt::PenStyle arg0) {obj->setStyle(arg0); } QVector dashPattern(QPen* obj) const {return obj->dashPattern(); } void setDashPattern(QPen* obj,const QVector & arg0) {obj->setDashPattern(arg0); } qreal miterLimit(QPen* obj) const {return obj->miterLimit(); } void setMiterLimit(QPen* obj,qreal arg0) {obj->setMiterLimit(arg0); } qreal widthF(QPen* obj) const {return obj->widthF(); } void setWidthF(QPen* obj,qreal arg0) {obj->setWidthF(arg0); } int width(QPen* obj) const {return obj->width(); } void setWidth(QPen* obj,int arg0) {obj->setWidth(arg0); } QColor color(QPen* obj) const {return obj->color(); } void setColor(QPen* obj,const QColor & arg0) {obj->setColor(arg0); } QBrush brush(QPen* obj) const {return obj->brush(); } void setBrush(QPen* obj,const QBrush & arg0) {obj->setBrush(arg0); } bool isSolid(QPen* obj) const {return obj->isSolid(); } Qt::PenCapStyle capStyle(QPen* obj) const {return obj->capStyle(); } void setCapStyle(QPen* obj,Qt::PenCapStyle arg0) {obj->setCapStyle(arg0); } Qt::PenJoinStyle joinStyle(QPen* obj) const {return obj->joinStyle(); } void setJoinStyle(QPen* obj,Qt::PenJoinStyle arg0) {obj->setJoinStyle(arg0); } bool isDetached(QPen* obj) {return obj->isDetached(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qtextformat.h' ** ** Created: Thu 12. Apr 14:07:35 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qtextformat.h" class PythonQtQTextLengthWrapper : public QObject { Q_OBJECT public: Q_ENUMS(Type ) enum Type {VariableLength = QTextLength::VariableLength, FixedLength = QTextLength::FixedLength, PercentageLength = QTextLength::PercentageLength }; public slots: QVariant new_QTextLength() { return QTextLength(); } QVariant new_QTextLength(Type arg0,qreal arg1) { return QTextLength((QTextLength::Type)arg0,arg1); } Type type(QTextLength* obj) const {return (PythonQtQTextLengthWrapper::Type)obj->type(); } qreal value(QTextLength* obj,qreal arg0) const {return obj->value(arg0); } qreal rawValue(QTextLength* obj) const {return obj->rawValue(); } }; class PythonQtQTextFormatWrapper : public QObject { Q_OBJECT public: Q_ENUMS(FormatType Property ObjectTypes PageBreakFlag ) enum FormatType {InvalidFormat = QTextFormat::InvalidFormat, BlockFormat = QTextFormat::BlockFormat, CharFormat = QTextFormat::CharFormat, ListFormat = QTextFormat::ListFormat, TableFormat = QTextFormat::TableFormat, FrameFormat = QTextFormat::FrameFormat, UserFormat = QTextFormat::UserFormat }; enum Property {ObjectIndex = QTextFormat::ObjectIndex, CssFloat = QTextFormat::CssFloat, LayoutDirection = QTextFormat::LayoutDirection, OutlinePen = QTextFormat::OutlinePen, BackgroundBrush = QTextFormat::BackgroundBrush, ForegroundBrush = QTextFormat::ForegroundBrush, BlockAlignment = QTextFormat::BlockAlignment, BlockTopMargin = QTextFormat::BlockTopMargin, BlockBottomMargin = QTextFormat::BlockBottomMargin, BlockLeftMargin = QTextFormat::BlockLeftMargin, BlockRightMargin = QTextFormat::BlockRightMargin, TextIndent = QTextFormat::TextIndent, BlockIndent = QTextFormat::BlockIndent, BlockNonBreakableLines = QTextFormat::BlockNonBreakableLines, BlockTrailingHorizontalRulerWidth = QTextFormat::BlockTrailingHorizontalRulerWidth, FontFamily = QTextFormat::FontFamily, FontPointSize = QTextFormat::FontPointSize, FontSizeAdjustment = QTextFormat::FontSizeAdjustment, FontSizeIncrement = QTextFormat::FontSizeIncrement, FontWeight = QTextFormat::FontWeight, FontItalic = QTextFormat::FontItalic, FontUnderline = QTextFormat::FontUnderline, FontOverline = QTextFormat::FontOverline, FontStrikeOut = QTextFormat::FontStrikeOut, FontFixedPitch = QTextFormat::FontFixedPitch, FontPixelSize = QTextFormat::FontPixelSize, TextUnderlineColor = QTextFormat::TextUnderlineColor, TextVerticalAlignment = QTextFormat::TextVerticalAlignment, TextOutline = QTextFormat::TextOutline, TextUnderlineStyle = QTextFormat::TextUnderlineStyle, IsAnchor = QTextFormat::IsAnchor, AnchorHref = QTextFormat::AnchorHref, AnchorName = QTextFormat::AnchorName, ObjectType = QTextFormat::ObjectType, ListStyle = QTextFormat::ListStyle, ListIndent = QTextFormat::ListIndent, FrameBorder = QTextFormat::FrameBorder, FrameMargin = QTextFormat::FrameMargin, FramePadding = QTextFormat::FramePadding, FrameWidth = QTextFormat::FrameWidth, FrameHeight = QTextFormat::FrameHeight, TableColumns = QTextFormat::TableColumns, TableColumnWidthConstraints = QTextFormat::TableColumnWidthConstraints, TableCellSpacing = QTextFormat::TableCellSpacing, TableCellPadding = QTextFormat::TableCellPadding, TableHeaderRowCount = QTextFormat::TableHeaderRowCount, TableCellRowSpan = QTextFormat::TableCellRowSpan, TableCellColumnSpan = QTextFormat::TableCellColumnSpan, ImageName = QTextFormat::ImageName, ImageWidth = QTextFormat::ImageWidth, ImageHeight = QTextFormat::ImageHeight, FullWidthSelection = QTextFormat::FullWidthSelection, PageBreakPolicy = QTextFormat::PageBreakPolicy, UserProperty = QTextFormat::UserProperty }; enum ObjectTypes {NoObject = QTextFormat::NoObject, ImageObject = QTextFormat::ImageObject, TableObject = QTextFormat::TableObject, UserObject = QTextFormat::UserObject }; enum PageBreakFlag {PageBreak_Auto = QTextFormat::PageBreak_Auto, PageBreak_AlwaysBefore = QTextFormat::PageBreak_AlwaysBefore, PageBreak_AlwaysAfter = QTextFormat::PageBreak_AlwaysAfter }; Q_DECLARE_FLAGS(PageBreakFlags, PageBreakFlag) public slots: QVariant new_QTextFormat(int arg0) { return QTextFormat(arg0); } QVariant new_QTextFormat(const QTextFormat & arg0) { return QTextFormat(arg0); } void merge(QTextFormat* obj,const QTextFormat & arg0) {obj->merge(arg0); } bool isValid(QTextFormat* obj) const {return obj->isValid(); } int type(QTextFormat* obj) const {return obj->type(); } int objectIndex(QTextFormat* obj) const {return obj->objectIndex(); } void setObjectIndex(QTextFormat* obj,int arg0) {obj->setObjectIndex(arg0); } QVariant property(QTextFormat* obj,int arg0) const {return obj->property(arg0); } void setProperty(QTextFormat* obj,int arg0,const QVariant & arg1) {obj->setProperty(arg0,arg1); } void clearProperty(QTextFormat* obj,int arg0) {obj->clearProperty(arg0); } bool hasProperty(QTextFormat* obj,int arg0) const {return obj->hasProperty(arg0); } bool boolProperty(QTextFormat* obj,int arg0) const {return obj->boolProperty(arg0); } int intProperty(QTextFormat* obj,int arg0) const {return obj->intProperty(arg0); } qreal doubleProperty(QTextFormat* obj,int arg0) const {return obj->doubleProperty(arg0); } QString stringProperty(QTextFormat* obj,int arg0) const {return obj->stringProperty(arg0); } QColor colorProperty(QTextFormat* obj,int arg0) const {return obj->colorProperty(arg0); } QPen penProperty(QTextFormat* obj,int arg0) const {return obj->penProperty(arg0); } QBrush brushProperty(QTextFormat* obj,int arg0) const {return obj->brushProperty(arg0); } QTextLength lengthProperty(QTextFormat* obj,int arg0) const {return obj->lengthProperty(arg0); } QVector lengthVectorProperty(QTextFormat* obj,int arg0) const {return obj->lengthVectorProperty(arg0); } void setProperty(QTextFormat* obj,int arg0,const QVector & arg1) {obj->setProperty(arg0,arg1); } QMap properties(QTextFormat* obj) const {return obj->properties(); } void setObjectType(QTextFormat* obj,int arg0) {obj->setObjectType(arg0); } int objectType(QTextFormat* obj) const {return obj->objectType(); } bool isCharFormat(QTextFormat* obj) const {return obj->isCharFormat(); } bool isBlockFormat(QTextFormat* obj) const {return obj->isBlockFormat(); } bool isListFormat(QTextFormat* obj) const {return obj->isListFormat(); } bool isFrameFormat(QTextFormat* obj) const {return obj->isFrameFormat(); } bool isImageFormat(QTextFormat* obj) const {return obj->isImageFormat(); } bool isTableFormat(QTextFormat* obj) const {return obj->isTableFormat(); } QTextBlockFormat toBlockFormat(QTextFormat* obj) const {return obj->toBlockFormat(); } QTextCharFormat toCharFormat(QTextFormat* obj) const {return obj->toCharFormat(); } QTextListFormat toListFormat(QTextFormat* obj) const {return obj->toListFormat(); } QTextTableFormat toTableFormat(QTextFormat* obj) const {return obj->toTableFormat(); } QTextFrameFormat toFrameFormat(QTextFormat* obj) const {return obj->toFrameFormat(); } QTextImageFormat toImageFormat(QTextFormat* obj) const {return obj->toImageFormat(); } void setLayoutDirection(QTextFormat* obj,Qt::LayoutDirection arg0) {obj->setLayoutDirection(arg0); } Qt::LayoutDirection layoutDirection(QTextFormat* obj) const {return obj->layoutDirection(); } void setBackground(QTextFormat* obj,const QBrush & arg0) {obj->setBackground(arg0); } QBrush background(QTextFormat* obj) const {return obj->background(); } void clearBackground(QTextFormat* obj) {obj->clearBackground(); } void setForeground(QTextFormat* obj,const QBrush & arg0) {obj->setForeground(arg0); } QBrush foreground(QTextFormat* obj) const {return obj->foreground(); } void clearForeground(QTextFormat* obj) {obj->clearForeground(); } }; /**************************************************************************** ** Meta object code from reading C++ file 'qmatrix.h' ** ** Created: Thu 12. Apr 14:07:35 2007 ** by: The Qt Meta Object Compiler version 59 (Qt 4.2.3) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "qmatrix.h" class PythonQtQMatrixWrapper : public QObject { Q_OBJECT public: public slots: QVariant new_QMatrix() { return QMatrix(); } QVariant new_QMatrix(qreal arg0,qreal arg1,qreal arg2,qreal arg3,qreal arg4,qreal arg5) { return QMatrix(arg0,arg1,arg2,arg3,arg4,arg5); } QVariant new_QMatrix(const QMatrix & arg0) { return QMatrix(arg0); } void setMatrix(QMatrix* obj,qreal arg0,qreal arg1,qreal arg2,qreal arg3,qreal arg4,qreal arg5) {obj->setMatrix(arg0,arg1,arg2,arg3,arg4,arg5); } qreal m11(QMatrix* obj) const {return obj->m11(); } qreal m12(QMatrix* obj) const {return obj->m12(); } qreal m21(QMatrix* obj) const {return obj->m21(); } qreal m22(QMatrix* obj) const {return obj->m22(); } qreal dx(QMatrix* obj) const {return obj->dx(); } qreal dy(QMatrix* obj) const {return obj->dy(); } void map(QMatrix* obj,int arg0,int arg1,int * arg2,int * arg3) const {obj->map(arg0,arg1,arg2,arg3); } void map(QMatrix* obj,qreal arg0,qreal arg1,qreal * arg2,qreal * arg3) const {obj->map(arg0,arg1,arg2,arg3); } QRect mapRect(QMatrix* obj,const QRect & arg0) const {return obj->mapRect(arg0); } QRectF mapRect(QMatrix* obj,const QRectF & arg0) const {return obj->mapRect(arg0); } QPoint map(QMatrix* obj,const QPoint & arg0) const {return obj->map(arg0); } QPointF map(QMatrix* obj,const QPointF & arg0) const {return obj->map(arg0); } QLine map(QMatrix* obj,const QLine & arg0) const {return obj->map(arg0); } QLineF map(QMatrix* obj,const QLineF & arg0) const {return obj->map(arg0); } QPolygonF map(QMatrix* obj,const QPolygonF & arg0) const {return obj->map(arg0); } QPolygon map(QMatrix* obj,const QPolygon & arg0) const {return obj->map(arg0); } QRegion map(QMatrix* obj,const QRegion & arg0) const {return obj->map(arg0); } QPainterPath map(QMatrix* obj,const QPainterPath & arg0) const {return obj->map(arg0); } QPolygon mapToPolygon(QMatrix* obj,const QRect & arg0) const {return obj->mapToPolygon(arg0); } void reset(QMatrix* obj) {obj->reset(); } bool isIdentity(QMatrix* obj) const {return obj->isIdentity(); } void translate(QMatrix* obj,qreal arg0,qreal arg1) {obj->translate(arg0,arg1); } void scale(QMatrix* obj,qreal arg0,qreal arg1) {obj->scale(arg0,arg1); } void shear(QMatrix* obj,qreal arg0,qreal arg1) {obj->shear(arg0,arg1); } void rotate(QMatrix* obj,qreal arg0) {obj->rotate(arg0); } bool isInvertible(QMatrix* obj) const {return obj->isInvertible(); } qreal det(QMatrix* obj) const {return obj->det(); } QMatrix inverted(QMatrix* obj,bool * arg0) const {return obj->inverted(arg0); } QMatrix inverted(QMatrix* obj) const {return obj->inverted(); } }; fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtStdDecorators.h0000644000175000017500000000631711145517421023455 0ustar malexmalex#ifndef _PYTHONQTSTDDECORATORS_H #define _PYTHONQTSTDDECORATORS_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtStdDecorators.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2007-04 */ //---------------------------------------------------------------------------------- #include "PythonQtSystem.h" #include #include #include #include #include #include #include #include class PYTHONQT_EXPORT PythonQtStdDecorators : public QObject { Q_OBJECT public slots: // additional constructors QVariant new_QSize(const QSize& o) { QSize a = o; return a; } QVariant new_QSizeF(const QSizeF& o) { QSizeF a = o; return a; } QVariant new_QPoint(const QPoint& o) { QPoint a = o; return a; } QVariant new_QPointF(const QPointF& o) { QPointF a = o; return a; } QVariant new_QRect(const QRect& o) { QRect a = o; return a; } QVariant new_QRectF(const QRectF& o) { QRectF a = o; return a; } QVariant new_QDate(const QDate& o) { QDate a = o; return a; } QVariant new_QDateTime(const QDateTime& o) { QDateTime a = o; return a; } QVariant new_QTime(const QTime& o) { QTime a = o; return a; } bool connect(QObject* sender, const QByteArray& signal, PyObject* callable); bool connect(QObject* sender, const QByteArray& signal, QObject* receiver, const QByteArray& slot); bool disconnect(QObject* sender, const QByteArray& signal, PyObject* callable); bool disconnect(QObject* sender, const QByteArray& signal, QObject* receiver, const QByteArray& slot); QObject* parent(QObject* o); void setParent(QObject* o, QObject* parent); QVariantList children(QObject* o); QString static_Qt_escape(const QString& s) { return Qt::escape(s); } //TODO: add findChild/findChildren/children/... }; #endif fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtStdDecorators.cpp0000644000175000017500000000661411145517421024010 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtStdDecorators.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2007-04 */ //---------------------------------------------------------------------------------- #include "PythonQtStdDecorators.h" #include "PythonQt.h" #include "PythonQtClassInfo.h" bool PythonQtStdDecorators::connect(QObject* sender, const QByteArray& signal, PyObject* callable) { QByteArray signalTmp("2"); signalTmp += signal; if (sender) { return PythonQt::self()->addSignalHandler(sender, signalTmp, callable); } else { return false; } } bool PythonQtStdDecorators::connect(QObject* sender, const QByteArray& signal, QObject* receiver, const QByteArray& slot) { bool r = false; if (sender && receiver) { QByteArray signalTmp("2"); signalTmp += signal; QByteArray slotTmp("1"); slotTmp += slot; if (receiver) { r = QObject::connect(sender, signalTmp, receiver, slotTmp); } } return r; } bool PythonQtStdDecorators::disconnect(QObject* sender, const QByteArray& signal, PyObject* callable) { QByteArray signalTmp("2"); signalTmp += signal; if (sender) { return PythonQt::self()->removeSignalHandler(sender, signalTmp, callable); } else { return false; } } bool PythonQtStdDecorators::disconnect(QObject* sender, const QByteArray& signal, QObject* receiver, const QByteArray& slot) { bool r = false; if (sender && receiver) { QByteArray signalTmp("2"); signalTmp += signal; QByteArray slotTmp("1"); slotTmp += slot; if (receiver) { r = QObject::disconnect(sender, signalTmp, receiver, slotTmp); } } return r; } QObject* PythonQtStdDecorators::parent(QObject* o) { return o->parent(); } void PythonQtStdDecorators::setParent(QObject* o, QObject* parent) { o->setParent(parent); } QVariantList PythonQtStdDecorators::children(QObject* o) { QVariantList v; QListIterator it(o->children()); while (it.hasNext()) { v << qVariantFromValue(it.next()); } return v; } fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtMethodInfo.h0000644000175000017500000001305711145517421022730 0ustar malexmalex#ifndef _PYTHONQTMETHODINFO_H #define _PYTHONQTMETHODINFO_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtMethodInfo.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include #include #include #include //! stores information about a specific signal/slot/method class PythonQtMethodInfo { public: //! this is a funny type union of QMetaType and QVariant, only god knows //! why QMetaType do not support identical types in Qt4, //! especial the support of Long, Short, Char etc. is missing in QVariant //! and QMetaType does not know anything about most variant types and e.g. LongLong enum ParameterType { Unknown = -1, Variant = -2 }; //! stores the QVariant id (if available) and the name of the type struct ParameterInfo { int typeId; // a mixture from QMetaType and ParameterType QByteArray name; bool isPointer; bool isConst; }; PythonQtMethodInfo() {}; ~PythonQtMethodInfo() {}; PythonQtMethodInfo(const QMetaMethod& meta); PythonQtMethodInfo(const PythonQtMethodInfo& other) { _parameters = other._parameters; } //! returns the method info of the signature, uses a cache internally to speed up //! multiple requests for the same method static const PythonQtMethodInfo* getCachedMethodInfo(const QMetaMethod& method); //! cleanup the cache static void cleanupCachedMethodInfos(); //! returns the number of parameters (without the return value) int parameterCount() const { return _parameters.size(); }; //! returns the id for the given type (using an internal dictionary) static int nameToType(const char* name); //! get the parameter infos const QList& parameters() const { return _parameters; } //! add an alias for a typename, e.g. QObjectList and QList. static void addParameterTypeAlias(const QByteArray& alias, const QByteArray& name); protected: static void fillParameterInfo(ParameterInfo& type, const QByteArray& name); static QHash _parameterTypeDict; static QHash _parameterNameAliases; //! stores the cached signatures of methods to speedup mapping from Qt to Python types static QHash _cachedSignatures; QList _parameters; }; //! stores information about a slot, including a next pointer to overloaded slots class PythonQtSlotInfo : public PythonQtMethodInfo { public: enum Type { MemberSlot, InstanceDecorator, ClassDecorator }; PythonQtSlotInfo(const PythonQtSlotInfo& info):PythonQtMethodInfo() { _meta = info._meta; _parameters = info._parameters; _slotIndex = info._slotIndex; _next = NULL; _decorator = info._decorator; _type = info._type; } PythonQtSlotInfo(const QMetaMethod& meta, int slotIndex, QObject* decorator = NULL, Type type = MemberSlot ):PythonQtMethodInfo() { const PythonQtMethodInfo* info = getCachedMethodInfo(meta); _meta = meta; _parameters = info->parameters(); _slotIndex = slotIndex; _next = NULL; _decorator = decorator; _type = type; } public: const QMetaMethod* metaMethod() const { return &_meta; } //! get the index of the slot (needed for qt_metacall) int slotIndex() const { return _slotIndex; } //! get next overloaded slot (which has the same name) PythonQtSlotInfo* nextInfo() const { return _next; } //! set the next overloaded slot void setNextInfo(PythonQtSlotInfo* next) { _next = next; } //! returns if the slot is a decorator slot bool isInstanceDecorator() { return _decorator!=NULL && _type == InstanceDecorator; } //! returns if the slot is a constructor slot bool isClassDecorator() { return _decorator!=NULL && _type == ClassDecorator; } QObject* decorator() { return _decorator; } //! get the full signature including return type QString fullSignature(bool skipFirstArg); //! get the short slot name QByteArray slotName(); private: int _slotIndex; PythonQtSlotInfo* _next; QObject* _decorator; Type _type; QMetaMethod _meta; }; #endif fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtWrapper.cpp0000644000175000017500000003233211145517421022644 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtWrapper.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQtWrapper.h" #include #include "PythonQt.h" #include "PythonQtSlot.h" #include "PythonQtClassInfo.h" #include "PythonQtConversion.h" static void PythonQtWrapper_dealloc(PythonQtWrapper* self) { if (self->_wrappedPtr) { //mlabDebugConst("Python","c++ wrapper removed " << self->_wrappedPtr << " " << self->_obj->className() << " " << self->_info->wrappedClassName().latin1()); PythonQt::priv()->removeWrapperPointer(self->_wrappedPtr); // we own our qobject, so we delete it now: delete self->_obj; self->_obj = NULL; if (self->_ownedByPythonQt) { PythonQtSlotInfo* slot = PythonQt::priv()->getDestructorSlot(self->_info->wrappedCPPClassName()); if (slot) { void* args[2]; args[0] = NULL; args[1] = &self->_wrappedPtr; slot->decorator()->qt_metacall(QMetaObject::InvokeMetaMethod, slot->slotIndex(), args); self->_wrappedPtr = NULL; } else { // TODO: print a warning? we can not destroy that object } } } else { //mlabDebugConst("Python","qobject wrapper removed " << self->_obj->className() << " " << self->_info->wrappedClassName().latin1()); if (self->_objPointerCopy) { PythonQt::priv()->removeWrapperPointer(self->_objPointerCopy); } if (self->_obj) { if (self->_ownedByPythonQt) { if (!self->_obj->parent()) { delete self->_obj; } } else { if (self->_obj->parent()==NULL) { // tell someone who is interested that the qobject is no longer wrapped, if it has no parent PythonQt::qObjectNoLongerWrappedCB(self->_obj); } } } } self->_obj = NULL; self->_obj.~QPointer(); self->ob_type->tp_free((PyObject*)self); } static PyObject* PythonQtWrapper_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PythonQtWrapper *self; self = (PythonQtWrapper *)type->tp_alloc(type, 0); if (self != NULL) { self->_info = NULL; new (&self->_obj) QPointer(); self->_wrappedPtr = NULL; self->_ownedByPythonQt = false; } return (PyObject *)self; } static int PythonQtWrapper_init(PythonQtWrapper *self, PyObject *args, PyObject *kwds) { return 0; } static PyObject *PythonQtWrapper_classname(PythonQtWrapper* type) { return PyString_FromString(type->_info->className()); } static PyObject *PythonQtWrapper_help(PythonQtWrapper* type) { return PythonQt::self()->helpCalled(type->_info); } static PyMethodDef PythonQtWrapper_methods[] = { {"className", (PyCFunction)PythonQtWrapper_classname, METH_NOARGS, "Return the classname of the object" }, {"help", (PyCFunction)PythonQtWrapper_help, METH_NOARGS, "Shows the help of available methods for this class" }, {NULL} /* Sentinel */ }; static PyObject *PythonQtWrapper_getattro(PyObject *obj,PyObject *name) { const char *attributeName; PythonQtWrapper *wt = (PythonQtWrapper *)obj; if ((attributeName = PyString_AsString(name)) == NULL) { return NULL; } if (!wt->_obj && !wt->_wrappedPtr) { QString error = QString("Trying to read attribute '") + attributeName + "' from a destroyed " + wt->_info->className() + " object"; PyErr_SetString(PyExc_ValueError, error.toLatin1().data()); return NULL; } // mlabDebugConst("Python","get " << attributeName); // TODO: dynamic properties are missing PythonQtMemberInfo member = wt->_info->member(attributeName); switch (member._type) { case PythonQtMemberInfo::Property: if (wt->_obj) { return PythonQtConv::QVariantToPyObject(member._property.read(wt->_obj)); } break; case PythonQtMemberInfo::Slot: return PythonQtSlotFunction_New(member._slot, obj, NULL); break; case PythonQtMemberInfo::EnumValue: return PyInt_FromLong(member._enumValue); break; } // look for the interal methods (className(), help()) PyObject* internalMethod = Py_FindMethod( PythonQtWrapper_methods, obj, (char*)attributeName); if (internalMethod) { return internalMethod; } PyErr_Clear(); if (wt->_obj) { // look for a child QObjectList children = wt->_obj->children(); for (int i = 0; i < children.count(); i++) { QObject *child = children.at(i); if (child->objectName() == attributeName) { return PythonQt::self()->priv()->wrapQObject(child); } } } if (qstrcmp(attributeName, "__dict__")==0) { QStringList l = wt->_info->memberList(false); PyObject* dict = PyDict_New(); foreach (QString name, l) { //PyObject* o = PyObject_GetAttrString(obj, name.toLatin1().data()); PyDict_SetItemString(dict, name.toLatin1().data(), Py_None); //Py_DECREF(o); } // Note: we do not put children into the dict, is would look confusing?! return dict; } QString error = QString(wt->_info->className()) + " has no attribute named '" + QString(attributeName) + "'"; PyErr_SetString(PyExc_AttributeError, error.toLatin1().data()); return NULL; } static int PythonQtWrapper_setattro(PyObject *obj,PyObject *name,PyObject *value) { QString error; char *attributeName; PythonQtWrapper *wt = (PythonQtWrapper *)obj; if ((attributeName = PyString_AsString(name)) == NULL) return -1; if (!wt->_obj) { error = QString("Trying to set attribute '") + attributeName + "' on a destroyed " + wt->_info->className() + " object"; PyErr_SetString(PyExc_AttributeError, error.toLatin1().data()); return -1; } PythonQtMemberInfo member = wt->_info->member(attributeName); if (member._type == PythonQtMemberInfo::Property) { QMetaProperty prop = member._property; if (prop.isWritable()) { QVariant v; if (prop.isEnumType()) { // this will give us either a string or an int, everything else will probably be an error v = PythonQtConv::PyObjToQVariant(value); } else { int t = prop.userType(); v = PythonQtConv::PyObjToQVariant(value, t); } bool success = false; if (v.isValid()) { success = prop.write(wt->_obj, v); } if (success) { return 0; } else { error = QString("Property '") + attributeName + "' of type '" + prop.typeName() + "' does not accept an object of type " + QString(value->ob_type->tp_name) + " (" + PythonQtConv::PyObjGetRepresentation(value) + ")"; } } else { error = QString("Property '") + attributeName + "' of " + wt->_info->className() + " object is not writable"; } } else { if (member._type == PythonQtMemberInfo::Slot) { error = QString("Slot '") + attributeName + "' can not be overwritten on " + wt->_info->className() + " object"; } else if (member._type == PythonQtMemberInfo::EnumValue) { error = QString("EnumValue '") + attributeName + "' can not be overwritten on " + wt->_info->className() + " object"; } } PyErr_SetString(PyExc_AttributeError, error.toLatin1().data()); return -1; } static PyObject * PythonQtWrapper_repr(PyObject * obj) { PythonQtWrapper* wt = (PythonQtWrapper*)obj; QObject *qobj = wt->_obj; if (wt->_wrappedPtr) { if (wt->_obj) { return PyString_FromFormat("%s (C++ Object %p wrapped by %s %p))", wt->_info->className(), wt->_wrappedPtr, wt->_obj->metaObject()->className(), qobj); } else { return PyString_FromFormat("%s (C++ Object %p unwrapped)", wt->_info->className(), wt->_wrappedPtr); } } else { return PyString_FromFormat("%s (QObject %p)", wt->_info->className(), qobj); } } static int PythonQtWrapper_compare(PyObject * obj1, PyObject * obj2) { if (obj1->ob_type == &PythonQtWrapper_Type && obj2->ob_type == &PythonQtWrapper_Type) { PythonQtWrapper* w1 = (PythonQtWrapper*)obj1; PythonQtWrapper* w2 = (PythonQtWrapper*)obj2; if (w1->_wrappedPtr != NULL) { if (w1->_wrappedPtr == w1->_wrappedPtr) { return 0; } else { return -1; } } else if (w1->_obj == w2->_obj) { return 0; } else { return -1; } } else { return -1; } } static int PythonQtWrapper_nonzero(PyObject *obj) { PythonQtWrapper* wt = (PythonQtWrapper*)obj; return (wt->_wrappedPtr == NULL && wt->_obj == NULL)?0:1; } static long PythonQtWrapper_hash(PythonQtWrapper *obj) { if (obj->_wrappedPtr != NULL) { return reinterpret_cast(obj->_wrappedPtr); } else { QObject* qobj = obj->_obj; // get pointer from QPointer wrapper return reinterpret_cast(qobj); } } // we override nb_nonzero, so that one can do 'if' expressions to test for a NULL ptr static PyNumberMethods PythonQtWrapper_as_number = { 0, /* nb_add */ 0, /* nb_subtract */ 0, /* nb_multiply */ 0, /* nb_divide */ 0, /* nb_remainder */ 0, /* nb_divmod */ 0, /* nb_power */ 0, /* nb_negative */ 0, /* nb_positive */ 0, /* nb_absolute */ PythonQtWrapper_nonzero, /* nb_nonzero */ 0, /* nb_invert */ 0, /* nb_lshift */ 0, /* nb_rshift */ 0, /* nb_and */ 0, /* nb_xor */ 0, /* nb_or */ 0, /* nb_coerce */ 0, /* nb_int */ 0, /* nb_long */ 0, /* nb_float */ 0, /* nb_oct */ 0, /* nb_hex */ 0, /* nb_inplace_add */ 0, /* nb_inplace_subtract */ 0, /* nb_inplace_multiply */ 0, /* nb_inplace_divide */ 0, /* nb_inplace_remainder */ 0, /* nb_inplace_power */ 0, /* nb_inplace_lshift */ 0, /* nb_inplace_rshift */ 0, /* nb_inplace_and */ 0, /* nb_inplace_xor */ 0, /* nb_inplace_or */ 0, /* nb_floor_divide */ 0, /* nb_true_divide */ 0, /* nb_inplace_floor_divide */ 0, /* nb_inplace_true_divide */ }; PyTypeObject PythonQtWrapper_Type = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "PythonQt.PythonQtWrapper", /*tp_name*/ sizeof(PythonQtWrapper), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)PythonQtWrapper_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ PythonQtWrapper_compare, /*tp_compare*/ PythonQtWrapper_repr, /*tp_repr*/ &PythonQtWrapper_as_number, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)PythonQtWrapper_hash, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ PythonQtWrapper_getattro, /*tp_getattro*/ PythonQtWrapper_setattro, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ "PythonQtWrapper object", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)PythonQtWrapper_init, /* tp_init */ 0, /* tp_alloc */ PythonQtWrapper_new, /* tp_new */ }; //------------------------------------------------------- fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtVariants.h0000644000175000017500000000344411145517421022462 0ustar malexmalex#ifndef _PYTHONQTVARIANTS_ #define _PYTHONQTVARIANTS_ /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtVariants.h // \author Florian Link // \author Last changed by $Author: stk $ // \date 2006-08 */ //---------------------------------------------------------------------------------- #include "Python.h" #include "structmember.h" #include "wrapper/PythonQtWrappedVariants.h" #endif fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtSignalReceiver.cpp0000644000175000017500000001426311145517421024131 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtSignalReceiver.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQtSignalReceiver.h" #include "PythonQtClassInfo.h" #include "PythonQtMethodInfo.h" #include "PythonQtConversion.h" #include #include #include "funcobject.h" void PythonQtSignalTarget::call(void **arguments) const { // Note: we check if the callable is a PyFunctionObject and has a fixed number of arguments // if that is the case, we only pass these arguments to python and skip the additional arguments from the signal int numPythonArgs = -1; if (PyFunction_Check(_callable)) { PyObject* o = _callable; PyFunctionObject* func = (PyFunctionObject*)o; PyCodeObject* code = (PyCodeObject*)func->func_code; if (!(code->co_flags & 0x04)) { numPythonArgs = code->co_argcount; } else { // variable numbers of arguments allowed } } else if (PyMethod_Check(_callable)) { PyObject* o = _callable; PyMethodObject* method = (PyMethodObject*)o; if (PyFunction_Check(method->im_func)) { PyFunctionObject* func = (PyFunctionObject*)method->im_func; PyCodeObject* code = (PyCodeObject*)func->func_code; if (!(code->co_flags & 0x04)) { numPythonArgs = code->co_argcount - 1; // we subtract one because the first is "self" } else { // variable numbers of arguments allowed } } } const PythonQtMethodInfo* m = methodInfo(); // parameterCount includes return value: int count = m->parameterCount(); if (numPythonArgs!=-1) { if (count>numPythonArgs+1) { // take less arguments count = numPythonArgs+1; } } PyObject* pargs = NULL; if (count>1) { pargs = PyTuple_New(count-1); } bool err = false; // transform Qt values to Python const QList& params = m->parameters(); for (int i = 1; i < count; i++) { const PythonQtMethodInfo::ParameterInfo& param = params.at(i); PyObject* arg = PythonQtConv::ConvertQtValueToPython(param, arguments[i]); if (arg) { // steals reference, no unref PyTuple_SetItem(pargs, i-1,arg); } else { err = true; break; } } if (!err) { PyErr_Clear(); PyObject* result = PyObject_CallObject(_callable, pargs); if (result) { // ok Py_DECREF(result); } else { PythonQt::self()->handleError(); } } if (pargs) { // free the arguments again Py_DECREF(pargs); } } //------------------------------------------------------------------------------ PythonQtSignalReceiver::PythonQtSignalReceiver(QObject* obj):PythonQtSignalReceiverBase(obj) { _obj = obj; _slotCount = staticMetaObject.methodOffset(); } PythonQtSignalReceiver::~PythonQtSignalReceiver() { PythonQt::priv()->removeSignalEmitter(_obj); } bool PythonQtSignalReceiver::addSignalHandler(const char* signal, PyObject* callable) { bool flag = false; int sigId = getSignalIndex(signal); if (sigId>=0) { // create PythonQtMethodInfo from signal QMetaMethod meta = _obj->metaObject()->method(sigId); const PythonQtMethodInfo* signalInfo = PythonQtMethodInfo::getCachedMethodInfo(meta); PythonQtSignalTarget t(sigId, signalInfo, _slotCount, callable); _targets.append(t); // now connect to ourselves with the new slot id QMetaObject::connect(_obj, sigId, this, _slotCount, Qt::AutoConnection, 0); _slotCount++; flag = true; } return flag; } bool PythonQtSignalReceiver::removeSignalHandler(const char* signal, PyObject* callable) { bool found = false; int sigId = getSignalIndex(signal); if (sigId>=0) { QMutableListIterator i(_targets); while (i.hasNext()) { if (i.next().isSame(sigId, callable)) { i.remove(); found = true; break; } } } return found; } void PythonQtSignalReceiver::removeSignalHandlers() { _targets.clear(); } int PythonQtSignalReceiver::getSignalIndex(const char* signal) { int sigId = _obj->metaObject()->indexOfSignal(signal+1); if (sigId<0) { QByteArray tmpSig = QMetaObject::normalizedSignature(signal+1); sigId = _obj->metaObject()->indexOfSignal(tmpSig); } return sigId; } int PythonQtSignalReceiver::qt_metacall(QMetaObject::Call c, int id, void **arguments) { // mlabDebugConst("PythonQt", "PythonQtSignalReceiver invoke " << _obj->className() << " " << _obj->name() << " " << id); if (c != QMetaObject::InvokeMetaMethod) { QObject::qt_metacall(c, id, arguments); } bool found = false; foreach(const PythonQtSignalTarget& t, _targets) { if (t.slotId() == id) { found = true; t.call(arguments); break; } } return 0; } fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQt.h0000644000175000017500000004515011145517421020752 0ustar malexmalex#ifndef _PYTHONQT_H #define _PYTHONQT_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQt.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQtSystem.h" #include "PythonQtWrapper.h" #include "PythonQtVariantWrapper.h" #include "PythonQtMetaObjectWrapper.h" #include "PythonQtSlot.h" #include "PythonQtObjectPtr.h" #include #include #include #include #include #include #include #include class PythonQtClassInfo; class PythonQtPrivate; class PythonQtMethodInfo; class PythonQtSignalReceiver; class PythonQtImportFileInterface; class PythonQtCppWrapperFactory; class PythonQtConstructorHandler; typedef void PythonQtQObjectWrappedCB(QObject* object); typedef void PythonQtQObjectNoLongerWrappedCB(QObject* object); //! the main interface to the Python Qt binding, realized as a singleton class PYTHONQT_EXPORT PythonQt : public QObject { Q_OBJECT public: enum InitFlags { RedirectStdOut = 1, //!<< sets if the std out/err is redirected to pythonStdOut() and pythonStdErr() signals IgnoreSiteModule = 2, //!<< sets if Python should ignore the site module ExternalHelp = 4 //!<< sets if help() calls on PythonQt modules are forwarded to the pythonHelpRequest() signal }; //! initialize the python qt binding (flags are a or combination of InitFlags) static void init(int flags = IgnoreSiteModule | RedirectStdOut); //! cleanup static void cleanup(); //! get the singleton instance static PythonQt* self() { return _self; } //----------------------------------------------------------------------------- // Public API: //! defines the object types for introspection enum ObjectType { Class, Function, Variable, Module, Anything, CallOverloads }; //! overwrite the python sys path (call this directly after PythonQt::init() if you want to change the std python sys path) void overwriteSysPath(const QStringList& paths); //! sets the __path__ list of a module to the given list (important for local imports) void setModuleImportPath(PyObject* module, const QStringList& paths); //! get the __main__ module of python PythonQtObjectPtr getMainModule(); //! registers a QObject derived class to PythonQt (this is implicitly called by addObject as well) //! All added metaobjects will be visible under the className in the PythonQt module as MetaObjectWrappers and the enums //! and constructors (added by addConstructors) will be available. /* Since Qt4 does not offer a way to detect if a given classname is derived from QObject and thus has a QMetaObject, you MUST register all your QObject derived classes here when you want them to be detected in signal and slot calls */ void registerClass(const QMetaObject* metaobject); //! as an alternative to registerClass, you can tell PythonQt the names of QObject derived classes //! and it will register the classes when it first sees a pointer to such a derived class void registerQObjectClassNames(const QStringList& names); //! this will register CPP classnames as known CPP classes (NOT QObjects) and make their MetaObjectWrapper available in //! the PythonQt module. In combination with addConstuctors(), this can be used to create CPP objects from PythonQt void registerCPPClassNames(const QStringList& names); //! parses the given file and returns the python code object, this can then be used to call evalCode() PythonQtObjectPtr parseFile(const QString& filename); //! evaluates the given code and returns the result value (use Py_Compile etc. to create pycode from string) //! If pycode is NULL, a python error is printed. QVariant evalCode(PyObject* module, PyObject* pycode); //! evaluates the given script code and returns the result value QVariant evalScript(PyObject* module, const QString& script, int start = Py_file_input); //! evaluates the given script code from file void evalFile(PyObject* module, const QString& filename); //! creates the new module \c name and evaluates the given file in the context of that module //! If the \c script is empty, the module contains no initial code. You can use evalScript/evalCode to add code //! to a module later on. //! The user needs to make sure that the \c name is unique in the python module dictionary. PythonQtObjectPtr createModuleFromFile(const QString& name, const QString& filename); //! creates the new module \c name and evaluates the given script in the context of that module. //! If the \c script is empty, the module contains no initial code. You can use evalScript/evalCode to add code //! to a module later on. //! The user needs to make sure that the \c name is unique in the python module dictionary. PythonQtObjectPtr createModuleFromScript(const QString& name, const QString& script = QString()); //! create a uniquely named module, you can use evalFile or evalScript to populate the module with //! script code PythonQtObjectPtr createUniqueModule(); //@{ Signal handlers //! add a signal handler to the given \c signal of \c obj and connect it to a callable \c objectname in module bool addSignalHandler(QObject* obj, const char* signal, PyObject* module, const QString& objectname); //! remove a signal handler from the given \c signal of \c obj bool removeSignalHandler(QObject* obj, const char* signal, PyObject* module, const QString& objectname); //! add a signal handler to the given \c signal of \c obj and connect it to a callable \c receiver bool addSignalHandler(QObject* obj, const char* signal, PyObject* receiver); //! remove a signal handler from the given \c signal of \c obj bool removeSignalHandler(QObject* obj, const char* signal, PyObject* receiver); //@} //@{ Variable access //! add the given \c object to the \c module as a variable with \c name (it can be removed via clearVariable) void addObject(PyObject* module, const QString& name, QObject* object); //! add the given variable to the module void addVariable(PyObject* module, const QString& name, const QVariant& v); //! remove the given variable void removeVariable(PyObject* module, const QString& name); //! get the variable with the \c name of the \c module, returns an invalid QVariant on error QVariant getVariable(PyObject* module, const QString& name); //! read vars etc. in scope of a module, optional looking inside of an object \c objectname QStringList introspection(PyObject* module, const QString& objectname, ObjectType type); //! returns the found callable object or NULL //! @return new reference PythonQtObjectPtr lookupCallable(PyObject* module, const QString& name); //@} //@{ Calling of python callables //! call the given python method, returns the result converted to a QVariant QVariant call(PyObject* module, const QString& callable, const QVariantList& args); //@} //@{ Decorations, constructors, wrappers... //! add an object whose slots will be used as decorator slots for //! other QObjects or CPP classes. The slots need to follow the //! convention that the first argument is a pointer to the wrapped object. //! (ownership is passed to PythonQt) /*! Example: A slot with the signature \code bool doSomething(QWidget* w, int a) \endcode will extend QWidget instances (and derived classes) with a "bool doSomething(int a)" slot that will be called with the concrete instance as first argument. So in Python you can now e.g. call \code someWidget.doSomething(12) \endcode without QWidget really having this method. This allows to easily make normal methods of Qt classes callable by forwarding them with such decorator slots or to make CPP classes (which are not derived from QObject) callable from Python. */ void addInstanceDecorators(QObject* o); //! add an object whose slots will be used as decorator slots for //! class objects (ownership is passed to PythonQt) /*! The slots need to follow the following convention: - SomeClass* new_SomeClass(...) - QVariant new_SomeClass(...) - void delete_SomeClass(SomeClass*) - ... static_SomeClass_someName(...) This will add: - a constructor - a constructor which generates a QVariant - a destructor (only useful for CPP objects) - a static decorator slot which will be available on the MetaObject (visible in PythonQt module) */ void addClassDecorators(QObject* o); //! this will add the object both as class and instance decorator (ownership is passed to PythonQt) void addDecorators(QObject* o); //! add a wrapper object for the given QMetaType typeName, also does an addClassDecorators() to add constructors for variants //! (ownership of wrapper is passed to PythonQt) /*! Make sure that you have done a qRegisterMetaType first, if typeName is a user type! This will add a wrapper object that is used to make calls to the given classname \c typeName. All slots that take a pointer to typeName as the first argument will be callable from Python on a variant object that contains such a type. */ void addVariantWrapper(const char* typeName, QObject* wrapper); //! add the given factory to PythonQt (ownership stays with caller) void addWrapperFactory(PythonQtCppWrapperFactory* factory); //! add the given constructor handler to PythonQt (ownership stays with caller) void addConstructorHandler(PythonQtConstructorHandler* handler); //! get list of constructor handlers const QList& constructorHandlers(); //@} //@{ Custom importer (to replace internal import implementation of python) //! replace the internal import implementation and use the supplied interface to load files (both py and pyc files) //! (this method should be called directly after initialization of init() and before calling overwriteSysPath(). //! It can only be called once, further calls will be ignored silently. (ownership stays with caller) void setImporter(PythonQtImportFileInterface* importInterface); //! set paths that the importer should ignore void setImporterIgnorePaths(const QStringList& paths); //! get paths that the importer should ignore const QStringList& getImporterIgnorePaths(); //@} //! get access to internal data (should not be used on the public API, but is used by some C functions) static PythonQtPrivate* priv() { return _self->_p; } //! get access to the file importer (if set) static PythonQtImportFileInterface* importInterface(); //! handle a python error, call this when a python function fails. If no error occurred, it returns false. //! The error is currently just output to the python stderr, future version might implement better trace printing bool handleError(); //! set a callback that is called when a QObject with parent == NULL is wrapped by pythonqt void setQObjectWrappedCallback(PythonQtQObjectWrappedCB* cb); //! set a callback that is called when a QObject with parent == NULL is no longer wrapped by pythonqt void setQObjectNoLongerWrappedCallback(PythonQtQObjectNoLongerWrappedCB* cb); //! call the callback if it is set static void qObjectNoLongerWrappedCB(QObject* o); signals: //! emitted when python outputs something to stdout (and redirection is turned on) void pythonStdOut(const QString& str); //! emitted when python outputs something to stderr (and redirection is turned on) void pythonStdErr(const QString& str); //! emitted when help() is called on a PythonQt object and \c ExternalHelp is enabled void pythonHelpRequest(const QByteArray& cppClassName); public: //! called by internal help methods PyObject* helpCalled(PythonQtClassInfo* info); //! returns the found object or NULL //! @return new reference PythonQtObjectPtr lookupObject(PyObject* module, const QString& name); private: void initPythonQtModule(bool redirectStdOut); //! callback for stdout redirection, emits pythonStdOut signal static void stdOutRedirectCB(const QString& str); //! callback for stderr redirection, emits pythonStdErr signal static void stdErrRedirectCB(const QString& str); //! get (and create if not available) the signal receiver of that QObject, signal receiver is made child of the passed \c obj PythonQtSignalReceiver* getSignalReceiver(QObject* obj); PythonQt(int flags); ~PythonQt(); static PythonQt* _self; static int _uniqueModuleCount; PythonQtPrivate* _p; }; //! internal PythonQt details class PythonQtPrivate : public QObject { Q_OBJECT public: PythonQtPrivate(); ~PythonQtPrivate(); //! returns if the id is the id for PythonQtObjectPtr bool isPythonQtObjectPtrMetaId(int id) { return _PythonQtObjectPtr_metaId == id; } //! remove the wrapper ptr again void removeWrapperPointer(void* obj); //! called when a signal emitting QObject is destroyed to remove the signal handler from the hash map void removeSignalEmitter(QObject* obj); //! wrap the given QObject into a Python object (or return existing wrapper!) PyObject* wrapQObject(QObject* obj); //! wrap the given ptr into a Python object (or return existing wrapper!) if there is a known QObject of that name or a known wrapper in the factory PyObject* wrapPtr(void* ptr, const QByteArray& name); //! registers a QObject derived class to PythonQt (this is implicitly called by addObject as well) /* Since Qt4 does not offer a way to detect if a given classname is derived from QObject and thus has a QMetaObject, you MUST register all your QObject derived classes here when you want them to be detected in signal and slot calls */ void registerClass(const QMetaObject* metaobject); //! as an alternative to registerClass, you can tell PythonQt the names of QObject derived classes //! and it will register the classes when it first sees a pointer to such a derived class void registerQObjectClassNames(const QStringList& names); //! add a decorator object void addDecorators(QObject* o, bool instanceDeco, bool classDeco); //! add a wrapper object for the given qvariant, also does an addConstructors() to add constructors for variants void addVariantWrapper(const char* typeName, QObject* wrapper); //! get list of all slots that are available as decorator slots QList getDecoratorSlots(const QByteArray& className); //! check if the enum is either part of the \c meta class or contains a scope and is //! an enum of another known metaobject (and as last resort, of the Qt namespace) bool isEnumType(const QMetaObject* meta, const QByteArray& name); //! helper method that creates a PythonQtMetaObjectWrapper object PythonQtMetaObjectWrapper* createNewPythonQtMetaObjectWrapper(PythonQtClassInfo* info); //! helper method that creates a PythonQtWrapper object and registers it in the object map PythonQtWrapper* createNewPythonQtWrapper(QObject* obj, PythonQtClassInfo* info, void* wrappedPtr = NULL); //! helper method that creates a PythonQtVariantWrapper object PythonQtVariantWrapper* createNewPythonQtVariantWrapper(const QVariant& variant); //! get the class info for a meta object (if available) PythonQtClassInfo* getClassInfo(const QMetaObject* meta) { return _knownQtClasses.value(meta->className()); } //! get the constructor slot for the given classname PythonQtSlotInfo* getConstructorSlot(const QByteArray& className) { return _constructorSlots.value(className); } //! get the destructor slot for the given classname PythonQtSlotInfo* getDestructorSlot(const QByteArray& className) { return _destructorSlots.value(className); } //! creates the new module from the given pycode PythonQtObjectPtr createModule(const QString& name, PyObject* pycode); private: //! get the wrapper for a given pointer (and remove a wrapper of an already destroyed qobject) PythonQtWrapper* findWrapperAndRemoveUnused(void* obj); //! stores pointer to PyObject mapping of wrapped QObjects AND C++ objects QHash _wrappedObjects; //! stores the meta info of known Qt classes QHash _knownQtClasses; //! stores the meta info of known Qt classes QHash _knownQtWrapperClasses; //! stores the meta info of known Qt C++ wrapper classes QMultiHash _knownQtDecoratorSlots; //! names of qobject derived classes that can be casted to qobject savely QHash _knownQObjectClassNames; //! stores signal receivers for QObjects QHash _signalReceivers; //! the PythonQt python module PythonQtObjectPtr _pythonQtModule; //! the importer interface (if set) PythonQtImportFileInterface* _importInterface; PythonQtQObjectNoLongerWrappedCB* _noLongerWrappedCB; PythonQtQObjectWrappedCB* _wrappedCB; QStringList _importIgnorePaths; //! the cpp object wrapper factories QList _cppWrapperFactories; //! the cpp object wrapper factories QList _constructorHandlers; QHash _constructorSlots; QHash _destructorSlots; QHash > _knownVariantWrappers; PythonQtClassInfo* _qtNamespace; int _initFlags; int _PythonQtObjectPtr_metaId; friend class PythonQt; }; #endif fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtMethodInfo.cpp0000644000175000017500000002472311145517421023265 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtMethodInfo.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQtMethodInfo.h" #include QHash PythonQtMethodInfo::_cachedSignatures; QHash PythonQtMethodInfo::_parameterNameAliases; PythonQtMethodInfo::PythonQtMethodInfo(const QMetaMethod& meta) { #ifdef PYTHONQT_DEBUG QByteArray sig(meta.signature()); sig = sig.mid(sig.indexOf('(')); QByteArray fullSig = QByteArray(meta.typeName()) + " " + sig; std::cout << "caching " << fullSig.data() << std::endl; #endif ParameterInfo type; fillParameterInfo(type, QByteArray(meta.typeName())); _parameters.append(type); QByteArray name; QList names = meta.parameterTypes(); foreach (name, names) { fillParameterInfo(type, name); _parameters.append(type); } } const PythonQtMethodInfo* PythonQtMethodInfo::getCachedMethodInfo(const QMetaMethod& signal) { QByteArray sig(signal.signature()); sig = sig.mid(sig.indexOf('(')); QByteArray fullSig = QByteArray(signal.typeName()) + " " + sig; PythonQtMethodInfo* result = _cachedSignatures.value(fullSig); if (!result) { result = new PythonQtMethodInfo(signal); _cachedSignatures.insert(fullSig, result); } return result; } void PythonQtMethodInfo::fillParameterInfo(ParameterInfo& type, const QByteArray& orgName) { QByteArray name = orgName; int len = name.length(); if (len>0) { if (strncmp(name.constData(), "const ", 6)==0) { name = name.mid(6); len -= 6; type.isConst = true; } else { type.isConst = false; } // EXTRA: & references are not yet supported, while const & is removed by moc while (name.at(len-1) == '*') { len--; } if (len!=name.length()) { name = name.left(len); type.isPointer = true; } else { type.isPointer = false; } QByteArray alias = _parameterNameAliases.value(name); if (!alias.isEmpty()) { name = alias; } type.typeId = nameToType(name); if (!type.isPointer && type.typeId == Unknown) { type.typeId = QMetaType::type(name.constData()); if (type.typeId == QMetaType::Void) { type.typeId = Unknown; } } type.name = name; } else { type.typeId = QMetaType::Void; type.isPointer = false; type.isConst = false; } } int PythonQtMethodInfo::nameToType(const char* name) { if (_parameterTypeDict.isEmpty()) { // we could also use QMetaType::nameToType, but that does a string compare search // and does not support QVariant // QMetaType names _parameterTypeDict.insert("long", QMetaType::Long); _parameterTypeDict.insert("int", QMetaType::Int); _parameterTypeDict.insert("short", QMetaType::Short); _parameterTypeDict.insert("char", QMetaType::Char); _parameterTypeDict.insert("ulong", QMetaType::ULong); _parameterTypeDict.insert("unsigned long", QMetaType::ULong); _parameterTypeDict.insert("uint", QMetaType::UInt); _parameterTypeDict.insert("unsigned int", QMetaType::UInt); _parameterTypeDict.insert("ushort", QMetaType::UShort); _parameterTypeDict.insert("unsigned short", QMetaType::UShort); _parameterTypeDict.insert("uchar", QMetaType::UChar); _parameterTypeDict.insert("unsigned char", QMetaType::UChar); _parameterTypeDict.insert("bool", QMetaType::Bool); _parameterTypeDict.insert("float", QMetaType::Float); _parameterTypeDict.insert("double", QMetaType::Double); _parameterTypeDict.insert("qreal", QMetaType::Double); _parameterTypeDict.insert("QChar", QMetaType::QChar); _parameterTypeDict.insert("QByteArray", QMetaType::QByteArray); _parameterTypeDict.insert("Q3CString", QMetaType::QByteArray); _parameterTypeDict.insert("QString", QMetaType::QString); _parameterTypeDict.insert("", QMetaType::Void); _parameterTypeDict.insert("void", QMetaType::Void); // QVariant names _parameterTypeDict.insert("Q_LLONG", QMetaType::LongLong); _parameterTypeDict.insert("Q_ULLONG", QMetaType::ULongLong); _parameterTypeDict.insert("qlonglong", QMetaType::LongLong); _parameterTypeDict.insert("qulonglong", QMetaType::ULongLong); _parameterTypeDict.insert("qint64", QMetaType::LongLong); _parameterTypeDict.insert("quint64", QMetaType::ULongLong); _parameterTypeDict.insert("QIconSet", QMetaType::QIcon); _parameterTypeDict.insert("QVariantMap", QMetaType::QVariantMap); _parameterTypeDict.insert("QVariantList", QMetaType::QVariantList); _parameterTypeDict.insert("QMap", QMetaType::QVariantMap); _parameterTypeDict.insert("QList", QMetaType::QVariantList); _parameterTypeDict.insert("QStringList", QMetaType::QStringList); _parameterTypeDict.insert("QBitArray", QMetaType::QBitArray); _parameterTypeDict.insert("QDate", QMetaType::QDate); _parameterTypeDict.insert("QTime", QMetaType::QTime); _parameterTypeDict.insert("QDateTime", QMetaType::QDateTime); _parameterTypeDict.insert("QUrl", QMetaType::QUrl); _parameterTypeDict.insert("QLocale", QMetaType::QLocale); _parameterTypeDict.insert("QRect", QMetaType::QRect); _parameterTypeDict.insert("QRectf", QMetaType::QRectF); _parameterTypeDict.insert("QSize", QMetaType::QSize); _parameterTypeDict.insert("QSizef", QMetaType::QSizeF); _parameterTypeDict.insert("QLine", QMetaType::QLine); _parameterTypeDict.insert("QLinef", QMetaType::QLineF); _parameterTypeDict.insert("QPoint", QMetaType::QPoint); _parameterTypeDict.insert("QPointf", QMetaType::QPointF); _parameterTypeDict.insert("QRegExp", QMetaType::QRegExp); // _parameterTypeDict.insert("QColorGroup", QMetaType::QColorGroup); _parameterTypeDict.insert("QFont", QMetaType::QFont); _parameterTypeDict.insert("QPixmap", QMetaType::QPixmap); _parameterTypeDict.insert("QBrush", QMetaType::QBrush); _parameterTypeDict.insert("QColor", QMetaType::QColor); _parameterTypeDict.insert("QCursor", QMetaType::QCursor); _parameterTypeDict.insert("QPalette", QMetaType::QPalette); _parameterTypeDict.insert("QIcon", QMetaType::QIcon); _parameterTypeDict.insert("QImage", QMetaType::QPolygon); _parameterTypeDict.insert("QRegion", QMetaType::QRegion); _parameterTypeDict.insert("QBitmap", QMetaType::QBitmap); _parameterTypeDict.insert("QSizePolicy", QMetaType::QSizePolicy); _parameterTypeDict.insert("QKeySequence", QMetaType::QKeySequence); _parameterTypeDict.insert("QPen", QMetaType::QPen); _parameterTypeDict.insert("QTextLength", QMetaType::QTextLength); _parameterTypeDict.insert("QTextFormat", QMetaType::QTextFormat); _parameterTypeDict.insert("QMatrix", QMetaType::QMatrix); _parameterTypeDict.insert("QVariant", PythonQtMethodInfo::Variant); // own special types... (none so far, could be e.g. ObjectList } QHash::const_iterator it = _parameterTypeDict.find(name); if (it!=_parameterTypeDict.end()) { return it.value(); } else { return PythonQtMethodInfo::Unknown; } } void PythonQtMethodInfo::cleanupCachedMethodInfos() { QHashIterator i(_cachedSignatures); while (i.hasNext()) { delete i.next().value(); } } void PythonQtMethodInfo::addParameterTypeAlias(const QByteArray& alias, const QByteArray& name) { _parameterNameAliases.insert(alias, name); } //------------------------------------------------------------------------------------------------- QString PythonQtSlotInfo::fullSignature(bool skipFirstArg) { QString result = _meta.typeName(); QByteArray sig = slotName(); QList names = _meta.parameterNames(); bool isStatic = false; bool isConstructor = false; bool isDestructor = false; if (_type == ClassDecorator) { if (sig.startsWith("new_")) { sig = sig.mid(strlen("new_")); isConstructor = true; } else if (sig.startsWith("delete_")) { sig = sig.mid(strlen("delete_")); isDestructor = true; } else if(sig.startsWith("static_")) { isStatic = true; sig = sig.mid(strlen("static_")); int idx = sig.indexOf("_"); if (idx>=0) { sig = sig.mid(idx+1); } } } result += QByteArray(" ") + sig; result += "("; int lastEntry = _parameters.count()-1; for (int i = skipFirstArg?2:1; i<_parameters.count(); i++) { if (_parameters.at(i).isConst) { result += "const "; } result += _parameters.at(i).name; if (_parameters.at(i).isPointer) { result += "*"; } if (!names.at(i-1).isEmpty()) { result += " "; result += names.at(i-1); } if (i!=lastEntry) { result += ", "; } } result += ")"; if (isStatic) { result = QString("static ") + result; } if (isConstructor) { // result = QString("constructor ") + result; } if (isDestructor) { result = QString("~") + result; } return result; } QByteArray PythonQtSlotInfo::slotName() { QByteArray sig(_meta.signature()); int idx = sig.indexOf('('); sig = sig.left(idx); return sig; } fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtMisc.cpp0000644000175000017500000000324411145517421022117 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtMisc.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQtMisc.h" fontmatrix-0.6.0+svn20110930/pythonqt/src/gui/0000755000175000017500000000000011641435631017575 5ustar malexmalexfontmatrix-0.6.0+svn20110930/pythonqt/src/gui/PythonQtScriptingConsole.cpp0000644000175000017500000003574511145517421025310 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtScriptingConsole.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-10 */ //---------------------------------------------------------------------------------- #include "PythonQtScriptingConsole.h" #include #include #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- PythonQtScriptingConsole::PythonQtScriptingConsole(QWidget* parent, const PythonQtObjectPtr& context, Qt::WindowFlags windowFlags) : QTextEdit(parent) { setWindowFlags(windowFlags); _defaultTextCharacterFormat = currentCharFormat(); _context = context; _historyPosition = 0; _completer = new QCompleter(this); _completer->setWidget(this); QObject::connect(_completer, SIGNAL(activated(const QString&)), this, SLOT(insertCompletion(const QString&))); clear(); connect(PythonQt::self(), SIGNAL(pythonStdOut(const QString&)), this, SLOT(stdOut(const QString&))); connect(PythonQt::self(), SIGNAL(pythonStdErr(const QString&)), this, SLOT(stdErr(const QString&))); } //----------------------------------------------------------------------------- void PythonQtScriptingConsole::stdOut(const QString& s) { _stdOut += s; int idx; while ((idx = _stdOut.indexOf('\n'))!=-1) { consoleMessage(_stdOut.left(idx)); std::cout << _stdOut.left(idx).toLatin1().data() << std::endl; _stdOut = _stdOut.mid(idx+1); } } void PythonQtScriptingConsole::stdErr(const QString& s) { _stdErr += s; int idx; while ((idx = _stdErr.indexOf('\n'))!=-1) { consoleMessage(_stdErr.left(idx)); std::cout << _stdErr.left(idx).toLatin1().data() << std::endl; _stdErr = _stdErr.mid(idx+1); } } void PythonQtScriptingConsole::flushStdOut() { if (!_stdOut.isEmpty()) { stdOut("\n"); } if (!_stdErr.isEmpty()) { stdErr("\n"); } } //----------------------------------------------------------------------------- PythonQtScriptingConsole::~PythonQtScriptingConsole() { } //----------------------------------------------------------------------------- void PythonQtScriptingConsole::clear() { QTextEdit::clear(); appendCommandPrompt(); } //----------------------------------------------------------------------------- void PythonQtScriptingConsole::executeLine(bool storeOnly) { QTextCursor textCursor = this->textCursor(); textCursor.movePosition(QTextCursor::End); // Select the text from the command prompt until the end of the block // and get the selected text. textCursor.setPosition(commandPromptPosition()); textCursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); QString code = textCursor.selectedText(); // i don't know where this trailing space is coming from, blast it! if (code.endsWith(" ")) { code.truncate(code.length()-1); } if (!code.isEmpty()) { // Update the history _history << code; _historyPosition = _history.count(); _currentMultiLineCode += code + "\n"; if (!storeOnly) { executeCode(_currentMultiLineCode); _currentMultiLineCode = ""; } } // Insert a new command prompt appendCommandPrompt(storeOnly); } void PythonQtScriptingConsole::executeCode(const QString& code) { // put visible cursor to the end of the line QTextCursor cursor = QTextEdit::textCursor(); cursor.movePosition(QTextCursor::End); setTextCursor(cursor); int cursorPosition = this->textCursor().position(); // evaluate the code _stdOut = ""; _stdErr = ""; PythonQtObjectPtr p; p.setNewRef(PyRun_String(code.toLatin1().data(), Py_single_input, PyModule_GetDict(_context), PyModule_GetDict(_context))); if (!p) { PythonQt::self()->handleError(); } flushStdOut(); bool messageInserted = (this->textCursor().position() != cursorPosition); // If a message was inserted, then put another empty line before the command prompt // to improve readability. if (messageInserted) { append(QString()); } } //----------------------------------------------------------------------------- void PythonQtScriptingConsole::appendCommandPrompt(bool storeOnly) { if (storeOnly) { _commandPrompt = "...> "; } else { _commandPrompt = "py> "; } append(_commandPrompt); QTextCursor cursor = textCursor(); cursor.movePosition(QTextCursor::End); setTextCursor(cursor); } //----------------------------------------------------------------------------- void PythonQtScriptingConsole::setCurrentFont(const QColor& color, bool bold) { QTextCharFormat charFormat(_defaultTextCharacterFormat); QFont font(charFormat.font()); font.setBold(bold); charFormat.setFont(font); QBrush brush(charFormat.foreground()); brush.setColor(color); charFormat.setForeground(brush); setCurrentCharFormat(charFormat); } //----------------------------------------------------------------------------- int PythonQtScriptingConsole::commandPromptPosition() { QTextCursor textCursor(this->textCursor()); textCursor.movePosition(QTextCursor::End); return textCursor.block().position() + _commandPrompt.length(); } //----------------------------------------------------------------------------- void PythonQtScriptingConsole::insertCompletion(const QString& completion) { QTextCursor tc = textCursor(); tc.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor); if (tc.selectedText()==".") { tc.insertText(QString(".") + completion); } else { tc = textCursor(); tc.movePosition(QTextCursor::StartOfWord, QTextCursor::MoveAnchor); tc.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); tc.insertText(completion); setTextCursor(tc); } } //----------------------------------------------------------------------------- void PythonQtScriptingConsole::handleTabCompletion() { QTextCursor textCursor = this->textCursor(); int pos = textCursor.position(); textCursor.setPosition(commandPromptPosition()); textCursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); int startPos = textCursor.selectionStart(); int offset = pos-startPos; QString text = textCursor.selectedText(); QString textToComplete; int cur = offset; while (cur--) { QChar c = text.at(cur); if (c.isLetterOrNumber() || c == '.' || c == '_') { textToComplete.prepend(c); } else { break; } } QString lookup; QString compareText = textToComplete; int dot = compareText.lastIndexOf('.'); if (dot!=-1) { lookup = compareText.mid(0, dot); compareText = compareText.mid(dot+1, offset); } if (!lookup.isEmpty() || !compareText.isEmpty()) { compareText = compareText.toLower(); QStringList found; QStringList l = PythonQt::self()->introspection(_context, lookup, PythonQt::Anything); foreach (QString n, l) { if (n.toLower().startsWith(compareText)) { found << n; } } if (!found.isEmpty()) { _completer->setCompletionPrefix(compareText); _completer->setCompletionMode(QCompleter::PopupCompletion); _completer->setModel(new QStringListModel(found, _completer)); _completer->setCaseSensitivity(Qt::CaseInsensitive); QTextCursor c = this->textCursor(); c.movePosition(QTextCursor::StartOfWord); QRect cr = cursorRect(c); cr.setWidth(_completer->popup()->sizeHintForColumn(0) + _completer->popup()->verticalScrollBar()->sizeHint().width()); cr.translate(0,8); _completer->complete(cr); } else { _completer->popup()->hide(); } } else { _completer->popup()->hide(); } } void PythonQtScriptingConsole::keyPressEvent(QKeyEvent* event) { if (_completer && _completer->popup()->isVisible()) { // The following keys are forwarded by the completer to the widget switch (event->key()) { case Qt::Key_Return: if (!_completer->popup()->currentIndex().isValid()) { insertCompletion(_completer->currentCompletion()); _completer->popup()->hide(); event->accept(); } event->ignore(); return; break; case Qt::Key_Enter: case Qt::Key_Escape: case Qt::Key_Tab: case Qt::Key_Backtab: event->ignore(); return; // let the completer do default behavior default: break; } } bool eventHandled = false; QTextCursor textCursor = this->textCursor(); int key = event->key(); switch (key) { case Qt::Key_Left: // Moving the cursor left is limited to the position // of the command prompt. if (textCursor.position() <= commandPromptPosition()) { QApplication::beep(); eventHandled = true; } break; case Qt::Key_Up: // Display the previous command in the history if (_historyPosition>0) { _historyPosition--; changeHistory(); } eventHandled = true; break; case Qt::Key_Down: // Display the next command in the history if (_historyPosition+1<_history.count()) { _historyPosition++; changeHistory(); } eventHandled = true; break; case Qt::Key_Return: executeLine(event->modifiers() & Qt::ShiftModifier); eventHandled = true; break; case Qt::Key_Backspace: if (textCursor.hasSelection()) { cut(); eventHandled = true; } else { // Intercept backspace key event to check if // deleting a character is allowed. It is not // allowed, if the user wants to delete the // command prompt. if (textCursor.position() <= commandPromptPosition()) { QApplication::beep(); eventHandled = true; } } break; case Qt::Key_Delete: cut(); eventHandled = true; break; default: if (key >= Qt::Key_Space && key <= Qt::Key_division) { if (textCursor.hasSelection() && !verifySelectionBeforeDeletion()) { // The selection must not be deleted. eventHandled = true; } else { // The key is an input character, check if the cursor is // behind the last command prompt, else inserting the // character is not allowed. int commandPromptPosition = this->commandPromptPosition(); if (textCursor.position() < commandPromptPosition) { textCursor.setPosition(commandPromptPosition); setTextCursor(textCursor); } } } } if (eventHandled) { _completer->popup()->hide(); event->accept(); } else { QTextEdit::keyPressEvent(event); QString text = event->text(); if (!text.isEmpty()) { handleTabCompletion(); } else { _completer->popup()->hide(); } eventHandled = true; } } //----------------------------------------------------------------------------- void PythonQtScriptingConsole::cut() { bool deletionAllowed = verifySelectionBeforeDeletion(); if (deletionAllowed) { QTextEdit::cut(); } } //----------------------------------------------------------------------------- bool PythonQtScriptingConsole::verifySelectionBeforeDeletion() { bool deletionAllowed = true; QTextCursor textCursor = this->textCursor(); int commandPromptPosition = this->commandPromptPosition(); int selectionStart = textCursor.selectionStart(); int selectionEnd = textCursor.selectionEnd(); if (textCursor.hasSelection()) { // Selected text may only be deleted after the last command prompt. // If the selection is partly after the command prompt set the selection // to the part and deletion is allowed. If the selection occurs before the // last command prompt, then deletion is not allowed. if (selectionStart < commandPromptPosition || selectionEnd < commandPromptPosition) { // Assure selectionEnd is bigger than selection start if (selectionStart > selectionEnd) { int tmp = selectionEnd; selectionEnd = selectionStart; selectionStart = tmp; } if (selectionEnd < commandPromptPosition) { // Selection is completely before command prompt, // so deletion is not allowed. QApplication::beep(); deletionAllowed = false; } else { // The selectionEnd is after the command prompt, so set // the selection start to the commandPromptPosition. selectionStart = commandPromptPosition; textCursor.setPosition(selectionStart); textCursor.setPosition(selectionStart, QTextCursor::KeepAnchor); setTextCursor(textCursor); } } } else { // if (hasSelectedText()) // When there is no selected text, deletion is not allowed before the // command prompt. if (textCursor.position() < commandPromptPosition) { QApplication::beep(); deletionAllowed = false; } } return deletionAllowed; } //----------------------------------------------------------------------------- void PythonQtScriptingConsole::changeHistory() { // Select the text after the last command prompt ... QTextCursor textCursor = this->textCursor(); textCursor.movePosition(QTextCursor::End); textCursor.setPosition(commandPromptPosition(), QTextCursor::KeepAnchor); // ... and replace it with the history text. textCursor.insertText(_history.value(_historyPosition)); textCursor.movePosition(QTextCursor::End); setTextCursor(textCursor); } //----------------------------------------------------------------------------- void PythonQtScriptingConsole::consoleMessage(const QString & message) { append(QString()); insertPlainText(message); // Reset all font modifications done by the html string setCurrentCharFormat(_defaultTextCharacterFormat); } fontmatrix-0.6.0+svn20110930/pythonqt/src/gui/PythonQtScriptingConsole.h0000644000175000017500000000747211145517421024751 0ustar malexmalex#ifndef _PythonQtScriptingConsole_H #define _PythonQtScriptingConsole_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtScriptingConsole.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-10 */ //---------------------------------------------------------------------------------- #include "PythonQt.h" #include #include class QCompleter; //------------------------------------------------------------------------------- //! A simple console for python scripting class PYTHONQT_EXPORT PythonQtScriptingConsole : public QTextEdit { Q_OBJECT public: PythonQtScriptingConsole(QWidget* parent, const PythonQtObjectPtr& context, Qt::WindowFlags i = 0); ~PythonQtScriptingConsole(); public slots: //! execute current line void executeLine(bool storeOnly); //! derived key press event void keyPressEvent (QKeyEvent * e); //! output from console void consoleMessage(const QString & message); //! get history QStringList history() { return _history; } //! set history void setHistory(const QStringList& h) { _history = h; _historyPosition = 0; } //! clear the console void clear(); //! overridden to control which characters a user may delete virtual void cut(); //! output redirection void stdOut(const QString& s); //! output redirection void stdErr(const QString& s); void insertCompletion(const QString&); //! Appends a newline and command prompt at the end of the document. void appendCommandPrompt(bool storeOnly = false); protected: //! handle the pressing of tab void handleTabCompletion(); //! Returns the position of the command prompt int commandPromptPosition(); //! Returns if deletion is allowed at the current cursor //! (with and without selected text) bool verifySelectionBeforeDeletion(); //! Sets the current font void setCurrentFont(const QColor& color = QColor(0,0,0), bool bold = false); //! change the history according to _historyPos void changeHistory(); //! flush output that was not yet printed void flushStdOut(); private: void executeCode(const QString& code); PythonQtObjectPtr _context; QStringList _history; int _historyPosition; QString _clickedAnchor; QString _storageKey; QString _commandPrompt; QString _currentMultiLineCode; QString _stdOut; QString _stdErr; QTextCharFormat _defaultTextCharacterFormat; QCompleter* _completer; }; #endiffontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtImporter.cpp0000644000175000017500000005440411176610725023036 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtImporter.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ // This module was inspired by the zipimport.c module of the original // Python distribution. Most of the functions are identical or slightly // modified to do all the loading of Python files via an external file interface. // In contrast to zipimport.c, this module also writes *.pyc files // automatically if it has write access/is not inside of a zip file. //---------------------------------------------------------------------------------- #include "PythonQtImporter.h" #include "PythonQtImportFileInterface.h" #include "PythonQt.h" #include #include #define IS_SOURCE 0x0 #define IS_BYTECODE 0x1 #define IS_PACKAGE 0x2 struct st_mlab_searchorder { char suffix[14]; int type; }; /* mlab_searchorder defines how we search for a module in the Zip archive: we first search for a package __init__, then for non-package .pyc, .pyo and .py entries. The .pyc and .pyo entries are swapped by initmlabimport() if we run in optimized mode. Also, '/' is replaced by SEP there. */ struct st_mlab_searchorder mlab_searchorder[] = { {"/__init__.pyc", IS_PACKAGE | IS_BYTECODE}, {"/__init__.pyo", IS_PACKAGE | IS_BYTECODE}, {"/__init__.py", IS_PACKAGE | IS_SOURCE}, {".pyc", IS_BYTECODE}, {".pyo", IS_BYTECODE}, {".py", IS_SOURCE}, {"", 0} }; extern PyTypeObject PythonQtImporter_Type; PyObject *PythonQtImportError; QString PythonQtImport::getSubName(const QString& str) { int idx = str.lastIndexOf('.'); if (idx!=-1) { return str.mid(idx+1); } else { return str; } } PythonQtImport::module_info PythonQtImport::getModuleInfo(PythonQtImporter* self, const QString& fullname) { QString subname; struct st_mlab_searchorder *zso; subname = getSubName(fullname); QString path = *self->_path + "/" + subname; QString test; for (zso = mlab_searchorder; *zso->suffix; zso++) { test = path + zso->suffix; if (PythonQt::importInterface()->exists(test)) { if (zso->type & IS_PACKAGE) return MI_PACKAGE; else return MI_MODULE; } } return MI_NOT_FOUND; } /* PythonQtImporter.__init__ Just store the path argument */ int PythonQtImporter_init(PythonQtImporter *self, PyObject *args, PyObject *kwds) { self->_path = NULL; const char* path; if (!PyArg_ParseTuple(args, "s", &path)) return -1; if (PythonQt::importInterface()->exists(path)) { //qDebug("path %s", path); QString p(path); const QStringList& ignorePaths = PythonQt::self()->getImporterIgnorePaths(); foreach(QString a, ignorePaths) { if (a==p) { PyErr_SetString(PythonQtImportError, "path ignored"); return -1; } } self->_path = new QString(p); //mlabDebugConst("MLABPython", "PythonQtImporter init: " << *self->_path); return 0; } else { PyErr_SetString(PythonQtImportError, "path does not exist error"); return -1; } } void PythonQtImporter_dealloc(PythonQtImporter *self) { // free the stored path if (self->_path) delete self->_path; // free ourself self->ob_type->tp_free((PyObject *)self); } /* Check whether we can satisfy the import of the module named by 'fullname'. Return self if we can, None if we can't. */ PyObject * PythonQtImporter_find_module(PyObject *obj, PyObject *args) { PythonQtImporter *self = (PythonQtImporter *)obj; PyObject *path = NULL; char *fullname; if (!PyArg_ParseTuple(args, "s|O:PythonQtImporter.find_module", &fullname, &path)) return NULL; // mlabDebugConst("MLABPython", "FindModule " << fullname << " in " << *self->_path); PythonQtImport::module_info info = PythonQtImport::getModuleInfo(self, fullname); if (info == PythonQtImport::MI_MODULE || info == PythonQtImport::MI_PACKAGE) { Py_INCREF(self); return (PyObject *)self; } else { Py_INCREF(Py_None); return Py_None; } } /* Load and return the module named by 'fullname'. */ PyObject * PythonQtImporter_load_module(PyObject *obj, PyObject *args) { PythonQtImporter *self = (PythonQtImporter *)obj; PyObject *code, *mod, *dict; char *fullname; QString modpath; int ispackage; if (!PyArg_ParseTuple(args, "s:PythonQtImporter.load_module", &fullname)) return NULL; code = PythonQtImport::getModuleCode(self, fullname, &ispackage, modpath); if (code == NULL) return NULL; mod = PyImport_AddModule(fullname); if (mod == NULL) { Py_DECREF(code); return NULL; } dict = PyModule_GetDict(mod); if (PyDict_SetItemString(dict, "__loader__", (PyObject *)self) != 0) goto error; if (ispackage) { PyObject *pkgpath, *fullpath; QString subname = PythonQtImport::getSubName(fullname); int err; fullpath = PyString_FromFormat("%s%c%s", self->_path->toLatin1().constData(), SEP, subname.toLatin1().constData()); if (fullpath == NULL) goto error; pkgpath = Py_BuildValue("[O]", fullpath); Py_DECREF(fullpath); if (pkgpath == NULL) goto error; err = PyDict_SetItemString(dict, "__path__", pkgpath); Py_DECREF(pkgpath); if (err != 0) goto error; } mod = PyImport_ExecCodeModuleEx(fullname, code, (char*)modpath.toLatin1().data()); Py_DECREF(code); if (Py_VerboseFlag) PySys_WriteStderr("import %s # loaded from %s\n", fullname, modpath.toLocal8Bit().data()); return mod; error: Py_DECREF(code); Py_DECREF(mod); return NULL; } PyObject * PythonQtImporter_get_data(PyObject *obj, PyObject *args) { // EXTRA, NOT YET IMPLEMENTED return NULL; } PyObject * PythonQtImporter_get_code(PyObject *obj, PyObject *args) { PythonQtImporter *self = (PythonQtImporter *)obj; char *fullname; if (!PyArg_ParseTuple(args, "s:PythonQtImporter.get_code", &fullname)) return NULL; QString notused; return PythonQtImport::getModuleCode(self, fullname, NULL, notused); } PyObject * PythonQtImporter_get_source(PyObject *obj, PyObject *args) { // EXTRA, NOT YET IMPLEMENTED /* PythonQtImporter *self = (PythonQtImporter *)obj; PyObject *toc_entry; char *fullname, *subname, path[MAXPATHLEN+1]; int len; enum module_info mi; if (!PyArg_ParseTuple(args, "s:PythonQtImporter.get_source", &fullname)) return NULL; mi = get_module_info(self, fullname); if (mi == MI_ERROR) return NULL; if (mi == MI_NOT_FOUND) { PyErr_Format(PythonQtImportError, "can't find module '%.200s'", fullname); return NULL; } subname = get_subname(fullname); len = make_filename(PyString_AsString(self->prefix), subname, path); if (len < 0) return NULL; if (mi == MI_PACKAGE) { path[len] = SEP; strcpy(path + len + 1, "__init__.py"); } else strcpy(path + len, ".py"); toc_entry = PyDict_GetItemString(self->files, path); if (toc_entry != NULL) return get_data(PyString_AsString(self->archive), toc_entry); Py_INCREF(Py_None); return Py_None; */ return NULL; } PyDoc_STRVAR(doc_find_module, "find_module(fullname, path=None) -> self or None.\n\ \n\ Search for a module specified by 'fullname'. 'fullname' must be the\n\ fully qualified (dotted) module name. It returns the PythonQtImporter\n\ instance itself if the module was found, or None if it wasn't.\n\ The optional 'path' argument is ignored -- it's there for compatibility\n\ with the importer protocol."); PyDoc_STRVAR(doc_load_module, "load_module(fullname) -> module.\n\ \n\ Load the module specified by 'fullname'. 'fullname' must be the\n\ fully qualified (dotted) module name. It returns the imported\n\ module, or raises PythonQtImportError if it wasn't found."); PyDoc_STRVAR(doc_get_data, "get_data(pathname) -> string with file data.\n\ \n\ Return the data associated with 'pathname'. Raise IOError if\n\ the file wasn't found."); PyDoc_STRVAR(doc_get_code, "get_code(fullname) -> code object.\n\ \n\ Return the code object for the specified module. Raise PythonQtImportError\n\ is the module couldn't be found."); PyDoc_STRVAR(doc_get_source, "get_source(fullname) -> source string.\n\ \n\ Return the source code for the specified module. Raise PythonQtImportError\n\ is the module couldn't be found, return None if the archive does\n\ contain the module, but has no source for it."); PyMethodDef PythonQtImporter_methods[] = { {"find_module", PythonQtImporter_find_module, METH_VARARGS, doc_find_module}, {"load_module", PythonQtImporter_load_module, METH_VARARGS, doc_load_module}, {"get_data", PythonQtImporter_get_data, METH_VARARGS, doc_get_data}, {"get_code", PythonQtImporter_get_code, METH_VARARGS, doc_get_code}, {"get_source", PythonQtImporter_get_source, METH_VARARGS, doc_get_source}, {NULL, NULL} /* sentinel */ }; PyDoc_STRVAR(PythonQtImporter_doc, "PythonQtImporter(path) -> PythonQtImporter object\n\ \n\ Create a new PythonQtImporter instance. 'path' must be a valid path on disk/or inside of a zip file known to MeVisLab\n\ . Every path is accepted."); #define DEFERRED_ADDRESS(ADDR) 0 PyTypeObject PythonQtImporter_Type = { PyObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type)) 0, "PythonQtImport.PythonQtImporter", sizeof(PythonQtImporter), 0, /* tp_itemsize */ (destructor)PythonQtImporter_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE , /* tp_flags */ PythonQtImporter_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ PythonQtImporter_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)PythonQtImporter_init, /* tp_init */ PyType_GenericAlloc, /* tp_alloc */ PyType_GenericNew, /* tp_new */ PyObject_Del, /* tp_free */ }; /* Given a buffer, return the long that is represented by the first 4 bytes, encoded as little endian. This partially reimplements marshal.c:r_long() */ long PythonQtImport::getLong(unsigned char *buf) { long x; x = buf[0]; x |= (long)buf[1] << 8; x |= (long)buf[2] << 16; x |= (long)buf[3] << 24; #if SIZEOF_LONG > 4 /* Sign extension for 64-bit machines */ x |= -(x & 0x80000000L); #endif return x; } FILE * open_exclusive(const QString& filename) { #if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC) /* Use O_EXCL to avoid a race condition when another process tries to write the same file. When that happens, our open() call fails, which is just fine (since it's only a cache). XXX If the file exists and is writable but the directory is not writable, the file will never be written. Oh well. */ QFile::remove(filename); int fd; int flags = O_EXCL|O_CREAT|O_WRONLY|O_TRUNC; #ifdef O_BINARY flags |= O_BINARY; /* necessary for Windows */ #endif #ifdef WIN32 fd = _wopen(filename.ucs2(), flags, 0666); #else fd = open(filename.local8Bit(), flags, 0666); #endif if (fd < 0) return NULL; return fdopen(fd, "wb"); #else /* Best we can do -- on Windows this can't happen anyway */ return fopen(filename.toLocal8Bit().constData(), "wb"); #endif } void PythonQtImport::writeCompiledModule(PyCodeObject *co, const QString& filename, long mtime) { FILE *fp; fp = open_exclusive(filename); if (fp == NULL) { if (Py_VerboseFlag) PySys_WriteStderr( "# can't create %s\n", filename.toLatin1().constData()); return; } #if PY_VERSION_HEX < 0x02040000 PyMarshal_WriteLongToFile(PyImport_GetMagicNumber(), fp); #else PyMarshal_WriteLongToFile(PyImport_GetMagicNumber(), fp, Py_MARSHAL_VERSION); #endif /* First write a 0 for mtime */ #if PY_VERSION_HEX < 0x02040000 PyMarshal_WriteLongToFile(0L, fp); #else PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION); #endif #if PY_VERSION_HEX < 0x02040000 PyMarshal_WriteObjectToFile((PyObject *)co, fp); #else PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION); #endif if (ferror(fp)) { if (Py_VerboseFlag) PySys_WriteStderr("# can't write %s\n", filename.toLatin1().constData()); /* Don't keep partial file */ fclose(fp); QFile::remove(filename); return; } /* Now write the true mtime */ fseek(fp, 4L, 0); #if PY_VERSION_HEX < 0x02040000 PyMarshal_WriteLongToFile(mtime, fp); #else PyMarshal_WriteLongToFile(mtime, fp, Py_MARSHAL_VERSION); #endif fflush(fp); fclose(fp); if (Py_VerboseFlag) PySys_WriteStderr("# wrote %s\n", filename.toLatin1().constData()); //#ifdef macintosh // PyMac_setfiletype(cpathname, 'Pyth', 'PYC '); //#endif } /* Given the contents of a .py[co] file in a buffer, unmarshal the data and return the code object. Return None if it the magic word doesn't match (we do this instead of raising an exception as we fall back to .py if available and we don't want to mask other errors). Returns a new reference. */ PyObject * PythonQtImport::unmarshalCode(const QString& path, const QByteArray& data, time_t mtime) { PyObject *code; // ugly cast, but Python API is not const safe char *buf = (char*) data.constData(); int size = data.size(); if (size <= 9) { PySys_WriteStderr("# %s has bad pyc data\n", path.toLatin1().constData()); Py_INCREF(Py_None); return Py_None; } if (getLong((unsigned char *)buf) != PyImport_GetMagicNumber()) { if (Py_VerboseFlag) PySys_WriteStderr("# %s has bad magic\n", path.toLatin1().constData()); Py_INCREF(Py_None); return Py_None; } if (mtime != 0 && !(getLong((unsigned char *)buf + 4) == mtime)) { if (Py_VerboseFlag) PySys_WriteStderr("# %s has bad mtime\n", path.toLatin1().constData()); Py_INCREF(Py_None); return Py_None; } code = PyMarshal_ReadObjectFromString(buf + 8, size - 8); if (code == NULL) return NULL; if (!PyCode_Check(code)) { Py_DECREF(code); PyErr_Format(PyExc_TypeError, "compiled module %.200s is not a code object", path.toLatin1().constData()); return NULL; } return code; } /* Given a string buffer containing Python source code, compile it return and return a code object as a new reference. */ PyObject * PythonQtImport::compileSource(const QString& path, const QByteArray& data) { PyObject *code; QByteArray data1 = data; // in qt4, data is null terminated // data1.resize(data.size()+1); // data1.data()[data.size()-1] = 0; code = Py_CompileString(data.data(), path.toLatin1().constData(), Py_file_input); return code; } /* Return the code object for the module named by 'fullname' from the Zip archive as a new reference. */ PyObject * PythonQtImport::getCodeFromData(const QString& path, int isbytecode,int ispackage, time_t mtime) { bool hasImporter = PythonQt::importInterface()!=NULL; PyObject *code; QByteArray qdata; if (!hasImporter) { QFile file(path); QIODevice::OpenMode flags = QIODevice::ReadOnly; if (!isbytecode) { flags |= QIODevice::Text; } if (!file.open(flags)) { return NULL; } qdata = file.readAll(); } else { if (!isbytecode) { // mlabDebugConst("MLABPython", "reading source " << path); bool ok; qdata = PythonQt::importInterface()->readSourceFile(path, ok); if (!ok) { // mlabErrorConst("PythonQtImporter","File could not be verified" << path); return NULL; } if (qdata == " ") { qdata.clear(); } } else { qdata = PythonQt::importInterface()->readFileAsBytes(path); } } if (isbytecode) { // mlabDebugConst("MLABPython", "reading bytecode " << path); code = unmarshalCode(path, qdata, mtime); } else { // mlabDebugConst("MLABPython", "compiling source " << path); code = compileSource(path, qdata); if (code) { // save a pyc file if possible QDateTime time; time = hasImporter?PythonQt::importInterface()->lastModifiedDate(path):QFileInfo(path).lastModified(); writeCompiledModule((PyCodeObject*)code, path+"c", time.toTime_t()); } } return code; } time_t PythonQtImport::getMTimeOfSource(const QString& path) { time_t mtime = 0; QString path2 = path; path2.truncate(path.length()-1); bool hasImporter = PythonQt::importInterface()!=NULL; if (hasImporter) { if (PythonQt::importInterface()->exists(path2)) { mtime = PythonQt::importInterface()->lastModifiedDate(path2).toTime_t(); } } else { if (QFile::exists(path2)) { mtime = QFileInfo(path2).lastModified().toTime_t(); } } return mtime; } /* Get the code object associated with the module specified by 'fullname'. */ PyObject * PythonQtImport::getModuleCode(PythonQtImporter *self, char *fullname, int *p_ispackage, QString& modpath) { QString subname; struct st_mlab_searchorder *zso; subname = getSubName(fullname); QString path = *self->_path + "/" + subname; QString test; for (zso = mlab_searchorder; *zso->suffix; zso++) { PyObject *code = NULL; test = path + zso->suffix; if (Py_VerboseFlag > 1) PySys_WriteStderr("# trying %s\n", test.toLatin1().constData()); if (PythonQt::importInterface()->exists(test)) { time_t mtime = 0; int ispackage = zso->type & IS_PACKAGE; int isbytecode = zso->type & IS_BYTECODE; if (isbytecode) mtime = getMTimeOfSource(test); if (p_ispackage != NULL) *p_ispackage = ispackage; code = getCodeFromData(test, isbytecode, ispackage, mtime); if (code == Py_None) { Py_DECREF(code); continue; } if (code != NULL) modpath = test; return code; } } PyErr_Format(PythonQtImportError, "can't find module '%.200s'", fullname); return NULL; } QString PythonQtImport::replaceExtension(const QString& str, const QString& ext) { QString r; int i = str.lastIndexOf('.'); if (i!=-1) { r = str.mid(0,i) + "." + ext; } else { r = str + "." + ext; } return r; } PyObject* PythonQtImport::getCodeFromPyc(const QString& file) { bool hasImporter = PythonQt::importInterface()!=NULL; PyObject* code; const static QString pycStr("pyc"); QString pyc = replaceExtension(file, pycStr); if ((hasImporter && PythonQt::importInterface()->exists(pyc)) || (!hasImporter && QFile::exists(pyc))) { time_t mtime = 0; mtime = getMTimeOfSource(pyc); code = getCodeFromData(pyc, true, false, mtime); if (code != Py_None && code != NULL) { return code; } if (code) { Py_DECREF(code); } } code = getCodeFromData(file,false,false,0); return code; } /* Module init */ PyDoc_STRVAR(mlabimport_doc, "Imports python files into MeVisLab, completely replaces internal python import"); void PythonQtImport::init() { PyObject *mod; if (PyType_Ready(&PythonQtImporter_Type) < 0) return; /* Correct directory separator */ mlab_searchorder[0].suffix[0] = SEP; mlab_searchorder[1].suffix[0] = SEP; mlab_searchorder[2].suffix[0] = SEP; if (Py_OptimizeFlag) { /* Reverse *.pyc and *.pyo */ struct st_mlab_searchorder tmp; tmp = mlab_searchorder[0]; mlab_searchorder[0] = mlab_searchorder[1]; mlab_searchorder[1] = tmp; tmp = mlab_searchorder[3]; mlab_searchorder[3] = mlab_searchorder[4]; mlab_searchorder[4] = tmp; } mod = Py_InitModule4("PythonQtImport", NULL, mlabimport_doc, NULL, PYTHON_API_VERSION); PythonQtImportError = PyErr_NewException(QString("PythonQtImport.PythonQtImportError").toLocal8Bit().data(), PyExc_ImportError, NULL); if (PythonQtImportError == NULL) return; Py_INCREF(PythonQtImportError); if (PyModule_AddObject(mod, "PythonQtImportError", PythonQtImportError) < 0) return; Py_INCREF(&PythonQtImporter_Type); if (PyModule_AddObject(mod, "PythonQtImporter", (PyObject *)&PythonQtImporter_Type) < 0) return; // set our importer into the path_hooks to handle all path on sys.path PyObject* classobj = PyDict_GetItemString(PyModule_GetDict(mod), "PythonQtImporter"); PyObject* path_hooks = PySys_GetObject(QString("path_hooks").toLocal8Bit().data()); PyList_Append(path_hooks, classobj); #ifndef WIN32 // reload the encodings module, because it might fail to custom import requirements (e.g. encryption). PyObject* modules = PyImport_GetModuleDict(); PyObject* encodingsModule = PyDict_GetItemString(modules, "encodings"); if (encodingsModule != NULL) { PyImport_ReloadModule(encodingsModule); } #endif } fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtMetaObjectWrapper.cpp0000644000175000017500000002103511145517421024600 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtMetaObjectWrapper.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQtMetaObjectWrapper.h" #include #include "PythonQt.h" #include "PythonQtSlot.h" #include "PythonQtClassInfo.h" #include "PythonQtConversion.h" static void PythonQtMetaObjectWrapper_dealloc(PythonQtMetaObjectWrapper* self) { self->ob_type->tp_free((PyObject*)self); } static PyObject* PythonQtMetaObjectWrapper_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PythonQtMetaObjectWrapper *self; self = (PythonQtMetaObjectWrapper *)type->tp_alloc(type, 0); if (self != NULL) { self->_info = NULL; } return (PyObject *)self; } static int PythonQtMetaObjectWrapper_init(PythonQtMetaObjectWrapper *self, PyObject *args, PyObject *kwds) { return 0; } PyObject *PythonQtMetaObjectWrapper_call(PyObject *func, PyObject *args, PyObject *kw) { PythonQtMetaObjectWrapper* wrapper = (PythonQtMetaObjectWrapper*)func; PyObject* result = NULL; QString error; PyObject* err = NULL; if (wrapper->_info->constructors()) { result = PythonQtSlotFunction_CallImpl(NULL, wrapper->_info->constructors(), args, kw); err = PyErr_Occurred(); } if (!result) { QObject* v = NULL; QListIterator it(PythonQt::self()->constructorHandlers()); while (!v && it.hasNext()) { v = it.next()->create(wrapper->_info->metaObject(), args, kw, error); } if (v) { result = PythonQt::priv()->wrapQObject(v); } } if (result) { // change ownershipflag to be owned by PythonQt if (result->ob_type == &PythonQtWrapper_Type) { ((PythonQtWrapper*)result)->_ownedByPythonQt = true; } } else { if (!wrapper->_info->constructors()) { if (!err) { if (error.isEmpty()) { error = QString("No constructors available for ") + wrapper->_info->className(); } PyErr_SetString(PyExc_ValueError, error.toLatin1().data()); } } } return result; } static PyObject *PythonQtMetaObjectWrapper_classname(PythonQtMetaObjectWrapper* type) { return PyString_FromString((QString("Meta_") + type->_info->className()).toLatin1().data()); } static PyObject *PythonQtMetaObjectWrapper_help(PythonQtMetaObjectWrapper* type) { return PythonQt::self()->helpCalled(type->_info); } static PyMethodDef PythonQtMetaObjectWrapper_methods[] = { {"className", (PyCFunction)PythonQtMetaObjectWrapper_classname, METH_NOARGS, "Return the classname of the object" }, {"help", (PyCFunction)PythonQtMetaObjectWrapper_help, METH_NOARGS, "Shows the help of available methods for this class" }, {NULL} /* Sentinel */ }; static PyObject *PythonQtMetaObjectWrapper_getattro(PyObject *obj,PyObject *name) { const char *attributeName; PythonQtMetaObjectWrapper *wt = (PythonQtMetaObjectWrapper *)obj; if ((attributeName = PyString_AsString(name)) == NULL) { return NULL; } PythonQtMemberInfo member = wt->_info->member(attributeName); if (member._type == PythonQtMemberInfo::EnumValue) { return PyInt_FromLong(member._enumValue); } if (member._type == PythonQtMemberInfo::Slot && member._slot->isClassDecorator()) { return PythonQtSlotFunction_New(member._slot, obj, NULL); } // look for the interal methods (className(), help()) PyObject* internalMethod = Py_FindMethod( PythonQtMetaObjectWrapper_methods, obj, (char*)attributeName); if (internalMethod) { return internalMethod; } PyErr_Clear(); if (qstrcmp(attributeName, "__dict__")==0) { QStringList l = wt->_info->memberList(true); PyObject* dict = PyDict_New(); foreach (QString name, l) { //PyObject* o = PyObject_GetAttrString(obj, name.toLatin1().data()); PyDict_SetItemString(dict, name.toLatin1().data(), Py_None); //Py_DECREF(o); } return dict; } QString error = QString(wt->_info->className()) + " has no attribute named '" + QString(attributeName) + "'"; PyErr_SetString(PyExc_AttributeError, error.toLatin1().data()); return NULL; } static PyObject * PythonQtMetaObjectWrapper_repr(PyObject * obj) { PythonQtMetaObjectWrapper* wt = (PythonQtMetaObjectWrapper*)obj; if (wt->_info->isCPPWrapper()) { return PyString_FromFormat("%s Class (C++ wrapped by %s)", wt->_info->className(), wt->_info->metaObject()->className()); } else { return PyString_FromFormat("%s Class", wt->_info->className()); } } static int PythonQtMetaObjectWrapper_compare(PyObject * obj1, PyObject * obj2) { if (obj1->ob_type == &PythonQtMetaObjectWrapper_Type && obj2->ob_type == &PythonQtMetaObjectWrapper_Type) { PythonQtMetaObjectWrapper* w1 = (PythonQtMetaObjectWrapper*)obj1; PythonQtMetaObjectWrapper* w2 = (PythonQtMetaObjectWrapper*)obj2; if (w1->_info == w2->_info) { return 0; } else { return -1; } } else { return -1; } } static long PythonQtMetaObjectWrapper_hash(PythonQtMetaObjectWrapper *obj) { return reinterpret_cast(obj->_info); } PyTypeObject PythonQtMetaObjectWrapper_Type = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "PythonQt.PythonQtMetaObjectWrapper", /*tp_name*/ sizeof(PythonQtMetaObjectWrapper), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)PythonQtMetaObjectWrapper_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ PythonQtMetaObjectWrapper_compare, /*tp_compare*/ PythonQtMetaObjectWrapper_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)PythonQtMetaObjectWrapper_hash, /*tp_hash */ PythonQtMetaObjectWrapper_call, /*tp_call*/ 0, /*tp_str*/ PythonQtMetaObjectWrapper_getattro, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ "PythonQtMetaObjectWrapper object", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)PythonQtMetaObjectWrapper_init, /* tp_init */ 0, /* tp_alloc */ PythonQtMetaObjectWrapper_new, /* tp_new */ }; //------------------------------------------------------- fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtDoc.h0000644000175000017500000004407411145517421021404 0ustar malexmalex#ifndef _PYTHONQTDOC_H #define _PYTHONQTDOC_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtDoc.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-10 */ //---------------------------------------------------------------------------------- /*! \if USE_GLOBAL_DOXYGEN_DOC \page PythonQtPage PythonQt Overview \else \mainpage PythonQt Overview \endif \section Introduction \b PythonQt is a dynamic Python (http://www.python.org) binding for Qt (http://www.trolltech.com). It offers an easy way to embed the Python scripting language into your Qt applications. It makes heavy use of the QMetaObject system and thus requires Qt4.x. In contrast to PyQt , PythonQt is \b not a complete Python wrapper around the complete Qt functionality. So if you are looking for a way to write complete applications in Python using the Qt GUI, you should use PyQt. If you are looking for a simple way to embed Python objects into your C++/Qt Application and to script parts of your application via Python, PythonQt is the way to go! PythonQt is a stable library that was developed to make the Image Processing and Visualization platform MeVisLab (http://www.mevislab.de) scriptable from Python. \section Licensing PythonQt is distributed under the LGPL license. \section Download PythonQt is hosted on SourceForge at http://sourceforge.net/projects/pythonqt , you can access it via SVN or download a tarball. \section Features - Easy wrapping of Python objects from C++ with smart, reference-counting PythonQtObjectPtr. - Convenient conversions to/from QVariant for PythonQtObjectPtr. - Access all \b slots, \b properties, children and registered enums of any QObject derived class from Python - Connecting Qt Signals to Python functions (both from within Python and from C++) - Wrapping of C++ objects (which are not derived from QObject) via PythonQtCppWrapperFactory - Extending C++ and QObject derived classes with additional slots, static methods and constructors (see Decorators) - StdOut/Err redirection to Qt signals instead of cout - Interface for creating your own \c import replacement, so that Python scripts can be e.g. signed/verified before they are executed (PythonQtImportFileInterface) - Mapping of plain-old-datatypes and ALL QVariant types to and from Python - Support for wrapping of user QVariant types which are registerd via QMetaType - Support for Qt namespace (with all enumerators) - All PythonQt wrapped objects support the dir() statement, so that you can see easily which attributes a QObject, CPP object or QVariant has - No preprocessing/wrapping tool needs to be started, PythonQt can script any QObject without prior knowledge about it (except for the MetaObject information from the \b moc) \section Non-Features Features that PythonQt does NOT support (and will not support): - you can not derive from QObjects inside of Python, this would require wrapper generation like PyQt does - you can only script QObject derived classes, for normal C++ classes you need to create a PythonQtCppWrapperFactory and adequate wrapper classes or add decorator slots - you can not access normal member functions of QObjects, only slots and properties, because the \b moc does not store normal member functions in the MetaObject system \section Interface The main interface to PythonQt is the PythonQt singleton. PythonQt needs to be initialized via PythonQt::init() once. Afterwards you communicate with the singleton via PythonQt::self(). PythonQt offers a default binding for the complete QWidget set, which needs to be enabled via PythonQtGui::init(). \section Datatype Datatype Mapping The following table shows the mapping between Python and Qt objects:
Qt/C++Python
boolbool
doublefloat
floatfloat
char/uchar,int/uint,short,ushort,QCharinteger
longinteger
ulong,longlong,ulonglonglong
QStringunicode string
QByteArraystr
char*str
QStringListtuple of unicode strings
QVariantListtuple of objects
QVariantMapdict of objects
QVariantdepends on type, see below
QSize, QRect and all other standard Qt QVariantsvariant wrapper that supports complete API of the respective Qt classes
OwnRegisteredMetaTypevariant wrapper, optionally with a wrapper provided by addVariantWrapper()
EnumTypeinteger (all enums that are known via the moc and the Qt namespace are supported)
QObject (and derived classes)QObject wrapper
C++ objectCPP wrapper, either wrapped via PythonQtCppWrapperFactory or just decorated with decorators
PyObjectPyObject
PyObject is passed as simple pointer, which allows to pass/return any Python Object directly to/from a Qt slot. QVariants are mapped recursively as given above, e.g. a dictionary can contain lists of dictionaries of doubles. For example a QVariant of type "String" is mapped to a python unicode string. All Qt QVariant types are implemented, PythonQt supports the complete Qt API for these object. \section QObject QObject Wrapping All classes derived from QObject are automatically wrapped with a python wrapper class when they become visible to the Python interpreter. This can happen via - the PythonQt::addObject() method - when a Qt \b slot returns a QObject derived object to python - when a Qt \b signal contains a QObject and is connected to a python function It is important that you call PythonQt::registerClass() for any QObject derived class that may become visible to Python, except when you add it via PythonQt::addObject(). This will register the complete parent hierachy of the registered class, so that when you register e.g. a QPushButton, QWidget will be registered as well (and all intermediate parents). From Python, you can talk to the returned QObjects in a natural way by calling their slots and receiving the return values. You can also read/write all properties of the objects as if they where normal python properties. In addition to this, the wrapped objects support - className() - returns a string that reprents the classname of the QObject - help() - shows all properties, slots, enums, decorator slots and constructors of the object, in a printable form - connect(signal, function) - connect the signal of the given object to a python function - connect(signal, qobject, slot) - connect the signal of the given object to a slot of another QObject - disconnect(signal, function) - disconnect the signal of the given object from a python function - disconnect(signal, qobject, slot) - disconnect the signal of the given object from a slot of another QObject - children() - returns the children of the object - setParent(QObject) - set the parent - QObject* parent() - get the parent The below example shows how to connect signals in Python: \code # define a signal handler function def someFunction(flag): print flag # button1 is a QPushButton that has been added to Python via addObject() # connect the clicked signal to a python function: button1.connect("clicked(bool)", someFunction) \endcode \section CPP CPP Wrapping You can create dedicated wrapper QObject for any C++ class. This is done by deriving from PythonQtCppWrapperFactory and adding your factory via addWrapperFactory(). Whenever PythonQt encounters a CPP pointer (e.g. on a slot or signal) and it does not known it as a QObject derived class, it will create a generic CPP wrapper. So even unknown C++ objects can be passed through Python. If the wrapper factory supports the CPP class, a QObject wrapper will be created for each instance that enters Python. An alternative to a complete wrapper via the wrapper factory are decorators, see \ref Decorators \section MetaObject Meta Object/Class access For each known CPP class, QObject derived class and QVariant type, PythonQt provides a Meta class. These meta classes are visible inside of the "PythonQt" python module. A Meta class supports: - access to all declared enum values - constructors - static decorator slots - help() and className() From within Python, you can import the module "PythonQt" to access these meta objects and the Qt namespace. \code from PythonQt import * # namespace access: print Qt.AlignLeft # constructors a = QSize(12,13) b = QFont() # static method QDate.currentDate() # enum value QFont.UltraCondensed \endcode \section Decorators Decorator slots PythonQt introduces a new generic approach to extend any wrapped QObject or CPP object with - constructors - destructors (for CPP objects) - additional slots - static slots (callable on both the Meta object and the instances) The idea behind decorators is that we wanted to make it as easy as possible to extend wrapped objects. Since we already have an implementation for invoking any Qt Slot from Python, it looked promising to use this approach for the extension of wrapped objects as well. This avoids that the PythonQt user needs to care about how Python arguments are mapped from/to Qt when he wants to create static methods, constructors and additional member functions. The basic idea about decorators is to create a QObject derived class that implements slots which take one of the above roles (e.g. constructor, destructor etc.) via a naming convention. These slots are then assigned to other classes via the naming convention. - QVariant new_SomeClassName(...) - defines a constructor for "SomeClassName" that returns a QVariant - SomeClassName* new_SomeClassName(...) - defines a constructor for "SomeClassName" that returns a new object of type SomeClassName (where SomeClassName can be any CPP class, not just QObject classes) - void delete_SomeClassName(SomeClassName* o) - defines a destructor, which should delete the passed in object o - anything static_SomeClassName_someMethodName(...) - defines a static method that is callable on instances and the meta class - anything someMethodName(SomeClassName* o, ...) - defines a slot that will be available on SomeClassName instances (and derived instances). When such a slot is called the first argument is the pointer to the instance and the rest of the arguments can be used to make a call on the instance. The below example shows all kinds of decorators in action: \code // an example CPP object class YourCPPObject { public: YourCPPObject(int arg1, float arg2) { a = arg1; b = arg2; } float doSomething(int arg1) { return arg1*a*b; }; private: int a; float b; }; // an example decorator class ExampleDecorator : public QObject { Q_OBJECT public slots: // add a constructor to QSize variant that takes a QPoint QVariant new_QSize(const QPoint& p) { return QSize(p.x(), p.y()); } // add a constructor for QPushButton that takes a text and a parent widget QPushButton* new_QPushButton(const QString& text, QWidget* parent=NULL) { return new QPushButton(text, parent); } // add a constructor for a CPP object YourCPPObject* new_YourCPPObject(int arg1, float arg2) { return new YourCPPObject(arg1, arg2); } // add a destructor for a CPP object void delete_YourCPPObject(YourCPPObject* obj) { delete obj; } // add a static method to QWidget QWidget* static_QWidget_mouseGrabber() { return QWidget::mouseGrabber(); } // add an additional slot to QWidget (make move() callable, which is not declared as a slot in QWidget) void move(QWidget* w, const QPoint& p) { w->move(p); } // add an additional slot to QWidget, overloading the above move method void move(QWidget* w, int x, int y) { w->move(x,y); } // add a method to your own CPP object int doSomething(YourCPPObject* obj, int arg1) { return obj->doSomething(arg1); } }; ... PythonQt::self()->addDecorators(new ExampleDecorator()); PythonQt::self()->registerClass(&QPushButton::staticMetaObject); PythonQt::self()->registerCPPClassNames(QStringList() << "YourCPPObject"); \endcode After you have registered an instance of the above ExampleDecorator, you can do the following from Python (all these calls are mapped to the above decorator slots): \code from PythonQt import * # call our new constructor of QSize size = QSize(QPoint(1,2)); # call our new QPushButton constructor button = QPushButton("sometext"); # call the move slot (overload1) button.move(QPoint(0,0)) # call the move slot (overload2) button.move(0,0) # call the static method grabber = QWidget.mouseWrapper(); # create a CPP object via constructor yourCpp = YourCPPObject(1,11.5) # call the wrapped method on CPP object print yourCpp.doSomething(1); # destructor will be called: yourCpp = None \endcode \section Building PythonQt requires at least Qt 4.2.2 (or higher) and Python 2.3, 2.4 or 2.5 on Windows, Linux and MacOS X. To compile PythonQt, you will need a python developer installation which includes Python's header files and the python2x.[lib | dll | so | dynlib]. The build scripts a currently set to use Python 2.5. You may need to tweak the \b build/python.prf file to set the correct Python includes and libs on your system. \subsection Windows On Windows, the (non-source) Python Windows installer can be used. Make sure that you use the same compiler, the current Python distribution is built with Visual Studio 2003. If you want to use another compiler, you will need to build Python yourself, using your compiler. To build PythonQt, you need to set the environment variable \b PYTHON_PATH to point to the root dir of the python installation and \b PYTHON_LIB to point to the directory where the python lib file is located. When using the prebuild Python installer, this will be: \code > set PYTHON_PATH = c:\Python25 > set PYTHON_LIB = c:\Python25\libs \endcode When using the python sources, this will be something like: \code > set PYTHON_PATH = c:\yourDir\Python-2.5.1\ > set PYTHON_LIB = c:\yourDir\Python-2.5.1\PCbuild8\Win32 \endcode To build all, do the following (after setting the above variables): \code > cd PythonQtRoot > vcvars32 > qmake > nmake \endcode This should build everything. If Python can not be linked or include files can not be found, you probably need to tweak \b build/python.prf The tests and examples are located in PythonQt/lib. \subsection Linux On Linux, you need to install a Python-dev package. If Python can not be linked or include files can not be found, you probably need to tweak \b build/python.prf To build PythonQt, just do a: \code > cd PythonQtRoot > qmake > make all \endcode The tests and examples are located in PythonQt/lib. You should add PythonQt/lib to your LD_LIBRARY_PATH so that the runtime linker can find the *.so files. \subsection MacOsX On Mac, Python is installed as a Framework, so you should not need to install it. To build PythonQt, just do a: \code > cd PythonQtRoot > qmake > make all \endcode \section Tests There is a unit test that tests most features of PythonQt, see the \b tests subdirectory for details. \section Examples Examples are available in the \b examples directory. The PyScriptingConsole implements a simple interactive scripting console that shows how to script a simple application. The following shows how to integrate PythonQt into you Qt application: \code #include "PythonQt.h" #include ... int main( int argc, char **argv ) { QApplication qapp(argc, argv); // init PythonQt and Python itself PythonQt::init(PythonQt::IgnoreSiteModule | PythonQt::RedirectStdOut); // get a smart pointer to the __main__ module of the Python interpreter PythonQtObjectPtr mainContext = PythonQt::self()->getMainModule(); // add a QObject as variable of name "example" to the namespace of the __main__ module PyExampleObject example; PythonQt::self()->addObject(mainContext, "example", &example); // register all other QObjects that you want to script and that are returned by your API PythonQt::self()->registerClass(&QMainWindow::staticMetaObject); PythonQt::self()->registerClass(&QPushButton::staticMetaObject); ... // do something PythonQt::self()->runScript(mainContext, "print example\n"); PythonQt::self()->runScript(mainContext, "def multiply(a,b):\n return a*b;\n"); QVariantList args; args << 42 << 47; QVariant result = PythonQt::self()->call(mainContext,"multiply", args); ... \endcode \section TODOs - add more information on how to distribute an application that uses PythonQt, including the Python distribution */ fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtClassInfo.cpp0000644000175000017500000003022411145517421023103 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQt.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQtClassInfo.h" #include "PythonQtMethodInfo.h" #include "PythonQt.h" #include QHash PythonQtMethodInfo::_parameterTypeDict; PythonQtClassInfo::PythonQtClassInfo(const QMetaObject* meta, const QByteArray& wrappedClassName) { _meta = meta; _wrappedClassName = wrappedClassName; _constructors = NULL; } PythonQtClassInfo::~PythonQtClassInfo() { QHashIterator i(_cachedMembers); while (i.hasNext()) { PythonQtMemberInfo member = i.next().value(); if (member._type== PythonQtMemberInfo::Slot) { PythonQtSlotInfo* info = member._slot; while (info) { PythonQtSlotInfo* next = info->nextInfo(); delete info; info = next; } } } } int PythonQtClassInfo::findCharOffset(const char* sigStart, char someChar) { const char* sigEnd = sigStart; char c; do { c = *sigEnd++; } while (c!=someChar && c!=0); return sigEnd-sigStart-1; } PythonQtMemberInfo PythonQtClassInfo::member(const char* memberName) { PythonQtMemberInfo info = _cachedMembers.value(memberName); if (info._type != PythonQtMemberInfo::Invalid) { return info; } else { bool found = false; const char* attributeName = memberName; bool nameMapped = false; // look for properties int i = _meta->indexOfProperty(attributeName); if (i==-1) { // try to map name to objectName if (qstrcmp(attributeName, "name")==0) { attributeName = "objectName"; nameMapped = true; i = _meta->indexOfProperty(attributeName); } } if (i!=-1) { PythonQtMemberInfo newInfo(_meta->property(i)); _cachedMembers.insert(attributeName, newInfo); if (nameMapped) { _cachedMembers.insert(memberName, newInfo); } #ifdef PYTHONQT_DEBUG std::cout << "caching property " << memberName << " on " << _meta->className() << std::endl; #endif found = true; } else { int memberNameLen = strlen(memberName); // if it is not a property, look for slots PythonQtSlotInfo* tail = NULL; int numMethods = _meta->methodCount(); for (int i = 0; i < numMethods; i++) { QMetaMethod m = _meta->method(i); if ((m.methodType() == QMetaMethod::Method || m.methodType() == QMetaMethod::Slot) && m.access() == QMetaMethod::Public) { const char* sigStart = m.signature(); // find the first '(' int offset = findCharOffset(sigStart, '('); // check if same length and same name if (memberNameLen == offset && qstrncmp(memberName, sigStart, offset)==0) { found = true; PythonQtSlotInfo* info = new PythonQtSlotInfo(m, i); if (tail) { tail->setNextInfo(info); } else { PythonQtMemberInfo newInfo(info); _cachedMembers.insert(memberName, newInfo); } tail = info; } } } // look for decorators if (!_wrappedClassName.isEmpty()) { tail = findDecoratorSlots(_wrappedClassName.constData(), memberName, memberNameLen, tail, found); } const QMetaObject* meta = _meta; while (meta) { tail = findDecoratorSlots(meta->className(), memberName, memberNameLen, tail, found); meta = meta->superClass(); } } if (!found) { // look for enum values int enumCount = _meta->enumeratorCount(); for (i=0;ienumerator(i); for (int j=0; j < e.keyCount(); j++) { if (qstrcmp(e.key(j), attributeName)==0) { PythonQtMemberInfo newInfo(e.value(j)); _cachedMembers.insert(memberName, newInfo); #ifdef PYTHONQT_DEBUG std::cout << "caching enum " << memberName << " on " << _meta->className() << std::endl; #endif found = true; } } } } return _cachedMembers.value(memberName); } } PythonQtSlotInfo* PythonQtClassInfo::findDecoratorSlots(const char* classname, const char* memberName, int memberNameLen, PythonQtSlotInfo* tail, bool& found) { QListIterator it(PythonQt::priv()->getDecoratorSlots(classname)); while (it.hasNext()) { PythonQtSlotInfo* infoOrig = it.next(); const char* sigStart = infoOrig->metaMethod()->signature(); if (qstrncmp("static_", sigStart, 7)==0) { sigStart += 7; sigStart += findCharOffset(sigStart, '_')+1; } int offset = findCharOffset(sigStart, '('); if (memberNameLen == offset && qstrncmp(memberName, sigStart, offset)==0) { //make a copy, otherwise we will have trouble on overloads! PythonQtSlotInfo* info = new PythonQtSlotInfo(*infoOrig); found = true; if (tail) { tail->setNextInfo(info); } else { PythonQtMemberInfo newInfo(info); _cachedMembers.insert(memberName, newInfo); } tail = info; } } return tail; } QStringList PythonQtClassInfo::memberList(bool metaOnly) { QStringList l; QString h; if (_wrappedClassName.isEmpty()) { int i; int numProperties = _meta->propertyCount(); for (i = 0; i < numProperties; i++) { QMetaProperty p = _meta->property(i); l << QString(p.name()); } } if (!metaOnly) { int numMethods = _meta->methodCount(); bool skipQObj = !_wrappedClassName.isEmpty(); for (int i = skipQObj?QObject::staticMetaObject.methodCount():0; i < numMethods; i++) { QMetaMethod m = _meta->method(i); if ((m.methodType() == QMetaMethod::Method || m.methodType() == QMetaMethod::Slot) && m.access() == QMetaMethod::Public) { QByteArray signa(m.signature()); if (signa.startsWith("new_")) continue; if (signa.startsWith("delete_")) continue; if (signa.startsWith("static_")) continue; PythonQtSlotInfo slot(m, i); l << slot.slotName(); } } } // look for decorators QList names; if (!_wrappedClassName.isEmpty()) { names << _wrappedClassName.constData(); } const QMetaObject* meta = _meta; while (meta) { if (meta==&QObject::staticMetaObject && !_wrappedClassName.isEmpty()) break; names << meta->className(); meta = meta->superClass(); } QListIterator nameIt(names); while (nameIt.hasNext()) { QListIterator it(PythonQt::priv()->getDecoratorSlots(nameIt.next())); while (it.hasNext()) { PythonQtSlotInfo* slot = it.next(); if (metaOnly) { if (slot->isClassDecorator()) { QByteArray first = slot->slotName(); if (first.startsWith("static_")) { int idx = first.indexOf('_'); idx = first.indexOf('_', idx+1); first = first.mid(idx+1); } l << first; } } else { l << slot->slotName(); } } } if (_meta->enumeratorCount()) { for (int i = 0; i<_meta->enumeratorCount(); i++) { QMetaEnum e = _meta->enumerator(i); for (int j=0; j < e.keyCount(); j++) { l << QString(e.key(j)); } } } return l; } const char* PythonQtClassInfo::className() { if (!_wrappedClassName.isEmpty()) { return _wrappedClassName.constData(); } else { return _meta->className(); } } bool PythonQtClassInfo::inherits(const char* name) { const QMetaObject* m = _meta; while (m) { if (strcmp(name, m->className())==0) { return true; } m = m->superClass(); } return false; } const QByteArray& PythonQtClassInfo::wrappedCPPClassName() { return _wrappedClassName; } QString PythonQtClassInfo::help() { QString h; bool isVariant = QMetaType::type(className())!=QMetaType::Void; h += QString("--- ") + QString(className()) + QString(" ---\n"); if (_wrappedClassName.isEmpty()) { h += "Properties:\n"; int i; int numProperties = _meta->propertyCount(); for (i = 0; i < numProperties; i++) { QMetaProperty p = _meta->property(i); h += QString(p.name()) + " (" + QString(p.typeName()) + " )\n"; } } if (constructors()) { h += "Constructors:\n"; PythonQtSlotInfo* constr = constructors(); while (constr) { h += constr->fullSignature(false) + "\n"; constr = constr->nextInfo(); } } h += "Slots:\n"; h += "QString help()\n"; h += "QString className()\n"; int numMethods = _meta->methodCount(); for (int i = isVariant?QObject::staticMetaObject.methodCount():0; i < numMethods; i++) { QMetaMethod m = _meta->method(i); if ((m.methodType() == QMetaMethod::Method || m.methodType() == QMetaMethod::Slot) && m.access() == QMetaMethod::Public) { QByteArray signa(m.signature()); if (signa.startsWith("new_")) continue; if (signa.startsWith("delete_")) continue; if (signa.startsWith("static_")) continue; PythonQtSlotInfo slot(m, i); h += slot.fullSignature(isVariant)+ "\n"; } } // look for decorators QList names; if (!_wrappedClassName.isEmpty()) { names << _wrappedClassName.constData(); } const QMetaObject* meta = _meta; while (meta) { names << meta->className(); meta = meta->superClass(); if (isVariant && meta==&QObject::staticMetaObject) break; } QListIterator nameIt(names); while (nameIt.hasNext()) { QListIterator it(PythonQt::priv()->getDecoratorSlots(nameIt.next())); while (it.hasNext()) { PythonQtSlotInfo* slot = it.next(); h += slot->fullSignature(slot->isInstanceDecorator()) + "\n"; } } if (_meta->enumeratorCount()) { h += "Enums:\n"; for (int i = 0; i<_meta->enumeratorCount(); i++) { QMetaEnum e = _meta->enumerator(i); h += QString(e.name()) + " {"; for (int j=0; j < e.keyCount(); j++) { if (j) { h+= ", "; } h += e.key(j); } h += " }\n"; } } if (_wrappedClassName.isEmpty()) { int numMethods = _meta->methodCount(); if (numMethods>0) { h += "Signals:\n"; for (int i = isVariant?QObject::staticMetaObject.methodCount():0; i < numMethods; i++) { QMetaMethod m = _meta->method(i); if (m.methodType() == QMetaMethod::Signal) { h += QString(m.signature()) + "\n"; } } } } return h; } PythonQtSlotInfo* PythonQtClassInfo::constructors() { if (!_constructors) { _constructors = PythonQt::priv()->getConstructorSlot(!_wrappedClassName.isEmpty()?_wrappedClassName:QByteArray(_meta->className())); } return _constructors; } void PythonQtClassInfo::setMetaObject(const QMetaObject* meta) { _meta = meta; _cachedMembers.clear(); } fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtCppWrapperFactory.h0000644000175000017500000000433411145517421024305 0ustar malexmalex#ifndef _PYTHONQTCPPWRAPPERFACTORY_H #define _PYTHONQTCPPWRAPPERFACTORY_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtCppWrapperFactory.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-06 */ //---------------------------------------------------------------------------------- //! Factory interface for C++ classes that can be wrapped by QObject objects /*! To create your own factory, derive PythonQtCppWrapperFactory and implement the create() method. A factory can be added to PythonQt by PythonQt::addCppWrapperFactory(). */ class PYTHONQT_EXPORT PythonQtCppWrapperFactory { public: PythonQtCppWrapperFactory() {}; virtual ~PythonQtCppWrapperFactory() {}; //! create a wrapper for the given object virtual QObject* create(const QByteArray& name, void *ptr) = 0; }; #endiffontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtVariants.cpp0000644000175000017500000000325511145517421023015 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtVariants.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-08 */ //---------------------------------------------------------------------------------- #include "PythonQtVariants.h" fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtWrapper.h0000644000175000017500000000566411145517421022321 0ustar malexmalex#ifndef _PYTHONQTWRAPPER_H #define _PYTHONQTWRAPPER_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtWrapper.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include #include "PythonQtSystem.h" #include #include "structmember.h" #include "methodobject.h" #include "compile.h" #include "eval.h" class PythonQtClassInfo; class QObject; extern PYTHONQT_EXPORT PyTypeObject PythonQtWrapper_Type; //--------------------------------------------------------------- //! a Python wrapper object for Qt objects and C++ objects (that are themselves wrapped by wrapper QObjects) typedef struct { PyObject_HEAD //! set the QObject pointer void setQObject(QObject* object) { _obj = object; _objPointerCopy = object; } //! pointer to the wrapped Qt object or if _wrappedPtr is set, the Qt object that wraps the C++ Ptr QPointer _obj; //! a copy of the _obj pointer, which is required because the wrapper needs to //! deregister itself via the _obj pointer, even when the QPointer object was destroyed void* _objPointerCopy; //! optional C++ object Ptr that is wrapped by the above _obj void* _wrappedPtr; //! the class information, this is set even if the _obj or _wrappedPtr is NULL to support typed NULL pointers PythonQtClassInfo* _info; //! flag that stores if the object is owned by pythonQt bool _ownedByPythonQt; } PythonQtWrapper; #endiffontmatrix-0.6.0+svn20110930/pythonqt/src/CMakeLists.txt0000644000175000017500000000252711145517421021554 0ustar malexmalex# A contributed CMakeLists file (pm) # src/CMakeLists.txt SET(PythonQtHDRS PythonQt.h PythonQtStdDecorators.h PythonQtClassInfo.h PythonQtImporter.h PythonQtObjectPtr.h PythonQtSlot.h PythonQtStdOut.h PythonQtMisc.h PythonQtMethodInfo.h PythonQtImportFileInterface.h PythonQtConversion.h PythonQtSignalReceiver.h PythonQtWrapper.h PythonQtMetaObjectWrapper.h PythonQtCppWrapperFactory.h PythonQtVariants.h PythonQtVariantWrapper.h wrapper/PythonQtWrappedVariants.h gui/PythonQtScriptingConsole.h PythonQtSystem.h ) SET(PythonQtMOC_HDRS PythonQt.h PythonQtStdDecorators.h PythonQtSignalReceiver.h wrapper/PythonQtWrappedVariants.h gui/PythonQtScriptingConsole.h ) QT4_WRAP_CPP(PythonQtMoced ${PythonQtMOC_HDRS}) SET(PythonQtSRCS PythonQtStdDecorators.cpp PythonQt.cpp PythonQtClassInfo.cpp PythonQtImporter.cpp PythonQtObjectPtr.cpp PythonQtStdOut.cpp PythonQtSlot.cpp PythonQtMisc.cpp PythonQtMethodInfo.cpp PythonQtConversion.cpp PythonQtSignalReceiver.cpp PythonQtVariants.cpp PythonQtVariantWrapper.cpp PythonQtWrapper.cpp PythonQtMetaObjectWrapper.cpp gui/PythonQtScriptingConsole.cpp ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${QT_INCLUDE_DIR} ${QT_QT_INCLUDE_DIR} ${PYTHON_INCLUDE_PATH} ) SET(HACK_LINK util) ADD_LIBRARY(PythonQt STATIC ${PythonQtSRCS} ${PythonQtMoced}) TARGET_LINK_LIBRARIES(PythonQt ${HACK_LINK}) fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtSlot.cpp0000644000175000017500000003503211152755270022151 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtSlot.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQt.h" #include "PythonQtSlot.h" #include "PythonQtWrapper.h" #include "PythonQtClassInfo.h" #include "PythonQtMisc.h" #include "PythonQtConversion.h" #include #define PYTHONQT_MAX_ARGS 32 PyObject* PythonQtCallSlot(QObject* objectToCall, PyObject* args, bool strict, PythonQtSlotInfo* info, bool isVariantCall, void* firstArgument) { if (isVariantCall && info->isInstanceDecorator()) return NULL; static unsigned int recursiveEntry = 0; // store the current storage position, so that we can get back to this state after a slot is called // (do this locally, so that we have all positions on the stack PythonQtValueStoragePosition globalValueStoragePos; PythonQtValueStoragePosition globalPtrStoragePos; PythonQtValueStoragePosition globalVariantStoragePos; PythonQtConv::global_valueStorage.getPos(globalValueStoragePos); PythonQtConv::global_ptrStorage.getPos(globalPtrStoragePos); PythonQtConv::global_variantStorage.getPos(globalVariantStoragePos); recursiveEntry++; // the arguments that are passed to qt_metacall void* argList[PYTHONQT_MAX_ARGS]; PyObject* result = NULL; int argc = info->parameterCount(); const QList& params = info->parameters(); bool returnValueIsEnum = false; const PythonQtSlotInfo::ParameterInfo& returnValueParam = params.at(0); // set return argument to NULL argList[0] = NULL; if (returnValueParam.typeId != QMetaType::Void) { // extra handling of enum return value if (!returnValueParam.isPointer && returnValueParam.typeId == PythonQtMethodInfo::Unknown) { returnValueIsEnum = PythonQt::priv()->isEnumType(objectToCall->metaObject(), returnValueParam.name); if (returnValueIsEnum) { // create enum return value PythonQtValueStorage_ADD_VALUE(PythonQtConv::global_valueStorage, long, 0, argList[0]); } } if (argList[0]==NULL) { // create empty default value for the return value argList[0] = PythonQtConv::CreateQtReturnValue(returnValueParam); } } const QMetaObject* meta = objectToCall?objectToCall->metaObject():NULL; bool ok = true; bool skipFirst = false; if (info->isInstanceDecorator() || isVariantCall) { skipFirst = true; if (!firstArgument) { argList[1] = &objectToCall; } else { // for the variant call we take the ptr to the variant data, for decorators on CPP objects, we take the cpp ptr argList[1] = &firstArgument; } if (ok) { for (int i = 2; idecorator()?info->decorator():objectToCall)->qt_metacall(QMetaObject::InvokeMetaMethod, info->slotIndex(), argList); if (argList[0] || returnValueParam.typeId == QMetaType::Void) { if (!returnValueIsEnum) { result = PythonQtConv::ConvertQtValueToPython(returnValueParam, argList[0]); } else { result = PyInt_FromLong(*((unsigned int*)argList[0])); } } else { QString e = QString("Called ") + info->fullSignature(skipFirst) + ", return type is ignored because it is unknown to PythonQt."; PyErr_SetString(PyExc_ValueError, e.toLatin1().data()); result = NULL; } } recursiveEntry--; // reset the parameter storage position to the stored pos to "pop" the parameter stack PythonQtConv::global_valueStorage.setPos(globalValueStoragePos); PythonQtConv::global_ptrStorage.setPos(globalPtrStoragePos); PythonQtConv::global_variantStorage.setPos(globalVariantStoragePos); // NOTE: it is important to only return here, otherwise the stack will not be popped!!! return result; } //----------------------------------------------------------------------------------- static PythonQtSlotFunctionObject *pythonqtslot_free_list = NULL; PyObject *PythonQtSlotFunction_Call(PyObject *func, PyObject *args, PyObject *kw) { PythonQtSlotFunctionObject* f = (PythonQtSlotFunctionObject*)func; PythonQtSlotInfo* info = f->m_ml; if (f->m_self->ob_type == &PythonQtWrapper_Type) { PythonQtWrapper* self = (PythonQtWrapper*) f->m_self; return PythonQtSlotFunction_CallImpl(self->_obj, info, args, kw, false, self->_wrappedPtr); } else if (f->m_self->ob_type == &PythonQtVariantWrapper_Type) { PythonQtVariantWrapper* self = (PythonQtVariantWrapper*) f->m_self; if (!info->isClassDecorator()) { return PythonQtSlotFunction_CallImpl(self->_wrapper, info, args, kw, true, (void*)self->_variant->constData()); } else { return PythonQtSlotFunction_CallImpl(NULL, info, args, kw); } } else if (f->m_self->ob_type == &PythonQtMetaObjectWrapper_Type) { return PythonQtSlotFunction_CallImpl(NULL, info, args, kw); } else { return NULL; } } PyObject *PythonQtSlotFunction_CallImpl(QObject* objectToCall, PythonQtSlotInfo* info, PyObject *args, PyObject *kw, bool isVariantCall, void* firstArg) { int argc = PyTuple_Size(args); #ifdef PYTHONQT_DEBUG std::cout << "called " << info->metaMethod()->typeName() << " " << info->metaMethod()->signature() << std::endl; #endif PyObject* r = NULL; if (info->nextInfo()) { // overloaded slot call, try on all slots with strict conversion first PythonQtSlotInfo* i = info; while (i && r==NULL) { bool skipFirst = (i->isInstanceDecorator() || isVariantCall); if (i->parameterCount()-1-(skipFirst?1:0) == argc) { PyErr_Clear(); r = PythonQtCallSlot(objectToCall, args, true, i, isVariantCall, firstArg); if (PyErr_Occurred()) break; } i = i->nextInfo(); } if (!r) { // try on all slots with non-strict conversion i = info; while (i && r==NULL) { bool skipFirst = (i->isInstanceDecorator() || isVariantCall); if (i->parameterCount()-1-(skipFirst?1:0) == argc) { PyErr_Clear(); r = PythonQtCallSlot(objectToCall, args, false, i, isVariantCall, firstArg); if (PyErr_Occurred()) break; } i = i->nextInfo(); } } if (r==NULL && !PyErr_Occurred()) { QString e = QString("Could not find matching overload for given arguments:\n" + PythonQtConv::PyObjGetString(args) + "\n The following slots are available:\n"); PythonQtSlotInfo* i = info; while (i) { bool skipFirst = (i->isInstanceDecorator() || isVariantCall); e += QString(i->fullSignature(skipFirst)) + "\n"; i = i->nextInfo(); } PyErr_SetString(PyExc_ValueError, e.toLatin1().data()); } } else { // simple (non-overloaded) slot call bool skipFirst = (info->isInstanceDecorator() || isVariantCall); if (info->parameterCount()-1-(skipFirst?1:0) == argc) { PyErr_Clear(); r = PythonQtCallSlot(objectToCall, args, false, info, isVariantCall, firstArg); if (r==NULL && !PyErr_Occurred()) { QString e = QString("Called ") + info->fullSignature(skipFirst) + " with wrong arguments: " + PythonQtConv::PyObjGetString(args); PyErr_SetString(PyExc_ValueError, e.toLatin1().data()); } } else { QString e = QString("Called ") + info->fullSignature(skipFirst) + " with wrong number of arguments: " + PythonQtConv::PyObjGetString(args); PyErr_SetString(PyExc_ValueError, e.toLatin1().data()); } } return r; } PyObject * PythonQtSlotFunction_New(PythonQtSlotInfo *ml, PyObject *self, PyObject *module) { PythonQtSlotFunctionObject *op; op = pythonqtslot_free_list; if (op != NULL) { pythonqtslot_free_list = (PythonQtSlotFunctionObject *)(op->m_self); PyObject_INIT(op, &PythonQtSlotFunction_Type); } else { op = PyObject_GC_New(PythonQtSlotFunctionObject, &PythonQtSlotFunction_Type); if (op == NULL) return NULL; } op->m_ml = ml; Py_XINCREF(self); op->m_self = self; Py_XINCREF(module); op->m_module = module; PyObject_GC_Track(op); return (PyObject *)op; } PythonQtSlotInfo* PythonQtSlotFunction_GetSlotInfo(PyObject *op) { if (!PythonQtSlotFunction_Check(op)) { PyErr_BadInternalCall(); return NULL; } return ((PythonQtSlotFunctionObject *)op) -> m_ml; } PyObject * PythonQtSlotFunction_GetSelf(PyObject *op) { if (!PythonQtSlotFunction_Check(op)) { PyErr_BadInternalCall(); return NULL; } return ((PythonQtSlotFunctionObject *)op) -> m_self; } /* Methods (the standard built-in methods, that is) */ static void meth_dealloc(PythonQtSlotFunctionObject *m) { PyObject_GC_UnTrack(m); Py_XDECREF(m->m_self); Py_XDECREF(m->m_module); m->m_self = (PyObject *)pythonqtslot_free_list; pythonqtslot_free_list = m; } static PyObject * meth_get__doc__(PythonQtSlotFunctionObject *m, void *closure) { Py_INCREF(Py_None); return Py_None; } static PyObject * meth_get__name__(PythonQtSlotFunctionObject *m, void *closure) { return PyString_FromString(m->m_ml->metaMethod()->signature()); } static int meth_traverse(PythonQtSlotFunctionObject *m, visitproc visit, void *arg) { int err; if (m->m_self != NULL) { err = visit(m->m_self, arg); if (err) return err; } if (m->m_module != NULL) { err = visit(m->m_module, arg); if (err) return err; } return 0; } static PyObject * meth_get__self__(PythonQtSlotFunctionObject *m, void *closure) { PyObject *self; if (PyEval_GetRestricted()) { PyErr_SetString(PyExc_RuntimeError, "method.__self__ not accessible in restricted mode"); return NULL; } self = m->m_self; if (self == NULL) self = Py_None; Py_INCREF(self); return self; } static PyGetSetDef meth_getsets [] = { {"__doc__", (getter)meth_get__doc__, NULL, NULL}, {"__name__", (getter)meth_get__name__, NULL, NULL}, {"__self__", (getter)meth_get__self__, NULL, NULL}, {0} }; #define OFF(x) offsetof(PythonQtSlotFunctionObject, x) #if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 6 #define PY_WRITE_RESTRICTED WRITE_RESTRICTED #endif static PyMemberDef meth_members[] = { {"__module__", T_OBJECT, OFF(m_module), PY_WRITE_RESTRICTED}, {NULL} }; static PyObject * meth_repr(PythonQtSlotFunctionObject *m) { return PyString_FromFormat("", m->m_ml->metaMethod()->signature(), m->m_self->ob_type->tp_name, m->m_self); } static int meth_compare(PythonQtSlotFunctionObject *a, PythonQtSlotFunctionObject *b) { if (a->m_self != b->m_self) return (a->m_self < b->m_self) ? -1 : 1; if (a->m_ml == b->m_ml) return 0; if (strcmp(a->m_ml->metaMethod()->signature(), b->m_ml->metaMethod()->signature()) < 0) return -1; else return 1; } static long meth_hash(PythonQtSlotFunctionObject *a) { long x,y; if (a->m_self == NULL) x = 0; else { x = PyObject_Hash(a->m_self); if (x == -1) return -1; } y = _Py_HashPointer((void*)(a->m_ml)); if (y == -1) return -1; x ^= y; if (x == -1) x = -2; return x; } PyTypeObject PythonQtSlotFunction_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, "builtin_qt_slot", sizeof(PythonQtSlotFunctionObject), 0, (destructor)meth_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ (cmpfunc)meth_compare, /* tp_compare */ (reprfunc)meth_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)meth_hash, /* tp_hash */ PythonQtSlotFunction_Call, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 0, /* tp_doc */ (traverseproc)meth_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ meth_members, /* tp_members */ meth_getsets, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ }; /* Clear out the free list */ void PythonQtSlotFunction_Fini(void) { while (pythonqtslot_free_list) { PythonQtSlotFunctionObject *v = pythonqtslot_free_list; pythonqtslot_free_list = (PythonQtSlotFunctionObject *)(v->m_self); PyObject_GC_Del(v); } } fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtSlot.h0000644000175000017500000000555611145517421021622 0ustar malexmalex#ifndef _PYTHONQTSLOT_H #define _PYTHONQTSLOT_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtSlot.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "Python.h" #include "structmember.h" class PythonQtSlotInfo; extern PyTypeObject PythonQtSlotFunction_Type; #define PythonQtSlotFunction_Check(op) ((op)->ob_type == &PythonQtSlotFunction_Type) PythonQtSlotInfo* PythonQtSlotFunction_GetSlotInfo(PyObject *); PyObject* PythonQtSlotFunction_GetSelf(PyObject *); /* Macros for direct access to these values. Type checks are *not* done, so use with care. */ #define PythonQtSlotFunction_GET_SELF(func) \ (((PythonQtSlotFunctionObject *)func) -> m_self) PyObject* PythonQtSlotFunction_Call(PyObject *, PyObject *, PyObject *); PyObject *PythonQtSlotFunction_CallImpl(QObject* objectToCall, PythonQtSlotInfo* info, PyObject *args, PyObject *kw, bool isVariantCall=false, void* firstArg=NULL); PyObject* PythonQtSlotFunction_New(PythonQtSlotInfo *, PyObject *, PyObject *); //! defines a python object that stores a Qt slot info typedef struct { PyObject_HEAD PythonQtSlotInfo *m_ml; /* Description of the C function to call */ PyObject *m_self; /* Passed as 'self' arg to the C func, can be NULL */ PyObject *m_module; /* The __module__ attribute, can be anything */ } PythonQtSlotFunctionObject; #endif fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtSignalReceiver.h0000644000175000017500000001021611145517421023570 0ustar malexmalex#ifndef _PYTHONQTSIGNALRECEIVER_H #define _PYTHONQTSIGNALRECEIVER_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtSignalReceiver.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQt.h" class PythonQtMethodInfo; //! stores information about a signal target /*! copy construction and assignment works fine with the C++ standard behaviour and are thus not implemented */ class PythonQtSignalTarget { public: PythonQtSignalTarget() { _signalId = -1; _methodInfo = NULL; _slotId = -1; } PythonQtSignalTarget(int signalId,const PythonQtMethodInfo* methodInfo, int slotId, PyObject* callable) { _signalId = signalId; _slotId = slotId; _methodInfo = methodInfo; _callable = callable; }; ~PythonQtSignalTarget() { }; //! get the id of the original signal int signalId() const { return _signalId; } //! get the id that was assigned to this simulated slot int slotId() const { return _slotId; } //! get the signals parameter info const PythonQtMethodInfo* methodInfo() const { return _methodInfo; } //! call the python callable with the given arguments (as defined in methodInfo) void call(void **arguments) const; //! check if it is the same signal target bool isSame(int signalId, PyObject* callable) const { return callable==_callable && signalId==_signalId; } private: int _signalId; int _slotId; const PythonQtMethodInfo* _methodInfo; PythonQtObjectPtr _callable; }; //! base class for signal receivers /*! */ class PythonQtSignalReceiverBase : public QObject { Q_OBJECT public: PythonQtSignalReceiverBase(QObject* obj):QObject(obj) {}; }; //! receives all signals for one QObject /*! we derive from our base but do not declare the QObject macro because we want to reimplement qt_metacall only. */ class PythonQtSignalReceiver : public PythonQtSignalReceiverBase { public: PythonQtSignalReceiver(QObject* obj); ~PythonQtSignalReceiver(); //! add a signal handler bool addSignalHandler(const char* signal, PyObject* callable); //! remove a signal handler bool removeSignalHandler(const char* signal, PyObject* callable); //! remove all signal handlers void removeSignalHandlers(); //! we implement this method to simulate a number of slots that match the ids in _targets virtual int qt_metacall(QMetaObject::Call c, int id, void **arguments); private: //! get the index of the signal int getSignalIndex(const char* signal); QObject* _obj; int _slotCount; // linear list may get slow on multiple targets, but I think typically we have many objects and just a few signals QList _targets; }; #endif fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtClassInfo.h0000644000175000017500000000746111145517421022557 0ustar malexmalex#ifndef _PYTHONQTCLASSINFO_H #define _PYTHONQTCLASSINFO_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ #include #include #include #include #include class PythonQtSlotInfo; struct PythonQtMemberInfo { enum Type { Invalid, Slot, EnumValue, Property }; PythonQtMemberInfo() { _type = Invalid; } PythonQtMemberInfo(PythonQtSlotInfo* info) { _type = Slot; _slot = info; _enumValue = 0; } PythonQtMemberInfo(unsigned int enumValue) { _type = EnumValue; _slot = NULL; _enumValue = enumValue; } PythonQtMemberInfo(const QMetaProperty& prop) { _type = Property; _slot = NULL; _enumValue = 0; _property = prop; } PythonQtSlotInfo* _slot; unsigned int _enumValue; QMetaProperty _property; Type _type; }; //! a class that stores all required information about a Qt object (and an optional associated C++ class name) /*! for fast lookup of slots when calling the object from Python */ class PythonQtClassInfo { public: PythonQtClassInfo(const QMetaObject* meta, const QByteArray& wrappedClassName = QByteArray()); ~PythonQtClassInfo(); //! get the Python method definition for a given slot name (without return type and signature) PythonQtMemberInfo member(const char* member); PythonQtSlotInfo* constructors(); //! get the Qt classname const char* className(); //! get the classname of the wrapped C++ class const QByteArray& wrappedCPPClassName(); //! returns if the object is a CPP wrapper bool isCPPWrapper() { return !_wrappedClassName.isEmpty(); } //! get the meta object const QMetaObject* metaObject() { return _meta; } //! set the meta object, this will reset the caching void setMetaObject(const QMetaObject* meta); //! returns if the meta object inherits the given classname bool inherits(const char* name); //! get help string for the metaobject QString help(); //! get list of all members QStringList memberList(bool metaOnly = false); private: PythonQtSlotInfo* findDecoratorSlots(const char* classname, const char* memberName, int memberNameLen, PythonQtSlotInfo* tail, bool &found); int findCharOffset(const char* sigStart, char someChar); QHash _cachedMembers; PythonQtSlotInfo* _constructors; const QMetaObject* _meta; QByteArray _wrappedClassName; }; //--------------------------------------------------------------- #endif fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtSystem.h0000644000175000017500000000357011145517421022157 0ustar malexmalex#ifndef _PYTHONQTSYSTEM_ #define _PYTHONQTSYSTEM_ /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtSystem.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #ifdef WIN32 #ifdef PYTHONQT_EXPORTS #define PYTHONQT_EXPORT __declspec(dllexport) #else #define PYTHONQT_EXPORT __declspec(dllimport) #endif #else #define PYTHONQT_EXPORT #endif #endif fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtMetaObjectWrapper.h0000644000175000017500000000477711145517421024263 0ustar malexmalex#ifndef _PYTHONQTMETAOBJECTWRAPPER_H #define _PYTHONQTMETAOBJECTWRAPPER_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtMetaObjectWrapper.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include #include "structmember.h" #include "methodobject.h" #include "compile.h" #include "eval.h" #include class PythonQtClassInfo; class QObject; struct QMetaObject; extern PyTypeObject PythonQtMetaObjectWrapper_Type; //--------------------------------------------------------------- //! a Python wrapper object for Qt meta objects typedef struct { PyObject_HEAD //! the class information (which contains the meta object as well) PythonQtClassInfo* _info; } PythonQtMetaObjectWrapper; //--------------------------------------------------------------- // an abstact class for handling construction of objects class PythonQtConstructorHandler { public: virtual QObject* create(const QMetaObject* meta, PyObject *args, PyObject *kw, QString& error) = 0; }; #endiffontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQt.cpp0000644000175000017500000010032311176610725021304 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQt.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQt.h" #include "PythonQtImporter.h" #include "PythonQtClassInfo.h" #include "PythonQtMethodInfo.h" #include "PythonQtSignalReceiver.h" #include "PythonQtConversion.h" #include "PythonQtStdOut.h" #include "PythonQtCppWrapperFactory.h" #include "PythonQtVariants.h" #include "PythonQtStdDecorators.h" #include #include PythonQt* PythonQt::_self = NULL; int PythonQt::_uniqueModuleCount = 0; void PythonQt::init(int flags) { if (!_self) { _self = new PythonQt(flags); } PythonQtMethodInfo::addParameterTypeAlias("QObjectList", "QList"); qRegisterMetaType >("QList"); PythonQt::self()->addDecorators(new PythonQtStdDecorators()); PythonQt::priv()->addVariantWrapper("QBitArray", new PythonQtQBitArrayWrapper); PythonQt::priv()->addVariantWrapper("QDate", new PythonQtQDateWrapper); PythonQt::priv()->addVariantWrapper("QTime", new PythonQtQTimeWrapper); PythonQt::priv()->addVariantWrapper("QDateTime", new PythonQtQDateTimeWrapper); PythonQt::priv()->addVariantWrapper("QUrl", new PythonQtQUrlWrapper); PythonQt::priv()->addVariantWrapper("QLocale", new PythonQtQLocaleWrapper); PythonQt::priv()->addVariantWrapper("QRect", new PythonQtQRectWrapper); PythonQt::priv()->addVariantWrapper("QRectF", new PythonQtQRectFWrapper); PythonQt::priv()->addVariantWrapper("QSize", new PythonQtQSizeWrapper); PythonQt::priv()->addVariantWrapper("QSizeF", new PythonQtQSizeFWrapper); PythonQt::priv()->addVariantWrapper("QLine", new PythonQtQLineWrapper); PythonQt::priv()->addVariantWrapper("QLineF", new PythonQtQLineFWrapper); PythonQt::priv()->addVariantWrapper("QPoint", new PythonQtQPointWrapper); PythonQt::priv()->addVariantWrapper("QPointF", new PythonQtQPointFWrapper); PythonQt::priv()->addVariantWrapper("QRegExp", new PythonQtQRegExpWrapper); PythonQt::priv()->addVariantWrapper("QFont", new PythonQtQFontWrapper); PythonQt::priv()->addVariantWrapper("QPixmap", new PythonQtQPixmapWrapper); PythonQt::priv()->addVariantWrapper("QBrush", new PythonQtQBrushWrapper); PythonQt::priv()->addVariantWrapper("QColor", new PythonQtQColorWrapper); PythonQt::priv()->addVariantWrapper("QPalette", new PythonQtQPaletteWrapper); PythonQt::priv()->addVariantWrapper("QIcon", new PythonQtQIconWrapper); PythonQt::priv()->addVariantWrapper("QImage", new PythonQtQImageWrapper); PythonQt::priv()->addVariantWrapper("QPolygon", new PythonQtQPolygonWrapper); PythonQt::priv()->addVariantWrapper("QRegion", new PythonQtQRegionWrapper); PythonQt::priv()->addVariantWrapper("QBitmap", new PythonQtQBitmapWrapper); PythonQt::priv()->addVariantWrapper("QCursor", new PythonQtQCursorWrapper); PythonQt::priv()->addVariantWrapper("QSizePolicy", new PythonQtQSizePolicyWrapper); PythonQt::priv()->addVariantWrapper("QKeySequence", new PythonQtQKeySequenceWrapper); PythonQt::priv()->addVariantWrapper("QPen", new PythonQtQPenWrapper); PythonQt::priv()->addVariantWrapper("QTextLength", new PythonQtQTextLengthWrapper); PythonQt::priv()->addVariantWrapper("QTextFormat", new PythonQtQTextFormatWrapper); PythonQt::priv()->addVariantWrapper("QMatrix", new PythonQtQMatrixWrapper); } void PythonQt::cleanup() { if (_self) { delete _self; _self = NULL; } } PythonQt::PythonQt(int flags) { _p = new PythonQtPrivate; _p->_initFlags = flags; _p->_PythonQtObjectPtr_metaId = qRegisterMetaType("PythonQtObjectPtr"); Py_SetProgramName(QString("PythonQt").toLocal8Bit().data()); if (flags & IgnoreSiteModule) { // this prevents the automatic importing of Python site files Py_NoSiteFlag = 1; } Py_Initialize(); // add our own python object types for qt object slots if (PyType_Ready(&PythonQtSlotFunction_Type) < 0) { std::cerr << "could not initialize PythonQtSlotFunction_Type" << ", in " << __FILE__ << ":" << __LINE__ << std::endl; } Py_INCREF(&PythonQtSlotFunction_Type); // add our own python object types for qt objects if (PyType_Ready(&PythonQtWrapper_Type) < 0) { std::cerr << "could not initialize PythonQtWrapper_Type" << ", in " << __FILE__ << ":" << __LINE__ << std::endl; } Py_INCREF(&PythonQtWrapper_Type); // add our own python object types for qt objects if (PyType_Ready(&PythonQtVariantWrapper_Type) < 0) { std::cerr << "could not initialize PythonQtVariantWrapper_Type" << ", in " << __FILE__ << ":" << __LINE__ << std::endl; } Py_INCREF(&PythonQtVariantWrapper_Type); // add our own python object types for qt objects if (PyType_Ready(&PythonQtMetaObjectWrapper_Type) < 0) { std::cerr << "could not initialize PythonQtMetaObjectWrapper_Type" << ", in " << __FILE__ << ":" << __LINE__ << std::endl; } Py_INCREF(&PythonQtMetaObjectWrapper_Type); // add our own python object types for redirection of stdout if (PyType_Ready(&PythonQtStdOutRedirectType) < 0) { std::cerr << "could not initialize PythonQtStdOutRedirectType" << ", in " << __FILE__ << ":" << __LINE__ << std::endl; } Py_INCREF(&PythonQtStdOutRedirectType); initPythonQtModule(flags & RedirectStdOut); } PythonQt::~PythonQt() { delete _p; _p = NULL; } PythonQtPrivate::~PythonQtPrivate() { { QHashIterator i(_knownQtClasses); while (i.hasNext()) { delete i.next().value(); } } { QHashIterator i(_knownQtWrapperClasses); while (i.hasNext()) { delete i.next().value(); } } { QHashIterator > i(_knownVariantWrappers); while (i.hasNext()) { delete i.next().value().first; } } { QHashIterator i(_constructorSlots); while (i.hasNext()) { delete i.next().value(); } } { QHashIterator i(_destructorSlots); while (i.hasNext()) { delete i.next().value(); } } PythonQtConv::global_valueStorage.clear(); PythonQtConv::global_ptrStorage.clear(); PythonQtConv::global_variantStorage.clear(); PythonQtMethodInfo::cleanupCachedMethodInfos(); delete _qtNamespace; } PythonQtImportFileInterface* PythonQt::importInterface() { return _self->_p->_importInterface; } void PythonQt::registerClass(const QMetaObject* metaobject) { _p->registerClass(metaobject); } void PythonQt::qObjectNoLongerWrappedCB(QObject* o) { if (_self->_p->_noLongerWrappedCB) { (*_self->_p->_noLongerWrappedCB)(o); }; } void PythonQtPrivate::registerClass(const QMetaObject* metaobject) { // we register all classes in the hierarchy const QMetaObject* m = metaobject; while (m) { PythonQtClassInfo* info = _knownQtClasses.value(m->className()); if (!info) { info = new PythonQtClassInfo(m); _knownQtClasses.insert(m->className(), info); PyModule_AddObject(_pythonQtModule, m->className(), (PyObject*)createNewPythonQtMetaObjectWrapper(info)); } m = m->superClass(); } } bool PythonQtPrivate::isEnumType(const QMetaObject* meta, const QByteArray& name) { int i = meta?meta->indexOfEnumerator(name.constData()):-1; if (i!=-1) { return true; } else { // look for scope int scopePos = name.indexOf("::"); if (scopePos != -1) { // slit into scope and enum name QByteArray enumScope = name.mid(0,scopePos); QByteArray enumName = name.mid(scopePos+2); if (enumScope == "Qt") { // special qt namespace case return isEnumType(&staticQtMetaObject, enumName); } else { // look for known classes as scope // TODO: Q_GADGETS are not yet handled PythonQtClassInfo* info = _knownQtClasses.value(enumScope); if (info) { return isEnumType(info->metaObject(), enumName); } } } } return false; } PyObject* PythonQtPrivate::wrapQObject(QObject* obj) { if (!obj) { Py_INCREF(Py_None); return Py_None; } PythonQtWrapper* wrap = findWrapperAndRemoveUnused(obj); if (!wrap) { // smuggling it in... PythonQtClassInfo* classInfo = _knownQtClasses.value(obj->metaObject()->className()); if (!classInfo) { registerClass(obj->metaObject()); classInfo = _knownQtClasses.value(obj->metaObject()->className()); } wrap = createNewPythonQtWrapper(obj, classInfo); // mlabDebugConst("MLABPython","new qobject wrapper added " << " " << wrap->_obj->className() << " " << wrap->_info->wrappedClassName().latin1()); } else { Py_INCREF(wrap); // mlabDebugConst("MLABPython","qobject wrapper reused " << wrap->_obj->className() << " " << wrap->_info->wrappedClassName().latin1()); } return (PyObject*)wrap; } PyObject* PythonQtPrivate::wrapPtr(void* ptr, const QByteArray& name) { if (!ptr) { Py_INCREF(Py_None); return Py_None; } PythonQtWrapper* wrap = findWrapperAndRemoveUnused(ptr); if (!wrap) { PythonQtClassInfo* info = _knownQtClasses.value(name); if (!info) { // we do not know the metaobject yet, but we might know it by it's name: if (_knownQObjectClassNames.find(name)!=_knownQObjectClassNames.end()) { // yes, we know it, so we can convert to QObject QObject* qptr = (QObject*)ptr; registerClass(qptr->metaObject()); info = _knownQtClasses.value(qptr->metaObject()->className()); } } if (info) { QObject* qptr = (QObject*)ptr; // if the object is a derived object, we want to switch the class info to the one of the derived class: if (name!=(qptr->metaObject()->className())) { registerClass(qptr->metaObject()); info = _knownQtClasses.value(qptr->metaObject()->className()); } wrap = createNewPythonQtWrapper(qptr, info); // mlabDebugConst("MLABPython","new qobject wrapper added " << " " << wrap->_obj->className() << " " << wrap->_info->wrappedClassName().latin1()); } else { // maybe it is a PyObject, which we can return directly if (name == "PyObject") { PyObject* p = (PyObject*)ptr; Py_INCREF(p); return p; } // not a known QObject, so try our wrapper factory: QObject* wrapper = NULL; for (int i=0; i<_cppWrapperFactories.size(); i++) { wrapper = _cppWrapperFactories.at(i)->create(name, ptr); if (wrapper) { break; } } PythonQtClassInfo* info = _knownQtWrapperClasses.value(name); if (!info) { info = new PythonQtClassInfo(wrapper?wrapper->metaObject():&QObject::staticQtMetaObject, name); _knownQtWrapperClasses.insert(name, info); PyModule_AddObject(_pythonQtModule, name, (PyObject*)createNewPythonQtMetaObjectWrapper(info)); } else { if (wrapper && (info->metaObject() != wrapper->metaObject())) { info->setMetaObject(wrapper->metaObject()); } } wrap = createNewPythonQtWrapper(wrapper, info, ptr); // mlabDebugConst("MLABPython","new c++ wrapper added " << wrap->_wrappedPtr << " " << wrap->_obj->className() << " " << wrap->_info->wrappedClassName().latin1()); } } else { Py_INCREF(wrap); //mlabDebugConst("MLABPython","c++ wrapper reused " << wrap->_wrappedPtr << " " << wrap->_obj->className() << " " << wrap->_info->wrappedClassName().latin1()); } return (PyObject*)wrap; } void PythonQt::registerCPPClassNames(const QStringList& names) { foreach ( QString n, names) { QByteArray name = n.toLatin1(); PythonQtClassInfo* info = _p->_knownQtWrapperClasses.value(name); if (!info) { info = new PythonQtClassInfo(&QObject::staticMetaObject, name); _p->_knownQtWrapperClasses.insert(name, info); PyModule_AddObject(_p->_pythonQtModule, name.data(), (PyObject*)_p->createNewPythonQtMetaObjectWrapper(info)); } } } PythonQtWrapper* PythonQtPrivate::createNewPythonQtWrapper(QObject* obj, PythonQtClassInfo* info, void* wrappedPtr) { PythonQtWrapper* result; result = (PythonQtWrapper *)PythonQtWrapper_Type.tp_new(&PythonQtWrapper_Type, NULL, NULL); result->setQObject(obj); result->_info = info; result->_wrappedPtr = wrappedPtr; result->_ownedByPythonQt = false; if (wrappedPtr) { _wrappedObjects.insert(wrappedPtr, result); } else { _wrappedObjects.insert(obj, result); if (obj->parent()== NULL && _wrappedCB) { // tell someone who is interested that the qobject is wrapped the first time, if it has no parent (*_wrappedCB)(obj); } } return result; } PythonQtVariantWrapper* PythonQtPrivate::createNewPythonQtVariantWrapper(const QVariant& variant) { PythonQtVariantWrapper* result; result = (PythonQtVariantWrapper *)PythonQtVariantWrapper_Type.tp_new(&PythonQtVariantWrapper_Type, NULL, NULL); *result->_variant = variant; QPair pair = _knownVariantWrappers.value(variant.userType()); result->_wrapper = pair.second; result->_info = pair.first; return result; } PythonQtMetaObjectWrapper* PythonQtPrivate::createNewPythonQtMetaObjectWrapper(PythonQtClassInfo* info) { PythonQtMetaObjectWrapper* result; result = (PythonQtMetaObjectWrapper *)PythonQtMetaObjectWrapper_Type.tp_new(&PythonQtMetaObjectWrapper_Type, NULL, NULL); result->_info = info; return result; } PythonQtSignalReceiver* PythonQt::getSignalReceiver(QObject* obj) { PythonQtSignalReceiver* r = _p->_signalReceivers[obj]; if (!r) { r = new PythonQtSignalReceiver(obj); _p->_signalReceivers.insert(obj, r); } return r; } bool PythonQt::addSignalHandler(QObject* obj, const char* signal, PyObject* module, const QString& objectname) { bool flag = false; PythonQtObjectPtr callable = lookupCallable(module, objectname); if (callable) { PythonQtSignalReceiver* r = getSignalReceiver(obj); flag = r->addSignalHandler(signal, callable); if (!flag) { // signal not found } } else { // callable not found } return flag; } bool PythonQt::addSignalHandler(QObject* obj, const char* signal, PyObject* receiver) { bool flag = false; PythonQtSignalReceiver* r = getSignalReceiver(obj); if (r) { flag = r->addSignalHandler(signal, receiver); } return flag; } bool PythonQt::removeSignalHandler(QObject* obj, const char* signal, PyObject* module, const QString& objectname) { bool flag = false; PythonQtObjectPtr callable = lookupCallable(module, objectname); if (callable) { PythonQtSignalReceiver* r = _p->_signalReceivers[obj]; if (r) { flag = r->removeSignalHandler(signal, callable); } } else { // callable not found } return flag; } bool PythonQt::removeSignalHandler(QObject* obj, const char* signal, PyObject* receiver) { bool flag = false; PythonQtSignalReceiver* r = _p->_signalReceivers[obj]; if (r) { flag = r->removeSignalHandler(signal, receiver); } return flag; } PythonQtObjectPtr PythonQt::lookupCallable(PyObject* module, const QString& name) { PythonQtObjectPtr p = lookupObject(module, name); if (p) { if (PyCallable_Check(p)) { return p; } } PyErr_Clear(); return NULL; } PythonQtObjectPtr PythonQt::lookupObject(PyObject* module, const QString& name) { QStringList l = name.split('.'); PythonQtObjectPtr p = module; PythonQtObjectPtr prev; QString s; QByteArray b; for (QStringList::ConstIterator i = l.begin(); i!=l.end() && p; ++i) { prev = p; b = (*i).toLatin1(); p.setNewRef(PyObject_GetAttrString(p, b.data())); } PyErr_Clear(); return p; } PythonQtObjectPtr PythonQt::getMainModule() { //both borrowed PythonQtObjectPtr dict = PyImport_GetModuleDict(); return PyDict_GetItemString(dict, "__main__"); } QVariant PythonQt::evalCode(PyObject* module, PyObject* pycode) { QVariant result; if (pycode) { PyObject* r = PyEval_EvalCode((PyCodeObject*)pycode, PyModule_GetDict((PyObject*)module) , PyModule_GetDict((PyObject*)module)); if (r) { result = PythonQtConv::PyObjToQVariant(r); Py_DECREF(r); } else { handleError(); } } else { handleError(); } return result; } QVariant PythonQt::evalScript(PyObject* module, const QString& script, int start) { QVariant result; PythonQtObjectPtr p; PyObject* dm(PyModule_GetDict(module)); char * data(script.toUtf8().data()); PyObject * rp; rp = PyRun_String(data, start, dm, dm); p.setNewRef(rp); if (rp) { result = PythonQtConv::PyObjToQVariant(p); } else { handleError(); } return result; } void PythonQt::evalFile(PyObject* module, const QString& filename) { PythonQtObjectPtr code = parseFile(filename); if (code) { evalCode(module, code); } else { handleError(); } } PythonQtObjectPtr PythonQt::parseFile(const QString& filename) { PythonQtObjectPtr p; p.setNewRef(PythonQtImport::getCodeFromPyc(filename)); if (!p) { handleError(); } return p; } PythonQtObjectPtr PythonQt::createModuleFromFile(const QString& name, const QString& filename) { PythonQtObjectPtr code = parseFile(filename); PythonQtObjectPtr module = _p->createModule(name, code); return module; } PythonQtObjectPtr PythonQt::createModuleFromScript(const QString& name, const QString& script) { PyErr_Clear(); QString scriptCode = script; if (scriptCode.isEmpty()) { // we always need at least a linefeed scriptCode = "\n"; } PythonQtObjectPtr pycode; pycode.setNewRef(Py_CompileString((char*)scriptCode.toLatin1().data(), "", Py_file_input)); PythonQtObjectPtr module = _p->createModule(name, pycode); return module; } PythonQtObjectPtr PythonQt::createUniqueModule() { static QString pyQtStr("PythonQt_module"); QString moduleName = pyQtStr+QString::number(_uniqueModuleCount++); return createModuleFromScript(moduleName); } void PythonQt::addObject(PyObject* module, const QString& name, QObject* object) { PyModule_AddObject(module, name.toLatin1().data(), _p->wrapQObject(object)); } void PythonQt::addVariable(PyObject* module, const QString& name, const QVariant& v) { PyModule_AddObject(module, name.toLatin1().data(), PythonQtConv::QVariantToPyObject(v)); } void PythonQt::removeVariable(PyObject* module, const QString& name) { PyObject_DelAttrString(module, name.toLatin1().data()); } QVariant PythonQt::getVariable(PyObject* module, const QString& objectname) { QVariant result; PythonQtObjectPtr obj = lookupObject(module, objectname); if (obj) { result = PythonQtConv::PyObjToQVariant(obj); } return result; } QStringList PythonQt::introspection(PyObject* module, const QString& objectname, PythonQt::ObjectType type) { QStringList results; PythonQtObjectPtr object; if (objectname.isEmpty()) { object = module; } else { object = lookupObject(module, objectname); if (!object && type == CallOverloads) { PyObject* dict = lookupObject(module, "__builtins__"); if (dict) { object = PyDict_GetItemString(dict, objectname.toLatin1().constData()); } } } if (object) { if (type == CallOverloads) { if (PythonQtSlotFunction_Check(object)) { PythonQtSlotFunctionObject* o = (PythonQtSlotFunctionObject*)object.object(); PythonQtSlotInfo* info = o->m_ml; while (info) { results << info->fullSignature(info->isInstanceDecorator() || o->m_self->ob_type == &PythonQtVariantWrapper_Type); info = info->nextInfo(); } } else if (object->ob_type == &PythonQtMetaObjectWrapper_Type) { PythonQtMetaObjectWrapper* o = (PythonQtMetaObjectWrapper*)object.object(); PythonQtSlotInfo* info = o->_info->constructors(); while (info) { results << info->fullSignature(false); info = info->nextInfo(); } } else { //TODO: use pydoc! PyObject* doc = PyObject_GetAttrString(object, "__doc__"); if (doc) { results << PyString_AsString(doc); Py_DECREF(doc); } } } else { PyObject* keys = PyObject_Dir(object); if (keys) { int count = PyList_Size(keys); PyObject* key; PyObject* value; QString keystr; for (int i = 0;iob_type == &PyClass_Type) { results << keystr; } break; case Variable: if (value->ob_type != &PyClass_Type && value->ob_type != &PyCFunction_Type && value->ob_type != &PyFunction_Type && value->ob_type != &PyModule_Type ) { results << keystr; } break; case Function: if (value->ob_type == &PyFunction_Type || value->ob_type == &PyMethod_Type ) { results << keystr; } break; case Module: if (value->ob_type == &PyModule_Type) { results << keystr; } break; default: std::cerr << "PythonQt: introspection: unknown case" << ", in " << __FILE__ << ":" << __LINE__ << std::endl; } } Py_DECREF(value); } Py_DECREF(keys); } } } return results; } QVariant PythonQt::call(PyObject* module, const QString& name, const QVariantList& args) { QVariant r; PythonQtObjectPtr callable = lookupCallable(module, name); if (callable) { PythonQtObjectPtr pargs; int count = args.size(); if (count>0) { pargs.setNewRef(PyTuple_New(count)); } bool err = false; // transform QVariants to Python for (int i = 0; i < count; i++) { PyObject* arg = PythonQtConv::QVariantToPyObject(args.at(i)); if (arg) { // steals reference, no unref PyTuple_SetItem(pargs, i,arg); } else { err = true; break; } } if (!err) { PyErr_Clear(); PythonQtObjectPtr result; result.setNewRef(PyObject_CallObject(callable, pargs)); if (result) { // ok r = PythonQtConv::PyObjToQVariant(result); } else { PythonQt::self()->handleError(); } } } return r; } void PythonQt::addInstanceDecorators(QObject* o) { _p->addDecorators(o, true, false); } void PythonQt::addClassDecorators(QObject* o) { _p->addDecorators(o, false, true); } void PythonQt::addDecorators(QObject* o) { _p->addDecorators(o, true, true); } void PythonQt::registerQObjectClassNames(const QStringList& names) { _p->registerQObjectClassNames(names); } void PythonQt::setImporter(PythonQtImportFileInterface* importInterface) { static bool first = true; if (first) { first = false; _p->_importInterface = importInterface; PythonQtImport::init(); } } void PythonQt::setImporterIgnorePaths(const QStringList& paths) { _p->_importIgnorePaths = paths; } const QStringList& PythonQt::getImporterIgnorePaths() { return _p->_importIgnorePaths; } void PythonQt::addWrapperFactory(PythonQtCppWrapperFactory* factory) { _p->_cppWrapperFactories.append(factory); } void PythonQt::addConstructorHandler(PythonQtConstructorHandler* factory) { _p->_constructorHandlers.append(factory); } const QList& PythonQt::constructorHandlers() { return _p->_constructorHandlers; }; //--------------------------------------------------------------------------------------------------- PythonQtPrivate::PythonQtPrivate() { _importInterface = NULL; _noLongerWrappedCB = NULL; _wrappedCB = NULL; } void PythonQtPrivate::addDecorators(QObject* o, bool instanceDeco, bool classDeco) { o->setParent(this); int numMethods = o->metaObject()->methodCount(); for (int i = 0; i < numMethods; i++) { QMetaMethod m = o->metaObject()->method(i); if ((m.methodType() == QMetaMethod::Method || m.methodType() == QMetaMethod::Slot) && m.access() == QMetaMethod::Public) { const PythonQtMethodInfo* info = PythonQtMethodInfo::getCachedMethodInfo(m); if (qstrncmp(m.signature(), "new_", 4)==0) { if (!classDeco) continue; // either it returns a * or a QVariant and the name starts with "new_" bool isVariantReturn = info->parameters().at(0).typeId == PythonQtMethodInfo::Variant; if ((info->parameters().at(0).isPointer || isVariantReturn)) { QByteArray signature = m.signature(); QByteArray nameOfClass = signature.mid(4, signature.indexOf('(')-4); PythonQtSlotInfo* prev = _constructorSlots.value(nameOfClass); PythonQtSlotInfo* newSlot = new PythonQtSlotInfo(m, i, o, PythonQtSlotInfo::ClassDecorator); if (prev) { newSlot->setNextInfo(prev->nextInfo()); prev->setNextInfo(newSlot); } else { _constructorSlots.insert(nameOfClass, newSlot); } } } else if (qstrncmp(m.signature(), "delete_", 7)==0) { if (!classDeco) continue; QByteArray signature = m.signature(); QByteArray nameOfClass = signature.mid(7, signature.indexOf('(')-7); PythonQtSlotInfo* newSlot = new PythonQtSlotInfo(m, i, o, PythonQtSlotInfo::ClassDecorator); _destructorSlots.insert(nameOfClass, newSlot); } else if (qstrncmp(m.signature(), "static_", 7)==0) { if (!classDeco) continue; QByteArray signature = m.signature(); QByteArray nameOfClass = signature.mid(signature.indexOf('_')+1); nameOfClass = nameOfClass.mid(0, nameOfClass.indexOf('_')); PythonQtSlotInfo* slotCopy = new PythonQtSlotInfo(m, i, o, PythonQtSlotInfo::ClassDecorator); _knownQtDecoratorSlots.insert(nameOfClass, slotCopy); } else { if (!instanceDeco) continue; if (info->parameters().count()>1) { PythonQtMethodInfo::ParameterInfo p = info->parameters().at(1); if (p.isPointer) { PythonQtSlotInfo* slotCopy = new PythonQtSlotInfo(m, i, o, PythonQtSlotInfo::InstanceDecorator); _knownQtDecoratorSlots.insert(p.name, slotCopy); } } } } } } void PythonQtPrivate::registerQObjectClassNames(const QStringList& names) { foreach(QString name, names) { _knownQObjectClassNames.insert(name.toLatin1(), true); } } QList PythonQtPrivate::getDecoratorSlots(const QByteArray& className) { return _knownQtDecoratorSlots.values(className); } void PythonQtPrivate::removeSignalEmitter(QObject* obj) { _signalReceivers.remove(obj); } bool PythonQt::handleError() { bool flag = false; PythonQtObjectPtr err; err.setNewRef(PyErr_Occurred()); if (!err.isNull()) { // currently we just print the error and the stderr handler parses the errors PyErr_Print(); QVariant v(PythonQtConv::PyObjToQVariant(err)); qDebug()<<"PyError"<pythonStdOut(str); } void PythonQt::stdErrRedirectCB(const QString& str) { emit PythonQt::self()->pythonStdErr(str); } void PythonQt::setQObjectWrappedCallback(PythonQtQObjectWrappedCB* cb) { _p->_wrappedCB = cb; } void PythonQt::setQObjectNoLongerWrappedCallback(PythonQtQObjectNoLongerWrappedCB* cb) { _p->_noLongerWrappedCB = cb; } static PyMethodDef PythonQtMethods[] = { {NULL, NULL, 0, NULL} }; void PythonQt::initPythonQtModule(bool redirectStdOut) { _p->_pythonQtModule.setNewRef(Py_InitModule("PythonQt", PythonQtMethods)); _p->_qtNamespace = new PythonQtClassInfo(&staticQtMetaObject); PyModule_AddObject(_p->_pythonQtModule, "Qt", (PyObject*)_p->createNewPythonQtMetaObjectWrapper(_p->_qtNamespace)); if (redirectStdOut) { PythonQtObjectPtr sys; PythonQtObjectPtr out; PythonQtObjectPtr err; sys.setNewRef(PyImport_ImportModule("sys")); // create a redirection object for stdout and stderr out = PythonQtStdOutRedirectType.tp_new(&PythonQtStdOutRedirectType,NULL, NULL); ((PythonQtStdOutRedirect*)out.object())->_cb = stdOutRedirectCB; err = PythonQtStdOutRedirectType.tp_new(&PythonQtStdOutRedirectType,NULL, NULL); ((PythonQtStdOutRedirect*)err.object())->_cb = stdErrRedirectCB; // replace the built in file objects with our own objects PyModule_AddObject(sys, "stdout", out); PyModule_AddObject(sys, "stderr", err); } } void PythonQt::addVariantWrapper(const char* typeName, QObject* wrapper) { _p->addVariantWrapper(typeName, wrapper); } void PythonQtPrivate::addVariantWrapper(const char* typeName, QObject* wrapper) { int type = QMetaType::type(typeName); PythonQtClassInfo* info = new PythonQtClassInfo(wrapper->metaObject(), typeName); _knownVariantWrappers.insert(type, qMakePair(info, wrapper)); addDecorators(wrapper, false, true); PyModule_AddObject(_pythonQtModule, typeName, (PyObject*)createNewPythonQtMetaObjectWrapper(info)); } PyObject* PythonQt::helpCalled(PythonQtClassInfo* info) { if (_p->_initFlags & ExternalHelp) { emit pythonHelpRequest(QByteArray(info->className())); return Py_BuildValue(""); } else { return PyString_FromString(info->help().toLatin1().data()); } } void PythonQtPrivate::removeWrapperPointer(void* obj) { _wrappedObjects.remove(obj); } PythonQtWrapper* PythonQtPrivate::findWrapperAndRemoveUnused(void* obj) { PythonQtWrapper* wrap = _wrappedObjects.value(obj); if (wrap && !wrap->_wrappedPtr && wrap->_obj == NULL) { // this is a wrapper whose QObject was already removed due to destruction // so the obj pointer has to be a new QObject with the same address... // we remove the old one and set the copy to NULL wrap->_objPointerCopy = NULL; removeWrapperPointer(obj); wrap = NULL; } return wrap; } PythonQtObjectPtr PythonQtPrivate::createModule(const QString& name, PyObject* pycode) { PythonQtObjectPtr result; if (pycode) { result.setNewRef(PyImport_ExecCodeModule((char*)name.toLatin1().data(), pycode)); } else { PythonQt::self()->handleError(); } return result; } fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtStdOut.h0000644000175000017500000000420511145517421022111 0ustar malexmalex#ifndef _PYTHONQTSTDOUT_H #define _PYTHONQTSTDOUT_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtStdOut.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include #include "structmember.h" #include //! declares the type of the stdout redirection class extern PyTypeObject PythonQtStdOutRedirectType; //! declares the callback that is called from the write() function typedef void PythonQtOutputChangedCB(const QString& str); //! declares the stdout redirection class typedef struct { PyObject_HEAD PythonQtOutputChangedCB* _cb; int softspace; } PythonQtStdOutRedirect; #endif fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtStdOut.cpp0000644000175000017500000001142711145517421022450 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtStdOut.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQtStdOut.h" static PyObject *PythonQtStdOutRedirect_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PythonQtStdOutRedirect *self; self = (PythonQtStdOutRedirect *)type->tp_alloc(type, 0); self->softspace = 0; self->_cb = NULL; return (PyObject *)self; } static PyObject *PythonQtStdOutRedirect_write(PyObject *self, PyObject *args) { PythonQtStdOutRedirect* s = (PythonQtStdOutRedirect*)self; if (s->_cb) { char *string; if (!PyArg_ParseTuple(args, "s", &string)) return NULL; if (s->softspace > 0) { (*s->_cb)(QString("")); s->softspace = 0; } (*s->_cb)(QString(string)); } return Py_BuildValue(""); } static PyObject *PythonQtStdOutRedirect_flush(PyObject *self, PyObject *args) { return Py_BuildValue(""); } static PyMethodDef PythonQtStdOutRedirect_methods[] = { {"write", (PyCFunction)PythonQtStdOutRedirect_write, METH_VARARGS, "redirect the writing to a callback"}, {"flush", (PyCFunction)PythonQtStdOutRedirect_flush, METH_VARARGS, "flush the output, currently not implemented but needed for logging framework" }, {NULL} /* Sentinel */ }; static PyMemberDef PythonQtStdOutRedirect_members[] = { {"softspace", T_INT, offsetof(PythonQtStdOutRedirect, softspace), 0, "soft space flag" }, {NULL} /* Sentinel */ }; PyTypeObject PythonQtStdOutRedirectType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "PythonQtStdOutRedirect", /*tp_name*/ sizeof(PythonQtStdOutRedirect), /*tp_basicsize*/ 0, /*tp_itemsize*/ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ "PythonQtStdOutRedirect", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ PythonQtStdOutRedirect_methods, /* tp_methods */ PythonQtStdOutRedirect_members, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ PythonQtStdOutRedirect_new, /* tp_new */ }; fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtObjectPtr.h0000644000175000017500000001221011145517421022556 0ustar malexmalex#ifndef _PYTHONQTOBJECTPTR_H #define _PYTHONQTOBJECTPTR_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtObjectPtr.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include #include "PythonQtSystem.h" //! a smart pointer that stores a PyObject pointer and that handles reference counting automatically class PYTHONQT_EXPORT PythonQtObjectPtr { public: PythonQtObjectPtr():_object(NULL) {} PythonQtObjectPtr(const PythonQtObjectPtr &p):_object(NULL) { setObject(p.object()); } //! If the given variant holds a PythonQtObjectPtr, extract the value from it and hold onto the reference. This results in an increment of the reference count. PythonQtObjectPtr(const QVariant& variant):_object(NULL) { fromVariant(variant); } PythonQtObjectPtr(PyObject* o) { _object = o; if (o) Py_INCREF(_object); } ~PythonQtObjectPtr() { if (_object) Py_DECREF(_object); } //! If the given variant holds a PythonQtObjectPtr, extract the value from it and hold onto the reference. This results in an increment of the reference count. bool fromVariant(const QVariant& variant); PythonQtObjectPtr &operator=(const PythonQtObjectPtr &p) { setObject(p.object()); return *this; } PythonQtObjectPtr &operator=(PyObject* o) { setObject(o); return *this; } PythonQtObjectPtr &operator=(const QVariant& variant) { fromVariant(variant); return *this; } bool operator==( const PythonQtObjectPtr &p ) const { return object() == p.object(); } bool operator!= ( const PythonQtObjectPtr& p ) const { return !( *this == p ); } bool operator==( PyObject* p ) const { return object() == p; } bool operator!= ( PyObject* p ) const { return object() != p; } bool isNull() const { return !object(); } PyObject* operator->() const { return object(); } PyObject& operator*() const { return *( object() ); } operator PyObject*() const { return object(); } //! sets the object and passes the ownership (stealing the reference, in Python slang) void setNewRef(PyObject* o) { if (o != _object) { if (_object) Py_DECREF(_object); _object = o; } } PyObject* object() const { return _object; } //! evaluates the given script code in the context of this object and returns the result value QVariant evalScript(const QString& script, int start = Py_file_input); //! evaluates the given code and returns the result value (use Py_Compile etc. to create pycode from string) //! If pycode is NULL, a python error is printed. QVariant evalCode(PyObject* pycode); //! evaluates the given code in the context void evalFile(const QString& filename); //! add the given \c object to the \c module as a variable with \c name (it can be removed via clearVariable) void addObject(const QString& name, QObject* object); //! add the given variable to the module void addVariable(const QString& name, const QVariant& v); //! remove the given variable void removeVariable(const QString& name); //! get the variable with the \c name of the \c module, returns an invalid QVariant on error QVariant getVariable(const QString& name); //! call the given python object (in the scope of the current object), returns the result converted to a QVariant QVariant call(const QString& callable, const QVariantList& args); protected: void setObject(PyObject* o) { if (o != _object) { if (_object) Py_DECREF(_object); _object = o; if (_object) Py_INCREF(_object); } } private: PyObject* _object; }; // register it to the meta type system Q_DECLARE_METATYPE(PythonQtObjectPtr) #endiffontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtConversion.h0000644000175000017500000001253611145517421023022 0ustar malexmalex#ifndef _PYTHONQTCONVERSION_H #define _PYTHONQTCONVERSION_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtConversion.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQt.h" #include "PythonQtMisc.h" #include "PythonQtClassInfo.h" #include "PythonQtMethodInfo.h" #include //! a static class that offers methods for type conversion class PythonQtConv { public: //! get a ref counted True or False Python object static PyObject* GetPyBool(bool val); //! converts the Qt parameter given in \c data, interpreting it as a \c info parameter, into a Python object, static PyObject* ConvertQtValueToPython(const PythonQtMethodInfo::ParameterInfo& info, void* data); //! convert python object to Qt (according to the given parameter) and if the conversion should be strict, the meta object is passed in for enum resolving static void* ConvertPythonToQt(const PythonQtMethodInfo::ParameterInfo& info, PyObject* obj, bool strict, const QMetaObject* meta); //! creates a data storage for the passed parameter type and returns a void pointer to be set as arg[0] of qt_metacall static void* CreateQtReturnValue(const PythonQtMethodInfo::ParameterInfo& info); //! converts QString to Python string (unicode!) static PyObject* QStringToPyObject(const QString& str); //! converts QStringList to Python tuple static PyObject* QStringListToPyObject(const QStringList& list); //! converts QStringList to Python list static PyObject* QStringListToPyList(const QStringList& list); //! get string representation of py object static QString PyObjGetRepresentation(PyObject* val); //! get string value from py object static QString PyObjGetString(PyObject* val) { bool ok; QString s = PyObjGetString(val, false, ok); return s; } //! get string value from py object static QString PyObjGetString(PyObject* val, bool strict, bool &ok); //! get bytes from py object static QByteArray PyObjGetBytes(PyObject* val, bool strict, bool &ok); //! get int from py object static int PyObjGetInt(PyObject* val, bool strict, bool &ok); //! get int64 from py object static qint64 PyObjGetLongLong(PyObject* val, bool strict, bool &ok); //! get int64 from py object static quint64 PyObjGetULongLong(PyObject* val, bool strict, bool &ok); //! get double from py object static double PyObjGetDouble(PyObject* val, bool strict, bool &ok); //! get bool from py object static bool PyObjGetBool(PyObject* val, bool strict, bool &ok); //! create a string list from python sequence static QStringList PyObjToStringList(PyObject* val, bool strict, bool& ok); //! convert python object to qvariant, if type is given it will try to create a qvariant of that type, otherwise //! it will guess from the python type static QVariant PyObjToQVariant(PyObject* val, int type = -1); //! convert QVariant from PyObject static PyObject* QVariantToPyObject(const QVariant& v); static PyObject* QVariantMapToPyObject(const QVariantMap& m); static PyObject* QVariantListToPyObject(const QVariantList& l); public: static PythonQtValueStorage global_valueStorage; static PythonQtValueStorage global_ptrStorage; static PythonQtValueStorage global_variantStorage; protected: //! converts the Qt parameter given in \c data, interpreting it as a \c type registered qvariant/meta type, into a Python object, static PyObject* ConvertQtValueToPythonInternal(int type, void* data); //! converts the list of pointers of given type to Python static PyObject* ConvertQListWithPointersToPython(QList* list, const QByteArray& type); //! tries to convert the python object to a QList of pointers to \c type objects, returns true on success static bool ConvertPythonListToQListOfType(PyObject* obj, QList* list, const QByteArray& type, bool strict); }; #endif fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtConversion.cpp0000644000175000017500000010116311145517421023350 0ustar malexmalex/* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtConversion.cpp // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include "PythonQtConversion.h" #include "PythonQtVariants.h" #include "PythonQtVariantWrapper.h" #include #include #include PythonQtValueStorage PythonQtConv::global_valueStorage; PythonQtValueStorage PythonQtConv::global_ptrStorage; PythonQtValueStorage PythonQtConv::global_variantStorage; PyObject* PythonQtConv::GetPyBool(bool val) { PyObject* r = val?Py_True:Py_False; Py_INCREF(r); return r; } PyObject* PythonQtConv::ConvertQtValueToPython(const PythonQtMethodInfo::ParameterInfo& info, void* data) { if (info.typeId == QMetaType::Void) { Py_INCREF(Py_None); return Py_None; } else { if (info.isPointer && (info.typeId == PythonQtMethodInfo::Unknown)) { // try to convert the pointer to a Python Object PyObject* pyObj = PythonQt::priv()->wrapPtr(*((void**)data), info.name); if (pyObj) { return pyObj; } else { std::cerr << "unknown pointer type " << info.name.data() << ", in " << __FILE__ << ":" << __LINE__ << std::endl; Py_INCREF(Py_None); return Py_None; } } else if (info.isPointer && (info.typeId == QMetaType::Char)) { // a char ptr will probably be a null terminated string, so we support that: return PyString_FromString(*((char**)data)); } else { if (info.typeId == PythonQtMethodInfo::Unknown || info.typeId >= QMetaType::User) { if (info.name.startsWith("QList<")) { QByteArray innerType = info.name.mid(6,info.name.length()-7); if (innerType.endsWith("*")) { innerType.truncate(innerType.length()-1); return ConvertQListWithPointersToPython((QList*)data, innerType); } } } // handle values that are not yet handled and not pointers return ConvertQtValueToPythonInternal(info.typeId, data); } } } PyObject* PythonQtConv::ConvertQtValueToPythonInternal(int type, void* data) { switch (type) { case QMetaType::Void: Py_INCREF(Py_None); return Py_None; case QMetaType::Char: return PyInt_FromLong(*((char*)data)); case QMetaType::UChar: return PyInt_FromLong(*((unsigned char*)data)); case QMetaType::Short: return PyInt_FromLong(*((short*)data)); case QMetaType::UShort: return PyInt_FromLong(*((unsigned short*)data)); case QMetaType::Long: return PyInt_FromLong(*((long*)data)); case QMetaType::ULong: // does not fit into simple int of python return PyLong_FromUnsignedLong(*((unsigned long*)data)); case QMetaType::Bool: return PythonQtConv::GetPyBool(*((bool*)data)); case QMetaType::Int: return PyInt_FromLong(*((int*)data)); case QMetaType::UInt: return PyInt_FromLong(*((unsigned int*)data)); case QMetaType::QChar: return PyInt_FromLong(*((short*)data)); case QMetaType::Float: return PyFloat_FromDouble(*((float*)data)); case QMetaType::Double: return PyFloat_FromDouble(*((double*)data)); case QMetaType::LongLong: return PyLong_FromLongLong(*((qint64*)data)); case QMetaType::ULongLong: return PyLong_FromUnsignedLongLong(*((quint64*)data)); case QMetaType::QByteArray: { QByteArray* v = (QByteArray*) data; return PyString_FromStringAndSize(*v, v->size()); } case QMetaType::QVariantMap: return PythonQtConv::QVariantMapToPyObject(*((QVariantMap*)data)); case QMetaType::QVariantList: return PythonQtConv::QVariantListToPyObject(*((QVariantList*)data)); case QMetaType::QString: return PythonQtConv::QStringToPyObject(*((QString*)data)); case QMetaType::QStringList: return PythonQtConv::QStringListToPyObject(*((QStringList*)data)); case PythonQtMethodInfo::Variant: return PythonQtConv::QVariantToPyObject(*((QVariant*)data)); case QMetaType::QObjectStar: case QMetaType::QWidgetStar: return PythonQt::priv()->wrapQObject(*((QObject**)data)); // the following cases could be handled by the default case, but it is faster to do it with // direct casts: case QMetaType::QDate: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QDate*)data))); case QMetaType::QTime: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QTime*)data))); case QMetaType::QDateTime: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QDateTime*)data))); case QMetaType::QRect: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QRect*)data))); case QMetaType::QSize: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QSize*)data))); case QMetaType::QPoint: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QPoint*)data))); case QMetaType::QColor: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QColor*)data))); case QMetaType::QPixmap: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QPixmap*)data))); case QMetaType::QUrl: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QUrl*)data))); case QMetaType::QRectF: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QRectF*)data))); case QMetaType::QSizeF: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QSizeF*)data))); case QMetaType::QLine: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QLine*)data))); case QMetaType::QLineF: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QLineF*)data))); case QMetaType::QPointF: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QPointF*)data))); case QMetaType::QRegExp: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QRegExp*)data))); case QMetaType::QBitArray: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QBitArray*)data))); case QMetaType::QLocale: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QLocale*)data))); case QMetaType::QFont: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QFont*)data))); case QMetaType::QBrush: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QBrush*)data))); case QMetaType::QPalette: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QPalette*)data))); case QMetaType::QIcon: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(qVariantFromValue(*((QIcon*)data))); case QMetaType::QImage: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QImage*)data))); case QMetaType::QPolygon: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QPolygon*)data))); case QMetaType::QRegion: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QRegion*)data))); case QMetaType::QBitmap: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(qVariantFromValue(*((QBitmap*)data))); case QMetaType::QCursor: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QCursor*)data))); case QMetaType::QSizePolicy: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(QVariant(*((QSizePolicy*)data))); case QMetaType::QKeySequence: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(qVariantFromValue(*((QKeySequence*)data))); case QMetaType::QPen: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(qVariantFromValue(*((QPen*)data))); case QMetaType::QTextLength: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(qVariantFromValue(*((QTextLength*)data))); case QMetaType::QTextFormat: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(qVariantFromValue(*((QTextFormat*)data))); case QMetaType::QMatrix: return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(qVariantFromValue(*((QMatrix*)data))); default: if (PythonQt::priv()->isPythonQtObjectPtrMetaId(type)) { PyObject* o = ((PythonQtObjectPtr*)data)->object(); Py_INCREF(o); return o; } else { if (type != PythonQtMethodInfo::Unknown) { QVariant v(type, data); if (v.isValid()) { return (PyObject*)PythonQt::priv()->createNewPythonQtVariantWrapper(v); } } std::cerr << "Unknown type that can not be converted to Python: " << type << ", in " << __FILE__ << ":" << __LINE__ << std::endl; } } Py_INCREF(Py_None); return Py_None; } void* PythonQtConv::CreateQtReturnValue(const PythonQtMethodInfo::ParameterInfo& info) { void* ptr = NULL; if (info.isPointer) { PythonQtValueStorage_ADD_VALUE(global_ptrStorage, void*, NULL, ptr); } else { switch (info.typeId) { case QMetaType::Char: case QMetaType::UChar: case QMetaType::Short: case QMetaType::UShort: case QMetaType::Long: case QMetaType::ULong: case QMetaType::Bool: case QMetaType::Int: case QMetaType::UInt: case QMetaType::QChar: case QMetaType::Float: case QMetaType::Double: PythonQtValueStorage_ADD_VALUE(global_valueStorage, long, 0, ptr); break; case PythonQtMethodInfo::Variant: PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, 0, ptr); // return the ptr to the variant break; default: if (info.typeId == PythonQtMethodInfo::Unknown) { // check if we have a QList of pointers, which we can circumvent with a QList if (info.name.startsWith("QList<")) { QByteArray innerType = info.name.mid(6,info.name.length()-7); if (innerType.endsWith("*")) { static int id = QMetaType::type("QList"); PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QVariant::Type(id), ptr); // return the constData pointer that will be filled with the result value later on ptr = (void*)((QVariant*)ptr)->constData(); } } } if (!ptr) { // everything else is stored in a QVariant... PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QVariant::Type(info.typeId), ptr); // return the constData pointer that will be filled with the result value later on ptr = (void*)((QVariant*)ptr)->constData(); } } } return ptr; } void* PythonQtConv::ConvertPythonToQt(const PythonQtMethodInfo::ParameterInfo& info, PyObject* obj, bool strict, const QMetaObject* meta) { bool ok; void* ptr = NULL; if (info.isPointer) { if (obj->ob_type == &PythonQtWrapper_Type) { PythonQtWrapper* wrap = (PythonQtWrapper*)obj; // c++ wrapper, check if the class names of the c++ objects match if (wrap->_info->isCPPWrapper()) { //TODO: we could support inheritance on cpp wrappers as well if (wrap->_info->wrappedCPPClassName() == info.name) { PythonQtValueStorage_ADD_VALUE(global_ptrStorage, void*, wrap->_wrappedPtr, ptr); } else { // not matching } } else { if (wrap->_info->inherits(info.name)) { QObject* myObject = wrap->_obj; PythonQtValueStorage_ADD_VALUE(global_ptrStorage, void*, myObject, ptr); } else { // not matching } } } else if (info.typeId == QMetaType::Char || info.typeId == QMetaType::UChar) { QString str = PyObjGetString(obj, strict, ok); if (ok) { void* ptr2 = NULL; PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QVariant(str.toUtf8()), ptr2); PythonQtValueStorage_ADD_VALUE(global_ptrStorage, void*, (((QByteArray*)((QVariant*)ptr2)->constData())->data()), ptr); } } else if (info.name == "PyObject") { // handle low level PyObject directly PythonQtValueStorage_ADD_VALUE(global_ptrStorage, void*, obj, ptr); } else if (obj == Py_None) { // None is treated as a NULL ptr PythonQtValueStorage_ADD_VALUE(global_ptrStorage, void*, NULL, ptr); } else { // if we are not strict, we try if we are passed a 0 integer if (!strict) { bool ok; int value = PyObjGetInt(obj, true, ok); if (ok && value==0) { PythonQtValueStorage_ADD_VALUE(global_ptrStorage, void*, NULL, ptr); } } // EXTRA: we could support pointers to other simple types, but this would not make sense in most situations } } else { // not a pointer switch (info.typeId) { case QMetaType::Char: { int val = PyObjGetInt(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, char, val, ptr); } } break; case QMetaType::UChar: { int val = PyObjGetInt(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, unsigned char, val, ptr); } } break; case QMetaType::Short: { int val = PyObjGetInt(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, short, val, ptr); } } break; case QMetaType::UShort: { int val = PyObjGetInt(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, unsigned short, val, ptr); } } break; case QMetaType::Long: { long val = (long)PyObjGetLongLong(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, long, val, ptr); } } break; case QMetaType::ULong: { unsigned long val = (unsigned long)PyObjGetLongLong(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, unsigned long, val, ptr); } } break; case QMetaType::Bool: { bool val = PyObjGetBool(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, bool, val, ptr); } } break; case QMetaType::Int: { int val = PyObjGetInt(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, int, val, ptr); } } break; case QMetaType::UInt: { unsigned int val = (unsigned int)PyObjGetLongLong(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, unsigned int, val, ptr); } } break; case QMetaType::QChar: { int val = PyObjGetInt(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, short, val, ptr); } } break; case QMetaType::Float: { float val = (float)PyObjGetDouble(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, float, val, ptr); } } break; case QMetaType::Double: { double val = (double)PyObjGetDouble(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, double, val, ptr); } } break; case QMetaType::LongLong: { qint64 val = PyObjGetLongLong(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, qint64, val, ptr); } } break; case QMetaType::ULongLong: { quint64 val = PyObjGetULongLong(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, quint64, val, ptr); } } break; case QMetaType::QByteArray: { QByteArray bytes = PyObjGetBytes(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QVariant(bytes), ptr); ptr = (void*)((QVariant*)ptr)->constData(); } } break; case QMetaType::QString: { QString str = PyObjGetString(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QVariant(str), ptr); ptr = (void*)((QVariant*)ptr)->constData(); } } break; case QMetaType::QStringList: { QStringList l = PyObjToStringList(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QVariant(l), ptr); ptr = (void*)((QVariant*)ptr)->constData(); } } break; case PythonQtMethodInfo::Variant: { QVariant v = PyObjToQVariant(obj); if (v.isValid()) { PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, v, ptr); } } break; default: { if (info.typeId == PythonQtMethodInfo::Unknown) { // check for enum case if (PythonQt::priv()->isEnumType(meta, info.name)) { unsigned int val = (unsigned int)PyObjGetLongLong(obj, strict, ok); if (ok) { PythonQtValueStorage_ADD_VALUE(global_valueStorage, unsigned int, val, ptr); return ptr; } else { return NULL; } } } if (info.typeId == PythonQtMethodInfo::Unknown || info.typeId >= QMetaType::User) { // check for QList case, where we will use a QList QVariant if (info.name.startsWith("QList<")) { QByteArray innerType = info.name.mid(6,info.name.length()-7); if (innerType.endsWith("*")) { innerType.truncate(innerType.length()-1); static int id = QMetaType::type("QList"); PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QVariant::Type(id), ptr); ptr = (void*)((QVariant*)ptr)->constData(); ok = ConvertPythonListToQListOfType(obj, (QList*)ptr, innerType, strict); if (ok) { return ptr; } else { return NULL; } } } } // for all other types, we use the same qvariant conversion and pass out the constData of the variant: QVariant v = PyObjToQVariant(obj, info.typeId); if (v.isValid()) { PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, v, ptr); ptr = (void*)((QVariant*)ptr)->constData(); } } } } return ptr; } QStringList PythonQtConv::PyObjToStringList(PyObject* val, bool strict, bool& ok) { QStringList v; ok = false; // if we are strict, we do not want to convert a string to a stringlist // (strings in python are detected to be sequences) if (strict && (val->ob_type == &PyString_Type || PyUnicode_Check(val))) { ok = false; return v; } if (PySequence_Check(val)) { int count = PySequence_Size(val); for (int i = 0;iob_type == &PyString_Type) { r = QString(PyString_AS_STRING(val)); } else if (PyUnicode_Check(val)) { #ifdef WIN32 r = QString::fromUtf16(PyUnicode_AS_UNICODE(val)); #else PyObject *ptmp = PyUnicode_AsUTF8String(val); if(ptmp) { r = QString::fromUtf8(PyString_AS_STRING(ptmp)); Py_DECREF(ptmp); } #endif } else if (!strict) { // EXTRA: could also use _Unicode, but why should we? PyObject* str = PyObject_Str(val); if (str) { r = QString(PyString_AS_STRING(str)); Py_DECREF(str); } else { ok = false; } } else { ok = false; } return r; } QByteArray PythonQtConv::PyObjGetBytes(PyObject* val, bool strict, bool& ok) { QByteArray r; ok = true; if (val->ob_type == &PyString_Type) { long size = PyString_GET_SIZE(val); r = QByteArray(PyString_AS_STRING(val), size); } else { ok = false; } return r; } bool PythonQtConv::PyObjGetBool(PyObject* val, bool strict, bool &ok) { bool d = false; ok = false; if (val == Py_False) { d = false; ok = true; } else if (val == Py_True) { d = true; ok = true; } else if (!strict) { d = PyObjGetInt(val, false, ok)!=0; ok = true; } return d; } int PythonQtConv::PyObjGetInt(PyObject* val, bool strict, bool &ok) { int d = 0; ok = true; if (val->ob_type == &PyInt_Type) { d = PyInt_AS_LONG(val); } else if (!strict) { if (val->ob_type == &PyFloat_Type) { d = floor(PyFloat_AS_DOUBLE(val)); } else if (val->ob_type == &PyLong_Type) { // handle error on overflow! d = PyLong_AsLong(val); } else if (val == Py_False) { d = 0; } else if (val == Py_True) { d = 1; } else { ok = false; } } else { ok = false; } return d; } qint64 PythonQtConv::PyObjGetLongLong(PyObject* val, bool strict, bool &ok) { qint64 d = 0; ok = true; if (val->ob_type == &PyInt_Type) { d = PyInt_AS_LONG(val); } else if (val->ob_type == &PyLong_Type) { d = PyLong_AsLongLong(val); } else if (!strict) { if (val->ob_type == &PyFloat_Type) { d = floor(PyFloat_AS_DOUBLE(val)); } else if (val == Py_False) { d = 0; } else if (val == Py_True) { d = 1; } else { ok = false; } } else { ok = false; } return d; } quint64 PythonQtConv::PyObjGetULongLong(PyObject* val, bool strict, bool &ok) { quint64 d = 0; ok = true; if (val->ob_type == &PyInt_Type) { d = PyInt_AS_LONG(val); } else if (val->ob_type == &PyLong_Type) { d = PyLong_AsLongLong(val); } else if (!strict) { if (val->ob_type == &PyFloat_Type) { d = floor(PyFloat_AS_DOUBLE(val)); } else if (val == Py_False) { d = 0; } else if (val == Py_True) { d = 1; } else { ok = false; } } else { ok = false; } return d; } double PythonQtConv::PyObjGetDouble(PyObject* val, bool strict, bool &ok) { double d = 0; ok = true; if (val->ob_type == &PyFloat_Type) { d = PyFloat_AS_DOUBLE(val); } else if (!strict) { if (val->ob_type == &PyInt_Type) { d = PyInt_AS_LONG(val); } else if (val->ob_type == &PyLong_Type) { d = PyLong_AsLong(val); } else if (val == Py_False) { d = 0; } else if (val == Py_True) { d = 1; } else { ok = false; } } else { ok = false; } return d; } QVariant PythonQtConv::PyObjToQVariant(PyObject* val, int type) { QVariant v; bool ok = true; if (type==-1) { // no special type requested if (val->ob_type==&PyString_Type || val->ob_type==&PyUnicode_Type) { type = QVariant::String; } else if (val->ob_type==&PyInt_Type) { type = QVariant::Int; } else if (val->ob_type==&PyLong_Type) { type = QVariant::LongLong; } else if (val->ob_type==&PyFloat_Type) { type = QVariant::Double; } else if (val == Py_False || val == Py_True) { type = QVariant::Bool; } else if (val->ob_type == &PythonQtWrapper_Type) { PythonQtWrapper* wrap = (PythonQtWrapper*)val; // c++ wrapper, check if the class names of the c++ objects match if (wrap->_info->isCPPWrapper()) { // is this worth anything? we loose the knowledge of the cpp object type v = qVariantFromValue(wrap->_wrappedPtr); } else { QObject* myObject = wrap->_obj; v = qVariantFromValue(myObject); } return v; } else if (val->ob_type==&PyDict_Type) { type = QVariant::Map; } else if (val->ob_type==&PyList_Type || val->ob_type==&PyTuple_Type || PySequence_Check(val)) { type = QVariant::List; } else if (val == Py_None) { // none is invalid type = QVariant::Invalid; } else if (val->ob_type == &PythonQtVariantWrapper_Type) { PythonQtVariantWrapper* varWrap = (PythonQtVariantWrapper*)val; if (varWrap->_variant->userType() == type) { v = *varWrap->_variant; return v; } } else { // this used to be: // type = QVariant::String; // but now we want to transport the Python Objects directly: PythonQtObjectPtr o(val); v = qVariantFromValue(o); return v; } } // special type request: switch (type) { case QVariant::Invalid: return v; break; case QVariant::Int: { int d = PyObjGetInt(val, false, ok); if (ok) return QVariant(d); } break; case QVariant::UInt: { int d = PyObjGetInt(val, false,ok); if (ok) v = QVariant((unsigned int)d); } break; case QVariant::Bool: { int d = PyObjGetBool(val,false,ok); if (ok) v = QVariant((bool)(d!=0)); } break; case QVariant::Double: { double d = PyObjGetDouble(val,false,ok); if (ok) v = QVariant(d); break; } case QMetaType::Float: { float d = (float) PyObjGetDouble(val,false,ok); if (ok) v = qVariantFromValue(d); break; } case QMetaType::Long: { long d = (long) PyObjGetLongLong(val,false,ok); if (ok) v = qVariantFromValue(d); break; } case QMetaType::ULong: { unsigned long d = (unsigned long) PyObjGetLongLong(val,false,ok); if (ok) v = qVariantFromValue(d); break; } case QMetaType::Short: { short d = (short) PyObjGetInt(val,false,ok); if (ok) v = qVariantFromValue(d); break; } case QMetaType::UShort: { unsigned short d = (unsigned short) PyObjGetInt(val,false,ok); if (ok) v = qVariantFromValue(d); break; } case QMetaType::Char: { char d = (char) PyObjGetInt(val,false,ok); if (ok) v = qVariantFromValue(d); break; } case QMetaType::UChar: { unsigned char d = (unsigned char) PyObjGetInt(val,false,ok); if (ok) v = qVariantFromValue(d); break; } case QVariant::ByteArray: case QVariant::String: { bool ok; v = QVariant(PyObjGetString(val, false, ok)); } break; // these are important for MeVisLab case QVariant::Map: { if (PyMapping_Check(val)) { QMap map; PyObject* items = PyMapping_Items(val); if (items) { int count = PyList_Size(items); PyObject* value; PyObject* key; PyObject* tuple; for (int i = 0;iob_type == &PythonQtVariantWrapper_Type) { PythonQtVariantWrapper* varWrap = (PythonQtVariantWrapper*)val; if (varWrap->_variant->userType() == type) { v = *varWrap->_variant; } } else { v = QVariant(); } } return v; } PyObject* PythonQtConv::QStringToPyObject(const QString& str) { if (str.isNull()) { return PyString_FromString(""); } else { #ifdef WIN32 // return PyString_FromString(str.toLatin1().data()); return PyUnicode_FromUnicode(str.utf16(), str.length()); #else return PyUnicode_DecodeUTF16((const char*)str.utf16(), str.length()*2, NULL, NULL); #endif } } PyObject* PythonQtConv::QStringListToPyObject(const QStringList& list) { PyObject* result = PyTuple_New(list.count()); int i = 0; QString str; foreach (str, list) { PyTuple_SET_ITEM(result, i, PythonQtConv::QStringToPyObject(str)); i++; } // why is the error state bad after this? PyErr_Clear(); return result; } PyObject* PythonQtConv::QStringListToPyList(const QStringList& list) { PyObject* result = PyList_New(list.count()); int i = 0; for (QStringList::ConstIterator it = list.begin(); it!=list.end(); ++it) { PyList_SET_ITEM(result, i, PythonQtConv::QStringToPyObject(*it)); i++; } return result; } PyObject* PythonQtConv::QVariantToPyObject(const QVariant& v) { return ConvertQtValueToPythonInternal(v.userType(), (void*)v.constData()); } PyObject* PythonQtConv::QVariantMapToPyObject(const QVariantMap& m) { PyObject* result = PyDict_New(); QVariantMap::const_iterator t = m.constBegin(); PyObject* key; PyObject* val; for (;t!=m.end();t++) { key = QStringToPyObject(t.key()); val = QVariantToPyObject(t.value()); PyDict_SetItem(result, key, val); Py_DECREF(key); Py_DECREF(val); } return result; } PyObject* PythonQtConv::QVariantListToPyObject(const QVariantList& l) { PyObject* result = PyTuple_New(l.count()); int i = 0; QVariant v; foreach (v, l) { PyTuple_SET_ITEM(result, i, PythonQtConv::QVariantToPyObject(v)); i++; } // why is the error state bad after this? PyErr_Clear(); return result; } PyObject* PythonQtConv::ConvertQListWithPointersToPython(QList* list, const QByteArray& type) { PyObject* result = PyTuple_New(list->count()); int i = 0; foreach (void* value, *list) { PyTuple_SET_ITEM(result, i, PythonQt::priv()->wrapPtr(value, type)); i++; } return result; } bool PythonQtConv::ConvertPythonListToQListOfType(PyObject* obj, QList* list, const QByteArray& type, bool strict) { bool result = false; if (PySequence_Check(obj)) { result = true; int count = PySequence_Size(obj); PyObject* value; for (int i = 0;iob_type == &PythonQtWrapper_Type) { PythonQtWrapper* wrap = (PythonQtWrapper*)value; // c++ wrapper, check if the class names of the c++ objects match if (wrap->_info->isCPPWrapper()) { //TODO: we could support inheritance on cpp wrappers as well if (wrap->_info->wrappedCPPClassName() == type) { list->append(wrap->_wrappedPtr); } else { result = false; break; } } else { if (wrap->_info->inherits(type)) { QObject* myObject = wrap->_obj; list->append((void*)myObject); } else { result = false; break; } } } } } return result; } fontmatrix-0.6.0+svn20110930/pythonqt/src/PythonQtMisc.h0000644000175000017500000000731311145517421021565 0ustar malexmalex#ifndef _PYTHONQTMISC_H #define _PYTHONQTMISC_H /* * * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved. * * 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * 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 * * Contact information: MeVis Research GmbH, Universitaetsallee 29, * 28359 Bremen, Germany or: * * http://www.mevis.de * */ //---------------------------------------------------------------------------------- /*! // \file PythonQtMisc.h // \author Florian Link // \author Last changed by $Author: florian $ // \date 2006-05 */ //---------------------------------------------------------------------------------- #include #define PythonQtValueStorage_ADD_VALUE(store, type, value, ptr) \ { type* item = (type*)store.nextValuePtr(); \ *item = value; \ ptr = (void*)item; \ } //! stores a position in the PythonQtValueStorage class PythonQtValueStoragePosition { public: PythonQtValueStoragePosition() { chunkIdx = 0; chunkOffset = 0; } int chunkIdx; int chunkOffset; }; //! a helper class that stores basic C++ value types in chunks template class PythonQtValueStorage { public: PythonQtValueStorage() { _chunkIdx = 0; _chunkOffset = 0; _currentChunk = new T[chunkEntries]; _chunks.append(_currentChunk); }; //! clear all memory void clear() { T* chunk; foreach(chunk, _chunks) { delete[]chunk; } } //! reset the storage to 0 (without freeing memory, thus caching old entries for reuse) void reset() { _chunkIdx = 0; _chunkOffset = 0; _currentChunk = _chunks.at(0); } //! get the current position to be restored with setPos void getPos(PythonQtValueStoragePosition & pos) { pos.chunkIdx = _chunkIdx; pos.chunkOffset = _chunkOffset; } //! set the current position (without freeing memory, thus caching old entries for reuse) void setPos(const PythonQtValueStoragePosition& pos) { _chunkOffset = pos.chunkOffset; if (_chunkIdx != pos.chunkIdx) { _chunkIdx = pos.chunkIdx; _currentChunk = _chunks.at(_chunkIdx); } } //! add one default constructed value and return the pointer to it T* nextValuePtr() { if (_chunkOffset>=chunkEntries) { _chunkIdx++; if (_chunkIdx >= _chunks.size()) { T* newChunk = new T[chunkEntries]; _chunks.append(newChunk); _currentChunk = newChunk; } else { _currentChunk = _chunks.at(_chunkIdx); } _chunkOffset = 0; } T* newEntry = _currentChunk + _chunkOffset; _chunkOffset++; return newEntry; }; private: QList _chunks; int _chunkIdx; int _chunkOffset; T* _currentChunk; }; #endif fontmatrix-0.6.0+svn20110930/fontmatrix.desktop0000644000175000017500000000102111127205101020076 0ustar malexmalex[Desktop Entry] Version=1.0 Type=Application Name=Fontmatrix Comment=A font manager Comment[ru]=Программа для управления шрифтами Comment[fi]=Työkalu fonttien hallintaan Categories=Graphics;VectorGraphics; Exec=fontmatrix Icon=fontmatrix Terminal=false GenericName=Font Manager GenericName[fr]=Gestion des Polices GenericName[ru]=Управление шрифтами GenericName[fi]=Fonttien hallinta TryExec=fontmatrix X-StandardInstall=false StartupWMClass=fontmatrix X-KDE-SubstituteUID=false fontmatrix-0.6.0+svn20110930/dodict/0000755000175000017500000000000011641435631015602 5ustar malexmalexfontmatrix-0.6.0+svn20110930/dodict/dodict.cpp0000644000175000017500000001115311176611035017552 0ustar malexmalex// // C++ Implementation: dodict // // Description: dodict is a little utility that should // help begining a dict file // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include #include #include #include #include #include #include #include #include QMap CatDB; // Intended to import stuff from m17n project // This function just takes the _content_ of the "category" list void importCats(QString path) { QFile cf(path); if(!cf.open(QIODevice::ReadOnly | QIODevice::Text )) { qDebug()<< "Unable to open " << cf.fileName(); return; } while (!cf.atEnd()) { QByteArray rLine( cf.readLine() ); QString line(rLine.trimmed()); if(line.startsWith(';')) continue; for(int i(0);i "<< tokenList[1].mid(1); } else if(tokenList.count() == 3) { int ucsB(tokenList[0].toInt(&ok,16)); int ucsE(tokenList[1].toInt(&ok,16)); for(int ucs(ucsB);ucs <= ucsE ; ++ucs) { CatDB[ucs].append(tokenList[2].mid(1)); qDebug() < "<< tokenList[2].mid(1); } } else { qDebug() <<"ERROR RECORD COUNT ("< i + 1) { QString barg(args.at(i+1)); begin = barg.toInt(); } } if( args.at(i) == "-e" || args.at(i) == "--end") { if(args.count() > i + 1) { QString earg(args.at(i+1)); end = earg.toInt(); } } if( args.at(i) == "-s" || args.at(i) == "--script") { if(args.count() > i + 1) { lang = args.at(i+1); } } if( args.at(i) == "-c" || args.at(i) == "--catfile") { if(args.count() > i + 1) { catfile = args.at(i+1); } } } if (lang.isEmpty() || begin == 0 || end == 0) { std::cerr << "\tGame Over!\n\tinsert coin\n"; return 1; } else { QString msgD("Begining of range is :\t" + QString::number(begin)); QString msgE("End of range is :\t" + QString::number(end)); QString msgL("Script is :\t" + lang); QString msgC("Category file is :\t" + catfile); std::cout << msgD.toStdString() << "\n" << msgE.toStdString() << "\n"<< msgL.toStdString() << "\n"<< msgC.toStdString() << "\n"; } bool hasDB(false); if(!catfile.isEmpty()) { importCats(catfile); if(!CatDB.isEmpty()) hasDB = true; } QFile file(lang + ".dict"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { QString msg("Unable to open "+ file.fileName()); std::cout << msg.toStdString(); return 1; } QTextStream out(&file); out << "% Dict file generated by dodict for \"" + lang + "\", please edit it.\n"; out << "% Records are of the form : FFFF|prop1|prop2\n"; out << "% Where FFFF is a raw hex value representing a code point in Unicode space\n"; out << "% and \"props\" are arbitrary ascii strings.\n"; out << "% Records begining by \"\%\" are comments.\n"; for(int idx(begin); idx <= end; ++idx) { QString format("%2"); QString formatted( format.arg( idx, 4, 16, QChar('0')) ); if(hasDB) { if(CatDB.contains(idx)) { QStringList cats(CatDB[idx]); for(int c(0); c < cats.count() ; ++c) formatted += "|" + cats[c]; } } QString it("\% "+ QString(idx) +" \n"+ formatted +"\n"); out << it ; } file.close(); std::cout << "Successfully created "<< file.fileName().toStdString() << "\n"; return 0; } fontmatrix-0.6.0+svn20110930/dodict/CMakeLists.txt0000644000175000017500000000111211176611035020332 0ustar malexmalexPROJECT(dodict) # ugly name CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0) SET (QT_MIN_VERSION "4.4.0") FIND_PACKAGE(Qt4 REQUIRED) SET (QT_MT_REQUIRED TRUE) # SET (QT_USE_QTXML TRUE ) # SET (QT_USE_QTSVG TRUE ) # SET (QT_USE_QTSQL TRUE ) # SET (QT_USE_QTNETWORK TRUE ) # SET (QT_USE_QTWEBKIT TRUE ) # SET (QT_USE_QTOPENGL TRUE ) INCLUDE( ${QT_USE_FILE} ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${QT_INCLUDE_DIR} ${QT_QT_INCLUDE_DIR} ) SET(dodict_SOURCES dodict.cpp ) ADD_EXECUTABLE(dodict ${dodict_SOURCES}) target_link_libraries(dodict ${QT_LIBRARIES})fontmatrix-0.6.0+svn20110930/fontmatrix.png0000644000175000017500000000475311024322240017230 0ustar malexmalexPNG  IHDR00WsBIT|d pHYs33o~tEXtSoftwarewww.inkscape.org< hIDAThř{lT{^ W%M 1ͣ RQC*j *T!+&QhT%RREMihDQ%JSp!S;HHcp sm{>M433oٙJDHg , >K[+05H{Cq? ZtA~ ."IGt{A) "Pp MfJ)&"#R#"gN y$ 685|ZZ;.]Z=>_+p0nGE~mm_@ee}Ѐ罹9jYekYL22cwD2@mmmGș3g(da04f+NħG,Ğ={ ن7-o~"P΁:: ӧOpQr YjT39{]vqRox';2y4Mxu8.X?  GL|mɒ%:tuq<:W9zz"\0ȵPfZ0RwuueرcQ*U̔R,_.V_',ԚnۦO^ ~ݜx)CDfvwwOˮgq{=uUJJJŋ#"v JQ5i۬|x /˧[m!W)+M*yVJ) * BGڱcW۶:e V6䠀snL/[m6?N`, aӝkqD䨈<)"ggNLSS---imk=)=a,Z~ϿG6m~P(^|HD$\>{nJJJ6mׯ7Ě5k(*,pF&~~_lf”b(pt]43!YJMm۶tRVXAkkkJeqpSkL94dr1^y)&r9g(~~Gew^n6S֙0a 5g?nm4/_B }:STV<.>]x(T[{!/ʢ*;m.PUUEqq16lL7.~~%iF_g0 X @N," wX'aټy3[la9 47'+LW; i24imB'׏ *co37oZ'>>AapŶ9cDO[n4g}q"2}Ӛ"àsӘ1^?`1V{zԚ 12y`:"Ӛ^>wNÜعs'/eQVVFwwwLJ@2)PC`֌,,:Eض(:zѫd'v @i7a^m2MYT8Ips0Hf ̏fJ;0RQj`LxP )@U{{x+Z6=_ "0RE&Sfu{{x5ZxbĈI;"Eڻ{WϽw !Ss\Y o1:JGU ;+/_V}og$7쑼$Y*id(B:S="n4Yr?mi@m-PNLŻ"c z&`R"RnWӝL$12X7 KcmEoˁU ඟyDN} X)"ċDm)F:7ρ2le*%( @Jץ3wtM|oaIENDB`fontmatrix-0.6.0+svn20110930/CMakeLists.txt0000644000175000017500000001715711451357547017117 0ustar malexmalex# Fontmatrix ./CMakeLists.txt v1 PROJECT(fontmatrix) # the name of your project CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0) SET (VERSION_MAJOR "0") SET (VERSION_MINOR "9") SET (VERSION_PATCH "99") SET (VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) ADD_DEFINITIONS(-DFONTMATRIX_VERSION_MAJOR=${VERSION_MAJOR} -DFONTMATRIX_VERSION_MINOR=${VERSION_MINOR} -DFONTMATRIX_VERSION_PATCH=${VERSION_PATCH}) MESSAGE(STATUS "Building Fontmatrix ${VERSION}") IF(UNIX AND NOT APPLE) SET (CMAKE_INSTALL_PREFIX /usr/local CACHE PATH "Installation path") SET (FONTMATRIX_BIN bin ) SET (FONTMATRIX_QMDIR "share/fontmatrix/qm" ) ENDIF(UNIX AND NOT APPLE) IF(APPLE) # SET (CMAKE_INSTALL_PREFIX /Applications CACHE PATH "Installation path") # SET (FONTMATRIX_BIN bin "") set( CMAKE_OSX_ARCHITECTURES i386 ) ENDIF(APPLE) IF(WIN32) SET (CMAKE_INSTALL_PREFIX c:/fontmatrix CACHE PATH "Installation path") SET (FONTMATRIX_BIN "") SET (FONTMATRIX_QMDIR "qm" ) ENDIF(WIN32) ADD_DEFINITIONS(-DPREFIX="${CMAKE_INSTALL_PREFIX}") MESSAGE(STATUS "Fontmatrix will be installed under ${CMAKE_INSTALL_PREFIX}") SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules") # Very generic definition, mainly to sort out bugs reported by mrdocs IF(APPLE) ADD_DEFINITIONS( -DPLATFORM_APPLE ) ENDIF(APPLE) #<< harfbuzz (shaper) IF(WANT_HARFBUZZ) # Since Harfbuzz source code is included into # FM source tree, it’s just a matter of activation # and « cohérence » ADD_DEFINITIONS( -DHAVE_HARFBUZZ ) SET(HARFBUZZSHAPER 1) MESSAGE(STATUS "Build Harbuzz shaper support") ENDIF(WANT_HARFBUZZ) #>> harfbuzz (shaper) #<< ICU IF(WANT_ICU) # SET(ICU_DIR ${CMAKE_MODULE_PATH}) FIND_PACKAGE(ICU) if(ICU_FOUND) MESSAGE(STATUS "ICU Found OK") ADD_DEFINITIONS( -DHAVE_ICU ) SET(ICUSHAPER 1) MESSAGE(STATUS "Build ICU shaper support") ELSE(ICU_FOUND) MESSAGE(FATAL_ERROR "ICU Not Found ARGH") ENDIF(ICU_FOUND) ENDIF(WANT_ICU) #>> ICU #<< m17n IF(WANT_M17N) # SET(M17N_DIR ${CMAKE_MODULE_PATH}) FIND_PACKAGE(M17N) if(M17N_FOUND) MESSAGE(STATUS "M17N Found OK") ADD_DEFINITIONS( -DHAVE_M17N ) SET(M17NSHAPER 1) MESSAGE(STATUS "Build m17n shaper support") ELSE(M17N_FOUND) MESSAGE(FATAL_ERROR "M17N Not Found ARGH") ENDIF(M17N_FOUND) ENDIF(WANT_M17N) #>> m17n IF(WANT_PODOFO) # SET(LIBPODOFO_DIR ${CMAKE_MODULE_PATH}) FIND_PACKAGE(LIBPODOFO) IF(LIBPODOFO_FOUND) MESSAGE(STATUS "PoDoFo Library Found OK") ADD_DEFINITIONS(-DHAVE_PODOFO) SET(PODOFO 1) ENDIF(LIBPODOFO_FOUND) ENDIF(WANT_PODOFO) # I can’t remember what it does :| ADD_DEFINITIONS( -DHIGH_PERF ) IF(CMAKE_BUILD_TYPE STREQUAL "Debug") MESSAGE(STATUS "Debug build") ADD_DEFINITIONS(-DBUILD_TYPE_DEBUG) ELSE(CMAKE_BUILD_TYPE STREQUAL "Debug") ADD_DEFINITIONS(-DQT_NO_DEBUG_OUTPUT) ENDIF(CMAKE_BUILD_TYPE STREQUAL "Debug") # A lot from Scribus #<< Qt SET (QT_MIN_VERSION "4.4.0") FIND_PACKAGE(Qt4 REQUIRED) SET (QT_MT_REQUIRED TRUE) SET (QT_USE_QTXML TRUE ) SET (QT_USE_QTSVG TRUE ) SET (QT_USE_QTSQL TRUE ) SET (QT_USE_QTNETWORK TRUE ) SET (QT_USE_QTWEBKIT TRUE ) SET (QT_USE_QTOPENGL TRUE ) INCLUDE( ${QT_USE_FILE} ) IF (QT_FOUND) IF(QT_QTWEBKIT_FOUND) MESSAGE(STATUS "Qt4 Found OK") # Webkit needs it at least with OpenSuse package # INCLUDE_DIRECTORIES( QT_QT_INCLUDE_DIR ) ELSE(QT_QTWEBKIT_FOUND) MESSAGE(FATAL_ERROR "QtWebKit not found") ENDIF(QT_QTWEBKIT_FOUND) ELSE(QT_FOUND) MESSAGE(FATAL_ERROR "No Qt4 found") ENDIF(QT_FOUND) #>> Qt IF(QT_QTOPENGL_FOUND) ADD_DEFINITIONS(-DHAVE_QTOPENGL ) ENDIF(QT_QTOPENGL_FOUND) SET(HARFBUZZ_DIR harfbuzz/src) ADD_SUBDIRECTORY(${HARFBUZZ_DIR}) MESSAGE(STATUS "Adding "${CMAKE_SOURCE_DIR}/${HARFBUZZ_DIR}) SET(HARFBUZZ_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/${HARFBUZZ_DIR}) # SET(PUZZLE_DIR libpuzzle/src) # ADD_SUBDIRECTORY(${PUZZLE_DIR}) # MESSAGE(STATUS "Adding "${CMAKE_SOURCE_DIR}/${PUZZLE_DIR}) # SET(PUZZLE_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/${PUZZLE_DIR}) #<< FreeType2 # We give a try to the built-in cmake Freetype.cmake FIND_PACKAGE(Freetype REQUIRED) IF (FREETYPE_FOUND) MESSAGE(STATUS "FreeType2 Library Found OK") ELSE (FREETYPE_FOUND) MESSAGE(FATAL_ERROR "No Freetype found") ENDIF(FREETYPE_FOUND) #>> FreeType2 IF(WANT_PYTHONQT) FIND_PACKAGE(PythonLibs REQUIRED) if(PYTHONLIBS_FOUND) MESSAGE(STATUS "Python Library Found OK") else(PYTHONLIBS_FOUND) MESSAGE(FATAL_ERROR "No Python Library found") endif(PYTHONLIBS_FOUND) SET(PYTHONQT_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/pythonqt/src) ADD_SUBDIRECTORY(${PYTHONQT_INCLUDE_DIRS}) ADD_DEFINITIONS(-DHAVE_PYTHONQT) ENDIF(WANT_PYTHONQT) IF(UNIX AND NOT APPLE) SET(FONTCONFIG_DIR ${CMAKE_MODULE_PATH}) FIND_PACKAGE(FONTCONFIG) IF(FONTCONFIG_FOUND) MESSAGE(STATUS "FontConfig Found OK") ADD_DEFINITIONS( -DHAVE_FONTCONFIG ) ENDIF(FONTCONFIG_FOUND) ENDIF(UNIX AND NOT APPLE) SET(FM_TEMPLATES_FILES ${CMAKE_SOURCE_DIR}/src/graphic-resources/template_oneline.xml ${CMAKE_SOURCE_DIR}/src/graphic-resources/template_oneline.png ${CMAKE_SOURCE_DIR}/src/graphic-resources/template_default.xml ${CMAKE_SOURCE_DIR}/src/graphic-resources/template_default.png ) SET(FM_STYLE_FILES ${CMAKE_SOURCE_DIR}/src/graphic-resources/html-css/info.css ${CMAKE_SOURCE_DIR}/src/graphic-resources/html-css/fontmatrix.js ${CMAKE_SOURCE_DIR}/src/graphic-resources/html-css/img/css-info-propertyname.png ${CMAKE_SOURCE_DIR}/src/graphic-resources/html-css/img/css-info-property.png ${CMAKE_SOURCE_DIR}/src/graphic-resources/html-css/img/css-shadow.png ${CMAKE_SOURCE_DIR}/src/graphic-resources/html-css/img/css-tech-info.png ) SET(FM_WELCOME_FILES ${CMAKE_SOURCE_DIR}/src/messages/welcome_da.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_de.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_en.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_fi.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_fr.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_hi.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_nb.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_nl.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_no.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_ru.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_sr.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_sv.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_uk.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_zh_CN.html ${CMAKE_SOURCE_DIR}/src/messages/welcome_zh_TW.html ) # tell cmake to process CMakeLists.txt in that subdirectory SET(HYPHENATE_DIR src/hyphenate) ADD_SUBDIRECTORY(${HYPHENATE_DIR}) SET(HYPHENATE_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/${HYPHENATE_DIR}) ADD_SUBDIRECTORY(src) # dodict # ADD_SUBDIRECTORY(src/langs) ######## Installation ################## IF(UNIX AND NOT APPLE) SET(DESKTOPDIR "share/applications/") SET(MANDIR "share/man/") SET(ICONDIR "share/icons/hicolor/48x48/apps/") SET(RESOURCESDIR "share/fontmatrix/resources/") SET(HELPDIR "share/fontmatrix/help/") INSTALL(FILES fontmatrix.desktop DESTINATION ${DESKTOPDIR} ) INSTALL(FILES fontmatrix.png DESTINATION ${ICONDIR} ) INSTALL(FILES fontmatrix.1 DESTINATION "${MANDIR}man1" ) INSTALL(FILES ${FM_TEMPLATES_FILES} ${FM_STYLE_FILES} ${FM_WELCOME_FILES} DESTINATION "${RESOURCESDIR}" ) INSTALL(FILES ${FM_HELP_FILES} DESTINATION "${HELPDIR}" ) ENDIF(UNIX AND NOT APPLE) IF(APPLE) # we do not "install" on apple’s OS ENDIF(APPLE) IF(WIN32) SET(RESOURCESDIR "share/resources/") SET(HELPDIR "help/") INSTALL(FILES ${FM_TEMPLATES_FILES} ${FM_STYLE_FILES} ${FM_WELCOME_FILES} ${FM_HELP_FILES} DESTINATION "${RESOURCESDIR}" ) INSTALL(FILES ${UNICODE_RESOURCES} DESTINATION "${RESOURCESDIR}/Unicode/" ) ENDIF(WIN32) ADD_SUBDIRECTORY(help) ADD_SUBDIRECTORY(samples) SET(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR}) SET(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR}) SET(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH}) INCLUDE(CPack) fontmatrix-0.6.0+svn20110930/src/0000755000175000017500000000000011641435631015123 5ustar malexmalexfontmatrix-0.6.0+svn20110930/src/importedfontsdialog.h0000644000175000017500000000335511007416332021350 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef IMPORTEDFONTSDIALOG_H #define IMPORTEDFONTSDIALOG_H #include #include #include #include /** @author Pierre Marchand */ class ImportedFontsDialog : public QDialog, private Ui::ImportedFonts { public: ImportedFontsDialog(QWidget *parent, QStringList fontlist ); ~ImportedFontsDialog(); }; #endif fontmatrix-0.6.0+svn20110930/src/fmsampletextview.cpp0000644000175000017500000001344211476762013021242 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "fmsampletextview.h" #include #include #include #include #include #include #ifdef HAVE_QTOPENGL #include #endif FMSampleTextView::FMSampleTextView ( QWidget* parent ) : QGraphicsView ( parent ), hasPendingUpdate ( false ) { #if 0 QGLFormat glfmt; glfmt.setSampleBuffers ( true ); QGLWidget *glwgt = new QGLWidget ( glfmt ); // qDebug()<<"GL:: A DR S"<format().alpha()<format().directRendering()<format().sampleBuffers(); // setViewport(glwgt); if ( glwgt->format().sampleBuffers() ) { setViewport ( glwgt ); qDebug() <<"opengl enabled - DirectRendering("<< glwgt->format().directRendering() <<") - SampleBuffers("<< glwgt->format().sampleBuffers() <<")"; } else { qDebug() <<"opengl disabled - DirectRendering("<< glwgt->format().directRendering() <<") - SampleBuffers("<< glwgt->format().sampleBuffers() <<")"; delete glwgt; } #endif setInteractive ( false ); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); theRect = 0; fPage = 0; isSelecting = false; isPanning = false; setAlignment ( Qt::AlignTop | Qt::AlignHCenter ); setTransformationAnchor ( QGraphicsView::NoAnchor ); setRenderHint ( QPainter::Antialiasing, true ); setBackgroundBrush(Qt::white); } FMSampleTextView::~FMSampleTextView() { } void FMSampleTextView::resizeEvent ( QResizeEvent * event ) { emit refit(); } void FMSampleTextView::mousePressEvent ( QMouseEvent * e ) { if ( !scene() ) return; if ( locker ) return; if ( e->button() == Qt::MidButton ) { mouseStartPoint = e->pos() ; isPanning = true; QApplication::setOverrideCursor (QCursor(Qt::ClosedHandCursor)); } else { ensureTheRect(); mouseStartPoint = mapToScene ( e->pos() ); isSelecting = true; // QRectF arect(mouseStartPoint, QSizeF()); // theRect->setRect(arect); } } void FMSampleTextView::mouseReleaseEvent ( QMouseEvent * e ) { if ( isPanning ) { isPanning = false; QApplication::restoreOverrideCursor(); return; } if ( !isSelecting ) return; // qDebug()<<"End mouse is "<< mapToScene( e->pos()).toPoint(); if ( mouseStartPoint.toPoint() == mapToScene ( e->pos() ).toPoint() ) { // scale(1,1) // qDebug() << "Re-init transformation"; emit pleaseZoom ( 0 ); isSelecting = false; theRect->setRect ( QRectF() ); return; } QRect zoomRect ( mouseStartPoint.toPoint(),mapToScene ( e->pos() ).toPoint() ); ensureVisible ( zoomRect ); isSelecting = false; // qDebug() << "release " << theRect->scenePos(); fitInView ( theRect->sceneBoundingRect(), Qt::KeepAspectRatio ); theRect->setRect ( QRectF() ); } void FMSampleTextView::mouseMoveEvent ( QMouseEvent * e ) { if ( isPanning ) { QPointF pos ( e->pos() ); int vDelta ( qRound(mouseStartPoint.y() - pos.y()) ); int hDelta ( qRound(mouseStartPoint.x() - pos.x()) ); verticalScrollBar()->setValue ( verticalScrollBar()->value() + vDelta ); horizontalScrollBar()->setValue ( horizontalScrollBar()->value() + hDelta ); mouseStartPoint = pos; return; } if ( !isSelecting ) return; QRectF r ( mouseStartPoint,mapToScene ( e->pos() ) ); theRect->setRect ( r ); } void FMSampleTextView::ensureTheRect() { if ( theRect ) return; theRect = scene()->addRect ( QRectF(),QPen ( QColor ( 10,10,200 ) ), QColor ( 10,10,200,100 ) ); theRect->setZValue ( 1000.0 ); } void FMSampleTextView::wheelEvent ( QWheelEvent * e ) { // qDebug() << "log wheel event " << e->delta(); // QGraphicsView::wheelEvent(e); if ( locker ) return; if ( e->modifiers().testFlag ( Qt::ControlModifier ) && e->orientation() == Qt::Vertical ) { emit pleaseZoom ( e->delta() ); } else { if ( e->orientation() == Qt::Vertical ) verticalScrollBar()->setValue ( verticalScrollBar()->value() - e->delta() ); if ( e->orientation() == Qt::Horizontal ) horizontalScrollBar()->setValue ( horizontalScrollBar()->value() - e->delta() ); } } void FMSampleTextView::showEvent ( QShowEvent * event ) { if ( hasPendingUpdate ) { hasPendingUpdate = false; emit pleaseUpdateMe(); } QGraphicsView::showEvent ( event ); } void FMSampleTextView::sheduleUpdate() { hasPendingUpdate = true; } void FMSampleTextView::unSheduleUpdate() { hasPendingUpdate = false; } void FMSampleTextView::fakePage() { if(fPage) return; fPage = scene()->addRect ( sceneRect() ,QPen ( QColor ( Qt::black ) ), QColor ( Qt::white ) ); setBackgroundBrush(Qt::lightGray); } fontmatrix-0.6.0+svn20110930/src/pangoshaper.cpp0000644000175000017500000000063111112273176020133 0ustar malexmalex// // C++ Implementation: pangoshaper // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "pangoshaper.h" PangoShaper::PangoShaper(FMOtf * o, QString s) :FMBaseShaper(o,s) { } PangoShaper::~ PangoShaper() { } GlyphList PangoShaper::doShape(const QString & s) { return GlyphList(); } fontmatrix-0.6.0+svn20110930/src/treeitem.cpp0000644000175000017500000000361511147562531017453 0ustar malexmalex/**************************************************************************** ** ** Copyright (C) 2005-2007 Trolltech ASA. All rights reserved. ** ** This file is part of the example classes of the Qt Toolkit. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://www.trolltech.com/products/qt/opensource.html ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://www.trolltech.com/products/qt/licensing.html or contact the ** sales department at sales@trolltech.com. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ /* treeitem.cpp A container for items of data supplied by the simple tree model. */ #include #include "treeitem.h" TreeItem::TreeItem ( const QList &data, TreeItem *parent ) { parentItem = parent; itemData = data; } TreeItem::~TreeItem() { qDeleteAll ( childItems ); } void TreeItem::appendChild ( TreeItem *item ) { childItems.append ( item ); } TreeItem *TreeItem::child ( int row ) { return childItems.value ( row ); } int TreeItem::childCount() const { return childItems.count(); } int TreeItem::columnCount() const { return itemData.count(); } QVariant TreeItem::data ( int column ) const { return itemData.value ( column ); } TreeItem *TreeItem::parent() { return parentItem; } int TreeItem::row() const { if ( parentItem ) return parentItem->childItems.indexOf ( const_cast ( this ) ); return 0; } fontmatrix-0.6.0+svn20110930/src/dataloader.h0000644000175000017500000000360311206007216017365 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef DATALOADER_H #define DATALOADER_H #include #include /** @author Pierre Marchand */ class DataLoader { QMap > sm; QMap pm; void load(); public: DataLoader(); ~DataLoader(){} bool update(const QString& name, const QString& sample); bool remove(const QString& name); void reload(); const QMap >& systemSamples()const{return sm;} const QMap& userSamples()const{return pm;} }; #endif fontmatrix-0.6.0+svn20110930/src/fmfloatingpreview.cpp0000644000175000017500000001504111443667514021367 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "fmfloatingpreview.h" #include "typotek.h" #include "fontitem.h" #include "fmfontdb.h" #include "fmactivate.h" #include #include #include #include #include #include #include #include #include #include #if defined(Q_WS_X11) #include #endif #include FMFloatingMenu::FMFloatingMenu(QWidget * parent, FontItem * item) :QWidget(parent), fontItem(item) { menuLayout = new QGridLayout(this); menuLayout->setContentsMargins(3,0,3,0); menuLayout->setVerticalSpacing(0); QFont f(font()); double fs(f.pointSizeF()); f.setPointSizeF( 0.6 * fs); if(item) { QFont f2(f); f2.setBold(true); fontName = new QLabel(item->fancyName(), this); fontName->setFont(f2); menuLayout->addWidget(fontName, 0,0); } line = new QFrame(this); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); menuLayout->addWidget(line,0, 1); bool act(false); if(item && !item->isActivated()) { actButton = new QPushButton(tr("Activate"),this); actButton->setFont(f); menuLayout->addWidget(actButton, 0,2, Qt::AlignRight); connect(actButton, SIGNAL(clicked()),this,SLOT(activateFont())); act = true; } closeButton = new QPushButton(tr("close"), this); closeButton->setFont(f); menuLayout->addWidget(closeButton, 0,act?3:2, Qt::AlignRight); text = new QLineEdit(typotek::getInstance()->word(item), this); text->setFont(f); menuLayout->addWidget(text,1, 0, 1, -1); connect(text, SIGNAL(textEdited(QString)), reinterpret_cast(parent), SLOT(updatePreview(QString))); connect(closeButton, SIGNAL(clicked()), this, SLOT(forwardCloseClicked())); } //void FMFloatingMenu::enterEvent(QEvent *e) //{ // childrenVisible(true); // QWidget::enterEvent(e); //} // //void FMFloatingMenu::leaveEvent(QEvent * e) //{ // childrenVisible(false); // QWidget::leaveEvent(e); //} void FMFloatingMenu::childrenVisible(bool v) { foreach(QWidget *w, findChildren()) { w->setVisible(v); } } void FMFloatingMenu::forwardCloseClicked() { emit closeClicked(); } void FMFloatingMenu::activateFont() { QList fl; fl << fontItem; FMActivate::getInstance()->activate(fl, true); menuLayout->removeWidget(actButton); delete actButton; } FMFloatingPreview::FMFloatingPreview(QWidget * parent, FontItem * item) :QWidget(parent) { hasMouseGrab = false; setWindowFlags( Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); #if QT_VERSION >= 0x040500 if(canTransparent()) setAttribute(Qt::WA_TranslucentBackground, true); setAttribute(Qt::WA_DeleteOnClose, true); #endif mainLayout = new QVBoxLayout(this); mainLayout->setMargin(0); menuWidget = new FMFloatingMenu(this, item); previewLabel = new QLabel(this); mainLayout->addWidget(menuWidget, Qt::AlignHCenter); mainLayout->addWidget(previewLabel, Qt::AlignHCenter); connect(menuWidget, SIGNAL(closeClicked()), this, SLOT(close())); } FMFloatingPreview::~FMFloatingPreview() { } void FMFloatingPreview::create(FontItem *item, QRect rect) { FMFloatingPreview * p(new FMFloatingPreview(typotek::getInstance(), item)); p->fontItem = item; QColor bgC; if(p->canTransparent()) bgC = QColor(Qt::transparent); else bgC = QColor(Qt::white); QPixmap preview = item->oneLinePreviewPixmap(typotek::getInstance()->word(item), Qt::black, bgC, rect.width()); QRect r(preview.rect()); QPoint delta(r.width()/2, r.height()/2); p->previewLabel->setGeometry(r); p->previewLabel->setPixmap(preview); QRect r2(QPoint(rect.x() - (r.width()/2), QCursor::pos().y() - (p->menuWidget->geometry().height()/2) ), QSize( r.width(), r.height() + p->menuWidget->geometry().height())); p->setGeometry(r2); p->show(); p->setFocus(Qt::OtherFocusReason); p->grabMouse(); QApplication::setOverrideCursor(Qt::SizeAllCursor); p->hasMouseGrab = true; p->refPoint = QCursor::pos() - p->geometry().topLeft(); } void FMFloatingPreview::mousePressEvent(QMouseEvent * e) { if (!(e->buttons() & Qt::LeftButton)) return; refPoint = e->globalPos() - geometry().topLeft(); QApplication::setOverrideCursor(Qt::SizeAllCursor); } void FMFloatingPreview::mouseReleaseEvent(QMouseEvent * e) { if(hasMouseGrab) releaseMouse(); refPoint = QPoint(); QApplication::restoreOverrideCursor(); } void FMFloatingPreview::mouseMoveEvent(QMouseEvent * e) { if (!(e->buttons() & Qt::LeftButton)) return; QRect r(geometry()); QPoint delta( e->globalPos() - refPoint); r.moveTo(delta); setGeometry(r); } void FMFloatingPreview::enterEvent(QEvent * e) { menuWidget->childrenVisible(true); } void FMFloatingPreview::leaveEvent(QEvent * e) { if(hasMouseGrab) releaseMouse(); menuWidget->childrenVisible(false); QApplication::restoreOverrideCursor(); } bool FMFloatingPreview::canTransparent() { #if defined(Q_WS_X11) return QX11Info::isCompositingManagerRunning(); #endif return true; } void FMFloatingPreview::updatePreview(const QString &t) { QColor bgC; if(canTransparent()) bgC = QColor(Qt::transparent); else bgC = QColor(Qt::white); QPixmap preview = fontItem->oneLinePreviewPixmap(t, Qt::black, bgC, this->width()); QRect r(preview.rect()); previewLabel->setGeometry(r); previewLabel->setPixmap(preview); } fontmatrix-0.6.0+svn20110930/src/filtermeta.cpp0000644000175000017500000000522411420105115017750 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "filtermeta.h" #include "fmfontdb.h" #include "fontitem.h" #include "fmfontstrings.h" FilterMeta::FilterMeta(): FilterData() { } QString FilterMeta::type() const { return QString("Meta"); } void FilterMeta::operate() { QString fs ( vData[Value].toString() ); int ff(vData[Field].toInt()); if(ff == FILTER_FIELD_SPECIAL_UNICODE) //Unicode { QList allList = FMFontDb::DB()->AllFonts(); QList tl; int startC(0xFFFFFFFF); int endC(0); int patCount(fs.count()); for(int a(0); a < patCount; ++a) { unsigned int ca(fs[a].unicode()); if( ca < startC) startC = ca; if(ca > endC) endC = ca; } int superSetCount(allList.count()); for ( int i =0; i < superSetCount; ++i ) { int cc(allList[i]->countCoverage ( startC, endC ) ); if ( cc >= patCount ) { tl.append ( allList[i]); } } operateFilter(tl); } else if(ff == FMFontDb::AllInfo) { FMFontDb::InfoItem k; QList tmpList; tmpList.clear(); for(int gIdx(0); gIdx < FontStrings::Names().keys().count() ; ++gIdx) { k = FontStrings::Names().keys()[gIdx]; if(k != FMFontDb::AllInfo) { tmpList += FMFontDb::DB()->Fonts(fs,k); } } operateFilter(tmpList); } else { operateFilter(FMFontDb::DB()->Fonts(fs, FMFontDb::InfoItem(ff))); } } fontmatrix-0.6.0+svn20110930/src/fmprintdialog.cpp0000644000175000017500000000102311000230446020444 0ustar malexmalex// // C++ Implementation: fmprintdialog // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fmprintdialog.h" #include FMPrintDialog::FMPrintDialog(QPrinter * printer, QWidget * parent) : QDialog(parent) { setupUi(this); QPrintDialog printDialog(printer, printPlaceHolder); printDialog.setModal(false); printDialog.show(); // printDialog.exec(); } FMPrintDialog::~ FMPrintDialog() { } fontmatrix-0.6.0+svn20110930/src/scripts/0000755000175000017500000000000011641435631016612 5ustar malexmalexfontmatrix-0.6.0+svn20110930/src/scripts/fontforge_subset.py0000644000175000017500000000173111176610725022546 0ustar malexmalex# Subset the current font according to a reference text # Paste your text here # All letters composing the text will be kept in the resulting font Text = unicode("TEST") import os.path import sys # Change it according to your own installation of fontforge python module sys.path.append("/home/pierre/system/lib/python2.6/site-packages/") try: import fontforge except importError: print "failed to import fontforge module" cf = Fontmatrix.currentFontPath() ff = fontforge font1 = ff.open(cf) RemList = [] for uc in font1.glyphs(): if(uc.unicode >= 0): if(False == (unichr(uc.unicode) in Text)): RemList.append(uc) else: print unicode(uc.glyphname) + u" is in the Text as " + unichr(uc.unicode) else: print uc.glyphname + " has codepoint " + uc.unicode for r in RemList: font1.removeGlyph(r) resname = "subseted-"+ os.path.basename(cf) try: font1.generate(resname) except EnvironmentError: print "Something went wrong when generating: "+resname font1.close()fontmatrix-0.6.0+svn20110930/src/scripts/CMakeLists.txt0000644000175000017500000000046311204470613021347 0ustar malexmalex# Scripts CMakeLists SET(SAMPLE_SCRIPTS fontforge_subset.py fonttools_showxml.py xetex_fontbook.py import_tags.py ) IF(UNIX AND NOT APPLE) SET(SAMPLE_SCRIPTS_DIR "share/fontmatrix/resources/Scripts/") INSTALL(FILES ${SAMPLE_SCRIPTS} DESTINATION "${SAMPLE_SCRIPTS_DIR}" ) ENDIF(UNIX AND NOT APPLE)fontmatrix-0.6.0+svn20110930/src/scripts/import_tags.py0000644000175000017500000000236111204532234021506 0ustar malexmalex# # This script will tag your fonts and mark them activated/deactivated # as appropriate according to your old Fontmatrix XML config. # # After running this you will need to use the Check Database feature of # Fontmatrix to cleanup activated fonts marked for deactivation and vice # versa. # # Up-to-date version at http://thomas-sibley.com/etc/tag-from-xml # from os import environ from xml.dom import minidom # Change this if your old XML config isn't in your home dir xmlfile = environ["HOME"] + "/.fontmatrix.data" def getText(element): rc = "" for node in element.childNodes: if node.nodeType == node.TEXT_NODE: rc = rc + node.data return rc dom = minidom.parse(xmlfile).documentElement db = Fontmatrix.DB(); for fontfile in dom.getElementsByTagName("fontfile"): file = getText(fontfile.getElementsByTagName("file")[0]) font = db.Font(file); if font: for node in fontfile.getElementsByTagName("tag"): tag = getText(node) if tag == "Activated_On": font.Active = 1 elif tag == "Activated_Off": font.Active = 0 else: db.addTag(file, tag) else: print "Can't find " + file Fontmatrix.updateTree(); fontmatrix-0.6.0+svn20110930/src/scripts/xetex_fontbook.py0000644000175000017500000000067311176610725022232 0ustar malexmalex# Type your script right here cf = Fontmatrix.currentFonts() head = "\\hsize=360pt \n\\vsize=580pt" head += "\\baselineskip=14.5pt \n\\parindent=8pt \n\\frenchspacing \n\\XeTeXlinebreaklocale fr \n\\overfullrule=6pt \n\n" body="" for f in cf[:]: body += "\n" body += "\\font\\lafonte=\"[" + f.Path + "] at 11pt" body += "\n"; body += "\\lafonte"; body += "\n"; body += f.Family + " " + f.Variant body += "\n"; print head print body fontmatrix-0.6.0+svn20110930/src/scripts/fonttools_showxml.py0000644000175000017500000000052611176610725023001 0ustar malexmaleximport os import tempfile try: from fontTools import ttLib except ImportError: print "cannot import ttLib" tfH, tfP = tempfile.mkstemp() tt = ttLib.TTFont(Fontmatrix.currentFontPath()) tt.saveXML(tfP); ret = "" cont = True while (cont): tret = os.read(tfH, 256) if(len(tret) == 0): cont = False ret += tret os.close(tfH) print retfontmatrix-0.6.0+svn20110930/src/filterpanose.cpp0000644000175000017500000000365111420013425020313 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "filterpanose.h" #include "fmfontdb.h" FilterPanose::FilterPanose(): FilterData() { } QString FilterPanose::type() const { return QString("Panose"); } void FilterPanose::operate() { QList dbresult( FMFontDb::DB()->getValues( FMFontDb::Panose ) ); QList fil; int paramIdx(vData[Param].toInt()); int val(vData[Value].toInt()); int fv(0); for(int i(0); i < dbresult.count() ; ++i) { QStringList pl(dbresult[i].second.split(":")); fv = pl[paramIdx].toInt(); if(fv == val) fil << dbresult[i].first; } operateFilter(fil); } fontmatrix-0.6.0+svn20110930/src/floatingwidgetsregister.h0000644000175000017500000000407611411140340022223 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FLOATINGWIDGETSREGISTER_H #define FLOATINGWIDGETSREGISTER_H //#include #include #include #include #include class FloatingWidget; class FloatingWidgetsRegister { static FloatingWidgetsRegister * instance; FloatingWidgetsRegister(); ~FloatingWidgetsRegister(){} static FloatingWidgetsRegister* that(); public: static void Register(FloatingWidget* f, const QString& fid, const QString& typ); static FloatingWidget* Widget(const QString& fid, const QString& typ); static QList AllWidgets(); private: QMap< QString, QMap < QString, QPointer > > fwMap; // map[ type , [ fontID , pointer ] ] }; #endif // FLOATINGWIDGETSREGISTER_H fontmatrix-0.6.0+svn20110930/src/importedfonts.ui0000644000175000017500000000547711163315305020366 0ustar malexmalex ImportedFonts 0 0 400 300 Imported fonts true Imported Fonts: QFrame::Box QFrame::Plain false QAbstractItemView::NoSelection true <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> &Do not show this dialog again Qt::Horizontal 40 20 0 0 &OK btnOk clicked() ImportedFonts close() 49 276 199 149 fontmatrix-0.6.0+svn20110930/src/fmplayground.h0000644000175000017500000000254711265071753020016 0ustar malexmalex// // C++ Interface: fmplayground // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMPLAYGROUND_H #define FMPLAYGROUND_H #include #include #include #include class FontItem; class FMPlayGround : public QGraphicsView { Q_OBJECT public: FMPlayGround(QWidget *parent); ~FMPlayGround(); QStringList fontnameList(); QList< QGraphicsItemGroup* > getLines(); QRectF getMaxRect(); void updateLine(); void closeLine(); void deselectAll(); protected: void mousePressEvent ( QMouseEvent * e ) ; void mouseReleaseEvent ( QMouseEvent * e ) ; void mouseMoveEvent ( QMouseEvent * e ) ; void wheelEvent ( QWheelEvent * e ); void keyReleaseEvent(QKeyEvent *e); void leaveEvent(QEvent *e); private: void displayGlyphs(const QString& spec, FontItem* fontI, double fontS); QPointF mouseStartPoint; bool isPanning; QList glyphLines; QList< QGraphicsItem* > curLine; QString curString; QRectF curSelRect; void removeLine(); // this cursor is at the begining of a line QPointF CursorPos; // this one at the pen position QPointF BlinkPos; QTimer *CursorTimer; signals: void pleaseZoom(int); private slots: void blinkCursor(); }; #endif fontmatrix-0.6.0+svn20110930/src/metawidget.h0000644000175000017500000000432111443651075017430 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef METAWIDGET_H #define METAWIDGET_H #include #include #include #include #include "fmfontstrings.h" class QStringListModel; class QPushButton; class QLineEdit; class QComboBox; class QHBoxLayout; namespace Ui { class MetaWidget; } class MetaWidget : public QWidget { Q_OBJECT public: explicit MetaWidget(QWidget *parent = 0); ~MetaWidget(); QMap resultMap; protected: void changeEvent(QEvent *e); private: Ui::MetaWidget *ui; static QStringListModel *mModel; static QStringList mList; QWidget *filterWidget; QComboBox *filterCombo; QLineEdit *filterLine; QPushButton *filterButton; QMap metFields; signals: void filterAdded(); void Close(); private slots: void addFilter(); }; #endif // METAWIDGET_H fontmatrix-0.6.0+svn20110930/src/hyphenate/0000755000175000017500000000000011641435631017110 5ustar malexmalexfontmatrix-0.6.0+svn20110930/src/hyphenate/hnjalloc.h0000644000175000017500000000300711017730536021052 0ustar malexmalex/* LibHnj is dual licensed under LGPL and MPL. Boilerplate for both * licenses follows. */ /* LibHnj - a library for high quality hyphenation and justification * Copyright (C) 1998 Raph Levien * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library 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. */ /* * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "MPL"); you may not use this file except in * compliance with the MPL. You may obtain a copy of the MPL at * http://www.mozilla.org/MPL/ * * Software distributed under the MPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL * for the specific language governing rights and limitations under the * MPL. * */ /* wrappers for malloc */ void * hnj_malloc (int size); void * hnj_realloc (void *p, int size); void hnj_free (void *p); fontmatrix-0.6.0+svn20110930/src/hyphenate/hyphen.h0000644000175000017500000001236611017730536020563 0ustar malexmalex/* Hyphen - hyphenation library using converted TeX hyphenation patterns * * (C) 1998 Raph Levien * (C) 2001 ALTLinux, Moscow * (C) 2006, 2007, 2008 László Németh * * This was part of libHnj library by Raph Levien. * * Peter Novodvorsky from ALTLinux cut hyphenation part from libHnj * to use it in OpenOffice.org. * * Non-standard and compound word hyphenation support by László Németh. * * License is the original LibHnj license: * * LibHnj is dual licensed under LGPL and MPL. Boilerplate for both * licenses follows. */ /* LibHnj - a library for high quality hyphenation and justification * Copyright (C) 1998 Raph Levien * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library 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. */ /* * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "MPL"); you may not use this file except in * compliance with the MPL. You may obtain a copy of the MPL at * http://www.mozilla.org/MPL/ * * Software distributed under the MPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL * for the specific language governing rights and limitations under the * MPL. * */ #ifndef __HYPHEN_H__ #define __HYPHEN_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef struct _HyphenDict HyphenDict; typedef struct _HyphenState HyphenState; typedef struct _HyphenTrans HyphenTrans; #define MAX_CHARS 100 #define MAX_NAME 20 struct _HyphenDict { /* user options */ char lhmin; /* lefthyphenmin: min. hyph. distance from the left side */ char rhmin; /* righthyphenmin: min. hyph. distance from the right side */ char clhmin; /* min. hyph. distance from the left compound boundary */ char crhmin; /* min. hyph. distance from the right compound boundary */ /* system variables */ int num_states; char cset[MAX_NAME]; int utf8; HyphenState *states; HyphenDict *nextlevel; }; struct _HyphenState { char *match; char *repl; signed char replindex; signed char replcut; int fallback_state; int num_trans; HyphenTrans *trans; }; struct _HyphenTrans { char ch; int new_state; }; HyphenDict *hnj_hyphen_load (const char *fn); void hnj_hyphen_free (HyphenDict *dict); /* obsolete, use hnj_hyphen_hyphenate2() or *hyphenate3() functions) */ int hnj_hyphen_hyphenate (HyphenDict *dict, const char *word, int word_size, char *hyphens); /* int hnj_hyphen_hyphenate2(): non-standard hyphenation. (It supports Catalan, Dutch, German, Hungarian, Norwegian, Swedish etc. orthography, see documentation.) input data: word: input word word_size: byte length of the input word hyphens: allocated character buffer (size = word_size + 5) hyphenated_word: allocated character buffer (size ~ word_size * 2) or NULL rep, pos, cut: pointers (point to the allocated and _zeroed_ buffers (size=word_size) or with NULL value) or NULL output data: hyphens: hyphenation vector (hyphenation points signed with odd numbers) hyphenated_word: hyphenated input word (hyphens signed with `='), optional (NULL input) rep: NULL (only standard hyph.), or replacements (hyphenation points signed with `=' in replacements); pos: NULL, or difference of the actual position and the beginning positions of the change in input words; cut: NULL, or counts of the removed characters of the original words at hyphenation, Note: rep, pos, cut are complementary arrays to the hyphens, indexed with the character positions of the input word. For example: Schiffahrt -> Schiff=fahrt, pattern: f1f/ff=f,1,2 output: rep[5]="ff=f", pos[5] = 1, cut[5] = 2 Note: hnj_hyphen_hyphenate2() can allocate rep, pos, cut (word_size length arrays): char ** rep = NULL; int * pos = NULL; int * cut = NULL; char hyphens[MAXWORDLEN]; hnj_hyphen_hyphenate2(dict, "example", 7, hyphens, NULL, &rep, &pos, &cut); See example in the source distribution. */ int hnj_hyphen_hyphenate2 (HyphenDict *dict, const char *word, int word_size, char * hyphens, char *hyphenated_word, char *** rep, int ** pos, int ** cut); /* like hnj_hyphen_hyphenate2, but with hyphenmin parameters */ /* lhmin: lefthyphenmin * rhmin: righthyphenmin * clhmin: compoundlefthyphemin * crhmin: compoundrighthyphenmin * (see documentation) */ int hnj_hyphen_hyphenate3 (HyphenDict *dict, const char *word, int word_size, char * hyphens, char *hyphword, char *** rep, int ** pos, int ** cut, int lhmin, int rhmin, int clhmin, int crhmin); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __HYPHEN_H__ */ fontmatrix-0.6.0+svn20110930/src/hyphenate/COPYING0000644000175000017500000000157211026543633020147 0ustar malexmalexGPL 2.0/LGPL 2.1/MPL 1.1 tri-license The contents of this software may be used under the terms of the GNU General Public License Version 2 or later (the "GPL"), or the GNU Lesser General Public License Version 2.1 or later (the "LGPL", see COPYING.LGPL) or the Mozilla Public License Version 1.1 or later (the "MPL", see COPYING.MPL). The Plain TeX hyphenation tables "hyphen.tex" by Donald E. Knuth has a non MPL/LGPL compatible license, but freely redistributable: "Unlimited copying and redistribution of this file are permitted as long as this file is not modified. Modifications are permitted, but only if the resulting file is not named hyphen.tex." Software distributed under these licenses is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the licences for the specific language governing rights and limitations under the licenses. fontmatrix-0.6.0+svn20110930/src/hyphenate/AUTHORS0000644000175000017500000000140411017730536020156 0ustar malexmalexLibhnj was written by Raph Levien . Original Libhnj source with OOo's patches are managed by Rene Engelhard and Chris Halls at Debian: http://packages.debian.org/stable/libdevel/libhnj-dev and http://packages.debian.org/unstable/source/libhnj This subset of Libhnj was extended by Peter Novodvorsky (OOo integration), László Németh (non-standard and compound hyphenation with Unicode support), Nanning Buitenhuis (substrings.c) Write bug reports to László Németh or to the lingu-dev mailing list of OpenOffice.org (after subscription: http://lingucomponent.openoffice.org) --- Please contact Raph Levien for information about licensing for proprietary applications. fontmatrix-0.6.0+svn20110930/src/hyphenate/fmhyphenator.h0000644000175000017500000000136211032165122021754 0ustar malexmalex// // C++ Interface: fmhyphenator // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMHYPHENATOR_H #define FMHYPHENATOR_H #include "hyphen.h" #include "fmsharestruct.h" #include #include #include #include class QTextCodec; typedef QMap > HyphList; class FMHyphenator : public QObject { public: FMHyphenator ( ); ~FMHyphenator(); bool loadDict ( const QString& dictPath, int leftMin = 2, int rightMin = 3); HyphList hyphenate ( const QString& word ) const; private: QString currentDictPath; HyphenDict *dict; QTextCodec *textCodec; }; #endif fontmatrix-0.6.0+svn20110930/src/hyphenate/CMakeLists.txt0000644000175000017500000000023311017730536021645 0ustar malexmalexINCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/src ) SET(HYPHENATE_SRCS hnjalloc.c hyphen.c fmhyphenator.cpp ) ADD_LIBRARY(hyphenate STATIC ${HYPHENATE_SRCS}) fontmatrix-0.6.0+svn20110930/src/hyphenate/hnjalloc.c0000644000175000017500000000360111017730536021045 0ustar malexmalex/* LibHnj is dual licensed under LGPL and MPL. Boilerplate for both * licenses follows. */ /* LibHnj - a library for high quality hyphenation and justification * Copyright (C) 1998 Raph Levien, (C) 2001 ALTLinux, Moscow * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library 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. */ /* * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "MPL"); you may not use this file except in * compliance with the MPL. You may obtain a copy of the MPL at * http://www.mozilla.org/MPL/ * * Software distributed under the MPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL * for the specific language governing rights and limitations under the * MPL. * */ /* wrappers for malloc */ #include #include void * hnj_malloc (int size) { void *p; p = malloc (size); if (p == NULL) { fprintf (stderr, "can't allocate %d bytes\n", size); exit (1); } return p; } void * hnj_realloc (void *p, int size) { p = realloc (p, size); if (p == NULL) { fprintf (stderr, "can't allocate %d bytes\n", size); exit (1); } return p; } void hnj_free (void *p) { free (p); } fontmatrix-0.6.0+svn20110930/src/hyphenate/hyphen.c0000644000175000017500000007222411017730536020555 0ustar malexmalex/* Libhnj is dual licensed under LGPL and MPL. Boilerplate for both * licenses follows. */ /* LibHnj - a library for high quality hyphenation and justification * Copyright (C) 1998 Raph Levien, * (C) 2001 ALTLinux, Moscow (http://www.alt-linux.org), * (C) 2001 Peter Novodvorsky (nidd@cs.msu.su) * (C) 2006, 2007, 2008 László Németh (nemeth at OOo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library 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. */ /* * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "MPL"); you may not use this file except in * compliance with the MPL. You may obtain a copy of the MPL at * http://www.mozilla.org/MPL/ * * Software distributed under the MPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL * for the specific language governing rights and limitations under the * MPL. * */ #include /* for NULL, malloc */ #include /* for fprintf */ #include /* for strdup */ #ifdef UNX #include /* for exit */ #endif #define noVERBOSE #include "hnjalloc.h" #include "hyphen.h" static char * hnj_strdup (const char *s) { char *new; int l; l = strlen (s); new = hnj_malloc (l + 1); memcpy (new, s, l); new[l] = 0; return new; } /* remove cross-platform text line end characters */ void hnj_strchomp(char * s) { int k = strlen(s); if ((k > 0) && ((*(s+k-1)=='\r') || (*(s+k-1)=='\n'))) *(s+k-1) = '\0'; if ((k > 1) && (*(s+k-2) == '\r')) *(s+k-2) = '\0'; } /* a little bit of a hash table implementation. This simply maps strings to state numbers */ typedef struct _HashTab HashTab; typedef struct _HashEntry HashEntry; /* A cheap, but effective, hack. */ #define HASH_SIZE 31627 struct _HashTab { HashEntry *entries[HASH_SIZE]; }; struct _HashEntry { HashEntry *next; char *key; int val; }; /* a char* hash function from ASU - adapted from Gtk+ */ static unsigned int hnj_string_hash (const char *s) { const char *p; unsigned int h=0, g; for(p = s; *p != '\0'; p += 1) { h = ( h << 4 ) + *p; if ( ( g = h & 0xf0000000 ) ) { h = h ^ (g >> 24); h = h ^ g; } } return h /* % M */; } static HashTab * hnj_hash_new (void) { HashTab *hashtab; int i; hashtab = hnj_malloc (sizeof(HashTab)); for (i = 0; i < HASH_SIZE; i++) hashtab->entries[i] = NULL; return hashtab; } static void hnj_hash_free (HashTab *hashtab) { int i; HashEntry *e, *next; for (i = 0; i < HASH_SIZE; i++) for (e = hashtab->entries[i]; e; e = next) { next = e->next; hnj_free (e->key); hnj_free (e); } hnj_free (hashtab); } /* assumes that key is not already present! */ static void hnj_hash_insert (HashTab *hashtab, const char *key, int val) { int i; HashEntry *e; i = hnj_string_hash (key) % HASH_SIZE; e = hnj_malloc (sizeof(HashEntry)); e->next = hashtab->entries[i]; e->key = hnj_strdup (key); e->val = val; hashtab->entries[i] = e; } /* return val if found, otherwise -1 */ static int hnj_hash_lookup (HashTab *hashtab, const char *key) { int i; HashEntry *e; i = hnj_string_hash (key) % HASH_SIZE; for (e = hashtab->entries[i]; e; e = e->next) if (!strcmp (key, e->key)) return e->val; return -1; } /* Get the state number, allocating a new state if necessary. */ static int hnj_get_state (HyphenDict *dict, HashTab *hashtab, const char *string) { int state_num; state_num = hnj_hash_lookup (hashtab, string); if (state_num >= 0) return state_num; hnj_hash_insert (hashtab, string, dict->num_states); /* predicate is true if dict->num_states is a power of two */ if (!(dict->num_states & (dict->num_states - 1))) { dict->states = hnj_realloc (dict->states, (dict->num_states << 1) * sizeof(HyphenState)); } dict->states[dict->num_states].match = NULL; dict->states[dict->num_states].repl = NULL; dict->states[dict->num_states].fallback_state = -1; dict->states[dict->num_states].num_trans = 0; dict->states[dict->num_states].trans = NULL; return dict->num_states++; } /* add a transition from state1 to state2 through ch - assumes that the transition does not already exist */ static void hnj_add_trans (HyphenDict *dict, int state1, int state2, char ch) { int num_trans; num_trans = dict->states[state1].num_trans; if (num_trans == 0) { dict->states[state1].trans = hnj_malloc (sizeof(HyphenTrans)); } else if (!(num_trans & (num_trans - 1))) { dict->states[state1].trans = hnj_realloc (dict->states[state1].trans, (num_trans << 1) * sizeof(HyphenTrans)); } dict->states[state1].trans[num_trans].ch = ch; dict->states[state1].trans[num_trans].new_state = state2; dict->states[state1].num_trans++; } #ifdef VERBOSE HashTab *global; static char * get_state_str (int state) { int i; HashEntry *e; for (i = 0; i < HASH_SIZE; i++) for (e = global->entries[i]; e; e = e->next) if (e->val == state) return e->key; return NULL; } #endif HyphenDict * hnj_hyphen_load (const char *fn) { HyphenDict *dict[2]; HashTab *hashtab; FILE *f; char buf[MAX_CHARS]; char word[MAX_CHARS]; char pattern[MAX_CHARS]; char * repl; signed char replindex; signed char replcut; int state_num = 0, last_state; int i, j, k; char ch; int found; HashEntry *e; int nextlevel = 0; f = fopen (fn, "r"); if (f == NULL) return NULL; // loading one or two dictionaries (separated by NEXTLEVEL keyword) for (k = 0; k == 0 || (k == 1 && nextlevel); k++) { hashtab = hnj_hash_new (); #ifdef VERBOSE global = hashtab; #endif hnj_hash_insert (hashtab, "", 0); dict[k] = hnj_malloc (sizeof(HyphenDict)); dict[k]->num_states = 1; dict[k]->states = hnj_malloc (sizeof(HyphenState)); dict[k]->states[0].match = NULL; dict[k]->states[0].repl = NULL; dict[k]->states[0].fallback_state = -1; dict[k]->states[0].num_trans = 0; dict[k]->states[0].trans = NULL; dict[k]->nextlevel = NULL; dict[k]->lhmin = 0; dict[k]->rhmin = 0; dict[k]->clhmin = 0; dict[k]->crhmin = 0; /* read in character set info */ if (k == 0) { for (i=0;icset[i]= 0; fgets(dict[k]->cset, sizeof(dict[k]->cset),f); for (i=0;icset[i] == '\r') || (dict[k]->cset[i] == '\n')) dict[k]->cset[i] = 0; dict[k]->utf8 = (strcmp(dict[k]->cset, "UTF-8") == 0); } else { strcpy(dict[k]->cset, dict[0]->cset); dict[k]->utf8 = dict[0]->utf8; } while (fgets (buf, sizeof(buf), f) != NULL) { if (buf[0] != '%') { if (strncmp(buf, "NEXTLEVEL", 9) == 0) { nextlevel = 1; break; } else if (strncmp(buf, "LEFTHYPHENMIN", 13) == 0) { dict[k]->lhmin = atoi(buf + 13); continue; } else if (strncmp(buf, "RIGHTHYPHENMIN", 14) == 0) { dict[k]->rhmin = atoi(buf + 14); continue; } else if (strncmp(buf, "COMPOUNDLEFTHYPHENMIN", 21) == 0) { dict[k]->clhmin = atoi(buf + 21); continue; } else if (strncmp(buf, "COMPOUNDRIGHTHYPHENMIN", 22) == 0) { dict[k]->crhmin = atoi(buf + 22); continue; } j = 0; pattern[j] = '0'; repl = strchr(buf, '/'); replindex = 0; replcut = 0; if (repl) { char * index = strchr(repl + 1, ','); *repl = '\0'; if (index) { char * index2 = strchr(index + 1, ','); *index = '\0'; if (index2) { *index2 = '\0'; replindex = (signed char) atoi(index + 1) - 1; replcut = (signed char) atoi(index2 + 1); } } else { hnj_strchomp(repl + 1); replindex = 0; replcut = strlen(buf); } repl = hnj_strdup(repl + 1); } for (i = 0; ((buf[i] > ' ') || (buf[i] < 0)); i++) { if (buf[i] >= '0' && buf[i] <= '9') pattern[j] = buf[i]; else { word[j] = buf[i]; pattern[++j] = '0'; } } word[j] = '\0'; pattern[j + 1] = '\0'; i = 0; if (!repl) { /* Optimize away leading zeroes */ for (; pattern[i] == '0'; i++); } else { if (*word == '.') i++; /* convert UTF-8 char. positions of discretionary hyph. replacements to 8-bit */ if (dict[k]->utf8) { int pu = -1; /* unicode character position */ int ps = -1; /* unicode start position (original replindex) */ int pc = (*word == '.') ? 1: 0; /* 8-bit character position */ for (; pc < (strlen(word) + 1); pc++) { /* beginning of an UTF-8 character (not '10' start bits) */ if ((((unsigned char) word[pc]) >> 6) != 2) pu++; if ((ps < 0) && (replindex == pu)) { ps = replindex; replindex = pc; } if ((ps >= 0) && ((pu - ps) == replcut)) { replcut = (pc - replindex); break; } } if (*word == '.') replindex--; } } #ifdef VERBOSE printf ("word %s pattern %s, j = %d repl: %s\n", word, pattern + i, j, repl); #endif found = hnj_hash_lookup (hashtab, word); state_num = hnj_get_state (dict[k], hashtab, word); dict[k]->states[state_num].match = hnj_strdup (pattern + i); dict[k]->states[state_num].repl = repl; dict[k]->states[state_num].replindex = replindex; if (!replcut) { dict[k]->states[state_num].replcut = strlen(word); } else { dict[k]->states[state_num].replcut = replcut; } /* now, put in the prefix transitions */ for (; found < 0 ;j--) { last_state = state_num; ch = word[j - 1]; word[j - 1] = '\0'; found = hnj_hash_lookup (hashtab, word); state_num = hnj_get_state (dict[k], hashtab, word); hnj_add_trans (dict[k], state_num, last_state, ch); } } } /* Could do unioning of matches here (instead of the preprocessor script). If we did, the pseudocode would look something like this: foreach state in the hash table foreach i = [1..length(state) - 1] state to check is substr (state, i) look it up if found, and if there is a match, union the match in. It's also possible to avoid the quadratic blowup by doing the search in order of increasing state string sizes - then you can break the loop after finding the first match. This step should be optional in any case - if there is a preprocessed rule table, it's always faster to use that. */ /* put in the fallback states */ for (i = 0; i < HASH_SIZE; i++) for (e = hashtab->entries[i]; e; e = e->next) { if (*(e->key)) for (j = 1; 1; j++) { state_num = hnj_hash_lookup (hashtab, e->key + j); if (state_num >= 0) break; } /* KBH: FIXME state 0 fallback_state should always be -1? */ if (e->val) dict[k]->states[e->val].fallback_state = state_num; } #ifdef VERBOSE for (i = 0; i < HASH_SIZE; i++) for (e = hashtab->entries[i]; e; e = e->next) { printf ("%d string %s state %d, fallback=%d\n", i, e->key, e->val, dict[k]->states[e->val].fallback_state); for (j = 0; j < dict[k]->states[e->val].num_trans; j++) printf (" %c->%d\n", dict[k]->states[e->val].trans[j].ch, dict[k]->states[e->val].trans[j].new_state); } #endif #ifndef VERBOSE hnj_hash_free (hashtab); #endif state_num = 0; } fclose(f); if (k == 2) dict[0]->nextlevel = dict[1]; return dict[0]; } void hnj_hyphen_free (HyphenDict *dict) { int state_num; HyphenState *hstate; for (state_num = 0; state_num < dict->num_states; state_num++) { hstate = &dict->states[state_num]; if (hstate->match) hnj_free (hstate->match); if (hstate->repl) hnj_free (hstate->repl); if (hstate->trans) hnj_free (hstate->trans); } if (dict->nextlevel) hnj_hyphen_free(dict->nextlevel); hnj_free (dict->states); hnj_free (dict); } #define MAX_WORD 256 int hnj_hyphen_hyphenate (HyphenDict *dict, const char *word, int word_size, char *hyphens) { char prep_word_buf[MAX_WORD]; char *prep_word; int i, j, k; int state; char ch; HyphenState *hstate; char *match; int offset; if (word_size + 3 < MAX_WORD) prep_word = prep_word_buf; else prep_word = hnj_malloc (word_size + 3); j = 0; prep_word[j++] = '.'; for (i = 0; i < word_size; i++) prep_word[j++] = word[i]; prep_word[j++] = '.'; prep_word[j] = '\0'; for (i = 0; i < j; i++) hyphens[i] = '0'; #ifdef VERBOSE printf ("prep_word = %s\n", prep_word); #endif /* now, run the finite state machine */ state = 0; for (i = 0; i < j; i++) { ch = prep_word[i]; for (;;) { if (state == -1) { /* return 1; */ /* KBH: FIXME shouldn't this be as follows? */ state = 0; goto try_next_letter; } #ifdef VERBOSE char *state_str; state_str = get_state_str (state); for (k = 0; k < i - strlen (state_str); k++) putchar (' '); printf ("%s", state_str); #endif hstate = &dict->states[state]; for (k = 0; k < hstate->num_trans; k++) if (hstate->trans[k].ch == ch) { state = hstate->trans[k].new_state; goto found_state; } state = hstate->fallback_state; #ifdef VERBOSE printf (" falling back, fallback_state %d\n", state); #endif } found_state: #ifdef VERBOSE printf ("found state %d\n",state); #endif /* Additional optimization is possible here - especially, elimination of trailing zeroes from the match. Leading zeroes have already been optimized. */ match = dict->states[state].match; /* replacing rules not handled by hyphen_hyphenate() */ if (match && !dict->states[state].repl) { offset = i + 1 - strlen (match); #ifdef VERBOSE for (k = 0; k < offset; k++) putchar (' '); printf ("%s\n", match); #endif /* This is a linear search because I tried a binary search and found it to be just a teeny bit slower. */ for (k = 0; match[k]; k++) if (hyphens[offset + k] < match[k]) hyphens[offset + k] = match[k]; } /* KBH: we need this to make sure we keep looking in a word */ /* for patterns even if the current character is not known in state 0 */ /* since patterns for hyphenation may occur anywhere in the word */ try_next_letter: ; } #ifdef VERBOSE for (i = 0; i < j; i++) putchar (hyphens[i]); putchar ('\n'); #endif for (i = 0; i < j - 4; i++) #if 0 if (hyphens[i + 1] & 1) hyphens[i] = '-'; #else hyphens[i] = hyphens[i + 1]; #endif hyphens[0] = '0'; for (; i < word_size; i++) hyphens[i] = '0'; hyphens[word_size] = '\0'; if (prep_word != prep_word_buf) hnj_free (prep_word); return 0; } /* character length of the first n byte of the input word */ int hnj_hyphen_strnlen(const char * word, int n, int utf8) { int i = 0; int j = 0; while (j < n && word[j] != '\0') { i++; for (j++; utf8 && (word[j] & 0xc0) == 0x80; j++); } return i; } int hnj_hyphen_lhmin(int utf8, const char *word, int word_size, char * hyphens, char *** rep, int ** pos, int ** cut, int lhmin) { int i, j; for (i = 1, j = 0; i < lhmin && word[j] != '\0'; i++) do { // check length of the non-standard part if (*rep && *pos && *cut && (*rep)[j]) { char * rh = strchr((*rep)[j], '='); if (rh && (hnj_hyphen_strnlen(word, j - (*pos)[j] + 1, utf8) + hnj_hyphen_strnlen((*rep)[j], rh - (*rep)[j], utf8)) < lhmin) { free((*rep)[j]); (*rep)[j] = NULL; hyphens[j] = '0'; } } else { hyphens[j] = '0'; } j++; } while (utf8 && (word[j + 1] & 0xc0) == 0xc0); return 0; } int hnj_hyphen_rhmin(int utf8, const char *word, int word_size, char * hyphens, char *** rep, int ** pos, int ** cut, int rhmin) { int i; int j = word_size - 2; for (i = 1; i < rhmin && j > 0; j--) { // check length of the non-standard part if (*rep && *pos && *cut && (*rep)[j]) { char * rh = strchr((*rep)[j], '='); if (rh && (hnj_hyphen_strnlen(word + j - (*pos)[j] + (*cut)[j] + 1, 100, utf8) + hnj_hyphen_strnlen(rh + 1, strlen(rh + 1), utf8)) < rhmin) { free((*rep)[j]); (*rep)[j] = NULL; hyphens[j] = '0'; } } else { hyphens[j] = '0'; } if (!utf8 || (word[j] & 0xc0) != 0xc0) i++; } return 0; } // recursive function for compound level hyphenation int hnj_hyphen_hyph_(HyphenDict *dict, const char *word, int word_size, char * hyphens, char *** rep, int ** pos, int ** cut, int clhmin, int crhmin, int lend, int rend) { char prep_word_buf[MAX_WORD]; char *prep_word; int i, j, k; int state; char ch; HyphenState *hstate; char *match; char *repl; signed char replindex; signed char replcut; int offset; int matchlen_buf[MAX_CHARS]; int matchindex_buf[MAX_CHARS]; char * matchrepl_buf[MAX_CHARS]; int * matchlen; int * matchindex; char ** matchrepl; int isrepl = 0; int nHyphCount; if (word_size + 3 < MAX_CHARS) { prep_word = prep_word_buf; matchlen = matchlen_buf; matchindex = matchindex_buf; matchrepl = matchrepl_buf; } else { prep_word = hnj_malloc (word_size + 3); matchlen = hnj_malloc ((word_size + 3) * sizeof(int)); matchindex = hnj_malloc ((word_size + 3) * sizeof(int)); matchrepl = hnj_malloc ((word_size + 3) * sizeof(char *)); } j = 0; prep_word[j++] = '.'; for (i = 0; i < word_size; i++) prep_word[j++] = word[i]; prep_word[j++] = '.'; prep_word[j] = '\0'; for (i = 0; i < j; i++) hyphens[i] = '0'; #ifdef VERBOSE printf ("prep_word = %s\n", prep_word); #endif /* now, run the finite state machine */ state = 0; for (i = 0; i < j; i++) { ch = prep_word[i]; for (;;) { if (state == -1) { /* return 1; */ /* KBH: FIXME shouldn't this be as follows? */ state = 0; goto try_next_letter; } #ifdef VERBOSE char *state_str; state_str = get_state_str (state); for (k = 0; k < i - strlen (state_str); k++) putchar (' '); printf ("%s", state_str); #endif hstate = &dict->states[state]; for (k = 0; k < hstate->num_trans; k++) if (hstate->trans[k].ch == ch) { state = hstate->trans[k].new_state; goto found_state; } state = hstate->fallback_state; #ifdef VERBOSE printf (" falling back, fallback_state %d\n", state); #endif } found_state: #ifdef VERBOSE printf ("found state %d\n",state); #endif /* Additional optimization is possible here - especially, elimination of trailing zeroes from the match. Leading zeroes have already been optimized. */ match = dict->states[state].match; repl = dict->states[state].repl; replindex = dict->states[state].replindex; replcut = dict->states[state].replcut; /* replacing rules not handled by hyphen_hyphenate() */ if (match) { offset = i + 1 - strlen (match); #ifdef VERBOSE for (k = 0; k < offset; k++) putchar (' '); printf ("%s (%s)\n", match, repl); #endif if (repl) { if (!isrepl) for(; isrepl < word_size; isrepl++) { matchrepl[isrepl] = NULL; matchindex[isrepl] = -1; } matchlen[offset + replindex] = replcut; } /* This is a linear search because I tried a binary search and found it to be just a teeny bit slower. */ for (k = 0; match[k]; k++) { if ((hyphens[offset + k] < match[k])) { hyphens[offset + k] = match[k]; if (match[k]&1) { matchrepl[offset + k] = repl; if (repl && (k >= replindex) && (k <= replindex + replcut)) { matchindex[offset + replindex] = offset + k; } } } } } /* KBH: we need this to make sure we keep looking in a word */ /* for patterns even if the current character is not known in state 0 */ /* since patterns for hyphenation may occur anywhere in the word */ try_next_letter: ; } #ifdef VERBOSE for (i = 0; i < j; i++) putchar (hyphens[i]); putchar ('\n'); #endif for (i = 0; i < j - 3; i++) #if 0 if (hyphens[i + 1] & 1) hyphens[i] = '-'; #else hyphens[i] = hyphens[i + 1]; #endif for (; i < word_size; i++) hyphens[i] = '0'; hyphens[word_size] = '\0'; /* now create a new char string showing hyphenation positions */ /* count the hyphens and allocate space for the new hyphenated string */ nHyphCount = 0; for (i = 0; i < word_size; i++) if (hyphens[i]&1) nHyphCount++; j = 0; for (i = 0; i < word_size; i++) { if (isrepl && (matchindex[i] >= 0) && matchrepl[matchindex[i]]) { if (rep && pos && cut) { if (!*rep && !*pos && !*cut) { int k; *rep = (char **) malloc(sizeof(char *) * word_size); *pos = (int *) malloc(sizeof(int) * word_size); *cut = (int *) malloc(sizeof(int) * word_size); for (k = 0; k < word_size; k++) { (*rep)[k] = NULL; (*pos)[k] = 0; (*cut)[k] = 0; } } (*rep)[matchindex[i] - 1] = hnj_strdup(matchrepl[matchindex[i]]); (*pos)[matchindex[i] - 1] = matchindex[i] - i; (*cut)[matchindex[i] - 1] = matchlen[i]; } j += strlen(matchrepl[matchindex[i]]); i += matchlen[i] - 1; } } if (matchrepl != matchrepl_buf) { hnj_free (matchrepl); hnj_free (matchlen); hnj_free (matchindex); } // recursive hyphenation of the first (compound) level segments if (dict->nextlevel) { char * rep2_buf[MAX_WORD]; int pos2_buf[MAX_WORD]; int cut2_buf[MAX_WORD]; char hyphens2_buf[MAX_WORD]; char ** rep2; int * pos2; int * cut2; char * hyphens2; int begin = 0; if (word_size < MAX_CHARS) { rep2 = rep2_buf; pos2 = pos2_buf; cut2 = cut2_buf; hyphens2 = hyphens2_buf; } else { rep2 = hnj_malloc (word_size * sizeof(char *)); pos2 = hnj_malloc (word_size * sizeof(int)); cut2 = hnj_malloc (word_size * sizeof(int)); hyphens2 = hnj_malloc (word_size); } for (i = 0; i < word_size; i++) rep2[i] = NULL; for (i = 0; i < word_size; i++) if (hyphens[i]&1 || (begin > 0 && i + 1 == word_size)) { if (i - begin > 1) { int hyph = 0; prep_word[i + 2] = '\0'; /* non-standard hyphenation at compound boundary (Schiffahrt) */ if (*rep && *pos && *cut && (*rep)[i]) { char * l = strchr((*rep)[i], '='); strcpy(prep_word + 2 + i - (*pos)[i], (*rep)[i]); if (l) { hyph = (l - (*rep)[i]) - (*pos)[i]; prep_word[2 + i + hyph] = '\0'; } } hnj_hyphen_hyph_(dict, prep_word + begin + 1, i - begin + 1 + hyph, hyphens2, &rep2, &pos2, &cut2, clhmin, crhmin, (begin > 0 ? 0 : lend), (hyphens[i]&1 ? 0 : rend)); for (j = 0; j < i - begin - 1; j++) { hyphens[begin + j] = hyphens2[j]; if (rep2[j] && rep && pos && cut) { if (!*rep && !*pos && !*cut) { int k; *rep = (char **) malloc(sizeof(char *) * word_size); *pos = (int *) malloc(sizeof(int) * word_size); *cut = (int *) malloc(sizeof(int) * word_size); for (k = 0; k < word_size; k++) { (*rep)[k] = NULL; (*pos)[k] = 0; (*cut)[k] = 0; } } (*rep)[begin + j] = rep2[j]; (*pos)[begin + j] = pos2[j]; (*cut)[begin + j] = cut2[j]; } } prep_word[i + 2] = word[i + 1]; if (*rep && *pos && *cut && (*rep)[i]) { strcpy(prep_word + 1, word); } } begin = i + 1; for (j = 0; j < word_size; j++) rep2[j] = NULL; } // non-compound if (begin == 0) { hnj_hyphen_hyph_(dict->nextlevel, word, word_size, hyphens, rep, pos, cut, clhmin, crhmin, lend, rend); if (!lend) hnj_hyphen_lhmin(dict->utf8, word, word_size, hyphens, rep, pos, cut, clhmin); if (!rend) hnj_hyphen_rhmin(dict->utf8, word, word_size, hyphens, rep, pos, cut, crhmin); } if (rep2 != rep2_buf) { free(rep2); free(cut2); free(pos2); free(hyphens2); } } if (prep_word != prep_word_buf) hnj_free (prep_word); return 0; } /* UTF-8 normalization of hyphen and non-standard positions */ int hnj_hyphen_norm(const char *word, int word_size, char * hyphens, char *** rep, int ** pos, int ** cut) { if ((((unsigned char) word[0]) >> 6) == 2) { fprintf(stderr, "error - bad, non UTF-8 input: %s\n", word); return 1; } /* calculate UTF-8 character positions */ int i, j, k; for (i = 0, j = -1; i < word_size; i++) { /* beginning of an UTF-8 character (not '10' start bits) */ if ((((unsigned char) word[i]) >> 6) != 2) j++; hyphens[j] = hyphens[i]; if (rep && pos && cut && *rep && *pos && *cut) { int l = (*pos)[i]; (*pos)[j] = 0; for (k = 0; k < l; k++) { if ((((unsigned char) word[i - k]) >> 6) != 2) (*pos)[j]++; } k = i - l + 1; l = k + (*cut)[i]; (*cut)[j] = 0; for (; k < l; k++) { if ((((unsigned char) word[k]) >> 6) != 2) (*cut)[j]++; } (*rep)[j] = (*rep)[i]; if (j < i) { (*rep)[i] = NULL; (*pos)[i] = 0; (*cut)[i] = 0; } } } hyphens[j + 1] = '\0'; return 0; } /* get the word with all possible hyphenations (output: hyphword) */ void hnj_hyphen_hyphword(const char * word, int l, const char * hyphens, char * hyphword, char *** rep, int ** pos, int ** cut) { int i, j; for (i = 0, j = 0; i < l; i++, j++) { if (hyphens[i]&1) { hyphword[j] = word[i]; if (*rep && *pos && *cut && (*rep)[i]) { strcpy(hyphword + j - (*pos)[i] + 1, (*rep)[i]); j += strlen((*rep)[i]) - (*pos)[i]; i += (*cut)[i] - (*pos)[i]; } else hyphword[++j] = '='; } else hyphword[j] = word[i]; } hyphword[j] = '\0'; } /* main api function with default hyphenmin parameters */ int hnj_hyphen_hyphenate2 (HyphenDict *dict, const char *word, int word_size, char * hyphens, char *hyphword, char *** rep, int ** pos, int ** cut) { hnj_hyphen_hyph_(dict, word, word_size, hyphens, rep, pos, cut, dict->clhmin, dict->crhmin, 1, 1); hnj_hyphen_lhmin(dict->utf8, word, word_size, hyphens, rep, pos, cut, (dict->lhmin > 0 ? dict->lhmin : 2)); hnj_hyphen_rhmin(dict->utf8, word, word_size, hyphens, rep, pos, cut, (dict->rhmin > 0 ? dict->rhmin : 2)); if (hyphword) hnj_hyphen_hyphword(word, word_size, hyphens, hyphword, rep, pos, cut); if (dict->utf8) return hnj_hyphen_norm(word, word_size, hyphens, rep, pos, cut); return 0; } /* previous main api function with hyphenmin parameters */ int hnj_hyphen_hyphenate3 (HyphenDict *dict, const char *word, int word_size, char * hyphens, char *hyphword, char *** rep, int ** pos, int ** cut, int lhmin, int rhmin, int clhmin, int crhmin) { lhmin = (lhmin > 0 ? lhmin : dict->lhmin); rhmin = (rhmin > 0 ? rhmin : dict->rhmin); hnj_hyphen_hyph_(dict, word, word_size, hyphens, rep, pos, cut, clhmin, crhmin, 1, 1); hnj_hyphen_lhmin(dict->utf8, word, word_size, hyphens, rep, pos, cut, (lhmin > 0 ? lhmin : 2)); hnj_hyphen_rhmin(dict->utf8, word, word_size, hyphens, rep, pos, cut, (rhmin > 0 ? rhmin : 2)); if (hyphword) hnj_hyphen_hyphword(word, word_size, hyphens, hyphword, rep, pos, cut); if (dict->utf8) return hnj_hyphen_norm(word, word_size, hyphens, rep, pos, cut); return 0; } fontmatrix-0.6.0+svn20110930/src/hyphenate/COPYING.LGPL0000644000175000017500000006364411026543633020714 0ustar malexmalex GNU 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 packages--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. ^L 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. ^L 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. ^L 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 or not they are linked directly with the Library itself. ^L 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 run time 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. ^L 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. ^L 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. ^L 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 ^L 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. Copyright (C) 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 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! fontmatrix-0.6.0+svn20110930/src/hyphenate/fmhyphenator.cpp0000644000175000017500000000517111032165122022311 0ustar malexmalex// // C++ Implementation: fmhyphenator // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fmhyphenator.h" #include #include #include #include FMHyphenator::FMHyphenator() { dict = 0; textCodec = 0; } bool FMHyphenator::loadDict(const QString & dictPath, int leftMin, int rightMin) { /* load the hyphenation dictionary */ if(dict) { if(dictPath != currentDictPath) hnj_hyphen_free (dict); else { if(dict) return true; else return false; } } if (( dict = hnj_hyphen_load( dictPath.toLocal8Bit() ) ) == 0) { qDebug()<<"Unable to load dict file:"<lhmin = leftMin; dict->rhmin = rightMin; } return true; } FMHyphenator::~FMHyphenator() { if(dict) hnj_hyphen_free (dict); } /** * * @param word * @return */ HyphList FMHyphenator::hyphenate(const QString & word) const { HyphList ret; if(!dict) return ret; // QMap upperLog; // for(int i(0);ifromUnicode( word.toLower().remove('.') ) : word.toLower().remove('.').toLocal8Bit() ); QByteArray ht( hw.count() + 5, '0' ); char *lcword = hw.data(); char *hyphens = ht.data(); if(hnj_hyphen_hyphenate2(dict, lcword, hw.count(), hyphens, 0, &rep, &pos, &cut)) { qDebug()<<"Hyphenate("<(left, right); } } return ret; } fontmatrix-0.6.0+svn20110930/src/activationwidgetitem.cpp0000644000175000017500000000540311431446461022055 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "activationwidgetitem.h" #include "ui_activationwidgetitem.h" #include "fmfontdb.h" #include "fontitem.h" #include "fmactivate.h" #include "fmactivationreport.h" ActivationWidgetItem::ActivationWidgetItem(const QString& fontID, QWidget *parent) : QWidget(parent), fileName(fontID), ui(new Ui::ActivationWidgetItem) { ui->setupUi(this); FontItem * f(FMFontDb::DB()->Font(fileName)); ui->styleName->setText(f->variant()); ui->activatedStatus->setText(fileName); ui->activatedStatus->setChecked(f->isActivated()); connect(ui->activatedStatus, SIGNAL(toggled(bool)), this, SLOT(activate(bool))); } ActivationWidgetItem::~ActivationWidgetItem() { delete ui; } void ActivationWidgetItem::changeEvent(QEvent *e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void ActivationWidgetItem::activate(bool a) { FontItem * f(FMFontDb::DB()->Font(fileName)); if(f == 0) return; if(a != f->isActivated()) { QList fl; fl.clear(); fl.append(f); FMActivate::getInstance()->errors(); FMActivate::getInstance()->activate(fl, a); QMap actErr(FMActivate::getInstance()->errors()); if(actErr.count() > 0) { FMActivationReport ar(this, actErr); ar.exec(); } emit fontStateChanged(); } } void ActivationWidgetItem::changeState(bool s) { ui->activatedStatus->setChecked(s); } fontmatrix-0.6.0+svn20110930/src/fmrepair.h0000644000175000017500000000166211166407050017102 0ustar malexmalex// // C++ Interface: fmrepair // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMREPAIR_H #define FMREPAIR_H #include #include class FmRepair : public QDialog, private Ui::repairDialog { Q_OBJECT public: FmRepair(QWidget *parent); ~FmRepair(); private: void fillDeadLink(); void fillActNotLinked(); void fillDeactLinked(); void fillUnreferenced(); void fillLists(); void doConnect(); // QList listItems; private slots: void slotSelAllDead(); void slotRemoveDead(); void slotSelAllActNotLinked(); void slotRelinkActNotLinked(); void slotDeactivateActNotLinked(); void slotSelAllDeactLinked(); void slotDelinkDeactLinked(); void slotActivateDeactLinked(); void slotSelectAllUnref(); void slotRemoveUnref(); }; #endif fontmatrix-0.6.0+svn20110930/src/fmshaper.h0000644000175000017500000000172511150010021017057 0ustar malexmalex// // C++ Interface: fmshaper // // Description: in fact represents the Harfbuzz shaper // // // Author: Pierre Marchand , (C) 2007 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMSHAPER_H #define FMSHAPER_H #include #include FT_FREETYPE_H #include FT_SFNT_NAMES_H #include FT_TRUETYPE_TABLES_H #include #include #include "fmotf.h" /** @author Pierre Marchand */ class FMShaper { public: FMShaper(FMOtf *anchor); ~FMShaper(); /* Will return false if there is no GSUB nor GPOS table */ bool setFont (/*FT_Face face, HB_Font font*/ ); bool setScript ( QString script ); QList doShape(QString string , bool ltr); HB_Buffer out_buffer(); private: FMOtf *anchorOTF; FT_Face anchorFace; HB_ShaperItem m; bool faceisset; bool langisset; bool allocated; HB_FontRec hbFont; HB_FontClass fontClass; }; #endif fontmatrix-0.6.0+svn20110930/src/filteritem.cpp0000644000175000017500000000564411524253232017777 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "filteritem.h" #include "ui_filteritem.h" #include "filterdata.h" FilterItem::FilterItem(FilterData *filter, QWidget *parent) : QWidget(parent), d(filter), ui(new Ui::FilterItem) { ui->setupUi(this); QString ssheet; ssheet += QString("QToolButton{border:none;}"); ssheet += QString("QToolButton:checked{border-bottom:2px solid black;}"); ssheet += QString("QToolButton:hover{background:white;}"); // ssheet += QString(); // ssheet += QString(); // ssheet += QString(); // ssheet += QString(); this->setStyleSheet(ssheet); ui->filterLabel->setText(d->getText()); ui->andButton->setChecked(d->data(FilterData::And).toBool()); ui->noButton->setChecked(d->data(FilterData::Not).toBool()); connect(ui->andButton, SIGNAL(clicked(bool)), this, SLOT(setAndMode(bool))); connect(ui->noButton, SIGNAL(clicked(bool)), this, SLOT(setNoMode(bool))); connect(ui->removeButton, SIGNAL(clicked()), this, SIGNAL(remove())); } FilterItem::~FilterItem() { delete ui; delete d; } void FilterItem::changeEvent(QEvent *e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void FilterItem::setAndMode(bool c) { d->setData(FilterData::Or, !c, true); d->setData(FilterData::And, c, true); } void FilterItem::setNoMode(bool c) { d->setData(FilterData::Not, c, true); } void FilterItem::hideOperation(Operation op) { if(op == AND) { if(d->data(FilterData::And).toBool()) { d->setData(FilterData::Or, true); d->setData(FilterData::And, false); } ui->andButton->hide(); } } fontmatrix-0.6.0+svn20110930/src/fmfloatingpreview.h0000644000175000017500000000530311443667514021034 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FMFLOATINGPREVIEW_H #define FMFLOATINGPREVIEW_H #include #include class QPushButton; class QGridLayout; class QVBoxLayout; class QLabel; class QFrame; class QLineEdit; class FontItem; class FMFloatingMenu : public QWidget { Q_OBJECT public: FMFloatingMenu(QWidget * parent, FontItem * item); void childrenVisible(bool v); //protected: // void enterEvent(QEvent * e); // void leaveEvent(QEvent *e); private: FontItem * fontItem; QPushButton * closeButton; QPushButton * actButton; QFrame * line; QGridLayout * menuLayout; QLabel * fontName; QLineEdit * text; private slots: void forwardCloseClicked(); void activateFont(); signals: void closeClicked(); }; class FontItem; class FMFloatingPreview : public QWidget { Q_OBJECT FMFloatingPreview(QWidget * parent, FontItem * item); public: ~FMFloatingPreview(); static void create(FontItem* item, QRect pos=QRect()); protected: void mousePressEvent(QMouseEvent * e); void mouseReleaseEvent(QMouseEvent * e); void mouseMoveEvent(QMouseEvent * e); void enterEvent(QEvent *e); void leaveEvent(QEvent *e); private: FontItem *fontItem; bool hasMouseGrab; QPoint refPoint; FMFloatingMenu * menuWidget; QVBoxLayout * mainLayout; QLabel * previewLabel; bool canTransparent(); public slots: void updatePreview(const QString& t); }; #endif // FMFLOATINGPREVIEW_H fontmatrix-0.6.0+svn20110930/src/panosewidget.h0000644000175000017500000000407511512623623017770 0ustar malexmalex/*************************************************************************** * Copyright (C) 2009 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef PANOSEWIDGET_H #define PANOSEWIDGET_H #include #include class QTreeWidgetItem; namespace Ui { class PanoseWidget; } class PanoseWidget : public QWidget { Q_OBJECT public: PanoseWidget(QWidget *parent = 0); ~PanoseWidget(); void setFilter(const QMap >& filter); QMap > getFilter() const{return m_filter;} protected: // void changeEvent(QEvent *e); void closeEvent(QCloseEvent *); private: Ui::PanoseWidget *m_ui; int m_filterKey; QMap > m_filter; void doConnect(const bool& c); private slots: void slotSelect(QTreeWidgetItem * item, int column); signals: void filterChanged(); }; #endif // PANOSEWIDGET_H fontmatrix-0.6.0+svn20110930/src/tagswidget.cpp0000644000175000017500000000326311513120141017756 0ustar malexmalex// // C++ Implementation: tagswidget // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include #include #include #include #include #include #include "typotek.h" #include "tagswidget.h" #include "fontitem.h" #include "fmfontdb.h" #include "tagswidget_listmodel.h" TagsWidget::TagsWidget ( QWidget * parent ) :QWidget ( parent ) { setupUi ( this ); model = new TagsWidget_ListModel(this); tagsListView->setModel(model); connect ( newTagButton,SIGNAL ( clicked ( bool ) ),this,SLOT ( slotNewTag() ) ); connect( removeTagButton, SIGNAL(clicked()), this, SLOT(slotActRemovetag())); } TagsWidget::~ TagsWidget() { } void TagsWidget::prepare(QList fonts) { model->setFonts(fonts); } void TagsWidget::slotNewTag() { QModelIndex idx(model->addTag()); if(!idx.isValid()) return; tagsListView->setCurrentIndex(idx); tagsListView->edit(idx); } void TagsWidget::slotActRemovetag() { QModelIndex idx(tagsListView->currentIndex()); if(!idx.isValid()) return; QString currentTag(model->data(idx, Qt::DisplayRole).toString()); QString message; message = tr ( "Please confirm that you want to remove\nthe following tag from database:" ) + " " + currentTag; if ( QMessageBox::question ( typotek::getInstance(), "Fontmatrix", message , QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel ) == QMessageBox::Ok ) { FMFontDb::DB()->removeTagFromDB ( currentTag ); } } fontmatrix-0.6.0+svn20110930/src/modeltext.h0000644000175000017500000000105611117277172017305 0ustar malexmalex// // C++ Interface: modeltext // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef MODELTEXT_H #define MODELTEXT_H #include class ModelText : public QTextEdit { Q_OBJECT public: ModelText(QWidget * parent); ~ModelText(){} protected: bool canInsertFromMimeData( const QMimeData *source ) const; void insertFromMimeData ( const QMimeData * source ) ; signals: void insertContent(); }; #endif // MODELTEXT_H fontmatrix-0.6.0+svn20110930/src/panosemodel.cpp0000644000175000017500000000775511265612601020147 0ustar malexmalex/*************************************************************************** * Copyright (C) 2009 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "panosemodel.h" #include "parallelcoor.h" #include "fmpaths.h" #include "fmfontstrings.h" #include #include #include /// ATTRIBUTE MODEL PanoseAttributeModel::PanoseAttributeModel(QObject * parent) :QAbstractListModel(parent) { const QMap< FontStrings::PanoseKey, QMap >& p(FontStrings::Panose()); QSettings settings; QString defaultDir(FMPaths::ResourcesDir() + "Panose/Icons"); QString pDir(settings.value("Panose/IconDir", defaultDir).toString() + QDir::separator()); foreach(const FontStrings::PanoseKey& k, p.keys()) { QString fn(pDir + QString::number(k) + QDir::separator() + "attribute.png"); if(QFile::exists(fn)) m_icons << QIcon(fn); else m_icons << QIcon(); m_names << FontStrings::PanoseKeyName(k); } } QVariant PanoseAttributeModel::data(const QModelIndex& index, int role) const { if(!index.isValid()) return QVariant(); if(Qt::DisplayRole == role) { return m_names.at(index.row()); } else if(Qt::DecorationRole == role) { return m_icons.at(index.row()); } return QVariant(); } int PanoseAttributeModel::rowCount(const QModelIndex& parent) const { return m_icons.count(); } /// END OF ATTRIBUTE MODEL /// VALUE MODEL PanoseValueModel::PanoseValueModel( QObject * parent) :QAbstractListModel(parent) { const QMap< FontStrings::PanoseKey, QMap >& p(FontStrings::Panose()); QSettings settings; QString defaultDir(FMPaths::ResourcesDir() + "Panose/Icons"); QString pDir(settings.value("Panose/IconDir", defaultDir).toString() + QDir::separator()); foreach(const FontStrings::PanoseKey& k, p.keys()) { foreach(const int& v, p[k].keys()) { if(v > 1) // We do not want "Any" and "No Fit" { QString fn(pDir + QString::number(k) + QDir::separator() + QString::number(v) +".png"); if(QFile::exists(fn)) m_icons[k] << QIcon(fn); else m_icons[k] << QIcon(); m_names[k] << p[k][v]; } } } m_cat = FontStrings::firstPanoseKey(); } void PanoseValueModel::setCat(const int& cat) { if(cat != m_cat) { m_cat = cat; emit layoutChanged(); } } int PanoseValueModel::rowCount(const QModelIndex& parent) const { return m_names[m_cat].count(); } QVariant PanoseValueModel::data(const QModelIndex& index, int role) const { if(!index.isValid()) return QVariant(); if(Qt::DisplayRole == role) { if(m_icons[m_cat].at(index.row()).isNull()) return m_names[m_cat].at(index.row()); return QString(); } else if(Qt::DecorationRole == role) { return m_icons[m_cat].at(index.row()); } else if(Qt::ToolTipRole == role) { return m_names[m_cat].at(index.row()); } return QVariant(); } /// END OF VALUE MODEL fontmatrix-0.6.0+svn20110930/src/fmvariants.h0000644000175000017500000000357111446420470017452 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FMVARIANTS_H #define FMVARIANTS_H #include #include class FontItem; class FMVariants { static FMVariants *instance; FMVariants(); QList variants; QStringList priorList; void appendVariants(const QString& w, const QString& s, const QString& wi, const QString& o); inline bool compareVariants(const QStringList& a, const QStringList& b); public: static QList Order(QList ul); static FontItem* Preferred(QList ul); }; #endif // FMVARIANTS_H fontmatrix-0.6.0+svn20110930/src/playwidget.ui0000644000175000017500000000436611412070373017636 0ustar malexmalex PlayWidget 0 0 662 524 Form 2 2 QFrame::NoFrame Qt::Horizontal 497 20 Font Size: playFontSize pt 1.000000000000000 999.990000000000009 24.000000000000000 FloatingWidgetToolBar QWidget
floatingwidgettoolbar.h
1
FMPlayGround QGraphicsView
fmplayground.h
fontmatrix-0.6.0+svn20110930/src/fminfodisplay.h0000644000175000017500000000153011221431364020130 0ustar malexmalex// // C++ Interface: fminfodisplay // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMINFODISPLAY_H #define FMINFODISPLAY_H #include /** A processing class generating XHTML to be displayed in Info tab. @author Pierre Marchand */ class FontItem; class FMInfoDisplay { FMInfoDisplay(){} QString html; QString writeFsType(FontItem * font); QString writeSVGPreview(FontItem * font); QString writeOrderedInfo(FontItem * font); QString writePanose(FontItem * font); QString writeLangOS2(FontItem * font); QString url2href(QString value); QString xhtmlifies(const QString& value); public: FMInfoDisplay(FontItem * font); ~FMInfoDisplay(); QString getHtml(); }; #endif fontmatrix-0.6.0+svn20110930/src/fmactivate.cpp0000644000175000017500000002357011237607613017763 0ustar malexmalex// // C++ Implementation: fmactivate // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fmactivate.h" #include "fmfontdb.h" #include "fontitem.h" #include "typotek.h" #include #include #include #include #include FMActivate* FMActivate::instance = 0; FMActivate::FMActivate() { setErrorStrings(); } void FMActivate::setErrorStrings() { //: Activation subroutine failed to make a symbolic link to the font file errorStrings[NO_LINK] = tr("Unable to link"); //: The Font asked for activation is already activated errorStrings[ALREADY_ACTIVE] = tr("Font already activated"); //: Activation subroutine failed to remove a symbolic link to the font file errorStrings[NO_UNLINK] = tr("Unable to un-link"); //: The Font asked for de-activation is already de-activated errorStrings[ALREADY_UNACTIVE] = tr("Font already de-activated"); //: A postcript font (pfb) without its metrics file (afm) errorStrings[MISSING_AFM] = tr("Cannot link or copy the metrics file"); //: A generic error in activation or deactivation process errorStrings[ERROR] = tr("Error", "activation"); } FMActivate * FMActivate::getInstance() { if(!instance) { instance = new FMActivate; Q_ASSERT(instance); } return instance; } #ifdef PLATFORM_APPLE void FMActivate::activate(QList fitList, bool act) { // TODO insert error messages. QMap stack; typotek *T(typotek::getInstance()); foreach(FontItem * fit , fitList) { qDebug() << "Activation of " << fit->path() << act; if ( act ) // Activation { if ( !T->isSysFont(fit) ) { if ( !fit->isActivated() ) { fit->setActivated ( true ); // QFileInfo fofi ( fit->path() ); if ( !QFile::copy ( fit->path() , T->getManagedDir() + "/" + fit->activationName() ) ) { qDebug() << "unable to copy " << fit->path() ; } else { // Success stack[fit] = true; qDebug() << fit->path() << " copied" ; if ( !fit->afm().isEmpty() ) { // QFileInfo afm ( fit->afm() ); if ( !QFile::copy( fit->afm(), T->getManagedDir() + "/" + fit->activationAFMName() ) ) { qDebug() << "unable to copy " << fit->afm(); } else { qDebug() << fit->afm() << "copied"; } } else { qDebug()<<"There is no AFM file attached to "<path(); } } } else { qDebug() << "\tYet activated"; } } else { qDebug() << "\tIs Locked"; } } else // Deactivation { if ( !T->isSysFont(fit) ) { if ( fit->isActivated() ) { fit->setActivated ( false ); // QFileInfo fofi ( fit->path() ); if ( !QFile::remove ( T->getManagedDir() + "/" + fit->activationName() ) ) { qDebug() << "unable to unlink " << fit->name() ; } else { // Success stack[fit] = false; if ( !fit->afm().isEmpty() ) { // QFileInfo afm ( fit->afm() ); if ( !QFile::remove ( T->getManagedDir() + "/" + fit->activationAFMName() ) ) { qDebug() << "unable to unlink " << fit->afm() ; } } // typo->adaptator()->private_signal ( 0, fofi.fileName() ); } } } else { qDebug() << "\tIs Locked"; } } } QStringList aList; FMFontDb::DB()->TransactionBegin(); foreach(FontItem* f, stack.keys()) { f->setActivated(stack[f]); aList << f->path(); } FMFontDb::DB()->TransactionEnd(); emit activationEvent ( aList ); } #elif _WIN32 void FMActivate::activate(QList fitList, bool act) { //TODO implement activation/deactivation for Windows } #else // fontconfig void FMActivate::activate(QList< FontItem * > fitList, bool act) { QMap stack; typotek *T(typotek::getInstance()); foreach(FontItem * fit , fitList) { if ( act ) // Activation { if ( !T->isSysFont(fit) ) { if ( !fit->isActivated() ) { if ( !QFile::link ( fit->path() , T->getManagedDir() + "/" + fit->activationName() ) ) { qDebug() << "unable to link " << fit->path() ; m_errors[fit->path()] = errorStrings[NO_LINK]; } else { // Success stack[fit] = true; qDebug() << fit->path() << " linked" ; if ( !fit->afm().isEmpty() ) { if ( !QFile::link ( fit->afm(), T->getManagedDir() + "/" + fit->activationAFMName() ) ) { qDebug() << "unable to link " << fit->afm(); m_errors[fit->path()] = errorStrings[MISSING_AFM]; } else { qDebug() << fit->afm() << " linked"; } } else { qDebug()<<"There is no AFM file attached to "<path(); } } } else { qDebug() << "\tYet activated"; m_errors[fit->path()] = errorStrings[ALREADY_ACTIVE]; } } else { remFcReject(fit->path()); } } else // Deactivation { if ( !T->isSysFont(fit) ) { if ( fit->isActivated() ) { if ( !QFile::remove ( T->getManagedDir() + "/" + fit->activationName() ) ) { qDebug() << "unable to unlink " << fit->name() ; m_errors[fit->path()] = errorStrings[NO_UNLINK]; } else { stack[fit] = false; if ( !fit->afm().isEmpty() ) { if ( !QFile::remove ( T->getManagedDir() + "/" + fit->activationAFMName() ) ) { qDebug() << "unable to unlink " << fit->afm() ; // if having warnings would not be over done, it would be a warning! m_errors[fit->afm()] = errorStrings[NO_UNLINK]; } } } } else { m_errors[fit->path()] = errorStrings[ALREADY_UNACTIVE]; } } else { addFcReject(fit->path()); } } } QStringList aList; FMFontDb::DB()->TransactionBegin(); foreach(FontItem* f, stack.keys()) { f->setActivated(stack[f]); aList << f->path(); } FMFontDb::DB()->TransactionEnd(); emit activationEvent(aList); } #endif bool FMActivate::addFcReject(const QString & path) { #ifdef HAVE_FONTCONFIG QFile fcfile ( QDir::homePath() + "/.fonts.conf" ); if ( !fcfile.open ( QFile::ReadWrite ) ) { qWarning()<<"Cannot open"<< fcfile.fileName(); return false; } else { QDomDocument fc ( "fontconfig" ); fc.setContent ( &fcfile ); QDomNodeList sellist = fc.elementsByTagName ( "selectfont" ); // First we search if there’s yet an entry for path if(!sellist.isEmpty()) { for ( int s(0); s < sellist.count(); ++s ) { QDomNodeList rejectlist( sellist.at(s).toElement().elementsByTagName("rejectfont") ); if(!rejectlist.isEmpty()) { for( int r(0); r < rejectlist.count(); ++r ) { QDomNodeList globlist(rejectlist.at(r).toElement().elementsByTagName("glob")); if(!globlist.isEmpty()) { for( int g(0); g < globlist.count(); ++g ) { QString t( globlist.at(g).toElement().text() ); if(t == path) { qDebug()<<"Already here"; return true; } } } } } } } // Now we can write in the first place available if(!sellist.isEmpty()) { QDomNodeList rejectlist( sellist.at(0).toElement().elementsByTagName("rejectfont") ); if(!rejectlist.isEmpty()) { // QDomNodeList globlist( rejectlist.at(0).toElement().elementsByTagName("glob") ); // if(!globlist.isEmpty()) // { // QDomText pathelem = fc.createTextNode( path ); // globlist.at(0).toElement().appendChild(pathelem); // } // else // { QDomElement globelem = fc.createElement ( "glob" ); QDomText pathelem = fc.createTextNode( path ); globelem.appendChild(pathelem); rejectlist.at(0).toElement().appendChild(globelem); // } } else { QDomElement rejelem = fc.createElement ( "rejectfont" ); QDomElement globelem = fc.createElement ( "glob" ); QDomText pathelem = fc.createTextNode( path ); globelem.appendChild(pathelem); rejelem.appendChild(globelem); sellist.at(0).toElement().appendChild(rejelem); } } else { QDomElement root = fc.documentElement(); QDomElement selelem = fc.createElement ( "selectfont" ); QDomElement rejelem = fc.createElement ( "rejectfont" ); QDomElement globelem = fc.createElement ( "glob" ); QDomText pathelem = fc.createTextNode( path ); globelem.appendChild(pathelem); rejelem.appendChild(globelem); selelem.appendChild(rejelem); root.appendChild(selelem); } fcfile.resize ( 0 ); QTextStream ts ( &fcfile ); fc.save ( ts,4 ); fcfile.close(); } #endif // HAVE_FONTCONFIG return true; } bool FMActivate::remFcReject(const QString & path) { #ifdef HAVE_FONTCONFIG QFile fcfile ( QDir::homePath() + "/.fonts.conf" ); if ( !fcfile.open ( QFile::ReadWrite ) ) { return false; } else { QDomDocument fc ( "fontconfig" ); fc.setContent ( &fcfile ); QDomNodeList sellist = fc.elementsByTagName ( "selectfont" ); if(!sellist.isEmpty()) { for ( int s(0); s < sellist.count(); ++s ) { QDomNodeList rejectlist( sellist.at(s).toElement().elementsByTagName("rejectfont") ); if(!rejectlist.isEmpty()) { for( int r(0); r < rejectlist.count(); ++r ) { QDomNodeList globlist(rejectlist.at(r).toElement().elementsByTagName("glob")); if(!globlist.isEmpty()) { for( int g(0); g < globlist.count(); ++g ) { QString t( globlist.at(g).toElement().text() ); if(t == path) { rejectlist.at(r).removeChild(globlist.at(g).toElement()); fcfile.resize ( 0 ); QTextStream ts ( &fcfile ); fc.save ( ts,4 ); fcfile.close(); return true; } } } } } } } } #endif // HAVE_FONTCONFIG return true; } QMap FMActivate::errors() { QMap ret(m_errors); m_errors.clear(); return ret; } fontmatrix-0.6.0+svn20110930/src/filterdata.h0000644000175000017500000000434711420311616017412 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FILTERDATA_H #define FILTERDATA_H #include #include #include #include #include #include #include class FilterItem; class FontItem; class FilterData : public QObject { Q_OBJECT public: FilterData(); enum Index{ Replace = 1, Or, And, Not, Text, UserIndex = 16 }; virtual void setData(int index, QVariant data, bool signalChange = false); virtual QVariant data(int index) const; virtual QString getText() const; virtual QByteArray toByteArray() const; virtual void fromByteArray(const QByteArray& ba); virtual FilterItem* item(); virtual QString type() const = 0; virtual void operate() = 0; protected: QMap vData; virtual void operateFilter(QList fl); private: QPointer f; signals: void Operated(); void Changed(); }; #endif // FILTERDATA_H fontmatrix-0.6.0+svn20110930/src/typotek.h0000644000175000017500000002613311524253232016773 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TYPOTEK_H #define TYPOTEK_H #include #include #include #include #include #include #include #include #include #include "prefspaneldialog.h" class QAction; class QMenu; class QTextEdit; class MainViewWidget; class BrowserWidget; class FontItem; // class TypotekAdaptator; class QDockWidget; class Systray; class RemoteDir; class FMHyphenator; class QProgressBar; // class HelpWidget; class HelpBrowser; class DataLoader; class FloatingWidget; class QStackedWidget; class typotek:public QMainWindow { Q_OBJECT static typotek* instance; static bool matrix; typotek(); ~typotek(); public: static typotek* getInstance(); void initMatrix(); void postInit(); protected: void closeEvent ( QCloseEvent *event ); void keyPressEvent ( QKeyEvent * event ) ; private slots: void fontBook(); void slotActivateCurrents(); void slotDeactivateCurrents(); void slotEditFont(); void about(); void helpBegin(); void helpEnd(); void slotExportFontSet(); void slotRemoteIsReady(); void slotRepair(); void slotTagAll(); void slotDockAreaChanged(Qt::DockWidgetArea area); // void slotSwitchLayOptVisible(); // void slotUpdateLayOptStatus(); void slotShowTTTables(); void slotEditPanose(); void slotDumpInfo(); void slotReloadFiltered(); void slotReloadSingle(); void slotExecScript(); void slotExecLastScript(); void slotExecRecentScript(); void slotSwitchScriptConsole(); void slotUpdateScriptConsoleStatus(); void slotExtractFont(); void slotMatchRaster(); public slots: void open( QString path = QString(), bool recursive = true, bool announce = true, bool collect = false ); void importFiles(); void openList( QStringList files ); void slotCloseToSystray(bool isEnabled); void slotSystrayStart(bool isEnabled); void slotUseInitialTags(bool isEnabled); void showImportedFonts(int show); bool showImportedFonts(); void slotPrefsPanelDefault(); void slotPrefsPanel(PrefsPanelDialog::PAGE page); void relayStartingStepIn(QString s); void showToltalFilteredFonts(); void updateFloatingStatus(); void closeAllFloatings(); void showAllFloatings(); void hideAllFloatings(); void toggleMainView(bool v); void pushObject(QObject* o); void hide(); void show(); signals: void relayStartingStepOut(QString, int, QColor); void previewHasChanged(); void newFontsArrived(); private: void installDock(const QString& id, const QString& name, QWidget *w, const QString& tip=QString() ); void createActions(); void createMenus(); void createToolBars(); void createStatusBar(); void readSettings(); void writeSettings(); bool maybeSave(); void initDir(); void doConnect(); void setupDrop(); void checkOwnDir(); void fillTagsList(); QTextEdit *textEdit; QString curFile; QMenu *fileMenu; QMenu *editMenu; QMenu *servicesMenu; QMenu *viewMenu; #ifdef HAVE_PYTHONQT QMenu *scriptMenu; #endif QMenu *helpMenu; QToolBar *fileToolBar; QToolBar *editToolBar; QAction *newAct; QAction *openAct; QAction *importFilesAction; QAction *exitAct; QAction *cutAct; QAction *copyAct; QAction *pasteAct; QAction *aboutAct; QAction *aboutQtAct; QAction *fontBookAct; QAction *activCurAct; QAction *deactivCurAct; QAction *helpAct; QAction *fonteditorAct; QAction *prefsAct; QAction *exportFontSetAct; QAction *repairAct; QAction *tagAll; QAction *showTTTAct; QAction *editPanoseAct; QAction *dumpInfoAct; QAction *reloadAct; QAction *reloadSingleAct; #ifdef HAVE_PYTHONQT QAction *execScriptAct; QAction *execLastScriptAct; QString lastScript; QMap recentScripts; QAction *scriptConsoleAct; #endif QAction *extractFontAction; QAction *matchRasterAct; QAction *playAction; QAction *compareAction; QAction *closeAllFloat; QAction *showAllFloat; QAction *hideAllFloat; QAction *floatSep; // HelpWidget *theHelp; HelpBrowser *theHelp; // QAction *layOptAct; QProgressBar *statusProgressBar; QStackedWidget * mainStack; MainViewWidget *theMainView; BrowserWidget * theBrowser; QFile ResourceFile; QDir ownDir; QDir managedDir; DataLoader * dataLoader; // QMap m_namedSamples; QString m_theWord; QLabel *curFontPresentation; QLabel *countFilteredFonts; Systray *systray; bool useInitialTags; bool showFontListDialog; static QString fonteditorPath; QString templatesDir; double previewSize; bool previewRTL; bool previewSubtitled; bool m_familySchemeFreetype; QString m_welcomeURL; QString m_sysTagName; void addFcDirItem(const QString &dirPath); QStringList getSystemFontDirs(); QStringList sysFontList; RemoteDir *remoteDir; QString m_remoteTmpDir; QMap dockWidget; QMap dockArea; QMap dockVisible; QMap dockGeometry; FMHyphenator *hyphenator; QString defaultOTFScript; QString defaultOTFLang; QStringList defaultOTFGPOS; QStringList defaultOTFGSUB; int chartInfoFontSize; QString chartInfoFontName; double previewInfoFontSize; QString databaseDriver; QString databaseHostname; QString databaseDbName; QString databaseUser; QString databasePassword; int panoseMatchTreshold; QString webBrowser; QString webBrowserOptions; QString infoStyle; double m_dpiX; double m_dpiY; QMap floatingWidgets; QMap visibleFloatingWidgets; bool playVisible; QString currentNamedSample; QToolButton * toggleMainViewButton; public: bool isSysFont(FontItem* f); FontItem* getSelectedFont(); void resetFilter(); QString getManagedDir(){return managedDir.absolutePath();} QFile* getResourceFile(){ return &ResourceFile; } void setSampleText(QString s); void presentFontName(QString s); void forwardUpdateView(); // TODO there is a lot of things here which MUST go to an independent PrefsManager class Systray *getSystray() const {return systray;} void setSystrayVisible(bool); void showActivateAllSystray(bool); void systrayAllConfirmation(bool); void systrayTagsConfirmation(bool); // Samples QString namedSample(QString name = QString()); QMap > namedSamplesNames(); void addNamedSample(QString name, QString sample); void removeNamedSample(const QString& key); void changeSample(QString name, QString text); QString defaultSampleName(); void setFontEditorPath(const QString &path); QString fontEditorPath() {return fonteditorPath;} bool initialTags() { return useInitialTags;} void setTemplatesDir(const QString &dir); QString getTemplatesDir() {return templatesDir;} void setWord(QString s, bool updateView); QString word(FontItem * item = 0, const QString& alt = QString()); void setPreviewSize(double d); double getPreviewSize(){ return previewSize; } void setPreviewRTL(bool d); bool getPreviewRTL(){ return previewRTL; } void setPreviewSubtitled(bool d); bool getPreviewSubtitled(){ return previewSubtitled; } void removeFontItem(QString key); void removeFontItem(QStringList keyList); void changeFontSizeSettings(double fSize, double lSize); void showStatusMessage(const QString &message); QString remoteTmpDir() const {return m_remoteTmpDir;} void setRemoteTmpDir(const QString &s); bool familySchemeFreetype() const{return m_familySchemeFreetype;} void setFamilySchemeFreetype ( bool theValue ){m_familySchemeFreetype = theValue;} QString welcomeURL() const{return m_welcomeURL;} FMHyphenator* getHyphenator() const; void setDefaultOTFScript ( const QString& theValue ); QString getDefaultOTFScript() const; void setDefaultOTFLang ( const QString& theValue ); QString getDefaultOTFLang() const; void setDefaultOTFGPOS ( const QStringList& theValue ); QStringList getDefaultOTFGPOS() const; void setDefaultOTFGSUB ( const QStringList& theValue ); QStringList getDefaultOTFGSUB() const; void startProgressJob(int max); void runProgressJob(int i = 0); void endProgressJob(); int getChartInfoFontSize() const{return chartInfoFontSize;} QString getChartInfoFontName() const{return chartInfoFontName;} void setChartInfoFontSize ( int theValue ){chartInfoFontSize = theValue;} void setChartInfoFontName ( const QString& theValue ){chartInfoFontName = theValue;} MainViewWidget* getTheMainView() const{return theMainView;} void setDatabaseDriver ( const QString& theValue ){databaseDriver = theValue;} QString getDatabaseDriver() const{return databaseDriver;} void setDatabaseHostname ( const QString& theValue ){databaseHostname = theValue;} QString getDatabaseHostname() const{return databaseHostname;} void setDatabaseDbName ( const QString& theValue ){databaseDbName = theValue;} QString getDatabaseDbName() const{return databaseDbName;} void setDatabaseUser ( const QString& theValue ){databaseUser = theValue;} QString getDatabaseUser() const{return databaseUser;} void setDatabasePassword ( const QString& theValue ){databasePassword = theValue;} QString getDatabasePassword() const{return databasePassword;} void setPanoseMatchTreshold ( int theValue ); int getPanoseMatchTreshold() const; void setWebBrowser ( const QString& theValue ); QString getWebBrowser() const; void setWebBrowserOptions ( const QString& theValue ); QString getWebBrowserOptions() const; double getPreviewInfoFontSize() const{return previewInfoFontSize;} QDir getOwnDir() const{return ownDir;} void setInfoStyle ( const QString& theValue ); QString getInfoStyle() const{ return infoStyle; } QString getSysTagName() const { return m_sysTagName; } double getDpiX() const {return m_dpiX;} double getDpiY() const {return m_dpiY;} protected: void dragEnterEvent(QDragEnterEvent *event); void dropEvent ( QDropEvent * event ); void showEvent ( QShowEvent * event ); friend class Systray; // a bit ugly but i'll need access to privates }; class LazyInit : public QThread { Q_OBJECT public: void run(); signals: void endOfRun(); }; #endif fontmatrix-0.6.0+svn20110930/src/fmfontdb.cpp0000644000175000017500000006432611443453720017440 0ustar malexmalex// // C++ Implementation: fmfontdb // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fmfontdb.h" #include "typotek.h" #include "fontitem.h" #include #include #include #include #include FMFontDb * FMFontDb::instance = 0; FMFontDb::FMFontDb() :QSqlDatabase ( typotek::getInstance()->getDatabaseDriver() ) { fieldName[FontId] = "fontident"; fieldName[Id] = "digitident"; fieldName[Tags] = "tag"; fieldName[Lang] = "lang"; fieldName[InfoKey] = "infokey"; fieldName[InfoValue] = "infovalue"; fieldName[Type] = "type"; fieldName[FsType] = "fstype"; fieldName[Family] = "family"; fieldName[Variant] = "variant"; fieldName[Name] = "name"; fieldName[Panose] = "panose"; fieldName[FileSize] = "filesize"; fieldName[Activation] = "activation"; tableName[InternalId] = "fontmatrix_id"; tableName[Data] = "fontmatrix_data"; tableName[Tag] = "fontmatrix_tags"; tableName[Info] = "fontmatrix_info"; getIdStringFast = "SELECT %1 FROM %2 WHERE %3='%4'"; transactionDeep = 0; priorList << QString("Book") << QString("Normal") << QString("Regular") << QString("Roman") << QString("Plain") << QString("Medium"); } FMFontDb * FMFontDb::DB() { if ( !instance ) { instance = new FMFontDb; instance->initFMDb(); Q_ASSERT ( instance ); } return instance; } void FMFontDb::initRecord ( const QString & id ) { // qDebug()<<"initRecord"< fields, QVariantList values ) { int nId ( getId ( id ) ); bool res ( false ); // transaction(); QVariantList vl; for ( int i ( 0 );i > & info ) { // qDebug()<<"setInfoMap"< FMFontDb::getValues ( Field field, const QList< FontItem * > & fonts) { QList< FontItem * > lF(fonts); if(fonts.isEmpty()) lF = AllFonts(); // TODO really filter out results according to the font list given in argument QList ret; QString qs ( QString ( "SELECT %1,%2 FROM %3" ) .arg ( fieldName[Id]) .arg ( fieldName[field] ) .arg ( tableName[Data] )); QSqlQuery query ( qs,*this ); if ( !query.exec() ) return ret; else { while ( query.next() ) { int id ( query.value ( 0 ).toInt() ); if ( id > 0 ) { FontDBResult fr = qMakePair( fontMap.value ( id ), query.value ( 1 ).toString() ); if(fr.first) ret << fr; } } return ret; } } FontInfoMap FMFontDb::getInfoMap ( const QString & id ) { // qDebug() <<"getInfoMap"<moreInfo(); } QString qs ( QString ( "SELECT * FROM %1 WHERE %2='%3'" ) .arg ( tableName[Info] ) .arg ( fieldName[Id] ) .arg ( getId ( id ) ) ); QSqlQuery query ( qs,*this ); if ( query.exec() ) { int lIdx ( query.record().indexOf ( fieldName[Lang] ) ); int iIdx ( query.record().indexOf ( fieldName[Id] ) ); int kIdx ( query.record().indexOf ( fieldName[InfoKey] ) ); int vIdx ( query.record().indexOf ( fieldName[InfoValue] ) ); int maxIdx ( query.record().count() ); while ( query.next() ) { ret[query.value ( lIdx ).toInt() ][query.value ( kIdx ).toInt() ] = query.value ( vIdx ).toString(); } } else { qDebug() <<"Error executing query"; } return ret; } QList FMFontDb::getInfo ( const QList< FontItem * > & fonts, InfoItem info, int codeLang ) { QList ret; QString where ( QString ( "(%1='%2') AND (%3='%4')" ) .arg ( fieldName[InfoKey] ) .arg ( info ) .arg ( fieldName[Lang] ) .arg ( codeLang ) ); QString qs ( "SELECT %1,%2 FROM %3 WHERE " + where ); QSqlQuery query ( qs.arg ( fieldName[Id] ) .arg ( fieldName[InfoValue] ) .arg ( tableName[Info] ), *this ); if ( !query.exec() ) return ret; else { while ( query.next() ) { int id ( query.value ( 0 ).toInt() ); if ( id > 0 ) { FontDBResult fr = qMakePair( fontMap.value ( id ), query.value ( 1 ).toString() ); if(fr.first) ret << fr; } } return ret; } } void FMFontDb::addTag ( const QString & id, const QString & t ) { int nId ( getId ( id ) ); QString ts ( QString ( "INSERT INTO %1(%2,%3) VALUES('%4','%5')" ) .arg ( tableName[Tag] ) .arg ( fieldName[Id] ) .arg ( fieldName[Tags] ) .arg ( nId ) .arg ( t ) ); QSqlQuery query ( ts,*this ); if ( query.exec() ) qDebug()<getDatabaseHostname() ); setDatabaseName ( typotek::getInstance()->getDatabaseDbName() ); setUserName ( typotek::getInstance()->getDatabaseUser() ); setPassword ( typotek::getInstance()->getDatabasePassword() ); if ( !open() ) { qDebug() <<"Connection to"< 0 ) { if ( fontMap.contains ( fid ) ) { fitem = fontMap.value ( fid ); fitem->updateItem() ; } else qDebug() <<"ERROR fetching font item"<isValid() ) { fitem->dumpIntoDB(); fid = getId ( id ); if ( fid > 0 ) { fontMap[fid] = fitem; } else { delete fitem; fitem = 0; qDebug() <<"ERROR creating font item"< FMFontDb::AllFonts() { // if(!fontMap.isEmpty()) return fontMap.values(); } QStringList FMFontDb::AllFontNames() { return cacheId.keys(); } QList< FontItem * > FMFontDb::FamilySet(const QString& family) { QList< FontItem * > ret; foreach(FontItem * f, fontMap.values()) { if(f->family() == family) ret << f; } return ret; } void FMFontDb::TransactionBegin() { if ( transactionDeep > 0 ) ++transactionDeep; else { if(transaction()) { transactionError.clear(); ++transactionDeep; } else qDebug()<< "Cannot BEGIN transaction"; // qDebug() <<"TransactionBegin"; } } bool FMFontDb::TransactionEnd() { // qDebug() <<"TransactionEnd"<< (transactionDeep - 1); --transactionDeep; if ( transactionDeep > 0 ) return true; if ( transactionError.isEmpty() ) { commit(); return true; } else { bool cestGraveDocteur ( false ); qDebug() <<"ERRORS =========================================================================="; foreach ( QSqlError e,transactionError ) { qDebug() < FMFontDb::Fonts ( const QVariant & pattern, Field field ) { if ( ( field == Family ) || ( field == Type ) || ( field == Variant ) || ( field == Name ) /*|| ( field == Panose ) */) return Fonts ( QString ( "%1='%2'" ).arg ( fieldName[field] ).arg ( pattern.toString() ), Data ); else if ( field == Tags ) return Fonts ( QString ( "%1='%2'" ).arg ( fieldName[field] ).arg ( pattern.toString() ), Tag ); else if ( field == Activation || ( field == FsType ) ) return Fonts ( QString ( "%1='%2'" ).arg ( fieldName[field] ).arg ( pattern.toInt() ), Data ); else return QList< FontItem * >(); } QList< FontItem * > FMFontDb::Fonts ( const QVariant & pattern, InfoItem info, int codeLang ) { QString qs ( QString ( "(%1='%2') AND (%3='%4') AND (%5 LIKE '\%%6\%')" ) .arg ( fieldName[InfoKey] ) .arg ( info ) .arg ( fieldName[Lang] ) .arg ( codeLang ) .arg ( fieldName[InfoValue] ) .arg ( pattern.toString() ) ); // qDebug()< FMFontDb::Fonts ( const QString & whereString, Table table) { // QList< FontItem * > ret; QString qs ( "SELECT %1 FROM %2 WHERE " + whereString ); QSqlQuery query ( qs.arg ( fieldName[Id] ) .arg ( tableName[table] ), *this ); if ( !query.exec() ) return QList< FontItem * >(); else { // if(!familyOnly) { QMap reg; while ( query.next() ) { int id ( query.value ( 0 ).toInt() ); if ( id > 0 ) { if( !fontMap.value(id) ) qDebug()<<"ERROR : DB contains references to id"< 0 ) { if ( fontMap.contains ( fid ) ) { return true; } } // Build an item FontItem *item ( new FontItem ( absPath ) ); if ( !item->isValid() ) { delete item; return false; } temporaryFont[absPath] = item; // item->lock(); return true; } void FMFontDb::clearFilteredFonts() { currentFonts.clear(); currentFamiliesCache.clear(); } QList FMFontDb::getFilteredFonts(bool familyOnly) { if(!familyOnly) return currentFonts; if(currentFamiliesCache.isEmpty() && (!currentFonts.isEmpty())) { QMap > pools; foreach(FontItem* it, currentFonts) { if(pools.contains(it->family())) pools[it->family()].append(it); else { QList< FontItem* > tl; tl.append(it); pools[it->family()] = tl; } } foreach(const QString& k, pools.keys()) { FontItem* sel = pools[k].first(); foreach(FontItem* it, pools[k]) { if(priorList.contains(it->variant(), Qt::CaseInsensitive)) { sel = it; break; } } currentFamiliesCache << sel; } } return currentFamiliesCache; } void FMFontDb::setFilterdFonts(const QList &flist) { currentFonts.clear(); currentFamiliesCache.clear(); currentFonts = flist; } int FMFontDb::countFilteredFonts() const { return currentFonts.count(); } void FMFontDb::insertFilteredFont(FontItem *item) { if((item != 0) && (!currentFonts.contains(item))) { currentFonts.append(item); currentFamiliesCache.clear(); } } void FMFontDb::removeFilteredFont(FontItem *item) { if(item != 0) { currentFonts.removeAll(item); currentFamiliesCache.clear(); } } bool FMFontDb::isFiltered(FontItem *item) const { return currentFonts.contains(item); } void FMFontDb::filterAllFonts() { currentFonts.clear(); currentFamiliesCache.clear(); currentFonts = fontMap.values(); } fontmatrix-0.6.0+svn20110930/src/helpwidget.cpp0000644000175000017500000000507711041364552017771 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "helpwidget.h" #include "fmpaths.h" #include HelpWidget::HelpWidget(QWidget *parent) : QDialog(parent) { setupUi(this); theText->page()->setLinkDelegationPolicy(QWebPage::DelegateExternalLinks); theText->load(QUrl::fromLocalFile(FMPaths::HelpFilePath())); progressBar->hide(); connect(closeButton,SIGNAL( clicked() ),this,SLOT( slotIsClosing() )); connect(this,SIGNAL( finished(int) ),this,SLOT( slotIsClosing() )); connect( theText, SIGNAL(linkClicked ( const QUrl& )), this, SLOT(slotWebLink(const QUrl&))); connect( theText, SIGNAL(loadStarted () ),this,SLOT(slotWebStart())); connect( theText, SIGNAL(loadProgress ( int ) ),this, SLOT(slotWebLoad(int))); connect( theText, SIGNAL(loadFinished ( bool ) ),this,SLOT(slotWebFinished(bool))); } HelpWidget::~HelpWidget() { } void HelpWidget::slotIsClosing() { emit end(); } void HelpWidget::slotWebLink(const QUrl & url) { qDebug()<<"slotWebLink("<setText(url.toString()); theText->load(url); } void HelpWidget::slotWebStart() { progressBar->setRange(0,100); progressBar->show(); } void HelpWidget::slotWebLoad(int i) { progressBar->setValue(i); } void HelpWidget::slotWebFinished(bool ) { progressBar->hide(); } fontmatrix-0.6.0+svn20110930/src/sampletoolbar.cpp0000644000175000017500000000660011445710452020474 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "sampletoolbar.h" #include "ui_sampletoolbar.h" #include "fmfontstrings.h" SampleToolBar::SampleToolBar(QWidget *parent) : QWidget(parent), ui(new Ui::SampleToolBar) { ui->setupUi(this); // setAutoFillBackground(true); connect(ui->liveSize, SIGNAL(valueChanged(double)), this, SIGNAL(SizeChanged(double))); connect(ui->sampleButton, SIGNAL(toggled(bool)), this, SIGNAL(SampleToggled(bool))); connect(ui->opentypeButton, SIGNAL(toggled(bool)), this, SIGNAL(OpenTypeToggled(bool))); connect(ui->languageCombo, SIGNAL(currentIndexChanged(int)), this, SIGNAL(ScriptSelected())); } SampleToolBar::~SampleToolBar() { delete ui; } void SampleToolBar::changeEvent(QEvent *e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } double SampleToolBar::getFontSize() const { return ui->liveSize->value(); } void SampleToolBar::setFontSize(double fs) { ui->liveSize->setValue(fs); } bool SampleToolBar::isChecked(Button b) { if(b == SampleButton) return ui->sampleButton->isChecked(); else if(b == OpenTypeButton) return ui->opentypeButton->isChecked(); return false; } void SampleToolBar::toggle(Button b, bool c) { if(b == SampleButton) ui->sampleButton->setChecked(c); else if(b == OpenTypeButton) ui->opentypeButton->setChecked(c); } void SampleToolBar::enableButton(Button b, bool c) { if(b == SampleButton) ui->sampleButton->setEnabled(c); else if(b == OpenTypeButton) ui->opentypeButton->setEnabled(c); } void SampleToolBar::setScripts(const QStringList &ll) { ui->languageCombo->addItem(tr("Select language"), QString("NOSHAPER")); foreach(QString l, ll) { ui->languageCombo->addItem(FontStrings::scriptTagName(l), l); } if(ll.isEmpty()) ui->languageCombo->setEnabled(false); } QString SampleToolBar::getScript() { QString ret(ui->languageCombo->itemData(ui->languageCombo->currentIndex()).toString()); if(ret != QString("NOSHAPER")) return ret; return QString(); } fontmatrix-0.6.0+svn20110930/src/chartwidget.ui0000644000175000017500000001256611411071620017766 0ustar malexmalex ChartWidget 0 0 704 587 Form 4 2 0 0 Coverage of Unicode Interval Block: 2 uniPlaneCombo 0 0 true QComboBox::AdjustToContents Qt::Horizontal 40 20 Search: charSearchLine Search a character by its codepoint (expressed in hexadecimal and prefixed with "U+", "u+" or "+") or a glyph by its name. Press enter after editing to run the search. 0 2 Qt::NoFocus Clicking on a glyph will show details about it QFrame::NoFrame Qt::IntersectsItemBoundingRect 0 0 Set Mode "Copy Character to Clipboard" Copy Mode :/action-copy-char:/action-copy-char true Qt::ToolButtonTextOnly true FloatingWidget QWidget
floatingwidget.h
1
FloatingWidgetToolBar QWidget
floatingwidgettoolbar.h
1
FMGlyphsView QGraphicsView
fmglyphsview.h
fontmatrix-0.6.0+svn20110930/src/systray.h0000644000175000017500000000606611237607613017024 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Riku Leino * * riku@scribus.info * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SYSTRAY_H #define SYSTRAY_H #include #include #include class QSettings; class QAction; class typotek; class Systray : public QObject { Q_OBJECT public: Systray(); ~Systray(); bool isVisible(); bool hasActivateAll(); bool allConfirmation(); bool tagsConfirmation(); public slots: void show(); void hide(); void slotSetVisible(bool isVisible); void slotSetActivateAll(bool isVisible); void newTag(QString); void deleteTag(const QString &name); void updateTagMenu(const QStringList& nameOfFontWhichCausedThisUpdate); void requireAllConfirmation(bool doRequire); void requireTagsConfirmation(bool doRequire); private slots: void trayIconClicked(QSystemTrayIcon::ActivationReason reason); void slotActivateAll(); void slotDeactivateAll(); void slotMinimize(); void slotRestore(); void slotTagMenuClicked(QAction *action); void slotQuit(); void slotPrepareMenu(); private: bool confirmAll; bool confirmTags; void createActions(); void createTrayIcon(); void createTagMenu(); QAction *activateAllAction; QAction *deactivateAllAction; QAction *minimizeAction; QAction *restoreAction; QAction *quitAction; QSystemTrayIcon *trayIcon; QMenu *trayIconMenu; QMenu *tagMenu; // QMenu *tagSetMenu; QMap tagActions; static typotek *ttek; bool showAllConfirmation; bool showTagsConfirmation; QSettings *settings; /*** hide these systray is not ment to be copied ***/ Systray(const Systray&) {}; void operator= (const Systray&) {}; // protected: // bool eventFilter ( QObject * watched, QEvent * event ) ; }; #endif fontmatrix-0.6.0+svn20110930/src/helpbrowser.cpp0000644000175000017500000004661111150601271020161 0ustar malexmalex/* For general Scribus (>=1.3.2) copyright and licensing information please refer to the COPYING file provided with the program. Following this notice may exist a copyright and/or license notice that predates the release of Scribus 1.3.2 for which a new license (GPL+exception) is in place. */ /*************************************************************************** * Copyright (C) 2004 by Craig Bradney * * cbradney@zip.com.au * * Copyright (C) 2005 by Petr Vanek * * petr@yarpen.cz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "helpbrowser.h" #include // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "schelptreemodel.h" #include "typotek.h" #include "fmpaths.h" /*! \brief XML parsef for documantation history. This is small helper class which reads saved bookmarks configuration from ~/.scribus/doc/history.xml file. The reference to historyBrowser is a reference to the dialog. \author Petr Vanek */ class HistoryParser2 : public QXmlDefaultHandler { public: HelpBrowser *helpBrowser; bool startDocument() { return true; } bool startElement(const QString&, const QString&, const QString& qName, const QXmlAttributes& attrs) { if (qName == "item") { struct histd2 his; his.title = attrs.value(0); his.url = attrs.value(1); helpBrowser->mHistory[helpBrowser->histMenu->addAction(his.title)] = his; } return true; } bool endElement(const QString&, const QString&, const QString&) { return true; } }; /*! \brief XML parsef for documantation bookmarks. This is small helper class which reads saved bookmarks configuration from ~/.scribus/doc/bookmarks.xml file. The reference to QListView *view is a reference to the list view with bookmarks \author Petr Vanek */ class BookmarkParser2 : public QXmlDefaultHandler { public: QTreeWidget* view; QMap* quickHelpIndex; QMap >* bookmarkIndex; bool startDocument() { return true; } bool startElement(const QString&, const QString&, const QString& qName, const QXmlAttributes& attrs) { if (qName == "item") { //TODO : This will dump items if bookmarks get loaded into a different GUI language if (quickHelpIndex->contains(attrs.value(1))) { bookmarkIndex->insert(attrs.value(0), qMakePair(attrs.value(1), attrs.value(2))); view->addTopLevelItem(new QTreeWidgetItem(view, QStringList() << attrs.value(0))); } } return true; } bool endElement(const QString&, const QString&, const QString&) { return true; } }; bool HelpBrowser::firstRun=true; HelpBrowser::HelpBrowser(QWidget* parent) : QMainWindow( parent ) { setupUi(this); } HelpBrowser::HelpBrowser( QWidget* parent, const QString& /*caption*/, const QString& guiLanguage, const QString& jumpToSection, const QString& jumpToFile) : QMainWindow( parent ) { firstRun=true; setupUi(this); setupLocalUI(); language = guiLanguage.isEmpty() ? QString("en") : guiLanguage.left(2); finalBaseDir = FMPaths::HelpDir(); textBrowser->setHome( QUrl::fromLocalFile( finalBaseDir + "index.html" )); menuModel=NULL; loadMenu(); if (menuModel!=NULL) { readBookmarks(); readHistory(); jumpToHelpSection(jumpToSection, jumpToFile ); languageChange(); } else { qDebug()<<"menuModel == NULL"; displayNoHelp(); } } HelpBrowser::~HelpBrowser() { firstRun=true; } void HelpBrowser::closeEvent(QCloseEvent * event) { delete menuModel; // no need to delete child widgets, Qt does it all for us // bookmarks QFile bookFile(bookmarkFile()); if (bookFile.open(QIODevice::WriteOnly)) { QTextStream stream(&bookFile); stream.setCodec("UTF-8"); stream << "\n"; stream << "\n"; QTreeWidgetItemIterator it(bookmarksView); while (*it) { if (bookmarkIndex.contains((*it)->text(0))) { QString pagetitle(bookmarkIndex.value((*it)->text(0)).first); QString filename(bookmarkIndex.value((*it)->text(0)).second); stream << "\ttext(0) << "\" pagetitle=\"" << pagetitle << "\" url=\"" << filename << "\" />\n"; } ++it; } stream << "\n"; bookFile.close(); } // history QFile histFile(historyFile()); if (histFile.open(QIODevice::WriteOnly)) { QTextStream stream(&histFile); stream.setCodec("UTF-8"); stream << "\n"; stream << "\n"; for (QMap::Iterator it = mHistory.begin() ; it != mHistory.end(); ++it) stream << "\t\n"; stream << "\n"; histFile.close(); } // size // prefs->set("xsize", width()); // prefs->set("ysize", height()); emit closed(); } void HelpBrowser::setupLocalUI() { // setWindowIcon(loadIcon("AppIcon.png")); //Add Menus fileMenu=menuBar()->addMenu(""); editMenu=menuBar()->addMenu(""); bookMenu=menuBar()->addMenu(""); histMenu=new QMenu(this); //Add Menu items filePrint=fileMenu->addAction(QIcon(":/help/document-print.png"), "", this, SLOT(print()), Qt::CTRL+Qt::Key_P); fileMenu->addSeparator(); fileExit=fileMenu->addAction(QIcon(":/help/exit.png"), "", this, SLOT(close())); editFind=editMenu->addAction(QIcon(":/help/find.png"), "", this, SLOT(find()), Qt::CTRL+Qt::Key_F); editFindNext=editMenu->addAction( "", this, SLOT(findNext()), Qt::Key_F3); editFindPrev=editMenu->addAction( "", this, SLOT(findPrevious()), Qt::SHIFT+Qt::Key_F3); bookAdd=bookMenu->addAction( "", this, SLOT(bookmarkButton_clicked()), Qt::CTRL+Qt::Key_D); bookDel=bookMenu->addAction( "", this, SLOT(deleteBookmarkButton_clicked())); bookDelAll=bookMenu->addAction( "", this, SLOT(deleteAllBookmarkButton_clicked())); //Add Toolbar items goHome=toolBar->addAction(QIcon(":/help/go-home.png"), "", textBrowser, SLOT(home())); goBack=toolBar->addAction(QIcon(":/help/go-previous.png"), "", textBrowser, SLOT(back())); goFwd=toolBar->addAction(QIcon(":/help/go-next.png"), "", textBrowser, SLOT(forward())); goBack->setMenu(histMenu); listView->header()->hide(); searchingView->header()->hide(); bookmarksView->header()->hide(); splitter->setStretchFactor(splitter->indexOf(tabWidget), 0); splitter->setStretchFactor(splitter->indexOf(textBrowser), 1); // reset previous size // prefs = PrefsManager::instance()->prefsFile->getPluginContext("helpbrowser"); // int xsize = prefs->getUInt("xsize", 640); // int ysize = prefs->getUInt("ysize", 480); // resize(QSize(xsize, ysize).expandedTo(minimumSizeHint()) ); //basic ui connect(histMenu, SIGNAL(triggered(QAction*)), this, SLOT(histChosen(QAction*))); // searching connect(searchingEdit, SIGNAL(returnPressed()), this, SLOT(searchingButton_clicked())); connect(searchingButton, SIGNAL(clicked()), this, SLOT(searchingButton_clicked())); connect(searchingView, SIGNAL(itemClicked( QTreeWidgetItem *, int)), this, SLOT(itemSearchSelected(QTreeWidgetItem *, int))); // bookmarks connect(bookmarkButton, SIGNAL(clicked()), this, SLOT(bookmarkButton_clicked())); connect(deleteBookmarkButton, SIGNAL(clicked()), this, SLOT(deleteBookmarkButton_clicked())); connect(deleteAllBookmarkButton, SIGNAL(clicked()), this, SLOT(deleteAllBookmarkButton_clicked())); connect(bookmarksView, SIGNAL(itemClicked( QTreeWidgetItem *, int)), this, SLOT(itemBookmarkSelected(QTreeWidgetItem *, int))); // links hoover connect(textBrowser, SIGNAL(overLink(const QString &)), this, SLOT(showLinkContents(const QString &))); languageChange(); } void HelpBrowser::showLinkContents(const QString &link) { statusBar()->showMessage(link); } void HelpBrowser::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { languageChange(); } else QWidget::changeEvent(e); } void HelpBrowser::languageChange() { setWindowTitle( tr( "Fontmatrix Online Help" ) ); fileMenu->setTitle(tr("&File")); editMenu->setTitle(tr("&Edit")); bookMenu->setTitle(tr("&Bookmarks")); filePrint->setText(tr("&Print...")); fileExit->setText(tr("&Quit")); editFind->setText(tr("&Find...")); editFindNext->setText(tr("Find &Next")); editFindPrev->setText(tr("Find &Previous")); bookAdd->setText(tr("&Add Bookmark")); bookDel->setText(tr("&Delete")); bookDelAll->setText(tr("D&elete All")); Ui::HelpBrowser::retranslateUi(this); // if (!firstRun) // { // QString fname(QDir::cleanPath(textBrowser->source().toString())); // QFileInfo fi(fname); // QString filename(fi.fileName()); // if (ScCore->getGuiLanguage().isEmpty()) // language="en"; // else // language=ScCore->getGuiLanguage(); // loadMenu(); // if (menuModel!=NULL) // loadHelp(finalBaseDir + "/" + filename); // } // else // firstRun=false; } void HelpBrowser::print() { QPrinter printer; printer.setFullPage(true); QPrintDialog dialog(&printer, this); if (dialog.exec()) textBrowser->print(&printer); } void HelpBrowser::searchingButton_clicked() { // root files QApplication::changeOverrideCursor(QCursor(Qt::WaitCursor)); searchingInDirectory(finalBaseDir); QApplication::changeOverrideCursor(Qt::ArrowCursor); } void HelpBrowser::searchingInDirectory(const QString& aDir) { QDir dir(QDir::convertSeparators(aDir + "/")); QStringList in; in.append("*.html"); QStringList lst = dir.entryList(in); for (QStringList::Iterator it = lst.begin(); it != lst.end(); ++it) { QString fname(aDir + "/" + (*it)); QFile f(fname); if (f.open(QIODevice::ReadOnly)) { QTextStream stream(&f); QString str = stream.readAll(); int cnt = str.count(searchingEdit->text(), Qt::CaseInsensitive); if (cnt > 0) { QString fullname = fname; QString toFind(fname.remove(finalBaseDir + "/")); QMapIterator i(quickHelpIndex); while (i.hasNext()) { i.next(); if (i.value()==toFind) searchingView->addTopLevelItem(new QTreeWidgetItem(searchingView, QStringList() << i.key())); } } f.close(); } } // get dirs - ugly recursion in.clear(); in.append("*"); QStringList dst = dir.entryList(in, QDir::Dirs); for (QStringList::Iterator it = dst.begin(); it != dst.end(); ++it) if ((*it)!="." && (*it)!="..") searchingInDirectory(QDir::convertSeparators(aDir + QString((*it)) + "/")); } void HelpBrowser::find() { findText = QInputDialog::getText( this, tr("Find"), tr("Search Term:"), QLineEdit::Normal, findText, 0); if (findText.isNull()) return; findNext(); } void HelpBrowser::findNext() { if (findText.isNull()) { find(); return; } // find it. finally textBrowser->findText(findText, 0); } void HelpBrowser::findPrevious() { if (findText.isNull()) { find(); return; } // find it. finally textBrowser->findText(findText); } void HelpBrowser::bookmarkButton_clicked() { QString title = textBrowser->title(); QString fname(QDir::cleanPath(textBrowser->url().toLocalFile())); title = QInputDialog::getText(this, tr("New Bookmark"), tr("New Bookmark's Title:"), QLineEdit::Normal, title, 0); // user cancel if (title.isNull()) return; //TODO: start storing full paths QString toFind(fname.remove(QDir::convertSeparators(finalBaseDir))); toFind=toFind.mid(1, toFind.length()-1); QMapIterator i(quickHelpIndex); while (i.hasNext()) { i.next(); if (i.value()==toFind) { bookmarkIndex.insert(title, qMakePair(i.key(), i.value())); bookmarksView->addTopLevelItem(new QTreeWidgetItem(bookmarksView, QStringList() << title)); } } } void HelpBrowser::deleteBookmarkButton_clicked() { QTreeWidgetItem *twi=bookmarksView->currentItem(); if (twi!=NULL) { if (bookmarkIndex.contains(twi->text(0))) bookmarkIndex.remove(twi->text(0)); delete twi; } } void HelpBrowser::deleteAllBookmarkButton_clicked() { bookmarkIndex.clear(); bookmarksView->clear(); } void HelpBrowser::histChosen(QAction* i) { if (mHistory.contains(i)) textBrowser->load( QUrl::fromLocalFile(mHistory[i].url) ); } void HelpBrowser::jumpToHelpSection(const QString& jumpToSection, const QString& jumpToFile) { QString toLoad; bool noDocs=false; if (jumpToFile.isEmpty()) { toLoad = finalBaseDir + "/"; //clean this later to handle 5 char locales if (jumpToSection.isEmpty()) { QModelIndex index=menuModel->index(0,1); if (index.isValid()) { listView->selectionModel()->select(index, QItemSelectionModel::ClearAndSelect); toLoad += menuModel->data(index, Qt::DisplayRole).toString(); qDebug()<<"jumpToHelpSection"<data(index, Qt::DisplayRole).toString(); } else noDocs=true; } } else toLoad=jumpToFile; if (!noDocs) loadHelp(toLoad); else displayNoHelp(); } void HelpBrowser::loadHelp(const QString& filename) { struct histd2 his; bool Avail = true; QString toLoad; QFileInfo fi; fi = QFileInfo(filename); if (fi.fileName().length()>0) { if (fi.exists()) toLoad=filename; else { toLoad = FMPaths::HelpDir() +"index.html"; // language="en"; qDebug()<<"Help index:"<load( QUrl::fromLocalFile(toLoad) ); his.title = textBrowser->title(); if (his.title.isEmpty()) his.title = toLoad; his.url = toLoad; mHistory[histMenu->addAction(his.title)] = his; } if (mHistory.count() > 15) { QAction* first=histMenu->actions().first(); mHistory.remove(first); histMenu->removeAction(first); } } void HelpBrowser::loadMenu() { QString baseHelpDir = FMPaths::HelpDir(); QString baseHelpMenuFile = baseHelpDir + "/menu.xml"; QFileInfo baseFi = QFileInfo(baseHelpMenuFile); QString toLoad = baseHelpMenuFile; finalBaseDir=baseFi.path(); if (baseFi.exists()) { if (menuModel!=NULL) delete menuModel; menuModel=new ScHelpTreeModel(toLoad, "Topic", "Location", &quickHelpIndex); listView->setModel(menuModel); listView->setSelectionMode(QAbstractItemView::SingleSelection); QItemSelectionModel *selectionModel = new QItemSelectionModel(menuModel); listView->setSelectionModel(selectionModel); connect(listView->selectionModel(), SIGNAL(selectionChanged( const QItemSelection &, const QItemSelection &)), this, SLOT(itemSelected( const QItemSelection &, const QItemSelection &))); listView->setColumnHidden(1,true); } else { qDebug()<<"Help menu does not exist:"<setHtml(str); } void HelpBrowser::itemSelected(const QItemSelection & selected, const QItemSelection & deselected) { Q_UNUSED(deselected); QModelIndex index; QModelIndexList items = selected.indexes(); int i=0; foreach (index, items) { if (i==1) // skip 0, as this is always the rootitem, even if we are selecting the rootitem. hmm { QString filename(menuModel->data(index, Qt::DisplayRole).toString()); if (!filename.isEmpty()) { loadHelp(finalBaseDir + "/" + filename); } } ++i; } } void HelpBrowser::itemSearchSelected(QTreeWidgetItem *twi, int i) { Q_UNUSED(i); if (!twi) return; if (quickHelpIndex.contains(twi->text(0))) { QString filename(quickHelpIndex.value(twi->text(0))); if (!filename.isEmpty()) { loadHelp(finalBaseDir + "/" + filename); findText = searchingEdit->text(); findNext(); } } } void HelpBrowser::itemBookmarkSelected(QTreeWidgetItem *twi, int i) { Q_UNUSED(i); if (!twi) return; if (bookmarkIndex.contains(twi->text(0))) { QString filename(bookmarkIndex.value(twi->text(0)).second); if (!filename.isEmpty()) loadHelp(finalBaseDir + "/" + filename); } } /*! \brief Returns the name of the cfg file for bookmarks. A helper function. \author Petr Vanek */ QString HelpBrowser::bookmarkFile() { QString appDataDir(typotek::getInstance()->getOwnDir().path() + "/"); QString fname(appDataDir + "HelpBookmarks.xml"); // if (!QFile::exists(fname)) // { // QDir d(QDir::convertSeparators(appDataDir)); // d.mkdir("doc"); // } return fname; } /*! \brief Returns the name of the cfg file for persistent history. A helper function. \author Petr Vanek */ QString HelpBrowser::historyFile() { QString appDataDir(typotek::getInstance()->getOwnDir().path() + "/"); QString fname(appDataDir + "HelpHistory.xml"); // if (!QFile::exists(fname)) // { // QDir d(QDir::convertSeparators(appDataDir)); // d.mkdir("doc"); // } return fname; } void HelpBrowser::displayNoHelp() { QString noHelpMsg=tr("

Sorry, no manual is installed!

Please contact your package provider or Fontmatrix team if you built the application yourself

", "HTML message for no documentation available to show"); textBrowser->setHtml(noHelpMsg); filePrint->setEnabled(false); editFind->setEnabled(false); editFindNext->setEnabled(false); editFindPrev->setEnabled(false); bookAdd->setEnabled(false); bookDel->setEnabled(false); bookDelAll->setEnabled(false); goHome->setEnabled(false); goBack->setEnabled(false); goFwd->setEnabled(false); histMenu->disconnect(); searchingEdit->disconnect(); searchingButton->disconnect(); searchingView->disconnect(); bookmarkButton->disconnect(); deleteBookmarkButton->disconnect(); deleteAllBookmarkButton->disconnect(); bookmarksView->disconnect(); textBrowser->disconnect(); } fontmatrix-0.6.0+svn20110930/src/modeltext.cpp0000644000175000017500000000136711117277172017645 0ustar malexmalex// // C++ Implementation: modeltext // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "modeltext.h" #include #include ModelText::ModelText(QWidget * parent) :QTextEdit(parent) { } bool ModelText::canInsertFromMimeData(const QMimeData * source) const { if(source->hasFormat( "application/x-qabstractitemmodeldatalist" )) { return true; } else return QTextEdit::canInsertFromMimeData(source); } void ModelText::insertFromMimeData(const QMimeData * source) { if(source->hasFormat( "application/x-qabstractitemmodeldatalist" )) { emit insertContent(); } else QTextEdit::insertFromMimeData(source); } fontmatrix-0.6.0+svn20110930/src/systray.cpp0000644000175000017500000002345111443453720017351 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Riku Leino * * riku@scribus.info * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "systray.h" #include "mainviewwidget.h" #include "typotek.h" #include "fontitem.h" #include "fmfontdb.h" #include #include typotek* Systray::ttek = 0; Systray::Systray() { createActions(); createTrayIcon(); createTagMenu(); connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayIconClicked(QSystemTrayIcon::ActivationReason))); connect(trayIconMenu, SIGNAL(aboutToShow()), this, SLOT(slotPrepareMenu())); settings = new QSettings; showAllConfirmation = settings->value("Systray/AllConfirmation", true).toBool(); showTagsConfirmation = settings->value("Systray/TagsConfirmation", false).toBool(); slotSetActivateAll(settings->value("Systray/ActivateAllVisible", false).toBool()); trayIcon->setIcon(QIcon(":/fontmatrix_systray_icon.png")); if (settings->value("Systray/Visible", false).toBool()) trayIcon->show(); else trayIcon->hide(); } Systray::~Systray() { } void Systray::slotSetVisible(bool isVisible) { if (isVisible) trayIcon->show(); else trayIcon->hide(); settings->setValue("Systray/Visible", isVisible); } void Systray::slotSetActivateAll(bool isVisible) { activateAllAction->setVisible(isVisible); deactivateAllAction->setVisible(isVisible); settings->setValue("Systray/ActivateAllVisible", isVisible); } void Systray::show() { trayIcon->show(); } void Systray::hide() { trayIcon->hide(); } void Systray::trayIconClicked(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: case QSystemTrayIcon::DoubleClick: ttek->isVisible() ? ttek->hide() : ttek->show(); break; case QSystemTrayIcon::MiddleClick: break; default: ; } } void Systray::slotMinimize() { ttek->showMinimized(); } void Systray::slotRestore() { ttek->showNormal(); } void Systray::slotActivateAll() { // ttek->theMainView->slotViewAll(); // if (showAllConfirmation) { // bool wasVisible = ttek->isVisible(); // if (!wasVisible) // ttek->show(); // ttek->slotActivateCurrents(); // if (!wasVisible) // ttek->hide(); // } else // ttek->theMainView->slotActivateAll(); // disconnect(tagMenu, SIGNAL(triggered(QAction*)), this, SLOT(slotTagMenuClicked(QAction*))); // QList tags = tagActions.values(); // foreach (QAction* a, tags) { // a->setChecked(true); // } // connect(tagMenu, SIGNAL(triggered(QAction*)), this, SLOT(slotTagMenuClicked(QAction*))); } void Systray::slotDeactivateAll() { // ttek->theMainView->slotViewAll(); // if (showAllConfirmation) { // bool wasVisible = ttek->isVisible(); // if (!wasVisible) // ttek->show(); // ttek->slotDeactivateCurrents(); // if (!wasVisible) // ttek->hide(); // } else // ttek->theMainView->slotDesactivateAll(); // disconnect(tagMenu, SIGNAL(triggered(QAction*)), this, SLOT(slotTagMenuClicked(QAction*))); // QList tags = tagActions.values(); // foreach (QAction* a, tags) { // a->setChecked(false); // } // connect(tagMenu, SIGNAL(triggered(QAction*)), this, SLOT(slotTagMenuClicked(QAction*))); } void Systray::slotTagMenuClicked(QAction *action) { // Deactivate the feature atm // action->setIcon(QIcon ()); // QString name = action->text(); // if (name.isEmpty()) // return; // if (!action->isChecked()) { // deactivate based on the tag name // ttek->theMainView->slotFilterTag(name); // if (showTagsConfirmation) { // bool wasVisible = ttek->isVisible(); // if (!wasVisible) // ttek->show(); // ttek->slotDeactivateCurrents(); // if (!wasVisible) // ttek->hide(); // } else // ttek->theMainView->slotDesactivateAll(); // } else { // activate based on the tag name // ttek->theMainView->slotFilterTag(name); // if (showTagsConfirmation) { // bool wasVisible = ttek->isVisible(); // if (!wasVisible) // ttek->show(); // ttek->slotActivateCurrents(); // if (!wasVisible) // ttek->hide(); // } else // ttek->theMainView->slotActivateAll(); // } } void Systray::slotQuit() { ttek->writeSettings(); qApp->quit(); } void Systray::slotPrepareMenu() { if (ttek->isVisible() && !ttek->isMinimized()) { restoreAction->setEnabled(false); minimizeAction->setEnabled(true); } else if (ttek->isHidden() || ttek->isMinimized()) { restoreAction->setEnabled(true); minimizeAction->setEnabled(false); } } void Systray::newTag(QString name) { qDebug()<<"Systray::newTag"<addAction(name); tmp->setCheckable(true); QList taggedFonts = FMFontDb::DB()->Fonts( name , FMFontDb::Tags ); int nActivated(0); int nFonts(taggedFonts.count()); for(int i = 0; i < nFonts ; ++i) { // qDebug()<path(); Q_ASSERT(taggedFonts[i]); if(taggedFonts[i]->isActivated()) { ++nActivated; } } if(nActivated < nFonts) { if(nActivated > 0) { QFont f(tmp->font()); f.setBold(true); tmp->setFont(f); tmp->setText(name + " "+QString::number(nActivated)+"/"+QString::number(nFonts)); tmp->setChecked(false); } else { tmp->setChecked(false); } } else tmp->setChecked(true); tagActions[name] = tmp; } void Systray::deleteTag(const QString &name) { QAction *tmp = tagActions[name]; if (tmp) { tagMenu->removeAction(tmp); tagActions.remove(name); } } void Systray::createActions() { activateAllAction = new QAction(tr("&Activate all"), this); connect(activateAllAction, SIGNAL(triggered()), this, SLOT(slotActivateAll())); deactivateAllAction = new QAction(tr("&Deactivate all"), this); connect(deactivateAllAction, SIGNAL(triggered()), this, SLOT(slotDeactivateAll())); minimizeAction = new QAction(tr("Mi&nimize"), this); connect(minimizeAction, SIGNAL(triggered()), this, SLOT(slotMinimize())); restoreAction = new QAction(tr("&Restore"), this); connect(restoreAction, SIGNAL(triggered()), this, SLOT(slotRestore())); quitAction = new QAction(tr("E&xit"), this); connect(quitAction, SIGNAL(triggered()), this, SLOT(slotQuit())); } void Systray::createTrayIcon() { trayIconMenu = new QMenu(0); trayIconMenu->addAction(activateAllAction); trayIconMenu->addAction(deactivateAllAction); // trayIconMenu->addSeparator(); // tagSetMenu = trayIconMenu->addMenu(tr("&Collections")); tagMenu = trayIconMenu->addMenu(tr("&Tags")); trayIconMenu->addSeparator(); trayIconMenu->addAction(minimizeAction); trayIconMenu->addAction(restoreAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(quitAction); trayIcon = new QSystemTrayIcon(this); trayIcon->setContextMenu(trayIconMenu); trayIcon->installEventFilter(this); } void Systray::createTagMenu() { if (!ttek) ttek = typotek::getInstance(); QStringList tmp(FMFontDb::DB()->getTags()); tmp.sort(); foreach (QString tagName, tmp) { // if (tagName != "Activated_On" && tagName != "Activated_Off") newTag(tagName); } connect(tagMenu, SIGNAL(triggered(QAction*)), this, SLOT(slotTagMenuClicked(QAction*))); } bool Systray::isVisible() { return trayIcon->isVisible(); } bool Systray::hasActivateAll() { return activateAllAction->isVisible(); } bool Systray::allConfirmation() { return showAllConfirmation; } bool Systray::tagsConfirmation() { return showTagsConfirmation; } void Systray::requireAllConfirmation(bool doRequire) { showAllConfirmation = doRequire; settings->setValue("Systray/AllConfirmation", doRequire); } void Systray::requireTagsConfirmation(bool doRequire) { showTagsConfirmation = doRequire; settings->setValue("Systray/TagsConfirmation", doRequire); } void Systray::updateTagMenu(const QStringList& nameOfFontWhichCausedThisUpdate) { QStringList tags(tagActions.keys()); bool lazy = true; foreach(QString tag, tags) { QList taggedFonts = FMFontDb::DB()->Fonts( tag , FMFontDb::Tags ); // ttek->resetFilter(); foreach(FontItem* fit, taggedFonts) { if( nameOfFontWhichCausedThisUpdate.contains(fit->path())) { // we’re concerned lazy = false; break; } } } if(lazy) return; foreach(QString tag, tags) { deleteTag(tag); } if (!ttek) ttek = typotek::getInstance(); QStringList tmp(FMFontDb::DB()->getTags()); tmp.sort(); foreach (QString tagName, tmp) { // if (tagName != "Activated_On" && tagName != "Activated_Off") newTag(tagName); } } // bool Systray::eventFilter(QObject * watched, QEvent * event) // { // if (watched == trayIcon) { // // qDebug() << event; // } // // return Systray::eventFilter(watched, event); // // } fontmatrix-0.6.0+svn20110930/src/fmscriptconsole.cpp0000644000175000017500000001727111153007055021042 0ustar malexmalex// // C++ Implementation: fmscriptconsole // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #include "fmscriptconsole.h" #include "fmpython_w.h" #include "fmpaths.h" #include #include #include #include #include #include FMScriptConsole * FMScriptConsole::instance = 0; FMScriptConsole::FMScriptConsole() :QWidget(0) { setupUi(this); runLabel->setText(""); new SyntaxHighlighter(input->document()); connect(execButton, SIGNAL(clicked()), this, SLOT(execScript())); connect(loadButton, SIGNAL (toggled(bool)), this, SLOT(showSelectPage(bool))); connect(saveButton, SIGNAL(clicked()), this, SLOT(saveScript())); connect(scriptsList, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(selectScript(QListWidgetItem*))); connect(FMPythonW::getInstance(), SIGNAL(started()),this, SLOT(startRunNotice())); connect(FMPythonW::getInstance(), SIGNAL(finished()), this, SLOT(endRunNotice())); } FMScriptConsole * FMScriptConsole::getInstance() { if(!instance) { instance = new FMScriptConsole; Q_ASSERT(instance); } return instance; } void FMScriptConsole::Out(const QString & s) { // qDebug()<<"ConsoleOut:"<< s; outBuffer += s; if(FMPythonW::getInstance()->isRunning()) { return; } stdOut->insertPlainText(outBuffer); stdOut->moveCursor(QTextCursor::End); outBuffer.clear(); } void FMScriptConsole::Err(const QString & s) { stdErr->insertPlainText(s); // QString t(stdErr->toPlainText()); // t.append(s); // stdErr->setText(t); stdErr->moveCursor(QTextCursor::End); } void FMScriptConsole::hideEvent(QHideEvent * event) { emit finished(); } void FMScriptConsole::execScript() { QString sc(input->toPlainText()); FMPythonW::getInstance()->runString(sc); } void FMScriptConsole::showSelectPage(bool cho) { if(cho) { scriptsList->clear(); QDir Rdir(FMPaths::ResourcesDir() + "Scripts"); Rdir.setNameFilters(QStringList()<<"*.py"); QStringList Rfiles(Rdir.entryList()); scriptsList->addItems(Rfiles); QDir dir(FMPaths::ScriptsDir()); dir.setNameFilters(QStringList()<<"*.py"); QStringList files(dir.entryList()); scriptsList->addItems(files); stackInput->setCurrentIndex(1); } else stackInput->setCurrentIndex(0); } void FMScriptConsole::selectScript(QListWidgetItem * item) { if(!item) return; // first personal scripts QFile f(FMPaths::ScriptsDir()+item->text()); if(f.open(QIODevice::ReadOnly)) { QByteArray a(f.readAll()); input->setPlainText(a); loadButton->setChecked(false); return; } // then system ones QFile rf(FMPaths::ResourcesDir() + "Scripts"+QDir::separator()+item->text()); if(rf.open(QIODevice::ReadOnly)) { QByteArray a(rf.readAll()); input->setPlainText(a); loadButton->setChecked(false); return; } } void FMScriptConsole::saveScript() { QString f(QInputDialog::getText(this,"Fontmatrix", tr("A name for the script to save:"))); if(f.isEmpty()) return; if(!f.endsWith(".py")) f += ".py"; QDir dir(FMPaths::ScriptsDir()); dir.setNameFilters(QStringList()<<"*.py"); QStringList files(dir.entryList()); if(files.contains(f)) { QMessageBox::warning(this, "Fontmatrix", tr("The file %1 already exists").arg(f)); return; } QFile file(FMPaths::ScriptsDir() + f); if(file.open(QIODevice::WriteOnly)) { file.write(input->toPlainText().toUtf8()); } } /* * Syntax highlighting */ SyntaxHighlighter::SyntaxHighlighter(QTextDocument *doc) : QSyntaxHighlighter(doc) { // Reserved keywords in Python 2.4 QStringList keywords; HighlightingRule rule; keywords << "and" << "assert" << "break" << "class" << "continue" << "def" << "del" << "elif" << "else" << "except" << "exec" << "finally" << "for" << "from" << "global" << "if" << "import" << "in" << "is" << "lambda" << "not" << "or" << "pass" << "print" << "raise" << "return" << "try" << "while" << "yield"; keywordFormat.setForeground(colors.keywordColor); keywordFormat.setFontWeight(QFont::Bold); singleLineCommentFormat.setForeground(colors.commentColor); singleLineCommentFormat.setFontItalic(true); quotationFormat.setForeground(colors.stringColor); numberFormat.setForeground(colors.numberColor); operatorFormat.setForeground(colors.signColor); foreach (QString kw, keywords) { rule.pattern = QRegExp("\\b" + kw + "\\b", Qt::CaseInsensitive); rule.format = keywordFormat; highlightingRules.append(rule); } rule.pattern = QRegExp("#[^\n]*"); rule.format = singleLineCommentFormat; highlightingRules.append(rule); rule.pattern = QRegExp("\'.*\'"); rule.pattern.setMinimal(true); rule.format = quotationFormat; highlightingRules.append(rule); rule.pattern = QRegExp("\".*\""); rule.pattern.setMinimal(true); rule.format = quotationFormat; highlightingRules.append(rule); rule.pattern = QRegExp("\\b\\d+\\b"); rule.pattern.setMinimal(true); rule.format = numberFormat; highlightingRules.append(rule); rule.pattern = QRegExp("[\\\\|\\<|\\>|\\=|\\!|\\+|\\-|\\*|\\/|\\%]+"); rule.pattern.setMinimal(true); rule.format = operatorFormat; highlightingRules.append(rule); } void SyntaxHighlighter::highlightBlock(const QString &text) { foreach (HighlightingRule rule, highlightingRules) { QRegExp expression(rule.pattern); int index = text.indexOf(expression); while (index >= 0) { int length = expression.matchedLength(); setFormat(index, length, rule.format); index = text.indexOf(expression, index + length); } } setCurrentBlockState(0); // multiline strings handling int startIndex = 0; if (previousBlockState() != 1) startIndex = text.indexOf("\"\"\""); while (startIndex >= 0) { int endIndex = text.indexOf("\"\"\"", startIndex); int commentLength; if (endIndex == -1) { setCurrentBlockState(1); commentLength = text.length() - startIndex; } else { commentLength = endIndex - startIndex + 3;//commentEndExpression.matchedLength(); } setFormat(startIndex, commentLength, quotationFormat); startIndex = text.indexOf("\"\"\"", startIndex + commentLength); } } SyntaxHighlighter::SyntaxColors::SyntaxColors() { QSettings settings; errorColor = QColor(settings.value("Python/SyntaxError", "#aa0000").toString()); commentColor = QColor(settings.value("Python/SyntaxComment", "#A0A0A0").toString()); keywordColor = QColor(settings.value("Python/SyntaxKeyword", "#00007f").toString()); signColor = QColor(settings.value("Python/SyntaxSign", "#aa00ff").toString()); numberColor = QColor(settings.value("Python/SyntaxNumber", "#ffaa00").toString()); stringColor = QColor(settings.value("Python/SyntaxString", "#005500").toString()); textColor = QColor(settings.value("Python/SyntaxText", "#000000").toString()); } SyntaxHighlighter::SyntaxColors::~SyntaxColors() { QSettings settings; settings.setValue("Python/SyntaxError",errorColor.name()); settings.setValue("Python/SyntaxComment",commentColor.name()); settings.setValue("Python/SyntaxKeyword",keywordColor.name()); settings.setValue("Python/SyntaxSign",signColor.name()); settings.setValue("Python/SyntaxNumber",numberColor.name()); settings.setValue("Python/SyntaxString",stringColor.name()); settings.setValue("Python/SyntaxText",textColor.name()); } void FMScriptConsole::startRunNotice() { qDebug()<<"startRunNotice"; outBuffer.clear(); execButton->setDisabled(true); saveButton->setDisabled(true); loadButton->setDisabled(true); runLabel->setText(tr("Running")); } void FMScriptConsole::endRunNotice() { qDebug()<<"endRunNotice"; execButton->setEnabled(true); saveButton->setEnabled(true); loadButton->setEnabled(true); runLabel->setText(""); // flush std buffer; stdOut->insertPlainText(outBuffer); stdOut->moveCursor(QTextCursor::End); outBuffer.clear(); } fontmatrix-0.6.0+svn20110930/src/floatingwidgettoolbar.h0000644000175000017500000000377711527175576021720 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FLOATINGWIDGETTOOLBAR_H #define FLOATINGWIDGETTOOLBAR_H #include class QMenu; class QAction; namespace Ui { class FloatingWidgetToolBar; } class FloatingWidgetToolBar : public QWidget { Q_OBJECT public: explicit FloatingWidgetToolBar(QWidget *parent = 0); ~FloatingWidgetToolBar(); void setNoClose(bool c); protected: void changeEvent(QEvent *e); private: Ui::FloatingWidgetToolBar *ui; bool noClose; bool isDetached; void setupMenu(); public slots: void setDetached(); signals: void Close(); void Hide(); void Print(); void Detach(); }; #endif // FLOATINGWIDGETTOOLBAR_H fontmatrix-0.6.0+svn20110930/src/fmshaper_own.cpp0000644000175000017500000003026511220204443020311 0ustar malexmalex// // C++ Implementation: fmshaper_own // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fmshaper_own.h" #include #include #include #include FMOwnShaper::FMOwnShaper(QString s, QString lang) { // We need to load at least a default rule Character noop; noop.GroupIndex = 1; Matches << MatchSequence(); Matches.last().Properties << noop; Matches.last().Properties.last().isMatchedGroup = true; Replacements << ReplaceSequence(); Replacements.last().Properties << noop; Replacements.last().Properties.last().GroupIndex = 1; loadRules(lang); fillIn(s); } FMOwnShaper::FMOwnShaper(QString lang) { Character noop; noop.GroupIndex = 1; Matches << MatchSequence(); Matches.last().Properties << noop; Matches.last().Properties.last().isMatchedGroup = true; Replacements << ReplaceSequence(); Replacements.last().Properties << noop; Replacements.last().Properties.last().GroupIndex = 1; loadRules(lang); } FMOwnShaper::~ FMOwnShaper() { } int FMOwnShaper::loadRules(QString lang) { QSettings stg; QString actualSDir; QString ShaperDir(stg.value("Places/ShaperDataDir").toString()); if(ShaperDir.isEmpty()) { actualSDir = ":/shapers/"; } else { actualSDir = ShaperDir + QDir::separator() ; } qDebug()<<"SHAPER_FILES : "< elems = line.split ( '|' ); if(elems.count() > 0) { bool ok; int unicode = elems.takeFirst().mid(0,4).toInt(&ok,16) ; if(!ok) qDebug()<<"Oops"; Dictionnary[unicode] = Character(unicode, elems); } } while (!matchFile.atEnd()) { QString line ( CleanRule(matchFile.readLine()) ); if(line.startsWith('%')) continue; QList elems = line.split ( '|' ); if(elems.count() == 2) { Matches.append(MatchSequence()); Replacements.append(ReplaceSequence()); Matches.last().SetMatch(elems[0].trimmed()); Replacements.last().SetReplace(elems[1].trimmed()); } } return 0; } void FMOwnShaper::fillIn(const QString& s) { QStringList debug; In.clear(); for(int i(0); i < s.count(); ++i) { if(Dictionnary.contains(s[i].unicode())) { In << Dictionnary[s[i].unicode()]; } else { In << Character(s[i].unicode()); } debug << "["+QString::number(s[i].unicode(),16)+"]"; } qDebug()<< debug.join(" "); } void FMOwnShaper::Op() { /// Here is the beast :) /* It’s all about processing replacements To make it easy to read, we’ll first put matched chunks into a map then process each chunk in another loop. */ // QList< QPair< int, QList< Character > > > chunks; int idx(0); bool matched; while( idx < In.count() ) { matched = false; // We begin at 1 since index 0 is NOOP for(int nm(1); nm < Matches.count(); ++nm) { int rc = Compare( idx , nm); if(rc > 0) { QList cl; QString debugString; for(int nc(0); nc < rc; ++nc) { cl << In[idx + nc]; debugString += "[" + QString::number( In[idx + nc].unicode() , 16) + "]"; } chunks.append( QPair< int, QList< Character > >(nm , cl) ); qDebug() << "MATCH : "<< debugString; idx += rc; matched = true; break; } } if(!matched) { In[idx].isMatchedGroup = true; QList< Character > ul; ul << In[idx]; chunks.append( QPair< int, QList< Character > >(0 ,ul ) ); ++idx; } } // Now we apply replacements as defined in the rules file QList< QPair< int, QList< Character > > >::const_iterator chunkIt = chunks.begin(); while(chunkIt != chunks.end()) { Replace(chunkIt->first, chunkIt->second); ++chunkIt; } } /// Return 0 if not matched and number of consumed positions if it matched int FMOwnShaper::Compare(int inIndex, int matchIndex) { int matchLen = Matches.at(matchIndex).Properties.count(); // We need to keep track of matched chars over "." QList matchedGroup; if(matchLen > (In.count() - inIndex)) return 0; for(int i(0); i < matchLen; ++i) { Character car = In[inIndex + i]; Character mat = Matches.at(matchIndex).Properties[i]; if(mat.isNull())// We’ll just compare properties { if(mat.MatchAll) { foreach(QString prop, mat.CustomProperties) { if(!prop.isEmpty()) { if(!car.CustomProperties.contains(prop)) return 0; } } foreach(QString prop, car.CustomProperties) { if(!prop.isEmpty()) { if(!mat.CustomProperties.contains(prop)) return 0; } } } else { foreach(QString prop, mat.CustomProperties) { if(!prop.isEmpty()) { if(!car.CustomProperties.contains(prop)) return 0; } } } matchedGroup << inIndex + i; } else { if(mat.unicode() != car.unicode()) return 0; else { if(mat.MatchAll) { foreach(QString prop, mat.CustomProperties) { if(!car.CustomProperties.contains(prop)) return 0; } foreach(QString prop, car.CustomProperties) { if(!mat.CustomProperties.contains(prop)) return 0; } } else { foreach(QString prop, mat.CustomProperties) { if(!car.CustomProperties.contains(prop)) return 0; } } } } } // It match foreach(int idx, matchedGroup) { In[idx].isMatchedGroup = true; // qDebug()<<"MATCHED" < chunk) { QList buffer; QMap matchedPos; //load matchedPos first int mIndex(0); foreach(Character car, chunk) { if(car.isMatchedGroup) { matchedPos[++mIndex] = car; // qDebug()<< "Matched "<< QString::number(car.unicode(), 16 ) << " at pos "<< mIndex ; } } // Let replace :) int rIndex(0); foreach(Character rep, Replacements[repIndex].Properties) { if(rep.isNull()) { Character tc(matchedPos[rep.GroupIndex].unicode(), rep.CustomProperties); buffer << tc; } else { buffer << rep; } } // Push in Out foreach(Character b, buffer) { Out << b; } } void FMOwnShaper::DumpOut() { // qDebug()<<"FMOwnShaper::DumpOut()"; for(int i(0); i < Out.count(); ++i) { qDebug()<<"Unicode("<< QString::number(Out[i].unicode(), 16 ) <<").["<< Out[i].DumpCustom() <<"]"; } } /// Character Character::Character(int unicode, QList< QByteArray > tokens) :QChar(unicode),MatchAll(false),isMatchedGroup(false) { for(int i(0); i < tokens.count(); ++i) AddProperty( QString(tokens[i].trimmed())); } Character::Character(int unicode, QStringList tokens) :QChar(unicode),MatchAll(false),isMatchedGroup(false) { for(int i(0); i < tokens.count(); ++i) AddProperty( QString(tokens[i].trimmed())); } QString Character::DumpCustom() { QString ret; bool first = true; foreach (QString value, CustomProperties) { if(first) { first = false; ret += value; continue; } ret+= " ; "; ret += value; } return ret; } /// Sequences void MatchSequence::SetMatch(const QString &b) { /* The byte array looks like : "U1111(prop1, prop2, prop3)U2222.(prop4)" And it has to be turned into : QList( Character(U+1111).CustomProperties["prop1", "prop2", "prop3"], Character(U+2222), Character(`\0`).CustomProperties["prop4"] ) The null character will match only on properties. So dot its quite the same as in REGEX. */ QString ref(b); // qDebug()<<"SetMatch("+ref+")"; for(int idx(0); idx < ref.count(); ++idx) { QChar current(ref[idx]); if(current == 'U') // a code point { bool ok; ++idx; int unicode = ref.mid(idx,4).toInt(&ok,16) ; if(!ok) qDebug()<<"Oops"; idx += 4; if(ref[idx] == '(')// property list { QStringList pList; int countChars(0); while(ref[idx + countChars] != ')') { ++countChars; } QStringList pl(ref.mid(idx+1, countChars-1).split(";", QString::SkipEmptyParts)); foreach(QString prop, pl) { pList << prop.trimmed(); } idx += countChars; Properties << Character(unicode, pList); } else if(ref[idx] == '[')// property list with exact match { QStringList pList; int countChars(0); while(ref[idx + countChars] != ']') { ++countChars; } QStringList pl(ref.mid(idx+1, countChars-1).split(";", QString::SkipEmptyParts)); foreach(QString prop, pl) { pList << prop.trimmed(); } idx += countChars; Properties << Character(unicode, pList); Properties.last().MatchAll = true; } else //if(ref[idx] != '(' || ref[idx] != '[') { --idx; Properties << Character(unicode); } } else if(current == '.') // a null char (can have properties) { int unicode = 0 ; ++idx; if(ref[idx] == '(')// property list { QStringList pList; int countChars(0); while(ref[idx + countChars] != ')') { ++countChars; } QStringList pl(ref.mid(idx+1, countChars-1).split(";", QString::SkipEmptyParts)); foreach(QString prop, pl) { pList << prop.trimmed(); } idx += countChars; Properties << Character(unicode, pList); } else if(ref[idx] == '[')// property list with exact match { QStringList pList; int countChars(0); while(ref[idx + countChars] != ']') { ++countChars; } QStringList pl(ref.mid(idx+1, countChars-1).split(";", QString::SkipEmptyParts)); foreach(QString prop, pl) { pList << prop.trimmed(); } idx += countChars; Properties << Character(unicode, pList); Properties.last().MatchAll = true; } else //if(ref[idx] != '('|| ref[idx] != '[') { --idx; Properties << Character(unicode); } } else { // Error qDebug()<<"ERROR match: current = "<< current; } } } void ReplaceSequence::SetReplace(const QString& b) { QString ref(b); // qDebug()<<"SetReplace("+ref+")"; for(int idx(0); idx < ref.count(); ++idx) { QChar current(ref[idx]); if(current == 'U') // a code point { bool ok; ++idx; int unicode = ref.mid(idx,4).toInt(&ok,16) ; if(!ok) qDebug()<<"Oops"; idx += 4; if(ref[idx] != '(') { --idx; Properties << Character(unicode); } else // property list { QStringList pList; int countChars(0); while(ref[idx + countChars] != ')') { ++countChars; } QStringList pl(ref.mid(idx+1, countChars-1).split(";", QString::SkipEmptyParts)); foreach(QString prop, pl) { pList << prop.trimmed(); } idx += countChars; Properties << Character(unicode, pList); } } else if(current == '.') // a null char (can have properties) { int unicode = 0 ; Properties << Character(unicode); ++idx; bool ok; int group = ref.mid(idx,1).toInt(&ok,10) ; Properties.last().GroupIndex = group; ++idx; if(ref[idx] != '(') { --idx; } else // property list { QStringList pList; int countChars(0); while(ref[idx + countChars] != ')') { ++countChars; } QStringList pl(ref.mid(idx+1, countChars-1).split(";", QString::SkipEmptyParts)); foreach(QString prop, pl) { pList << prop.trimmed(); } idx += countChars; Properties.last().CustomProperties = pList; } } else { // Error qDebug()<<"ERROR replace: current = "<< current; } } } QList< Character > FMOwnShaper::GetShaped() { Out.clear(); Op(); return Out; } QString FMOwnShaper::CleanRule(QString rule) { QString ret; int len( rule.count() ); for(int i(0); i < len; ++i) { if(!rule[i].isSpace()) ret += rule[i]; } return ret; } void Character::AddProperty(const QString & prop) { if(!CustomProperties.contains(prop)) { CustomProperties << prop; } } fontmatrix-0.6.0+svn20110930/src/fontcomparewidget.h0000644000175000017500000000206411443357651021024 0ustar malexmalex// // C++ Interface: fontcomparewidget // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FONTCOMPAREWIDGET_H #define FONTCOMPAREWIDGET_H #include "ui_comparewidget.h" class FontCompareWidget : public QWidget, private Ui::CompareWidget { Q_OBJECT static FontCompareWidget* instance; FontCompareWidget(QWidget * parent); public: static FontCompareWidget* getInstance(); ~FontCompareWidget(); private: QString curFont; uint curcode; bool neverUsed; void doconnect(); void dodisconnect(); void resetElements(); void initColors(); private slots: void addFont(); void removeFont(); void showChange(); void fillChange(int newIdx); void pointsChange(); void controlsChange(); void metricsChange(); void offsetChange(int o); void characterChange(int v); void characterBoxChange(int i); void fontChange(QListWidgetItem * witem, QListWidgetItem * olditem = 0); void syncChange(int state); }; #endif fontmatrix-0.6.0+svn20110930/src/fmfontextract.cpp0000644000175000017500000000562411216254671020523 0ustar malexmalex// // C++ Implementation: fmfontextract // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #include "fmfontextract.h" #include #include #include #ifdef HAVE_PODOFO #include "fmpdffontextractor.h" #endif FMFontExtract::FMFontExtract(QWidget * parent) :QDialog(parent), lastPath(QDir::homePath()), lastDir(QDir::homePath()) { setupUi(this); currentExtractor = 0; #ifdef HAVE_PODOFO FMPDFFontExtractor * pdfExtr(new FMPDFFontExtractor); foreach(QString e, pdfExtr->extensions()) { extractors[e] = pdfExtr; } #endif docPath->clear(); connect(browsePDF,SIGNAL(clicked()),this,SLOT(slotBrowseDoc())); connect(browseDir,SIGNAL(clicked()),this,SLOT(slotBrowseDir())); connect(extractButton,SIGNAL(clicked()),this,SLOT(slotExtract())); } FMFontExtract::~ FMFontExtract() { QList extP; foreach(FMFontExtractorBase* b, extractors.values()) { if(!extP.contains(b)) extP << b; } foreach(FMFontExtractorBase* b, extP) { if(b) delete b; } } void FMFontExtract::loadDoc(const QString & path) { QFileInfo fi(path); if(!fi.exists()) { docPath->setText(tr("File does not exist:") + " " + fi.fileName()); return; } QString suffix(fi.suffix()); if(extractors.contains(suffix)) { currentExtractor = extractors[suffix]; fontList->clear(); if(currentExtractor->loadFile(path)) { foreach(QString n, currentExtractor->list()) { fontList->addItem(n); } } } else { docPath->setText(tr("Format not handled.")); } for(int i(0);i < fontList->count(); ++i ) { fontList->item(i)->setCheckState(Qt::Unchecked); } } void FMFontExtract::slotBrowseDoc() { // QString filters( "Portable Document Format (*.pdf *.PDF)" ); QString path( QFileDialog::getOpenFileName ( this, "Fontmatrix", lastPath) ); if(path.isEmpty()) return; lastPath = path; docPath->setText(path); loadDoc(path); } void FMFontExtract::slotBrowseDir() { QString dirpath(QFileDialog::getExistingDirectory(this,"Fontmatrix",lastDir)); if(dirpath.isEmpty()) return; lastDir = dirpath; outputDir->setText(dirpath); } void FMFontExtract::slotExtract() { if(fontList->count() == 0) return; QStringList names; for(int i(0);i < fontList->count(); ++i ) { if(fontList->item(i)->checkState() == Qt::Checked) names << fontList->item(i)->text(); } QString odir(outputDir->text() + QDir::separator()); QStringList failedExt; foreach(QString name,names) { QString fnam(odir + name + "." + currentExtractor->fontType(name)); if(QFile::exists(fnam)) QFile::remove(fnam); QFile f(fnam); if(f.open(QIODevice::WriteOnly)) { if(!currentExtractor->write(name, &f)) failedExt << name; } } if(!failedExt.isEmpty()) { QMessageBox::information(this,"Fontmatrix",tr("Failed to extract:\n%1").arg(failedExt.join("\n"))); } } fontmatrix-0.6.0+svn20110930/src/scriptconsole.ui0000644000175000017500000002043711153025511020345 0ustar malexmalex ScriptConsole 0 0 760 522 Script Console Qt::Horizontal 0 0 Input 0 # Type your script right here 0 true Load true Save Qt::Horizontal 468 48 Execute 75 true Running label 0 0 Output 0 0 0 241 369 Standard Output 0 2 Qt::Horizontal 290 20 clear 0 0 241 369 Standard Error 0 1 Qt::Horizontal 424 20 close closeButton clicked() ScriptConsole close() 937 689 491 0 clearButton clicked() stdOut clear() 919 610 790 415 loadButton toggled(bool) saveButton setDisabled(bool) 40 623 96 626 loadButton toggled(bool) execButton setDisabled(bool) 66 636 396 625 fontmatrix-0.6.0+svn20110930/src/fmfreetypelib.cpp0000644000175000017500000000465411450616562020477 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "fmfreetypelib.h" #include #include #include FMFreetypeLib *FMFreetypeLib::instance = 0; FMFreetypeLib::FMFreetypeLib(QObject *parent) : QObject(parent) { FT_Library theLibrary; FT_Init_FreeType ( &theLibrary ); libraries.insert(thread(), theLibrary); qDebug()<<"FT_Library"<libraries.value(that()->thread()); QMutexLocker(that()->mutex); if(that()->libraries.contains(t)) return that()->libraries.value(t); FTLibFactory ff; ff.moveToThread(t); that()->libraries.insert(t, ff.createLib()); connect(t, SIGNAL(terminated()), that(), SLOT(releaseLibrary())); return that()->libraries.value(t); } void FMFreetypeLib::releaseLibrary() { if(sender()) { QThread *t(reinterpret_cast(sender())); if(t && libraries.contains(t)) { FT_Done_FreeType(libraries[t]); libraries.remove(t); } } } fontmatrix-0.6.0+svn20110930/src/harfbuzzqtshaper.cpp0000644000175000017500000000103411015111755021221 0ustar malexmalex// // C++ Implementation: harfbuzzqtshaper // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "harfbuzzqtshaper.h" HarfbuzzShaper::HarfbuzzShaper(FMOtf * o, QString s) :FMBaseShaper(o,s) { hbqtsh = new FMShaper(otf); hbqtsh->setScript ( script ); } HarfbuzzShaper::~ HarfbuzzShaper() { if(hbqtsh) delete hbqtsh; } GlyphList HarfbuzzShaper::doShape(const QString& s) { return hbqtsh->doShape ( s , true ); } fontmatrix-0.6.0+svn20110930/src/fmlayoptwidget.h0000644000175000017500000000206311115567664020344 0ustar malexmalex// // C++ Interface: fmlayoptwidget // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMLAYOPTWIDGET_H #define FMLAYOPTWIDGET_H #include class FMLayOptWidget : public QWidget , private Ui::LayoutOptionWidget { Q_OBJECT public: enum V{BEFORE = 1, EXACT, AFTER, END, HYPHEN, SPACE, MAX}; FMLayOptWidget(QWidget * parent = 0); int vToInt(V v){return v;} void setRange(V v, int min, int max); void setValue(V v, int value); void setValue(V v, double value); double getValue(V v); private slots: void bChanged(int cv); void exChanged(int cv); void aChanged(int cv); void enChanged(int cv); void hChanged(int cv); void sChanged(int cv); void bEdited(); void exEdited(); void aEdited(); void enEdited(); void hEdited(); void sEdited(); signals: /// Indicates which slider has been changed /// It’s up to the receiver to ask the new value; void valueChanged(int); }; #endif fontmatrix-0.6.0+svn20110930/src/fontitem.cpp0000644000175000017500000030064011513114114017443 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "fontitem.h" #include "fmaltcontext.h" #include "fmotf.h" #include "fmencdata.h" #include "fmfontdb.h" #include "fmfontstrings.h" #include "fmfreetypelib.h" #include "fmglyphsview.h" #include "glyphtosvghelper.h" #include "typotek.h" #include "fmbaseshaper.h" #include "hyphenate/fmhyphenator.h" #include "fmkernfeat.h" #include "fmuniblocks.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "QDebug" #include FT_XFREE86_H #include FT_GLYPH_H #include FT_OUTLINE_H #include FT_SFNT_NAMES_H #include FT_TYPE1_TABLES_H #include FT_TRUETYPE_TABLES_H #include FT_TRUETYPE_IDS_H // #include // #include int fm_num_face_opened = 0; QGraphicsScene *FontItem::theOneLineScene = 0; QList FontItem::legitimateNonPathChars; QVector gray256Palette; QVector invertedGray256Palette; // QWaitCondition theCondition; // QMutex theMutex; unsigned int OTF_name_tag ( QString s ); /** functions set for decomposition */ struct SizedPath{ QPainterPath* p; double s; }; // an anticipation of further changes in Freetype struct FM_Vector // :) { double x; double y; FM_Vector(const FT_Vector* vect) { x = double(vect->x); y = double(vect->y); // qDebug()<<"x26"<x<<"y26"<y <<"x"< ( user ); QPainterPath * p( sp->p ); double sf( sp->s ); p->moveTo ( to.x * sf , to.y * sf * -1.0 ); return 0; } static int _lineTo ( const FT_Vector* to26, void* user ) { FM_Vector to(to26); SizedPath* sp = reinterpret_cast ( user ); QPainterPath * p( sp->p ); double sf( sp->s ); p->lineTo ( to.x * sf, to.y * sf * -1.0 ); return 0; } static int _conicTo ( const FT_Vector* control26, const FT_Vector* to26, void* user ) { FM_Vector control(control26); FM_Vector to(to26); SizedPath* sp = reinterpret_cast ( user ); QPainterPath * p( sp->p ); double sf( sp->s ); p->quadTo ( control.x * sf,control.y * sf * -1.0,to.x * sf,to.y * sf * -1.0 ); return 0; } static int _cubicTo ( const FT_Vector* control126, const FT_Vector* control226, const FT_Vector* to26, void* user ) { FM_Vector control1(control126); FM_Vector control2(control226); FM_Vector to(to26); SizedPath* sp = reinterpret_cast ( user ); QPainterPath * p( sp->p ); double sf( sp->s ); p->cubicTo ( control1.x * sf,control1.y * sf * -1.0,control2.x * sf,control2.y * sf * -1.0,to.x * sf,to.y * sf * -1.0); return 0; } FT_Outline_Funcs outline_funcs= { _moveTo, _lineTo, _conicTo, _cubicTo, 0, 0 }; /** **************************************************/ void FontItem::fillLegitimateSpaces() { legitimateNonPathChars << 0x0020 ; legitimateNonPathChars << 0x00A0 ; legitimateNonPathChars << 0x1680 ; legitimateNonPathChars << 0x180E ; legitimateNonPathChars << 0x2002 ; legitimateNonPathChars << 0x2003 ; legitimateNonPathChars << 0x2004 ; legitimateNonPathChars << 0x2005 ; legitimateNonPathChars << 0x2006 ; legitimateNonPathChars << 0x2007 ; legitimateNonPathChars << 0x2008 ; legitimateNonPathChars << 0x2009 ; legitimateNonPathChars << 0x200A ; legitimateNonPathChars << 0x200B ; legitimateNonPathChars << 0x200C ; legitimateNonPathChars << 0x200D ; legitimateNonPathChars << 0x202F ; legitimateNonPathChars << 0x205F ; legitimateNonPathChars << 0x2060 ; legitimateNonPathChars << 0x3000 ; legitimateNonPathChars << 0xFEFF ; } void FontItem::fill256Palette() { // #ifdef PLATFORM_APPLE // for ( int i = 0; i < 256 ; ++i ) // { // gray256Palette << qRgb (255-i, 255-i,255- i ); // } // #else for ( int i = 0; i < 256 ; ++i ) { gray256Palette << qRgba ( 0,0,0, i ); } // #endif } void FontItem::fillInvertedPalette() { for ( int i = 0; i < 256 ; ++i ) { invertedGray256Palette << qRgb ( i , i, i ); } } FontItem::FontItem ( QString path , bool remote, bool faststart ) { // qDebug()<<"FONT ITEM"<face_flags, FT_FACE_FLAG_SFNT, "1","0" ) == "1" ) { m_isOpenType = true; } if(m_isOpenType) moreInfo_sfnt(); else moreInfo_type1(); m_type = FT_Get_X11_Font_Format ( m_face ); // if ( typotek::getInstance()->familySchemeFreetype() || !m_isOpenType ) { m_family = m_face->family_name; m_variant = m_face->style_name; } // else // { // m_family = getAlternateFamilyName(); // m_variant = getAlternateVariantName(); // } m_numGlyphs = m_face->num_glyphs; m_numFaces = m_face->num_faces; // for ( int i = 0 ;i < m_face->num_charmaps; ++i ) // { // m_charsets << charsetMap[m_face->charmaps[i]->encoding]; // } // m_lock = false; pixList.clear(); if ( m_family.isEmpty() ) return; if ( m_variant.isEmpty() ) return; m_valid = true; releaseFace(); } FontItem::FontItem(QString path, QString family, QString variant, QString type,bool active) { m_valid = true; m_remote = false; remoteCached = false; stopperDownload = false; m_face = 0; lastFace = 0; m_glyphsPerRow = 5; m_isEncoded = false; currentChar = -1; m_isOpenType = false; otf = 0; m_rasterFreetype = false; m_progression = PROGRESSION_LTR; m_shaperType = 1; renderReturnWidth = false; unitPerEm = 0; m_FTHintMode = 0; // m_lock = false; allIsRendered = false; isUpToDate = false; if ( legitimateNonPathChars.isEmpty() ) fillLegitimateSpaces(); if ( gray256Palette.isEmpty() ) fill256Palette(); if ( invertedGray256Palette.isEmpty() ) fillInvertedPalette(); if ( !theOneLineScene ) { theOneLineScene = new QGraphicsScene; } m_path = path; m_family = family; m_variant = variant; m_active = active; m_type = type; } FontItem * FontItem::Clone() { FontItem *fitem = new FontItem ( m_path, m_family, m_variant, m_type, m_active ); return fitem; } void FontItem::updateItem() { if(isUpToDate) return; QFileInfo infopath ( m_path ); m_name = infopath.fileName(); if ( ! ensureFace() ) { return; } if ( infopath.suffix() == "pfb" || infopath.suffix() == "PFB" ) { m_afm = m_path; if ( infopath.suffix() == "pfb" ) { m_afm.replace ( ".pfb",".afm" ); if ( !QFile::exists ( m_afm ) ) { m_afm.replace ( ".afm" ,".AFM" ); if ( !QFile::exists ( m_afm ) ) { m_afm = ""; } } } else if ( infopath.suffix() == "PFB" ) { m_afm.replace ( ".PFB",".AFM" ); if ( !QFile::exists ( m_afm ) ) { m_afm.replace ( ".AFM" ,".afm" ); if ( !QFile::exists ( m_afm ) ) { m_afm = ""; } } } } if ( testFlag ( m_face->face_flags, FT_FACE_FLAG_SFNT, "1","0" ) == "1" ) { m_isOpenType = true; } m_type = FT_Get_X11_Font_Format ( m_face ); m_family = m_face->family_name; m_variant = m_face->style_name; m_numGlyphs = m_face->num_glyphs; m_numFaces = m_face->num_faces; releaseFace(); isUpToDate = true; } FontItem::~FontItem() { if ( m_isOpenType && otf ) { // delete otf; } } void FontItem::encodeFace() { if(!m_face) return; m_charsets.clear(); m_unicodeBuiltIn = (m_face->charmap == NULL) ? false : true ; if(QString(FT_Get_X11_Font_Format(m_face)) == QString("Type 1")) m_unicodeBuiltIn = false; QMap cmaps; for(int u = 0; u < m_face->num_charmaps; u++) { cmaps [ m_face->charmaps[u]->encoding ] = m_face->charmaps[u]; } bool mapped(false); // Stop kidding if (/* (!isType1) && UnicodeBuiltIn && */cmaps.contains( FT_ENCODING_UNICODE ) ) { FT_Set_Charmap(m_face, cmaps[FT_ENCODING_UNICODE]); m_charsets << FT_ENCODING_UNICODE; mapped = true; m_isEncoded = true; m_currentEncoding = FT_ENCODING_UNICODE; } // uncomment below to get Unicode cmap synthetized by FT // else if(cmaps.contains( FT_ENCODING_UNICODE )) // { // FT_Set_Charmap(m_face, cmaps[FT_ENCODING_UNICODE]); // m_charsets << FontStrings::Encoding(FT_ENCODING_UNICODE) +"*"; // mapped = true; // cmaps.remove(FT_ENCODING_UNICODE); // m_isEncoded = true; // } foreach(FT_Encoding e, cmaps.keys()) { // QString cs(FontStrings::Encoding(e)); // if(isType1 && (e == FT_ENCODING_UNICODE)) // continue; if(!m_charsets.contains(e)) m_charsets << e; if(!mapped) { FT_Set_Charmap(m_face, cmaps[e]); mapped = true; m_isEncoded = true; m_currentEncoding = e; } } } bool FontItem::ensureFace() { FT_Library ftlib = FMFreetypeLib::lib(thread()); // qDebug()<<"FontItem::ensureFace"<units_per_EM; m_glyph = m_face->glyph; facesRef = 1; ++fm_num_face_opened; return true; } void FontItem::releaseFace() { if ( m_face ) { --facesRef; if ( facesRef == 0 ) { FT_Done_Face ( m_face ); m_face = 0; --fm_num_face_opened; } } } int FontItem::glyphsCount() const { if(m_numGlyphs > 0) // this is normal case { return m_numGlyphs; } FontItem * that(const_cast(this)); that->ensureFace(); that->m_numGlyphs = m_face->num_glyphs; that->releaseFace(); return m_numGlyphs; } QString FontItem::testFlag ( long flag, long against, QString yes, QString no ) { if ( ( flag & against ) == against ) return yes; else return no; } // QString FontItem::value ( QString k ) // { // // I don’t know if something relies o it so I keep it, for the moment. // if ( k == "family" ) // return m_family; // else if ( k == "variant" ) // return m_variant; // // // 0 is default language // // TODO inspect all available languages // // if(moreInfo.isEmpty()) // // { // // if(isOpenType()) // // moreInfo_sfnt(); // // else // // moreInfo_type1(); // // } // FontInfoMap moreInfo( FMFontDb::DB()->getInfoMap(m_path) ); // QMap namap ( moreInfo.value ( 0 ) ); // return namap.value ( name_meaning.indexOf( k ) ); // } // QString FontItem::panose ( QString k ) // { // return panoseInfo.value ( k ); // } QString FontItem::name() { return m_name; } QGraphicsPathItem * FontItem::itemFromChar ( int charcode, double size ) { if(!ensureFace()) return 0; uint glyphIndex = 0; currentChar = charcode; glyphIndex = FT_Get_Char_Index ( m_face, charcode ); QGraphicsPathItem * ret(itemFromGindex ( glyphIndex,size )); releaseFace(); return ret; } QGraphicsPathItem * FontItem::itemFromGindex ( int index, double size ) { if(!ensureFace()) return 0; int charcode = index ; double scalefactor = size / m_face->units_per_EM; ft_error = FT_Load_Glyph ( m_face, charcode , FT_LOAD_NO_SCALE ); if ( ft_error ) { QPainterPath glyphPath; glyphPath.addRect ( 0.0,0.0, size, size ); QGraphicsPathItem *glyph = new QGraphicsPathItem; glyph->setBrush ( QBrush ( Qt::red ) ); glyph->setPath ( glyphPath ); glyph->setData ( GLYPH_DATA_GLYPH, index); glyph->setData ( GLYPH_DATA_HADVANCE , ( double ) size * scalefactor); glyph->setData ( GLYPH_DATA_HADVANCE_SCALED , ( double ) size ); glyph->setData ( GLYPH_DATA_ERROR , true ); releaseFace(); return glyph; } FT_Outline *outline = &m_glyph->outline; QPainterPath glyphPath ( QPointF ( 0.0,0.0 ) ); SizedPath sp; sp.p = &glyphPath; sp.s = scalefactor; FT_Outline_Decompose ( outline, &outline_funcs, &sp ); glyphPath.closeSubpath(); QGraphicsPathItem *glyph = new QGraphicsPathItem; if ( glyphPath.elementCount() < 3 && !spaceIndex.contains ( index ) ) { QBrush brush ( Qt::SolidPattern ); brush.setColor ( Qt::red ); QPen pen ( brush, 0 ); QPainterPath errPath; errPath.addRect ( 0.0,-size, size , size ); glyph->setBrush ( brush ); glyph->setPen ( pen ); glyph->setPath ( errPath ); glyph->setData ( GLYPH_DATA_HADVANCE , ( double ) m_glyph->metrics.horiAdvance ); glyph->setData ( GLYPH_DATA_HADVANCE_SCALED , ( double ) m_glyph->metrics.horiAdvance *scalefactor); glyph->setData ( GLYPH_DATA_GLYPH, index); glyph->setData ( GLYPH_DATA_ERROR , true ); } else { glyph->setBrush ( QBrush ( Qt::SolidPattern ) ); glyph->setPath ( glyphPath ); glyph->setData ( GLYPH_DATA_GLYPH, index); glyph->setData ( GLYPH_DATA_HADVANCE , ( double ) m_glyph->metrics.horiAdvance ); glyph->setData ( GLYPH_DATA_HADVANCE_SCALED , ( double ) m_glyph->metrics.horiAdvance * scalefactor); glyph->setData ( 5, ( double ) m_glyph->metrics.vertAdvance ); glyph->setData ( GLYPH_DATA_ERROR , false ); // glyph->scale ( scalefactor,-scalefactor ); } releaseFace(); return glyph; } QGraphicsPixmapItem * FontItem::itemFromCharPix ( int charcode, double size ) { if(!ensureFace()) return 0; uint glyphIndex = 0; currentChar = charcode; glyphIndex = FT_Get_Char_Index ( m_face, charcode ); releaseFace(); return itemFromGindexPix ( glyphIndex,size ); } QGraphicsPixmapItem * FontItem::itemFromGindexPix ( int index, double size ) { if ( !ensureFace() ) return 0; int charcode = index ; double scaleFactor = size / m_face->units_per_EM; // Set size FT_Set_Char_Size ( m_face, qRound( size * 64 ), 0, typotek::getInstance()->getDpiX(), typotek::getInstance()->getDpiY() ); // Grab metrics in FONT UNIT ft_error = FT_Load_Glyph ( m_face, charcode , FT_LOAD_NO_SCALE ); if ( ft_error ) { QPixmap square ( qRound(size) , qRound(size) ); square.fill ( Qt::red ); QGraphicsPixmapItem *glyph = new QGraphicsPixmapItem ( square ); glyph->setData ( GLYPH_DATA_GLYPH ,index ); glyph->setData ( GLYPH_DATA_BITMAPLEFT , 0 ); glyph->setData ( GLYPH_DATA_BITMAPTOP,size ); glyph->setData ( GLYPH_DATA_HADVANCE ,size / ( size / m_face->units_per_EM ) ); releaseFace(); return glyph; } double takeAdvanceBeforeRender = m_glyph->metrics.horiAdvance * ( typotek::getInstance()->getDpiX() / 72.0 ); double takeVertAdvanceBeforeRender = m_glyph->metrics.vertAdvance * ( typotek::getInstance()->getDpiY() / 72.0 ); double takeLeftBeforeRender = double(m_glyph->metrics.horiBearingX) * ( typotek::getInstance()->getDpiX() / 72.0 ); // if(m_FTHintMode != FT_LOAD_NO_HINTING) { ft_error = FT_Load_Glyph ( m_face, charcode , FT_LOAD_DEFAULT | m_FTHintMode ); } // Render the glyph into a grayscale bitmap ft_error = FT_Render_Glyph ( m_face->glyph, FT_RENDER_MODE_NORMAL ); if ( ft_error ) { QPixmap square ( qRound(size) , qRound(size) ); square.fill ( Qt::red ); QGraphicsPixmapItem *glyph = new QGraphicsPixmapItem ( square ); glyph->setData ( GLYPH_DATA_GLYPH , index ); glyph->setData ( GLYPH_DATA_BITMAPLEFT , 0 ); glyph->setData ( GLYPH_DATA_BITMAPTOP,size ); glyph->setData ( GLYPH_DATA_HADVANCE ,size / ( size / m_face->units_per_EM ) ); releaseFace(); return glyph; } QImage img ( glyphImage() ); QGraphicsPixmapItem *glyph = new QGraphicsPixmapItem; if ( img.isNull() && !spaceIndex.contains ( index ) ) { QPixmap square ( qRound(size) , qRound(size) ); square.fill ( Qt::red ); glyph->setPixmap ( square ); glyph->setData ( GLYPH_DATA_GLYPH , index ); glyph->setData ( GLYPH_DATA_BITMAPLEFT , 0 ); glyph->setData ( GLYPH_DATA_BITMAPTOP,size ); glyph->setData ( GLYPH_DATA_HADVANCE ,size / ( size / m_face->units_per_EM ) ); } else { #ifndef PLATFORM_APPLE glyph->setPixmap ( QPixmap::fromImage ( img ) ); #else QPixmap aPix ( img.width(), img.height() ); aPix.fill ( QColor ( 0,0,0,0 ) ); QPainter aPainter ( &aPix ); aPainter.drawImage ( 0,0, img ); glyph->setPixmap ( aPix ); #endif // we need to transport more data glyph->setData ( GLYPH_DATA_GLYPH , index ); glyph->setData ( GLYPH_DATA_BITMAPLEFT , takeLeftBeforeRender ); glyph->setData ( GLYPH_DATA_BITMAPTOP , double(m_face->glyph->bitmap_top) ); glyph->setData ( GLYPH_DATA_HADVANCE , takeAdvanceBeforeRender ); glyph->setData ( GLYPH_DATA_VADVANCE , takeVertAdvanceBeforeRender ); } releaseFace(); return glyph; } MetaGlyphItem * FontItem::itemFromGindexPix_mt(int index, double size) { if ( !ensureFace() ) return 0; int charcode = index ; // qDebug()<<"FontItem::itemFromGindexPix_mt"<< thread(); MetaGlyphItem * glyph = new MetaGlyphItem; double scaleFactor = size / m_face->units_per_EM; // Set size FT_Set_Char_Size ( m_face, qRound( size * 64 ), 0, typotek::getInstance()->getDpiX(), typotek::getInstance()->getDpiY() ); // Grab metrics in FONT UNIT ft_error = FT_Load_Glyph ( m_face, charcode , FT_LOAD_NO_SCALE ); if ( ft_error ) { glyph->setMetaData ( GLYPH_DATA_GLYPH ,index ); glyph->setMetaData ( GLYPH_DATA_BITMAPLEFT , 0 ); glyph->setMetaData ( GLYPH_DATA_BITMAPTOP,size ); glyph->setMetaData ( GLYPH_DATA_HADVANCE ,size / scaleFactor ); releaseFace(); return glyph; } double takeAdvanceBeforeRender = m_glyph->metrics.horiAdvance * ( typotek::getInstance()->getDpiX() / 72.0 ); double takeVertAdvanceBeforeRender = m_glyph->metrics.vertAdvance * ( typotek::getInstance()->getDpiX() / 72.0 ); double takeLeftBeforeRender = ( double ) m_glyph->metrics.horiBearingX * ( typotek::getInstance()->getDpiX() / 72.0 ); // if(m_FTHintMode != FT_LOAD_NO_HINTING) { ft_error = FT_Load_Glyph ( m_face, charcode , FT_LOAD_DEFAULT | m_FTHintMode ); } // Render the glyph into a grayscale bitmap ft_error = FT_Render_Glyph ( m_face->glyph, FT_RENDER_MODE_NORMAL ); if ( ft_error ) { glyph->setMetaData ( GLYPH_DATA_GLYPH , index ); glyph->setMetaData ( GLYPH_DATA_BITMAPLEFT , 0 ); glyph->setMetaData ( GLYPH_DATA_BITMAPTOP,size ); glyph->setMetaData ( GLYPH_DATA_HADVANCE ,size / scaleFactor ); releaseFace(); return glyph; } QImage img ( glyphImage() ); if ( img.isNull() && !spaceIndex.contains ( index ) ) { glyph->setMetaData ( GLYPH_DATA_GLYPH , index ); glyph->setMetaData ( GLYPH_DATA_BITMAPLEFT , 0 ); glyph->setMetaData ( GLYPH_DATA_BITMAPTOP,size ); glyph->setMetaData ( GLYPH_DATA_HADVANCE ,size /scaleFactor ); } else { glyph->setMetaData ( GLYPH_DATA_GLYPH , index ); glyph->setMetaData ( GLYPH_DATA_BITMAPLEFT , takeLeftBeforeRender ); glyph->setMetaData ( GLYPH_DATA_BITMAPTOP , double(m_face->glyph->bitmap_top) ); glyph->setMetaData ( GLYPH_DATA_HADVANCE , takeAdvanceBeforeRender ); glyph->setMetaData ( GLYPH_DATA_VADVANCE , takeVertAdvanceBeforeRender ); } releaseFace(); return glyph; } QImage FontItem::charImage(int charcode, double size) { if(!ensureFace()) return QImage(); // Set size FT_Set_Char_Size ( m_face, qRound( size * 64 ), 0, typotek::getInstance()->getDpiX(),typotek::getInstance()->getDpiY() ); if(FT_Load_Char( m_face, charcode , FT_LOAD_DEFAULT)) { releaseFace(); return QImage(); } if(FT_Render_Glyph ( m_face->glyph, FT_RENDER_MODE_NORMAL )) { releaseFace(); return QImage(); } QImage cImg( glyphImage() ); releaseFace(); return cImg; } QImage FontItem::glyphImage(int index, double size) { if(!ensureFace()) return QImage(); // Set size FT_Set_Char_Size ( m_face, qRound( size * 64 ), 0, typotek::getInstance()->getDpiX(),typotek::getInstance()->getDpiY() ); if(FT_Load_Glyph( m_face, index , FT_LOAD_DEFAULT)) { releaseFace(); return QImage(); } if(FT_Render_Glyph ( m_face->glyph, FT_RENDER_MODE_NORMAL )) { releaseFace(); return QImage(); } QImage cImg( glyphImage() ); releaseFace(); return cImg; } /// Nature line double FontItem::renderLine ( QGraphicsScene * scene, QString spec, QPointF origine, double lineWidth, double fsize , double zindex ) { // qDebug() <units_per_EM; double pWidth = lineWidth ; const double distance = 20; QPointF pen ( origine ); if ( m_rasterFreetype ) { QList mayBeRemoved; for ( int i=0; i < spec.length(); ++i ) { QGraphicsPixmapItem *glyph = itemFromCharPix ( spec.at ( i ).unicode(), sizz ); if( spec.at(i).category() == QChar::Separator_Space ) { mayBeRemoved.clear(); } if ( !glyph ) { continue; } if ( m_progression == PROGRESSION_RTL ) { pen.rx() -= ( glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() + glyph->data ( GLYPH_DATA_BITMAPLEFT ).toDouble() ) * scalefactor; pWidth -= glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPixmapItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_BTT ) { pen.ry() -= glyph->data ( GLYPH_DATA_VADVANCE ).toDouble() * scalefactor; pWidth -= glyph->data ( GLYPH_DATA_VADVANCE ).toDouble() * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPixmapItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_LTR ) { pWidth -= glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPixmapItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_TTB ) { pWidth -= glyph->data ( GLYPH_DATA_VADVANCE ).toDouble() * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPixmapItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } if(renderReturnWidth) retValue += glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; /************************************/ mayBeRemoved.append(glyph); scene->addItem ( glyph ); if(renderReturnWidth) retValue += glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; else retValue += 1; glyph->setPos ( pen.x() + glyph->data ( GLYPH_DATA_BITMAPLEFT ).toDouble() * scalefactor, pen.y() - glyph->data ( GLYPH_DATA_BITMAPTOP ).toInt() ); glyph->setZValue ( zindex ); glyph->setData ( GLYPH_DATA_GLYPH ,"glyph" ); glyph->setData ( GLYPH_DATA_FONTNAME , fancyName() ); /************************************/ if ( m_progression == PROGRESSION_LTR ) pen.rx() += glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; else if ( m_progression == PROGRESSION_TTB ) { pen.ry() += glyph->data ( GLYPH_DATA_VADVANCE ).toDouble() * scalefactor; } } } else { QList mayBeRemoved; for ( int i=0; i < spec.length(); ++i ) { // if ( !scene->sceneRect().contains ( pen ) && record ) // break; QGraphicsPathItem *glyph = itemFromChar ( spec.at ( i ).unicode(), sizz ); if ( !glyph ) continue; if( spec.at(i).category() == QChar::Separator_Space ) { mayBeRemoved.clear(); } if ( m_progression == PROGRESSION_RTL ) { pen.rx() -= glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; pWidth -= glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPathItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_BTT ) { pen.ry() -= glyph->data ( GLYPH_DATA_VADVANCE ).toDouble() * scalefactor; pWidth -= glyph->data ( GLYPH_DATA_VADVANCE ).toDouble() * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPathItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_LTR ) { pWidth -= glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPathItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_TTB ) { pWidth -= glyph->data ( GLYPH_DATA_VADVANCE ).toDouble() * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPathItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } /*********************************/ scene->addItem ( glyph ); glyph->setPen(Qt::NoPen); mayBeRemoved.append(glyph); if(renderReturnWidth) retValue += glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; else retValue += 1; glyph->setPos ( pen ); glyph->setZValue ( zindex ); glyph->setData ( GLYPH_DATA_GLYPH ,"glyph" ); glyph->setData ( GLYPH_DATA_FONTNAME , fancyName() ); /*********************************/ if ( m_progression == PROGRESSION_LTR ) { pen.rx() += glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; } else if ( m_progression == PROGRESSION_TTB ) { pen.ry() += glyph->data ( GLYPH_DATA_VADVANCE ).toDouble() * scalefactor; } } } releaseFace(); return retValue; } /// Featured line double FontItem::renderLine ( OTFSet set, QGraphicsScene * scene, QString spec, QPointF origine,double lineWidth, double fsize) { // qDebug()<<"Featured("<< spec <<")"; double retValue ( 0.0 ); if ( spec.isEmpty() ) return retValue; if ( !m_isOpenType ) return retValue; ensureFace(); otf = new FMOtf ( m_face, 0x10000 );// You think "What’s this 0x10000?", so am I! Just accept Harfbuzz black magic :) if ( !otf ) return retValue; double sizz = fsize; double scalefactor = sizz / m_face->units_per_EM ; double pixelAdjustX = scalefactor * ( typotek::getInstance()->getDpiX() / 72.0 ); double pixelAdjustY = scalefactor * ( typotek::getInstance()->getDpiX() / 72.0 ); double pWidth = lineWidth ; const double distance = 20; QList refGlyph = otf->procstring ( spec, set ); // qDebug() << "Get line "< mayBeRemoved; for ( int i=0; i < refGlyph.count(); ++i ) { QGraphicsPixmapItem *glyph = itemFromGindexPix ( refGlyph[i].glyph , sizz ); if ( !glyph ) continue; // Now, all is in the log! if( spec.at(refGlyph[i].log).category() == QChar::Separator_Space ) { mayBeRemoved.clear(); } if ( m_progression == PROGRESSION_RTL ) { pen.rx() -= refGlyph[i].xadvance * pixelAdjustX; pWidth -= refGlyph[i].xadvance * pixelAdjustX ; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPixmapItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_BTT ) { pen.ry() -= refGlyph[i].yadvance * pixelAdjustY; pWidth -= refGlyph[i].yadvance * pixelAdjustY; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPixmapItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_LTR ) { pWidth -= refGlyph[i].xadvance * pixelAdjustX; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPixmapItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_TTB ) { pWidth -= refGlyph[i].yadvance * pixelAdjustY ; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPixmapItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } /*************************************************/ mayBeRemoved.append(glyph); if(renderReturnWidth) retValue += glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; else retValue = refGlyph[i].log; scene->addItem ( glyph ); glyph->setZValue ( 100.0 ); glyph->setData ( GLYPH_DATA_GLYPH ,"glyph" ); glyph->setData ( GLYPH_DATA_FONTNAME , fancyName() ); glyph->setPos ( pen.x() + ( refGlyph[i].xoffset * pixelAdjustX ) + glyph->data ( GLYPH_DATA_BITMAPLEFT ).toDouble() * scalefactor , pen.y() + ( refGlyph[i].yoffset * pixelAdjustY ) - glyph->data ( GLYPH_DATA_BITMAPTOP ).toInt() ); /*************************************************/ if ( m_progression == PROGRESSION_LTR ) pen.rx() += refGlyph[i].xadvance * pixelAdjustX ; else if ( m_progression == PROGRESSION_TTB ) pen.ry() += refGlyph[i].yadvance * pixelAdjustY ; } } else { QList mayBeRemoved; for ( int i=0; i < refGlyph.count(); ++i ) { QGraphicsPathItem *glyph = itemFromGindex ( refGlyph[i].glyph , sizz ); if ( !glyph ) continue; if( spec.at(refGlyph[i].log).category() == QChar::Separator_Space ) { mayBeRemoved.clear(); } if ( m_progression == PROGRESSION_RTL ) { pen.rx() -= refGlyph[i].xadvance * scalefactor; pWidth -= refGlyph[i].xadvance * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPathItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_BTT ) { pen.ry() -= refGlyph[i].yadvance * scalefactor; pWidth -= refGlyph[i].yadvance * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPathItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_LTR ) { pWidth -= refGlyph[i].xadvance * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPathItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_TTB ) { pWidth -= refGlyph[i].yadvance * scalefactor ; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPathItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } /**********************************************/ mayBeRemoved.append(glyph); if(renderReturnWidth) retValue += glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; else retValue = refGlyph[i].log; scene->addItem ( glyph ); glyph->setPen(Qt::NoPen); glyph->setPos ( pen.x() + ( refGlyph[i].xoffset * scalefactor ), pen.y() + ( refGlyph[i].yoffset * scalefactor ) ); glyph->setZValue ( 100.0 ); glyph->setData ( GLYPH_DATA_GLYPH ,"glyph" ); glyph->setData ( GLYPH_DATA_FONTNAME , fancyName() ); /*******************************************/ if ( m_progression == PROGRESSION_LTR ) pen.rx() += refGlyph[i].xadvance * scalefactor; if ( m_progression == PROGRESSION_TTB ) pen.ry() += refGlyph[i].yadvance * scalefactor; } } releaseFace(); return retValue + 1; } /// Shaped line double FontItem::renderLine ( QString script, QGraphicsScene * scene, QString spec, QPointF origine,double lineWidth, double fsize) { qDebug()<<"Shaped("<< spec <<")"; double retValue(0.0); if ( spec.isEmpty() ) return 0; if ( !m_isOpenType ) return 0; ensureFace(); otf = new FMOtf ( m_face, 0x10000 ); if ( !otf ) return 0; FMShaperFactory *shaperfactory = 0; // switch(m_shaperType) // { // case FMShaperFactory::FONTMATRIX : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::FONTMATRIX ); // break; // case FMShaperFactory::HARFBUZZ : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::HARFBUZZ ); // break; // case FMShaperFactory::ICU : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::ICU ); // break; // case FMShaperFactory::M17N : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::M17N ); // break; // case FMShaperFactory::PANGO : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::PANGO ); // break; // case FMShaperFactory::OMEGA : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::OMEGA); // break; // default : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::FONTMATRIX ); // } /// Let's do it only with ICU atm. shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::ICU ); GlyphList refGlyph ( shaperfactory->doShape( spec ) ); delete shaperfactory; double sizz = fsize; double scalefactor = sizz / m_face->units_per_EM ; double pixelAdjustX = scalefactor * ( typotek::getInstance()->getDpiX() / 72.0 ); double pixelAdjustY = scalefactor * ( typotek::getInstance()->getDpiX() / 72.0 ); double pWidth = lineWidth ; const double distance = 20; // qDebug() << "Get line "< mayBeRemoved; for ( int i=0; i < refGlyph.count(); ++i ) { QGraphicsPixmapItem *glyph = itemFromGindexPix ( refGlyph[i].glyph , sizz ); if ( !glyph ) continue; if( spec.at(refGlyph[i].log).category() == QChar::Separator_Space ) { mayBeRemoved.clear(); } if ( m_progression == PROGRESSION_RTL ) { pen.rx() -= refGlyph[i].xadvance * pixelAdjustX; pWidth -= refGlyph[i].xadvance * pixelAdjustX ; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPixmapItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_BTT ) { pen.ry() -= refGlyph[i].yadvance * pixelAdjustY; pWidth -= refGlyph[i].yadvance * pixelAdjustY; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPixmapItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_LTR ) { pWidth -= refGlyph[i].xadvance * pixelAdjustX; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPixmapItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_TTB ) { pWidth -= refGlyph[i].yadvance * pixelAdjustY ; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPixmapItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } /*************************************************/ mayBeRemoved.append(glyph); if(renderReturnWidth) retValue += glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; else retValue = refGlyph[i].log; scene->addItem ( glyph ); glyph->setZValue ( 100.0 ); glyph->setData ( GLYPH_DATA_GLYPH ,"glyph" ); glyph->setData ( GLYPH_DATA_FONTNAME , fancyName() ); glyph->setPos ( pen.x() + ( refGlyph[i].xoffset * pixelAdjustX ) + glyph->data ( GLYPH_DATA_BITMAPLEFT ).toDouble() * scalefactor , pen.y() - ( refGlyph[i].yoffset * pixelAdjustY ) - glyph->data ( GLYPH_DATA_BITMAPTOP ).toInt() ); /*************************************************/ if ( m_progression == PROGRESSION_LTR ) pen.rx() += refGlyph[i].xadvance * pixelAdjustX ; else if ( m_progression == PROGRESSION_TTB ) pen.ry() += refGlyph[i].yadvance * pixelAdjustY ; } } else { QList mayBeRemoved; for ( int i=0; i < refGlyph.count(); ++i ) { QGraphicsPathItem *glyph = itemFromGindex ( refGlyph[i].glyph , sizz ); if ( !glyph ) continue; if( spec.at(refGlyph[i].log).category() == QChar::Separator_Space ) { mayBeRemoved.clear(); } if ( m_progression == PROGRESSION_RTL ) { pen.rx() -= refGlyph[i].xadvance * scalefactor; pWidth -= refGlyph[i].xadvance * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPathItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_BTT ) { pen.ry() -= refGlyph[i].yadvance * scalefactor; pWidth -= refGlyph[i].yadvance * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPathItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_LTR ) { pWidth -= refGlyph[i].xadvance * scalefactor; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPathItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } else if ( m_progression == PROGRESSION_TTB ) { pWidth -= refGlyph[i].yadvance * scalefactor ; if ( pWidth < distance ) { delete glyph; retValue -= mayBeRemoved.count() - 1; foreach(QGraphicsPathItem *rm, mayBeRemoved) { scene->removeItem( rm ); delete rm; } break; } } /**********************************************/ mayBeRemoved.append(glyph); if(renderReturnWidth) retValue += glyph->data ( GLYPH_DATA_HADVANCE ).toDouble() * scalefactor; else retValue = refGlyph[i].log; scene->addItem ( glyph ); glyph->setPen(Qt::NoPen); glyph->setPos ( pen.x() + ( refGlyph[i].xoffset * scalefactor ), pen.y() - ( refGlyph[i].yoffset * scalefactor ) ); glyph->setZValue ( 100.0 ); glyph->setData ( GLYPH_DATA_GLYPH ,"glyph" ); /*******************************************/ if ( m_progression == PROGRESSION_LTR ) pen.rx() += refGlyph[i].xadvance * scalefactor; if ( m_progression == PROGRESSION_TTB ) pen.ry() += refGlyph[i].yadvance * scalefactor; } } releaseFace(); return retValue + 1; } void FontItem::deRenderAll() { // qDebug() << m_name <<"::deRenderAll()"; // QSet collectedScenes; for ( int i = 0; i < pixList.count(); ++i ) { if ( pixList[i]->scene() ) { // collectedScenes.insert ( pixList[i]->scene() ); pixList[i]->scene()->removeItem ( pixList[i] ); delete pixList[i]; } } pixList.clear(); for ( int i = 0; i < glyphList.count(); ++i ) { if ( glyphList[i]->scene() ) { // collectedScenes.insert ( pixList[i]->scene() ); glyphList[i]->scene()->removeItem ( glyphList[i] ); delete glyphList[i]; } } glyphList.clear(); for ( int i = 0; i < labList.count(); ++i ) { if ( labList[i]->scene() ) { // collectedScenes.insert ( pixList[i]->scene() ); labList[i]->scene()->removeItem ( labList[i] ); delete labList[i]; } } labList.clear(); for ( int i = 0; i < selList.count(); ++i ) { if ( selList[i]->scene() ) { // collectedScenes.insert ( pixList[i]->scene() ); selList[i]->scene()->removeItem ( selList[i] ); delete selList[i]; } } selList.clear(); allIsRendered = false; } QByteArray FontItem::pixarray ( uchar * b, int len ) { uchar *imgdata = b ; QByteArray buffer ( len * 4, 255 ); QDataStream stream ( &buffer,QIODevice::WriteOnly ); for ( int i = 0 ; i < len; ++i ) { stream << ( quint8 ) ~imgdata[i]; stream << ( quint8 ) ~imgdata[i]; stream << ( quint8 ) ~imgdata[i]; stream << ( quint8 ) imgdata[i]; } return buffer; } int FontItem::firstChar() { if(!ensureFace()) return 0; FT_UInt anIndex (1); FT_UInt fc ( FT_Get_First_Char ( m_face, &anIndex )); releaseFace(); return fc; } int FontItem::lastChar() { if(!ensureFace()) return 0; FT_UInt index (1); FT_UInt cc = FT_Get_First_Char ( m_face, &index ); int lc(0); while ( index ) { lc = cc; cc = FT_Get_Next_Char ( m_face, cc, &index ); } releaseFace(); return lc ; } int FontItem::countChars() { if(!ensureFace()) return 0; FT_UInt index (1); FT_UInt cc = FT_Get_First_Char ( m_face, &index ); int n(0); while ( index ) { ++n; cc = FT_Get_Next_Char ( m_face, cc, &index ); } releaseFace(); return n; } int FontItem::nextChar(int from, int offset) { if(!ensureFace()) return 0; FT_UInt index (1); int cc(from); for ( int i(0); i < offset; ++i ) { cc = FT_Get_Next_Char ( m_face, cc, &index ); } releaseFace(); return cc; } int FontItem::countCoverage ( int begin_code, int end_code ) { if(!ensureFace()) return 0; // qDebug()<<"CC B E"<= 0 ) { for ( ;charcode <= end_code ; ++charcode) { if( FT_Get_Char_Index ( m_face, charcode)) ++count; } } else { FT_UInt anIndex = 0; count = m_numGlyphs; FT_UInt anyChar = FT_Get_First_Char ( m_face, &anIndex ); while ( anIndex ) { anyChar = FT_Get_Next_Char ( m_face,anyChar,&anIndex ); if ( anIndex ) --count; } } releaseFace(); return count;//something weird with freetype which put a valid glyph at the beginning of each lang ??? Or a bug here... } bool FontItem::hasCharcode(int cc) { if(!ensureFace()) return false; bool ret(true); if( !FT_Get_Char_Index( m_face, cc ) ) { ret = false; } releaseFace(); return ret; } bool FontItem::hasChars(const QString & s) { if(!ensureFace()) return false; bool ret(true); foreach(QChar c, s) { if( !FT_Get_Char_Index( m_face, c.unicode() ) ) { ret = false; break; } } releaseFace(); return ret; } void FontItem::renderAll ( QGraphicsScene * scene , int begin_code, int end_code ) { ensureFace(); FMGlyphsView *allView(0); if(scene->views().count() > 0) allView = reinterpret_cast ( scene->views() [0] ); else { releaseFace(); return; } deRenderAll(); if ( !allView->isVisible() ) { releaseFace(); return; } adjustGlyphsPerRow ( allView->width() ); QRectF exposedRect ( allView->visibleSceneRect() ); // qDebug() << exposedRect; double leftMargin = ( ( exposedRect.width() - ( 100 * m_glyphsPerRow ) ) / 2 ) + 30; double aestheticTopMargin = 12; QPointF pen ( leftMargin, 50 + aestheticTopMargin ); int nl = 0; FT_ULong charcode; FT_UInt gindex = 1; double sizz = 50; charcode = begin_code; QPen selPen ( Qt::gray ); QFont infoFont ( typotek::getInstance()->getChartInfoFontName() , typotek::getInstance()->getChartInfoFontSize() ); QBrush selBrush ( QColor ( 255,255,255,0 ) ); QColor txtColor(60,60,60,255); if ( begin_code >= 0 ) { if ( m_isEncoded ) { while ( charcode <= end_code && gindex ) { if ( nl == m_glyphsPerRow ) { nl = 0; pen.rx() = leftMargin; pen.ry() += 100; } if ( ( pen.y() + 100 ) < exposedRect.y() || pen.y() - 100 > ( exposedRect.y() + exposedRect.height() ) ) { charcode = FT_Get_Next_Char ( m_face, charcode, &gindex ); // qDebug() << "charcode = "<< charcode <<" ; gindex = "<< gindex; pen.rx() += 100; ++nl; continue; } QGraphicsPathItem *pitem = itemFromChar ( charcode , sizz ); if ( pitem ) { uint ucharcode = charcode; scene->addItem ( pitem ); pitem->setPen(Qt::NoPen); pitem->setPos ( pen ); pitem->setData ( 1,"glyph" ); pitem->setData ( 2,gindex ); pitem->setData ( 3,ucharcode ); glyphList.append ( pitem ); pitem->setZValue ( 10 ); QGraphicsTextItem *tit= scene->addText ( glyphName ( charcode ), infoFont ); tit->setDefaultTextColor(txtColor); tit->setPos ( pen.x()-27,pen.y() + 15 ); tit->setData ( 1,"label" ); tit->setData ( 2,gindex ); tit->setData ( 3,ucharcode ); labList.append ( tit ); tit->setZValue ( 1 ); QGraphicsTextItem *tit2= scene->addText ( "U+" + QString ( "%1" ).arg ( charcode,4,16,QLatin1Char ( '0' ) ) +" ("+ QString::number ( charcode ) +")" , infoFont ); tit2->setDefaultTextColor(txtColor); tit2->setPos ( pen.x()-27,pen.y() + 28 ); tit2->setData ( 1,"label" ); tit2->setData ( 2,gindex ); tit2->setData ( 3,ucharcode ); labList.append ( tit2 ); tit2->setZValue ( 1 ); QGraphicsRectItem *rit = scene->addRect ( pen.x() -30,pen.y() -50,100,100,selPen,selBrush ); rit->setFlag ( QGraphicsItem::ItemIsSelectable,true ); rit->setData ( 1,"select" ); rit->setData ( 2,gindex ); rit->setData ( 3,ucharcode ); rit->setZValue ( 100 ); selList.append ( rit ); pen.rx() += 100; ++nl; } charcode = FT_Get_Next_Char ( m_face, charcode, &gindex ); } } else // Has not Unicode { // Here are fake charcodes (glyph index) while ( charcode <= end_code ) { if ( nl == m_glyphsPerRow ) { nl = 0; pen.rx() = leftMargin; pen.ry() += 100; } if ( ( pen.y() + 100 ) < exposedRect.y() || pen.y() - 100 > ( exposedRect.y() + exposedRect.height() ) ) { ++charcode; ++nl; continue; } QGraphicsPathItem *pitem = itemFromGindex ( charcode , sizz ); if ( pitem ) { scene->addItem ( pitem ); pitem->setPos ( pen ); pitem->setData ( 1,"glyph" ); pitem->setData ( 2,gindex ); pitem->setData ( 3,0 ); glyphList.append ( pitem ); pitem->setZValue ( 10 ); QGraphicsTextItem *tit= scene->addText ( QString ( "%1" ).arg ( charcode,4,16,QLatin1Char ( '0' ) ) , infoFont ); tit->setDefaultTextColor(txtColor); tit->setPos ( pen.x(),pen.y() + 15 ); tit->setData ( 1,"label" ); tit->setData ( 2,gindex ); tit->setData ( 3,0 ); labList.append ( tit ); tit->setZValue ( 1 ); QGraphicsRectItem *rit = scene->addRect ( pen.x() -30,pen.y() -50,100,100,selPen,selBrush ); rit->setFlag ( QGraphicsItem::ItemIsSelectable,true ); rit->setData ( 1,"select" ); rit->setData ( 2,gindex ); rit->setData ( 3,0 ); rit->setZValue ( 100 ); selList.append ( rit ); pen.rx() += 100; ++nl; } else { break; } ++charcode; } } } else // beginCode is negative - it means search for out charmap glyphs { // 1/ what is "out charmap"? FT_UInt anIndex = 1; QList notCovered; for ( int i=1; i < m_numGlyphs +1; ++i ) notCovered << true; FT_UInt anyChar = FT_Get_First_Char ( m_face, &anIndex ); while ( anIndex ) { anyChar = FT_Get_Next_Char ( m_face,anyChar,&anIndex ); if ( anIndex && (anIndex <= m_numGlyphs)) { notCovered[anIndex] = false; } } // 2/ fill with glyphs for ( int i = 1; i < notCovered.count(); ++i ) { if ( !notCovered[i] ) continue; if ( nl == m_glyphsPerRow ) { nl = 0; pen.rx() = leftMargin; pen.ry() += 100; } if ( ( pen.y() + 100 ) < exposedRect.y() || pen.y() - 100 > ( exposedRect.y() + exposedRect.height() ) ) { ++nl; continue; } QGraphicsPathItem *pitem = itemFromGindex ( i , sizz ); if ( pitem ) { scene->addItem ( pitem ); pitem->setPos ( pen ); pitem->setData ( 1,"glyph" ); pitem->setData ( 2, i ); pitem->setData ( 3,0 ); glyphList.append ( pitem ); pitem->setZValue ( 10 ); QGraphicsTextItem *tit= scene->addText ( QString ( "I+%1" ).arg ( i ), infoFont ); tit->setDefaultTextColor(txtColor); tit->setPos ( pen.x(),pen.y() + 15 ); tit->setData ( 1,"label" ); tit->setData ( 2,i ); tit->setData ( 3,0 ); labList.append ( tit ); tit->setZValue ( 1 ); QGraphicsTextItem *tit2= scene->addText ( glyphName ( i , false), infoFont ); tit2->setDefaultTextColor(txtColor); tit2->setPos ( pen.x()-27,pen.y() + 30 ); tit2->setData ( 1,"label" ); tit2->setData ( 2,i ); labList.append ( tit2 ); tit2->setZValue ( 1 ); QGraphicsRectItem *rit = scene->addRect ( pen.x() -30,pen.y() -50,100,100,selPen,selBrush ); rit->setFlag ( QGraphicsItem::ItemIsSelectable,true ); rit->setData ( 1,"select" ); rit->setData ( 2,i ); rit->setData ( 3,0 ); rit->setZValue ( 100 ); selList.append ( rit ); pen.rx() += 100; ++nl; } } } scene->setSceneRect ( QRectF ( 0,0, m_glyphsPerRow * 100 + 30, pen.y() + 100 ) ); allIsRendered = true; releaseFace(); // scene->blockSignals(false); // exposedRect = allView->visibleSceneRect(); // qDebug() << "ENDOFRENDERALL" <getChartInfoFontName() , typotek::getInstance()->getChartInfoFontSize() ); QBrush selBrush ( QColor ( 255,255,255,0 ) ); while ( charcode <= end_code && gindex ) { if ( nl == m_glyphsPerRow ) { nl = 0; pen.rx() = leftMargin; pen.ry() += 100; } if ( pen.y() > pheight - 30 ) { releaseFace(); return retValue ; } QGraphicsPathItem *pitem = itemFromChar ( charcode , sizz ); if ( pitem ) { uint ucharcode = charcode; scene->addItem ( pitem ); pitem->setPos ( pen ); pitem->setData ( 1,"glyph" ); pitem->setData ( 2,gindex ); pitem->setData ( 3,ucharcode ); // glyphList.append ( pitem ); pitem->setZValue ( 10 ); QGraphicsTextItem *tit= scene->addText ( glyphName ( charcode ), infoFont ); tit->setPos ( pen.x()-27,pen.y() + 15 ); tit->setData ( 1,"label" ); tit->setData ( 2,gindex ); tit->setData ( 3,ucharcode ); // labList.append ( tit ); tit->setZValue ( 1 ); QGraphicsTextItem *tit2= scene->addText ( "U+" + QString ( "%1" ).arg ( charcode,4,16,QLatin1Char ( '0' ) ) +" ("+ QString::number ( charcode ) +")" , infoFont ); tit2->setPos ( pen.x()-27,pen.y() + 28 ); tit2->setData ( 1,"label" ); tit2->setData ( 2,gindex ); tit2->setData ( 3,ucharcode ); // labList.append ( tit2 ); tit2->setZValue ( 1 ); QGraphicsRectItem *rit = scene->addRect ( pen.x() -30,pen.y() -50,100,100,selPen,selBrush ); rit->setFlag ( QGraphicsItem::ItemIsSelectable,true ); rit->setData ( 1,"select" ); rit->setData ( 2,gindex ); rit->setData ( 3,ucharcode ); rit->setZValue ( 100 ); pen.rx() += 100; ++nl; ++retValue; } retValue = charcode; charcode = FT_Get_Next_Char ( m_face, charcode, &gindex ); } releaseFace(); return retValue ; } QString FontItem::glyphName ( int codepoint, bool codeIsChar ) { ensureFace(); int index(0); if(codeIsChar) { index = FT_Get_Char_Index ( m_face, codepoint ); if ( index== 0 ) { return "noname"; } } else index = codepoint; QByteArray key ( 1001,0 ); if ( FT_HAS_GLYPH_NAMES ( m_face ) ) { FT_Get_Glyph_Name ( m_face, index, key.data() , 1000 ); if ( key[0] == char ( 0 ) ) { key = "noname"; } } else { key = "noname"; } return QString ( key ); releaseFace(); } QString FontItem::infoGlyph ( int index, int code ) { ensureFace(); QString ret; ret += glyphName ( code ) ; ret += ", " + QObject::tr ( "codepoint is U+" ) ; ret += QString ( "%1" ).arg ( code, 4, 16, QChar ( 0x0030 ) ) ; ret += " (int"+ QString::number ( code ) +")"; releaseFace(); return ret; } //deprecated QString FontItem::toElement() { QString ret; ret = "%1%2"; return ret.arg ( name() ).arg ( tags().join ( "" ) ); } QGraphicsPathItem * FontItem::hasCodepointLoaded ( int code ) { for ( int i=0;i< glyphList.count();++i ) { if ( glyphList.at ( i )->data ( 3 ).toInt() == code ) return glyphList.at ( i ); } return 0; } QPixmap FontItem::oneLinePreviewPixmap ( QString oneline , QColor fg_color, QColor bg_color, int size_w , int size_f ) { // if ( m_remote ) // return fixedPixmap; // if ( !theOneLinePreviewPixmap.isNull() ) // { // if ( theOneLinePreviewPixmap.width() == size_w ) // return theOneLinePreviewPixmap; // } if ( !ensureFace() ) return QPixmap(); QRectF savedRect = theOneLineScene->sceneRect(); double theSize = (size_f == 0) ? typotek::getInstance()->getPreviewSize() : size_f; double pt2px = typotek::getInstance()->getDpiX() / 72.0; double theHeight = theSize * 1.3 * pt2px; double theWidth; if ( size_w == 0 ) { theWidth = theSize * pt2px * oneline.count() * 1.2; } else { theWidth = size_w; } // qDebug() << theSize << theHeight << theWidth; theOneLineScene->setSceneRect ( 0,0,theWidth, theHeight ); bool pRTL = typotek::getInstance()->getPreviewRTL(); QPointF pen ( pRTL ? theWidth - 16 : 16 , theSize * pt2px ); int fsize = qRound(theSize) * 64 ; double scalefactor = theSize / m_face->units_per_EM; QPixmap linePixmap ( qRound(theWidth), qRound(theHeight) ); linePixmap.fill ( bg_color ); QPainter apainter ( &linePixmap ); bool canRender(true); for ( int i(0);i < oneline.count() ; ++i ) { if(FT_Get_Char_Index ( m_face, oneline[i].unicode() ) == 0) { canRender = false; break; } } if(canRender) { for ( int i(0);i < oneline.count() ; ++i ) { int glyphIndex = FT_Get_Char_Index ( m_face, oneline[i].unicode() ); FT_Set_Char_Size ( m_face, fsize, 0, typotek::getInstance()->getDpiX(), typotek::getInstance()->getDpiY() ); if(FT_Load_Glyph ( m_face, glyphIndex, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING ) > 0) continue; if(FT_Render_Glyph ( m_face->glyph, FT_RENDER_MODE_NORMAL ) > 0) continue; if ( pRTL ) pen.rx() -= qRound ( m_glyph->linearHoriAdvance / 65536 ); apainter.drawImage ( pen.x() + m_glyph->bitmap_left , pen.y() - m_glyph->bitmap_top , glyphImage(fg_color) ); if ( !pRTL ) pen.rx() += qRound ( m_glyph->linearHoriAdvance / 65536 ); } } else { QString cantRenderString(tr("(%1)", "when doing the font preview, used to denote a font that can not displayed its name")); apainter.drawText(pen.x(),pen.y(), cantRenderString.arg(oneline)); } apainter.end(); releaseFace(); return linePixmap; // theOneLinePreviewPixmap = linePixmap; // if ( !theOneLinePreviewPixmap.isNull() ) // return theOneLinePreviewPixmap; // theOneLinePreviewPixmap = QPixmap ( qRound(theWidth), qRound(theHeight) ); // theOneLinePreviewPixmap.fill ( Qt::lightGray ); // return theOneLinePreviewPixmap; } void FontItem::clearPreview() { // if ( m_remote ) // return; // if ( !theOneLinePreviewPixmap.isNull() ) // theOneLinePreviewPixmap = QPixmap(); } FontInfoMap FontItem::moreInfo() { FontInfoMap ret; if(!ensureFace()) return ret; if ( testFlag ( m_face->face_flags, FT_FACE_FLAG_SFNT, "1","0" ) == "1" ) { m_isOpenType = true; } if(m_isOpenType) { ret = moreInfo_sfnt(); } else { ret = moreInfo_type1(); } releaseFace(); return ret; } QString FontItem::panose() { if(!ensureFace()) return QString("0:0:0:0:0:0:0:0:0:0"); QStringList pl; TT_OS2 *os2 = static_cast ( FT_Get_Sfnt_Table ( m_face, ft_sfnt_os2 ) ); if ( os2 ) { for ( int bI ( 0 ); bI < 10; ++bI ) { pl << QString::number ( os2->panose[bI] ) ; } } else { for ( int bI ( 0 ); bI < 10; ++bI ) { pl << QString::number ( 0 ) ; } } releaseFace(); return pl.join(":"); } QStringList FontItem::supportedLangDeclaration() { QStringList ret; if ( !ensureFace() ) return ret; TT_OS2 *os2 = static_cast ( FT_Get_Sfnt_Table ( m_face, ft_sfnt_os2 ) ); if ( os2 ) { QList uMaskList; uMaskList << os2->ulUnicodeRange1 << os2->ulUnicodeRange2 << os2->ulUnicodeRange3 << os2->ulUnicodeRange4; const QMap >& uranges(FMEncData::Os2URanges()); unsigned int mask(1); for( int i(0); i < uMaskList.count(); ++i ) { for(int j(0); j < 32; ++j) { unsigned int set(mask << j); if((set & uMaskList[i]) > 0) { int pos((i * 32) + j); if(uranges.contains(pos)) { QString b( FMUniBlocks::block(uranges[pos]) ); if(!b.isEmpty()) ret << b; } } } } } releaseFace(); return ret; } double FontItem::italicAngle() { double ret(0); if(!ensureFace()) return ret; if ( testFlag ( m_face->face_flags, FT_FACE_FLAG_SFNT, "1","0" ) == "1" ) { TT_Postscript *post = static_cast ( FT_Get_Sfnt_Table ( m_face, ft_sfnt_post ) ); if ( post ) ret = ( double(post->italicAngle) / double (0x10000) ) ; } else { PS_FontInfoRec sinfo ; int err = FT_Get_PS_Font_Info ( m_face,&sinfo ); if ( !err ) ret = sinfo.italic_angle; } releaseFace(); return ret; } FontItem::FsType FontItem::getFsType() { // After some thinking, it appears that it would be a nonsense to not retrieve it from the actual font file. FsType fst( NOT_RESTRICTED ); if(!ensureFace()) return fst; TT_OS2 *os2 = static_cast ( FT_Get_Sfnt_Table ( m_face, ft_sfnt_os2 ) ); if ( os2 ) { fst = FsType(os2->fsType); } releaseFace(); return fst; } int FontItem::table(const QString & tableName) { if(!ensureFace()) return 0; if ( !FT_IS_SFNT ( m_face ) ) { releaseFace(); return 0; } uint tag(OTF_name_tag(tableName)); FT_ULong length( 0 ); FT_Load_Sfnt_Table ( m_face, tag , 0, NULL, &length ); releaseFace(); return int(length); } QByteArray FontItem::tableData(const QString & tableName) { QByteArray ret; if(!ensureFace()) return ret; if ( !FT_IS_SFNT ( m_face ) ) { releaseFace(); return ret; } uint tag(OTF_name_tag(tableName)); FT_ULong length( 0 ); if ( !FT_Load_Sfnt_Table ( m_face, tag, 0, NULL, &length ) ) { if ( length > 0 ) { ret.resize ( length ); FT_Load_Sfnt_Table ( m_face, tag, 0, ( FT_Byte * ) ret.data (), &length ); } } releaseFace(); return ret; } /** reminder FT_SfntName::name_id Code Meaning 0 Copyright 1 Font Family 2 Font Subfamily 3 Unique font identifier 4 Full font name 5 Version string 6 Postscript name for the font 7 Trademark 8 Manufacturer Name. 9 Designer 10 Description 11 URL Vendor 12 URL Designer 13 License Description 14 License Info URL 15 Reserved; Set to zero. 16 Preferred Family 17 Preferred Subfamily 18 Compatible Full (Macintosh only) 19 Sample text 20 PostScript CID findfont name */ FontInfoMap FontItem::moreInfo_sfnt() { if ( !ensureFace() ) return FontInfoMap(); FontInfoMap moreInfo; FT_SfntName tname; int tname_count = FT_Get_Sfnt_Name_Count ( m_face ); //TODO check encodings and platforms for ( int i=0; i < tname_count; ++i ) { FT_Get_Sfnt_Name ( m_face,i,&tname ); int akey; if ( tname.name_id > 255 ) { // qDebug() << name() <<" has vendor’s specific name id ->" << tname.name_id; if ( tname.string_len > 0 ) { // akey = "VendorKey_" + QString::number ( tname.name_id ); akey = tname.name_id ; } else { continue; } } else if ( tname.name_id <= FontStrings::Names().count()) { akey = tname.name_id ; } else { // qDebug() << name() <<" : It seems there are new name IDs in TT spec ("<< tname.name_id <<")!"; continue; } QString avalue; ///New plan, we’ll put here _user contributed_ statements! if ( tname.platform_id ==TT_PLATFORM_MICROSOFT && tname.encoding_id == TT_MS_ID_UNICODE_CS ) // Corresponds to a Microsoft WGL4 charmap, matching Unicode. { QByteArray array ( ( const char* ) tname.string, tname.string_len ); QTextCodec *codec = QTextCodec::codecForName ( "UTF-16BE" ); avalue = codec->toUnicode ( array ); } else if ( tname.platform_id ==TT_PLATFORM_MICROSOFT && tname.encoding_id == TT_MS_ID_SYMBOL_CS ) // Corresponds to Microsoft symbol encoding. PM - don(t understand what it does here? seen in StandardSym.ttf { avalue = "Here, imagine some nice symbols!"; } else if ( tname.platform_id == TT_PLATFORM_MACINTOSH && tname.encoding_id == TT_APPLE_ID_DEFAULT ) // Unicode version 1.0 { QByteArray array ( ( const char* ) tname.string, tname.string_len ); QTextCodec *codec = QTextCodec::codecForName ( "ISO 8859-15" ); // ### give better result than UTF ??? avalue = codec->toUnicode ( array ); } else if ( tname.platform_id == TT_PLATFORM_APPLE_UNICODE && tname.encoding_id == TT_APPLE_ID_DEFAULT ) // Unicode version 1.0 { QByteArray array ( ( const char* ) tname.string, tname.string_len ); QTextCodec *codec = QTextCodec::codecForName ( "ISO 8859-15" ); // ### give better result than UTF ??? avalue = codec->toUnicode ( array ); } // from Pajarico, pajarico chez gmail point com else if ( tname.platform_id == TT_PLATFORM_APPLE_UNICODE && tname.encoding_id == TT_APPLE_ID_UNICODE_2_0 ) { QByteArray array ( ( const char* ) tname.string, tname.string_len ); QTextCodec *codec = QTextCodec::codecForName ( "UTF-16" ); avalue = codec->toUnicode ( array ); } else if ( tname.platform_id == TT_PLATFORM_MACINTOSH /*&& tname.encoding_id == TT_MAC_ID_TRADITIONAL_CHINESE*/ ) { QByteArray array ( ( const char* ) tname.string, tname.string_len ); QTextCodec *codec = QTextCodec::codecForName ( "Apple Roman" ); avalue = codec->toUnicode ( array ); } else { avalue = "Unexpected platform - encoding pair (" + QString::number ( tname.platform_id ) + "," + QString::number ( tname.encoding_id ) + ")\nPlease contact Fontmatrix team.\nRun Fontmatrix in console to see more info.\nPlease, if possible, provide a font file to test."; qDebug() << m_name << "platform_id(" << tname.platform_id <<") - encoding_id(" << tname.encoding_id <<") - " << QString::number ( tname.language_id ) << FMEncData::LangIdMap()[tname.language_id]; } if ( !avalue.isEmpty() ) { moreInfo[tname.language_id][akey] = avalue; } } // Is there an OS/2 table? // TT_OS2 *os2 = static_cast ( FT_Get_Sfnt_Table ( m_face, ft_sfnt_os2 ) ); // if ( os2 /* and wantAutoTag*/ ) // { // // PANOSE // QStringList pl; // for ( int bI ( 0 ); bI < 10; ++bI ) // { // // pl << QString::number ( os2->panose[bI] ) ; // } // // moreInfo[0][FMFontDb::Panose] = pl.join(":"); // // FSTYPE (embedding status) // if(!os2->fsType) // m_OSFsType = NOT_RESTRICTED; // else // { // if(os2->fsType & RESTRICTED) // m_OSFsType |= RESTRICTED; // if(os2->fsType & PREVIEW_PRINT) // m_OSFsType |= PREVIEW_PRINT; // if(os2->fsType & EDIT_EMBED) // m_OSFsType |= EDIT_EMBED; // if(os2->fsType & NOSUBSET) // m_OSFsType |= NOSUBSET; // if(os2->fsType & BITMAP_ONLY) // m_OSFsType |= BITMAP_ONLY; // } // // } releaseFace(); return moreInfo; } QString FontItem::getAlternateFamilyName() { if ( !ensureFace() ) return QString(); FT_SfntName tname; int tname_count = FT_Get_Sfnt_Name_Count ( m_face ); for ( int i=0; i < tname_count; ++i ) { FT_Get_Sfnt_Name ( m_face , i , &tname ); if ( tname.name_id == 1 && tname.language_id == 0 ) { return QString ( QByteArray ( ( const char* ) tname.string, tname.string_len ) ); } } releaseFace(); return QString(); } QString FontItem::getAlternateVariantName() { if ( !ensureFace() ) return QString(); FT_SfntName tname; int tname_count = FT_Get_Sfnt_Name_Count ( m_face ); for ( int i=0; i < tname_count; ++i ) { FT_Get_Sfnt_Name ( m_face , i , &tname ); if ( tname.name_id == 2 && tname.language_id == 0 ) { return QString ( QByteArray ( ( const char* ) tname.string, tname.string_len ) ); } } releaseFace(); return QString(); } FontInfoMap FontItem::moreInfo_type1() { if ( !ensureFace() ) return FontInfoMap(); FontInfoMap moreInfo; PS_FontInfoRec sinfo ; int err = FT_Get_PS_Font_Info ( m_face,&sinfo ); if ( err ) { qDebug() <<"FT_Get_PS_Font_Info("<< m_name <<")"<<" failed :" << err; return FontInfoMap(); } moreInfo[0][1] = sinfo.family_name; moreInfo[0][2] = sinfo.weight; moreInfo[0][4] = sinfo.full_name; moreInfo[0][5] = sinfo.version; moreInfo[0][10] = sinfo.notice; releaseFace(); return moreInfo; } QStringList FontItem::tags()const { return FMFontDb::DB()->getValue(m_path, FMFontDb::Tags).toStringList(); } void FontItem::addTag(const QString & t) { FMFontDb::DB()->addTag(m_path, t); } void FontItem::setTags ( QStringList l ) { FMFontDb::DB()->setTags(m_path, l); } /// When glyphsView is resized we wantto adjust the number of columns void FontItem::adjustGlyphsPerRow ( int width ) { m_glyphsPerRow = 1; int extraAdjust = 30; for ( int i = 1; i < 30 ; ++i ) { if ( ( i*100 ) +extraAdjust > width ) return; else m_glyphsPerRow = i; } } bool FontItem::isActivated() const { // if ( FMFontDb::DB()->getValue(m_path,FMFontDb::Activation ).toInt() > 0 ) // return true; // return m_active; } void FontItem::setActivated ( bool act ) { m_active = act; if ( act ) { FMFontDb::DB()->setValue(m_path, FMFontDb::Activation , 1); } else { FMFontDb::DB()->setValue(m_path, FMFontDb::Activation , 0); } } FMOtf * FontItem::takeOTFInstance() { ensureFace(); if ( m_isOpenType ) otf = new FMOtf ( m_face ); return otf; // It is a case where we don’t release face, thr caller have to call releaseOTFInstance; } void FontItem::releaseOTFInstance ( FMOtf * rotf ) { if ( rotf == otf ) { delete otf; otf = 0; } releaseFace(); } QStringList FontItem::features() { QStringList ret; if(!takeOTFInstance()) { releaseOTFInstance(otf); return ret; } foreach ( QString table, otf->get_tables() ) { otf->set_table ( table ); foreach ( QString script, otf->get_scripts() ) { otf->set_script ( script ); foreach ( QString lang, otf->get_langs() ) { otf->set_lang ( lang ); foreach ( QString feature, otf->get_features() ) { if(ret.contains(feature)) ret << feature; } } } } releaseOTFInstance(otf); return ret; } int FontItem::showFancyGlyph ( QGraphicsView *view, int charcode , bool charcodeIsAGlyphIndex ) { ensureFace(); int ref ( fancyGlyphs.count() ); QRect allRect ( view->rect() ); QRect targetRect ( view->mapToScene ( allRect.topLeft() ).toPoint(), view->mapToScene ( allRect.bottomRight() ).toPoint() ) ; // qDebug() << allRect.topLeft() << view->mapToScene ( allRect.topLeft() ); // We’ll try to have a square subRect that fit in view ;-) int squareSideUnit = qMin ( allRect.width() * 0.1, allRect.height() * 0.1) ; int squareSide = 8 * squareSideUnit; int squareXOffset = ( allRect.width() - squareSide ) / 2; int squareYOffset = ( allRect.height() - squareSide ) / 2; QRect subRect ( QPoint ( squareXOffset , squareYOffset ), QSize ( squareSide, squareSide ) ); QPixmap pix ( allRect.width(), allRect.height() ); pix.fill ( QColor ( 30,0,0,120 ) ); QPainter painter ( &pix ); painter.setRenderHint(QPainter::Antialiasing, true); painter.setBrush ( Qt::white ); painter.setPen ( QPen ( QBrush( QColor ( 0,0,0,255 ) ), 3/*, Qt::DashLine*/ ) ); painter.drawRoundRect ( subRect,5,5 ); painter.setPen ( QPen ( QColor ( 0,0,255,120 ) ) ); ft_error = FT_Set_Pixel_Sizes ( m_face, 0, qRound(subRect.height() * 0.8) ); if ( ft_error ) { return -1; } if ( !charcodeIsAGlyphIndex ) ft_error = FT_Load_Char ( m_face, charcode , FT_LOAD_RENDER ); else ft_error = FT_Load_Glyph ( m_face, charcode , FT_LOAD_RENDER ); if ( ft_error ) { return -1; } QVector palette; for ( int i = 0; i < m_face->glyph->bitmap.num_grays; ++i ) { palette << qRgb ( 255 - i,255 - i,255 - i ); } QImage img ( m_face->glyph->bitmap.buffer, m_face->glyph->bitmap.width, m_face->glyph->bitmap.rows, m_face->glyph->bitmap.pitch, QImage::Format_Indexed8 ); img.setColorTable ( palette ); double scaledBy = 1.0; if ( img.width() > subRect.width() ) { scaledBy = ( double ) subRect.width() / ( double ) img.width() * 0.8; // qDebug() <<"scaledBy = " << scaledBy ; img = img.scaledToWidth ( qRound(subRect.width() * 0.8 ),Qt::SmoothTransformation ); } QPoint gPos ( subRect.topLeft() ); gPos.rx() += ( subRect.width() - img.width() ) / 2; gPos.ry() += ( subRect.height() - img.height() ) /2; painter.drawImage ( gPos, img ); /// Draw metrics int iAngle(italicAngle()); QPoint pPos ( gPos ); pPos.rx() -= qRound(m_face->glyph->bitmap_left * scaledBy); pPos.ry() += qRound(m_face->glyph->bitmap_top * scaledBy); double aF(tan((3.14/180.0) * iAngle)); double asc(subRect.top() - pPos.y()); double desc(pPos.y() - subRect.bottom()); //left painter.drawLine ( pPos.x() + (asc * aF), subRect.top(), pPos.x() - (desc * aF), subRect.bottom() ); //right painter.drawLine ( qRound(pPos.x() + m_face->glyph->metrics.horiAdvance / 64 * scaledBy ) + (asc * aF), subRect.top(), qRound( pPos.x() + m_face->glyph->metrics.horiAdvance / 64 * scaledBy) - (desc * aF), subRect.bottom() ); //baseline painter.drawLine ( subRect.left() , pPos.y() , subRect.right(), pPos.y() ); painter.end(); QGraphicsPixmapItem *fancyGlyph = new QGraphicsPixmapItem; fancyGlyph->setPixmap ( pix ); fancyGlyph->setZValue ( 10000 ); fancyGlyph->setPos ( targetRect.topLeft() ); view->scene()->addItem ( fancyGlyph ); fancyGlyphs[ref] = fancyGlyph ; QGraphicsTextItem *textIt = new QGraphicsTextItem; textIt->setTextWidth ( allRect.width() ); QString itemNameStyle ( "background-color:#000;color:#fff;font-weight:bold;font-size:13pt;padding:0 3px;" ); QString itemValueStyle ( "background-color:#fff;color:#000;font-size:9pt;padding:0 3px;" ); if ( charcodeIsAGlyphIndex ) { QString html(QString(" %2 - Index %4 ") .arg(itemNameStyle) .arg(glyphName(charcode)) .arg(itemValueStyle) .arg(QString::number ( charcode ))); textIt->setHtml ( html ); } else { QString catString; catString = FontStrings::UnicodeCategory(QChar::category(static_cast ( charcode ))); QString html(QString(" %2 %4 - U+%5 <&#%6;> ") .arg(itemNameStyle) .arg(glyphName(charcode)) .arg(itemValueStyle) .arg(catString) .arg(QString("%1").arg(charcode, 4, 16, QChar('0')).toUpper()) .arg(charcode)); textIt->setHtml ( html ); } // qDebug()<< textIt->toHtml(); // QPointF tPos ( subRect.left() + 18.0 , subRect.bottom() ); QRectF tRect(textIt->boundingRect()); QPointF tPos ( -3, targetRect.bottom() - tRect.height() +5); textIt->setPos ( tPos ); textIt->setZValue ( 2000000 ); textIt->setEnabled ( true ); textIt->setFlags ( QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable ); textIt->setData ( 10, "FancyText" ); view->scene()->addItem ( textIt ); fancyTexts[ref] = textIt ; // Alternates if ( !charcodeIsAGlyphIndex && m_isOpenType ) { QList alts ( getAlternates ( charcode ) ); qDebug() << "PALTS"<pixmap().toImage().alphaChannel() ); QPixmap altP ( altI.width() * 2, altI.height() * 2 ); altP.fill ( Qt::transparent ); QPainter altPainter ( &altP ); altPainter.setRenderHint ( QPainter::Antialiasing,true ); altPainter.setBrush ( Qt::black ); altPainter.drawRoundRect ( 5, 5, altP.width() - 10, altP.height() - 10, 20,20 ); altPainter.drawImage ( qRound(altI.width() / 2.0), qRound(altI.height() / 2.0) , altI ); gpi->setPixmap ( altP ); view->scene()->addItem ( gpi ); gpi->setPos ( view->mapToScene ( subRect.right() ,altXOffset ) ); altXOffset += altP.height(); gpi->setZValue ( 9999999 ); qDebug() <pos() <scenePos(); } } releaseFace(); return ref; } void FontItem::hideFancyGlyph ( int ref ) { if ( fancyGlyphs.contains ( ref ) ) { QGraphicsPixmapItem *it = fancyGlyphs.value ( ref ); it->scene()->removeItem ( it ); fancyGlyphs.remove ( ref ); delete it; } if ( fancyTexts.contains ( ref ) ) { QGraphicsTextItem *it = fancyTexts.value ( ref ); it->scene()->removeItem ( it ); fancyTexts.remove ( ref ); delete it; } if ( fancyAlternates.value ( ref ).count() ) { QList pil ( fancyAlternates.value ( ref ) ); for ( int pidx ( 0 ); pidx < pil.count(); ++pidx ) { QGraphicsPixmapItem *it = pil.at ( pidx ) ; it->scene()->removeItem ( it ); delete it; } fancyAlternates.remove ( ref ); } } bool FontItem::isLocal() { QString shem = m_url.scheme(); if ( shem.isEmpty() || shem == "file" ) return true; return false; } /// We don’t want to download fonts yet. We just want something to fill font tree void FontItem::fileRemote ( QString f , QString v, QString t, QString i, QPixmap p ) { m_family = f; m_variant = v; m_type = t; // m_cacheInfo = i; // fixedPixmap = p; } /// the same, but just for speedup startup with a lot of font files void FontItem::fileLocal ( QString f, QString v, QString t, QString p ) { m_family = f; m_variant = v; m_type = t; } void FontItem::fileLocal ( FontLocalInfo fli ) { m_family = fli.family; m_variant = fli.variant; m_type = fli.type; // m_panose = fli.panose; // moreInfo = fli.info; // if ( !fli.panose.isEmpty() ) // { // for ( int bI ( 0 ); bI < 10; ++bI ) // { // panoseInfo[ panoseKeys[bI] ] = panoseMap.value ( panoseKeys[bI] ).value ( m_panose.mid ( bI,1 ).toInt() ) ; // // } // // } } /// Finally, we have to download the font file int FontItem::getFromNetwork() { qDebug() <<"FontItem::getFromNetwork()"; if ( remoteCached ) return 1; if ( stopperDownload ) return 2; else stopperDownload = true; QUrl url ( m_path ); remoteHerePath = typotek::getInstance()->remoteTmpDir() + QDir::separator() + QFileInfo ( url.path() ).fileName(); rFile = new QFile ( remoteHerePath ); if ( !rFile->open ( QIODevice::WriteOnly ) ) { qDebug() << "Can’t open " << remoteHerePath; delete rFile; // return false; } rHttp = new QHttp ( url.host() ); qDebug() << "Init progress Dialog"; rProgressDialog = new QProgressDialog ( typotek::getInstance() ); rProgressDialog->setWindowTitle ( tr ( "Fontmatrix - Download" ) ); rProgressDialog->setLabelText ( tr ( "Downloading %1." ).arg ( m_path ) ); rProgressDialog->show(); rProgressDialog->raise(); rProgressDialog->activateWindow(); qDebug() <<"Progress dialog done"; connect ( rHttp,SIGNAL ( dataReadProgress ( int, int ) ),this,SLOT ( slotDowloadProgress ( int,int ) ) ); connect ( rHttp,SIGNAL ( requestFinished ( int, bool ) ),this,SLOT ( slotDownloadEnd ( int, bool ) ) ); connect ( rHttp,SIGNAL ( done ( bool ) ),this,SLOT ( slotDownloadDone ( bool ) ) ); connect ( rHttp,SIGNAL ( stateChanged ( int ) ),this,SLOT ( slotDownloadState ( int ) ) ); remoteId = rHttp->get ( url.path() , rFile ); return 2; } void FontItem::slotDownloadStart ( int id ) { // rProgressDialog->show(); if ( id != remoteId ) { qDebug() << "catched a weird request : " << id; } } void FontItem::slotDowloadProgress ( int done, int total ) { rProgressDialog->setMaximum ( total ); rProgressDialog->setValue ( done ); qDebug() << " [" <flush(); rFile->close(); rHttp->close(); delete rProgressDialog; delete rFile; emit dowloadFinished(); } void FontItem::slotDownloadDone ( bool error ) { qDebug() << "slotDownloadDone(" < FontItem::getAlternates ( int ccode ) { QList ret; if ( !ensureFace() ) return ret; if ( !otf && m_isOpenType ) { otf = new FMOtf ( m_face ); if ( !otf ) return ret; } int glyphIndex ( FT_Get_Char_Index ( m_face, ccode ) ); QList setList; setList.clear(); otf->set_table ( "GSUB" ); foreach ( QString script, otf->get_scripts() ) { otf->set_script ( script ); foreach ( QString lang, otf->get_langs() ) { otf->set_lang ( lang ); QStringList fl ( otf->get_features() ); if ( fl.contains ( "aalt" ) ) { OTFSet set; set.script = script; set.lang = lang; set.gpos_features.clear(); set.gsub_features = QStringList ( "aalt" ); setList << set; qDebug() << "AALT"< rendered ( otf->procstring ( spec, set ) ); if(rendered.isEmpty()) continue; if ( rendered.at ( 0 ).glyph != glyphIndex ) { if ( !ret.contains ( rendered.at ( 0 ).glyph ) ) ret << rendered.at ( 0 ).glyph; } if ( !otf->altGlyphs.isEmpty() ) { QList l ( otf->altGlyphs ); foreach ( int g, l ) { if ( !ret.contains ( g ) && g != glyphIndex ) ret << g; } } } delete otf; otf = 0; releaseFace(); return ret; } QImage FontItem::glyphImage(QColor color) { QImage img ( m_face->glyph->bitmap.width, m_face->glyph->bitmap.rows, QImage::Format_Indexed8); // QImage img ( m_face->glyph->bitmap.buffer, // m_face->glyph->bitmap.width, // m_face->glyph->bitmap.rows, // m_face->glyph->bitmap.pitch, // QImage::Format_Indexed8 ); // qDebug()<<"GSlot"<< m_face->glyph->bitmap.buffer // << m_face->glyph->bitmap.width // << m_face->glyph->bitmap.rows // << m_face->glyph->bitmap.pitch ; if ( (m_face->glyph->bitmap.num_grays != 256) || (color != QColor(Qt::black)) ) { QVector palette; palette.clear(); int r(color.red()); int g(color.green()); int b(color.blue()); for ( int aa = 0; aa < m_face->glyph->bitmap.num_grays; ++aa ) { palette << qRgba ( r,g,b, aa ); } img.setColorTable ( palette ); } else { img.setColorTable ( gray256Palette ); } unsigned char * cursor(m_face->glyph->bitmap.buffer); // QString dbs; for(int r(0); r < m_face->glyph->bitmap.rows; ++r) { // dbs.clear(); for(int x(0); x < m_face->glyph->bitmap.width; ++x) { img.setPixel( x, r, *(cursor + x)); // dbs += (*(cursor + x) > 0) ? "+" : "."; } // qDebug()<glyph->bitmap.pitch; } return img; } FontInfoMap FontItem::rawInfo() { return FMFontDb::DB()->getInfoMap(m_path); } int FontItem::shaperType() const { return m_shaperType; } void FontItem::setShaperType ( int theValue ) { m_shaperType = theValue; } GlyphList FontItem::glyphs ( QString spec, double fsize ) { // qDebug()<<"glyphs ("<< spec.left(24) <<", "<getHyphenator(); GlyphList ret; if ( spec.isEmpty() || fsize <= 0.0 ) return ret; if( !ensureFace() ) return ret; double scalefactor = fsize / m_face->units_per_EM ; QChar spaceChar(' '); int startSpaceCount(0); int endSpaceCount(0); int specCount(spec.count()); for(int s(0); s < specCount; ++s) { if(spec.at(s) == spaceChar) ++startSpaceCount; else break; } if(startSpaceCount != specCount) { for(int s(specCount-1); s >= 0; --s) { if(spec.at(s) == spaceChar) ++endSpaceCount; else break; } } QStringList stl(spec.split(spaceChar, QString::SkipEmptyParts)); QGraphicsPathItem *glyph = itemFromChar ( spaceChar.unicode() , fsize ); RenderedGlyph wSpace(glyph->data(GLYPH_DATA_GLYPH).toInt(),0, glyph->data(GLYPH_DATA_HADVANCE).toDouble() * scalefactor ,0,0,0,' ',false); delete glyph; for(int s(0); s < startSpaceCount; ++s) { ret << wSpace; } for(QStringList::const_iterator sIt(stl.constBegin());sIt != stl.constEnd(); ++ sIt) { if(sIt != stl.constBegin()) { ret << wSpace; } HyphList hl; if(hyph) { hl = hyph->hyphenate(*sIt) ; // if(hl.count())qDebug()<<"Hyph W C"<<*sIt<data(GLYPH_DATA_GLYPH).toInt(); rg.log = i; // We are in a 1/1 relation rg.lChar = (*sIt).at ( i ).unicode(); rg.xadvance = glyph->data(GLYPH_DATA_HADVANCE).toDouble() * scalefactor; rg.yadvance = glyph->data(GLYPH_DATA_VADVANCE).toDouble() * scalefactor; rg.xoffset = 0; rg.yoffset = 0; delete glyph; if(hl.contains( i )) { // qDebug()<<"H B A"<data(GLYPH_DATA_GLYPH).toInt(); // bg.log = ; // We are in a 1/1 relation bg.lChar = bS.at ( bI ).unicode(); bg.xadvance = glyph->data(GLYPH_DATA_HADVANCE).toDouble() * scalefactor; bg.yadvance = glyph->data(GLYPH_DATA_VADVANCE).toDouble() * scalefactor; bg.xoffset = 0; bg.yoffset = 0; delete glyph; rg.hyphen.first << bg; } bS = hl[i].second + addOnSecond ; for(int bI(0);bIdata(GLYPH_DATA_GLYPH).toInt(); // bg.log = i; // We are in a 1/1 relation bg.lChar = bS.at ( bI ).unicode(); bg.xadvance = glyph->data(GLYPH_DATA_HADVANCE).toDouble() * scalefactor; bg.yadvance = glyph->data(GLYPH_DATA_VADVANCE).toDouble() * scalefactor; bg.xoffset = 0; bg.yoffset = 0; delete glyph; rg.hyphen.second << bg; } } ret << rg; } } for(int s(0); s < endSpaceCount; ++s) { ret << wSpace; } releaseFace(); // qDebug()<<"EndOfGlyphs"; return ret; } GlyphList FontItem::glyphs(QString spec, double fsize, OTFSet set) { FMHyphenator *hyph = typotek::getInstance()->getHyphenator(); GlyphList Gret; if ( spec.isEmpty() || fsize <= 0.0 || !m_isOpenType) // enough :-) return Gret; if(!ensureFace()) return Gret; otf = new FMOtf ( m_face, 0x10000 ); if ( !otf ) { releaseFace(); return Gret; } // FMAltContext * actx ( FMAltContextLib::GetCurrentContext()); // int cword(0); // int cchunk(0); QStringList stl(spec.split(' ',QString::SkipEmptyParts)); double scalefactor = fsize / m_face->units_per_EM ; QGraphicsPathItem *glyph = itemFromChar ( QChar(' ').unicode() , fsize ); RenderedGlyph wSpace(glyph->data(GLYPH_DATA_GLYPH).toInt(),0, glyph->data(GLYPH_DATA_HADVANCE).toDouble() * scalefactor ,0,0,0,' ',false); wSpace.lChar = 0x20; delete glyph; for(QStringList::const_iterator sIt(stl.constBegin());sIt != stl.constEnd(); ++ sIt) { // actx->setWord(cword); // actx->setChunk(cchunk); // actx->fileWord(*sIt); // actx->fileChunk(*sIt); if(sIt != stl.constBegin()) { Gret << wSpace; } HyphList hl; if(hyph) { hl = hyph->hyphenate(*sIt) ; // qDebug()<<"Hyph W C"<<*sIt<procstring ( *sIt , set ) ); // otf->procstring works in font unit, so... for(int i(0); i < ret.count(); ++i) { ret[i].xadvance *= scalefactor; ret[i].yadvance *= scalefactor; ret[i].xoffset *= scalefactor; ret[i].yoffset *= scalefactor; if(hl.contains( ret[i].log )) { // qDebug()<<"L R"<setChunk(++cchunk); // actx->fileChunk( hl[ret[i].log].first + addOnFirst); ret[i].hyphen.first = otf->procstring ( hl[ret[i].log].first + addOnFirst, set ); for(int f(0); f < ret[i].hyphen.first.count(); ++f) { ret[i].hyphen.first[f].xadvance *= scalefactor; ret[i].hyphen.first[f].yadvance *= scalefactor; ret[i].hyphen.first[f].xoffset *= scalefactor; ret[i].hyphen.first[f].yoffset *= scalefactor; } // actx->setChunk(++cchunk); // actx->fileChunk( hl[ret[i].log].second + addOnSecond ); ret[i].hyphen.second = otf->procstring ( hl[ret[i].log].second + addOnSecond, set ); for(int f(0); f < ret[i].hyphen.second.count(); ++f) { ret[i].hyphen.second[f].xadvance *= scalefactor; ret[i].hyphen.second[f].yadvance *= scalefactor; ret[i].hyphen.second[f].xoffset *= scalefactor; ret[i].hyphen.second[f].yoffset *= scalefactor; } } } Gret << ret; // cchunk = 0; // ++cword; } delete otf; otf = 0; releaseFace(); return Gret; } GlyphList FontItem::glyphs(QString spec, double fsize, QString script) { FMHyphenator *hyph = typotek::getInstance()->getHyphenator(); GlyphList Gret; if ( spec.isEmpty() || fsize <= 0.0 || !m_isOpenType) // enough :-) return Gret; if(!ensureFace()) return Gret; otf = new FMOtf ( m_face, 0x10000 ); if ( !otf ) { releaseFace(); return Gret; } FMShaperFactory *shaperfactory = 0; // switch(m_shaperType) // { // case FMShaperFactory::FONTMATRIX : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::FONTMATRIX ); // break; // case FMShaperFactory::HARFBUZZ : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::HARFBUZZ ); // break; // case FMShaperFactory::ICU : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::ICU ); // break; // case FMShaperFactory::M17N : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::M17N ); // break; // case FMShaperFactory::PANGO : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::PANGO ); // break; // case FMShaperFactory::OMEGA : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::OMEGA); // break; // default : shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::FONTMATRIX ); // } shaperfactory = new FMShaperFactory(otf,script, FMShaperFactory::ICU ); /// HYPHENATION QStringList stl(spec.split(' ',QString::SkipEmptyParts)); double scalefactor = fsize / m_face->units_per_EM ; QGraphicsPathItem *glyph = itemFromChar ( QChar(' ').unicode() , fsize ); RenderedGlyph wSpace(glyph->data(GLYPH_DATA_GLYPH).toInt(),0, glyph->data(GLYPH_DATA_HADVANCE).toDouble() * scalefactor ,0,0,0,' ',false); wSpace.lChar = 0x20; delete glyph; QMap cache; for(QStringList::const_iterator sIt(stl.constBegin());sIt != stl.constEnd(); ++ sIt) { if(cache.contains(*sIt)) { GlyphList ret( cache.value(*sIt) ); Gret << wSpace << ret; continue; } if(sIt != stl.constBegin()) { Gret << wSpace; } HyphList hl; if(hyph) { hl = hyph->hyphenate(*sIt) ; } GlyphList ret( shaperfactory->doShape( *sIt ) ); for(int i(0); i < ret.count(); ++i) { ret[i].xadvance *= scalefactor; ret[i].yadvance *= scalefactor; ret[i].xoffset *= scalefactor; ret[i].yoffset *= scalefactor; if(hl.contains( ret[i].log )) { ret[i].isBreak = true; QString addOnFirst; QString addOnSecond; addOnFirst = hl[i].first.endsWith("-") ? "": "-"; ret[i].hyphen.first = shaperfactory->doShape ( hl[ret[i].log].first + addOnFirst ); for(int f(0); f < ret[i].hyphen.first.count(); ++f) { ret[i].hyphen.first[f].xadvance *= scalefactor; ret[i].hyphen.first[f].yadvance *= scalefactor; ret[i].hyphen.first[f].xoffset *= scalefactor; ret[i].hyphen.first[f].yoffset *= scalefactor; } ret[i].hyphen.second = shaperfactory->doShape ( hl[ret[i].log].second + addOnSecond ); for(int f(0); f < ret[i].hyphen.second.count(); ++f) { ret[i].hyphen.second[f].xadvance *= scalefactor; ret[i].hyphen.second[f].yadvance *= scalefactor; ret[i].hyphen.second[f].xoffset *= scalefactor; ret[i].hyphen.second[f].yoffset *= scalefactor; } } } Gret << ret; cache[*sIt] = ret; } /// END OF HYPHENATION delete shaperfactory; delete otf; otf = 0; releaseFace(); // foreach(RenderedGlyph g, Gret) // { // g.dump(); // } return Gret; } double FontItem::getUnitPerEm() { if(unitPerEm) return unitPerEm; if(ensureFace()) { releaseFace(); } return unitPerEm; } unsigned int FontItem::getFTHintMode() const { return m_FTHintMode; } void FontItem::setFTHintMode ( unsigned int theValue ) { m_FTHintMode = theValue; } // here for migration purpose void FontItem::dumpIntoDB() { if ( !m_valid ) return; FMFontDb *db ( FMFontDb::DB() ); db->initRecord ( m_path ); QString panString ( panose() ); QList fl; QVariantList vl; fl << FMFontDb::Family << FMFontDb::Variant << FMFontDb::Name << FMFontDb::Type << FMFontDb::Panose; vl << m_family << m_variant << m_name << m_type << panString; db->setValues ( m_path,fl,vl ); db->setInfoMap ( m_path, moreInfo() ); } QStringList FontItem::charmaps() { QStringList ret; foreach(FT_Encoding e, m_charsets) { ret << FontStrings::Encoding(e); } return ret; } QString FontItem::renderSVG(const QString & s, const double& size) { if(!ensureFace()) return QString(); QString ret; QString svg; QTransform tf; double pifs ( size ); double scaleFactor( pifs / unitPerEm ); double vertOffset ( pifs ); double horOffset ( 0 ); tf.translate ( horOffset , vertOffset ); foreach (const QChar& c, s ) { { QGraphicsPathItem * gpi ( itemFromChar ( c.unicode(), pifs ) ); if ( gpi ) { GlyphToSVGHelper gtsh ( gpi->path(), tf ); svg += gtsh.getSVGPath(); horOffset += gpi->data(GLYPH_DATA_HADVANCE).toDouble() * scaleFactor; tf.translate( gpi->data(GLYPH_DATA_HADVANCE).toDouble() * scaleFactor,0 ); delete gpi; } } } QString openElem ( QString ( "" ) .arg ( horOffset ) .arg ( m_face->height * scaleFactor ) ); ret += openElem; ret += svg; ret += ""; releaseFace(); return ret; } unsigned short FontItem::getNamedChar(const QString & name) { if(!ensureFace()) return 0; unsigned short ret(0); if(FT_HAS_GLYPH_NAMES( m_face )) { int bLen(256); char* buffer(new char[bLen]); FT_UInt index (1); FT_UInt cc = FT_Get_First_Char ( m_face, &index ); QString cname; while ( index ) { FT_Get_Glyph_Name(m_face, index , buffer, bLen); cname = QString::fromAscii(buffer); // qDebug()<<"NC"< FontItem::getCharsets() const { return m_charsets; } fontmatrix-0.6.0+svn20110930/src/familywidget.cpp0000644000175000017500000002144111444677057020331 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "familywidget.h" #include "ui_familywidget.h" #include "typotek.h" #include "fmpreviewlist.h" #include "fmfontdb.h" #include "fontitem.h" #include "fminfodisplay.h" #include "floatingwidgetsregister.h" #include "samplewidget.h" #include "chartwidget.h" #include "activationwidget.h" #include "fmvariants.h" #include #include #include #include FamilyWidget::FamilyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::FamilyWidget), sample(0), chart(0), activation(0), currentPage(FAMILY_VIEW_INFO), currentIndex(0) { ui->setupUi(this); ui->familyPreview->setNumCol(1); ui->familyPreview->setModelColumn(1); ui->familyPreview->setViewMode(QListView::IconMode); ui->familyPreview->setIconSize(QSize(qRound(ui->familyPreview->width() ), 1.3 * typotek::getInstance()->getPreviewSize() * typotek::getInstance()->getDpiY() / 72.0)); ui->familyPreview->setUniformItemSizes(true); ui->familyPreview->setMovement(QListView::Static); previewModel = new FMPreviewModel( this, ui->familyPreview ); previewModel->setSpecString(""); ui->familyPreview->setModel(previewModel); connect(ui->returnListButton, SIGNAL(clicked()), this, SIGNAL(backToList())); connect(ui->familyPreview, SIGNAL(widthChanged(int)),this,SLOT(slotPreviewUpdateSize(int))); connect(ui->familyPreview,SIGNAL(activated ( const QModelIndex&)),this,SLOT( slotPreviewSelected(const QModelIndex& ))); connect(ui->familyPreview,SIGNAL(clicked ( const QModelIndex&)),this,SLOT( slotPreviewSelected(const QModelIndex& ))); connect(ui->familyPreview,SIGNAL(pressed( const QModelIndex&)),this,SLOT( slotPreviewSelected(const QModelIndex& ))); connect(ui->infoButton, SIGNAL(clicked()), this, SLOT(slotShowInfo())); connect(ui->sampleButton, SIGNAL(clicked()), this, SLOT(slotShowSample())); connect(ui->chartButton, SIGNAL(clicked()), this, SLOT(slotShowChart())); connect(ui->activationButton, SIGNAL(clicked()), this, SLOT(slotShowActivation())); } FamilyWidget::~FamilyWidget() { delete ui; } TagsWidget* FamilyWidget::tagWidget() { return ui->tagsWidget; } QWebView* FamilyWidget::info() { return ui->webView; } void FamilyWidget::changeEvent(QEvent *e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void FamilyWidget::keyPressEvent(QKeyEvent *event) { if(event->modifiers().testFlag(Qt::ControlModifier) && (event->key() == Qt::Key_PageUp)) { switch(currentPage) { case FAMILY_VIEW_SAMPLE: slotShowActivation(); break; case FAMILY_VIEW_CHART: slotShowSample(); break; case FAMILY_VIEW_INFO: slotShowChart(); break; case FAMILY_VIEW_ACTIVATION: slotShowInfo(); default:break; } } else if(event->modifiers().testFlag(Qt::ControlModifier) && (event->key() == Qt::Key_PageDown)) { switch(currentPage) { case FAMILY_VIEW_INFO: slotShowActivation(); break; case FAMILY_VIEW_ACTIVATION: slotShowSample(); break; case FAMILY_VIEW_SAMPLE: slotShowChart(); break; case FAMILY_VIEW_CHART: slotShowInfo(); default:break; } } } void FamilyWidget::slotPreviewUpdateSize(int w) { ui->familyPreview->setIconSize(QSize(qRound(w ), 1.3 * typotek::getInstance()->getPreviewSize() * typotek::getInstance()->getDpiY() / 72.0)); } void FamilyWidget::setFamily(const QString &f) { if(f != family) { family = f; ui->familyLabel->setText(family); QList fl( FMVariants::Order(FMFontDb::DB()->FamilySet(family))); ui->tagsWidget->prepare(fl); previewModel->resetBase(fl); if(!fl.isEmpty()) { ui->familyPreview->setCurrentIndex( previewModel->index(0) ); curVariant = fl.first()->path(); emit fontSelected(curVariant); } delete sample; sample = 0; delete chart; chart = 0; delete activation; activation = 0; uniBlock = QString(); slotShowSample(); } } void FamilyWidget::slotPreviewUpdate() { previewModel->dataChanged(); } void FamilyWidget::slotPreviewSelected(const QModelIndex &index) { QString fid(index.data(FMPreviewModel::PathRole).toString()); if(fid != curVariant) { if(chart != 0) uniBlock = reinterpret_cast(chart)->currentBlock(); delete sample; delete chart; sample = chart = 0; curVariant = fid; currentIndex = index.row(); switch(currentPage) { case FAMILY_VIEW_INFO: slotShowInfo(); break; case FAMILY_VIEW_SAMPLE: slotShowSample(); break; case FAMILY_VIEW_CHART: slotShowChart(); break; default: break; } emit fontSelected(curVariant); } } void FamilyWidget::slotShowSample() { FloatingWidget * fw(FloatingWidgetsRegister::Widget(curVariant, SampleWidget::Name)); if(fw == 0) { if(0 == sample) { SampleWidget *sw(new SampleWidget(curVariant, ui->pageSample)); ui->displayStack->insertWidget(FAMILY_VIEW_SAMPLE, sw); sample = sw; connect(sample, SIGNAL(detached()), this, SLOT(slotDetachSample())); } ui->displayStack->setCurrentWidget(sample); } else { fw->show(); } currentPage = FAMILY_VIEW_SAMPLE; updateButtons(); } void FamilyWidget::slotShowInfo() { FMInfoDisplay fid(FMFontDb::DB()->Font(curVariant)); ui->webView->setContent(fid.getHtml().toUtf8(), "application/xhtml+xml"); ui->displayStack->setCurrentIndex(FAMILY_VIEW_INFO); currentPage = FAMILY_VIEW_INFO; updateButtons(); } void FamilyWidget::slotShowChart() { FloatingWidget * fw(FloatingWidgetsRegister::Widget(curVariant, ChartWidget::Name)); if(fw == 0) { if(0 == chart) { ChartWidget *cw(new ChartWidget(curVariant, uniBlock, ui->pageChart)); ui->displayStack->insertWidget(FAMILY_VIEW_CHART, cw); chart = cw; connect(chart, SIGNAL(detached()), this, SLOT(slotDetachChart())); } ui->displayStack->setCurrentWidget(chart); } else { fw->show(); } currentPage = FAMILY_VIEW_CHART; updateButtons(); } void FamilyWidget::slotShowActivation() { FloatingWidget * fw(FloatingWidgetsRegister::Widget(curVariant, ActivationWidget::Name)); if(fw == 0) { if(0 == activation) { ActivationWidget *aw(new ActivationWidget(family, ui->pageActivation)); ui->displayStack->insertWidget(FAMILY_VIEW_ACTIVATION, aw); activation = aw; connect(activation, SIGNAL(familyStateChanged()), this, SLOT(slotStateChange())); } ui->displayStack->setCurrentWidget(activation); } else { fw->show(); } currentPage = FAMILY_VIEW_ACTIVATION; updateButtons(); } void FamilyWidget::slotDetachSample() { disconnect(sample, SIGNAL(detached()), this, SLOT(slotDetachSample())); sample = 0; slotShowInfo(); } void FamilyWidget::slotDetachChart() { disconnect(chart, SIGNAL(detached()), this, SLOT(slotDetachChart())); uniBlock = reinterpret_cast(chart)->currentBlock(); chart = 0; slotShowInfo(); } void FamilyWidget::slotStateChange() { previewModel->resetBase(FMVariants::Order(FMFontDb::DB()->FamilySet(family))); emit familyStateChanged(); } void FamilyWidget::updateButtons() { static QList buttons; if(buttons.isEmpty()) { buttons << ui->sampleButton << ui->infoButton << ui->chartButton << ui->activationButton; foreach(QToolButton * b, buttons) { b->setCheckable(true); } } foreach(QToolButton * b, buttons) { b->setChecked(false); } switch(currentPage) { case FAMILY_VIEW_SAMPLE: ui->sampleButton->setChecked(true); break; case FAMILY_VIEW_ACTIVATION: ui->activationButton->setChecked(true); break; case FAMILY_VIEW_CHART: ui->chartButton->setChecked(true); break; case FAMILY_VIEW_INFO : ui->infoButton->setChecked(true); break; default:break; } } fontmatrix-0.6.0+svn20110930/src/tagseteditor.cpp0000644000175000017500000001071411062232026020316 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "tagseteditor.h" #include "typotek.h" #include TagSetEditor::TagSetEditor(QWidget *parent) :QDialog(parent) { setupUi(this); m_typo = typotek::getInstance(); doConnect(); doInitLists(); } TagSetEditor::~TagSetEditor() { } void TagSetEditor::doConnect() { connect(closeButton,SIGNAL(released()),this,SLOT(close())); connect(closeButton,SIGNAL(released()),m_typo,SLOT(save())); connect(newSetButton,SIGNAL(released()),this,SLOT(slotNewSet())); connect(addToSetButton,SIGNAL(released()),this,SLOT(slotAddTagToSet())); connect(removeToSetButton,SIGNAL(released()),this,SLOT(slotRemoveToSet())); connect(setList,SIGNAL(itemPressed( QListWidgetItem* )),this,SLOT(slotUpdateTagsOfSet( QListWidgetItem*))); connect(deleteTagsetButton,SIGNAL(released()),this,SLOT(slotDeleteSet())); } void TagSetEditor::doInitLists() { QStringList tl = typotek::tagsList; // tl.removeAll("Activated_Off"); // tl.removeAll("Activated_On"); tagList->addItems(tl); QStringList sets = m_typo->tagsets(); setList->addItems(sets); if(sets.count() && !sets.at(0).isEmpty()) { QListWidgetItem *defaultItem = setList->item(0); defaultItem->setSelected(true); QStringList ta = m_typo->tagsOfSet(sets.at(0)); tagsOfSetList->addItems(ta); } } void TagSetEditor::slotNewSet() { if(newSetText->text().isEmpty()) return; if(m_typo->tagsets().contains(newSetText->text())) return; setList->addItem(newSetText->text()); tagsOfSetList->clear(); m_typo->addTagSetMapEntry(newSetText->text(), QStringList()); setList->item(setList->count() - 1)->setSelected(true) ; newSetText->clear(); } void TagSetEditor::slotAddTagToSet() { QString curSet; for(int i = 0; i < setList->count();++i) { if(setList->item(i)->isSelected()) curSet = setList->item(i)->text(); } if(curSet.isEmpty()) return; QStringList sel; for(int i = 0; i < tagList->count();++i) { QListWidgetItem *it = tagList->item(i); if(it->isSelected()) sel << it->text(); } foreach(QString it, sel) { if(!m_typo->tagsOfSet(curSet).contains(it)) { tagsOfSetList->addItem(it); m_typo->addTagToSet(curSet,it); } } } void TagSetEditor::slotRemoveToSet() { QString curSet; for(int i = 0; i < setList->count();++i) { if(setList->item(i)->isSelected()) curSet = setList->item(i)->text(); } if(curSet.isEmpty()) return; QList sel; QStringList rest; for(int i = 0; i < tagsOfSetList->count();++i) { QListWidgetItem *it = tagsOfSetList->item(i); if(it->isSelected()) sel << it; else rest << it->text(); } foreach(QListWidgetItem * it, sel) { m_typo->removeTagFromSet(curSet, it->text()); } tagsOfSetList->clear(); tagsOfSetList->addItems(rest); } void TagSetEditor::slotUpdateTagsOfSet( QListWidgetItem* item ) { tagsOfSetList->clear(); tagsOfSetList->addItems(m_typo->tagsOfSet(item->text())); } void TagSetEditor::slotDeleteSet() { QListWidgetItem* item = setList->currentItem(); if(!item) return; QString ts = item->text(); if(ts.isEmpty()) return; setList->clear(); tagsOfSetList->clear(); m_typo->removeTagset(ts); setList->addItems(m_typo->tagsets()); } fontmatrix-0.6.0+svn20110930/src/listdockwidget.h0000644000175000017500000001071111222164007020303 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef LISTDOCKWIDGET_H #define LISTDOCKWIDGET_H #include #include #include #include #include class QListWidgetItem; class FMPreviewModel; class QFontItem; class QDirModel; class QMenu; class QAction; class QActionGroup; class QCompleter; class QPoint; class FolderViewMenu; class QFileSystemWatcher; #define FILTER_FIELD_SPECIAL_TAG 2000 #define FILTER_FIELD_SPECIAL_UNICODE 2001 /** @author Pierre Marchand */ class ListDockWidget : public QWidget, public Ui::ListDock { Q_OBJECT ListDockWidget(); ~ListDockWidget(); static ListDockWidget* instance; public: static ListDockWidget* getInstance(); void savePosition(); void restorePosition(); bool nameItemIsVisible(QTreeWidgetItem *item); QModelIndex getFolderCurrentIndex(){return currentFIndex;} QString getCurrentField() const { return currentField; } QAction* getCurrentFieldAction() const { return currentFieldAction; } QStringList getOperation() const; void clearOperation(); private: int m_position; QDirModel *theDirModel; QStringList ffilter; QModelIndex currentFIndex; QMenu *theFilterMenu; // QMenu *theOperationMenu; QActionGroup *filterActGroup; QString currentField; QAction *currentFieldAction; QString allFieldName; QAction *collapseFamiliesAction; QAction *collapseAlphaAction; QAction *expandFamiliesAction; QAction *expandAlphaAction; QMap completers; FolderViewMenu *folderViewContextMenu; QIcon tagsetIcon; void initTagCombo(); void settingsDir(const QString &path); QString fieldString(const QString& f); int maxFieldStringWidth; FMPreviewModel *previewModel; QFileSystemWatcher *dirWatcher; void initWatcher(QModelIndex parent); public slots: void unlockFilter(); void reloadTagsCombo(); void slotPreviewUpdate(); private slots: void slotFolderItemclicked(QModelIndex mIdx); void slotFolderPressed(QModelIndex mIdx); void slotFolderAddToWatcher(QModelIndex mIdx); void slotFolderRemoveFromWatcher(QModelIndex mIdx); void slotFolderRefresh(const QString& dirPath); void slotFieldChanged(QAction * action); void slotFeedTheCompleter(); void slotFolderViewContextMenu(const QPoint&); void slotTabChanged(int i); // void slotPanoseChecked(bool checked); void slotCollapseFamilies(); void slotCollapseAlpha(); void slotExpandFamilies(); void slotExpandAlpha(); // Concerns the width of the preview widget void slotPreviewUpdateSize(int); void slotPreviewSelected(const QModelIndex & index); // text & size of the preview void slotPreviewText(const QString& p); void slotPreviewSize(double d); signals: void folderSelectFont(const QString&); }; class FolderViewMenu : public QMenu { Q_OBJECT public: FolderViewMenu(); ~FolderViewMenu(); void exec(const QFileInfo &fi, const QPoint &p); private: QAction *dirAction; QAction *dirRecursiveAction; QAction *fileAction; QFileInfo selectedFileOrDir; private slots: void slotImportDir(); void slotImportDirRecursively(); void slotImportFile(); }; #endif fontmatrix-0.6.0+svn20110930/src/filtersdialog.h0000644000175000017500000000426711443703053020131 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FILTERSDIALOG_H #define FILTERSDIALOG_H #include #include #include namespace Ui { class FiltersDialog; } class FiltersDialogItem; class FilterItem; class FilterData; class FiltersDialog : public QDialog { Q_OBJECT public: explicit FiltersDialog(const QList& currentFilter, QWidget *parent = 0); ~FiltersDialog(); private: Ui::FiltersDialog *ui; void loadFilters(); QString filterString(FilterData *d, bool first = false); QList items; static QString andOpString; static QString notOpString; static QString orOpString; signals: void Filter(QString); void AddFilter(QString); void RemoveFilter(QString); private slots: void slotAddFilter(); void slotRemoveFilter(QString fs); }; #endif // FILTERSDIALOG_H fontmatrix-0.6.0+svn20110930/src/tagswidget_listmodel.h0000644000175000017500000000201211513120141021466 0ustar malexmalex// Author: Pierre Marchand , (C) 2011 // // Copyright: See COPYING file that comes with this distribution // // #ifndef TAGSWIDGET_LISTMODEL_H #define TAGSWIDGET_LISTMODEL_H #include #include #include #include #include class FontItem; class TagsWidget_ListModel : public QAbstractListModel { Q_OBJECT QList fonts; QStringList tags; const QString newTagString; private slots: void updateTags(); public: TagsWidget_ListModel(QObject * parent); int rowCount ( const QModelIndex & parent = QModelIndex() ) const; int columnCount ( const QModelIndex & parent = QModelIndex() ) const; QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const; bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ); Qt::ItemFlags flags ( const QModelIndex & index ) const; void setFonts(const QList& flist); QModelIndex addTag(); }; #endif // TAGSWIDGET_LISTMODEL_H fontmatrix-0.6.0+svn20110930/src/floatingwidgettoolbar.ui0000644000175000017500000000663311527175576022100 0ustar malexmalex FloatingWidgetToolBar 0 0 544 20 Form 0 0 0 16777215 20 QFrame::NoFrame QFrame::Raised 0 0 0 Qt::Horizontal 40 20 Print P Detach from main window D 16 16 ArrowCursor Close window ... :/graphic-resources/filter-remove.png:/graphic-resources/filter-remove.png Hide window H fontmatrix-0.6.0+svn20110930/src/fmpreviewlist.h0000644000175000017500000001005511445632464020202 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FMPREVIEWLIST_H #define FMPREVIEWLIST_H #include #include #include #include #include #include #include class FontItem; class MainViewWidget; class QListView; // Rather than fighting against Qt to not resize our icons, draw them ourselves. class FMPreviewIconEngine : public QIconEngineV2 { public: enum Activation{ NotActivated, Activated, PartlyActivated }; FMPreviewIconEngine(); ~FMPreviewIconEngine(); void paint ( QPainter * painter, const QRect & rect, QIcon::Mode mode, QIcon::State state ); void addPixmap ( const QPixmap & pixmap, QIcon::Mode mode, QIcon::State state ); void setActivation(Activation a){activatedFont = a;} private: QPixmap m_p; Activation activatedFont; static bool initState; static QPen pen; static QVector m_selPalette; static QRgb activatedColor; static QRgb deactivatedColor; static QRgb partlyActivatedColor; QVector actualSelPalette(const QVector& orig); }; class FMPreviewView : public QListView { Q_OBJECT public: FMPreviewView(QWidget * parent = 0); ~FMPreviewView(){} int getUsedWidth() const{return usedWidth;} // n = 1 for a single column layout (list); n = 2 for multi columns layout void setNumCol(int n){columns = n;} bool moveTo(const QString& fname); // fname can be the begining of a fancy name protected: void resizeEvent ( QResizeEvent * event ); QPoint startDragPoint; bool dragFlag; virtual void mousePressEvent(QMouseEvent *event); virtual void mouseMoveEvent(QMouseEvent *event); void keyPressEvent(QKeyEvent *event); private: int usedWidth; int columns; public slots: void updateLayout(); void setCurrentFont(const QString& name); signals: void widthChanged(int); void keyPressed(QString); }; class FMPreviewModel : public QAbstractListModel { Q_OBJECT public: enum PreviewItemRole{ PathRole = Qt::UserRole + 1 }; FMPreviewModel ( QObject * pa , FMPreviewView * wPa, QList db = QList()); //returns a preview QVariant data ( const QModelIndex &index, int role = Qt::DisplayRole ) const; //returns flags for items Qt::ItemFlags flags ( const QModelIndex &index ) const; //returns the number of items int rowCount ( const QModelIndex &parent ) const; void resetBase(QList db); QList getBase(); void setFamilyMode(bool f){familyMode =f;} void setSpecString(const QString& s){specString = s;} bool getFamilyMode() const{return familyMode;} private: FMPreviewView *m_view; QList base; QString specString; QString styleTooltipName; QString styleTooltipTags; QString styleTooltipPath; bool familyMode; public slots: void dataChanged(); }; #endif fontmatrix-0.6.0+svn20110930/src/dataloader.cpp0000644000175000017500000000643711224413240017726 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "dataloader.h" #include "fmpaths.h" #include #include #include #include DataLoader::DataLoader () { load(); } void DataLoader::reload() { load(); } void DataLoader::load() { sm.clear(); pm.clear(); // First we load system samples QDir samplesDir(FMPaths::ResourcesDir() + "Samples" ); foreach(QString ld, samplesDir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs) ) { QDir lang(samplesDir.absoluteFilePath(ld)); QLocale locale(ld); QString loclang(QLocale::languageToString(locale.language())); qDebug()< SaveData::SaveData(QFile *file,typotek *typo) : QXmlStreamWriter(file), m_typo(typo) { if (!file->open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "Saver Warning : Can't open " << file->fileName(); } else { setAutoFormatting(true); doSave(); file->close(); } } SaveData::~SaveData() { } void SaveData::doSave() { writeStartDocument(); writeStartElement("fontmatrix"); writeAttribute("version", "1.1"); // //save fonts // QList flist = FMFontDb::DB()->AllFonts(); // foreach ( FontItem* fitem,flist ) // { // if(!fitem->isLocked() && !fitem->isRemote()) // { // FontInfoMap Info(fitem->rawInfo()); // FontInfoMap::const_iterator infoMap = Info.begin(); // FontInfoMap::const_iterator endMap = Info.end(); // // writeStartElement("fontfile"); // writeAttribute("family", fitem->family()); // writeAttribute("variant",fitem->variant()); // writeAttribute("type",fitem->type()); // writeAttribute("name", fitem->fancyName()); // if(!fitem->panose().isEmpty()) // writeAttribute("panose", fitem->panose()); // writeStartElement("file"); // writeCharacters(fitem->path()); // writeEndElement(); // // writeStartElement("info"); // while( infoMap != endMap ) // { // // qDebug() << "LANG" << infoMap.key() ; // writeStartElement("lang"); // writeAttribute("code", QString::number( infoMap.key() ) ); // QMap::const_iterator langMap = infoMap.value().begin(); // QMap::const_iterator endLang = infoMap.value().end(); // // for(;langMap != endLang; ++langMap) // { // writeStartElement("name"); // writeAttribute( "name" ,QString::number(langMap.key())); // ;-) // writeCharacters(langMap.value()); // writeEndElement(); // key // } // writeEndElement();//lang // // ++infoMap; // } // writeEndElement();//info // // QStringList tl = fitem->tags(); // foreach(QString tag, tl) // { // writeStartElement("tag"); // writeCharacters( tag ); // writeEndElement(); // } // writeEndElement();//fontfile // } // } // // //save tagsets // QStringList tlist = m_typo->tagsets(); // foreach(QString tagset, tlist) // { // // writeStartElement("tagset"); // writeAttribute("name", tagset); // QStringList tl = m_typo->tagsOfSet(tagset); // // qDebug()<namedSamplesNames()) { QStringList sampleT= m_typo->namedSample(samplename).split("\n"); foreach(QString sline, sampleT) { writeStartElement("sampleline"); writeAttribute("name", samplename); writeCharacters( sline ); writeEndElement(); } } // save preview word writeStartElement("previewword"); writeCharacters( m_typo->word() ); writeEndElement(); writeEndElement();//fontmatrix writeEndDocument(); } fontmatrix-0.6.0+svn20110930/src/fontbookdialog.h0000644000175000017500000000561511007550145020276 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FONTBOOKDIALOG_H #define FONTBOOKDIALOG_H #include #include #include #include #include #include #include class QGraphicsScene; class QGraphicsPixmapItem; class FontItem; /** @author Pierre Marchand */ class FontBookDialog : public QDialog, private Ui::BookExportDialog { Q_OBJECT public: FontBookDialog ( QWidget *parent = 0 ); ~FontBookDialog(); // void setSampleText ( QString s); // void setSampleHeadline(QString s); // QString getSampleText(); // QString getSampleHeadline(); // double getTabFamily(); // double getTabStyle(); // double getTabSampleText(); QString getFileName(); bool isOk; bool isTemplate(){return m_isTemplate;} QDomDocument getTemplate(){return m_template;} private slots: void slotAccept(); void slotCancel(); void slotFileDialog(); // void slotPageSize(int index); // void slotPreview(); void slotLoadTemplate(const QString &theTemplate); void slotPreviewTemplate(const QString &key); // signals: // void updateView(); private: QDomDocument m_template; bool m_isTemplate; // void fillSizeList(); void fillFontsList(); void fillTemplates(); // QSizeF m_pageSize; // QPrinter::PageSize m_pageSizeConstant; // QRectF m_pageRect; // QGraphicsScene *preScene; // QList renderedFont; QGraphicsScene *templateScene; QMap templatesMap; QMap templatesPreviewMap; QGraphicsPixmapItem *curTemplatePreview; }; #endif fontmatrix-0.6.0+svn20110930/src/sampletoolbar.h0000644000175000017500000000423011445710452020136 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SAMPLETOOLBAR_H #define SAMPLETOOLBAR_H #include #include namespace Ui { class SampleToolBar; } class SampleToolBar : public QWidget { Q_OBJECT public: explicit SampleToolBar(QWidget *parent = 0); ~SampleToolBar(); enum Button{ SampleButton, OpenTypeButton }; double getFontSize() const; void setFontSize(double fs); bool isChecked(Button b); void toggle(Button b, bool c); void enableButton(Button b, bool c); void setScripts(const QStringList& ll); QString getScript(); protected: void changeEvent(QEvent *e); private: Ui::SampleToolBar *ui; signals: void SizeChanged(double); void SampleToggled(bool); void OpenTypeToggled(bool); void ScriptSelected(); }; #endif // SAMPLETOOLBAR_H fontmatrix-0.6.0+svn20110930/src/fmsampletextview.h0000644000175000017500000000440311030436526020675 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FMSAMPLETEXTVIEW_H #define FMSAMPLETEXTVIEW_H #include #include /** @author Pierre Marchand */ class FMSampleTextView : public QGraphicsView { Q_OBJECT public: FMSampleTextView ( QWidget* parent ); ~FMSampleTextView(); void fakePage(); void sheduleUpdate(); void unSheduleUpdate(); bool locker; protected: void resizeEvent ( QResizeEvent * event ); void mousePressEvent ( QMouseEvent * e ) ; void mouseReleaseEvent ( QMouseEvent * e ) ; void mouseMoveEvent ( QMouseEvent * e ) ; void wheelEvent ( QWheelEvent * e ); void showEvent ( QShowEvent * event ) ; signals: void refit(); void pleaseUpdateMe(); void pleaseZoom(int); private: QPointF mouseStartPoint; QGraphicsRectItem *theRect; QGraphicsRectItem *fPage; bool isSelecting; bool isPanning; bool hasPendingUpdate; void ensureTheRect(); }; #endif fontmatrix-0.6.0+svn20110930/src/fmglyphhighlight.cpp0000644000175000017500000000270611151220112021150 0ustar malexmalex// // C++ Implementation: FMGlyphHighlight // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fmglyphhighlight.h" #include #include #include #include #include FMGlyphHighlight::FMGlyphHighlight(QGraphicsScene* scene, const QRectF& rect, int time, int frames) { // qDebug()<<"Create an HighLight"; m_rect = new QGraphicsRectItem(rect, 0, scene); m_rect->setZValue(10000); initialPos = m_rect->pos(); m_timeline = new QTimeLine(time); maxFrame = frames; m_timeline->setFrameRange(0,maxFrame); connect( m_timeline,SIGNAL(frameChanged(int)), this, SLOT(animate (int)) ); m_timeline->start(); } FMGlyphHighlight::~ FMGlyphHighlight() { delete m_timeline; delete m_rect; } void FMGlyphHighlight::animate(int frame) { // qDebug()<<"ANIM"<setPos(initialPos.x() + shift, initialPos.y()+shift); // // // scalelyphhighlight.h // double scale(frame / maxFrame); // QMatrix mat; // mat.scale(scale,scale); // m_rect->setMatrix(mat); // // color QColor c(0,0,0, 255 - ( (frame * 255)/maxFrame ) ); // QColor c(255,0,0,255); m_rect->setBrush(QBrush(c)); m_rect->setPen(QPen(c)); } void FMGlyphHighlight::lastFrame() { // qDebug("LAST FRAME"); deleteLater(); } fontmatrix-0.6.0+svn20110930/src/activationwidgetitem.ui0000644000175000017500000000307311431446461021711 0ustar malexmalex ActivationWidgetItem 0 0 458 66 Form QFrame::StyledPanel QFrame::Raised 2 2 0 75 true StyleName Activated fontmatrix-0.6.0+svn20110930/src/fmfontextract.h0000644000175000017500000000141711156713117020162 0ustar malexmalex// // C++ Interface: fmfontextract // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMFONTEXTRACT_H #define FMFONTEXTRACT_H #include #include "ui_fontextractordialog.h" #include "fmfontextractorbase.h" class FMFontExtract : public QDialog, private Ui::FontExtractorDialog { Q_OBJECT public: FMFontExtract ( QWidget * parent ); ~FMFontExtract(); private: QMap extractors; FMFontExtractorBase* currentExtractor; void loadDoc(const QString& path); QString lastPath; QString lastDir; private slots: void slotBrowseDoc(); void slotBrowseDir(); void slotExtract(); }; #endif // FMFONTEXTRACT_H fontmatrix-0.6.0+svn20110930/src/filtersdialogitem.ui0000644000175000017500000000735311527175576021215 0ustar malexmalex FiltersDialogItem 0 0 203 34 Form 2 2 QFrame::StyledPanel QFrame::Raised 0 2 6 2 3 0 0 0 1000 24 11 75 true filter name Qt::PlainText false 16 16 Apply this filter to the list Filter :/graphic-resources/filter.png:/graphic-resources/filter.png 16 16 Delete this filter Remove :/graphic-resources/filter-remove.png:/graphic-resources/filter-remove.png true fontmatrix-0.6.0+svn20110930/src/activationwidget.h0000644000175000017500000000376211431446461020651 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef ACTIVATIONWIDGET_H #define ACTIVATIONWIDGET_H #include "floatingwidget.h" namespace Ui { class ActivationWidget; } class ActivationWidgetItem; class ActivationWidget : public FloatingWidget { Q_OBJECT public: static const QString Name; explicit ActivationWidget(const QString& familyName, QWidget *parent = 0); ~ActivationWidget(); protected: void changeEvent(QEvent *e); private: const QString family; Ui::ActivationWidget *ui; QList items; void activateAll(bool c); private slots: void slotActivate(); void slotDeactivate(); signals: void familyStateChanged(); }; #endif // ACTIVATIONWIDGET_H fontmatrix-0.6.0+svn20110930/src/shortcuts.h0000644000175000017500000000442411032246452017331 0ustar malexmalex/*************************************************************************** * Copyright (C) 2008 by Riku Leino * * riku@scribus.info * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SHORTCUTS_H #define SHORTCUTS_H #include #include class QAction; class Shortcuts : public QObject { Q_OBJECT public: ~Shortcuts(); static Shortcuts* getInstance(); void add(QAction *a); QList getActions(); /* returns QString::null if it's not reserved or the action name the shortcut belongs if it's already taken. */ QString isReserved(const QString &shortcut, const QString &actionText); void setShortcut(const QString &shortcut, const QString &actionText); void clearShortcut(const QString &actionText); QString cleanName(QAction *action); // without & chars QString cleanName(const QString &s); // same with a string private: QSettings settings; QMap actions; static Shortcuts* instance; QString settingsKey(QAction *action); protected: Shortcuts(); }; #endif fontmatrix-0.6.0+svn20110930/src/fmuniblocks.h0000644000175000017500000000176111221431364017606 0ustar malexmalex// // C++ Interface: fmuniblocks // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMUNIBLOCKS_H #define FMUNIBLOCKS_H #include #include #include class FMUniBlocks { static FMUniBlocks * instance; static FMUniBlocks * that(); FMUniBlocks(); void loadBlocks(); void recordLine(const QString& line); typedef QPair bKey; QMap p; bKey c; // current bKey f; // first bKey l; // last public: static QString firstBlock(int& start, int& end); static QString lastBlock(int& start, int& end); static QString nextBlock(int& start, int& end); static QString currentBlock(int& start, int& end); static int start(const int& codepoint); static int end(const int& codepoint); static QString block(bKey key); static bKey interval(const QString& blockName); static QStringList blocks(); }; #endif // FMUNIBLOCKS_H fontmatrix-0.6.0+svn20110930/src/fmfreetypelib.h0000644000175000017500000000377111450616562020143 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FMFREETYPELIB_H #define FMFREETYPELIB_H #include #include FT_FREETYPE_H #include #include #include class FMFreetypeLib : public QObject { Q_OBJECT static FMFreetypeLib * instance; static FMFreetypeLib * that(); explicit FMFreetypeLib(QObject *parent = 0); QMap libraries; QMutex *mutex; class FTLibFactory : public QObject { public: FT_Library createLib() { FT_Library theLibrary; FT_Init_FreeType ( &theLibrary ); return theLibrary; } }; public: static FT_Library lib(QThread * t); private slots: void releaseLibrary(); }; #endif // FMFREETYPELIB_H fontmatrix-0.6.0+svn20110930/src/fontextractordialog.ui0000644000175000017500000000616011151465632021547 0ustar malexmalex FontExtractorDialog 0 0 450 450 Font extractor Select PDF 1 0 File name browsePDF &Browse Fonts &Select Dir &Extract Close Qt::Horizontal 40 20 pushButton clicked() FontExtractorDialog close() 452 328 458 -12 fontmatrix-0.6.0+svn20110930/src/mainview.ui0000644000175000017500000002011611524253232017274 0ustar malexmalex Pierre Marchand MainView 0 0 657 526 0 0 true main view widget 0 0 0 0 0 Qt::Horizontal 1 0 QFrame::StyledPanel QFrame::Raised 2 6 0 0 0 QListView::Adjust true Quick Search: quickSearch Qt::Horizontal 176 24 Qt::Horizontal 40 20 0 0 4 3 3 3 Qt::Horizontal 40 20 11 Save 11 clear 0 FMPreviewView QListView
fmpreviewlist.h
FamilyWidget QWidget
familywidget.h
1
FilterBar QWidget
filterbar.h
1
fontmatrix-0.6.0+svn20110930/src/fontbookdialog.cpp0000644000175000017500000001764311406645124020642 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "fontbookdialog.h" #include "fontitem.h" #include "typotek.h" #include "fmpaths.h" #include "fmfontdb.h" #include #include #include #include #include FontBookDialog::FontBookDialog ( QWidget *parent ) : QDialog ( parent ) { setupUi ( this ); isOk = false; m_isTemplate = false; // loadTemplateButton->setVisible(false); // templateLabel->setVisible(false); curTemplatePreview = 0; // fillSizeList(); fillFontsList(); // QString alorem ( "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\nUt a sapien. Aliquam aliquet purus molestie dolor.\nInteger quis eros ut erat posuere dictum. Curabitur dignissim.\nInteger orci. Fusce vulputate lacus at ipsum. \nQuisque in libero nec mi laoreet volutpat." ); // QString loremBig ( "LOREM IPSUM DOLOR" ); // setSampleHeadline ( loremBig ); // setSampleText ( alorem ); // m_pageRect = QRectF(0,0,m_pageSize.width(), m_pageSize.height()); // preScene = new QGraphicsScene(m_pageRect); // // preView->setScene(preScene); // preView->setRenderHint ( QPainter::Antialiasing, true ); // preView->setBackgroundBrush(Qt::lightGray); templateScene = new QGraphicsScene(); templateScene->setBackgroundBrush(Qt::lightGray); templatePreview->setScene(templateScene); fillTemplates(); // slotPreview(); connect ( okButton,SIGNAL ( accepted () ),this,SLOT ( slotAccept() ) ); connect ( okButton,SIGNAL ( rejected() ),this,SLOT ( slotCancel() ) ); connect ( fileNameButton,SIGNAL ( released() ),this,SLOT ( slotFileDialog() ) ); // connect ( paperSizeCombo,SIGNAL ( activated ( int ) ),this,SLOT ( slotPageSize ( int ) ) ); // connect(this,SIGNAL(updateView()),this,SLOT(slotPreview())); //all Update connect(fileNameEdit,SIGNAL(textChanged( const QString& )),this,SIGNAL(updateView())); // QList spinList; // spinList << familySpinBox; // spinList << styleSpinBox; // spinList << sampleSpinBox; // spinList << familyFontSizeSpin; // spinList << styleFontSizeSpin; // spinList << headlineFontSizeSpin; // spinList << bodyFontSizeSpin; // foreach(QSpinBox *sp, spinList) // { // connect(sp,SIGNAL(valueChanged ( int )),this,SIGNAL(updateView())); // } // connect (sampleTextEdit,SIGNAL(textChanged()),SIGNAL(updateView())); // connect (sampleHeadline,SIGNAL(textChanged( const QString&)),SIGNAL(updateView())); // connect(loadTemplateButton,SIGNAL(released()),this,SLOT(slotLoadTemplate())); connect( templatesList,SIGNAL(currentTextChanged( const QString& )),this,SLOT(slotPreviewTemplate(const QString&))); } FontBookDialog::~FontBookDialog() { } void FontBookDialog::slotAccept() { isOk = true; close(); } void FontBookDialog::slotCancel() { isOk = false; close(); } void FontBookDialog::slotFileDialog() { QString theFile = QFileDialog::getSaveFileName ( this, tr("Save fontBook"), QDir::homePath() , "Portable Document Format (*.pdf)" ); fileNameEdit->setText ( theFile ); } void FontBookDialog::fillFontsList() { QList localFontMap = FMFontDb::DB()->getFilteredFonts(); foreach(FontItem* fit, localFontMap) { selectedFontsList->addItem(fit->fancyName()); } } QString FontBookDialog::getFileName() { return fileNameEdit->text(); } /** * 1 - browse to select a template file * 2 - load as a QDomDocument * 3 - search for "description" and "preview" elements * 4 - check validity of the doc (will be hard at the beginning) */ void FontBookDialog::slotLoadTemplate(const QString &theTemplate) { // QString theTemplate = QFileDialog::getOpenFileName ( this, "Get template", QDir::homePath(), tr("Templates (*.xml)")); qDebug() << "FontBookDialog::slotLoadTemplate("< " << templatesMap[theTemplate]; if(theTemplate.isEmpty()) return; QFile file(templatesMap[theTemplate]); QDomDocument doc("template"); if ( !file.open ( QFile::ReadOnly ) ) { QMessageBox::warning (0, QString ( "Fontmatrix" ), QString ( "Can’t read %1." ).arg(file.fileName()) ); return; } if ( !doc.setContent ( &file ) ) { file.close(); QMessageBox::warning (0, QString ( "Fontmatrix" ), QString ( "%1 is an invalid XML tree." ).arg(file.fileName()) ); return; } file.close(); m_template = doc; m_isTemplate = true; } void FontBookDialog::fillTemplates() { QDir tDir(typotek::getInstance()->getTemplatesDir()); QStringList filters; filters << "*.xml" ; tDir.setNameFilters ( filters ); QStringList pathList = tDir.entryList(); for ( int i = 0 ; i < pathList.count() ; ++i ) { QFile file(tDir.absoluteFilePath ( pathList.at ( i ) )); QDomDocument doc("template"); if ( !file.open ( QFile::ReadOnly ) ) { QMessageBox::warning (0, QString ( "Fontmatrix" ), QString ( "Can’t read %1." ).arg(file.fileName()) ); return; } if ( !doc.setContent ( &file ) ) { file.close(); QMessageBox::warning (0, QString ( "Fontmatrix" ), QString ( "%1 is an invalid XML tree." ).arg(file.fileName()) ); return; } file.close(); QString description; QDomNodeList descList = doc.elementsByTagName ( "name" ); if ( descList.length() ) { QDomNode node = descList.item ( 0 ); description = node.toElement().text(); } QString preview; QDomNodeList prevList = doc.elementsByTagName ( "preview" ); if ( descList.length() ) { QDomNode node = prevList.item ( 0 ); preview = tDir.absoluteFilePath( node.toElement().text() ); } if(description.isEmpty()) continue; templatesMap[description] = tDir.absoluteFilePath ( pathList.at ( i ) ); if(!preview.isEmpty()) { templatesPreviewMap[description] = QPixmap(preview); } } // Here we insert default templates provided by Fontmatrix templatesMap["Default template"] = FMPaths::ResourcesDir() + "template_default.xml"; templatesPreviewMap["Default template"] = QPixmap(FMPaths::ResourcesDir() +"template_default.png"); templatesMap["Default template (oneliner)"] = FMPaths::ResourcesDir() +"template_oneline.xml"; templatesPreviewMap["Default template (oneliner)"] = QPixmap(FMPaths::ResourcesDir() +"template_oneline.png"); templatesList->addItems(templatesMap.keys()); } void FontBookDialog::slotPreviewTemplate(const QString &key) { qDebug() << "slotPreviewTemplate("< "<< templatesMap[key]; if(templatesMap.contains(key)) { if(!templatesPreviewMap[key].isNull()) { if(curTemplatePreview) templateScene->removeItem(curTemplatePreview); delete curTemplatePreview; // ### memleak curTemplatePreview = templateScene->addPixmap( templatesPreviewMap[key] ); // templatePreview->ensureVisible(curTemplatePreview,10,10); } slotLoadTemplate(key); } } fontmatrix-0.6.0+svn20110930/src/filteritem.ui0000644000175000017500000001255711524253232017633 0ustar malexmalex FilterItem 0 0 149 31 Form 0 QFrame::StyledPanel QFrame::Raised 2 16777215 24 11 75 true TextLabel 2 16 16 75 true Remove Filter X :/graphic-resources/filter-remove.png:/graphic-resources/filter-remove.png true 16 16 75 true <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <table style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If set, the filter will <span style=" font-weight:600;">intersect</span> with the previous filters.</p></td></tr></table></body></html> && :/graphic-resources/filter-and.png:/graphic-resources/filter-and.png true true 16 16 75 true if set, it will filter all the fonts but these matching this filter ! true true fontmatrix-0.6.0+svn20110930/src/fmpaths.h0000644000175000017500000000144411420024060016722 0ustar malexmalex/* fmpath.h */ /* Get all useful paths in one place with the hope that */ /* finally we will not need resource.qrc anymore */ #ifndef FMPATHS_H #define FMPATHS_H #include #include #include #include class FMPaths { QMap FMPathsDB; FMPaths() {} static FMPaths *instance; static FMPaths *getThis(); public: static QString TranslationsDir(); static QString ResourcesDir(); static QString HelpDir(); static QString ScriptsDir(); static QString SamplesDir(); static QString FiltersDir(); static QString LocalizedDirPath(const QString& base, const QString& fallback = QString("en")); static QString LocalizedFilePath(const QString& base, const QString& ext, const QString& fallback = QString("en")); }; #endif fontmatrix-0.6.0+svn20110930/src/icushaper.h0000644000175000017500000000317211015561726017262 0ustar malexmalex// // C++ Interface: icushaper // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef ICUSHAPER_H #define ICUSHAPER_H #include "fmbaseshaper.h" #include #include #include #include class IcuFontImpl : public LEFontInstance { public: IcuFontImpl ( FMOtf* o ); ~IcuFontImpl(); // implements pure virtual methods of LEFontInstance const void* getFontTable(LETag tableTag ) const; le_bool canDisplay (LEUnicode32 ch) const {return true;} le_int32 getUnitsPerEM () const; LEGlyphID mapCharToGlyph (LEUnicode32 ch) const ; void getGlyphAdvance (LEGlyphID glyph, LEPoint &advance) const; le_bool getGlyphPoint (LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const; float getXPixelsPerEm () const ; float getYPixelsPerEm () const ; float getScaleFactorX () const ; float getScaleFactorY () const ; le_int32 getAscent () const ; le_int32 getDescent () const; le_int32 getLeading () const; static void regTables(LETag tableTag, unsigned char *t){instance->tables[tableTag] = t;} private: FMOtf *otf; static IcuFontImpl *instance; QMap tables; }; class IcuShaper : public FMBaseShaper { public: IcuShaper ( FMOtf* o, QString s ); ~IcuShaper(); GlyphList doShape ( const QString& s ); private: LayoutEngine *icuLE; IcuFontImpl *icuFont; mutable QMap tagToCode; void fillTagToCode(); void IcuError(int err); }; #endif fontmatrix-0.6.0+svn20110930/src/fmotf.cpp0000644000175000017500000006510711204063022016735 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "fmotf.h" #include "fmaltcontext.h" #include #include #include QList FMOtf::altGlyphs; /// HB Externals ////////////////////////////////////////////////////////////////////////////////////////////// HB_LineBreakClass HB_GetLineBreakClass ( HB_UChar32 ch ) { return ( HB_LineBreakClass ) 0; } void HB_GetUnicodeCharProperties ( HB_UChar32 ch, HB_CharCategory *category, int *combiningClass ) { *category = ( HB_CharCategory ) QChar::Category ( ch ); *combiningClass = QChar::CombiningClass ( ch ); } HB_CharCategory HB_GetUnicodeCharCategory ( HB_UChar32 ch ) { return ( HB_CharCategory ) QChar::Category ( ch ); } int HB_GetUnicodeCharCombiningClass ( HB_UChar32 ch ) { return QChar::CombiningClass ( ch ); } HB_UChar16 HB_GetMirroredChar ( HB_UChar16 ch ) { return QChar ( ch ).mirroredChar().unicode(); } HB_GraphemeClass HB_GetGraphemeClass(HB_UChar32 ch) { return (HB_GraphemeClass) 0; } HB_WordClass HB_GetWordClass(HB_UChar32 ch) { return (HB_WordClass) 0; } HB_SentenceClass HB_GetSentenceClass(HB_UChar32 ch) { return (HB_SentenceClass) 0; } void HB_GetGraphemeAndLineBreakClass(HB_UChar32 ch, HB_GraphemeClass *grapheme, HB_LineBreakClass *lineBreak) { //### } HB_UChar32 getChar ( const HB_UChar16 *string, hb_uint32 length, hb_uint32 &i ) { // qDebug() << "HB_UChar32 getChar"; HB_UChar32 ch; // HB_SurrogateToUcs4 expands in HB_UChar32 without prefix, i have to expand manually if ( ( ( string[i] & 0xfc00 ) == 0xd800 ) // HB_IsHighSurrogate && i < length - 1 && ( ( string[i + 1] & 0xfc00 ) == 0xdc00 ) ) // HB_IsLowSurrogate { ch = ( ( ( HB_UChar32 ) string[i] ) <<10 ) + ( string[i + 1] ) - 0x35fdc00;// HB_SurrogateToUcs4 ++i; } else { ch = string[i]; } return ch; } HB_Bool hb_stringToGlyphs ( HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool /*rightToLeft*/ ) { // qDebug() << "HB_Bool hb_stringToGlyphs"; FT_Face face = ( FT_Face ) font->userData; if ( length > *numGlyphs ) return false; int glyph_pos = 0; for ( hb_uint32 i = 0; i < length; ++i ) { glyphs[glyph_pos] = FT_Get_Char_Index ( face, getChar ( string, length, i ) ); ++glyph_pos; } *numGlyphs = glyph_pos; return true; } void hb_getAdvances ( HB_Font font, const HB_Glyph * glyphs, hb_uint32 numGlyphs, HB_Fixed *advances, int flags ) { // qDebug() << "void hb_getAdvances with flag("<userData; for ( hb_uint32 i = 0; i < numGlyphs; ++i ) { // qDebug() << "\tLoad index "<< i; // qDebug() << "\tWhich is glyph "<glyph->metrics.horiAdvance <<")"; advances[i] = face->glyph->metrics.horiAdvance; } } HB_Bool hb_canRender ( HB_Font font, const HB_UChar16 *string, hb_uint32 length ) { // qDebug() << "HB_Bool hb_canRender"; FT_Face face = ( FT_Face ) font->userData; for ( hb_uint32 i = 0; i < length; ++i ) if ( !FT_Get_Char_Index ( face, getChar ( string, length, i ) ) ) return false; return true; } HB_Error hb_getSFntTable ( void *font, HB_Tag tableTag, HB_Byte *buffer, HB_UInt *length ) { // qDebug() << "HB_Error hb_getSFntTable"; FT_Face face = ( FT_Face ) font; FT_ULong ftlen = *length; FT_Error error = 0; if ( !FT_IS_SFNT ( face ) ) return HB_Err_Invalid_Argument; error = FT_Load_Sfnt_Table ( face, tableTag, 0, buffer, &ftlen ); *length = ftlen; return ( HB_Error ) error; } HB_Error hb_getPointInOutline ( HB_Font font, HB_Glyph glyph, int flags, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints ) { // qDebug() << "HB_Error hb_getPointInOutline"; HB_Error error = HB_Err_Ok; FT_Face face = ( FT_Face ) font->userData; int load_flags = ( flags & HB_ShaperFlag_UseDesignMetrics ) ? FT_LOAD_NO_HINTING : FT_LOAD_DEFAULT; if ( ( error = ( HB_Error ) FT_Load_Glyph ( face, glyph, load_flags ) ) ) return error; if ( face->glyph->format != ft_glyph_format_outline ) return ( HB_Error ) HB_Err_Invalid_SubTable;//HB_Err_Invalid_GPOS_SubTable; *nPoints = face->glyph->outline.n_points; if ( ! ( *nPoints ) ) return HB_Err_Ok; if ( point > *nPoints ) return ( HB_Error ) HB_Err_Invalid_SubTable;//HB_Err_Invalid_GPOS_SubTable; *xpos = face->glyph->outline.points[point].x; *ypos = face->glyph->outline.points[point].y; return HB_Err_Ok; } void hb_getGlyphMetrics ( HB_Font font, HB_Glyph glyph, HB_GlyphMetrics *metrics ) { qDebug() << "void hb_getGlyphMetrics"; // ### metrics->x = metrics->y = metrics->width = metrics->height = metrics->xOffset = metrics->yOffset = 0; } HB_Fixed hb_getFontMetric ( HB_Font font, HB_FontMetric metric ) { qDebug() << "HB_Fixed hb_getFontMetric"; return 0; // #### } void *HB_Library_Resolve(const char *library, const char *symbol) { return QLibrary::resolve(library, symbol); } void *HB_TextCodecForMib(int mib) { return QTextCodec::codecForMib(mib); } char *HB_TextCodec_ConvertFromUnicode(void *codec, const HB_UChar16 *unicode, hb_uint32 length, hb_uint32 *outputLength) { QByteArray data = reinterpret_cast(codec)->fromUnicode((const QChar *)unicode, length); // ### suboptimal char *output = (char *)malloc(data.length() + 1); memcpy(output, data.constData(), data.length() + 1); if (outputLength) *outputLength = data.length(); return output; } void HB_TextCodec_FreeResult(char *string) { free(string); } /// END OF HB Externals ////////////////////////////////////////////////////////////////////////////////////// const HB_FontClass hb_fontClass = { hb_stringToGlyphs, hb_getAdvances, hb_canRender, hb_getPointInOutline, hb_getGlyphMetrics, hb_getFontMetric }; QString OTF_tag_name ( HB_UInt tag ) { QString name; name[0] = ( char ) ( tag >> 24 ); name[1] = ( char ) ( ( tag >> 16 ) & 0xFF ); name[2] = ( char ) ( ( tag >> 8 ) & 0xFF ); name[3] = ( char ) ( tag & 0xFF ); // qDebug(QString("OTF_tag_name (%1) -> %2").arg(tag).arg(name)); return name; } HB_UInt OTF_name_tag ( QString s ) { HB_UInt ret = FT_MAKE_TAG ( s[0].unicode (), s[1].unicode (), ( s[2].isNull() ? ' ' :s[2].unicode () ), ( s[3].isNull() ? ' ' :s[3].unicode () ) ); // qDebug(QString("OTF_name_tag (%1) -> %2").arg(s).arg(ret)); return ret; } //#define DFLT 0xFFFF int FMOtf::get_glyph ( int index ) { return _buffer->in_string[index].gindex; } FMOtf::FMOtf ( FT_Face f , double scale ) { _face = f; _buffer = 0; hbFont.klass = &hb_fontClass; hbFont.userData = _face ; hbFont.x_ppem = _face->size->metrics.x_ppem; hbFont.y_ppem = _face->size->metrics.y_ppem; // if(scale == 0.0) // { // hbFont.x_scale = _face->size->metrics.x_scale; // hbFont.y_scale = _face->size->metrics.y_scale; // } // else { hbFont.x_scale = static_cast(scale); hbFont.y_scale = static_cast(scale); } glyphAlloc = false; FT_ULong length = 0; if ( !FT_Load_Sfnt_Table ( _face, OTF_name_tag ( "GDEF" ), 0, NULL, &length ) ) { // qDebug() << QString ( "length of GDEF table is %1" ).arg ( length ) ; if ( length > 0 ) { _memgdef.resize ( length ); FT_Load_Sfnt_Table ( _face, OTF_name_tag ( "GDEF" ), 0, ( FT_Byte * ) _memgdef.data (), &length ); gdefstream = new ( HB_StreamRec ); gdefstream->base = ( HB_Byte * ) _memgdef.data (); gdefstream->size = _memgdef.size (); gdefstream->pos = 0; HB_New_GDEF_Table ( &_gdef ); if ( !HB_Load_GDEF_Table ( gdefstream, &_gdef ) ) GDEF = 1; else GDEF = 0; } else GDEF = 0; } else GDEF = 0; length = 0; if ( !FT_Load_Sfnt_Table ( _face, OTF_name_tag ( "GSUB" ), 0, NULL, &length ) ) { // qDebug()<< QString ( "length of GSUB table is %1" ).arg ( length ) ; if ( length > 32 ) //Some font files seem to have a fake table that is just 32 words long and make harbuzz confused { _memgsub.resize ( length ); FT_Load_Sfnt_Table ( _face, OTF_name_tag ( "GSUB" ), 0, ( FT_Byte * ) _memgsub.data (), &length ); gsubstream = new ( HB_StreamRec ); gsubstream->base = ( HB_Byte * ) _memgsub.data (); gsubstream->size = _memgsub.size (); gsubstream->pos = 0; if ( GDEF ? !HB_Load_GSUB_Table ( gsubstream, &_gsub, _gdef, gdefstream ) : !HB_Load_GSUB_Table ( gsubstream, &_gsub, NULL, NULL ) ) { GSUB = 1; qDebug()<<"REGISTER alternate substitutions callback"; HB_GSUB_Register_Alternate_Function( _gsub, manageAlternates ,0); } else GSUB = 0; } else GSUB = 0; } else GSUB = 0; length = 0; if ( !FT_Load_Sfnt_Table ( _face, OTF_name_tag ( "GPOS" ), 0, NULL, &length ) ) { // qDebug () << QString ( "length of GPOS table is %1" ).arg ( length ); if ( length > 32 ) { _memgpos.resize ( length ); FT_Load_Sfnt_Table ( _face, OTF_name_tag ( "GPOS" ), 0, ( FT_Byte * ) _memgpos.data (), &length ); gposstream = new ( HB_StreamRec ); gposstream->base = ( HB_Byte * ) _memgpos.data (); gposstream->size = _memgpos.size (); gposstream->pos = 0; if ( GDEF ? !HB_Load_GPOS_Table ( gposstream, &_gpos, _gdef, gdefstream ) : !HB_Load_GPOS_Table ( gposstream, &_gpos, NULL, NULL ) ) GPOS = 1; else GPOS = 0; } else GPOS = 0; } else GPOS = 0; // if ( hb_buffer_new ( &_buffer ) ) // qDebug ( "unable to get _buffer" ); } FMOtf::~FMOtf () { /// All those free lead to segfault in Harfbuzz, we’ll see later, /// now, we really want to be able to remove a font. if ( _buffer ) hb_buffer_free ( _buffer ); if ( GDEF ) HB_Done_GDEF_Table ( _gdef ); if ( GSUB ) HB_Done_GSUB_Table ( _gsub ); if ( GPOS ) HB_Done_GPOS_Table ( _gpos ); } QList FMOtf::procstring ( QString s, OTFSet set ) { curString = s; altGlyphs.clear(); if ( hb_buffer_new ( &_buffer ) != HB_Err_Ok) { qDebug ( ) << "Unable to get _buffer("<< _buffer <<")"; return QList(); } int numR = procstring ( s, set.script, set.lang, set.gsub_features, set.gpos_features ); QList ret = get_position(); // We need to attach CHAR infos to GLYPHS int sCount(ret.count()); for(int si(0);si < sCount; ++si) { ret[si].lChar = s.at(ret[si].log).unicode(); } hb_buffer_free ( _buffer ); _buffer = 0; return ret; } QList< RenderedGlyph > FMOtf::procstring( QList shaped , QString script ) { // QString script = "latn"; curString.clear(); QString lang = "dflt"; // regAltGlyphs.clear(); if ( hb_buffer_new ( &_buffer ) != HB_Err_Ok) { qDebug ( ) << "Unable to get _buffer("<< _buffer <<")"; return QList(); } hb_buffer_clear ( _buffer ); int n = shaped.count (); HB_Error error; uint all = 0x1; QMap props; QStringList orderedFeatures; //First we collect properties for( int i = 0; i < n; i++ ) { foreach(QString cProp, shaped[i].CustomProperties) { if(!props.contains(cProp)) { orderedFeatures << cProp; props[cProp] = all; all *= 2; // qDebug()<< "Feature " << cProp << " has prop mask"<< QString::number(props[cProp],2) ; } } } for ( int i = 0; i < n; i++ ) { uint prop = 0; // prop |= all; foreach(QString cProp, shaped[i].CustomProperties) { prop |= (props[cProp]); } // if(!prop) // { // prop |= ~0 ; // } error = hb_buffer_add_glyph ( _buffer, FT_Get_Char_Index ( _face, shaped[i].unicode() ), ~prop, i ); curString += QChar(shaped[i].unicode()) ; // qDebug() << "Adding "<< QString::number(shaped[i].unicode(),16) << "["<< QString::number( ~prop, 2 )<<"]"; if ( error != HB_Err_Ok ) qDebug() << "hb_buffer_add_glyph () failed"; } if ( GSUB ) { HB_GSUB_Clear_Features ( _gsub ); set_table ( "GSUB" ); set_script ( script ); set_lang ( lang ); for ( int fCur(0); fCur < orderedFeatures.count() ; ++fCur ) { QString feature(orderedFeatures[fCur]); HB_UShort fidx; error = HB_GSUB_Select_Feature ( _gsub, OTF_name_tag ( feature ), curScript, curLang, &fidx ); if ( !error ) { HB_GSUB_Add_Feature ( _gsub, fidx, props[feature] ); qDebug() << "GSUB_ADD "<< feature <<" => "< ret = get_position(); hb_buffer_free ( _buffer ); _buffer = 0; // We need to attach CHAR infos to GLYPHS int sCount(ret.count()); for(int si(0);si < sCount; ++si) { ret[si].lChar = shaped.at(ret[si].log).unicode(); } return ret; } QList< RenderedGlyph > FMOtf::procstring(QList< unsigned int > glyList, QString script, QString lang, QStringList gsub, QStringList gpos) { hb_buffer_clear ( _buffer ); int n = glyList.count(); HB_Error error; uint all = 0x1; uint prop; for ( int i = 0; i < n; i++ ) { prop = 0; prop |= all; error = hb_buffer_add_glyph ( _buffer, glyList[i], prop, i ); if ( error != HB_Err_Ok ) qDebug() << "hb_buffer_add_glyph ("<< glyList[i] <<") failed"; } if ( ! gsub.isEmpty() ) { HB_GSUB_Clear_Features ( _gsub ); set_table ( "GSUB" ); set_script ( script ); set_lang ( lang ); for ( QStringList::iterator ife = gsub.begin (); ife != gsub.end (); ife++ ) { HB_UShort fidx; error = HB_GSUB_Select_Feature ( _gsub, OTF_name_tag ( *ife ), curScript, curLang, &fidx ); if ( !error ) { HB_GSUB_Add_Feature ( _gsub, fidx, ~all ); } else qDebug() << QString ( "adding gsub feature [%1] failed : %2" ).arg ( *ife ).arg ( error ); } error = HB_GSUB_Apply_String ( _gsub, _buffer ); if ( error && error != HB_Err_Not_Covered ) qDebug () << QString ( "applying gsub features returned %1" ).arg ( error ); } if ( !gpos.isEmpty() ) { HB_GPOS_Clear_Features ( _gpos ); set_table ( "GPOS" ); set_script ( script ); set_lang ( lang ); for ( QStringList::iterator ife = gpos.begin (); ife != gpos.end (); ife++ ) { uint fprop = 0xffff; HB_UShort fidx; error = HB_GPOS_Select_Feature ( _gpos, OTF_name_tag ( *ife ), curScript, curLang, &fidx ); if ( !error ) { HB_GPOS_Add_Feature ( _gpos, fidx,fprop ); } else qDebug () << QString ( "adding gsub feature [%1] failed : %2" ).arg ( *ife ).arg ( error ) ; } error = HB_GPOS_Apply_String ( &hbFont, _gpos, FT_LOAD_NO_SCALE, _buffer, /*while dvi is true font klass is not used */ true, /*r2l */ true ); if ( error && error != HB_Err_Not_Covered ) qDebug () << QString ( "applying gpos features returned %1 ").arg ( error ) ; } return get_position(); } int FMOtf::procstring( QString s, QString script, QString lang, QStringList gsub, QStringList gpos ) { hb_buffer_clear ( _buffer ); int n = s.length (); HB_Error error; uint all = 0x1; uint prop; for ( int i = 0; i < n; i++ ) { prop = 0; prop |= all; error = hb_buffer_add_glyph ( _buffer, FT_Get_Char_Index ( _face, s[i].unicode() ), prop, i ); if ( error != HB_Err_Ok ) qDebug() << "hb_buffer_add_glyph ("<< s[i] <<") failed"; // else // qDebug() << "hb_buffer_add_glyph ("<< s[i] <<") success"; } // if ( _buffer->in_length > 0 ) // { // qDebug() << "_buffer->in_length = " <<_buffer->in_length; // // } // else // qDebug() << "_buffer->in_length = " <<_buffer->in_length; // if ( ! gsub.isEmpty() ) { // qDebug() <<"Process GSUB"; HB_GSUB_Clear_Features ( _gsub ); // qDebug() <<"Set GSUB"; set_table ( "GSUB" ); set_script ( script ); set_lang ( lang ); // qDebug() <<"GSUB set"; for ( QStringList::iterator ife = gsub.begin (); ife != gsub.end (); ife++ ) { HB_UShort fidx; error = HB_GSUB_Select_Feature ( _gsub, OTF_name_tag ( *ife ), curScript, curLang, &fidx ); if ( !error ) { HB_GSUB_Add_Feature ( _gsub, fidx, ~all ); // qDebug()<< QString("adding gsub feature [%1] success : %2").arg(*ife).arg(fidx ); } else qDebug() << QString ( "adding gsub feature [%1] failed : %2" ).arg ( *ife ).arg ( error ); } // qDebug() << "APPLY"; error = HB_GSUB_Apply_String ( _gsub, _buffer ); // qDebug() << "YLPPA"; // if ( error && error != HB_Err_Not_Covered ) qDebug () << QString ( "applying gsub features to string \"%1\" returned %2" ).arg ( s ).arg ( error ); } if ( !gpos.isEmpty() ) { // qDebug() <<"Process GPOS"; HB_GPOS_Clear_Features ( _gpos ); set_table ( "GPOS" ); set_script ( script ); set_lang ( lang ); for ( QStringList::iterator ife = gpos.begin (); ife != gpos.end (); ife++ ) { uint fprop = 0xffff; // fprop |= all | init | fina; HB_UShort fidx; error = HB_GPOS_Select_Feature ( _gpos, OTF_name_tag ( *ife ), curScript, curLang, &fidx ); if ( !error ) { HB_GPOS_Add_Feature ( _gpos, fidx,fprop ); // qDebug()<< QString("GPOS [%2] feature.lookupcount = %1").arg(_gpos->FeatureList.FeatureRecord[fidx].Feature.LookupListCount).arg(*ife); } else qDebug () << QString ( "adding gsub feature [%1] failed : %2" ).arg ( *ife ).arg ( error ) ; } error = HB_GPOS_Apply_String ( &hbFont, _gpos, FT_LOAD_NO_SCALE, _buffer, true,/*while dvi is true font klass is not used */ true /*r2l */); if ( error && error != HB_Err_Not_Covered ) qDebug () << QString ( "applying gpos features to string \"%1\" returned %2" ).arg ( s ).arg ( error ) ; } // qDebug() << "END_PROCSTRING"; int nret = _buffer->in_length; // hb_buffer_free ( _buffer ); return nret; } QStringList FMOtf::get_tables () { QStringList ret; // if (GDEF)scName() // ret.insert (ret.end (), "GDEF"); if ( GPOS ) ret.insert ( ret.end (), "GPOS" ); if ( GSUB ) ret.insert ( ret.end (), "GSUB" ); return ret; } void FMOtf::set_table ( QString s ) { curTable = s; } QStringList FMOtf::get_scripts () { // qDebug("FMOtf::get_scripts ()"); QStringList ret; if ( curTable == "GSUB" && GSUB ) { HB_UInt *taglist; if ( HB_GSUB_Query_Scripts ( _gsub, &taglist ) ) qDebug ( "error HB_GSUB_Query_Scripts" ); while ( *taglist ) { // qDebug ( QString ( "script [%1]" ).arg ( OTF_tag_name ( *taglist ) ) ); ret.append ( OTF_tag_name ( *taglist ) ); ++taglist; } } if ( curTable == "GPOS" && GPOS ) { HB_UInt *taglist; if ( HB_GPOS_Query_Scripts ( _gpos, &taglist ) ) qDebug ( "error HB_GPOS_Query_Scripts" ); while ( *taglist ) { ret.append ( OTF_tag_name ( *taglist ) ); ++taglist; } } return ret; } void FMOtf::set_script ( QString s ) { // qDebug(QString("set_script (%1)").arg(s)); curScriptName = s; if ( curTable == "GSUB" && GSUB ) { if ( HB_GSUB_Select_Script ( _gsub, OTF_name_tag ( curScriptName ), &curScript ) ) qDebug ( "Unable to set script index " ); } if ( curTable == "GPOS" && GPOS ) { if ( HB_GPOS_Select_Script ( _gpos, OTF_name_tag ( curScriptName ), &curScript ) ) qDebug ( "Unable to set script index" ); } } QStringList FMOtf::get_langs () { QStringList ret; ret << "dflt"; if ( curTable == "GSUB" && GSUB ) { HB_UInt *taglist; if ( HB_GSUB_Query_Languages ( _gsub, curScript, &taglist ) ) qDebug ( "error HB_GSUB_Query_Langs" ); while ( *taglist ) { // qDebug ( QString ( "lang [%1]" ).arg ( OTF_tag_name ( *taglist ) ) ); ret.append ( OTF_tag_name ( *taglist ) ); ++taglist; } } if ( curTable == "GPOS" && GPOS ) { HB_UInt *taglist; if ( HB_GPOS_Query_Languages ( _gpos, curScript, &taglist ) ) qDebug ( "error HB_GPOS_Query_Langs" ); while ( *taglist ) { ret.append ( OTF_tag_name ( *taglist ) ); ++taglist; } } return ret; } void FMOtf::set_lang ( QString s ) { // qDebug(QString("set_lang (%1)").arg(s)); if ( s == "default" || s == "dflt" || s.isEmpty () ) { curLangName = "dflt"; curLang = 0xFFFF;// HB_DEFAULT_LANGUAGE; return; } HB_Error error; curLangName = s; if ( curTable == "GSUB" && GSUB ) { error = HB_GSUB_Select_Language ( _gsub, OTF_name_tag ( curLangName ), curScript, &curLang, &curLangReq ); // if ( error ) // qDebug ( QString ( "Unable to set lang index due to error %1" ).arg ( error ) ); } if ( curTable == "GPOS" && GPOS ) { error = HB_GPOS_Select_Language ( _gpos, OTF_name_tag ( curLangName ),curScript, &curLang, &curLangReq ); // if ( error ) // qDebug ( QString ( "Unable to set lang index due to error %1" ).arg ( error ) ); } } QStringList FMOtf::get_features ( bool required ) { QStringList ret; if ( curTable == "GSUB" && GSUB ) { HB_UInt *taglist; required ? HB_GSUB_Query_Features ( _gsub, curScript, curLangReq, &taglist ) : HB_GSUB_Query_Features ( _gsub, curScript, curLang, &taglist ); while ( *taglist ) { ret.append ( OTF_tag_name ( *taglist ) ); ++taglist; } } if ( curTable == "GPOS" && GPOS ) { HB_UInt *taglist; required ? HB_GPOS_Query_Features ( _gpos, curScript, curLangReq, &taglist ) : HB_GPOS_Query_Features ( _gpos, curScript, curLang, &taglist ); while ( *taglist ) { ret.append ( OTF_tag_name ( *taglist ) ); ++taglist; } } return ret; } void FMOtf::set_features ( QStringList ls ) { curFeatures = ls; } // void dump_pos(HB_PositionRec p) // { // qDebug(QString("xpos = %1 | ypos = %2 | xadv = %3 | yadv = %4 | %5 | back = %6 ").arg(p.x_pos).arg(p.y_pos).arg(p.x_advance).arg(p.y_advance).arg(p.new_advance ? "NEW" : "NOT_NEW").arg(p.back)); // } /** Dump all the "uneasy" HB_Buffer into a user-friendy QList :) */ GlyphList FMOtf::get_position ( HB_Buffer abuffer ) { // qDebug() << "FMOtf::get_position () for buffer : " << _buffer; HB_Buffer bak_buf = _buffer ; if ( abuffer ) { _buffer = abuffer; } GlyphList renderedString; bool wantPos = true; for ( uint bIndex = 0 ; bIndex < _buffer->in_length; ++bIndex ) { // qDebug() << "bIndex = "<< bIndex; RenderedGlyph gl; gl.glyph = _buffer->in_string[bIndex].gindex; if ( gl.glyph == 0 ) { // qDebug() << "glyph skipped"; // Here we just continue but in the case of an actual lyout engine // we should keep track of empty glyphs positions too. continue; } gl.log = _buffer->in_string[bIndex].cluster; HB_Position p = 0; if ( wantPos && GPOS ) { p = &_buffer->positions[bIndex] ; // qDebug() << "p = "<< p; if ( !p ) wantPos = false; } if ( !p ) // applyGPOS has not been called? { FT_GlyphSlot slot = _face->glyph; if ( !FT_Load_Glyph ( _face, gl.glyph , FT_LOAD_NO_SCALE ) ) { gl.xadvance = ( double ) slot->metrics.horiAdvance/* ( slot->advance.x )*/; gl.yadvance = ( double ) slot->metrics.vertAdvance/* ( slot->advance.y )*/; gl.xoffset = 0; gl.yoffset = 0; } } else { // qDebug() << p->back; double backBonus = 0.0; for ( int bb = 0; bb < p->back; ++bb ) { backBonus -= renderedString[bIndex - ( bb + 1 ) ].xadvance; } if ( p->new_advance ) { // qDebug() << "P_NEW_ADV bb = "<chunkString()<< pos << glyphID << actx->alts(pos); // return (HB_UShort) 0; // } // else // { // return (HB_UShort) actx->select(pos); // } // } return (HB_UShort) 0; } fontmatrix-0.6.0+svn20110930/src/dataexport.cpp0000644000175000017500000001716011443717220020004 0ustar malexmalex// // C++ Implementation: dataexport // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "dataexport.h" #include "ui_dataexport.h" #include "typotek.h" #include "fontitem.h" #include "fmfontdb.h" #include "fminfodisplay.h" #include #include #include #include #include #include //DataExport::DataExport(const QString &dirPath, const QString &filterTag) //{ // exDir.setPath(dirPath); // filter = filterTag; // fonts = FMFontDb::DB()->Fonts(filter,FMFontDb::Tags); //} DataExport::DataExport(QWidget* parent): QWidget(parent,Qt::Window), ui(new Ui::DataExport) { setAttribute(Qt::WA_DeleteOnClose, true); ui->setupUi(this); fonts = FMFontDb::DB()->getFilteredFonts(); foreach(FontItem* f, fonts) { QListWidgetItem *it(new QListWidgetItem(f->path())); it->setCheckState(Qt::Checked); ui->listWidget->addItem(it); } show(); connect(ui->cancelButton, SIGNAL(clicked()), this, SLOT(close())); connect(ui->continueButton, SIGNAL(clicked()), this, SLOT(doExport())); } DataExport::~DataExport() { } void DataExport::doExport() { QString dir( QDir::homePath() ); dir = QFileDialog::getExistingDirectory ( this, tr ( "Choose Directory" ), dir , QFileDialog::ShowDirsOnly ); if ( dir.isEmpty() ) return ; exDir = QDir(dir); copyFiles(); buildHtml(); close(); } int DataExport::copyFiles() { QProgressDialog progress ( QObject::tr ( "Copying files" ), QObject::tr ( "cancel" ), 0, fonts.count(), this ); progress.setWindowModality ( Qt::WindowModal ); int progressindex(0); QList toRemove; for(int fidx( 0 ); fidx < fonts.count() ; ++fidx) { if ( progress.wasCanceled() ) break; progress.setLabelText ( fonts[fidx]->fancyName() ); progress.setValue ( ++progressindex ); QFile ffile(fonts[fidx]->path()); QFileInfo ifile(ffile); if(ffile.copy(exDir.absolutePath() + exDir.separator() + ifile.fileName()) ) { if ( !fonts[fidx]->afm().isEmpty() ) { if ( !QFile::copy( fonts[fidx]->afm(), exDir.absolutePath() + exDir.separator() + fonts[fidx]->activationAFMName() ) ) { qDebug() << "unable to copy " << fonts[fidx]->afm(); } else { qDebug() << fonts[fidx]->afm() << "copied"; } } } else toRemove << fidx; } for(int i(toRemove.count() - 1); i >= 0;--i) fonts.removeAt(toRemove[i]); return 0; } int DataExport::buildIndex() { QFile file(exDir.absolutePath() + exDir.separator() +"fontmatrix.data"); QXmlStreamWriter xmlStream(&file); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "Export Warning : Can't open " << file.fileName(); return 0; } else { xmlStream.setAutoFormatting(true); } xmlStream.writeStartDocument(); xmlStream.writeStartElement("fontmatrix"); xmlStream.writeAttribute("version", "1.1"); for(int fidx( 0 ); fidx < fonts.count() ; ++fidx) { FontItem* fitem(fonts[fidx]); { xmlStream.writeStartElement("fontfile"); xmlStream.writeAttribute("family", fitem->family()); xmlStream.writeAttribute("variant",fitem->variant()); xmlStream.writeAttribute("type",fitem->type()); xmlStream.writeStartElement("file"); xmlStream.writeCharacters( QFileInfo(fitem->path()).fileName() ); xmlStream.writeEndElement(); xmlStream.writeStartElement("info"); FMInfoDisplay fid(fitem); xmlStream.writeCharacters( fid.getHtml() ); xmlStream.writeEndElement(); QStringList tl = fitem->tags(); // tl.removeAll("Activated_On"); // tl.removeAll("Activated_Off"); foreach(QString tag, tl) { xmlStream.writeStartElement("tag"); xmlStream.writeCharacters( tag ); xmlStream.writeEndElement(); } xmlStream.writeEndElement(); } } xmlStream.writeEndElement();//fontmatrix xmlStream.writeEndDocument(); file.close(); return fonts.count(); } int DataExport::buildHtml() { QFile file(exDir.absolutePath() + exDir.separator() +"index.html"); QXmlStreamWriter xmlStream(&file); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "Export Warning : Can't open " << file.fileName(); return 0; } else { xmlStream.setAutoFormatting(true); } xmlStream.writeStartDocument(); xmlStream.writeStartElement("html"); // header xmlStream.writeStartElement("head"); xmlStream.writeStartElement("title"); xmlStream.writeCharacters( "Fontmatrix - " + filter); xmlStream.writeEndElement(); xmlStream.writeEndElement(); xmlStream.writeStartElement("body"); for(int fidx( 0 ); fidx < fonts.count() ; ++fidx) { FontItem* fitem(fonts[fidx]); { QFileInfo ffile(fitem->path()); xmlStream.writeStartElement("div"); xmlStream.writeAttribute("class", "fontbox"); xmlStream.writeStartElement("div"); xmlStream.writeAttribute("class", "namebox"); xmlStream.writeStartElement("a"); xmlStream.writeAttribute("href", ffile.fileName() ); xmlStream.writeCharacters( fitem->fancyName() ); xmlStream.writeEndElement();// a xmlStream.writeEndElement();// div.namebox // xmlStream.writeStartElement("img"); // xmlStream.writeAttribute("class", "imgbox"); // xmlStream.writeAttribute("src", ffile.fileName() + ".png"); // xmlStream.writeEndElement();// img.imgbox xmlStream.writeStartElement("div"); xmlStream.writeAttribute("class", "infobox"); QStringList tl = fitem->tags(); // tl.removeAll("Activated_On"); // tl.removeAll("Activated_Off"); foreach(QString tag, tl) { xmlStream.writeStartElement("div"); xmlStream.writeAttribute("class", "tagbox"); xmlStream.writeCharacters( tag ); xmlStream.writeEndElement(); //div.tagbox } xmlStream.writeEndElement();// div.info xmlStream.writeEndElement();// div.fontbox } } xmlStream.writeEndElement();// body xmlStream.writeEndElement();// html xmlStream.writeEndDocument(); file.close(); return fonts.count(); } int DataExport::buildTemplate(const QString& templateDirPath) { /// A template is the addition of 3 files in a directory /// Which are : TOP CENTER BOTTOM /// In TOP and BOTTOM, just put what you want /// In CENTER, these strings will be replaced: // ##FILENAME## // ##FAMILY## // ##VARIANT## // ##PREVIEW## // ##TAGS## QFile file(exDir.absolutePath() + exDir.separator() +"export.html"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "Export Warning : Can't open " << file.fileName(); return 0; } QDir tDir(templateDirPath); if(!tDir.exists("TOP")) return 0; if(!tDir.exists("CENTER")) return 0; if(!tDir.exists("BOTTOM")) return 0; QFile fileTOP(tDir.filePath("TOP")); QFile fileCENTER(tDir.filePath("CENTER")); QFile fileBOTTOM(tDir.filePath("BOTTOM")); if(!fileTOP.open(QIODevice::ReadOnly | QIODevice::Text)) return 0; if(!fileCENTER.open(QIODevice::ReadOnly | QIODevice::Text)) return 0; if(!fileBOTTOM.open(QIODevice::ReadOnly | QIODevice::Text)) return 0; QString sTOP(fileTOP.readAll()); fileTOP.close(); QString sCENTER(fileCENTER.readAll()); fileCENTER.close(); QString sBOTTOM(fileBOTTOM.readAll()); fileBOTTOM.close(); QTextStream exp(&file); exp << sTOP; for(int fidx( 0 ); fidx < fonts.count() ; ++fidx) { FontItem* fitem(fonts[fidx]); { QString t(sCENTER); QFileInfo ffile(fitem->path()); t.replace("##FILENAME##", ffile.fileName() ); t.replace("##PREVIEW##", ffile.fileName()+".png"); t.replace("##FAMILY##", fitem->family() ); t.replace("##VARIANT##", fitem->variant() ); t.replace("##TAGS##", fitem->tags().join(", ")); exp << t; } } exp << sBOTTOM; file.close(); return fonts.count(); } fontmatrix-0.6.0+svn20110930/src/panosedialog.ui0000644000175000017500000000307511116506366020135 0ustar malexmalex PanoseDialog 0 0 304 382 Fontmatrix - Panose Editor 0 0 TextLabel QFrame::StyledPanel QFrame::Raised 0 QDialogButtonBox::Cancel|QDialogButtonBox::Ok fontmatrix-0.6.0+svn20110930/src/textprogression.cpp0000644000175000017500000000275111445710452021112 0ustar malexmalex// // C++ Implementation: textprogression // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "textprogression.h" TextProgression *TextProgression::instance = 0; TextProgression::TextProgression() { instance = this; // setupUi(this); // connect(inlineBTT,SIGNAL(released()),this,SLOT(forwardStateChanged())); // connect(inlineRTL,SIGNAL(released()),this,SLOT(forwardStateChanged())); // connect(inlineLTR,SIGNAL(released()),this,SLOT(forwardStateChanged())); // connect(inlineTTB,SIGNAL(released()),this,SLOT(forwardStateChanged())); // connect(blockTTB,SIGNAL(released()),this,SLOT(forwardStateChanged())); // connect(blockRTL,SIGNAL(released()),this,SLOT(forwardStateChanged())); // connect(blockLTR,SIGNAL(released()),this,SLOT(forwardStateChanged())); } TextProgression::Progression TextProgression::inBlock() { // if(blockTTB->isChecked()) // return BLOCK_TTB; // else if(blockRTL->isChecked()) // return BLOCK_RTL; // else if(blockLTR->isChecked()) // return BLOCK_LTR; return BLOCK_TTB; } TextProgression::Progression TextProgression::inLine() { // if(inlineLTR->isChecked()) // return INLINE_LTR; // else if(inlineRTL->isChecked()) // return INLINE_RTL; // else if(inlineTTB->isChecked()) // return INLINE_TTB; // else if(inlineBTT->isChecked()) // return INLINE_BTT; return INLINE_LTR; } //void TextProgression::forwardStateChanged( ) //{ // emit stateChanged(); //} fontmatrix-0.6.0+svn20110930/src/treemodel.h0000644000175000017500000000413111147562531017254 0ustar malexmalex/**************************************************************************** ** ** Copyright (C) 2005-2007 Trolltech ASA. All rights reserved. ** ** This file is part of the example classes of the Qt Toolkit. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://www.trolltech.com/products/qt/opensource.html ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://www.trolltech.com/products/qt/licensing.html or contact the ** sales department at sales@trolltech.com. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #ifndef TREEMODEL_H #define TREEMODEL_H #include #include #include #include "treeitem.h" //CB include this here to make subclasses easier class TreeModel : public QAbstractItemModel { // Q_OBJECT public: TreeModel ( const QString &data, QObject *parent = 0 ); TreeModel ( QObject *parent = 0 ) {}; //CB Added for ScHelpTreeModel ~TreeModel(); QVariant data ( const QModelIndex &index, int role ) const; Qt::ItemFlags flags ( const QModelIndex &index ) const; QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; QModelIndex index ( int row, int column, const QModelIndex &parent = QModelIndex() ) const; QModelIndex parent ( const QModelIndex &index ) const; int rowCount ( const QModelIndex &parent = QModelIndex() ) const; int columnCount ( const QModelIndex &parent = QModelIndex() ) const; protected: void setupModelData ( const QStringList &lines, TreeItem *parent ); TreeItem *rootItem; }; #endif fontmatrix-0.6.0+svn20110930/src/playwidget.cpp0000644000175000017500000000711211412617774020007 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "playwidget.h" #include "ui_playwidget.h" #include #include #include #include #include PlayWidget* PlayWidget::instance = 0; PlayWidget::PlayWidget() : ui(new Ui::PlayWidget) { ui->setupUi(this); setWindowTitle(tr("Playground")); ui->toolbar->setDetached(); ui->toolbar->setNoClose(true); playScene = new QGraphicsScene; playScene->setSceneRect ( 0,0,10000,10000 ); ui->playView->setScene( playScene ); connect ( ui->playView, SIGNAL(pleaseZoom(int)),this,SLOT(slotZoom(int))); connect(ui->toolbar, SIGNAL(Hide()), this, SLOT(hide())); connect(ui->toolbar, SIGNAL(Print()), this, SLOT(print())); } PlayWidget::~PlayWidget() { delete ui; } PlayWidget* PlayWidget::getInstance() { if(instance == 0) { instance = new PlayWidget; Q_ASSERT(instance); } return instance; } void PlayWidget::changeEvent(QEvent *e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void PlayWidget::closeEvent(QCloseEvent *) { hide(); } void PlayWidget::slotZoom ( int z ) { double delta = 1.0 + ( z/1000.0 ) ; QTransform trans; trans.scale ( delta,delta ); ui->playView->setTransform ( trans, ( z == 0 ) ? false : true ); } double PlayWidget::playFontSize() { return ui->playFontSize->value(); } QRectF PlayWidget::getMaxRect() { return ui->playView->getMaxRect(); } void PlayWidget::clearSelection() { ui->playView->deselectAll(); } void PlayWidget::print() { QPrinter thePrinter ( QPrinter::HighResolution ); QPrintDialog dialog(&thePrinter, this); dialog.setWindowTitle("Fontmatrix - " + tr("Print Playground") ); if ( dialog.exec() != QDialog::Accepted ) return; thePrinter.setFullPage ( true ); QPainter aPainter ( &thePrinter ); double pWidth(thePrinter.paperRect().width()); double pHeight(thePrinter.paperRect().height()); QRectF targetR( pWidth * 0.1, pHeight * 0.1, pWidth * 0.8, pHeight * 0.8 ); QRectF sourceR( PlayWidget::getInstance()->getMaxRect()); PlayWidget::getInstance()->clearSelection(); PlayWidget::getInstance()->getPlayScene()->render(&aPainter, targetR ,sourceR, Qt::KeepAspectRatio ); } fontmatrix-0.6.0+svn20110930/src/mainviewwidget.cpp0000644000175000017500000011102711524253232020647 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "mainviewwidget.h" #include "fmactivate.h" #include "fmactivationreport.h" #include "fmaltcontext.h" #include "fmbaseshaper.h" #include "fmglyphhighlight.h" #include "fmglyphsview.h" #include "fminfodisplay.h" #include "fmlayout.h" #include "fmmissingfonthelper.h" #include "fmotf.h" #include "fmpaths.h" #include "fmpreviewlist.h" #include "fmuniblocks.h" #include "fontitem.h" //#include "listdockwidget.h" //#include "opentypetags.h" #include "panosematch.h" #include "systray.h" #include "typotek.h" #include "fmfontdb.h" #include "fmfontstrings.h" #include "tagswidget.h" #include "fmutils.h" #include "panosewidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // #include // #include MainViewWidget::MainViewWidget ( QWidget *parent ) : QWidget ( parent ) { setupUi ( this ); filterBar->setFilterListLayout(filterListLayout); filterBar->setCurFilterWidget(curFilterWidget); curFilterWidget->setVisible(false); quickSearchWidget->setVisible(false); quickSearchWait = 4000; quickSearchTimer = 0; m_forceReloadSelection = false; FMFontDb::DB()->clearFilteredFonts(); listView->setNumCol(4); listView->setModelColumn(1); listView->setViewMode(QListView::IconMode); listView->setIconSize(QSize(qRound(listView->width() ), 1.3 * typotek::getInstance()->getPreviewSize() * typotek::getInstance()->getDpiY() / 72.0)); listView->setUniformItemSizes(true); listView->setMovement(QListView::Static); previewModel = new FMPreviewModel( this, listView ); previewModel->setSpecString(""); previewModel->setFamilyMode(true); listView->setModel(previewModel); iconPS1 = QIcon(":/icon-PS1"); iconTTF = QIcon(":/icon-TTF"); iconOTF = QIcon(":/icon-OTF"); theVeryFont = 0; typo = typotek::getInstance(); // m_lists = ListDockWidget::getInstance(); // currentFonts = typo->getAllFonts(); FMFontDb::DB()->filterAllFonts(); fontsetHasChanged = true; QSettings settings; activateByFamilyOnly = settings.value("ActivateOnlyFamily", false).toBool(); currentOrdering = "family" ; doConnect(); listView->setFocus(Qt::OtherFocusReason); } MainViewWidget::~MainViewWidget() { delete filterBar; } void MainViewWidget::doConnect() { connect(familyWidget, SIGNAL(familyStateChanged()), previewModel, SLOT(dataChanged())); connect(filterBar,SIGNAL(filterChanged()),previewModel,SLOT(dataChanged())); connect(filterBar,SIGNAL(filterChanged()),typo, SLOT(showToltalFilteredFonts())); connect(saveButton, SIGNAL(clicked()), filterBar, SLOT(slotSaveFilter())); connect(clearButton, SIGNAL(clicked()), filterBar, SLOT(slotClearFilter())); connect(listView, SIGNAL(widthChanged(int)),this,SLOT(slotPreviewUpdateSize(int))); connect(listView, SIGNAL(activated(const QModelIndex&)), this, SLOT(slotShowFamily(const QModelIndex&))); connect(familyWidget, SIGNAL(backToList()), this, SLOT(slotQuitFamily())); connect(familyWidget, SIGNAL(fontSelected(const QString&)), this, SLOT(slotFontSelectedByName(const QString&))); connect(quickSearch, SIGNAL(textEdited(QString)), this, SLOT(slotQuickSearch(QString))); connect(quickSearch, SIGNAL(returnPressed()), this, SLOT(slotSelectFromQuickSearch())); connect(listView, SIGNAL(keyPressed(QString)), this, SLOT(slotQuickSearch(QString))); } void MainViewWidget::disConnect() { disconnect(familyWidget, SIGNAL(familyStateChanged()), previewModel, SLOT(dataChanged())); disconnect(filterBar,SIGNAL(filterChanged()),previewModel,SLOT(dataChanged())); disconnect(filterBar,SIGNAL(filterChanged()),typo, SLOT(showToltalFilteredFonts())); disconnect(saveButton, SIGNAL(clicked()), filterBar, SLOT(slotSaveFilter())); disconnect(clearButton, SIGNAL(clicked()), filterBar, SLOT(slotClearFilter())); disconnect(listView, SIGNAL(widthChanged(int)),this,SLOT(slotPreviewUpdateSize(int))); disconnect(listView, SIGNAL(activated(const QModelIndex&)), this, SLOT(slotShowFamily(const QModelIndex&))); disconnect(familyWidget, SIGNAL(backToList()), this, SLOT(slotQuitFamily())); disconnect(familyWidget, SIGNAL(fontSelected(const QString&)), this, SLOT(slotFontSelectedByName(const QString&))); disconnect(quickSearch, SIGNAL(textEdited(QString)), this, SLOT(slotQuickSearch(QString))); } //void MainViewWidget::fillTree() //{ // // qDebug()<< "MainViewWidget::fillTree("<< curItemName <<")"; // // QTime fillTime(0, 0, 0, 0); // // fillTime.start(); //// m_lists->savePosition(); // QTreeWidgetItem *curItem = 0; // // We log expanded families item // openKeys.clear(); // for ( int i=0; i < m_lists->fontTree->topLevelItemCount();++i ) // { // QTreeWidgetItem *topit = m_lists->fontTree->topLevelItem ( i ); // for ( int j=0;j < topit->childCount();++j ) // if ( topit->child ( j )->isExpanded() ) // openKeys << topit->child ( j )->text ( 0 ); // } // m_lists->fontTree->clear(); // // qDebug("LOGS Time elapsed: %d ms", fillTime.elapsed()); // // fillTime.restart(); // // build the in-memory tree that hold the ordered current fonts set // QMap< QChar,QMap< QString,QMap< QString,FontItem*> > > keyList; // QMap< QString,QString > realFamilyName; // orderedCurrentFonts.clear(); // QList currentFonts(FMFontDb::DB()->getFilteredFonts()); // int cfi(currentFonts.count()); // for ( int i=0; i < cfi;++i ) // { // QString family = currentFonts[i]->family(); // QString ordFamily = family.toUpper(); // QString variant = currentFonts[i]->variant(); // if( keyList.contains(ordFamily[0]) && keyList[ordFamily[0]].contains(ordFamily) && keyList[ordFamily[0]][ordFamily].contains(variant) ) // { // int unique = 2; // QString uniString(variant +" -%1"); // while(keyList[ordFamily[0]][ordFamily].contains(uniString.arg(unique,2))) // { // ++unique; // } // variant = uniString.arg(unique,2); // } // keyList[ordFamily[0]][ordFamily][variant] = ( currentFonts[i] ); // realFamilyName[ordFamily] = family; // } // // qDebug("MULTI Time elapsed: %d ms", fillTime.elapsed()); // // fillTime.restart(); // // Rebuild the the tree // QFont alphaFont ( "helvetica",14,QFont::Bold,false ); // QMap< QChar,QMap< QString,QMap< QString,FontItem*> > >::const_iterator kit; // QMap< QString,QMap< QString,FontItem*> >::const_iterator oit; // QMap< QString,FontItem*>::const_iterator fit; // // QTime tt(0,0); // // tt.start(); // // int tttotal(0); // // int tcount(0); // QMap act ; // FMFontDb::DB()->TransactionBegin(); // for( kit = keyList.constBegin() ; kit != keyList.constEnd() ; ++kit ) // { // for (oit = kit.value().constBegin(); oit != kit.value().constEnd(); ++ oit ) // { // for(fit = oit.value().constBegin(); fit != oit.value().constEnd(); ++fit) // { // act[fit.value()] = fit.value()->isActivated(); // } // } // } // FMFontDb::DB()->TransactionEnd(); // for( kit = keyList.constBegin() ; kit != keyList.constEnd() ; ++kit ) // { // QChar firstChar ( kit.key() ); // QTreeWidgetItem *alpha = new QTreeWidgetItem ( m_lists->fontTree ); // alpha->setText ( 0, firstChar ); // alpha->setFont ( 0, alphaFont ); // alpha->setData ( 0,100,"alpha" ); // alpha->setBackgroundColor ( 0,Qt::lightGray ); // alpha->setBackgroundColor ( 1,Qt::lightGray ); // bool alphaIsUsed = false; // for (oit = kit.value().constBegin(); oit != kit.value().constEnd(); ++ oit ) // { // QString fam( realFamilyName[oit.key()] ); // bool isExpanded = false; // QTreeWidgetItem *ord = new QTreeWidgetItem ( alpha ); // ord->setData ( 0,100,"family" ); // ord->setCheckState ( 0,Qt::Unchecked ); // bool chekno = false; // bool checkyes = false; // if ( openKeys.contains ( fam ) ) // { // ord->setExpanded ( true ); // isExpanded = true; // } // for(fit = oit.value().constBegin(); fit != oit.value().constEnd(); ++fit) // { // // ++tcount; // // tt.restart(); // FontItem *fPointer = fit.value(); // orderedCurrentFonts << fPointer; // QString var( fit.key() ); // if(typo->isSysFont(fit.value())) // var+="*"; // QTreeWidgetItem *entry = new QTreeWidgetItem ( ord ); // entry->setText ( 0, var ); // // entry->setText ( 1, fPointer->path() ); // entry->setToolTip( 0, fPointer->path() ); // entry->setData ( 0, 100, "fontfile" ); // if(/*fPointer->isLocked() ||*/ fPointer->isRemote() ) // { // entry->setFlags(Qt::ItemIsSelectable); // } // if(fPointer->type() == "CFF") // entry->setIcon(0, iconOTF ); // else if(fPointer->type() == "TrueType") // entry->setIcon(0, iconTTF); // else if(fPointer->type() == "Type 1") // entry->setIcon(0, iconPS1); // if ( act[fPointer] ) // { // checkyes = true; // } // else // { // chekno = true; // } // if( !activateByFamilyOnly ) // { // entry->setCheckState ( 0 , act[fPointer] ? Qt::Checked : Qt::Unchecked ); // } // entry->setData ( 0,200, entry->checkState ( 0 ) ); // if ( entry->toolTip( 0 ) == curItemName ) // curItem = entry; // // tttotal += tt.elapsed(); // } // if ( checkyes && chekno ) // ord->setCheckState ( 0,Qt::PartiallyChecked ); // else if ( checkyes ) // ord->setCheckState ( 0,Qt::Checked ); // // track checkState // ord->setData ( 0,200,ord->checkState ( 0 ) ); // ord->setText ( 0, fam + " ["+ QString::number ( ord->childCount() ) +"]"); // // ord->setText ( 1, QString::number ( ord->childCount() ) ); // alphaIsUsed = true; // } // if ( alphaIsUsed ) // { // m_lists->fontTree->addTopLevelItem ( alpha ); // alpha->setExpanded ( true ); // } // else // { // delete alpha; // } // } // // qDebug()<<"SUB TREE Time Total: "<previewList->slotRefill ( currentFonts, fontsetHasChanged ); // if ( curItem ) // { // // qDebug() << "get curitem : " << curItem->text ( 0 ) << curItem->text ( 1 ); // m_lists->restorePosition(); // if( !m_lists->nameItemIsVisible(curItem) ) // { // m_lists->fontTree->scrollToItem ( curItem, QAbstractItemView::PositionAtCenter ); // } // // // QColor scol (255,240,221,255); // // // QColor pcol (255,211,155,255); // // QColor scol (QApplication::palette().highlight().color()); // // QColor pcol (scol); // // QFont selFont; // // selFont.setBold(true); // // curItem->parent()->setBackgroundColor ( 0,pcol ); // // curItem->parent()->setBackgroundColor ( 1,pcol ); // // curItem->parent()->setFont(0, selFont); // // curItem->setBackgroundColor ( 0,scol ); // // // curItem->setBackgroundColor ( 1,scol ); // // curItem->setFont(0,selFont); // QFont selFont; // selFont.setBold ( true ); // curItem->parent()->setFont ( 0, selFont ); // curItem->setSelected(true); // } // else // { // qDebug() << "NO CURITEM"; // } // m_lists->fontTree->resizeColumnToContents ( 0 ) ; // // m_lists->fontTree->resizeColumnToContents ( 1 ) ; // // m_lists->fontTree->setColumnWidth(0,200); // fontsetHasChanged = false; // listChanged(); // // m_lists->slotPreviewUpdate(); // // qDebug("END Time elapsed: %d ms", fillTime.elapsed()); //} //void MainViewWidget::updateTree ( bool checkFontActive ) //{ // QTreeWidgetItem *curItem = 0; // QFont deselect; // int topCount ( m_lists->fontTree->topLevelItemCount() ); // for ( int topIdx ( 0 ) ; topIdx < topCount; ++topIdx ) // { // QTreeWidgetItem *topItem ( m_lists->fontTree->topLevelItem ( topIdx ) ); // int famCount ( topItem->childCount() ); // for ( int famIdx ( 0 ); famIdx < famCount; ++ famIdx ) // { // QTreeWidgetItem *famItem ( topItem->child ( famIdx ) ); // int varCount ( famItem->childCount() ); // for ( int varIdx ( 0 ); varIdx < varCount; ++ varIdx ) // { // QTreeWidgetItem *varItem ( famItem->child ( varIdx ) ); // if ( varItem->toolTip ( 0 ) == lastIndex ) // { // varItem->setFont ( 0, deselect ); // varItem->setBackgroundColor ( 0, Qt::transparent ); // varItem->setBackgroundColor ( 1, Qt::transparent ); // varItem->parent()->setFont ( 0, deselect ); // varItem->parent()->setBackgroundColor ( 0, Qt::transparent ); // varItem->parent()->setBackgroundColor ( 1, Qt::transparent ); // varItem->setSelected(false); // } // else if ( varItem->toolTip ( 0 ) == curItemName ) // { // curItem = varItem; // } // } // } // } // // Check if active // if ( checkFontActive ) // { // for ( int topIdx ( 0 ) ; topIdx < topCount; ++topIdx ) // { // QTreeWidgetItem *topItem ( m_lists->fontTree->topLevelItem ( topIdx ) ); // int famCount ( topItem->childCount() ); // for ( int famIdx ( 0 ); famIdx < famCount; ++ famIdx ) // { // QTreeWidgetItem *famItem ( topItem->child ( famIdx ) ); // int varCount ( famItem->childCount() ); // if ( famItem->isExpanded() ) // { // for ( int varIdx ( 0 ); varIdx < varCount; ++ varIdx ) // { // QTreeWidgetItem *varItem ( famItem->child ( varIdx ) ); // // Check if active // QString s ( varItem->toolTip ( 0 ) ); // FontItem* f ( FMFontDb::DB()->Font ( s ) ); // if ( f && f->isActivated()) // { // if( !activateByFamilyOnly ) // varItem->setCheckState ( 0,Qt::Checked ); // } // else // { // if( !activateByFamilyOnly ) // varItem->setCheckState ( 0,Qt::Unchecked ); // } // } // } // } // } // } // // m_lists->previewList->slotRefill ( currentFonts, false ); // if ( curItem ) // { // QFont selFont; // selFont.setBold ( true ); // curItem->parent()->setFont ( 0, selFont ); // curItem->setSelected(true); // } // else // { // qDebug() << "NO CURITEM"; // } // if ( !m_lists->nameItemIsVisible ( curItem ) ) // { // m_lists->fontTree->scrollToItem ( curItem, QAbstractItemView::PositionAtCenter ); // } // fontsetHasChanged = false; //} //void MainViewWidget::refreshActStatus(const QStringList& flist) //{ // if(flist.isEmpty()) // return; // QStringList l_flist(flist); // int topCount ( m_lists->fontTree->topLevelItemCount() ); // for ( int topIdx ( 0 ) ; topIdx < topCount; ++topIdx ) // { // QTreeWidgetItem *topItem ( m_lists->fontTree->topLevelItem ( topIdx ) ); // int famCount ( topItem->childCount() ); // for ( int famIdx ( 0 ); famIdx < famCount; ++ famIdx ) // { // QTreeWidgetItem *famItem ( topItem->child ( famIdx ) ); // int varCount ( famItem->childCount() ); // if ( famItem->isExpanded() ) // { // for ( int varIdx ( 0 ); varIdx < varCount; ++ varIdx ) // { // QTreeWidgetItem *varItem ( famItem->child ( varIdx ) ); // // Check if active // QString s ( varItem->toolTip ( 0 ) ); // if(l_flist.contains(s)) // { // FontItem* f ( FMFontDb::DB()->Font ( s ) ); // if ( f && f->isActivated()) // varItem->setCheckState ( 0, Qt::Checked ); // else // varItem->setCheckState ( 0, Qt::Unchecked ); // l_flist.removeAll(s); // if(l_flist.isEmpty()) // return; // } // } // } // } // } //} void MainViewWidget::slotOrderingChanged ( QString s ) { //Update "m_lists->fontTree" // currentFonts = typo->getAllFonts(); currentOrdering = s; // fillTree(); } /// Should be renamed in slotNameItemSelected //void MainViewWidget::slotFontSelected ( QTreeWidgetItem * item, int column ) //{ // qDebug() << "font select"<data ( 0,100 ).toString() == "alpha" ) // { // // qDebug() << "Item is an alpha"; // return; // // fillTree(); // } // else if ( item->data ( 0,100 ).toString() == "family" ) // { // // qDebug() << "Item is a family"; // item->setExpanded(true); // bool wantView = true; // bool hasChild = false; // QStringList names; // QMap variantMap; // for ( int i=0; i < item->childCount(); ++i ) // { // hasChild = true; // if ( item->child( i )->toolTip(0) == curItemName ) // wantView = false; // names << item->child( i )->toolTip( 0 ) ; // variantMap[item->child ( i )->text ( 0 ) ] = item->child ( i )->toolTip(0) ; // } // // if(!slotFontActionByNames ( names )) // // { // // delete(new FMMissingFontHelper(names)); // // return; // // } // int oldc = item->data ( 0,200 ).toInt(); // if ( oldc == item->checkState ( 0 ) ) // filters when checkbox has not been hit // { // // TODO keep an eye on it // // fillTree(); // } // else if ( item->checkState ( 0 ) != Qt::PartiallyChecked ) // { // bool cs = item->checkState ( 0 ) == Qt::Checked ? true : false; // item->setData( 0,200, item->checkState ( 0 ) ); // QList todo; // for ( int i=0; ichildCount(); ++i ) // { // todo << FMFontDb::DB()->Font( item->child ( i )->toolTip(0) ); // } // // for (int fIndex(0);fIndex < todo.count(); ++fIndex) // // { // // FontItem* afont = todo[fIndex]; // // if(fIndex == todo.count() - 1) // // activation ( afont, cs , true); // // else // // activation ( afont, cs , false); // // } // activation ( todo, cs ); // } // else // { // qDebug() << "Something wrong, Qt::PartiallyChecked should not be reached" ; // } // if ( wantView && hasChild ) // { // QString select; // if ( variantMap.contains ( "Regular" ) ) // select = variantMap["Regular"]; // else if ( variantMap.contains ( "Roman" ) ) // select = variantMap["Roman"]; // else if ( variantMap.contains ( "Medium" ) ) // select = variantMap["Medium"]; // else if ( variantMap.contains ( "Book" ) ) // select = variantMap["Book"]; // else // select = * ( variantMap.begin() ); // // m_lists->previewList->slotSelect(select); // slotFontSelectedByName(select); // } // return; // } // else if ( item->data ( 0,100 ).toString() == "fontfile" ) // { // QString fontname(item->toolTip(0)); // bool wantActivate = (item->checkState(0) == Qt::Checked) ? true : false; // // m_lists->previewList->slotSelect(fontname); // if(!slotFontSelectedByName(fontname)) // { // delete(new FMMissingFontHelper(fontname)); // return; // } // // if ( !theVeryFont->isLocked() ) // { // if(theVeryFont->isActivated()) // { // if(!wantActivate) // { // QList fl; // fl << theVeryFont; // activation(fl,false); // } // } // else // { // if(wantActivate) // { // QList fl; // fl << theVeryFont; // activation(fl,true); // } // } // } // } // return; //} bool MainViewWidget::slotFontSelectedByName (const QString& fname ) { if ( fname.isEmpty() || ((fname == faceIndex) && (!m_forceReloadSelection)) ) return false; m_forceReloadSelection = false; lastIndex = faceIndex; faceIndex = fname; curItemName = faceIndex; { // qDebug() << "Font has changed \n\tOLD : "<Font( faceIndex ); if(!theVeryFont) return false; // theVeryFont->updateItem(); // slotFontActionByName ( fname ); // if(theVeryFont->isRemote()) // { // qDebug() << faceIndex <<" is remote"; // if(!theVeryFont->isCached()) // { // connect(theVeryFont,SIGNAL(dowloadFinished()), this, SLOT(slotRemoteFinished())); // theVeryFont->getFromNetwork(); // currentDownload = faceIndex ; // faceIndex = lastIndex; // return false; // } // else // { // currentDownload = ""; // } // } // fillOTTree(); // slotView ( true ); typo->setWindowTitle ( theVeryFont->fancyName() + " - Fontmatrix" ); // m_lists->fontTree->headerItem()->setText(0, tr("Names")+" ("+theVeryFont->family()+")"); typo->presentFontName ( theVeryFont->fancyName() ); // fillTree(); // updateTree(); // m_lists->listPreview->setCurrentFont(theVeryFont->path()); } return true; } //void MainViewWidget::slotInfoFont() //{ // if(theVeryFont) // { // FMInfoDisplay fid(theVeryFont); // fontInfoText->setContent(fid.getHtml().toUtf8(), "application/xhtml+xml"); // } //} //void MainViewWidget::slotView ( bool needDeRendering ) //{ // QTime t; // t.start(); // FontItem *l = FMFontDb::DB()->Font( lastIndex ); // FontItem *f = FMFontDb::DB()->Font( faceIndex ); // if ( !f ) // return; // if ( needDeRendering ) // { // if ( l ) // { // l->deRenderAll(); // } // f->deRenderAll(); // curGlyph = 0; // } // bool wantDeviceDependant = loremView_FT->isVisible(); // unsigned int storedHinting(theVeryFont->getFTHintMode()); // if(wantDeviceDependant) // { // theVeryFont->setFTHintMode(hinting()); // } // if(textProgression->inLine() == TextProgression::INLINE_LTR ) // theVeryFont->setProgression(PROGRESSION_LTR ); // else if(textProgression->inLine() == TextProgression::INLINE_RTL ) // theVeryFont->setProgression(PROGRESSION_RTL); // else if(textProgression->inLine() == TextProgression::INLINE_TTB ) // theVeryFont->setProgression(PROGRESSION_TTB ); // else if(textProgression->inLine() == TextProgression::INLINE_BTT ) // theVeryFont->setProgression(PROGRESSION_BTT); // theVeryFont->setFTRaster ( wantDeviceDependant ); // theVeryFont->setShaperType(shaperTypeCombo->itemData( shaperTypeCombo->currentIndex() ).toInt() ); // if ( loremView->isVisible() || loremView_FT->isVisible() ) // { //// qDebug()<<"lv(ft) is visible"; // if(textLayout->isRunning()) // { //// qDebug()<<"tl is running"; // textLayout->stopLayout(); // } // else // { //// qDebug()<<"tl is NOT running"; // QGraphicsScene *targetScene; // loremView_FT->unSheduleUpdate(); // loremView->unSheduleUpdate(); // if(loremView->isVisible()) // { // targetScene = loremScene; // } // else if(loremView_FT->isVisible()) // { // targetScene = ftScene; // } // bool processFeatures = f->isOpenType() && !deFillOTTree().isEmpty(); // QString script = langCombo->currentText(); // bool processScript = f->isOpenType() && ( useShaperCheck->checkState() == Qt::Checked ) && ( !script.isEmpty() ); // textLayout->setTheFont(theVeryFont); // textLayout->setDeviceIndy(!wantDeviceDependant); // textLayout->setTheScene(targetScene); // textLayout->setAdjustedSampleInter( sampleInterSize ); // double fSize(sampleFontSize); // QList list; // QStringList stl( typo->namedSample(sampleTextTree->currentItem()->data(0, Qt::UserRole).toString() ).split("\n")); // if ( processScript ) // { // for(int p(0);pglyphs( stl[p] , fSize, script ); // } // } // else if(processFeatures) // { // // Experimental code to handle alternate is commented out // // Do not uncomment //// FMAltContext * actx ( FMAltContextLib::SetCurrentContext(sampleTextTree->currentText(), theVeryFont->path())); //// int rs(0); //// actx->setPar(rs); // for(int p(0);pglyphs( stl[p] , fSize, deFillOTTree()); //// actx->setPar(++rs); // } //// actx->cleanup(); //// FMAltContextLib::SetCurrentContext(sampleTextTree->currentText(), theVeryFont->path()); // } // else // { // for(int p(0);pglyphs( stl[p] , fSize ); // } // textLayout->doLayout(list, fSize); //// if (loremView->isVisible() /*&& fitViewCheck->isChecked()*/ ) //// { //// loremView->fitInView ( textLayout->getRect(), Qt::KeepAspectRatio ); //// } // textLayout->start(QThread::LowestPriority); // } // } // else if(!loremView->isVisible() && !loremView_FT->isVisible()) // { // loremView->sheduleUpdate(); // loremView_FT->sheduleUpdate(); // } // slotUpdateGView(); //// slotInfoFont(); //} //void MainViewWidget::slotSearch(int field, QString text) //{ // // qDebug()<<"slotSearch"; //// m_lists->fontTree->clear(); // // m_lists->previewList->slotRefill(QList(), true); // fontsetHasChanged = true; // QApplication::setOverrideCursor ( Qt::WaitCursor ); // QString fs ( text ); // QList tmpList; // if(field == FILTER_FIELD_SPECIAL_UNICODE) //Unicode // { // QList allList; // int startC(0xFFFFFFFF); // int endC(0); // int patCount(fs.count()); // for(int a(0); a < patCount; ++a) // { // unsigned int ca(fs[a].unicode()); // if( ca < startC) // startC = ca; // if(ca > endC) // endC = ca; // } // // FontItem->countCoverage is very costly, so we take some code from operateFilter // // to avoid calling it too much, if possible. // bool queue(m_lists->getOperation().contains("AND")); // allList = queue ? FMFontDb::DB()->getFilteredFonts() : FMFontDb::DB()->AllFonts(); // int superSetCount(allList.count()); // for ( int i =0; i < superSetCount; ++i ) // { // int cc(allList[i]->countCoverage ( startC, endC ) ); // if ( cc >= patCount ) // { // tmpList.append ( allList[i]); // } // } // operateFilter( tmpList, QString("U://") + QString(fs) ); // } // else if(field == FMFontDb::AllInfo) // { // FMFontDb::InfoItem k; // tmpList.clear(); // for(int gIdx(0); gIdx < FontStrings::Names().keys().count() ; ++gIdx) // { // k = FontStrings::Names().keys()[gIdx]; // if(k != FMFontDb::AllInfo) // { // tmpList += FMFontDb::DB()->Fonts(fs,k); // } // } // operateFilter(tmpList, fs); // } // else // { // tmpList = FMFontDb::DB()->Fonts(fs, FMFontDb::InfoItem(field ) ); // operateFilter(tmpList, fs); // } // currentOrdering = "family"; //// fillTree(); //// m_lists->searchString->clear(); // QApplication::restoreOverrideCursor(); //} void MainViewWidget::slotShowFamily(const QModelIndex& familyIdx) { FontItem * fItem(FMFontDb::DB()->getFilteredFonts(true).at(familyIdx.row())); if(!fItem) { qDebug()<<"\t-FontItme invalid"; return; } QList fl(FMFontDb::DB()->FamilySet(fItem->family())); foreach(FontItem* f,fl) { qDebug() <<"F"<< f->fancyName(); } familyWidget->setFamily(fItem->family()); previewStack->setCurrentIndex(1); } void MainViewWidget::slotQuitFamily() { previewStack->setCurrentIndex(0); } //void MainViewWidget::slotFilterTag ( QString tag ) //{ // int tIdx(filterBar->tagsCombo()->currentIndex()); // if(tIdx < 0) // return; // QString key(filterBar->tagsCombo()->itemData(tIdx).toString()); // if(key == "TAG") // regular tag // { // m_lists->fontTree->clear(); // fontsetHasChanged = true; // operateFilter( FMFontDb::DB()->Fonts(tag, FMFontDb::Tags ), tag); // currentOrdering = "family"; // fillTree(); // } // else if(key == "ALL_ACTIVATED") // { // m_lists->fontTree->clear(); // fontsetHasChanged = true; // operateFilter( FMFontDb::DB()->Fonts(1, FMFontDb::Activation ), tr("Activated")); // currentOrdering = "family"; // fillTree(); // } // else if(key == "SIMILAR") // { // if(theVeryFont) // { // m_lists->fontTree->clear(); // fontsetHasChanged = true; // operateFilter( PanoseMatchFont::similar(theVeryFont, typo->getPanoseMatchTreshold() ), "S://"+ theVeryFont->family()); // fillTree(); // } // } //} //void MainViewWidget::operateFilter(QList< FontItem * > allFiltered, const QString filterName) //{ // QList tmpList = allFiltered; // QList negList; // QList queList; // QStringList ops(m_lists->getOperation()); // bool negate(ops.contains("NOT")); // bool queue(ops.contains("AND")); // m_lists->clearOperation(); // FMFontDb* fmdb(FMFontDb::DB()); // if(queue) // { // addFilterToCrumb((negate?"!":"") +filterName); // queList = fmdb->getFilteredFonts(); // } // else // { // setCrumb(); // addFilterToCrumb((negate?"!":"") +filterName); // } // if(negate) // negList = fmdb->AllFonts(); // fmdb->clearFilteredFonts(); // if(negate) // { // if(queue) // { // foreach(FontItem* f, negList) // { // if(!fmdb->isFiltered(f) && !tmpList.contains(f) && queList.contains(f)) // fmdb->insertFilteredFont(f); // } // } // else // not queue // { // foreach(FontItem* f, negList) // { // if(!fmdb->isFiltered(f) && !tmpList.contains(f)) // fmdb->insertFilteredFont(f); // } // } // } // else // not negate // { // if(queue) // { // foreach(FontItem* f, tmpList) // { // if(!fmdb->isFiltered(f) && queList.contains(f)) // fmdb->insertFilteredFont(f); // } // } // else // not queue // { // foreach(FontItem* f, tmpList) // { // if(!fmdb->isFiltered(f)) // fmdb->insertFilteredFont(f); // } // } // } //} //void MainViewWidget::slotFontAction ( QTreeWidgetItem * item, int column ) //{ //// qDebug()<<"MainViewWidget::slotFontAction"; // if ( column >2 ) return; // FontItem * FoIt = FMFontDb::DB()->Font( item->text ( 1 ) ); // if ( FoIt/* && (!FoIt->isLocked())*/ ) // { // QList fl; // fl.append ( FoIt ); // familyWidget->tagWidget()->prepare ( fl ); // } //} //bool MainViewWidget::slotFontActionByName (const QString &fname ) //{ //// qDebug()<<"MainViewWidget::slotFontActionByName ("<< fname <<")"; // FontItem * FoIt = FMFontDb::DB()->Font( fname ); // if ( FoIt/* && (!FoIt->isLocked())*/ ) // { // QList fl; // fl.append ( FoIt ); // familyWidget->tagWidget()->prepare ( fl ); // } // else // return false; // return true; //} //bool MainViewWidget::slotFontActionByNames ( QStringList fnames ) //{ //// qDebug()<<"MainViewWidget::slotFontActionByNames ("<< fnames.join(";") <<")"; // QList FoIt; // for ( int i= 0; i < fnames.count() ; ++i ) // { // FontItem* ti(FMFontDb::DB()->Font( fnames[i] )); // if(ti) // FoIt.append ( ti ); // else // { // return false; // } // } // if ( FoIt.count() ) // familyWidget->tagWidget()->prepare ( FoIt ); // return true; //} //void MainViewWidget::slotEditAll() //{ //// QList fl; //// for ( int i =0; i< currentFonts.count(); ++i ) //// { //// fl.append ( currentFonts[i] ); //// } // if ( FMFontDb::DB()->countFilteredFonts() == 0 ) // return; // familyWidget->tagWidget()->prepare ( FMFontDb::DB()->getFilteredFonts() ); //} void MainViewWidget::activation(QList< FontItem * > fit, bool act) { // First check if one of the font is in a different state than required QList< FontItem * > actualF; for(int i(0); i < fit.count(); ++i) { if(fit[i]->isActivated() != act) actualF.append(fit[i]); } if(actualF.count() == 0) return; // TODO check for duplicates before we activate them. // we tr("purge") errors; FMActivate::getInstance()->errors(); FMActivate::getInstance()->activate(actualF, act); QMap actErr(FMActivate::getInstance()->errors()); if(actErr.count() > 0) { FMActivationReport ar(this, actErr); ar.exec(); } // updateTree(true); } void MainViewWidget::slotDesactivateAll() { activation(FMFontDb::DB()->getFilteredFonts(), false); } void MainViewWidget::slotActivateAll() { activation(FMFontDb::DB()->getFilteredFonts(), true); } //void MainViewWidget::slotActivate ( bool act, QTreeWidgetItem * item, int column ) //{ // if ( column >2 ) return; // FontItem * FoIt = FMFontDb::DB()->Font( item->text ( 1 ) ); // if ( FoIt ) // { // QList fl; // fl.append(FoIt); // activation ( fl, act ); // } //} void MainViewWidget::keyPressEvent ( QKeyEvent * e ) { qDebug() << " MainViewWidget::keyPressEvent(QKeyEvent * "<text().isEmpty() || (!e->text().at(0).isLetterOrNumber())) return; slotQuickSearch(e->text()); } #define MAX_PALYSTRING_LEN 30 void MainViewWidget::slotRemoveCurrentItem() { if(curItemName.isEmpty()) return; if(theVeryFont->isActivated()) { QMessageBox::information(this, tr("Fontmatrix takes care of you"), curItemName + tr(" is activated.\nIf you want to remove it from Fontmatrix database, please deactivate it first."), QMessageBox::Yes ); return; } if( QMessageBox::question ( this, tr("Fontmatrix safe"), tr("You are about to remove a font from Fontmatrix database") +"\n"+curItemName+"\n" + tr("Do you want to continue?"),QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes ) { theVeryFont->deRenderAll(); FMFontDb::DB()->removeFilteredFont(theVeryFont); theVeryFont = 0 ; typo->removeFontItem(curItemName); curItemName = lastIndex = faceIndex = ""; fontsetHasChanged = true; // fillTree(); } } QString MainViewWidget::sampleName() { QString ret/*( sampleTextTree->currentItem()->data(0, Qt::UserRole).toString() )*/; if (ret.isEmpty()) ret = typo->defaultSampleName(); return ret; } void MainViewWidget::saveSplitterState() { QSettings settings; // settings.setValue( "WState/SplitterViewState", splitter_2->saveState()); // settings.setValue( "WState/SplitterList1", ListDockWidget::getInstance()->listSplit1->saveState()); // settings.setValue( "WState/SplitterList2", ListDockWidget::getInstance()->listSplit2->saveState()); } void MainViewWidget::restoreSplitterState() { QSettings settings; // splitter_2->restoreState(settings.value("WState/SplitterViewState").toByteArray()); // ListDockWidget::getInstance()->listSplit1->restoreState(settings.value("WState/SplitterList1").toByteArray()); // ListDockWidget::getInstance()->listSplit2->restoreState(settings.value("WState/SplitterList2").toByteArray()); } QList MainViewWidget::curFonts() { // qDebug()<<"curFonts"< flist) { FMFontDb::DB()->setFilterdFonts(flist); } void MainViewWidget::slotQuickSearch(const QString& text) { int t(quickSearchTime.elapsed()); bool hasText(false); qDebug()< quickSearchWait) ) { quickSearchWidget->show(); if(!quickSearchTimer) { quickSearchTimer = new QTimer; connect(quickSearchTimer, SIGNAL(timeout()), this, SLOT(slotEndQuickSearch())); } quickSearchTimer->start(quickSearchWait); quickSearchString = text; quickSearch->setText(quickSearchString); quickSearch->setFocus(Qt::OtherFocusReason); quickSearchTime.start(); hasText = listView->moveTo(quickSearchString); } else if(t <= quickSearchWait) { if(sender() != quickSearch) { quickSearch->setText(quickSearchString); quickSearchString += text; } else quickSearchString = text; quickSearchTime.restart(); quickSearchTimer->start(quickSearchWait); hasText = listView->moveTo(quickSearchString); } else { quickSearchString.clear(); quickSearchWidget->hide(); } if(hasText) quickSearch->setStyleSheet(QString()); else quickSearch->setStyleSheet(QString("background-color:#F44;")); } void MainViewWidget::slotEndQuickSearch() { quickSearchWidget->hide(); quickSearchString.clear(); quickSearchTimer->stop(); listView->setFocus(Qt::OtherFocusReason); quickSearch->setStyleSheet(QString()); } void MainViewWidget::slotSelectFromQuickSearch() { slotEndQuickSearch(); slotShowFamily( listView->currentIndex() ); } void MainViewWidget::slotPreviewUpdateSize(int w) { listView->setIconSize(QSize(qRound(w ), 1.3 * typotek::getInstance()->getPreviewSize() * typotek::getInstance()->getDpiY() / 72.0)); } fontmatrix-0.6.0+svn20110930/src/fmactivate.h0000644000175000017500000000206211237607613017421 0ustar malexmalex// // C++ Interface: fmactivate // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMACTIVATE_H #define FMACTIVATE_H #include #include #include #include class FontItem; class FMActivate : public QObject { Q_OBJECT FMActivate(); static FMActivate *instance; enum Error { NO_LINK = 0, ALREADY_ACTIVE, NO_UNLINK, ALREADY_UNACTIVE, MISSING_AFM, ERROR }; QHash errorStrings; void setErrorStrings(); public: static FMActivate* getInstance(); // void activate(FontItem* fit , bool act ); void activate(QList fitList , bool act ); QMap errors(); signals: void activationEvent(const QStringList&); private: /* Add and Remove fonts in ~/.fonts.conf with sequence */ bool addFcReject(const QString& path); bool remFcReject(const QString& path); QMap m_errors; }; #endif fontmatrix-0.6.0+svn20110930/src/fmpreviewlist.cpp0000644000175000017500000003332611525001362020525 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "fmpreviewlist.h" #include "typotek.h" #include "fontitem.h" #include "mainviewwidget.h" #include "fmfloatingpreview.h" #include "fmfontdb.h" #include #include #include #include //#include //#include #include #include #include #include #define FM_MINIMUM_PREVIEW_WIDTH 280 bool FMPreviewIconEngine::initState = false; QPen FMPreviewIconEngine::pen = QPen(); QVector FMPreviewIconEngine::m_selPalette; QRgb FMPreviewIconEngine::activatedColor = qRgb (9,223,11); QRgb FMPreviewIconEngine::deactivatedColor = qRgb (190,190,190); QRgb FMPreviewIconEngine::partlyActivatedColor = qRgb (166,220,220); FMPreviewIconEngine::FMPreviewIconEngine() :QIconEngineV2(), activatedFont(NotActivated) { if(!initState) { // setup palette QColor sColor( QApplication::palette().color(QPalette::Highlight) ); QColor tColor( QApplication::palette().color(QPalette::HighlightedText) ); m_selPalette.clear(); int sr(sColor.red()); int sg(sColor.green()); int sb(sColor.blue()); int tr(tColor.red()); int tg(tColor.green()); int tb(tColor.blue()); int cpal(256); for ( int aa = 0; aa < cpal ; ++aa ) { int sn(cpal - aa); int tn(aa); m_selPalette << qRgb (((sr*sn) + (tr*tn)) /cpal, ((sg*sn) + (tg*tn)) /cpal, ((sb*sn) + (tb*tn)) /cpal ); } // setup "writing" pen // pen.setColor(QColor(m_selPalette.at(128))); pen.setColor(QColor(220,220,220)); pen.setWidth(1); initState = true; } } QVector FMPreviewIconEngine::actualSelPalette(const QVector& orig) { QRgb r(QApplication::palette().color(QPalette::Highlight).rgb()); QVector ret; for(int i(0); i<256; ++i) ret << r; QColor bgColor(QApplication::palette().color(QPalette::Base)); QColor fgColor(QApplication::palette().color(QPalette::Text)); // In m_selPalette, background is at the begining of the vector bool DarkOnLight(fgColor.rgb() < bgColor.rgb()); // order is dark first, light last QMap order; for(int i(0); i < orig.count(); ++i) order[orig[i]] = i; QList oIdx(order.values()); if(DarkOnLight) { // oIdx has background values at the end int v(0); for(int c(oIdx.count() - 1); c >= 0 ; --c) { ret [oIdx[c]] = m_selPalette[v]; ++v; } } else { int v(0); for(int c(0); c < oIdx.count() ; c++) { ret [oIdx[c]] = m_selPalette[v]; ++v; } } return ret; } FMPreviewIconEngine::~FMPreviewIconEngine() { // if(m_p) // delete m_p; } void FMPreviewIconEngine::paint ( QPainter * painter, const QRect & rect, QIcon::Mode mode, QIcon::State state ) { if(!m_p.isNull()) { painter->save(); painter->translate(rect.x(),rect.y()); QRect r(0 , 0 , rect.width(), rect.height()); QPainterPath pp; double rr(double(r.height()) / 5.0); pp.addRoundedRect(r,rr,rr); painter->setRenderHint(QPainter::Antialiasing, true); // draw background painter->save(); painter->setPen(Qt::NoPen); if(mode == QIcon::Selected) painter->setBrush(QApplication::palette().color(QPalette::Highlight)); else painter->setBrush(QApplication::palette().color(QPalette::Base)); painter->drawPath(pp); painter->restore(); // end of bg painter->setPen(pen); QRect tr(r); tr.translate(0, (r.height() - m_p.height()) / 2); if(mode == QIcon::Selected) { QImage hm(m_p.toImage().convertToFormat(QImage::Format_Indexed8)); hm.setColorTable(actualSelPalette(hm.colorTable())); painter->setClipPath(pp); painter->drawPixmap(tr, QPixmap::fromImage(hm) , r); painter->drawPath(pp); } else { painter->drawPixmap(tr, m_p , r); painter->drawPath(pp); } if(activatedFont != NotActivated) { painter->setPen(Qt::NoPen); QPainterPath activationPath; double rr2(rr/2.0); activationPath.moveTo(rr, 0); activationPath.cubicTo(rr2,0, 0,rr2, 0,rr); activationPath.lineTo(0,rect.height() - rr); activationPath.cubicTo(0,rect.height() -rr2, rr2,rect.height(), rr,rect.height()); activationPath.closeSubpath(); if(activatedFont == Activated) painter->setBrush(QBrush(activatedColor)); else if(activatedFont == PartlyActivated) painter->setBrush(QBrush(partlyActivatedColor)); painter->drawPath(activationPath); } painter->restore(); } } void FMPreviewIconEngine::addPixmap ( const QPixmap & pixmap, QIcon::Mode mode, QIcon::State state ) { m_p = pixmap; } FMPreviewModel::FMPreviewModel( QObject * pa , FMPreviewView * wPa, QList db ) : QAbstractListModel(pa) , m_view(wPa), base(db) { familyMode = false; QSettings settings; styleTooltipName = settings.value("Preview/StyleTooltipName","font-weight:bold;").toString(); styleTooltipPath = settings.value("Preview/StyleTooltipPath","font-weight:normal;font-size:small;").toString(); styleTooltipTags = settings.value("Preview/StyleTooltipTags","text-align:right;font-weight:normal;font-size:small;font-style:italic;").toString(); settings.setValue("Preview/StyleTooltipName", styleTooltipName); settings.setValue("Preview/StyleTooltipPath", styleTooltipPath); settings.setValue("Preview/StyleTooltipTags", styleTooltipTags); } QVariant FMPreviewModel::data(const QModelIndex & index, int role) const { if(!index.isValid()) return QVariant(); int row = index.row(); // qDebug()<<"D"<getFilteredFonts(true).at(row); else fit = base.at(row); if(!fit) return QVariant(); QColor bgColor(QApplication::palette().color(QPalette::Base)); QColor fgColor(QApplication::palette().color(QPalette::Text)); int width(m_view->getUsedWidth()); if(role == Qt::DisplayRole) { if( typotek::getInstance()->getPreviewSubtitled() ) return fit->fancyName() ; else return QVariant(); } else if(role == Qt::DecorationRole) { QString word; if(specString.isEmpty()) word = typotek::getInstance()->word(fit); else word = typotek::getInstance()->word(fit, specString); QPixmap im(fit->oneLinePreviewPixmap(word,fgColor, bgColor, width ) ); FMPreviewIconEngine * pie(new FMPreviewIconEngine); if(!familyMode) pie->setActivation(fit->isActivated() ? FMPreviewIconEngine::Activated : FMPreviewIconEngine::NotActivated); else { bool hasActive(false); bool hasNotActive(false); foreach(FontItem * f, FMFontDb::DB()->FamilySet(fit->family())) { if(f->isActivated()) hasActive = true; else hasNotActive = true; if(hasActive && hasNotActive) break; } if(hasNotActive && hasActive) pie->setActivation(FMPreviewIconEngine::PartlyActivated); else { pie->setActivation(hasActive ? FMPreviewIconEngine::Activated : FMPreviewIconEngine::NotActivated); } } QIcon ic( pie ); ic.addPixmap(im); return ic; } else if(role == Qt::ToolTipRole) { if(familyMode) { QList fam(FMFontDb::DB()->FamilySet(fit->family())); QString sRet; sRet+= "
" + fit->family() + " ("+QString::number(fam.count())+")
"; sRet+= "
" + fit->tags().join(QString(", ")) + "
"; foreach(FontItem* ffi, fam) { sRet += "
" + ffi->variant() + "
"; } return sRet; } if(typotek::getInstance()->getPreviewSubtitled()) { return QString("
" + fit->path() + "
"); } else { QString complete; complete += "
" + fit->fancyName() + "
"; complete += "\n"; complete += "
" + fit->path() + "
"; return complete; } } else if(role == PathRole) { return fit->path(); } // fall back return QVariant(); } Qt::ItemFlags FMPreviewModel::flags(const QModelIndex & index) const { return (Qt::ItemIsEnabled | Qt::ItemIsSelectable); } int FMPreviewModel::rowCount(const QModelIndex & parent) const { if(parent.isValid() || !typotek::getInstance()->getTheMainView()) return 0; int cl(0); if(base.isEmpty()) cl = FMFontDb::DB()->getFilteredFonts(true).count(); else cl = base.count(); return cl; } void FMPreviewModel::dataChanged() { QAbstractItemModel::dataChanged(index(0),index(rowCount(QModelIndex()) - 1)); m_view->updateLayout(); emit layoutChanged (); } void FMPreviewModel::resetBase(QListdb) { base = db; dataChanged(); } QList FMPreviewModel::getBase() { if(base.isEmpty()) return FMFontDb::DB()->getFilteredFonts(true); else return base; } FMPreviewView::FMPreviewView(QWidget * parent): QListView(parent), columns(1) { dragFlag = false; setDragEnabled(true); setDragDropMode(QAbstractItemView::DragDrop); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setSelectionRectVisible(false); } bool FMPreviewView::moveTo(const QString &fname) { QList fl(reinterpret_cast(model())->getBase()); QString uname(fname.toUpper()); const int fl_count(fl.count()); int rFont(fl_count); for(int i(0); i < fl_count ; ++i) { QString pname(fl[i]->fancyName().toUpper()); pname.truncate(uname.count()); if(uname == pname) { rFont = i; break; } } if(rFont != fl_count) { QAbstractListModel *mod(reinterpret_cast(model())); QModelIndex mi(mod->index(rFont)); if(mi.isValid()) { selectionModel()->setCurrentIndex(mi, QItemSelectionModel::ClearAndSelect); // scrollTo ( mi ); return true; } } return false; } void FMPreviewView::resizeEvent(QResizeEvent * event) { int actualWidth(width() - 20); // if we use the viewport size, it becomes funny when a resize shows/hides the scrollbar setSpacing(0); int gHeight(2.0 * typotek::getInstance()->getPreviewSize() * typotek::getInstance()->getDpiY() / 72.0); qDebug()<< "VW" << actualWidth<width()<< "S" <button() == Qt::LeftButton) { startDragPoint = event->pos(); dragFlag = false; // const QModelIndex idx ( indexAt(startDragPoint) ); // if(idx.isValid()) // emit pressed(idx); } QListView::mousePressEvent(event); } void FMPreviewView::mouseMoveEvent(QMouseEvent * event) { if(!(event->modifiers().testFlag( Qt::ControlModifier ))) return; if (!(event->buttons() & Qt::LeftButton)) return; if ((event->pos() - startDragPoint).manhattanLength() < QApplication::startDragDistance()) return; FMPreviewModel * m(reinterpret_cast(model())); if(m && m->getFamilyMode()) return; // Create a window with the current preview if(currentIndex().isValid() && (!dragFlag)) { dragFlag = true; // FontItem * sf(typotek::getInstance()->getSelectedFont()); QModelIndex idx = indexAt(startDragPoint); QString fname = idx.data(FMPreviewModel::PathRole).toString(); if(!fname.isEmpty()) { FontItem * sf(FMFontDb::DB()->Font(fname)); if(sf) FMFloatingPreview::create(sf, QRect(event->globalPos(), QSize(width() ,1) )); } } } void FMPreviewView::keyPressEvent(QKeyEvent *event) { qDebug()<<"FMPreviewView::keyPressEvent"<text().isEmpty()) && (event->text().at(0).isLetterOrNumber())) emit keyPressed(event->text()); else QListView::keyPressEvent(event); } void FMPreviewView::updateLayout() { update(); } void FMPreviewView::setCurrentFont(const QString & name) { QList fl(reinterpret_cast(model())->getBase()); const int fl_count(fl.count()); int rFont(fl_count); for(int i(0); i < fl_count ; ++i) { if(fl[i]->path() == name) { rFont = i; break; } } if(rFont != fl_count) { QAbstractListModel *mod(reinterpret_cast(model())); QModelIndex mi(mod->index(rFont)); if(mi.isValid()) { selectionModel()->setCurrentIndex(mi, QItemSelectionModel::ClearAndSelect); // scrollTo ( mi ); } } } fontmatrix-0.6.0+svn20110930/src/graphic-resources/0000755000175000017500000000000011641435631020550 5ustar malexmalexfontmatrix-0.6.0+svn20110930/src/graphic-resources/fontmatrix-import-icon.png0000644000175000017500000000137310722327600025706 0ustar malexmalexPNG  IHDRasBIT|d pHYstt+AEtEXtSoftwarewww.inkscape.org<xIDAT8}KSa?;;Q-3-504lx'W@".+5$͑[AIm1u;Ӆil_x}y?|x^ݨٜn\ |YϚk8IZ.-zuhwǢ.&ts⡰_S)nD5#5D)hwuclfuK1Oz{:׳q&ۡ0{|j.(Jq]R ˙z[]|dHm%(ߌ5j,Y͇0YjIⰕ9GKw;-?#ŏIiD*x96'8H Hm0 X6VۙA" `L&CѥF,ȊbHDϽ^ cZuD7qAp5JK[X zYAhvw)) If6w1 yQ&l2n}Fٛ@0 sjimm " (VUEɫ]<=lȲɔ:Y:;KC 8 x8009!.{8h^>W/G 47SB `rRpx-6 7V|L̎A B > ЙQ)`jpl`#6aK0qD<4-ja ,C\, LHB$ωv) 53=MKtqq;j 0 /Bc1}\'C(f E:΢``d ;!B!h`A8?| MP#IA(Rsh1aIU;Ru="[7kWĪb5&X}VX.,(`ձXc!VYWߛ= x4 (@$x@@j9HMI0JG$CֱdUe/oo@i [h&_HKap@f^1PM#0p7$C:dC>C)P m  -^$<,2#B@vF$9DF sqAH8$")G"'&A;(B搯APTDPmEP4݉~ C[nF< #QhcL1La*1uvL/f3,`~bXv,Zaݱ؝ l (ۍĎa_8FNyqɸ|\%4 w7[\x) —kg}Q4@%  !O8Bh%\'<"VHtttt>tt9ttt}[gץwO?@ :(E'#*b;&D%鐜ITRtt4E `ǐȰ CsoF> o0f\ebgRdf adffzY٘99<zIS KK5KS*1%ͬwXglll!lll7ئ1b{OdsHqXsDrsqp,rqszppVs^pIrYsEsZ6.n~ĽcSs /ל7"Oϙ/8M~~=`"N.z{?-\2&4'.l L.I6&GȃE+D"#"R9gE'Ĉbbabbb-/$%%"$K IHJIzJH^⑲Jjz%(m(SN ^F[&JF,*!![-@Ӕȍuc*0(+$)(L)r))(^T$T4KYC9ZK6^ժ,2.-˩WaQ1IlלڮuL6vmN _fIm vj۴>E` ICCa[#1Fe#[?(LLVLuMwa,͊F͏hX԰eg*zj-hldhefЖ[;Y;]=jocCEGpv<8$3ɹKː+kk벛~M+f垓^J^ޗ|>>}~Op59x~;nGJGuб`!F!!sfEFTF,PMGKV+QQg=le!#eh\\~Nݝv.lixK  q  V=ϧĦKM-Lfְ +x@Hzvn'3L̙,ˬlbvT{< fNY3)T+y&dK`VSS@%eկaYۥvgs>vl8}ąc]]EHwjň/ v]V|ȕꫜW\#^˽u=7n<ti{-[7ֿ}w/kwӸu_~׈H<6z1[?qx2:>g!fG?_zbe+ܫ ȼ9;9yul[׷/ſۘ}Y+ss?~__g}8D[Zۙ~8xRʻSКڇ Fզf/_b(4 ` z!7`0 ` 1P3 ҍeL?6 G}wIˌJLaX1l8ָ|S)"FMdhXxR2Lr ^aJ Y*jkhhPu,)s19kY[,^Zߴ9g[cWl@uuw6vrUrr'{xr{qzspr JmWhۇx%G6FFݏYA#Ԥ'%%5&_Ky: I-aS:5jW{ ׋I%o;P,`ME硻Ӈ7Uv:SSrΉ:zS ij4Bjoo9\{΅ .nK{z;.߽2yu:O_~@M[C]5ֻt<<`G'G<yJtYc/^:LLl2zۍgO`1+>8:߷/c߾|~5M`Q0*Thً= tD~.%VeH6y.)n?Rk|Bvd08$]9R992{d3v˧(T WQQVVëͪhVAu6nן7b(Xc2nlaf!g|euN[;5{nM9n4 WO3/Moi>_-3/otׅ -^G͍̋*.)Qwfg'JPX뤹FřN-e'(7*/1?d†%cf*Un<2qtsqZuꯞzڰtQɪ9m}Tkgst3_4S{UkףJ;Fo|I%>n{G.?zh鱏o>>'x)Ja뛨©3r>TH7]ykx),?|V4_Z_4u|k P ?d@|Bt d E107؟LB7LN"03&11PX 9d899s=n#pX0XHIhMx_KTTtN]<^BKbEKjL7ZykE EJ/,I jTԼh|e"d'eu-wKxMEYW,#Nn:d 6 px X dRt #S3~sm]} .aiu7wE0\: .(A7Be|ESW1 qb;CiKzIRiv+deg;\+/,,GTCʱG^?YSsq6'WJеG7nHËctO6<_x%{2mY?Q[|5M_[[ jQP' €H"ƈ?T"Qd eEUQw4Eo_0|KL23ea 8,W{ŇLh lyНO"H jWl&i,DVSivy'rϹ u?u# ,6 ϐEbDEԓbz/'S-")FiPYT5Y-PJCUS@^kY{Fg\m  N7v]3xa9oˆV>!ͱʩyeō]#3׫{租Cσ!-a"ԀȚ71bqk4҄$䔛il[wfeeOM*Yx$ve++*-?zYH߉uy }gB{[ENtԜtttJ5>]7sp}yC赱'㷞Žy?A}:6Lׇ9 >/K_Z[ysϺЯ-BhaE$ En" (jƢч< scp";1$G&{}^RH^X2]u[ ?ry+}?m'x9KW־-05U@LpI6˶붶60oKӄ pHYs  tIME9IDATHǽ͋QqCSS(MRde_(MM&)$dAJycs{S<|||cmu@؎41E1cX+-lͯ/` Td]ߥo=~dA7c-j2,8į Ч\c|u½ncRw4p) v;~Ҽ\" l(tїWbBevWqk*Dr,.`x3 ԭGF7{T6Y[`J3HE&rIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/about-vectors.svg0000644000175000017500000004006510722327600024066 0ustar malexmalex image/svg+xml FontMatrix application icon 13.11.2007. Vladimir Savic Pierre Marchand ont atrix fontmatrix-0.6.0+svn20110930/src/graphic-resources/template_oneline.xml0000644000175000017500000000251011146310671024610 0ustar malexmalex fontmatrix-0.6.0+svn20110930/src/graphic-resources/template_oneline.png0000644000175000017500000011416411035402412024575 0ustar malexmalexPNG  IHDR S/S IDATx\Tվ&%1PS8!K<T@<@^sΙm0a(Sԣtg(=G806WftnS=z׼b}n7ܖLSN-]A qkkkhhذabL&SGGGlll?BT񑆠<___CBB+//w݂ ,^/SkjjΝ{ ߽lذcǎMJJ>b!= ]|jqg2 jbp`0lڴ)$$ʂ^{ ֭s8ک<ϋoad3gN=CTȥO@.ר3ZmmmjZ\۷233Ok.\ӧsp8_xh<,477#GΔn-VRTd2uttܶ}B͆t_1 (# _f ց+`YrƧNޝd*ݮP(y~M&￟_'G A7t9N7o޼ڲm۶1Ayj^x 888X, AV7Ogf4  (p8Ϛۋ q_=!F;dVl6x<)&00eܾbw'lzJJ ֆ9B4CܺGsu\zmr佸VXm1n7KlutO1DHGQ70Iu\rˤt:q|Z\\l0n`,ۍkZ ֯__{VVڛLBB ޫT*Y Q*H,%%%) L&1vqj? PXX'A܄H$""0!Nm۶pz F J斖N2AoI&@SSdeeEGGg[l~-3Y~J_z>?{,Ν;v@zzzRRҹs 0}AM.Z[[ yyyIII.eԨQ?CoT̪! A***8Lgq"ee#{z f@^^F9}4Qq8~8̛7O\c`رvAR2o7ȎbZYWWx!"w_]:HJJ_f 8zp;;ȣc8| ̝}=w7/ nB$"L:3g@ZZ`hll#wǏ9F,_\9NwvvB/GX8N;wB9θ80}`ܹfݍ9s 8͉'X=L8zг9sꫯB@r}'A܄HD^ċ1:;;Ǥ>zץAb&XUyynEEEuww-^'eZ mmmP(A~a엗[V}]6QUUk P^^:}ɓ' ,, ѣ/^M{ F nFnth/@#N@ff&qD<`ܸq#ax֬Y[RamjW*lvcLz׆SN9N8ڠw1VGDD%%1vTXX_L0 :v0"""$$r᳋ILLT\wHĵ"AGPJeVV*rX\v/Zʕt:Qpjuu5.qLan7m6Nl6qr1QɄqv$--yb*҂6k_ٚ\>!!!!Ns}2To ;6 nV|=lJOQɓ'x֏ ).N!y$2)JAAHt @N!H $ :AD A'$A B"ւdg-ʳ>OD2pرlقo޼9##[nrŊW0LjVTT6z>''w{'D:Ԕ0fp88MOOރvڹs^'5M&ݻ1KF?`!6=qq#AܞwAwԩS/^6lł>`h4vuu]pj bdff6'q rB͆Rϟ?sG~z۝ iZlrV3gqySRRXYb`0@BBJ0aGtFA4CK`͘G+W&&&bă A3eeeA<l6322΀V!Vp8֬Yw :Ȍ;vTTTgeeեKl6Bh&L s~'f̘ͥfffn:A>HgKSSK ~-jkk1XgϲFky h`dhܹ399ӓU(%:qV.=zTPo[ZZXmvFZ[[FNS(Xߏ&M円U X "6A":I?ȇ^{-&&fԨQUUULptСG0?rPPЩSgΜٳg9c8V[SSYSSӧŶH=3ZLϋ"Ox Di.<_UUϙ3gNsǎbA.* ?3Vp8ĭG.+""ϣbuVk\ϥ?|ٳN[ZZ8Á6.9Lgg';+7}H N>W\)˗,Y/^t?~ X'FY1\-X1-›o)4MVVV[[͛?x ;v 'cÇJyA0>`(22=;;v A&HdRU}zQ &z1 blQP(ݻw8^_\\6l6o۶ IP-p9θ].^x zת{zzqرclv7--tڴi_;T*Ύq[p ^t:.C\.Wbb">lbb&L0LnPyk44NNND\ Vpe!߿ԩNr \q.jsͦj- JEB\v[,JϖT:Nl-[Fk v  :AAN!H $ :AD A'$A B"AHt @N!n_AX 0}|Kq v-[T.AIOO\?YYYeee ,`FcssF0,X痔'Olmmńy0aBjj*|}}}ll,766K f?1cFRRW( `֭7o8=zmFFac„ sСC) {*CuK8nqq\.]—-[j7Rruu5$&&h %%%h%%%ط. }j\zT,؜f8NTn{ 9ƍiܥm؃cxZ HLRN8Fq׮]jjjpT{96lؐsZ1tZeeeEEEzǏ~jknnv:ϯ=p@iiTo6:@Uf}G`0D'Z,>(33 !yyyVT?C.qK MA&{w{_.? v%?~0[BHKK;p@?n`w}Wd2tZVٜ/1UiiiE3@ojkQǐ3.]2N_3gd2QAHVϜ9ϙ3gJ/%%%ͻ]8:ƌ}ܜ1,,7d2YuuRɉeCCCLL mXGŋi狊~E-&E աs=ދ^뮫.N 󋍍o[ZZO~łZbE`` b3gKY&ORQQP(6n(srrfϞ=jԨ>Evh !@1t t @N!H $ :AD A'$A B"AHt @N!H $ :ATx>ʈ^::::::aeeACC;lhhpxv`.]ap=|A/b| Hp1jԨz ~~~Gm0n8v8n85k&x5 ֥0r= gz"E 틸U $ $ :AD A'$A B"AHt p VjqHde˖^CCCz᫯ѧJ.111UUUP__̇A׈DÑSSS#>ا4+ `04 ;b,6m[AaXxy;(mZkA\'&n{ӦMX^v-BCCg͚>V5<<<<p8>T*B`CF~@@3:u*jutt4/\pӧS?lŤ7qqq6lhjjr8VӸ9;;[|tv#<ӻv2KhhhhhhX`#;wbxIÒ%KPʕJeSSch͓Ç<{A  F ,$''3]/cccBBB.]z{ʕ+{ggcĉb}U4aaacr]wʚ1cFlll`` yqq1b!)))!#w8qA--g}3BCCQ͗-[6k,=F~>#PT@'!Gj- %%E&aE (V=1g®]x͛7 p:QR)lFFF.Z~-. ~0=cƌ?δiӰm67n܈31 ???MbaaUVW>}4|w٬/ILLda+#JrP>1&\.7L(+/\.B'{333q*oNqMdӌMMMǩjҥKsJF#G?wygtt4t:J%G&c,IIIw}蓉'CT.[ }M||<ϟ?ORRRAA"9E^YAfs"##ـ2}tugV#GD1eϪ5]]]Æ f`vׂ d2YMMMhhhPP ]]]wygTTTPP/͍;i1>$%%a[.FĝN+..p?7gϞe}r>466bp@"A'!//"ܐuQQFª(Ni\1GFJ`0(%e>瓚uFG篸} CN!(B!H $ :AD A'$A B"AHt @N!2vXYYmnwzz:k7KWa0>{\EЋ*E RЍ5ꩧ²QFy77f͚3a k7KWa0>{ "EЋq@{AHAHt @N!H $ :AD A'$A B"AHnFc4oGWnygV(K,񉌌,((N'x"44Hф7Fq؟6m%D|ԨQSLIMMʺN] K.---}cbb~MAVqqqmmmc[Z999 ߳g!o^:nܸb\~_Q Ň^I܉!IFӧFa. OVVV&''cfiZv].Wbb"'&&2{<.a%s$--秤8NvfٲewUVVʼnt:q_y dVVVuu54 W zJJJ&nZ3N3%%ey>3.8Zsa+b{dDӱWLV{$=HOO͆===SL2eJpp0;qjjjrrr.]d26nmSTTd47nh4z=訨2tټk׮b>`0<3:8e\L&Biiǽ6l6'%% Ѻ`ޗ<"͋3f?؈ݨ(F~M4GF޽{/_|^WW7gΜ~Լp?Ǐp8#YoBBB`ժUDvVTT$4u{Axw} `֝f'n+$+NS|XSSnݺu I&swX\tRLLXYffC[z5;?mڴٌ>>>p]2mmm.]ihhKCJKK5 q)))FcDD4]Pf6iҤJOKK߅P[[=GÇrRY__/ !!A&=:555//ڛ&4]6|4x%ǎ**8b}D8hL&S?cBa4U*8*j߾}6mCΊ xT?` ɓޗ`ݺu8M .]:rɓ7n܈C`LV\\lX|}}!oV\/+8iuuub{|6!6lxf_[[[LLLSS_NsƍI뷠 i ͛ <Nnܸ<~HV^mXwX_xјYf u!HjRtϞ=Ǐ?x`EEEffxFss3ζ]paҥ'ym?̙3gΜXeQQQV”k׮ŵ+%+W|gw!˧Ov=++KѠ.x?Bzz7||骪*V'j*l qșvvvnٲjh/go~h"E|????O.kcƌYhQ[[[vv6?oSboܸqa|ppN yw<$$$dee6%%ڳgOaa!Ωz>38 Ojkk|ML&ޱcG?Ȃ DEEiZ|eÇӌ n+7ڇ!@O?9s'''W ]w݅W_-\رcCCC_}UzѣG{|~gׯ_T*;<<ߕ\.?z믿>iҤ\hV?'O'MQ[[;y%K` ===?C=̞=,˦M{'xl6?3111Xgww  .d,uwwVVViiik֬XC7$ B"H3NqBN!H $ :AD A'$A B"AHt @N!H $ :AD A' SYYKGGGGG;6HCCNOOt}u* g3zC34UDQF=SX]Q ƍ1 ĬY0s<'`.]a7>ӋA/bh_ĭN!(N!H $ :AD A'$A B"KAV+7 ~%$ԩSUUUXx⮱͛7_4668p=T{=bl :BMčS!'!! rf]c˖-e˖ n`0{ZVRRv?/eXSATH-[1O?tRARSS7l$&&'&&ioۗ/_>&u>)%%ePMFʹZ`k&Ej~9V8nDznxx*tvv׋? F_~-YUxu^t6- 7Vx盛<?h7-AzC>wxfj qnɄe ׳>Q*Nv'$$C7A.'$$(JHLLt\Zb ţ1Fa -Vr4 hZ\yyyhq8hq\uu53O2337|dltoᅱAčBjJJJJJJ0t:9h4nrJ:N&ZvjOB~~>{866/)JP].\.g,Pd!hnX'Dhd%]RRׯ_'lRZZ ;wdZlq]Z/>>>>>:E~mHJJ0HNN~G?$A:;;Q}EV}>w^=1c q"zK'O^pY|X,]422y񲐁m"""f~}vb+93/`رTP( `ʕj>ÌK* \f͚bӹk׮.B m6ؾ}B/'VG₎n:^/BQQџgLtu>m>a{ァ~Zܨ鬫8svÇŕ`?/]tAá銋?> sN:UWWǚ3.+22RPZ[[8k`E_oo~&3go~xh4Ν۹s'E2y DjQQQ۷o9sfrrѣwyw9J`od2͝;v A#A l===)))_~Fc^q t  eA$A B"AHt @N!H $ :AD A' ߘ2vXYYmnwzz:k7KWa0>{\EЋ*E 65jB$pԨQƍcy֬YA<'`.]a7>ӋA/bh_ĭB!(N!H $ :AD A'$A B"AHAa!je/_y{\;p@@@;noA :'ccc񯿆A/^ ۷oF__ .DFF*qW\p!888..n 7vvvkZKƍkhhA7tl]ӧO+k*TM6_Kp)_z]"A HDِ9%%eX!nnnɚؾ}; >~z/ ߧMvՎ]H,,[l„ eee?ANF6d㔔xw::8PTxfiZ\^TTqqxf%$$`ZV՚L&ɔz,???!!!99`0@rrfhb`=---8T*=LJMլ,SRmܸr]aXOtjaaZF,36jeQQRdTė ;N&Lsssnf g٘ 3N';5{{xj`pގnTذ0u6R8s:x)333rr{ rΜ9$q#5Ag̝;vt:P*Y 4%33ɓLyQ=LII +0{\\cL@ќ\VV`6/guVkJ1- 1y IDATx "ē. i=XCMŰW^y[?|ƌd``B/뮅 ?[<|CCCe2ٽ{/)))!!vO:w]```{{;m.\x8y ^ #-ZnݺAAA.];V\ƍ DOfΜ={C=4z#Gz7xcĈ/N:uYf ˗/Ks̹{{zz,KJJ /K/ᥣG?>22/<AHt @N!H $ :AD A'$A B".꒡Hc v{ꩧV6g2{3f`g( v$$ٰa/;pҥKrݞ2{AhZ1ą ¢%o=0lذ+rĉrzn:KGpB||`(//8.((Hŋz o#荍/ qW-ve:0s:שSعsgwj?O> r[= ؽ<<ꇓ'Ohv 籠&Nopظq#;P(5 ݴiZ~ꩧN<9f̘7u8XXlYMMwenc7ʋA{{;6ݺuڵkatL}v, ^ ޿w`qrt:,J9n`HII;wnaa!^MLLĤ̘tzrd(,,d?>//;w.&braٰB$99Vt\Lo ׯ[ֵjlڴ ;wd2aH;ATbh|ql6L j|+VSLZFA"܀[dt ??_.[&$$`j t}Ŋ 8\Xr/(hbap:,fxX~L%=\$0Xv Z͆xɻZA8 ~`<""tAo ˅yD;o,. '/zLl~zq   cڵ+..Mf2ؙ+W޽Cl9 O/2q8#1GZC숈f:ӱXV.Ⓤ+!* B@@<"!4((Xf2KePwZ[[ࡇ&h3c1NT@ j<χ~Ǐ)S8~ۣE"ҥKMeTT4L "IMA'v<ϳ޽{@R:R;c?l6_? tTU0:[bX[[+.V DBְ0yj6G>ڧ닊ǓWL&hd\<ֆOaZϟu{@.777kk׮ &f -:99YP={~)r:v}{q:2[׿rrrݽaʼ<$TćO~)zS-Z4AW| T%4&]gqƈ1Y~}3Ņ Dc腅 8EfFuuu=ݜu>9\{|𐐐ZV{9Ώ9R\WPEsk֬8q7|sܹÇT*􎎎3gΌ92;;{.\9s&Vۍ7n6((`0ۂ >[d ] [ t @N!H $ :AD A'$A B"AH9:^.ng[?[hpBXXxkߡy烂oܶmCaŊk׮q")AOII-gܫtA` '<n/]q:R__m2~AnPѣGy'A'[I z[[[BBBzz:^z+V0dޠ*y7 FI͡w3tO>;A-qrBqС!AtDCAؼy_|Fh~g(d2Y,\_?PSSSUU?0f"BCCA0 T*K/PPPb0Y 6|%%%ѩSfdd\":#IQ;00P|{ūV3fwܡ RWWז-[rrrNTxTM6mڴI`\^bm.\ncLL =0ϊ;`hVyJИ<\^YYWYYi6N=ĔlsX ܹs8p% O#GN.~m۶.X`ڵӇNT*[uwwRjpf&;;)++3LVź("? vto+qqrrŋ@P`9fVUa #AEkH? JQ]|7Pv[w'/^/,8*ˎ=tY웣1b pn@@@zzB“y'Oҷf͚'xʕ+%33_###YHؤGϝ;...\cnC `ZY_#33u*..޳gπ6oެbcc_5͑cƌe˖?~ѸmÆqr92<11l6?Z 8b***˯\" +**p @A<$NAAt @NH x :AO A' $A< 'w;ꫯҺ]\sE\.ɒ{4^ͽٶmۍ7(~{g֯_Ϧ&A/,,,//25 `M9ranIoyתْ}ذf͚Zv7&&|&?!L>Wnj+..U‘ĝ;wޮ2fggWWW+ r̙Eu}+V xHO2 ԩSǏ ={6F!t:l߾}b!88ã-ܶm[ssH$JMMe2MMM!!!mmm _t֬Y~~~]o'%%]~fvI`cC0Mb B, kgDj-ZjnݺIT*Z,91XHd P(Μ9cm|||NN&0L{kj5HLLZ׮]|"sedP*بbacbb6l؀ΨT[Zf7'':s}T*Q*P\\kOBBD_7AWwRZZjZ333`ƍhqFHOO]T7Z.Պ[rM.E,gff&<@&S[3RSS]5pT`U*bE*^ jۚ0a[~[[l6c&_{WgP gh@ XddR(%%%0̌3BBBzJJJRivvvHHf:펠 Xh503999ƍRw޳gΝ;vOs徾qqq|w$vᛠw jq} 6m@JJ1@.i4,… Q{F̙3} (:իWZ*55b`Ax.C B  Fa;v`֬Ylm0|pؾ}L&J  hiiem81%%eĈ6\>0Jeyy9VGСCba[A.mnniӦ ݻw˗oy:A1:gt7˅ɓ'b9w+--s3cMMM=** be'мx A3ׯ_k{5$A!ŋ1m4Rsx!A' ,bdyȿ\h4Gb\S__霝cccfɩ=,,At^Scҡtbl 111 =<<wR TUU]z188j;Xc}fl6c'WMRպ75MuuX,.../++c5f30=o6Z͛7oذ-[Q__w|j4Tʽh6W[hsymX|U ENNP(dϭG0 ,,-{r_ٶm.'w4AD3[wDg𩩩*J,[;2c.M䌌 VFd2Ylj0]5<:16nWTTp=ąι@BB}܋^ Tjs {.n\SݙJR8wbbTjT*EM&k!y!Efsff[SSӗ_~iX E^^իh4&%%a/~wL`t777HJJ⦅ 8>. ;;׳bS?O>:555III6D,u`0XVX`cػޥ, lݪ*]r|TlܸO:t&i=;@g0} ͛771=h.KbbbjjhHKK0٘>X,~ rnqqqy`ҥaaan:G ټvܻ]= IO?lgOzzZl^^^  P3A<$MY|||ᅦXZv<Ǐz]hznnnqqqhhh^^^xx8.f=d2KΥ;MW ""b֬Y]6h0bbb"""l111۷o_|90 {IRflwǎbx֭=-qrr;eee iii,RQQQLL ̞=[,/Y$22MJ#{^e l¯6l:550v_KjC]+g&Iqq17%MKK???LU 6755a7ܾxڭJA-H$cQM`885=} jбzZZvgcz IDATܹ@ܿaBM&;XBx. `LY,sS5|Q;t+GGD&D",g_MM fQ0&iFQ=gƍ6ϡ;9`0l$$$ۏW+ ƍUV%W6~aAACDfE6a6kkkCCC/J5oٲ> H0uuŊ8J vJ"dza&!H0jdu%3f̐J[lIKKcX5رcf~*-Zd4srTj4 ^ :_~zģǃ~CvMyTTHҜHpjJڣM[O=|I׮,7T s_5NC ^hM_>3իW `Ѓ T*c 'Mڼ*YWbXVd2YNd8w$##æDHKK: '߇}ڵk^^^6sF믿={uܹܾkps=#G1b[Oc?ikk;v~5ɶ >{%ȑ#o޼yƍQFedd+gϞsqqA3P,JQF{yyI$~ gd+Wxzz&$$X¦ѧ~zʔ)O>իWx yT^nh޼y źF2dȐ!CFQF3 ~Syyy͜9sȑVqСsΜ9Ϟ@ 3fСCOWWב#Gsk {ꩧ.]3DFF_==@) xcAH x :AO A' $A< 'At @NH x :AO A' _q֭\tҥK֭[ pojnJJj{u g{3}34xT{wuuĕ쮧'L86lޥt}KL7n݈ |.AO:AO A' $A< 'At @NH xm|)0c6Zѣ0ʒH$---Of- .]bK.\O4hP\\̚9::Ν;-g[RYYm P(ձ}RZZ*Z[[8011[[iij9hPXZZz%l/\.綒=a„s\ G@PSS(I Xiii6Vm VL&T%==jnNN isbaW*6b{D"M+hlٲ.b1j 6p_mZ:tǾ~sC---?;S}lPWWjСCp6X, <6X,JP1QRYs@{{;=\RG]pekX0VoccĈ6cO+5zꩧl[JE`fǎan./^T(AǰryyRܱc_ AD/:88cvppppp28qMw=m4ۃaq|la}NNNR{ F^ }CAqg/UUUϲ&fcW\A'n4Q =<}:u={PǶ+ٚm|Qȉ}EEEG΍yyyuwv1ªÇ-ljkkYGN< =<3xDრcXÆ cGjuQQQhhD"h4Я_?/SRR`:q;PTT4~x^h?~np3tac]clc݁ D+n+aG ޽=Bģ#? 8)΀2;#z5556_v 7]ZZsgbj_w}vSYبw֊=8kb}}hLMMe[M7y(|Ix$''?1gt*d2lB=?7N.=z=]vdnbm4qzNCƍV9Ά䶸{n6m a(}``[1bgJA>>2lĈ" ]}Jģ%& |A@NH x :AO A' $A< 'At @NH x :AO A' ^uN.]t%vw֭nmmjMIIݔz6gt#ghp롻꫸!]WWW{OOOv&Nc7]}1pqqsFЍѷ7QC' C' $A< 'At @NH x :AOgeeKoCYYhZ;Hw,;;]l!2l6ƾ_v`֬YfZ`}fsw٥H{*++mJV^K/q]Z`C.III]bŊ;ACsmmX,ݻwh>>{|˖-jʕ+gK`---=T]]u￷q뵵ӧOg]Bgti޽O?%xХ?qs_nIZZ+舷wZZpܹsPjLnXpC]=>}zN 0 nc;p}ֲ-dXw.qCW^ō̊R)ޑkw>u@A&N A X,޺u7wa2`ɬ3|<?!;| L:uڵ8pcƌ܌qf48~X,vttNaÆT* c_3t4l\rttĈo /z޻TYYyiGGǧ~.pΜ9_/^|ѣG{YA}_^vmii)p(a]vڵ ZɆ_l?665Cg(9!!~iII \vs}ܹv:v> ;wLLLdsiϞ={a6̙3'66677wܗlA%<tEfdd?1FjAAA.Ft:D"։vO!c%D,Ě1,^ƥvfCTyy9wrʕ+٦y؃gԄqK[?Oظ`N P< GA>B(((Dכg=ztPPX,y&k9nܸAa_6@XXXii)# srrpť-_\T:8&#kii)ocͣGf ۓFuIP>}-D qttÇGgË^x\"lܸq„ 6.؟,?%n(_P9H$  4ڢ=<< NrtFDCI xfAn!A' $A< 'At @NH x :AO A' $A< /X{֭[C;tҥKݭ[ֲV5%%wSRRVܮKw`> FЍ+Fm,ꫯ6fawqpOOOv&Nk6 v]>ť}A7nDވGZ> 'P 'At @NH x :AO A' $VԄ:Et:nI}}M A?CV=zѣG? <8666ZZZz%LR]]8w\{3FaӧOa^.Hz0[fMKK{ll@ 1jjǾ G@PQQb2^7V&33bqfb}KOOԻt`Æ V{6kBaoPSScS} A|DEEn644@xx}k}Ν7ojjڸqСC`}Qnn]{cR w(A3|ԩSFc]](JP?>SaaaBP OJJ:D"\.7zŋPWWggg簰0_Ze'ydl:&&fܸqV+V7|m۶&LN Eii+JeFF 4iR~~R `\&f<@vv6kSVVnhA\2 #"H$qm<<>>iii`0F#6 >>>j}jZV4H(bСCeeex:`϶m}ӸeA :n&zp1bDwiii6mz7)z#龾lh4M6EDDnddM}]|ٺu+ q@@\ZmuuX,NHH`ϝqcq^ZZ,^:O?'ug3d?숹m5k888L8z Fqg0 aaayyyxڵk_z%__9s|hz;=;k,4]*>~rg'=ž'?w5Y.}v1bcf~~~AP$&&l%?0.Xwwwuڴi"`0A;0 CӦMS(l[ԩS4 .XJII`P*aaa`4 'rQRYRR /@ee%{A}ǹ==Ɵ $hooaA\:t-[lmm5 +Bf_VT!oe}COXf30wNkii ~LǏwA9|t ZMH x :AO A' $A< 'At @~_immmjj:{,m8xrB,--K-_1 fh4?ҥKe2ٚ5kp[P5m;`&#{Z-fVO<x}vrV+ Z˖-JK3L 6l[7jjjzils닋h555]A >ЅBR*6 }FծZ*++]<ˆZv//>m@.A}OREFF}͛z^ ̜9S"t:x̙ӧO?s:&>}zܸqXš]paQQQ0L~~C&Lf6|(O6 Jh4bj /\d28p 22Z7WYYYWWw??3g={ʕ+K,t|Msssnn.&`ƌZ677j޽ȑ#&)//>㒒77Çϛ7MJJBիWٗ_~SN?WPP`~8l06S`ׯ__t)wP񩧞b=<<Q(O`*! IDAT KJJBrrr ZmttVpG}sÇ?AAA[lh4F;~{qټo>lNWX˗[n„ = }Æ ﳲΝ;~w=#y1>#---00PTڔiꜜ,T6l(-- y/[ #jxiiedd4Wrƍ^aL[v~~L&cO!''\NNNZZZEEt?0WPͭg+ťX8qDĭ6''A`„ ?lj---];;;_xQVcHA*vŋǏG377.m{aFնɓ''M6ׯ_ӟd3}P<Մa7|=Fs0QYB#Ob)((7o^BB` /\jժ'O677GGG̙3g̘1k׮J2::ZR1 s ,rNrvvo^ܼyD"a^|<;;;$$cPD,#a={&6A t0؝j1 \\\bbb͖^^^^UUX^^C3|ގWWW4'봴 VTTܹܹs߼̙e:nժUMMMu**##رc_ȑ#ccc1Ooh4l ,J{0NKK6@_&&&vttB/0`#l*wrr겹+WN0͛b~#/Zv'# ___iӦll6)(A<<'n@@@@QQNc:88Ka뻫066vǎf1 u<쳻v2LXNoa6Vyڵ;w9\///ueeǎjZmm'ܸPiiO<åCp(A v@oٲeqqqGsuu{l+n򨨨S^t #$=؀L$ 0 666((hʔ)qqqf&¶+ CCCz~QFŅ{vllQj!!!׮]6mڹs炃G]^^>h l"""̙|]!^ dz~/ۇ ۡK..|O90 BaaN"{̙3ǏH$857\> C ILLׯ_SOCB.blқ%'O444DDDTWWس^jRe~K==tD"J1o>X|[9za֬Y#JSRR4ػwohh(x矇Ν;~z"H6m4dȐUV[.IF#LtRVxb(((8yb0`ٳ%V5 'Nɓ'4662dDcǎ1 3n8]TTTtD =n:@z%K=:|ܛ7o677/77WP :4++СC˖-YYY&ih4^rw޼y ɓ*o^rWpdTA.mٲի3fkhO 6T(Bj,aO8ꊧ骪\\\RRRz˔ >+L&DFF&cBB[VbjR Rjj555&/ @&a ]ZRbq||>}AɤRL&v԰]э73k`* X,dZ7nツ=$**j9sPTbe˖YVJVu>>% oF@@^ﲓ'N9r$ر;::sO,@UUիW?~u,++x#G;vu Tz۶mpww߻wɓlre__.@htuu]jK]]]ZZZEEhZ__߳gϦc[[[mj103 zTG~~>dřV;ɯjt=nm[b8eONNih)qtfC"##q;155j%/f-BDC/++cM\YYvDWVV:?<~xzz0JR(:ujϞ=>lPPЩS֭[WΔv&=򊓓S_oѣGm_h4mmm=H-Ϙ1O>>pitݻ4ƍʞ|I"b}EoD"\Ե] >\Ba`` *l~'zHUqOaf޼y%%%}.o0l/^d=uI =|)S\GZ?Å _tRDb6f`6lʕ+Qv ꫧ~z޼ya;w^xmƌQQQp>cǎ]renƦbE655L˗/,Y`0@nnxU(C]z`33 cW9;v,H$F: Ü;w%%&&PQQB ,a Hȴiӎ='Ϯn_7W_AQPXPPkر G}}}1m̠fn899n[^zˁ+V$''o߾Aӵ\|z=7?ͬXc}ɒ%Ǐwww?MTь=Sw# P(8q"+&;;{?SGq%Ba]ohooo׭[6Ǐ:uZ?!p?߲d2@]]H$`ɩSvڅ;v[ϡ1chaL|9 Gꜝ 9ܹst…bK3DXdɒW^y#?b0 v]\\$00.>Z688'ADF+VXt) +AOٝYss3}̙QFui3ϰ3{&%%套^JIIyX,斜={ӣZȑ#'d=dm''^x0û48p`II n3 `ڴiUUU=to߾_ *++%\ԩS>}^hQaaao QW=tQ ӽqJHH!ay#'%0DW.S$n1RÙ(!!1kuJ.0сqpڏC&p $yIHH a!v*U:tZRX$p `C'ْ~"%ILBBGFþC#G(9~(V?v* IHHed2X"8upZ ((Wi:^uI&!! kVYgbõmrXɤho/M]]==ض=!aI5d"T_e41{{1I"8X,3-!! kH˲Trr9c|r"^BBYkLJMVe"%<Wxd؄$9ˍ_,s##b$a4ӄT`V}:{ut% G`tvXTJ*, IXb'XCC +Ph'T_f<*8V2)9}cttlI$aIHHš{4bDOfw7f?i)n.{=YI25{"퍟` 靝"ӄeG0 IXgV2)"{яA CL.&\W5}@[ɤH=4$B&{twS5uϪ Jaa ~q1a> $( IX~L0DzQX6ur $.Ipf^|~+/.ڶpNv!?dB6 YQHBB6ݍNXBi)T$,W`n.W (GF00{{:atw 2鴗5OqD*,~em{tXU"ѡ%1p c,TXA{dDdH&DzMAN!s}IH’{^KE>`wtP8|N̮.\$$aIU8(}'B&EQ#fED&S p'pK%! KbvCЬgۢcǎUvɈ4%$aIc&:;EE^9 tx!$ LBBĬ5M6Q _LFqm)OQU[$,9N YX4QL(MP:!!! KlJP?\⸐ ?/ IX<>Q48"=FW)8 #G0{{EZIT$ ٶ RZW(!LF(!l?kv! IXs, 4Ka`X==S8xK/߿;%qM)%B ue#J@m-fLNr"L+eJH%q6PeCCǎ߿}wF8!.h7|Ͳ$DΫ&҂i]]X s$n%~m״_6"mkeaui)K*, ߼PK .}0gB<́V2MUDښ[ 1D'w܁X%9. + KB*--uqpYl?)t jmMC  T 7ik!fѕK6N4<3RQ KbCU,_Nk_4E2qR؃џijmBM&X[El2<5,́p${n!tn•E IX &[:C0GGKJizNx';Cn;}H*jxTů&.x5"P'PKta̡Q vcg8cU9sb{t4i(J@ZjjGF(>S(̈jQG7q29PȲB5(&ьFBk/i"~rV_pk6nN&9gӸ9y;0]׏ "@tRknm$XSof*rlP-) (hQ?kۂr9tsd}p kh'G:d8\]dz,`ScRbh\wFKTQTbjh+{qChUq 54n'XGQCATME BATU75EAXU'lYxNc߿Νd_x܎ lx'CDKbB:P)<(ь u [ 6s#IPTXPSKi#BVlM2,<Lf'J3aIjkEqիZEdJ"Wd[ZqP4P % B/_VSoۙ8.F?g9N^Gsg ;x' j+Ρw;E6 XN2cISx?c}N;ї4 g\N#鋪+"@erjb j4L CK0q"$ kg&W%)HPk+dRf`R9 }DPgy~0*CkQBMu$[M.2 _X &b`>uLvIVUUji!rei{3YL7S\;K],Hpb,G?gVPUTM Jba-M#BlQ]Gg$q\LN,I%BU)E݉\C"Uq"E$h' c cXG€6a "##3btaԋE9>"Du-PCA­MkI_Ij~yq1G°$$΢55;<.q&(F0Z" 4tQ0:Ubjx+%bBiaK)m*ImI’X0llMpZU}5OXzhS3xENH[ u+>.sANa#P[KhRQRmZ]p[ۢO+6532=l:PQ 8WEEd#Zu5LJ%i k<]*KR=TSCd.Rp[0i5%&aSj,6#^R֐ 'f;,TEāj(HdXspn8 $D%NkYCl:ʸiŧB!8؈6C \'GE_bϟ||:NզPC5AI/hxIXHy0yHl82BapВ%6lED]X,CDžidRjwX (,LejK4b(z HzHIX󹟍3W<*%8GFmH|z+VlhXT-5%PUEouƶ ,;ũ!emxg()lƍ/PU[Zq&[Y*Ε-7YQ<&0=8;/ 8&@*pkч5S3keZFl2<M;Ў[0Z&IX<,֮<ig ",UrEX-"G1(j:w[9v2Ɍeh fd[q{ |6HŢ'RUx`}5:B  IDATIX\]fEJ#,EA4b8SM%thŤ A Vji X}$\3 |0*Q|fw$|tȒFU~,b1@S T 6` ucJHb]LQUǚPbGQ2cfayYf<G7(t %vrWQujV$b¿ebzJ@"FdizK}ɇ% KbVW 󄯎a6 Kbol Ǚgm B{/x-!=nHbʫ( ~L%q늌 0OL\G7SXi۠h*j8̙KbSXgxSy>ybLcq ߇VayHMţh~B~-sy"̬+,kxk8-H NZ$D CQ怔%a-BEAQ*Lm5敨԰ ,-.l>IXCVedbj~+ Z$FB3VR"૳Uf-a;v:̲ 畢<\aE҇%!1eҚ'ULcgrؙ, ;qV*94fT8wԢŠwEĤMFZbf0Gs+";$.}X Xey==*ȇtKBbiFRy]r27MBE>aIPBb+pu'Zo1WWP- %aIH,AY*S,UW5B"k$, WTn}EA4`EJd,#%$²}8*JJ%! q,q{e*KQI$aIH̆@8=3}ª,6JATE$, Y5 BT^r*CfXe㙖0 WHWXaIH,pp-wEVE:.ĂWX~ Kנ(b/HH,d²Lʺ7Tu..~਍gWIXa҇%!Q9&qXea ’Xc{ +gIXHZfFkĄ$$$,%URX4 %fMW&Yxfy{Xq"T,1K@P`P6,A3%2&%H̤xqpM4+/6hk#+щ58,ـ`twclPY+:(ZA(cBbdZ\ N&)O@]jϚm -}YX=bwx5kG?*;)0{I?#<yy`r kM0s*),eśl >e꿖c4!̛ w J&ɾcH=f«V]؆ ֯'ֆHގ Y=P: Y kx;!L^϶Xu@%0=;rc*Ea,kx4x$c Xtďߏ8}}v$Jh~\`Cüoϋ# "g|T|g>qn> /FN_Mw/Znى)TW4JstT۷ gu{~n3RpOX/]Uhv, өPl-PUŚȯ{06Klj"H@Cxn~zqM8ԿEk|K;b$鿞?KN\Z8ZUeˈoDlf\@LUT, ۶F(R* jc'rbY$]ٶm> $ nFjkkO޴eYBSO;˖M{U8_җK׾FUU=_Yv-_|1Owf|~z/O{ǽo$bh4'O~/:y@7\w ;_:{7bM=aZy?M@t6Uǹq =n֜,N?#Gy c d2|M<\W /`Yⵯ}-{;`޽p X֭[yƕW^I6n_q};wvZގi vſۿaYq[\v)g24~݈ռS:;|Uu.pa<ɪ&p? X7dyOXmssh9`ۯ_2ك58 9j>y/qWOpuq5pwo~pO|JUXss^ןտeTޮa.^ |[| xo~[f%ct 6O~ kxkn&?f} 7iUʢFX^ٌuj3A3UU qqԈx6l}Dx'~{hiis¿FN|&c㷿-l믿_, kpVxIvbW$TgxyꀞLCK$67[[oقyDV(=S'[N,?|~a,"p bv#,77nOZęط! O p7_~ iiohfER+p/_^@Dw_YFbna߷tA>20#d_|zRԤ_[[{yw5~pRy ;Tcc㤯܏5YhfrĊ"(NЍk6(z{;^"$s﹇fH?4#Gp %K|p۶c8YlC@W`f#e5Lm+ԙ7JOm0Y=Wmu˲g )W?g  -yQ긟t^]-YBtj7߼e{Rv/"?~~5'>p@IMM쇜ǫK7fy묝oFBrš}3gN"Q]ҵm5<:Jntk`;J&iFnnx-CM$ äR)WAUUU|#|䢋.⮻ꫯhl q>X1'rv ,9ɠKЦS8gxN&qidkpȪU[ZաUUF,Yn<;yΝ;Yt)x/Scla'SA_ o1M{P{lD,#*0gLL]<|C_ yN*38rgk dM;4"ST=Gqo|av;F' 66 UD׭#vK}裏rwor9wOM. kgaie] Dօꝋ8h$]z=d#Ƈᯉ·u2|?֯A ^T7C5㘓  W'Zɇؼ~ nyaV.]>i.b(Gy>zk/ꫯ;'gŊ1c4"ɟLh7Ÿ~W+Oy `P&1?nm%f fo/(]y%?~}{׿k_\E?17pDbl4+TxKWߟK_+xZfҦI{]V5ׯDSUtc1XZI$4& ҫժ?z{_vFFGs7l 4Rx6Hģ>.ϟ>ni?=@W0dqdU%p06 1Kc7݌vr{~ty~3O>I~>́Rݭ }W}QiWfMN%SpI^ۙcҝDdq]l,EU*}G##￟G!ka8Up}W{|º`aNMZO{*~⽢I}oHYWLwôx K8Y! TͥݘV47GFۇQ(6=wAt:O|FΛ0@k8cP(nݺuWbΝZjF">YD,N%!f {2)n~=7sL?MBC0Q~5#t)oތi6!g& &SIO62-@`ե\Ƣ'2G4 Q݊JK)i!~"˗֢bh8j,C=sWoロ^>#_Vѯr7 ϟ . gTNڰWK{_\ |[gr,!q4EҺ1z%u]ūhųmCt 'pNMjIǘ=xfk&^hwhn $aRb Qw']XiDD>_d[~s644p9b"kגׇ}뮻t=oy[{aӦM|L&þ}xؾ}d&"{ROs. ^&Y3I@qH6=` AlSZ9>6Y Q <C'lX/²{g/}Oë_7snkǴݬ[=ud 5 UA +ŧ>>sbD۲sv}O4܆XB>^9E߯8Y1&g/bw;R)Zw'+{ "$ 6>6Y\?5}\au<8_oyLlE^wمVIsq=x4K۱ۗG<+ XUޟ~_'..ENAD`XUqja667[y^FxR˗^PK Z"SO=WUvڅp׾w]_2Jat$\1N"TfL?NUO-AZ |$ya mRSfM@ɗmBt:5r57ķ~OGw˶Np5O_+7vO~C{Ra2𚭼mSS{(PloK5W."v55/'z9$?]hi8ª$ Te&N\QD"UI;Gi{[X7Z }gdpg (i8 fo/{,_N@}=: jN܉x/N$%ܬs]u\]te`0GGGGI^hUUjj64Ϝ&QxXooND|K͈q\$N$&]v2Inn2>KeDV&~=՗^ (zCM9NaO Cտ+od!$$a-Zu2MR56۰<@]3 "!!! kPt̗l S8x'Cߏg n/7nbU̳ 8x- Kba`QϰD}]_YCEژP=u]2ML)f+C[sAKr]p-C\~VV?:Vp0W4Pbof.ټ~u!(0_w I"Wl{H*=G8H:K(dV|D¡9'/#Oxk$TYU /Ia"D( }%8~/ȟ̸IBd,ggRExTYlw6y] mS~y׮CKwrx\u_lY?Σ?čxL|wW~*G_o攰[+~n$OȪ8FO~(2m"}YWE|Q=FFY ^_| ۭXXtkϭg{|"+-'9 .?B o|5q!S0z S3EhLO-"/t+viၯs[b n~%*OKSҖzٿR` r#USZT9#YwwdcEBOV3~yӼr\Ǜ>|8ۏ+rMeOQx<6ߛEÝ]d\VR;Mn.A[m.hip7\$)@!Qir]WR$ے(qq߈#jHqC|-9{/jj/A83JYձ?6S7s W;O|O\ڳmdSԦ$]Oz ^9~_PM)&m*{w02Ƿ/%Sv~}#4nIJY#/zIrnƫM!nʏܴMi y׼]itu1|d|wMWg}:~{|߻ 6uT9jhk߈ 4Ǽ^h1~+ϭ_hv=mc37kSKg7)Mۆ=.&}GKsΞzr[+<{klH_jE^s uʌA)2ռKjv6jmc3MYR{8/-e7OFǧG}/_4-^~]Rmo2ЌI=* ϰXq\!TjެgT9O͵+"܅JtG 1jĵo /xUѵ޹- #[D!n<=X,"cp}v&~fnJ6u 8l?wGS 2jg,'Q*"K<'Pu4>K kRuћv9l]ɫX%T@yS_F%gk2 [Qת? <µcIoybtڹR=8,j6eZtWSJģ|?K̳|f]NFhzd\޻?CE}?Ͻz{-kZxD\ʥ_1~zw\k׃Zw-px5@Y^v?ZʤZD*>/xg6l?è_ZlׄgS#a~7> n0Mp'ƑQA{2-|}gMy(~I~) _$![X! ܪ\ _P"ap6Κl{_Oa>}we6Ӈ@4~{ibK7ɘ/>uOl?}aX.%M,ײɟgշOjOnOjKE!, m& '}zM 8Mh iyKFH&cm[E˲T؂;R 9B59J1g29wG F#hZ0sm;niDYs ޻93O94}GNwxyM텊-ߏ"X$*糌\ سs6,P*A@QDٸ,FwLS58z`7zoHo/M`" +!n115`q"S(Qpl#eaRwڷ @Ba-ppz_f]4E|sf}HWx -V.DϲX 3)M1'n"!Rm%uHW;u2L̍+Z"Xb`řeDi|N/t_-BA`-Pв"XFä4qdP!}]Ć u$!+2 *` B {\ٹv@alMӈtuG򶭴犸nuHB0F%$a-('@s]Y\-X %ߥJ!z*IߑZ]tlq9κ,AXG^Wy~b +%͓?{`2Its/}IݾzHEX~C,AX.cٸ8I _Ě`f8E;W41MlHwd`LWIz=F+s\ %%\cs"sc7lR^7G(= B -uVDqfKD/be"VH4W Ԗ@ ЂAZl,A<ŋ8% 4zoP/>id\p m/A/%B#jee,Fu)ۆh;h.@@MiPK68C8"Nuˢ49C(@7z&"vmPmgb LKn -Bu]czk>K &b]wڿpP4:D ,!%庸eP(f0f %Ě[E&Ԗ JԦТH uT+.N`fN%ԑ"E|f;7>Dl_C`s` -*V]Xf@4 ,V6S4p H@$ ֔QK8xrɑzo}[Dl%y6?/! M*eǵmJW(M͐ h`\`<޻ Xm„j,AB`" 4ls>K$NY\Bz-B󽰀F%3S4%B+8.nɀ1] %5дEAXskmi,AVUI@^ "X "X ` ` ` % % %   "X "X "X ` ` ` % %<LIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/font-class.png0000644000175000017500000000072111176610725023331 0ustar malexmalexPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<NIDAT8ұkSQOCts eq?]cA.*ХuJhW|yrwg%"lzqcA·J Evw 6pq}*U~wx"߮'p֖t9c?|nV{v֏LAY;(LD܍_i2HjTc*RQó&-6B|WZj> ?Mz\g.>!5# 43D gq7)}k~IENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/info.css0000644000175000017500000000434011444417016022214 0ustar malexmalex/* Informations (Fontmatrix) base style */ *{ border:0; margin:0; padding:0; font-family: sans-serif; } body{ background-color : #fefefe; } #file { display:none; /* text-align:right; background-color : #ddd; color : #333; font-family : monospace; font-size : 10pt;*/ } #general{ position: absolute; top: 142px; width:620px; /* background-color:green; */ } .encodingcurrent{ font-weight:bold; } .infoblock { clear:both; } .infoblock:hover .langundefined { border-left : 1pt solid red ; color:black; } .infoblock:hover .infoname { color:red; } .infoname { text-align:right; background-color : #fefefe; color:#333; float : left; font-size : 8pt; font-weight : bold; width : 180px; height:6pt; } .overflow{ cursor: pointer; color:#666; } .unfolded{ color: #333; } .langundefined { color: #444; background-color : #fefefe; margin-left : 186px; border-left : 1pt solid gray ; padding-bottom:9pt; padding-left: 6pt; font-size : 8pt; line-height : 12pt; overflow:hidden; } #panose_block { position: absolute; top: 142px; left: 490px; width: 300px; } #panoselabel{ font-size:12pt; } .panose_name { float:left; text-align:left; font-size : 8pt; /* padding-left:8pt; */ color : #aaa; padding-right:4pt; } .panose_desc { text-align:left; font-size:8pt; color:#333; } #langblock{ position: absolute; top:322px; left: 550px; width: 300px; } .langblockname { font-size:12pt; } #langblock ul{ list-style-type:none } #langblock ul li{ /* font-style:italic; */ font-size:8pt; color:#666; /* padding-left:8pt; */ } #langblock ul li:hover{ color:#222; } #fstype { /* margin-top:24pt; */ position:fixed; bottom:0; width:400px; padding-right:200px; background-color:#fff; } #fstype > div{ margin:4pt 0; padding:2pt 0 2pt 2pt; border-left:6pt solid black; } .fsname { float:left; padding-right: 9pt; font-weight:bold; line-height:9pt; font-size:12pt; } .fsdesc{ line-height:8pt; /* font-style:italic; */ font-size:7pt; /* font-family:serif; */ } #previewblock{ text-align:center; width:800px; } svg{ /* margin-left: 182px;*/ margin-bottom:62px; padding:1% 1% 0 1%; border-bottom:1px solid black; } fontmatrix-0.6.0+svn20110930/src/graphic-resources/welcome.png0000644000175000017500000001313411001761412022700 0ustar malexmalexPNG  IHDR,RUsRGBbKGD pHYs  tIME$ktEXtCommentCreated with GIMPWIDATxy|-$@)䐫Px/*{R/j_/Kk9Fn,V W(c+ٝgv7Ɇ.ٙg>㎟KڼZ6{"[ 7ΝslmPzb{:< * VN 'ӵkRST)ΝRa4lY sЂO? cL&'CIOg+{FkX X5R(Y;w-,SU ܇V-ZVٷo9`²`'wp[d 'V+x`@E0q\`~EƧiH(.\@`aٳ#=8_"V\Hְ e!_BGm/KOsЬWJ+JC!!qHV2Nn̙/4v+?־}C9qw<-[`n k./((NT J:P[֣oaokvq=iR zn߾PucXվ:;__ME<,0v, xNg[;%;tZvgg`;gr2RNt=^=ԩ͝ \Q^KdWЇotw^1gtiH[ j{ɓ?T<Z7s&0쁱~=u``yt|Wھ]~êWod?ɭP\ƿmO˹zUDnӡn}PsN!mEw!G+͚uG`YyyR<{wWa%ALAWP\10sr>=bH\&܍U;x1~ÈݻQԧ7o"7#0j+ -Z$=.=gUtv#G 'acW޽(I|-+ݿM-})!1mwߍ!U|/ֱc(zO%K#oU2=װǎ!8a\@L}V7  ]eV# Mc| 0%J.r2w@bƜ9W{;֎hi"LHN.tl^Cp8_^UDv۞H|zX.%W"𳟅])Sp!D01IjVԴ4 Οw=JP;vڵ++ɂRЛoˠX1VD ﰉC`,Z3~?ġCLaajUƌq %y qB܆u $_xY>d:ulO#8~<%K>p:pB"p:~ѣ6́gĈ{{ɡX|5,s +W">kV\3'L31 );v;n\ jZ|3f@IM|akMҋ9g {ǫ}ֽ;| "!\ӧ[ JrWjJƹhzڎ˗RP[?TI~ش}{fXUT]n=,!l!Vi؞pŰ6m$&+*iiP33ƌrm[$X| B mY@8kɄ>!w*UΩN'|=z5 =(fd@nݤBX{B{{_?P۷R6Ĺs0C23egp54 !L+T.0 y32Ww ,j%2A S#>xkԞs@Kq"wAQRsj+yqѾп%]^%CJooڴauiQ I-YV7GHz->j4ii&'V@r^Aʂ͜ q㸴DlÒ {o23$hWl|-dbT PU\d4vwߗkm@mrowȟi߾ҁHIX;w1ujLM!tK) aCmIJa~Pa>aھ%DKo^-Ֆ-~#uaClsa r}7cLj'f"fn$]7Q )q?YV ȈϗZK훶8vL{7i'j.! (]F'ӕ^@>b?)Vi8hm*$ECz;tZnqkgag@Wjz@~ d瞑dcϗ mnz2B7I.g q;Da!<#.{~{8\{ju@Q#omj6}[ +i R5hadn2׭uLlX'' q.ZIŒ쥪]SQLcG۵ [\Nqq cA=%oҏ+㏥gJz}[`(kX_֮ܕqêU f/7n 0h,ɢ}d0srxi6iaaBMq _n6lm['O,",a?37ٳ3gd ?lVp^1}:0֬8w0d}K/U+I3Z'W È۳fn1s%bv=/?|y\εorWO˜5K?|8|o!CYAj&v!9ٞXwNumnny,)O_&;lHkZh"2yzChjScXmga< g.Il۶rhd+Ⱥ?r嗡jBհ:uU]#\thfB+VDwW/*8]*UrGWj^B8p-YYNa\O[OMXn֐2 WI]qjX ߼yQ]CkZzC PFxw#G*R*WgܸIP^x\p$aD&BOЍS 0ؽ(of)8?way&L֡CBֵviiHZpxW;3ڱc4Hg}0hvj5kmN鞚ۍbx]Za"r ,֣<.nAE赎v-Ic:ަo5+ iR7:}Uolh={^jH$} q7\JJPD$J.!DUIM7c~Rԃhm"y6uLWb*U>|8lq j-ɡ(P6 WG{A;VznNMwz*))-_seq-+ Ik7u*ɹG+BڜRo+:-_;=滄YYTW$~E2w@QN\HiosժWօ֥ }*QT1w.IjЇ o$vBSX֧뜬GzUKF@R~1j.oFjԱLٶ-|Arx "zu%ÒT۴o< ߾-.ڵ~d!?ߞTTdOxn|PօҨԌ !c@oc| q}RMeeA~U|o\~?-[`ڳ~Ǚ3vx|Lr2UAyڷWڌ-Ŷc&XvWv*Wfߖ-m!n+$"asܸvA^Qjՠ6h`/A3⊣ھXDtQ ED""ED ,""XDD ,""1XDD ,"b`1XD""b`1ED""b`ED""XDD ,""1XDD ,"b`1XD""b`1EDDDD%`UIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/template_default.png0000644000175000017500000004165111035402412024570 0ustar malexmalexPNG  IHDR[' pHYs\F\FCAtIME1j IDATxu@UInp¥AP@EDQV޵sU\BEZDBBA/pr?P]uwΙs8;wΌD] >O+6hjy;)boS CD0D CD0 C0D7>/MJj}B,Ņv\UǗ\oiӳ?;[WjT^UkBAo n\HxrdqkkBȫK(QmH$el*jڲ:NJ +PԠ%*."WUC0K(eI5|qV?QTk4Ns(J,5<2A\WRQVSE)z.%HRi85|n4\mqwHUV:K@Ɗȸjyf&Ǫ m" J*XXBjժU]@ xN:&B BCSUHGꥵ|Y?? FicӾNJF\j&*X*(ibڦ5rlS*jR455v+-x- %L֭D)K!:jWӈ.%s**$IyVxM=M%5:ײt -µY51eV?-+dLUs΂d%=z@d8ҖTVHRfcRkʜi{'W1f?R2*@QzxacR d(RZ(@_nW,tB>ٹhm+1PPz o2S볷nWRng+!q|_ާJ*[_UHL@0 Q^**Ӗ bOUOC2}^0!iiiieh`?ϻ}(I3>\`NJjK)/W0H͉,W}mCk0,DrzcNl1Xʹ+ٍR0u[1k:׻o7qv{%Ⴗ Mg#\OO9g69u@)!S7]o088lg`ՙg[+q6vD`A`!Iw<'CM |̓[!p@)h>c&I95Gh3`baw"^QW q?ue^<<:KǏLZN]q9 }\4H[[OU͐۰}f߇ hSP&V_;Zwkigfc a5׼Xb6; xm4\E ,h& pPf ?{,xZ\P 6i$5o}ׇ,LfIloz27^{yl_7Va:rbǩ /_#`h/] \miiii4_JU2N/㡡+/'CiqJ7FmjτzT2C.5q ?8y%ϱ|s;6-=:1I 'wy}+]s.ݯ>X& .#23A89Egp@y7v!`k׮=6j9EWwbbZ/ ?lc:M/а⠿ޝ`Lփyq{[(0u6 @@ _mLy5W,@ݮ|ӊ[X nG<lآG^y+b 9,@_m"y@y#Ix1ƦV-G z+@XIL9$/ &եoq}Y}Ef,l颗o 蠂= `+y+IUI-rZ%suV7#/䙘5C u^[=lY{YQNIH!D6F[ ~BOYƐ1D CD0D GA<'N40'&sg]DDhfzL,5=f}S Y"S9U&rIW\]vñxC6`rb;,N˃Njp^m}2x~e^Wn1jPS?̌W /0j UG@v %b Tim}linvM> YLiռ~Ӷݷi[Xv{,by5?U/vq .1ź&(C{`boWFD0D?"d/&wDcz])$`1[]$Aʼn#Es["`ǸM]/^=(Uy zh egd~xp:%݄ {avjPl[KqFzS(Pۥ7Y^5T: 4+{)M/\w@1lJqCۥa {l*o:_^[j#/5þ(o6spƴj鎪 lIXқrSivǹmZΟwr֋;͝+6ۜnͺ%9\M,}Do]CRfb3e&mSvi#.*-W|aW \lýQDKWG6!۴; WY.C6K1puʭ1L;]g`OУ?vcSE7wsLmcƪ ;]m'WUe@,U^Wk6FXja&n:u iYlP-K^Qy(Gy\N+P( ElT(O!x!+GL:eng;c;}g~Z1s  yǞX>h~tUqs;ZwV5Ovy 6oN!`E03Oqi 04fx!.v@:2WCN c#Qs&WtiWgqZMC )t,`>@ʀU63_KE9`֫(L23t$O  |U~LLl4b f"ec^8wOO>$ûLtfȁTTZ95-&˶"F C(m9] ά>5LCGb=5Q)QP:x4pTfT~AQAEa%Z3T9TC: Jl W,W1L/W/ӭ.uQj)dq3\t&0CONuhd_suS2$a}fy$RQ~~Q&L }.S%. &ϼi虘dg לtL8GFPqa !pPuOh?zt$ 4ݒ<˝3 ˰7VN(ge;̀t,#UYC-lq>*RXB3#+k|t;;+bS'uia٘{zWQ+rs7}X[4{JX@M<uځN`~4':RlRrz@|1`wO3PhztDn US <:~RUFe>4O h Fe;ʌP\%xt s6@vJd~꨽ @we7 acn<T b h7ls5ok@叛N2W1P3P3RI{a3`=ڵqUFD$'"?CD0D C0 CD0D CD0D C0_NɈU>Uh1짪װ#~>^|7m\<=yvb¯%dm~-0}o$4$z`j\.ɐϭ?Pa7 Ѣ_f~?6Xxa@\ {fT־;Fl΍6FWERjBA*݃;JwzpdeCb1cPc8,Ru)Xk3ǏD̟Y:*UB+r|8fv,J\L-UȰmd&dzb PA2%kAV;3cSNᝎ95E|M `As>aU^^j,͚6 ʴ֍ڪŮ~ jC}?e RM?!71dQA/@ԤR8zR9s[t:y@ \ulHR L$2h@*I|1DRD(i"@ !d| GK!|\"L5cD 1w:Ya<>kfo۩֒+:uڞ͘%N*0_q#I%~ۤ3w|f̓ڻ_WƪSO“R;aO_yIQ-zeVN<惚\PeԬ n]aFsbQOT+2.4^x [i;p/Kҵc^KRTneP5m;/|?]g/lJgA hO'p5֌QE ]>Qd?@  =D޷%t N%?pqG/.lc5 8F'p?@%V;54);ymY ƼveS_.K~ ǝ`V&SU0"h9VP6?A-zDWx(| [k_;3oC2 E,SBPE1OSKUPUi,Pʅʴ\S PB X&z"J\*WB "}ƥ$*b:_EBe ]I;$vvj ceHC%sHNykIw*,pZ1/ i; &z1f^ARE}{p60謕='kp_u<7S*4&0 (R v{϶auF(>EʰBk]|.RRϪ|9mZ)ʪ ⥡9+NVuؖӟyZ|ȃWu_7dKIU1oЪs" ?r:X'&9=MXiٻz]s4 K'n4\Y~kVoZUpeςf=Y-լSײ5.0 1U tjיvQfXdY2@;8)_=teeuC]zrVjNW| (Fi:ZVx:>PmDɪa rnCWݔ* M*_eYc&;'z^mxIpVXX;7 uL+{KFh2e y٦eI\WÎ]ٝY4;1ƿVsFSLV4JW3Gu昪VG9tӟep^#fӛӲ{jذ3<]6TF]+\ڝ4?T?D?-#?C4F'CcuCĎ{ޝG(#LI& Hn_d\6^j\!+~pQ`H)r2~TP9b/{Ԇ=d6!04 繲0To#t_# zEӼmW6Kd_j*::ZbO_*Nu챆P12\zN*?p[ fJFtu]n^Yw/U%1Xr7z{,+tb,xq]+'IDm1jLH0_j!K;sÁ& 8M> {+oC1ƲKhTnM$OeIz16# *0.BӰgT@C C*@X$\ w$3:T_?l(FI2#0Pǭ =Ta+Lvdma.eZ;щ2 -ə~Rg+E1 λ͑5љTÚH;V +Q.;uY5l^'m(B[y`FIdCY{-{ƇM>FBdW@}L IDATm,L(yovΦ7`wہ#ؿGp1Eat=awN5mvQtBdCVAܲ#]\s,չ^U+1F0:"~q{~zL9=qǜ")?[/:ݩPE`YB(P&w:vDw1jAL o".|"j@ MSR»[֒쳨/+ϱVMD~'56Lۼ+XS2QӒ2cjmRZB:f)2@k..0R׮N1sVRlA?!Cv%7[cU1BnwTZ:j$b$y8w{`_䙱ucoϛxZjS ,ی,RXŲk22/ Z3yI6f}NZLqu+HO|Z]_Yut^ʵQk{0֦87PAVΝU'9Azhfjo44d$9S0.Eظ= GKWE&mY }f]jKlX]P΋*_\rvq[m)k pe9qW\,>dF 'c(LpϢAaޑ!w[쪮U74ڧ[X*AgkОzf-&<)k1Dֱņ]x~]$5 Ik?s,7iF6cʳKοZbenaIdHk*X h:(${&co޸!!"`"!"`"!`^kYw3~N,5H{7C,%jek"ʽ636ib:K'ZJe2˃yq sG*G?Z@H\sZwlsN:j%(O-1bu)=._L0=Z8oa jemN S Ȭ93N+y MyN폌fkAQJF+ UE ;#jr^}=@`gJq[%;r,/.G3X\OYL!fzeD CcQ̔GKD%G$u}WF9{џ'vgwqf JŽI%3_wI] ZdEGmxl-()X4q Ou)'ĦUKh8vJ_csCqOEO&sĻ(^tiJQo]z+tК(:0:*-k9ÇO }9(k;w W*{8U!г8fhTcñ _]hzt-%`>>IJ @(m%_=+9vx)^5 }Ƣ6 we>Vܲ>"5f{1(x^2a)K|:bZV TR0a } y,.5`{Z<5z@U*SE4fqd 5Ѥ}`9/|A<Ե*6 rE{4j0}Z4i7ӂɩi m:N0VY._!oJ"@*GW!92kh}˿]Z}8\s92<:orQ\C.o.<V_ZX(ֺ dA#//]NL $F y~x*+lݙX+FҳśdV ]"Q 佂;#_7yYzkۛ氦AvcmLb:`KN'.iʹ#+M;,8#?5Y;e\,Oz!"ji96_x()e( fQ{CDTe#R(ܵJ;}{J6 Z{]1Qg_L|bArN`~(2<]WȖ[5_rHElp%3!)8*"Zxv~ HP-53 fm};V R9`9 ЕCw!S` DD(h*V%m3@W$Z@KT&4tUV[J,@k8%n"av&tvHwUm.Qtv0 B ]j+.݅mg=NGM57Ѥf2> o;+M%l?DzDWT'Z&ٺI(ב̦Jl'jŒnFlMݵ8Hist?_O-;(놥 ">\%!(522򍁩GbjQ]Db@obANpq GQ[(X4sr$# QDAuRFԢLCwz{BC{'m@f#aSDtf;M+E-* \}1 eih㩿KVQGϪscQWGp6Q>;E1#LCK/R݆ #)܇SSuLZ;;н2j!J\(ttrnXѼޭ@\Ʃw#G.M ~H0 1S%]|>-O  3JG]=F?0xL 9wď Zwܪ*#s37La{E?ǐMȟ|L"Y/} dSgJ-.|}~2ds iPkPﻑ8H~rčVDO=6ʹ QgGסnxn=-\a9*ֶ0stcKV=[DnI`AŀU8]ufqJr.r +mU˦q ̋٬fvp&wX+tP%m֘Ldžy0q2sy:=c+SRj^UϞ0ô, mJ|*JPRMv!`_M>S~s1PUԢϼasS%| xup9klK<Κ>0eNRKrES)ϫ֧x2[G%H@$3T 8 _8x!M5 T}ެf:t351q[qB]3goH}`HOd!`"!"`"!`!`"ԻSd/'VT87İ~Te!Y6#-{<;xXA4kht޻Jךwbކ9Q>Dľ_h zg'`5 bzxhW[X)dX nU]=N0  nUXpl♗'ˏv?:&c?dhqVԼG83Te/lw.}49bn#?ج@֬աUb]5"(IpovH2@8+15"tU/eɁ7 6p~G%j]AGT Byc.@Xh rƻz{d^bPvNKO_ VlOfNi}_>??|3Iдiƿ#`E1ognZrfҾ!C`xiJDZNQd#og.ks4bOST`3Rը `@~6\y'j^NB6+Ϲj"Γ(b0^o7˱sO\B^739 ʒ=#{eD_5|Y{Um J &$m i!`I(sCW'2: x⻳dKz: N@O,1YΈ~l~物zJr\z"k=1ftk^ vρ9$AuLF0׈hc .ǹ=0 w,171nrz-Wsb|J !R9ic"!"`X065,9 \?*BwSinvɁNҭ?xq;,>[g$?Ihq*pFڣbmW1LyKO ; 3KլCv x^8YbsS/.u+NX9B}cFݽjc>(Td*@vnOGz9f=cV0!/3ne։ݹr.D:~챓ڳ[`8F]/>)fOO1ȨgyTeGd`! W7SF̽%UB Hڹ|"(U|vg9vjc@=W.ltٰ): z4Kgt1 `>U`I=-ܪRʠb]8/4tG]!44Jtp*<4*D zw.W (ʛvvC)㗗-~`+ͳ~7kaH3_"ńiTPA͊yP=H[VY>R)M˵}Dc ˦Im,lZ0me`fgkʢ|oӪtiV֮MZY ә֞X5uU]-^_{z^Akt`I$% { *(oI^eu}և ϋpo蔸8:3G?4lwNͽsRwnya&Gy\^\k[@mе> 鿍Mhfx}j`-V^NqܫbXv˞5jdˠ4tx%6hԞF[։o522:ʨ-U4u<>$æC_}_<7~̶ϭf7Uuv(iC7Wj{{V6|+VnzeymMzTkYUI[dP؆GƆJ@/ W Ycw dN9P\+fWkd49f GD˃c|0ZX|JWRC9/o'f{9,TUY c33:Wmi&C `D2ŀ6Jn&t_RUiWYqv^"t ˓`;"険6aQ4I 2"ѮMW20|picJhx|?IaDfbн2oW҂b+3; >tM `>BJ@(1yYP+<R B KWJ@ Vpyru \)@1|lP!0(&:uqsO\x.'i–VA۬[p45h`諃o4 wW,0CHS b@b.P߭T5+L e1nl{r@N!`UET}Ԁ?}3RTnسy*k#=dmyuaMN"E9ƜOPl 'to,*+,uR2>|1QĦ s2~2σRoBc%1#r9[`ܶ@WƵ,xZpW]ҭUdleM`& L+ͳSM~KxoͽJZieHs0ƸG5w-.5\1i$ʪQ"C2_M.}`ʉտ-0eq~ន/98Sd;7K=uڅ2žYv9hqA*5[ֳ_$7Kw.-`sեB\wg0E=f?%'>[GoOg7v_q/ j25гع弴a?qn\r[&ʽ{Ki&?44m@ lg/ [GiFBavad>Z H ƬxRhf^L:)mr5 RI.f3tX3T"u۰J<&2R7~<6.N"[M33ngniߢ͵?ѵ㭔;/L.7QǞ".*2[6v-e#1o4'&cA0OOLJ*:w.oED#ەcE?]%t b#uSU lSJ~h=mW#_Y?j*H( 9Ya*N=3W#HR+hݚEJ[uqlX˛ښ3Y*Yig9&j(k46oԦx[.l;A OT_Q!UQ=,~9CqMMݐ5SJ 'LL5g\Kle_8|^:3Q0IDAT΍9ߎ1Ѿ\ /آ[EjBhZyIvф˽.cQFYjF4Z0Rv__f-Vx?\-}9 [7;D K}Cd~ȟ!`!"`"!j<`F=2.\oɘ͍OejO$H/j ^_P 3o4 ?h1I s I,l:c8E ?}$ژ'b߸]k @bfv}Pbs1*}e;"L{smSKnFF?;q8sT _ ِ#7եj4{+7-Dݿ+aOH$_sdAљIV3,&Yz7b!eբHK e==ݞWOgx()tr5o,"FU{rc=!}ܴ6+r1t,u7_Zbeh7ťє祃d'MZou|$"ƦRcvqU/ MV[oV]\9/0F` 0F`0#0` #0`F` 0F`0#0` #0`F` 0F`wvvIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/fontmatrix-zoom.png0000644000175000017500000000123510722061376024434 0ustar malexmalexPNG  IHDRnsRGBbKGD̿ pHYs  tIME *d7 tEXtCommentCreated with GIMPWIDAT(ϭMHTQ7qȩ,EHXԘ-7EPRfZAB!DЦh2l",JBf yL~s?_zvF[mxdw[u9]ܤ h :b1O~~qdR08^n?>j,g|zțlndXMy4fNU*5V,+k){X-NMQw_q쉻k2FF .zօ\k_@͖5طz/\[ʗXvDH[IENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/font-sampletext2.png0000644000175000017500000000064111176611371024473 0ustar malexmalexPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT81n0G0tq TP)/ D+05aY(Y70 %m:`Tj?+XP -  J}6"US͈/(:JM@*4kVP*KEY6ݫNK0o0(u02nL7"[XHX)0n PE~Gt8|Lx߸Tu:A-_O#xasBIT|d pHYsnnޱtEXtSoftwarewww.inkscape.org<&IDATxytUս?&$ !@eDXAES]8W߳. VçhR A220$!n{#9ɾ}ι79Ikuw~p5-;60"̷;m JW HtC!G̶ֿVJi<2QB&\ Zbbq_&!.Y 4P 4*2 ++މKP !ˠk ȠF tW N*o`mTdP!^"C+•ogT1=|+2t;B,SWnV˄йH\A h>PűnaG6bl쬆w4-d0oFB;0Io*]KHit"ʪmH˟0`_W>(++Ԯ@Ӫc4'CK5Фٕ…hZ |n (ʢ4'@ ZIl@w|oo28ͳÅD-Dԝ9CѪUdeQ'4TV*PTviD;NGhhԦMdeQEQ|'nAHHVNp!bȨ8x,Ndeq'XX*oU-8Hfpj (\ _iiS'DGH\E{@W"F@D--|ަi2`SƮ,erZ{3 d;~d8sDZGKVQX]MڵMaJj[Nc &lu89DJwAN!@AJooe;v@0&efqVn@BMq1+WREڵ4VWG@OyN ;UN{( q2;+w4")"q He"sqvWQy3@"=GC(>DJK)cNdeQ'4TTXZs_p#m7jKr@D1dy!2e"u!MoC{ms!@FŁݻvfo [!X)ߍ`$C[C#uEEZpHg*IpȢE{%jJ# Dsu*kM"\40hhțoOP^ޢh""q:E!EG5l~WS]\$hՀbbH+Lz | uua$S[ANS7}m4VTXzDb Q"쬉*شC"%%4lNΞMSJ OO gO<1|uVKAŁ4@ (ڗ뗼HBzvk(Xwuidݱ]ܶeo|Gki_@cu-+7t gvԗ 6#{iզKP`=pÔ/[{4~Łx44Py EYYxe?sǏ㉋#!=Q4qa"i`ڸP[sAQ-ֻN`CcHԕUZ-)ÐyVՎ\~BӼ{3p,!cl`y>FCYv$忉`ks_)kU3?*+!zZ~%\$D0H8> M<$[A~ѿ3pڕQQN5I'+*Bx?mHz0Hɗ_++'|䑰o YcK0){ U /AU QQV7G.$KS>d\?i]9^9 ڪCqln=*Yd?UW^řۥzLl#% TʗUjKJ\l=2 ַiə9{ڭτԾzW]p/x G3_Kg}HyaLOgʼn5k΃71Aj(?|]5bz+wA 251g0㴖i\`"*eˊ( IO?crOrY&xw-ǺHrxa(I*n1-Vˇ2n@\ҹ!m-}}4Av*q'1sSN~&Z@+y,YuyR&Nl\)]0)lĭv{ t0ɑPULIٖUT*~O%Wb xu ɠ"2)w$.tQ"֧`V_. E$YSi_g7UU7ӎhd@:yPGK СFWY\mq1%۷&S>}$eG y 2MlX==隄;"Qd[Y;W>z@Q #[ɎXzPyXmA餌l ( ٯz n۽R>Q]\CF7E OL Lp>S=].U9 `  9JY@e^2n=d^-7\d9\'@>W+5%{V*1H6R+.KUV@Ckr,()z]d2~U>_uͧ bQ=F(\w(fPWKp7T=$hHJѼ?o@vP0 Pⓒ] !a@_K KH^ KrXYroDR?/-*ӥd.HE]ef#[]nU\K3ʎ2fW$َ[wPP廓ARF*TgKTh7`:P ݺ(n4` E΀U/"Hװ>ո*'UvWQ]teХ-Wz1]ym*t⭂O-/+on}hԴ*ū.#:c9# ju*+5TKؖ}'.a|٦ *ܔ@vh쮯X 3rձ[rYmE9Ty t_YNAx*eE>61|3HޗO#. `R|gθ*]@hhwE6P.ŭW2<_23lvnBإU&1ؾ$o; .< #Aka-^LkLE"|^nٷC^apu4%1O|ml}!Ѯ1\@/x=tk52h()…6srݺ(y Olkz\ >0e.g(JN Sl7ѣ9+"]Q10bvW*#ﭷX3ikN%w Է=UXQsMU/zXTأKp,oo7ʶla,3?95ў̷}a>UU}Vnp29Jw.j!:u~X80ӧ m6u#:]WK>uR13|ٽGP>Mfێٓ>Ȉ_Vҏۙ[\잊zX҄Nts+/#A#y㯬p֜&[`ӬfWL.3gZ8TQUPWYϮmcUeO]k.'|!ܩuP)V)؜%(]%[W&U|;Q+W|񳟱:#^;+ *%[Y+cgGҮAA!]γ/^g|a@\|'33,}gJΝ9G{%aP apz~r}tޤxd esK 7}l=G"e޼^xU/D~לRRBkjܹްWmp\c|{h:cwCo C&B ?|8GE y> v͟OY^0 BQVS8*GlB76>‰2IW\A">(aن%2nO\@7Exs fy)AjZ2 # Q|=pwd]7-4֙{նW*o>á Uֳx x=i94:L%ZN.65úݲ~ rQJJZN>L( /10QOꁲ#'z`S{׳5x8Մ}R26ˬ a`2HSZݣ :Y3ǁEBNזDL0V<;Wo~ w7_6UsWටoN|G.gPWGɮ]$).rsr0 +yMdt.^@c)KӠxw#p3|U_D $'ڿ9C+YE)*K>/4,{-#e mY&'sӶ~2|LF M,OW46Tr}ٹ&Kғ{'I 1`U-7=CF!m rLk>ɇ yq{2W]$-~FRjCK̰8GXOS\bU6:&0Һ"~r9+&ՃϭT֦]b>` k݇#UNT^Nr44CE %TҜCj}o>a7L@QG@M1}/p3PAӪ^F 4@/0`ʗy B z" {MP[wRX31@M5T86cos=#&^&}Z>;woQؖ-h>foA~R}q=ҌLS/(EV\ 4bc3{vX+0 qI e A6u:V$Li!LUr=}2[W.=ݻg$ȡln2XU ߏ'?ի޿A`ϳϲ 960{f quP&[Cng\ D2x(!t@CS &_m\-.B!&9 U\.+)T, yEZ#(llˁJqZ@M! $BDmєޖAb_ #2A@c@?ڽzVπIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/fontmatrix-tag-graphic.png0000644000175000017500000002374611006424022025634 0ustar malexmalexPNG  IHDR,*CsRGBbKGD pHYs@@tIME0$ IDATxy@TUƟ3wU@@}PD DVeR^si_j[ijVoYZf[ZʠJ( !;ܙ3sS:~9w߱d (TTV* +JEaRQQXCLRuPrZ#T`!~~JJBpi)zȨR V  ExX dQkB""EEpٓ}as*󻿷7B\P^99` ZTVd !)-EϔZT&u]!DС 5M|Aj;BJwA=zК2Z\qUmABRTi.wXm\˹d DH>-+O|<}*TaC1[9\\2dS=ݔk9CP^јU8*''AMLD!蕑A)XwApPB^V/>QgUhnjN@M7!~~ KV{%P[[2BУbcރquO\찊M5r ~~OJBxI #75; :(>}S^hJ>n*4M9suEtx8bo Qq d7X i !1c;!r77UػwF]?qnj|i!=z ::͵jH V1%Pi kpdVItpR|9c*ΟG;Ml!1 1II2Ak Ma͐:6˲=>>z&P枏 )#68)+COU(ʕJ<^Qb]Yŧ#F`ߣ6)77FF"6'ʢ"z{UHnJ KI#6إkQ<z*鍐Z73p< )(@xN7g&[ZO=y2R7rc\ 1 aavYIMBχ`N(Hu`K@e-cɓLgΝÇ+V Pz4n*L_b\,{i!XTWgIlmmQvvSrV{II@,+MOkAw9ZBP9OMMb:I+X;5 [bқokM]AV"ӊ/ّ Z>:nF,] 1jbo; B퍴r-/Gry=e>#;vfToق{l4@5z_R3OO^w#tݗ-Aezx`Ȟ6T} ~z ֆ6k(eWd<>2Rի1[jAZ!( ٳ6i]zHX֗_™3qza2|1ǎtqG߾SZ:F}Ϟ._~{w06gHFJlիR^)mhm0eH)%K:~ev~>>ڶ gGP׉KÇCbq?.9+~  /Rdu%*__p zA#_&=2=Ȩ~0aVTvܫؔqa%] 1e48;#JZ94, 3NOl=憍׮LLMfMd) RYW C+%f&^& OO̪5NeUHi{;BpSm6e/]M **,! n Kj5e*G8AKB#+::$? bY75,᣹hx-MMeNdvZ2\ܰECrUVm+#(sܹX|ѽĠx$ 027VrlVLOR|P!P ,o E{gU\Dȑexp|jZaz5 %=k~dZF>( >鵣FAAx~(#-oաX@V]``MVH էi# .$+6;iʝ%sF \\ѣ`BCrGWBaFAEgˇ^`ES@ 3M|!qA.=RSg6]p~)_- Z /A$.4Zz ]!wuOu2r ,|j7Gv=5uɓ, qR&> 6;C/D;9|lzzoG"%.ueY)z1n(\3#6/O>)c\}F Ăf[L"XۢEwH\\8Xg{ ]z^(aU?w.͟3ӧKdΕ2/7^<||^f, Շ릦ĩc`Cjz*:w"!æpQ$t_':g Ts,IP`ѣg!cz,*ߦnZ ߗ,+WnTmd/r̬TEv632Džg>MrCC}qYƬ,bI(_RZK|Yͳ4{ַsrpcl뢃f"y g` sT_]2kͮfN WbYe%&_[g`)3gX6(8OhюAu[޽ĒjyM{޽F_&Qt]dzwu6}bmT*ֆ?$ 5aKec=r5 vDN;kfy8k`cV'>3+ zg0yw碣]m-g7(|9CQFƁLږ^Tܪ/Dȑ\g1tmQdFewBU?NPःV00Ljꖛs\_*IP+˲8a`FEVR- _brԔ+eqYݩ'hX/wPYmWr3#'j RSnjH6flqUQ~)p`TFYcWPG8Uj ?&ߐY\PmQٔ)Xs' !RSn}i%euNr 5=3%a6/^] kV>"hXnn]F ގ[njRrwNBMu'0aìYP74t/ގMP$ꅟ|&or7:{׿`]p!2z6˫ßnd5ĻM%PN\ȒIvVyju! Μ2&zvjhDA%qqA7w6X ֨ T[Y}7״2䧥cSS12&F|V1R4~L7՛+W+'Oq@ծo_a^ @EjneZv}ߋ MTZ hn/A(~NM%Kw< ֚᯾HTfuD-rY6Ę|-xXKL1M5B t~<0P9M[[n4&TToo75(NV |֡y;GE!84f z$'"{?VT](`U{>Q77#V RKRS liKUUԧU*'OjY NkFv_AO#MIJ,bF6laA9VϵⳖ))( 䛪8ʵIȑ :}vqh`9&<联5-E$ _|!:r=|%tUoTVdae2bSss1Z7@,D6(bc757Tx{Dun+hXy(dIoME'.<9bgE9}Ztn*jX5&-[eܿF䯿MKi|c3hab2(@{_$g7hxeUB{`xf&yc|p!|PTdb">;|zsJV`qR@$!XQY Lq"a #: yyᇎ "JSfBVֶTyB@rn0сO?cQu[lA墭ܰ^b|&R7j=`uGxiM~ueYlVn aըgxccD[Z6m܈/::bn]hQF;)&X\R]m+MMhokCG[j5Ҋ|睒[ʝeY3 IJ7JbV|B V޽ۿ(ܔsX@anan`xULn-9}Ӫٳo#P|'PYL,"an T9Ӭ.PHh Amx|ܹ?(Kݔԉ M QX% uCqQ`n AJ$ʓq)ӵ'?2$@PVH]_`<)wG f Y-Pй9={U| I!!VVc'Nt6pM+o_ #Ų, Բh'DTH.):!r9k !xx7,(PoˡmMeu\:咲)u\_ J| A[. 񁻏՞f=R75~zګWm޾ܴ[rPXG#"Cc#uS 0PfeQX鉉Jk'j|&~@0 ֚e{&&XVe1 Uԉ\T &˗ /%42ªǢÅ w07,n1$dsJnd3UXv uSFA0)`Żw; 12siq% a֭MaYw- =n^N 낻«VQHSF %ߏ+WJ|CUs#6өS1룏 MYt>IY[oJ@ r\J_|uS3 uj~sgtrTV,X3g:TgϷM5\k#6pJ OIN}+WM@(c%B7u Ba:[\JMP2bDJn*|7(YFl/ b;Jn-Ȑ> A99hnj=Ԓs9%Ptu0뇫vٚ|[F,]X[Gfb"vG٫M\UªG?4^eVVuS҂J(&PxVuk+2T _!-Xj5zzAnjy9``eY 2T@ #2 k~t`eYr9j&Plu0P X5k(Rwjػ7\, Tq8T[)}v,#AP`Z-8Pi#CVeqB]@QsS]]+˲ xՙ>/xծu6 *ML+^ʲ, &@IwV|PXsh%ʐ"ի`Ϗ ݴ[q#6ALv6>9pi7X s&9ZIDATPM I!!FloǂMhM!X;/ |ꦶW9֥?g/ndnúbtx=@9AeH^r9"6=,ܔvG`0 #\X?}슥EJҮx̍ }Ӧ('J!V`'C4r&_Wnna1 a0hM !C?; u!ֺ-[f;uSB \߈-ɂl]0,Dzq0`pp&P`m>zҺHwOT Y S7.WR75 xU}"#q&PN@SB^P:VKH ğVKQԮجUֆ T:O!!QXj5Px>T#ᩩv9Rm*eP@X>ݴT"0PvBAQI!!v;,#6mg΀eY ֳFnԔ{qM HTHDkasK9sGUtq^|e 7 Jgwu#GPv-@sh TB<<0O笺XPwtPmڄCpFgwM e1 YYPfeW[ZPe m:liX6ah`:ףjnNBR;JbK[P[UU㊞JCxD%&@G[j++Qy3T558d4ޥ [3P 67rSo ՎÙ+WL M\aJMsx4TkBo9&x0xk  i8)bЬyj~6lJ\M쯄@PXuThzG[:rǛ6&JIIqyB + XXZqp&*+:~w$C8YQC]Tףߡ:s)v \IzEE!oDۓjFT:.M'ޥ s^y2 ]mP};=͔0>atعE憆 v)J|(T_Ձ8hHgVxxn2K;.p{;~ 8LtYRXM, zo݊ۡũJRl xRӹsPmݨ:u ׮9m] m:RzTTק@:QK0@, MNFhr2hokñJlakjBݔǻ;EŠS(\܆S UT@UY:|YZɕ6batIT_*=S &O+Wl+_x8>$Yu 74S 9T $t#ZS LDj(IH*,(\ڸ'P/!a{BcVcǮ ߏgMY ɓQ'EuETWE ' ^(0PffB\|5۶A};fM8Je\=<Ч}JJCaU'OիјՉuСnU?V +Sgb\Yk**P]S#f 'EG (Rwrfg#6;#\in-[PPᴉ)) ~h!ïBu4vpqwR OZj02oBA]sW=^IENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/fontmatrix-tagseteditor-icon.png0000644000175000017500000000127110722327600027067 0ustar malexmalexPNG  IHDRasBIT|d pHYstt+AEtEXtSoftwarewww.inkscape.org<6IDAT8AHq}鷦sa a#BO!t<.I,uo !DAbjR29VK`33ncjm1uz{^!W\ruW**0-*B0no5q60@,*FFV]͌ɒ˅ Szc# ܭ^ZZ[Vt:8l H7c$kp!XDM&~) %[[+lkH--uw +u=B X~aC9ަ$ajofggָg ˾0"$4rj³SvįMCD"'38 s8R[jE$bχ>~lC8$ N%w4"@L#[u)xq?p6>M)|PX5tJe| 8'R|x2J֑^a`ȍ )|݋~D:ǯlpj$W PR#>9BNH,.}IENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/font-sampletext.png0000644000175000017500000000106710722327600024407 0ustar malexmalexPNG  IHDRasBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDAT81kA $X+FC^إ/.e 0EF"F؅6X{.5{7ch)Զt!DFh[+́#Ġ'VI;#DRV>nv(B18 %]U:KSR)  }|kއPRUU⢊1ެ_w66^sHLf/]^\|`scA0{h2mY%aOUq2_5Z-L`y=~n5KKyP>;B|*W hkv шQ0Yπ=Ckyz~7/sG=(ږuXր.3#Y%`fKyGfp(!IENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/fontmatrix-zoom.xcf0000644000175000017500000000570310722327600024427 0ustar malexmalexgimp xcf fileBB O gimp-commentCreated with GIMPgimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 32.000000) (yspacing 32.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  A      gimp-text-layer(text "A") (font "Sans") (font-size 22.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.611765 0.058824 0.058824)) (justify left) (box-mode dynamic) (box-unit pixels) J -- . - %--) -&.-. - - - --.   ---)*))*) --1--0  ---- - -S: aa  T }ri.}zEUƽ{ Pm| ezI? 4 U A#1      gimp-text-layer(text "A") (font "Sans") (font-size 18.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.611765 0.058824 0.058824)) (justify left) (box-mode dynamic) (box-unit pixels) D X hD-,"---((,-.(+)---(+-(,--)*)*--,)-1)--*+433++--%$$%&--+&$%$%%&,/),,*.,)--),-((--+%--'(-)-2D >O2 4ԥ&\jU >)oZ۫^wſ0<} f4 A#2      gimp-text-layer(text "A") (font "Sans") (font-size 12.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.611765 0.058824 0.058824)) (justify left) (box-mode dynamic) (box-unit pixels) V  j z -----------  ~}FN:y#yd!衩wxT  p Background        fontmatrix-0.6.0+svn20110930/src/graphic-resources/font-glyph.png0000644000175000017500000000135210722061376023346 0ustar malexmalexPNG  IHDRasRGBbKGD pHYs B(xtIME *%ؗjIDAT8˅OHa?斲Mr.`fez3jCLBLɓx*0CCRɃ]&g,Źͅ+N~ }?<_INga(^{6L I]_ [JF`_ @ofr="Dnmn^VeKO= P> ӽM ~e|ssA xqxŮ.󴎎p%uJdyۀ&ni|)6qssjk9[]2( Hi$Q E+-ف@ p76pJY?771 Ri,)oZpTUJ!.V_C>jheV7/`8H Jwvefl2Ipv]x} /\.wRCJ~v͆~t',e+]T@nS@)w8'!^ x&.YcIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/splashscreen.png0000644000175000017500000006070011216466655023763 0ustar malexmalexPNG  IHDR,PVsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org< IDATxw%E}XvY$W +I Y^z" d%99}3}|Uz)mxx  :|qǃ  faqG  ℄ hH hH hH hH hH hH hH hH hH hH hH hH hqtKu= z)>>ƘʣVfYNmMԊ]ޔw_SeS ["/Sgu宩+ i.~םcWKZ| X"rFa#mS ԌNJ!;y>>= aL7C#)FjCb#D0SJCgDC>ȆH8q#4X* xDG: #gaɐ巤v鈸 OBtx]X,8¨vȹ#oh9!ס+Ep^xgo^˙+ nӴvE xyU N"jVMh&E0P.{hBǚug# F/]juxy>\c_˄F?ݽ2t }%?VzJN`pUېy6: z !UX@^6J"Mޮp4`R)Y`_/ Hໟ^'gY&ܛ˕2`΀7?7pв ꖽXn|Axz皠4̄t/;+Ncb2BՄt] SgPA-QJݏ/EV=8vqBYoӾxv2,Y@8xk5+B(D1=gz>ua>ŋVz4pl yVS?jz6(w{4F> ;A0P廚nѓRwO?>Wr?scb'.̒ɭF7pIH'W5-N^GRN~⧮dC@*-q̓jCfZ~y_@)`d1gV;"$#r^`O.\7<6TIA;oaVOIvDqlK]BnW~Z&os:jEJP4ʶ9Gi}}|tFoc%3ۘeIs.)XSF2 A:i΃޹7/|לdx;z`1fSikrDq-$%! pAו|E}T˹+.'_r}6혆-X%#ZWg@GxUB}|.Lр*bPgGXQ"\ sE[ eG3;4pm+>'OA,)P)$S(&ǜ2J#.&JPm_`+v2+4J܈}A|(y*^Pl7aˑBu~ʓz3WHrO 6j{N:*SPY{0hT""S*z{L؍O:kHGO˟c+KMS)g+w/N|$""ޒDj9ԝ΁,t?8l ]3͋qs]qo(jvBW|K$>|=:M1 BXwG*sƊjv5P !@W_1SWS۽*)RJPDBr*{}-'|"hb %+h2D, 3]X$nE,7D㬮VT~>oEׁYN>SyEdڳ@ MN E/Fq 2Խ,gsR#wt~$Z*z->G7x|4]TGw?2"Dw$܂]WMgM"[9}xVgL]1L)xjEG=rŲ#t7're%b;Cp-[rܳY m(7Ɍҙy> Tjx̣-(* 8TJEt Xl9YX׈=ሇ/ò; 9zp F!‘ =zW"SĖS䔹Xq9YR!J)1aga'VfWiʍ< >xFK=AH1R?+k{_k^SI𥬲7 b W r.dΐoc5Wz`r1䳼!D?7ՋW8<$ bxb ?n|axXSgn %t?vݯp>{~_N?|d?:E\~?\_p–<tϞ|x/Fw:US>KvcCxקɑ@vtf$]]wb[;0ۍUw?T_ߝs ßc|V>7R7BF,w_#ñD&oW]kosYtҞzpߍ/t Ր/1z|Ux99,۞xͫ^_]-`IK;9 'z?2~/>yغa;>1Hw#? ?W|cx{JgO#SOy[-R ~J7 xo1B(GҢ醞?i'w*{?q5< b'i"Y%GWa2BȢ /BYIpA5B({4obZW$E%p vl\{yqN$J.Gz`6#'rZb/pU\ LFXm ̒1&Yx?r=̫n,_Oxۗ/ŭ sv7e7GiE? w츓^@{ٻV,^Y-#c^w8 >G(;B) bvU:zC<E|bGvo3=XX_Nnޯ~#P̆bT&{g5~%~酮ZEH.|qDBLL瞏지L7=}tq!iM*PzpQG/g |On>+QH䝅GtDy`h6~sqziN|w:|Sa7*5:$c#9["Ʉ-o՚꽦{Yr?7j#t2:|s虳 ]w<סOwDz3i\pW7weJ[^rJeNE$ИF o8a+gS{(a-5 Dž>8W>^Oᄱt< *^bb5-` +V/t$үWYU^ -;5c =+V?:#aANkJ[9Ww ĜT|7cEKU~[Xo9:D?RNTynVlhh/^I\4<Ks3Џ@Ϸ[X#U?9Tn[e/߿y08?g00ozqߢml&%U^ģ9G3 ,Qz1GI9.& pWĒ0=&sy ?ʷkIB.i7$MuYsq1]m{7<qٲ{Ȥ  `Ÿl*fd:cᜓ_y*OmmOǚm1C͂Yw{a{cϠwpL7F]1 vVs$_UjyzuU|moPowE\&$ 5|O=tMY?رub+*o^8}V཯>FP:P2營z{|}G'&o]Ԅ޾g֣'Ӄ9HDouV%g;J;r-X  QG}4#ܿqkq:9ӳOE&GfK &Ƅ9t=_+5p94׆jFdu5uFݫLNǗ/py끁9_tԋqթǹ;W> H. `)Ny?hZK gN+]$0ky 7~]7-{_s4.::ew,>IY fs!y>'tᄋܴ)KBjt]X|]?}F's~b]8rbŬ:kp7Z7IWނc|;> I#𳛰ut?m_z; 7ޙr1{ţk?HdqXo W0y_s-ϟKїߌ^Z]٠f>#ΪUU:>0Th݄7o.E 'z8E+169/guo_tkW!Ι'N#;m@:m)՛FH$`N%KOmفTSo*agGBL8-83/=v ;]wbU~/3@lZy US-d| qS.091w &GzS|1L!l)A8X6o|W˿I !M$\q}g:TK~'n~X9w63^ȝfl\wEq̨bf|hؙ3Ukq)/u0t,;FGa (i8FwBy=سsR'ŪCY]-=/ 5JS>?d2n݌nG O]"^yGΑic1/JHYո4Ȥ\5%l !4/8-J [_1ιrϛ&LFb|5bwkITmC*S^},z_O-,/qIc\;&֕ wl݀`pw=۷ן ?qp@{C9yB`Xn 57,z)xC\,yƸ515>戨nŢ۞zcʲ|1L}g1akv?fbvo32֜E<7eg7ŝ<'6 e쌩ndgD$*u-ɕy>pﳛK~7S)w sEpNYQ^v3(RB(1/N?eshZ:|0'dg6_[7uE2nPG21BuDI0z ftӨڽ6(bb"2S 4cey<9ꘐhDKRJ_zˏ=~8yS1ʎH,u.k 9#][<3yqGp Ѵ~>"S(0$RظswO:Uwl/iDŽcfq(O 1+4GӒp^î\@JCi>8$|xa9K>^3WBXQ٠|mxPؽׇ1T^*h>z|X5YrB$x|s8O/g/= ~ uo۵MGyA,Lg2NеMwaK >BO 3+;yQv-.EF!758Jpb }5MH.\\pRrUNUyE@D]*rc: &"۱%oSG }tb8ՏNxtoM'z߽.> ]:uixK=r/_74$0j&5FkU.5 g:l' GxT^Lo7{d+,o,.ċ)שy Eb Ə|k6nUn$¦1<=H>,r/Cuh]tET6t K[L~Xe2(MZ$ԅ1I[ЉG?{zp I߾OLqQoW|?eP"#iZ#1ʳ/DX돬$e.{aROeS xl-N{#)G2 Y {p^}"݅G-x)gN(l~ǗDhzO{C: Ps z9G2B5u{ qle>5t9eswj$-Z9"Hc'wx3~}nxtY:AqmJffZy7| T-XTTG"?=*e\tC*RX"Dlw"=qdu>DLz&}F^>To|z3tM&epϗ?w^K\=LAu_0!p_UXˌB[.,S!*cYw .\3p?FN=\5uw#  #R]}})I,"d'#vALs=俿/#Fvg@[F =Q `{q ( 64zťL ,3ų ]z-nxr;)"YbF9Q Ga$TN1ξG"Z nD;r#jN_\Dgd r rw?w#5wc׼wM_&?L|n\|Dx {Lf KkR ,VGV.jdq]b<׈Ö.5zux~F^q/r/~JotvZs/\);aqUmywXި׺L!>eں9`0.p8>xľe\}_`V0(䃷 ro~QVy33/iX>.B_W_{\v/u3/j] v7m@}?2.=S[  rz9|A\DѴ_?m5yW^=dX] @ CgLs5:+\7- V}e>#,77~loOWNx۟o?.mkH`^ ~ً;%G/HC7l29VTAO.Atb9r۸mG9uǎ69% ,^ww#缷_v8X+NzbY 0:Zu t SMö='N\Cq8&"eq/{:'hbdu(Ƴyy|}!Vܻ>); qH{r^qi!Yiij;Gut<bɬ>,9-VYp>^vBo<(Y%eNܵ9 ,g7`( .gw~xL [F~d X4Ѓs%&\uED88v-=9CM`+%dV?*,xכm>Ȭ\הԣ;JQf=e5Ҕ`(m`B/KԖ8?ki?4#>|l23^~ BtEۻEf VwR. 7uF\P j X˘[91o=XS8l8,`{D߽|? df /3ʦ ay?<<{ vciǽd/Z8/Zt8lu;,S+^{mkMφzqG1Aw8Lf\S2td| v;{oK/ d9g@ʱzxLsH 鑫!޸o:Rǝ<`?W=jJx}p/IJn}iqGr cëϻ}׽ef^w^\[ÙZ3w0ġ64jGd f#jYX_}A7m Jpݢlbj NbkM J]y r6t^pr%dxzeSxPGJ/;q׾='&Q^߉)( 6 ʵ9z+`TS*7O+o.i!]mrQn3':c)w[Ucu7w7cMPK5ժu-ȯLj[:.AN}{hPnc_r(CE &lϸNnb0֏+~Rᾮ |gn5 txfhUunjZ\rΜR8 J3IS/&qg3x1|+p#kpމ:ӵEhɼtq7UtWo|-~}7 xe?~sٲ-˞n 坊w y⹘?۟8gy.6iQ#cD̚'Cz,vlۂ;xbq|6jÄ|1^.%!¾[pݫ_*^>3*Ekť݂? Qzz8صgYm.)ksh۶iǮ $[)+4f-;ߌ8$ ݲ=$nQp׽ȍNr"|o^&FxdH\18(CZl͂#&Nk)aCP` W,\^q<@$ӎ{,A5IjIg/9!|u[x`hh;EXp.;=Y3G[MUҁ8pL۫] z\']a8^G|j~yn^Y^{KWb% 1ۃT"=Sؾg߈G={rNE^>w8 OO\=w zqob\{1cذ?[G9gdvȌq2-!- KX`2WnކG֭s'Y'WAZxڑͥǕTF5qU,rV;{!҉@Z8-bԬgd@nW4(ޟs(d$S.yqi6JRv)ZT>eDiuaNgy9w#BmSY>pT@ +LT-pm52m(*T^PI7RI34{!8MY`>xyR/Ւhh$'[V9^sޗkzRzSQ|<+X=#ׄ7oJ*ϕ+]rJf019wl&rJws7ʫ&2;/,8ѩ1ܺm3nJ%ged ` \]{$;ҟ\e]Tʡj-W*œdY|9v\k>YG:.qx N;"W ]{q D tԵɜd5픜KN KwQ.QsbȊNc$+FB, kt`7%wʹ" S#12|ROƃ9 m.,t0x@NƐbe+ ^iWõjɿ8 ya ./'V lQ,pޟZjB@>yZB ,OخrÔE ,yTkPySM%t{| )% ᙞ&F&Cj!8\yXD 4b##ΐ+AZ{Q6t3QR7*[jŌCf+2J3d)5^7@Tpec5N̏ GNY IDAT%%/e|E~(E¾ǵXIJ׺F=Rሎ7gXޕL.H<Q|wL;W'(l%!`&˧>WQ;2ntd- =e$S3K5y:3ДLO~6.@p7"ȭ&*Ay_{&1dhup/M)-G/&o;GWGmJ#%npNKr4O]G'I єBM\QW5>0 >jV9 .e]Jjc^„5'-)jSOBWGG{@_ZՊ{2~MԍuQ'yiiUʕ]`{X#0zoZU}i^!,Vje+\b( sOAnjFAS+Rx %A<d5> Y{%."UE7|]͏Լ Cu\@n,3y{{؉NQUy]H^rogJHXq։(qqG`ײ6$H*U=qՔ A-3K|MQ"+R1^oSKG{*By+R_ {I-2na CHxZG~*JYi}L܅=rX7g7WxV*e5byvC0:M1GXLKgN28FFT*rUzj^3z=`D}Ͼ둞,sFՉ&W&3CmPyVoSgj5j_I:-͔f ю4m8biuY~WfO ˈǫ{Z߫ F.ະkGEAT$!Y-~8 f% f hH hH hH hH hH hH hH & 0zL.B 3 !$ Āa"\Fֈ%AdVFD }1~z74- ,Ls,heiHj $DH$@׻ ˚ihZH#5E (J_xy.!M)V MK+bzv@BH^f9qDPsNI[oH~a' w@Ӓ3b:G@BHD[ۣiV; as>-!*c'Z ͂e#}2ʕ K= !$@"H4" 0fɸQ74J@ 1SPY#⅄5LD# $⇄5LD# $B 2DڵA hZMc%0VBeWr4-)Ӿ ̈ϩ2.]E_.rpuYv-ki)$д]x9G5!!x4Ϡ{¯L^ayc\k@x j &ixdac+A3д~o7 9ڐ "͙??Y4cBUR|gJ->"o)̬PhdVT)S5B"1rENkeP,niNL;j1 eL߀Ȑ>Q8q!,"X!ъe i4MO4(:t> ']VR#9ʉz4-%܏MV4J5J̓7{S}5"~/Cb_;^΀J-ewA:–ޟtz9YӼK};N/C4+B]]"9xv$`ɂFB:t,^pb].\t 1P&hDb /p4[)J".dr Zq*律" c I&!YYidrAE1J#&hZJ$NBر4rt^E1aF|O [ѯqFߴD>bmt3C:]due3wp8e-Y69Ls쓰\;4RKN/WH;AjoA/I A'$|A (gJuHG*̾b..r!ѯ{>a,\ɪr#]fkBB0S"B\Xs~fDP~>?\" Qz7V"Srߕ3xhZjs0_T:0f"[RiG{xh !"Xw7luhL r1:3+èDjYz 4g?f + è_*!߀Bac;!@BءSo$V`g^}N+z¯^2BPj0x/{" b+HV^+"홚xbq%LO;`YZFL) @w}S*P\=B :W6 'HLs"0H9Av ieX)XV,H\a ?";xJ-g|,T`RD*x;GEKH̝V²f *IY99#JccUلR&nU`Ye/E#Վjv>TJJ5jM5j jA 沞g64w0fAS,ŝ1ㅱ"٧s+IۂF SXem= %*]{9?1)cPvYT.G=Ӝe1Psc!-F2 *–gEU^Si&ħ̺άT֪rJ{d M<z$- `0?|u j& Dvr1VcΫ=ޮu2 "BP*cy+|S$-L60ǜ[_,ZŊ̴=Yij#4vE_ĐXZm\AE5Ѵd#n¶GAĽX6t'1w4ȘRiIwKL@t=Lfe3–DO7rQ*jFf:#$qm7–fj79X= aм ?q&Ep&^zCkZDb($-LgΠmxqMٹFgеn~)5-a]Qp"iX1-cEqlQ]E29Ԓב$q<Ѡ#]T'&HxC_y*J n*`}^RH$}>Ka5Xյ /i$b;l" la쉇;1R{!Z–#aoihhBӤ]5؃U}ɯ,{Wg`umE@N0i=UӒHB.ҜL#^DbV;H["X/xOy`P JŒY |(S4MoW~Xքȣ4t ?V#nɥL΃aT ˚*,MXu `״$XSGJhZ2f`H[ rS6 Ong7JG ?w=rL}f,]iqtJ䡼r޵8siN0zu=tz/(pKzΈùQMK!YYջ4 $-LDU E9O*?&3bgZ֔"Q—#"5^i*sLk:C"83z72}Q*B>ߨ"(l}m"}s}]-vQҲeNĚM%nsdָV6G&U"X(lG0 aQM6})h̊ c("AҞL`1=e&DTeOu;H#Rf!{V׷$-̈G gJ-XTOz~Jչ54XVzEвrE5z@"HREhyXSiŘ)0BQ@OO(X(P}~8UgW3XQ`D`ID#O=\#ΘBR46RˢX܃Ri7fց<`}p˚D.L/bEP… 10km,5EJ>ZG7=:,J#дq"4' 1q !$}oH -q;|ATH q;|UWU&!$ -Vj\S:7|Bh(۸8KcBqWZmU ? !A>* , \-*BC>* , \-yBi]=[ؒMH{Vi=.*$ ҞzZ%k%#pQ&!$@{Viz% \-[΃OBH! PHZ%G' FўzZ[xq@BV4W኏֨$p.^ aKКS'k%$pҸ8J{I-l \†?SI-l \NHu^l{Oiw*UCŁ@; :U'΍C a:U'_ZĂҢBع/֡u*7 \ݸI!84EɄs_CTnv qUCqh aX֩)p~ݟX#[4y&<5 a܉;|*7 \;-!@W+!BwhM[;$p3Ebf̭%lv [B/q5_4G| kְI-l \>@׺q –K$pqǡϰiT5*w{.0Z% \>@w7`D$$pm.^ ;WH \-[΃N ;h.\v [מ_=$p~i4ȳ .x8~iCBHG.^:; \TCUFI-l \tvH="$k%$pq 4@+1[+s+l \tvH/pQVW؍ :;$pՁN.\$pq tE '7q> \5x'J!l5[$pw:yğ#$@?\ &ƽ1qh%qǁ.~:ФQ \:@?CLNI'8O';NuvM/quzN? \Ï($pw \!Oqh\u7R \q𫺚8W"FIZ)|.8trHZBIuaOv'HC'A+(JLFtz \q5 n'QRU*bsÏ; \ N8N8LC[#asÏ; \ AJd;|W.ww a;3sIٍ+@;;|.8_a H⦓W ~;:=|.8~Ɲ0.nH"_vZ8H:%O 5$kV ?8:n +\3 \gZGh:PA\8 W}  \5qhPj5 \5tvPnQ8I''kj:0-($pN.\$pӞq ήԢD(Oم.~Cc'ή0jم.~CwC_ࢇ_Ɲ0  \:J&9E?qǁ.~:/n@y_nO \tnt4XH'8t J@NI @?[H {[Yp>@q ǡ9NJ6 @p ڃ!Фb+3Ȯ"8U0_Bp; ODk`bz#^΋;_Bp?a~_ ŝ/!8w/y=AI;ρ;_io\w/!k:/,j%=vw体NFyaIU;;_{|)f1t;Ɓt"8ʂ%; fB#OwwXaŁ 8sك\ nM#tKM ,s#|S/MΗf:$<0.NW}Epnru@p\a /oIDATM.;!뗛?E8! OGpA.{;?A)u\5r([JGp쁻SpKtWp^Ep\\SΘ=pw@p~j;\'vPsqM#8cvzfꝏຏ=EPs$pe܃ 8c2 ncGp9pK{ k3f/!byq-x|[X>$?֣IENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/fontmatrix-AA.png0000644000175000017500000000073610722061376023736 0ustar malexmalexPNG  IHDR7sRGBbKGD̿ pHYs  tIME ;}%tEXtCommentCreated with GIMPW=IDAT(mбkSqBءH- " N`AпQpquSG]ɭKv("%MؼCг~9E[hzMM-p$hm@0/B}*MVԯ4lxi٧N4Mフ3LYyVqv9&]O#+gBN?bxX֐\yRi rs.!Jpo@I !8G17@41=~ky èNdW^saWԝz׭r&yFcFEjW_w!{sIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/fontmatrix-fontbookexport-icon.png0000644000175000017500000000133710722327600027457 0ustar malexmalexPNG  IHDRasBIT|d pHYstt+AEtEXtSoftwarewww.inkscape.org<\IDAT8[HSq?9s3w:QG'vBTvyR| Vo҃CCA/ DO>YA$1)2K0V}wNK4`1?pq1}yUǧVUP{Y%uv]]TSYS^ ݜ<ýGPT%F`%ɵ / aE^}{G#FnMl.WRy)f3n^1uc*h@)΋A(KU :¢9s; kZ C5,22M+,OfeF Rcky9 }9} 3w mVVD&Yt(+`0nSa砌8MqFaM#cg8qgoM5%+R KԵEhz=4F9ՏW,({[TI ZL)avmK 3WOccl|сPZ gO2FER\V@7ܬT#HZVD[y-$*`2ac~ 1n!QPdG2o\~2KIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/font-playground.png0000644000175000017500000000124411024267031024377 0ustar malexmalexPNG  IHDRasBIT|d pHYstt+AEtEXtSoftwarewww.inkscape.org<!IDAT8u?H[Q/&(w&KItZbE+JLE38vm {\\Z$ QЭN6KPPAC}7}{Gi4Ȋ >UR$ATjd`/rd.F <(c-NB B؀SÅ~|tr|ިEk0u`Z bs8H#Р$xf=IMMtSz0.'Α^eޒ@!IH+iAHhKCM̈́AMC1iQ*$J@ P> xo{+ %m}9GP U}p. +"_p:+T(2!ࡒ~o O|YZJ@;H XZ,[(kGYM<4>22\f+1ͣIUlMMܝDfcwi &H'' S`uRpf28S--h&$F:A4<ƴϯt1Ly<|[]E V54\gQ*A6q2 pN& zXQ_"a& S4S ut<2J kbŒ χ| zgB֣[&3kk/BLydY%TV#aqJֶ~=#;;ՠIaJaodwt`6o?X,Rr̛ohP(Ñk?Rt]/b@˜$,ZZ"8z5X7#YAF@>r{zx'rSign6RA|ߟ:u>V\Ɇ EGJ>_7p#!L^%+NsO`;μ@#`ddQPй{ٱcnjGcc#r H۶,baTl'O$2 V@I)ڵMgao}BSJ8ؾD{d?!۷ogtt}nV#cǟٯ?D*gWqFLb\Qutc+ž}سgϜu]y78RJ"?䕱w#J/RyԋS?.X](%|Pѣ2::?ʕ+yg9rei{cǎB(ϟm[9 "j2O:RD]~۰F3|qv=3-~˗җ 7SO=bٳ6/_΅ XE8& is @ ׯ_Go޼O~H))  h?O,o{nltuu1 p8GdY.Yʒ%KHg2Up:9/khZ{f7nn!Zk֬ Irh1 )%aw;&'&m2t!J)5H$D(?!0@Q1H)w8JaBdW\oŊ۷M( L2DJYӺ0M7|.^HTOC6EeY$SIh6fYn&`RpkJ9Z)Rz>1LLL000ҥK5DOOĉ8CKs wy'7tSy`hX,F,yV.twyG-xB M5sjͷՅ z{{iii!HL B_%.<6m²iD)8{,c&e-[`Zм7q76qf41Xl4~W]Yb}w=-CӴ f/G%8ccP~r4m$z>˱o> `rr~-[F* V!D&&&x0 4-Mఇ7s @l:4Øx59Ⱦ},)ikk#J|>!.]B))˳2>>c1JEV`f0oI7S BL&R7ӛ7 ,²,\BOOmmmd2`GFr!P(&|eLD4&'e?99Ɂ'ZM[PR z)‹Pt;U?['I.p8Coo/XV `6˗/G4.^RL&aST0MWW\_*CDc I)k[J$㹥׫x5<`uT*!4rLGGtq!҂RXM bcccضM:Fux HLjF &F*8U?'RڵМ4w < bi[[[Bp9* x\0ضMcc#aP,yq,xD"A"_Z/m۰q]@ qx^f2 ր[L3bȩS8pb)%ccc$ ڐRN_a c6MMMA\f D"hJGj Lm +љz_4a/Fx_+W$8X mb1,"ljD,˚|"ovvz+_Ktz7nqDJXE<'LNIRT*D"zzzPJrJ,ܹse-[i:|4D"b1{.`~g~sEp[gZ@rL&IӤSidr@cA`_p( J%:::szqnu6}W,9}4J)"pFVZhn۾U}5/'OǏw~]u[7@;_=֒%q>z{zfm Hu6nfnF,˪Lz#`һ:[DATW_套^W]S4!]|ΝW^Lf 晿~eK.\@ m% 8GyQ,bvq,]tF<\n#M-KA lyRWx9r\reh 0۸ )FFF"S(ˏH_4>%w˸lmN*PR 6sNk.֬YSC?'+K~:7 ٳ-WpdBBļ?U*(ŸRy[o}j ,p8]*q1eB׷2[)JSJ1)=n&,K[n}ɓOxYa|„;X*@ׄ4o$ӛLLB$$Mj]4J18 9m;w' Xiohp2R}GWrRb w^>8BUd8y(|u{E*ƄГBDRNz{T6׶Dse?͒3gX:)IxUnsIL-. !9 YIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/fontmatrix-AA.xcf0000644000175000017500000000370610722327600023725 0ustar malexmalexgimp xcf fileBBO gimp-commentCreated with GIMPgimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 32.000000) (yspacing 32.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) A     gimp-text-layer(text "A") (font "Sans Bold") (font-size 18.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.611765 0.058824 0.058824)) (justify left) (box-mode dynamic) (box-unit pixels) ~2, 蜜  42--- -     $  42--- -     $  4RKLKKRITWVZpYUUZzv{}n϶^]i  [%aY\!UPP EE ԏN New Layer     fontmatrix-0.6.0+svn20110930/src/graphic-resources/splashscreen-vectors.svg0000644000175000017500000004053510716422733025456 0ustar malexmalex image/svg+xml fontmanager a ont atrix fontmatrix-0.6.0+svn20110930/src/graphic-resources/fontmatrix.icns0000644000175000017500000012676611035731737023646 0ustar malexmalexicnsis32h"QZpvVbp yPz[sj~|BEUlx }5}m^}`fTcU}^gNp|\;Ml=X|ZwPLIqqN·KpX~zwremlNnj~]fzwtpmjiN*zwspmifBN G   (   l8mk`̈C8v2Dd ۗSʅAs/`C{ v2 dk2vC`/sAS dP2v C`ih32Qu .:ňr$ Gq J| Gx#Ew/GҀ-?r[/Gڇ4 :lޚG";UG H~}|G/B~}|{G=/~}|{zFGe(piiv~}|{zyt rgi[Zk}~}|{zyR~J{ehML]y}|{zywf|d>Ak{zxwvSpZ׀@2Vxwvvxw#g}XO(SvuaowP[\pJ!Ytpw8߄xtdN2 npwa4dmLǃ=owAU}qJ@owxsN|tG pnw_M{wE ޙmw_MzyE}'lw}_LyxN>̈́=kw|_Kxwn?BO2j w{#Kvutd0{cÕiwz:Jutsr6a xjiwyyF sItsrq9H 񔓒hwx~}zQ3Hsrqp<8 gww~}|{yxZ$Hrqpn;5 fTwv~}|zyxwvub.Kqonm93)r_wu~}|zyxwvutsrqonml70)sIE;t~}{zyxwvutsrponmlk6.)ߏzS+s~|{zyxwvutsqponmlkj3-)~\6u|{zyxwvutrqponmlkji2+)38}|{zyxwvutrqponmlkjhg/)!o♄~}|{zyxwvusrqponmlkjhgf.&I~}|{zyxwvtsrqponmlkihgfe,#z|yxwutsrqponmlkihgfed:hUڎssrqponmkjihgfedcb[:$}mH}onmkjihgfedcb`_^oihgfedca`_^u ΄fdba`_^]?Fq_^]\mh̆%8.*>!] % Gq  0UGx#  =GҀ,   WGڇ3  "G;   (G  G. G=  G e  b t   R ~ ~}   )֌% !      w#g `#  wP[ ($ ( w ߄x ʂ ( w 3  w  )] w  s m w _ \ w  _ GU  w _ 1: w _ B w # ST w  : f  w  s " w+ w 3   w    Tw   _w  E;          f0 " W ҁ3  Yـ$ sjm o<  #    D f%8.*>!] % Gq  0UGx#  =GҀ,   WGڇ3  "G;   (G  G. G=  G e  b t  R ~ fe   !q !  s   w#g N  wP[ ! ( w ߄x  ( w 3 {t w  g!] w  s Xj w _ K w  _ :U  w _ ': w _  6 w # CD w  / S  w  s  a+ w 3  h w  h  Tw  h _w h E;  h    h    hf0 h" hW th3  Hh$ ]Vm o<  #    D fh8mk ۣ^?ՐL f~9t"k&}+XϊE w2d ۖQȃ?^3xL ~X9 &Ok9~ .L8888^888?8Q8 d82w8 E8X'8&kE89~ L?^it32Cà68J ꈱMy*k㔜[^Н?8ͤkع:?wG8wO0clKwV ,^w^'Y*Hwe"U 6wmPjwu"K~컶w|*Fy ?̓wׄ1At 2$wތ9 =oljw@ 8lâwHHNwP %_0qwW <{ ~~}}mw^ 7~~}||{w7H~~}||{{Ɓwp X~~}||{{z_wDo~~}}|{{zyw4R~~}}|{{zzw3~~}}|{{zw|su~~}}|{{zyw; g vomkjv~}}|{{zy{8wmlxqnljhedky~}}|{{zzyw  xvpnkigeb`^_n~}}|{{zzyxw"omjhfda_][XWby~}}|{{zzyxxPi!rljgeca^\ZXUSRa{~}}|{{zzyxx4x 4~kigdf[YWTRPNMa}~}}||{zzyxxwCimhfdu{VTQOMKHIc~~~}||{zzyxxww(R׳zgec`Ҁ ݄QNLJHECGf~~}||{zzyxxwwvgVSgdb`sKIGDB@>Gr}}||{zzyxxwwv_ rca__ cFDA?=;;e||{zzyyxwwvvŊ_ @~c`^\ UA><:85Ry{zyyxwwve__ h_][m G;9752@qzzyyxwwvvutҏ+_ du_\ZXχ ^8642/3cyyxwwvvuu+_Gwܞ 5`[YW531.,*Txwwvvu܏+_CzϛP k[XVg 90-+)'Zxwwvvutˏ+_(]uZXUS L-*(&&awvvutwD+_o >}YWURj*'%#&hvuttМ+_G '_VTR ['$" (muutts+_G(Gt hUSQ] F$!-qttsst&+_ T͓ zsTRPNߍ 5 :tss|+_ cՒ΁b|TQOM (asr+_ KO\QNL.rr-+_ k 8 H~fPMKT_Yr%+_ w  B~~qOMJHۏ%+_ p- <~~}zNLJGm\+_ G:5~~}PKIF߀+_ 6F 0~~}}||UJHF| ?k+_ EG/~}}|\IGEt ߀+_ o͏G/}}|{bHFDZA +_ G/}|{{gHECC +_ G/|{{ziGEB@ 6*_ G .||{{zzkFDB?% Ț*_ G .|{{zzymECA?mכ*_ G .{{zzyyoDB@>ے*_ G.{zzypDA?=В *_ G.zzyxsCA><^*_ G-zy xxtB@>;9V*_ G-y xxwweA=:86N>)_ G-yyxxwwvvf=:753z^ꘀ)_ G-xwwvue;7421ҏ)_ G-xxwwvuutb641/\H)_ WG-xwwvvuttsI30.,ǎ P)_ \όG-wwvvu ttssk40-+ї)_ BG,wvvuttsr@/,*m)_ I*G,vvuttsrrL.,)AƂS)_ WG,vuttssrqW-+)&΂)_ b) hكG,uttssrqqY,*(&ւ(_ ~m5NG,uuttssrqqp[+)'%ނÕ(_ ~}tA 4G,uttssr qqpp\+(&$Ǖ(_ ~}}||yM<+ttssr qqppo\*(%#(_ ~}}||{zY!+tssr qqppoo\)'%"(_ ~~}||{zzyyd-+ssrqqppo[(&$"s(_ ~~}||{zzyxxk8+srqqppon['%#!t(_ ~~}||{zzyxxwwvqD+rrqpponnZ'$" ۓ(_ ~~}||{zzyyxwwvutO*rqpponnmY&$!(k ~~}||{{zyyxwwvuuttsY%*qppoonmmY%#!܀( P ~~}}|{{zyyxwwvvuttsraMqqppoonmmlY$" 5'6φ ~~}}|{{zyyxwwvvuttsrrqppoon mmllY#!ĒYh ~~}}|{{zyyxwwvvuttsrrqppoonmmlW# V, N ~~}}|{{zyyxwwvvuttsrrqqpoon mmllkkW"  c:4c ~}}|{{zyyxxwvvuttssrqqpoonmmllkV! pG ~}}|{{zzyxxwvvuttssrqqpoonmmllkjV {S+ ~}}|{{zzyxxwvvuttssrqqpoonmmllkjjUڏ`8 ~}}|{{zzyxxwvvuttssrqqpoonnmllkjjiTlE ~}}|{{zzyxxwvvuutssrqqpponnmllk jjiiT菏vQ+ ~~}}||{zzyxxwwvuutssrqqpponnmllk jjiihT}\?}||{zzyxxwwvuutssrqqpponnmllk jjiihhS砍~~}||{zzyxxwwvuutssrqqpponnmllkkjiihRR˓~~}||{zzyxxwwvuutssrrqpponnmllkkjiihgR~~}||{zzyyxwwvuuttsrrqpponnmmlkkjiihhgQ\򣀇~~}||{{zyyxwwvuuttsrrqppoonmmlkkjiihhgfQqҔ~~}}|{{zyyxwwvvuttsrrqppoonmmlkkjiihhgffO$-~~}}|{{zyyxwwvvuttsrrqppoonmmlkkjiihhgffeO*~~}}|{{zyyxwwvvuttsrrqppoonmmlkkjjihhg ffeeO$ڕ~~}}|{{zyyxwwvvuttsrrqqpoonmmllkjjihhg ffeedOkNjWF}}|{{zyyxxwvvuttssrqqpoonmmllkjjihhgffeeddN ({{zzyxxwvvuttssrqqpoonmmllkjjihhgffeed O Amxyyxxwvvuttssrqqpoonmmllkjjihhggfeed ccT7  _iȈwvvuttssrqqpoonnmllkjjiihggfeed ccbba`I( }ۀx%}uutssrqqpponnmllkjjiihggfeedccbba``Z<;0ussrqqpponnmllkjjiihggfeedccbba``_ Lf͉qpponnmllkjjiihggfeedccbba``_^E>|onnmllkkjiihggfeeddcbba``__^^_\smllkkjiihggffeddcbbaa`__^z֋lkkjiihhgffeddcbbaa`__^]'`}jiihhgffeddcbbaa`__^]]qgffeddcbbaa`__^]]aU7ieddccbaa`__^^]\}cbaa`__^^]\\.pbaa`__^^]\\[f`__^^]\\[f~_]\\[[8Pp[ZHer()3K#lc+"7UM%@.< RE$:?0 .LwG >wO  iwV  'w^  .we   Awm  iwu"  &ڗw|*   33wׄ1   Bwތ9  tw@   &wH   3wP    FwW   w^   w7  wp wD  yw4  w w   $w;    wm   w   w"  7i   4x  MZ  C  Ѕ- R׳ = UgV E- _  ă _ pր _ ׅo   "_ ' _Gwܞ  OS  _CzϛP   #C_(   _o @ _G H2 f_Gt ،  11_ ͓   _  Ւ΁ z _  B _  8   ֏@ U'_     _ - P_ : qY_ 6F U` _ G 8_ ͏G , _ G ؑn8_ G ϑ_ G Œ_  G W _ G +_ G _ G 'Ƒ_ G !‘z_ G Ð2"_ G MN_ G k_ G  1H_ WG _ \όG q_ BG F* _ *G 3_ G ؍_   hكG Ӎ_  NG ύ  _  4G ʍÂ' _ < ōł _  ōł _   ōłd _   ōł  _  ōł _   ōł k  ōłF  P   ōł 6φ ōł h ōłq   N  ōł+  4c  ōł   ōł   ōł   ōł"   ōł   ōł  ōł# ōłU ōł7 ōł) ōłt ōłB ōł33 ł#  Vł` oł6 7Ѕłm&  Q؂ł! jłK 2ł+  A c 9  ?&   U  U,   U   16 (   U f()3K#lc+"7UM%@.< RE$:?0 .LwG >wO  iwV  'w^  .we   Awm  iwu"  &ڗw|*   33wׄ1   Bwތ9  tw@   &wH   3wP    FwW   w^   w7  wp wD  yw4  w w   $w;    wm   w   w"  7i   4x  ?I  C  l% R׳ 2 UgV 8% _  u _ [h _ Z  "_ ~  _Gwܞ  @C  _CzϛP l  #C_(   _o h4 _G ;) f_Gt  11_ ͓   _  Ւ΁ c _  5v _  8   4 U'_     _ - sA_ : \Y_ 6F EN _ G ._ ͏G $ _ G Y8_ G _ G _  G F _ G y+_ G _ G  _ G z_ G )"_ G >?_ G W_ G  'mH_ WG x_ \όG \~_ BG 9* _ *G 3_ G _   hكG _  NG   _  4G ' _ <  _   _   d _     _   _    k  F  P    6φ  h q   N  +  4c           "        # U 7 ) t B 33 #  F` Z6 -om& B! VK )j+  4 c 9  ?&   U  U,   U   16 (   U ft8mk@ߝXVϊF x3e!$ܗSiɅ@Sr.y&`Ӂ.7֒M ۈ6|;>m(E ZMIьH Uz5g"ޙUˇBt/bؔOƁ<o*\ӎI |7i$VXF x3e~!b-q<S cg@5zr .H`Z(,mw;Z M;]`. r#@,5=FSHHH!HeHHH3HxHH HFHHHHXHHHVH$iH7|H IH\H*oH Trebuchet MS Regular
Trebuchet MS Regular
/vista/Windows/Fonts/trebuc.ttf
581 glyphs | Type: TrueType | Charmaps: APPLE_ROMAN , UNICODE | Panose: 21163222224
Nom de famille
Trebuchet MS
Variante
Normal
Identifiant unique
Microsoft Trebuchet
Nom complet
Trebuchet MS
Version
Version 5.00
Nom Postscript
TrebuchetMS
Droit de copie
© 2006 Microsoft Corporation. All Rights Reserved.
Fabricant
Microsoft Corporation
Créateur
Vincent Connare
Licence
You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content.
Arm Style
Straight Arms/Horizontal
Contrast
Very Low
Family Type
Text and Display
Letterform
Normal/Contact
Midline
Standard/Trimmed
Proportion
Condensed
Serif style
No Fit
Stroke Variation
Gradual/Diagonal
Weight
No Fit
X-Height
Constant/Small
fontmatrix-0.6.0+svn20110930/src/graphic-resources/splashscreen-670x470.png0000644000175000017500000011014710716422733024712 0ustar malexmalexPNG  IHDRޕsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxwT?(E5ػklOTlآI~F'v5FbI,QPD)]ٻ{9ܙ;~5ͽg= x<}Nv\@yT8c-+b(<@ iu[TaЃBh%\틤iub%""")i'`D2ͶJDDD8U4 cBUFa>609B VFۜVCe+fCb%""">xکlޭo*(HBm1YAx0Y٦jTmn= Q""""%Y6e'ժfVefCb%""" U練i2`>Halh{ DDDD!JKl]/i6]G\n= Q"""JCZ:vݿybl( `ll{A DDD&mb8 ytMy%%%/**:ol [_we %ۧy^cnn;}<:F%;L[6Z^s5y3f(N̛3gμS:Ag{=җxm6mo=P"""J1Zr/+{wNа_X믿~uii2NNbxNޭ.Ͷw2QO ϛ9sn+'|mڴic=>qԨB,L~vF!HདྷڲjP˽{nٳwٽP 𕗗.**[""Tﺈ~?2 u 2G~47z;vX|'|˗Bt]>Y}4!4IDD7+:'C9Y@xDs:thM6-s ҍ֭[{KyTMfUQY6w(þ&S9A4_Ν;׬Z^X60jDU˪ ɲ]\_""JVv[ 1 B)bϖj'ZbwnذaY |sçٽv]f]Cn(QEsoG+?n!T lݺu;M uuue۶mo-_r֭5V UQ",dYV?DDN&p.u,Khy<O}7{AU ySuɛ Ronۈhf,K*C>xf/کlm۶inb u+V駟^={튊,Y)S߿_?BP;^CNDDxT9M+v1Z6z@ PYP@sտv۷oNsSMḾ ~x 7|w:OJX5 @hT..v"""7ٹN{$1j0@U3j'ݾ}\wjkk~7tMرCN{AUP@emDDDn4tF4Ͷ9Jea9ꃧl`Q!e/{*V?U˲iu㈈bJoY,$L}fV0@kcǎ/injYj/۶mFhSz7o;DD"vU:NٺvϪbnz$ FS?('xGyd-»ۭLR/O#UT<-V:VAT\L qΛW_}|åxߧ>@ a` X"""72 eg7l:R]]\HpGx'x<UW]?z|<8=yi1tT)7\0郏}ӣ?zH@y CLCR?mOo[>@zP;V:ʔFsj}֣X7=e}xZS{d]<^47'w#%|أs=6bQ[[g\:׹6^{dz= >!:_*C@>d#P =黝,<=AVCe%n,x?[я4O'dee_~3ߟu?d\:׹6^{'S{@]P@I%Pz((|i%\F-0 ɲ]\H*Oqy%|2xǣ܂_~9d_̓O??{/+-cs PUQe|\:׹(6^{'{{`A``J`Rփ*L3n7B,{buGO-xO.Ϭ~gFrX7-۬E7_v|R|.V.[k+\:^=c?cvF\={Q eVFׄdQ5Z(,xϬ޽{۵kg'Ŏ裱wv"Ϡwڱ>O;K\:a]kdoO$׫K}X4zd{P(eP7&@ȇ][ւg??+O˿ 7r 0/PH÷ Ǭb7+C)׹u=c?|@`V``LF2җՊh$]F˭]bCg<r~_v;v~ x<޸%)W_O~__yk/)ÜcgWus=6^{'{{~[UKK{ oAjnx! Z¸M\{.!CtFNUl7ح{gdeٻ#"`ѿ/otVs.nc{l' /j VQ; YֿCBCxSz yW@[^\pA;o?`]̺I_Sl3]|Jܹ}z|466+׹]=c?;39K] ' v*:`Baܺ1S Щ|jZ+bg1.zj &toӦ (YЀ3[E,齞fJ;z:׹umlOD{=Z>le0jv/YT..ncOvq~>Tf#x۵6O֖O<… 'KM~7mEÇ[y)0mGuU ?gPY\zꮋ{1۟zu[9!NP; y[7!|j'WըחR 'd3K]=6mq͗ï_t#ڵoI; I廀3BoيW)y["G/<[8id u!T&e3l:YpM7:KI[rrqϞ N5E6X׀[US@β)PUd֍1^ PCkESlTlxb/;w cԚ];a 'BNcz-""Dp1߁? BvBQՇNg,U}L%Q<.Y8ťYPH!YnaJSuxO..FaHzT<-\ n\>*vU@ZckΉ `B+!/U4zu>UO8t_6e}C޲ͭ7.É} hFDC[vƨ5^)[%LYӁm!z+x_ |jS5 8t_v@RjP*'9_<vI? <_͎`ǎ=Щ_6S>vکL}+XgKM{e* nf݊qoGUEdqFW'?Mm ""J4 TKd=@çxq) bTuK߽^ot~ 8ñfRhۡlʊ*0-2wٓpjMCc`niG)d|}%YW~hz%#3OYWxgBvލ) 0ݪ'|u8|0ADDP2ˁF4K>-YIͺȫsUO+JڮvQmu52Tڎc=!w۫ޫ+RADDp<@yS_sޭ>]jz5Cz@S|rVԖŪ>Д)3$&[SSVZ?mҳ++b.,tf%=4+ZO0o4γUaӑiT/*bS{u~3*{E7v]:^35g^t Xe(ȇfyYd-'*wՀ#=Њg˱P]Tڵۨx67p&2;ADDEhjڭz ܭT=ŊF8ey/Oqϰkzޤx)*B N E(2ǜ0&%!1wg eŧDlG޽\_0䣯pYS1hQdIDDdՉG@=R4zQHރ+&UO/OٔJ@SFd4q=,,w?;nKBQ3lpQ (FC1|mK[@ūpRG@fRDDD|n@{'OJꑙ- §8H)vyiSZhd(@ ~% 0=ː)+q lƘwvõk].5dzν{>|MM?gdx믻6:ÆС75aQoۆ[F|lt?0tGfn.jPSVҭ[Qq_#<,d@}P ɻӋm{pя!2 @K.~=c²ڙ*hV<`͎Ϯ}zxm'\vƜ~z0l6;F}e}@ S.]0Xl9mJݷi}u,yMT;3;q]z)8|u<4>6ΝCD䤎@'?|Bf^^ɲ޿.,zeqL8СwoKا&\{-&\{-vY~k>CD+'T3i zPeO (htK!Txg8ߝ9IO^n1&s XWM= gvC^N6p9m.d睇ׯU/l9ty$n\͍DDN2΂grYhdnԓ̫_!<ᅘ;2srp+1׿FFVV}9:{6c IDAT+_x͚@nkO"r`87Bå*|T=BhF:]oxTϐD?U֣k׏{'\qELQ[Y3fұwoܿp!N2 zI:s&_ 'v'W_uDD6y&vQbUs-OV<ƵvB*u1e Θ2%Y8cj++c~X:p X&#N; }Fjʘߎw\o@NG?hj%z\dqw;`X>~#@6;>CL$sVrq%َ͌㒇cn:i v̑Qk 'yu)NCljMix<8ɬ[ =r{/2c~Ǯ y^&gŶ>o?Qر(4 ?/^l2"MEjtDrE#$18r(p3P`J_Om#UStšP2O*Jen.;v`Y1N,>p\anJoL;"JGcl@宽2Z^ I󣶦ε.6]x<8㦛>Oc}=Pu |cjC:tAƠ У_-ڃmƶu[Q]nu(9DC]o؆?lFOtGѺkgy'vI @U1P/DB֝X9gKLҡ{g\¶o{l^Gq, kX[Iל#xGwSหA=_.8f^/__!@wuQ|e?|`S6̂bS  b*xZ듣SUek37+CƏGς۟3f˗_ƞ~Bcmm~1׳rqp"C2zf|Oحn-8Q9 ?6/ۙ ʽOmTSǢ^kGE?v WgZx=7? U@*5XfgǠVϺ |;Omө=NU˱y 0_uv=r\FfgcFyK<#q򭗢7]iw #N>e$JbqoʂR>Й!,UOFUO#4Chx|4sX:~Kd]|XvAT|S?H_ܵXO+դW4 . Vefgi Oqz۾ FBFF =u7|!]0ZBgmU >z=lX9y9q9fx@oKom߳ugضok^3g>{qi0/޼?b:熹sCBށ"lYC'O(Y:3snnߠ80x0 8“#MKUHss0w>CCC]e58x}2sqþEߵ*p>6-\aD&V8xʧ>|Bau:xr^X[gW{btoQ2W<;^E4Ww^ރn߃S?(;|3s~~t#㢩g[< 9@Me (YܲX?Λr(w M@9=*z)`bHoQ5v{,Ud5sVŵ?7/C}um){6K?[)Uo^9 'vN dwm6;@y1'%~@@)ƒgZ)V<ltJfN:gbrqJܼ Gs fɎuf޼եgsmm k޲~-m-ƍhYwQ _-Ͼ`t8dsʡJlkc hεNPuǘPSk׆plX׾ d2QޗcsƏ\Y_UזID)s0 fyNT(t|\fW{V[G_k!-!aӪǯ{l\@pРQCZ ЅK(ϡ7 cًۣ&=zD}ms9tnC زs 97Cr_-w^ϦY_Y,=y(^C)/5:bT~=~)Ѽ(]=a=|zFQb;]U nup ¿CW8F]]?cnoqp$6+?^rb-hȿ=Yv~!<9޲qPݻ7"x pÄoWS\Ϯ.3v,94/F K?VۧMBAHl(,#8g]a!$cU*sV/[E7RlhYOM>ݏ## ƨהMoId̨/@Z" ZCkl-{)^Ib{t[޽^o}Fw"|?`+oGoMT I$`ںmT`s4{vx_tpp CѭSk|*|QGֲ\+>xAsoaaϩ 9[B'grN49r׃N:EɆmH/(c+#>Q #a^`?4paSbWPܞAF^8OY]xZS]V??X~mܫ"('_&3jZu|>y%G^в\5͌7+ ǎʝ;QW$׋6+zl_:z>Tan7a42s[8jP@|hޖ!mO tn4ȨsX+ vWRQuӪ;.3wF:ئHWtD5%~e1r7eLTJ~ƺ^Z^WF属&#y$2r=ʬ2ypdooxsv2y[f2sr|9:S^h)+γ:ddn6o踶 ?96=?jձZ֝xV8c?Áu#(SUR} ŒK. nY+nHI:bpq`>6G;"-жWp9Xaun3kT:=FSb5 m۰sٹr Os GjKmG>Q@ߣG℻E~{J1WoJ-<?߈ kU Fr/}٨ٶ'ЦP]s2 < <DCPpx?,{jz; DŞҖE߬ekUe`!f?\G ?DL +R,<(QT Z}zq{9NݦM{#lR3`&VA96si\t0z+F14Ҡ8.n2J*`2sfJl=v8zN{](^W 2(]7\o粵ٷ:?۴oY#m#'1lv̾>|{8 ZL86Boެt^@MU4W9qKP]ūPxt,rHnس~ ~IRwy}e 2wpܾGO*ԕWHj^dOz.vZwAF":U*bl Wyyy<`']Q͍iN.{-eƺ:,{MGo'b[o>ʮ{]hS*=DSyPY"#c1q|$a6^}M`׻(vv藝\5ZN?Zg75||,Zm{ěnq7ߌ}4frR5'AOulBy'2妁QDfS/-ίr?%!6l0>͐s6`ZgQlBU}aNUCaE.vYS_+Zm ^PU\?Ӧa/nCN:)/+rqzPZUZ=& VOֺSMߣ[0_߽;9vEeWg=|zu@#a3v>2SH*Щ_oҽ75a_FƷ/jˍw\FGYMMgUm4ږd?\z;CMTWǨEϕI#8g$d7;Qr9ܟ,8 u1|U;eEbЇLYwӯ[rۻv-s-};@fMFJ3;xY4Z7iBy9ɎMvZ2]u/X`8O($.]j?0kr'?e?CD:9]_ '.d.M8}+ڲaSg7-/gÇgg͍ikNEQϨ:i5lPsZ,aS`"Hg2݋ D@Q59'tUtiͮ#gE@ XFnjCLB@ R+hZ#6|6| I c ʖe۬)#ZɬYTT`g$۟K@m}5'ubD}(t'FçyVG7!4|64.2kxLٶmu-Z6 (.DC>G:%3^G03mOX^aʷUL]GBV[6AxiuJSNieƱgiEMhMAEZV&^O"م i0Yք_躲OʧQ[fX+Ud [NߟIDD$@gs[v*F#ۡDoeԶ~q~f.-|z.N/vO;pd۬(oèf ǪJD&~d?dTۈ@=+8`H&oajad*U=ŗ~Tꙡ[ٲf5š; gt -{aKݨ=wnݬkYC#""JGE`N8pB/ %sz2XRSeƇveY2xy{%>wJT}j"Y"""::9OZTTrDSlryʧ6/Bh@^T нfP|G%,fe_ U{g*P""hza٤OOH @h%0dO1R=݇`o.U*Y ɲv٩2䪐^UςFө!;kpFE>ʩ $@ #=QmQ*ib*R=4j^$`oU\(۳ Fb4nZtJvvs۵0!㩚Hoe,tU.e1zj6*Q IDATP:/>NYu7`Tdl]~]>a+T<91Yv:d#ڵw'=,[tDDDDgݐ8h|H2vU;[b*Y򣵻\ˈU6@Hw>O-J# o{(ɖdU{dvF2ݒY$"""DŽmO+FN=HLW*냨@[BCS8}%,KfnTTthvz`QJ dYBv""՜~ݻ8]^I|מe/;y;e?mqxM6(iS꤃^vYҿN~ݺ>eS,UА=~fN*bc`eۈU `dqٱ{<.wAܲp#͏`7{Ȩv'FeJ(#IupyOi%ԨJDERm3VU;Ǭ`^/ d/<@w-!7 qmV=vv=̩7_.]J~C+hdg`7b3H>e!4 l_WBR2ݾiTa1 Ni+ WݏyO<^U5&_a||c٨vS& t#ځc ,[e5Fuil^rۿ`3`+DA:T=;9.U:薥))c~ħ˺ Ųpj>HdPh%1__<LʋX8cti"""'ջ݀8hZ񌶺R@轛}cTG"`YjZkB3z,,\((eZG胥)< $vCFT $YE/62kklBg܊w~ ~a,ѵDDDj3S7&l ԑ"ȶYfSX۴e)2 xd7YZr:E̤`%"X >nH ydUn'l?_|6D"33k)ĨxZ+V=Xx'yrdhsi>Ac}C9c%E+G-OʦYPM YJ v9HiV|cdkz⃇_Ń'߄yյI%"">eP]ܦ9"+]axt;8JR9x`xj t2:_,o-P)҂Q7M!mF}V1UmP`"f׽_!(jlSQ| x0x2z+f{`|O_u׳YDDDٽͰ2-'Y#V=j,nxYTfUQ6DDDʯM+]R FV5zv>Tlt>"""R.n'P,2:V>u+JUU:F FDDD2fN3DRqN muչTUT*nDDDdίX~4c)[>"7nnI!}vYeEv+ۉҔaRq] Vd*V*DDDdH6H60X6W3{Mͺ*b"N d,|#J5ZR3"""rg{N4ʎ3jlݬ9#""E̩ ȃvݑFm[p2L]ȯ_4g5|{>uUobJ{u+An;EE:,8M@8u}5RBRuIDD:ñ dY׻RٹdجZi5m#""V:#0xUOձx6]&[7ku'""JsFToiVCOjaej#cP6HYHC')#w1xRhvz،^O+(IRv'˺eT7:} DDDOx|(pj"xT""b$CvHT}>c"9"Iح~jX DDD,)~6۽F<>GDDD0xmP5hB#'Q|1xRĢ y(1xRԜ  KDD aYY.K2VN-%JM+dbeg`ĖmvggСoO 9}y:ڃ1m+%. y^sBBǵC7[B'lK U_^vT(ѥ.? qyİ@wqT~fV]ZfIe˲\pWm\czBIȏH1` 6"VեU1՜)*[=3gfήV3Ͼ8Uvu3V~}Ԋ*n'PL=`#Iy4f[Ch,)XR^fjkهl5,_B OBa{6$< D%'#]-m>ApV |!<>MH=)݃si|N8Te/pCYܧy b( /~؆}0v\G L2>mߡĠ.b̊y($'1($f NT ٹ}6;_LB=_@Aa!HxBbnt4,B,|~i?:𙧡^r< ·ˏZĠt$\:Cj?gOO六ŀf""'1X8pXN95R<.ȑ $U$D&!>+)ft7VKOǠ3葐)iƫqzbSHs<]hE{M1 HF\z h>Qf S|gh.n Aӫv&1Ƙ/"c5gؿSD;c2͜ļlAO|vt@kUrgN˜.¨KEdB8gpؕbR0y(;ɣa?&v!; L*]~1{M_kWufu b3S]YS#/En} ̄K^|RY%Z=ᫌ>b9_#6=Q{{Z`4!ml&ݸbEo1 43i0\o;k^x%e0DF"{8Lr$a#E\  WE''Dھ:~y-~ 2yI7.12}m>ˆ?zW_v&<'Bb.$ĄJ$A f/ 9,zO5kۗ<}o"ۿTv3fP%WxNJ\ 9_73پUa[k0Ǎ¬ތpiZQ/|S\߿ȹ31n4)ūʒuQ8.׃̵S w\1⛭~"0/"8X{ >nvCyϿbDΗWu1mՆ}G}lHĤ%ZQ(o?G~(:iuRD%%*'29jwoe,}VK:.Ț:iSF{h.5^xLM>?bAOYpݥvcI9cSÊ}Ga%eZONGY9նZ5ZYdL~٪JDĖ*;.Y'/"b:f$zAc c= <8'a<$<ct$>z^PpAg;)Srs IMr=_YcLHa-At>}Ǚ3 ó (s" IDAT<&\v}uD1iţ5Tp szGiXN75~gn߹"сᄯJ8:5F6nTջ \Zf{M=x|=jYڂPYm1S(3T OA pvn퐓sDDDJ}ѱ2u,K>D&c\ElaU{ges]n ?;wޙZRuȜ'g`D'ALj `:=jϦԍI*eZd(dMauSlRsgK;3h$lhBKyu!dDsD1#2Hx1RTJ;~ganSkv7y|TXPPMoaJ-u\ɣPeUgS|g  \TF)| 9HDyR0Ա!17Kvu7G'Lx9i(Eo4ӃĢ~OibPY  w[4{B(b|kHx:.Oq}9|cNW(ogPpXݷu{QrӘ?T5ٻLs^atjfg#6#նuqc# D#_&`/:ZC_H%9H ǹ' U%g@Lz9& lh‘5_LCrAPO=F6c&c]mH GNxTܟ.t8wE "'w:}|=L[U-Nг^X4T8J|g{Ng))ԟ]ʹ~Y*>s^4g݁غ՝R7~!ڢĢ擕Iv NrDi m$<i3"pي̆5[c Jb?,=mMq.Lj g`3]}c*5Mu@DE>@B-Dg3Nx7$<ݯ7>ˆYw,<<W|s6ciB\f>[O/TJL{µTyW_yH]; Rj3g;:D!<2KN" @C [B?&0hw!Xqk,CdbJ>߄ dM)Fެ)(?߅k9;~h8|f8l_r@cK?[O-*۴{Z_H)7]]' җu.èڶvcF`3o0eZڙZɉnܶ`E|m܎u5@.xI}3 75A|,g"Hu|'@7 wmt.j;Nl{Ml}u8N>LQdL ҅Ku~v7,F#]pw"ulNnHFP||pz[/x4W}|K)ŒKb}sU~:6$`? c!y}'$:r۟1w#oTp:ݭ8}$}|5y"<6Jڂw܀|-_?XCH<@LZjk͵.I7-1[O/[q/e +CNu wG|_mBt >3F6 ଢ଼$:YaΩ1+̀Nu9E'Z Z7>d` ~HEڸQjnEán>L0D>{(dOj!ԱN6ӂhCGg5 *(s[Z=N2"NCkej(8{!m=xkP!B x TH>`_  Qa$ۄGYNO^ۀzz(:[ڽQ)Ӊ./+zz= _| D"сǂ,ZH0A; B  #x>tDD:? &g"bxs 5wӃ4tCD@12J$<5xGB `ʼn-xjРʁԃ$FC_vG/G^ 0 aX& &CU DNęT3! xAJKH8&_/>T ?h|9pNgX<*_q_dnyU8άgփ]I娂m+qhGK)8mfzO(D\F*V|QdOQy0Ţ1llmϔQt.F"& Kc Ŏރ?lDL4 hV֠;lYaDbM(5sg#>'q-eU(Y m\}cӓ1ldTnۍ?.#^Sl4:jOۂʭOqȘPG䠳ǿO*!h$&^w) kE*z%$< _lv* dNW/D pMGa#R #.3M\>Tϵ-&->xF]r8N Vr?3(y#&\w)"=h,)CTRs8t7o`A9;aygcU 1rL _l?4b.|Wț=Uvl5Xy՝^(2c~%sa t5q)W6YSa4a+/:c?r:v4BoG'F É_oEGm͜ wA N;v 2&>m{mFW396=`ܕ Z5ANyt8|5>_^omnvaqX1lYnǯP&kea oWݯ}־YF/8s%n<;av 0@݃@\VҤpG/زnseo .f>SpPRo@mm4ƣ?3 tGi1(A38xVU NÈ caD&#ʜtW4;_yS=~7\NǰgaU UZW_ӉJTnݍy? ƎbƱD%l=0`ˏ,ސ6 lV{oP^Ljq%fjZhC<Dk:-:}N w+vJ6e°LDPeN;:3_>z; 睍.%6>ͳZncIM̘.§5{Û&:'%ՃlBTG]#k]Z疩C _r36ef U:qY~~ #:Kog9߭.lk.l< 2q{ϸDҍn[Vt k՚=;s>KtZ-]x_Nv>nn8\򵹬 e3óqϡlWxFݮ>4s Q? ‘@M3p:abEGoUw[SVKؤNܒ Yܢy٘].vWs⏊"Mο^琦p7c Cke1umq1SaݷeUX4KSu5RE)f׶>mt:|͞C]'^w) _jo_ KOʴ[Su=l`'2Z+jV]zzA v횽| iB0?w#D Ħ%1jv=ka\׈fgf1VA)֮.7R枱 âgğn}5w0*& -otcM ՞ctp yޣxԱ#gƯoDYEv=8kD''"6#&g`,{5D1xLu,6<[?%pbӓACJ p~>!t8Oqr{ Ԣg29Nzz]^^v!H9NTT;Ldw5* 1] c\Z}kgjBqvC|VY& W:hzqȚ2٤~r3o/i_@"Q([FiƝ72?:3]m[wbD=ܶGI"LFA6"62)Ŋ<p=M[܊-Obδ L⻝fMqs\ k8QRvj0+̴`9v3沋2AVKb1{)gz.h[u=YvhG]VO PԾ,)6zr`Y7._8yNcŷj̙**q0-d `:n)vek&=).ɣڞXIQ&dDWѺ8B~jv>SCUl?ny^?c.<+$3fps酮vXcNj*ƿ OO-DzA"-,k'@3iDO{`^p.z;1zyJ׵[mޫ 4IHi1RwswB%Uóǻb8{ h (sҊjkuߏCKd4ibl0HGR2%rEynD'bX@Am'GDHx 5 طr~ct$RE֝'jvi?xɣjUբTlߎӮ'XxUf\2h$ o9ߩ4q?GbU hf?Hg r]dik{ W{]'@.w 'rJ!B"ƭXrR3$>'ᦻ%IҧT,Y^+:m(2R՞ts{fksMG\ZIȄ8g~Zjvtm P9RF2%n.)s'@d|j$ťzɉ}!HJ 8AO3SgПڕRkgJkQVV(k_eYwӉr8Ÿ}i)}VtԳ͓3'h9ݬ:|k;).Y*Lù9nQYmkE[z$ncR쵿"oTbee".oN N;yn/> .,Er %<>(k<6MQ}d ;NI^,%On8Ln`yD.MmlpT2Ony3~dboܰ-r)O37Y Pq3}b^6F/8O?$E\f+H9#8'cxߵ< ɣqW]펺F~1q}.ύ_U=2d[OY~qNg/fF,^6zXZb7u2'qv {XWVaͬxvva+O#q{Xy v8=kt1۞{uq_~X-M? ?gg߄fC[u=Jo¨s#o}i[KnÂC1pغoWty2SN8:ttÈ3F^YåھO@RAF^8 42'P0%y8c_|5k'p2'AH+ {O/|N&r=_^jc8 ޿Q Cެ0xXN7d%Ї_zӽ4&ACK )|C$:OBDHP O ~#@)-^C“ bp["({ C O HNJ&u{ C%A RKB/& >3ԫe$$i?2A'tsϑ$dV %p?TeСO ! |;%!k=D/I1D'h:,="AZ F9d_ @$NfDVM &W; N #x{B_ȢSœ'A! |~ mp5u“'A! @*-8/ ho qRxz*B]}Uxz |{SxAOx^ Lv-z@Z&+(A! |g+N `/8|uoD4(A!}t#`>+jw3*} m#<+퓶J!6w GJxbbPxuS)}cA!@"w (ANN5進V^Cid$"c?:tuD^POX)ZbPB O9k P |&`x+h(? 8;υ ųSAD`? g,,^G?E!SxB;cسC]|zjtmjq>ҵk!'A  Iai$ SloA%'0EMz%>!=X+=^w8$< %ZaR% =I8M< W @QD O9 <9 % j'%XxŧT|'giuKZ FJ֣Љrnq? :sI*  l%c8HxbOibg X<uKE FXte$< JSXyJ-)'@=q]l6SM StJŦ)>N"AA oN*<ħZZQyZ<ű+ĢERǐ37K赲٥B&AA@bo2 OiZmO"WSNpJE'>(r"Q@M/$#-b)=/ />^AA 6ZOa-.~zZSHb%R?p{]7nv6AA`Thkۅ5&@DVl'RU?SL^,,I'v*K܅7S);AA5S)gT$)S*8kA|!5K$& O@Y$ (űj.w9%@}Dg@ڥlw+c.vqr%% b(zb)ˬRjTK.RK0{9% ' kxOL$kr1AAFK?){R[].{mڥ"TOXK?,~*NHxA OkTTd P)g2s;NᵒZ:|AA^kY>zj@]O@~ZoN8鍅?“  (P-V⑒ET©$B&wkO($*:ڞ# (Ja}ފO%&HڜhVK q6{[2ѥզ&AA*rNNtJjSIz#8k]N8:Eį^WAADMx_{das)d$ .FNX:e)MJ$" "Qr_ OkOEڱt[ 'Y: Fc֞Ora>PE'޴^+][ilAA`ůjֵJ[9"AAjNNt_{c zx= O`Sk+XNAA :Oo,ެ^]xOi7.uOBAȨ( NWoaC2rIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/html-css/0000755000175000017500000000000011641435631022302 5ustar malexmalexfontmatrix-0.6.0+svn20110930/src/graphic-resources/html-css/info.css0000644000175000017500000000434011444417016023746 0ustar malexmalex/* Informations (Fontmatrix) base style */ *{ border:0; margin:0; padding:0; font-family: sans-serif; } body{ background-color : #fefefe; } #file { display:none; /* text-align:right; background-color : #ddd; color : #333; font-family : monospace; font-size : 10pt;*/ } #general{ position: absolute; top: 142px; width:620px; /* background-color:green; */ } .encodingcurrent{ font-weight:bold; } .infoblock { clear:both; } .infoblock:hover .langundefined { border-left : 1pt solid red ; color:black; } .infoblock:hover .infoname { color:red; } .infoname { text-align:right; background-color : #fefefe; color:#333; float : left; font-size : 8pt; font-weight : bold; width : 180px; height:6pt; } .overflow{ cursor: pointer; color:#666; } .unfolded{ color: #333; } .langundefined { color: #444; background-color : #fefefe; margin-left : 186px; border-left : 1pt solid gray ; padding-bottom:9pt; padding-left: 6pt; font-size : 8pt; line-height : 12pt; overflow:hidden; } #panose_block { position: absolute; top: 142px; left: 490px; width: 300px; } #panoselabel{ font-size:12pt; } .panose_name { float:left; text-align:left; font-size : 8pt; /* padding-left:8pt; */ color : #aaa; padding-right:4pt; } .panose_desc { text-align:left; font-size:8pt; color:#333; } #langblock{ position: absolute; top:322px; left: 550px; width: 300px; } .langblockname { font-size:12pt; } #langblock ul{ list-style-type:none } #langblock ul li{ /* font-style:italic; */ font-size:8pt; color:#666; /* padding-left:8pt; */ } #langblock ul li:hover{ color:#222; } #fstype { /* margin-top:24pt; */ position:fixed; bottom:0; width:400px; padding-right:200px; background-color:#fff; } #fstype > div{ margin:4pt 0; padding:2pt 0 2pt 2pt; border-left:6pt solid black; } .fsname { float:left; padding-right: 9pt; font-weight:bold; line-height:9pt; font-size:12pt; } .fsdesc{ line-height:8pt; /* font-style:italic; */ font-size:7pt; /* font-family:serif; */ } #previewblock{ text-align:center; width:800px; } svg{ /* margin-left: 182px;*/ margin-bottom:62px; padding:1% 1% 0 1%; border-bottom:1px solid black; } fontmatrix-0.6.0+svn20110930/src/graphic-resources/html-css/img/0000755000175000017500000000000011641435631023056 5ustar malexmalexfontmatrix-0.6.0+svn20110930/src/graphic-resources/html-css/img/css-tech-info.png0000644000175000017500000000031511034717410026217 0ustar malexmalexPNG  IHDR u4JsRGBbKGD pHYs  tIME 4ttEXtCommentCreated with GIMPW(IDAT °CiM -č{3RQKb@ a,%IENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/html-css/img/css-info-propertyname.png0000644000175000017500000000034011034717410030017 0ustar malexmalexPNG  IHDR+lsRGBbKGD pHYs  tIME .t!jtEXtCommentCreated with GIMPW;IDATM˱@ޠE{@icŪm̿Œnj%ɩNdv8'DѽIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/html-css/img/css-shadow.png0000644000175000017500000000037211034717410025633 0ustar malexmalexPNG  IHDR2sRGBbKGD pHYs  tIME5"tEXtCommentCreated with GIMPWUIDAT]A 0gWJ GCLIzau cϑHD%ȴu'pY|s߭? ^%@կIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/html-css/img/css-info-property.png0000644000175000017500000000033511034717410027162 0ustar malexmalexPNG  IHDR+lsRGBbKGD pHYs  tIME 1tEXtCommentCreated with GIMPW8IDATMˡ0 0=o_+P}Vr C:h1ǔI/ryxIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/html-css/fontmatrix.js0000644000175000017500000021716411444417016025044 0ustar malexmalex/* JS file for Fontmatrix informations panel This file is loaded each time the selected font changed. */ /* alert("JS loaded"); */ /*! * jQuery JavaScript Library v1.4.2 * http://jquery.com/ * * Copyright 2010, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * Includes Sizzle.js * http://sizzlejs.com/ * Copyright 2010, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * * Date: Sat Feb 13 22:33:48 2010 -0500 */ (function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& (d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== "find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
a"; var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, "_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== "="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); (function(){var g=s.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= {},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== "string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== 1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, ""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", ""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, "border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== "string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? "&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== 1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== "json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== "number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
"; a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": "pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); // End of JQuery var shortHeight = "6pt"; var initialInfoElemHeight = new Object; var idCount = 0; function anIdDear() { return "xXdDfFgGplok_" + idCount++; } function toggleInfoElem() { var h = shortHeight; var that = $(this); if(that.hasClass("overflow")) { if(that.hasClass("unfolded")) { that.removeClass("unfolded"); } else { that.addClass("unfolded"); h = initialInfoElemHeight[that.attr("id")]; } that.next().animate({ height: h }, 500, 'linear', function(){}); } } function initFM() { // shortHeight = $(".infoname").height(); $(".infoname").each(function() { var id = anIdDear(); $(this).attr("id",id); var that = $(this).next(); initialInfoElemHeight[id] = that.height(); var t = that.text(); that.text("A"); if(that.height() < initialInfoElemHeight[id]) { $(this).addClass("overflow"); } that.text(t); that.css("height", shortHeight ); }); $(".infoname").live("click", toggleInfoElem); } $(document).ready(initFM); fontmatrix-0.6.0+svn20110930/src/graphic-resources/filter-remove.png0000644000175000017500000001411511524255162024037 0ustar malexmalexPNG  IHDR w&8009!.{8h^>W/G 47SB `rRpx-6 7V|L̎A B > ЙQ)`jpl`#6aK0qD<4-ja ,C\, LHB$ωv) 53=MKtqq;j 0 /Bc1}\'C(f E:΢``d ;!B!h`A8?| MP#IA(Rsh1aIU;Ru="[7kWĪb5&X}VX.,(`ձXc!VYWߛ= x4 (@$x@@j9HMI0JG$CֱdUe/oo@i [h&_HKap@f^1PM#0p7$C:dC>C)P m  -^$<,2#B@vF$9DF sqAH8$")G"'&A;(B搯APTDPmEP4݉~ C[nF< #QhcL1La*1uvL/f3,`~bXv,Zaݱ؝ l (ۍĎa_8FNyqɸ|\%4 w7[\x) —kg}Q4@%  !O8Bh%\'<"VHtttt>tt9ttt}[gץwO?@ :(E'#*b;&D%鐜ITRtt4E `ǐȰ CsoF> o0f\ebgRdf adffzY٘99<zIS KK5KS*1%ͬwXglll!lll7ئ1b{OdsHqXsDrsqp,rqszppVs^pIrYsEsZ6.n~ĽcSs /ל7"Oϙ/8M~~=`"N.z{?-\2&4'.l L.I6&GȃE+D"#"R9gE'Ĉbbabbb-/$%%"$K IHJIzJH^⑲Jjz%(m(SN ^F[&JF,*!![-@Ӕȍuc*0(+$)(L)r))(^T$T4KYC9ZK6^ժ,2.-˩WaQ1IlלڮuL6vmN _fIm vj۴>E` ICCa[#1Fe#[?(LLVLuMwa,͊F͏hX԰eg*zj-hldhefЖ[;Y;]=jocCEGpv<8$3ɹKː+kk벛~M+f垓^J^ޗ|>>}~Op59x~;nGJGuб`!F!!sfEFTF,PMGKV+QQg=le!#eh\\~Nݝv.lixK  q  V=ϧĦKM-Lfְ +x@Hzvn'3L̙,ˬlbvT{< fNY3)T+y&dK`VSS@%eկaYۥvgs>vl8}ąc]]EHwjň/ v]V|ȕꫜW\#^˽u=7n<ti{-[7ֿ}w/kwӸu_~׈H<6z1[?qx2:>g!fG?_zbe+ܫ ȼ9;9yul[׷/ſۘ}Y+ss?~__g}8D[Zۙ~8xRʻSКڇ Fզf/_b(4 ` z!7`0 ` 1P3 ҍeL?6 G}wIˌJLaX1l8ָ|S)"FMdhXxR2Lr ^aJ Y*jkhhPu,)s19kY[,^Zߴ9g[cWl@uuw6vrUrr'{xr{qzspr JmWhۇx%G6FFݏYA#Ԥ'%%5&_Ky: I-aS:5jW{ ׋I%o;P,`ME硻Ӈ7Uv:SSrΉ:zS ij4Bjoo9\{΅ .nK{z;.߽2yu:O_~@M[C]5ֻt<<`G'G<yJtYc/^:LLl2zۍgO`1+>8:߷/c߾|~5M`Q0*Thً= tD~.%VeH6y.)n?Rk|Bvd08$]9R992{d3v˧(T WQQVVëͪhVAu6nן7b(Xc2nlaf!g|euN[;5{nM9n4 WO3/Moi>_-3/otׅ -^G͍̋*.)Qwfg'JPX뤹FřN-e'(7*/1?d†%cf*Un<2qtsqZuꯞzڰtQɪ9m}Tkgst3_4S{UkףJ;Fo|I%>n{G.?zh鱏o>>'x)Ja뛨©3r>TH7]ykx),?|V4_Z_4u|k P ?d@|Bt d E107؟LB7LN"03&11PX 9d899s=n#pX0XHIhMx_KTTtN]<^BKbEKjL7ZykE EJ/,I jTԼh|e"d'eu-wKxMEYW,#Nn:d 6 px X dRt #S3~sm]} .aiu7wE0\: .(A7Be|ESW1 qb;CiKzIRiv+deg;\+/,,GTCʱG^?YSsq6'WJеG7nHËctO6<_x%{2mY?Q[|5M_[[ jQP' €H"ƈ?T"Qd eEUQw4Eo_0|KL23ea 8,W{ŇLh lyНO"H jWl&i,DVSivy'rϹ u?u# ,6 ϐEbDEԓbz/'S-")FiPYT5Y-PJCUS@^kY{Fg\m  N7v]3xa9oˆV>!ͱʩyeō]#3׫{租Cσ!-a"ԀȚ71bqk4҄$䔛il[wfeeOM*Yx$ve++*-?zYH߉uy }gB{[ENtԜtttJ5>]7sp}yC赱'㷞Žy?A}:6Lׇ9 >/K_Z[ysϺЯ-BhaE$ En" (jƢч< scp";1$G&{}^RH^X2]u[ ?ry+}?m'x9KW־-05U@LpI6˶붶60oKӄbKGD pHYs  tIME90'gIDATӍѻ 0R6@Bb44HQ0аG!$|vdQ@DQƪ#7LNXԬR⎲Wcm0`Gbd O,< qFz+\S7&<3ׯطIENDB`fontmatrix-0.6.0+svn20110930/src/graphic-resources/template_default.xml0000644000175000017500000000674611100121456024611 0ustar malexmalex fontmatrix-0.6.0+svn20110930/src/graphic-resources/filter.png0000644000175000017500000001423611524255162022550 0ustar malexmalexPNG  IHDRٱ\8009!.{8h^>W/G 47SB `rRpx-6 7V|L̎A B > ЙQ)`jpl`#6aK0qD<4-ja ,C\, LHB$ωv) 53=MKtqq;j 0 /Bc1}\'C(f E:΢``d ;!B!h`A8?| MP#IA(Rsh1aIU;Ru="[7kWĪb5&X}VX.,(`ձXc!VYWߛ= x4 (@$x@@j9HMI0JG$CֱdUe/oo@i [h&_HKap@f^1PM#0p7$C:dC>C)P m  -^$<,2#B@vF$9DF sqAH8$")G"'&A;(B搯APTDPmEP4݉~ C[nF< #QhcL1La*1uvL/f3,`~bXv,Zaݱ؝ l (ۍĎa_8FNyqɸ|\%4 w7[\x) —kg}Q4@%  !O8Bh%\'<"VHtttt>tt9ttt}[gץwO?@ :(E'#*b;&D%鐜ITRtt4E `ǐȰ CsoF> o0f\ebgRdf adffzY٘99<zIS KK5KS*1%ͬwXglll!lll7ئ1b{OdsHqXsDrsqp,rqszppVs^pIrYsEsZ6.n~ĽcSs /ל7"Oϙ/8M~~=`"N.z{?-\2&4'.l L.I6&GȃE+D"#"R9gE'Ĉbbabbb-/$%%"$K IHJIzJH^⑲Jjz%(m(SN ^F[&JF,*!![-@Ӕȍuc*0(+$)(L)r))(^T$T4KYC9ZK6^ժ,2.-˩WaQ1IlלڮuL6vmN _fIm vj۴>E` ICCa[#1Fe#[?(LLVLuMwa,͊F͏hX԰eg*zj-hldhefЖ[;Y;]=jocCEGpv<8$3ɹKː+kk벛~M+f垓^J^ޗ|>>}~Op59x~;nGJGuб`!F!!sfEFTF,PMGKV+QQg=le!#eh\\~Nݝv.lixK  q  V=ϧĦKM-Lfְ +x@Hzvn'3L̙,ˬlbvT{< fNY3)T+y&dK`VSS@%eկaYۥvgs>vl8}ąc]]EHwjň/ v]V|ȕꫜW\#^˽u=7n<ti{-[7ֿ}w/kwӸu_~׈H<6z1[?qx2:>g!fG?_zbe+ܫ ȼ9;9yul[׷/ſۘ}Y+ss?~__g}8D[Zۙ~8xRʻSКڇ Fզf/_b(4 ` z!7`0 ` 1P3 ҍeL?6 G}wIˌJLaX1l8ָ|S)"FMdhXxR2Lr ^aJ Y*jkhhPu,)s19kY[,^Zߴ9g[cWl@uuw6vrUrr'{xr{qzspr JmWhۇx%G6FFݏYA#Ԥ'%%5&_Ky: I-aS:5jW{ ׋I%o;P,`ME硻Ӈ7Uv:SSrΉ:zS ij4Bjoo9\{΅ .nK{z;.߽2yu:O_~@M[C]5ֻt<<`G'G<yJtYc/^:LLl2zۍgO`1+>8:߷/c߾|~5M`Q0*Thً= tD~.%VeH6y.)n?Rk|Bvd08$]9R992{d3v˧(T WQQVVëͪhVAu6nן7b(Xc2nlaf!g|euN[;5{nM9n4 WO3/Moi>_-3/otׅ -^G͍̋*.)Qwfg'JPX뤹FřN-e'(7*/1?d†%cf*Un<2qtsqZuꯞzڰtQɪ9m}Tkgst3_4S{UkףJ;Fo|I%>n{G.?zh鱏o>>'x)Ja뛨©3r>TH7]ykx),?|V4_Z_4u|k P ?d@|Bt d E107؟LB7LN"03&11PX 9d899s=n#pX0XHIhMx_KTTtN]<^BKbEKjL7ZykE EJ/,I jTԼh|e"d'eu-wKxMEYW,#Nn:d 6 px X dRt #S3~sm]} .aiu7wE0\: .(A7Be|ESW1 qb;CiKzIRiv+deg;\+/,,GTCʱG^?YSsq6'WJеG7nHËctO6<_x%{2mY?Q[|5M_[[ jQP' €H"ƈ?T"Qd eEUQw4Eo_0|KL23ea 8,W{ŇLh lyНO"H jWl&i,DVSivy'rϹ u?u# ,6 ϐEbDEԓbz/'S-")FiPYT5Y-PJCUS@^kY{Fg\m  N7v]3xa9oˆV>!ͱʩyeō]#3׫{租Cσ!-a"ԀȚ71bqk4҄$䔛il[wfeeOM*Yx$ve++*-?zYH߉uy }gB{[ENtԜtttJ5>]7sp}yC赱'㷞Žy?A}:6Lׇ9 >/K_Z[ysϺЯ-BhaE$ En" (jƢч< scp";1$G&{}^RH^X2]u[ ?ry+}?m'x9KW־-05U@LpI6˶붶60oKӄ pHYs  tIME $IDAT8ԽJCA'WxqvVF,mlıɉt""V'Q>jW ^԰AB"ctd+6qytՈ ">^`7?@* [lL&Aq)Mv-.N?bTH2igMN+&:~j1K]W^hE, (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMSHAPER_OWN_H #define FMSHAPER_OWN_H #include #include #include #include /** The shaper, as I understand it, is aimed to prepare a string in the "character space" while glyphs will be processed in a Harfbuzz buffer. 06/03/2008 - I do a very naive version, to see. */ class Character : public QChar { public: Character(int unicode, QList tokens); Character(int unicode, QStringList tokens); Character(int unicode):QChar(unicode),MatchAll(false),isMatchedGroup(false){} Character():QChar(),MatchAll(false),isMatchedGroup(false){} // it should rather be a QFlag... if only I knew how it works ;-) QList CustomProperties; void AddProperty(const QString& prop); // Do we want to match all CustomProperties bool MatchAll; // GroupIndex will be used for replacement /* I think it needs further explanations: U1111(propA).(propB).(propC)|.2(propC,propD)U2222(propA).1(propE) In this example, we want to reorder a sequence while matching is based on properties only. So we need to map matched positions to replacement positions as in "grep" group mechanism. */ bool isMatchedGroup; int GroupIndex; QString DumpCustom(); }; /// All the challenge comes from the fact that we want to match /// over an whole properties List. struct MatchSequence { void SetMatch(const QString&); QList Properties; }; struct ReplaceSequence { void SetReplace(const QString&); QList Properties; }; class FMOwnShaper { public: FMOwnShaper(QString s, QString lang); FMOwnShaper(QString lang); ~FMOwnShaper(); void fillIn(const QString& s); private: QList In; QList Out; QMap Dictionnary; // < property, feature > QMap ProperyMap; QList Matches; QList Replacements; QString CleanRule(QString rule); int loadRules(QString lang); int Compare(int inIndex, int matchIndex); void Replace(int repIndex, QList chunk); void Op(); public: void DumpOut(); QList GetShaped(); }; #endif fontmatrix-0.6.0+svn20110930/src/panosedialog.cpp0000644000175000017500000000473611215436431020302 0ustar malexmalex// // C++ Implementation: panosedialog // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "panosedialog.h" #include "fontitem.h" #include "fmfontstrings.h" #include "fmfontdb.h" #include #include FMPanoseDialog::FMPanoseDialog(FontItem * font, QWidget * parent) :QDialog(parent), m_font(font), m_ok(false) { setupUi(this); Q_ASSERT(m_font); fontName->setText(m_font->fancyName()); m_sourcepanose = FMFontDb::DB()->getValue(m_font->path(), FMFontDb::Panose).toString(); if(!m_sourcepanose.isEmpty()) populateDialog(); connect(buttonBox, SIGNAL(accepted()), this, SLOT(closeOk())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(closeCancel())); } FMPanoseDialog::~ FMPanoseDialog() { foreach(QString s, m_box.keys()) { delete m_box[s]; } foreach(QString s, m_label.keys()) { delete m_label[s]; } } void FMPanoseDialog::populateDialog() { QStringList pl ( m_sourcepanose.split ( ":" ) ); QList l; if ( pl.count() == 10 ) { foreach ( QString s, pl ) { l << s.toInt(); } } const QMap< FontStrings::PanoseKey, QMap >& pmap( FontStrings::Panose() ); FontStrings::PanoseKey pk(FontStrings::firstPanoseKey()); int pValue(0); while(pk != FontStrings::InvalidPK) { QString sk( FontStrings::PanoseKeyName(pk) ); pValue = l.takeFirst(); m_label[sk] = new QLabel(sk, this); m_box[sk] = new QComboBox(this); int cIndex(0); foreach(int ik, pmap[pk].keys()) { m_box[sk]->addItem( pmap[pk][ik], ik ); if(ik == pValue) m_box[sk]->setCurrentIndex(cIndex); ++cIndex; } vLayout->addWidget(m_label[sk]); vLayout->addWidget(m_box[sk]); pk = FontStrings::nextPanoseKey(pk); } foreach(QString sk, m_box.keys()) { connect(m_box[sk], SIGNAL(currentIndexChanged (int)), this, SLOT(panoseChange(int))); } } void FMPanoseDialog::panoseChange(int index) { QStringList l; const QMap< FontStrings::PanoseKey, QMap >& pmap( FontStrings::Panose() ); FontStrings::PanoseKey pk(FontStrings::firstPanoseKey()); while(pk != FontStrings::InvalidPK) { QString sk( FontStrings::PanoseKeyName(pk) ); l << QString::number(m_box[sk]->itemData( m_box[sk]->currentIndex() ).toInt()); pk = FontStrings::nextPanoseKey(pk); } m_targetpanose = l.join(":"); } void FMPanoseDialog::closeOk() { m_ok = true; close(); } void FMPanoseDialog::closeCancel() { close(); } fontmatrix-0.6.0+svn20110930/src/textprogression.ui0000644000175000017500000000752311024034730020736 0ustar malexmalex TextProgressionWidget 0 0 162 287 Form 0 -1 Inline progression true 0 0 e.g. Latin text Left to right true e.g. Arabic text Right to left e.g. Traditional Chinese & Japanese text Top to bottom e.g. Runic text Bottom to top Block progression true 0 0 e.g. Latin text Top to bottom true e.g. Tarditionnal Chinese & Japanes text Right to left e.g. Traditional Mongolian text Left to right fontmatrix-0.6.0+svn20110930/src/glyphtosvghelper.cpp0000644000175000017500000000644611125205407021240 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "glyphtosvghelper.h" #include #include GlyphToSVGHelper::GlyphToSVGHelper(QPainterPath path, QTransform tf) :m_path(path), m_transform(tf) { QStringList data; QPointF curPos; for (int i = 0; i < path.elementCount(); ++i) { QPainterPath::Element cur = path.elementAt(i); QPointF curPoint(tf.map(cur)); if(cur.isMoveTo()) { curPos = curPoint; data << QString("M %1 %2").arg(curPos.x()).arg(curPos.y()); } else if(cur.isLineTo()) { curPos = curPoint; data << QString("L %1 %2").arg(curPos.x()).arg(curPos.y()); } else if(cur.isCurveTo()) { QPointF c1 = tf.map(path.elementAt(i + 1)); QPointF c2 = tf.map(path.elementAt(i + 2)); data << QString("C %1 %2 %3 %4 %5 %6") .arg(curPoint.x()).arg(curPoint.y()) .arg(c1.x()).arg(c1.y()) .arg(c2.x()).arg(c2.y()); // qDebug(data.last().toUtf8()); i += 2; curPos = c2; } else qDebug("Unknown point type"); } m_svg += QString("").arg(data.join(" ")).arg("black"); } QString GlyphToSVGHelper::getSVG(int pSize) const { QRectF r(m_transform.mapRect( m_path.boundingRect() )); QString bbS("%1 %2 %3 %4"); QString bb(bbS .arg(r.top()) .arg(r.left()) .arg(r.width()) .arg(r.height())); QString openElem(QString("").arg(pSize).arg (bb)); QString closeElem(""); return openElem + m_svg + closeElem; } QString GlyphToSVGHelper::getSVGPath() const { return m_svg; } QRectF GlyphToSVGHelper::getRect() const { QRectF r(m_transform.mapRect( m_path.boundingRect() )); return r; } fontmatrix-0.6.0+svn20110930/src/fmfontstrings.h0000644000175000017500000000357611444670714020216 0ustar malexmalex// // C++ Interface: fmfontstrings // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMFONTSTRINGS_H #define FMFONTSTRINGS_H #include "fontitem.h" #include "fmfontdb.h" #include class FontStrings : public QObject { Q_OBJECT FontStrings(); ~FontStrings() {} static FontStrings* instance; static FontStrings* getInstance(); public: enum PanoseKey { FamilyType = 0, SerifStyle, Weight, Proportion, Contrast, StrokeVariation, ArmStyle, Letterform, Midline, XHeight, InvalidPK = 9999999 }; static PanoseKey firstPanoseKey(); static PanoseKey nextPanoseKey(PanoseKey pk); static const QMap& Names(); static const QMap< PanoseKey, QMap >& Panose(); static const QString PanoseKeyName(PanoseKey pk); static const QString PanoseKeyInfo(PanoseKey pk); static const QString Encoding(FT_Encoding enc); static const QMap& Tables(); static QString FsType(int fstype_part, bool shortString = true); static QString UnicodeCategory(QChar::Category); static QString scriptTagName(const QString& script); private: QMap m_name; void fillNamesMeaning(); void fillCharsetMap(); void fillPanoseMap(); void panoseFromFile(const QString& path); void fillTTTableList(); void fillFSftypeMap(); void fillUniCat(); void fillScriptTagNames(); QMap< PanoseKey, QMap > m_panoseMap; QMap< PanoseKey, QString > m_panoseKeyName; QMap< PanoseKey, QString > m_panoseKeyInfo; QMap charsetMap; QMap tttableList;// QMap< int, QString > m_FsType; QMap unicodeCategory; QMap scriptTagNames; }; #endif fontmatrix-0.6.0+svn20110930/src/fmfontcompareview.h0000644000175000017500000000544011217731442021030 0ustar malexmalex// // C++ Interface: fmfontcompareview // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMFONTCOMPAREVIEW_H #define FMFONTCOMPAREVIEW_H #include #include #include class QGraphicsLineItem; class QGraphicsRectItem; class QGraphicsEllipseItem; class QGraphicsSimpleTextItem; class FontItem; class FMFontCompareItem { public: enum GElement { Nothing = 0, Contour = 0x1, // Fill = 0x2, Points = 0x4, Controls = 0x8, Metrics = 0x10 }; Q_DECLARE_FLAGS ( GElements,GElement ) FMFontCompareItem(); FMFontCompareItem ( QGraphicsScene * s, FontItem * f, int z ); ~FMFontCompareItem(); void show ( GElements elems, QColor color, double offset = 0.0 ); void setChar ( uint c ) {char_code = c;} QRectF boundingRect(); // QColor getColor() {return color;} void setIndex(int i){zindex = i;} private: const QUuid uuid; QGraphicsScene *scene; FontItem* font; int zindex; uint char_code; double m_offset; // QColor color; QGraphicsPathItem* path; QList lines_controls; QList lines_metrics; QList points; QList text_metrics; void clear(); void drawPoint ( QPointF point , bool control ); void toScreen(); static const QString toolTipModel; }; Q_DECLARE_OPERATORS_FOR_FLAGS ( FMFontCompareItem::GElements ) class FMFontCompareView : public QGraphicsView { Q_OBJECT public: FMFontCompareView ( QWidget * parent ); ~FMFontCompareView(); void changeFont ( int level, FontItem* font ); void removeFont ( int level ); void changeChar ( uint ccode ); void changeChar ( int level, uint ccode ); void setElements ( int level, FMFontCompareItem::GElements elems ); FMFontCompareItem::GElements getElements ( int level ); void setColor ( int level, QColor color); QColor getColor ( int level ); void setOffset (int level, double offset); double getOffset(int level); void fitGlyphsView(); static QMap pens; static QMap brushes; public slots: void updateGlyphs(); protected: void mousePressEvent ( QMouseEvent * e ) ; void mouseReleaseEvent ( QMouseEvent * e ) ; void mouseMoveEvent ( QMouseEvent * e ) ; void wheelEvent ( QWheelEvent * e ); void resizeEvent ( QResizeEvent * event ); private: QMap glyphs; // < Z-index, glyph > QMap elements; // what to show QMap colors; QMap offsets; void initPensAndBrushes(); uint thechar; QPointF mouseStartPoint; QGraphicsRectItem *theRect; QGraphicsRectItem *fPage; bool isSelecting; bool isPanning; }; #endif fontmatrix-0.6.0+svn20110930/src/typotekadaptator.h0000644000175000017500000000371310714111347020672 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TYPOTEKADAPTATOR_H #define TYPOTEKADAPTATOR_H #include #include /** @author Pierre Marchand */ class TypotekAdaptator : public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO ( "D-Bus Interface", "com.fontmatrix.fonts" ) public: TypotekAdaptator ( QObject *parent ); ~TypotekAdaptator(); signals: void FontActivated ( QString ); void FontDesactivated ( QString ); public slots: void private_signal ( int i, QString fontname ); Q_NOREPLY void FontLock (QString fontname); Q_NOREPLY void FontUnlock(QString fontname); }; #endif fontmatrix-0.6.0+svn20110930/src/fmmissingfonthelper.h0000644000175000017500000000344111304222200021337 0ustar malexmalex/*************************************************************************** * Copyright (C) 2009 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FMMISSINGFONTHELPER_H #define FMMISSINGFONTHELPER_H #include #include #include /** Let's try to nicely handle missing font files. At first, just popup the "check database" dialog. */ class FMMissingFontHelper : public QObject { FMMissingFontHelper(){} public: FMMissingFontHelper(const QString& ff); FMMissingFontHelper(const QStringList& ff); }; #endif // FMMISSINGFONTHELPER_H fontmatrix-0.6.0+svn20110930/src/fmkernfeat.cpp0000644000175000017500000002525211166341433017755 0ustar malexmalex// // C++ Implementation: fmkernfeat // // Description: try to make it the more compact & simple as possible // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #include "fmkernfeat.h" #include FT_TRUETYPE_TABLES_H #include FT_TRUETYPE_TAGS_H #include #include FMKernFeature::FMKernFeature ( FT_Face face ) :p_face ( face ) { FT_ULong length = 0; if ( !FT_Load_Sfnt_Table ( face, TTAG_GPOS , 0, NULL, &length ) ) { if ( length > 32 ) { GPOSTableRaw.resize ( length ); FT_Load_Sfnt_Table ( face, TTAG_GPOS, 0, ( FT_Byte * ) GPOSTableRaw.data (), &length ); makeCoverage(); } else GPOSTableRaw.clear(); } } FMKernFeature::~ FMKernFeature() { } void FMKernFeature::makeCoverage() { if ( GPOSTableRaw.isEmpty() ) return; bool out ( true ); quint16 FeatureList_Offset= toUint16 ( 6 ); quint16 LookupList_Offset = toUint16 ( 8 ); // Find the offsets of the kern feature tables quint16 FeatureCount = toUint16 ( FeatureList_Offset );; QList FeatureKern_Offset; for ( quint16 FeatureRecord ( 0 ); FeatureRecord < FeatureCount; ++ FeatureRecord ) { int rawIdx ( FeatureList_Offset + 2 + ( 6 * FeatureRecord ) ); quint32 tag ( FT_MAKE_TAG ( GPOSTableRaw.at ( rawIdx ), GPOSTableRaw.at ( rawIdx + 1 ), GPOSTableRaw.at ( rawIdx + 2 ), GPOSTableRaw.at ( rawIdx + 3 ) ) ); if ( tag == TTAG_kern ) { FeatureKern_Offset << ( toUint16 ( rawIdx + 4 ) + FeatureList_Offset ); if ( out ) { qDebug() <<"KERN"< LookupListIndex; foreach ( quint16 kern, FeatureKern_Offset ) { quint16 LookupCount ( toUint16 ( kern + 2 ) ); if ( out ) { qDebug() <<"\tParams"< LookupTables; QList PairAdjustmentSubTables; for ( int i ( 0 ); i < LookupListIndex.count(); ++i ) { int rawIdx ( LookupList_Offset + 2 + ( LookupListIndex[i] * 2 ) ); quint16 Lookup ( toUint16 ( rawIdx ) + LookupList_Offset ); quint16 SubTableCount ( toUint16 ( Lookup + 4 ) ); for ( int stIdx ( 0 ); stIdx < SubTableCount; ++ stIdx ) { quint16 SubTable ( toUint16 ( Lookup + 6 + ( 2 * stIdx ) ) + Lookup ); quint16 PosFormat ( toUint16 ( SubTable ) ); quint16 Coverage_Offset ( toUint16 ( SubTable + 2 ) + SubTable ); quint16 CoverageFormat ( toUint16 ( Coverage_Offset ) ); if ( out ) { qDebug() <<"\t\tPosFormat"< ranges based { quint16 RangeCount ( toUint16 ( Coverage_Offset + 2 ) ); if ( out ) qDebug() <<"\t\t\tRangeCount" < Class1 ( Class1Data[C1] ); quint16 Class2Record ( Class1Record + ( C1 * ( 2 * 2 * Class2Count ) ) ); for ( quint16 C2 ( 0 );C2 < Class2Count; ++C2 ) { qint16 Value1 ( toInt16 ( Class2Record + ( C2 * ( 2 * 2 ) ) ) ); QList Class2 ( Class2Data[C2] ); // keep it barbarian :D foreach ( quint16 FirstGlyph, Class1 ) { foreach ( quint16 SecondGlyph, Class2 ) { if ( Value1 ) pairs[FirstGlyph][SecondGlyph] = double ( Value1 ); } } } } } else if ( ValueFormat1 && ( !ValueFormat2 ) ) { for ( quint16 C1 ( 0 );C1 < Class1Count; ++C1 ) { QString cdbg ( QString::number ( C1 ).rightJustified ( 5,QChar ( 32 ) ) ); QList Class1 ( Class1Data[C1] ); quint16 Class2Record ( Class1Record + ( C1 * ( 2 * Class2Count ) ) ); for ( quint16 C2 ( 0 );C2 < Class2Count; ++C2 ) { qint16 Value1 ( toInt16 ( Class2Record + ( C2 * 2 ) ) ); QList Class2 ( Class2Data[C2] ); foreach ( quint16 FirstGlyph, Class1 ) { foreach ( quint16 SecondGlyph, Class2 ) { if ( Value1 ) pairs[FirstGlyph][SecondGlyph] = double ( Value1 ); } } } } } else { qDebug() <<"ValueFormat1 is null or both ValueFormat1 and ValueFormat2 are null"; } } else qDebug() <<"unknown PosFormat"<= GPOSTableRaw.count() ) { return 0; } quint16 c1 ( GPOSTableRaw.at ( index ) ); quint16 c2 ( GPOSTableRaw.at ( index + 1 ) ); c1 &= 0xFF; c2 &= 0xFF; quint16 ret ( ( c1 << 8 ) | c2 ); // qDebug()<<"**"< GPOSTableRaw.count() ) { return 0; } // FIXME I just do not know how it has to be done *properly* quint16 c1 ( GPOSTableRaw.at ( index ) ); quint16 c2 ( GPOSTableRaw.at ( index + 1 ) ); c1 &= 0xFF; c2 &= 0xFF; qint16 ret ( ( c1 << 8 ) | c2 ); return ret; } QString FMKernFeature::glyphname ( int index ) { QByteArray key ( 1001,0 ); if ( FT_HAS_GLYPH_NAMES ( p_face ) ) { FT_Get_Glyph_Name ( p_face, index, key.data() , 1000 ); if ( key[0] == char ( 0 ) ) { key = "noname"; } } else { key = "noname"; } return QString ( key ); } FMKernFeature::ClassDefTable FMKernFeature::getClass ( quint16 classDefOffset, quint16 coverageId ) { ClassDefTable ret; ret[0] = coverages[coverageId]; // ret[0] = QList(); quint16 ClassFormat ( toUint16 ( classDefOffset ) ); if ( ClassFormat == 1 ) { // qDebug()<<"ClassFormat1"; quint16 StartGlyph ( toUint16 ( classDefOffset +2 ) ); quint16 GlyphCount ( toUint16 ( classDefOffset +4 ) ); quint16 ClassValueArray ( classDefOffset + 6 ); for ( quint16 CV ( 0 );CV < GlyphCount; ++CV ) { ret[0].removeAll(StartGlyph + CV); ret[ toUint16 ( ClassValueArray + ( CV * 2 ) ) ] << StartGlyph + CV; } } else if ( ClassFormat == 2 ) { // qDebug()<<"ClassFormat2"; quint16 ClassRangeCount ( toUint16 ( classDefOffset + 2 ) ); quint16 ClassRangeRecord ( classDefOffset + 4 ); for ( int CRR ( 0 ); CRR < ClassRangeCount; ++CRR ) { quint16 Start ( toUint16 ( ClassRangeRecord + ( CRR * 6 ) ) ); quint16 End ( toUint16 ( ClassRangeRecord + ( CRR * 6 ) + 2 ) ); quint16 Class ( toUint16 ( ClassRangeRecord + ( CRR * 6 ) + 4 ) ); // qDebug()<<"CRC"<0) // { // QStringList dl; // foreach(quint16 lg, ret[c]) // { // dl << glyphname(lg); // } // if(!dl.contains("noname")) // qDebug()<<"\t"<< c <, (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fmverticalbutton.h" #include #include #include // #include // #include FMVerticalButton::FMVerticalButton(QWidget * parent) :QToolButton(parent) { m_font.setBold(true); } FMVerticalButton::~FMVerticalButton() { } bool FMVerticalButton::event(QEvent * event) { if (event->type() == QEvent::Paint) { QPaintEvent *pe = reinterpret_cast(event); setToolButtonStyle(Qt::ToolButtonIconOnly); if(m_text.isEmpty()) { m_text = text(); setText(QString()); } paintEvent(pe); QPainter p(this); m_font.setPixelSize(width() / 2); p.setFont(m_font); p.rotate(90); int vypos(qRound ( static_cast(width() - p.fontMetrics().ascent()) / 2.0) ); p.drawText(width() / 8 , vypos * -1 ,m_text); return true; } return QToolButton::event(event); } fontmatrix-0.6.0+svn20110930/src/listdockwidget.cpp0000644000175000017500000004537411443373645020672 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ //#include "listdockwidget.h" #include "typotek.h" #include "fontitem.h" #include "fmfontdb.h" #include "fmfontstrings.h" #include "fmpreviewlist.h" #include "mainviewwidget.h" #include "shortcuts.h" #include #include #include #include #include #include #include #include extern QStringList name_meaning; extern QMap< QString, QMap > panoseMap; ListDockWidget* ListDockWidget::instance = 0; ListDockWidget * ListDockWidget::getInstance() { if(!instance) { instance = new ListDockWidget; } return instance; } ListDockWidget::ListDockWidget() : QWidget() { setupUi(this); fontTree->setIconSize(QSize(32,32)); // Hide save filter button until it’s implemented saveFilterButton->setVisible(false); // listPreview->setModelColumn(1); // listPreview->setViewMode(QListView::IconMode); // listPreview->setIconSize(QSize(qRound(listPreview->width() ), 1.3 * typotek::getInstance()->getPreviewSize() * typotek::getInstance()->getDpiY() / 72.0)); // listPreview->setUniformItemSizes(true); // listPreview->setMovement(QListView::Static); // previewModel = new FMPreviewModel( this, listPreview ); // listPreview->setModel(previewModel); // previewText->setText(typotek::getInstance()->word()); // previewText->setToolTip(tr("You can use the following keywords to be replaced by data from fonts: <name> ; <family> ; <variant>")); // previewSize->setValue(typotek::getInstance()->getPreviewSize()); // Folders tree ffilter << "*.otf" << "*.ttf" << "*.pfb"; theDirModel = new QDirModel(ffilter, QDir::AllDirs | QDir::Files | QDir::Drives | QDir::NoDotAndDotDot, QDir::DirsFirst | QDir::Name); theDirModel->setLazyChildCount(true); folderView->setModel(theDirModel); folderView->hideColumn(1); folderView->hideColumn(2); folderView->hideColumn(3); folderView->setContextMenuPolicy(Qt::CustomContextMenu); folderViewContextMenu = 0; QSettings settings; QString lastUsedDir = settings.value("Places/LastUsedFolder", QDir::homePath()).toString(); QDir d(lastUsedDir); if (!d.exists()) lastUsedDir = QDir::homePath(); QModelIndex luIdx(theDirModel->index(lastUsedDir, 0)); folderView->setCurrentIndex(luIdx); QModelIndexList hierarchy; while(luIdx.isValid()) { hierarchy.prepend(luIdx); luIdx = luIdx.parent(); } foreach(QModelIndex idx, hierarchy) folderView->expand(idx); dirWatcher = new QFileSystemWatcher(this); initWatcher(theDirModel->index(0,0)); theFilterMenu = new QMenu; filterActGroup = new QActionGroup(theFilterMenu); QString tagName(tr("Tags")); QAction *actn = new QAction(tagName, filterActGroup); actn->setData(FILTER_FIELD_SPECIAL_TAG); actn->setCheckable(true); actn->setChecked(true); theFilterMenu->addAction(actn); // set defaults to Tag currentField = tagName; currentFieldAction = actn; // Filter All allFieldName = FontStrings::Names()[FMFontDb::AllInfo]; maxFieldStringWidth = allFieldName.count(); actn = new QAction(allFieldName, filterActGroup); actn->setData(FMFontDb::AllInfo); actn->setCheckable(true); theFilterMenu->addAction(actn); QStringListModel *lModel = new QStringListModel; completers[allFieldName] = new QCompleter(this); completers[allFieldName]->setModel(lModel); // Filter Unicode QString uniFName(tr("Unicode character")); actn = new QAction(uniFName, filterActGroup); actn->setData(FILTER_FIELD_SPECIAL_UNICODE); actn->setCheckable(true); theFilterMenu->addAction(actn); QStringListModel *uModel = new QStringListModel; completers[uniFName] = new QCompleter(this); completers[uniFName]->setModel(uModel); // Filters meta-data for(int gIdx(0); gIdx < FontStrings::Names().keys().count() ; ++gIdx) { FMFontDb::InfoItem k(FontStrings::Names().keys()[gIdx]); if((k != FMFontDb::AllInfo)) { actn = new QAction(FontStrings::Names()[k], filterActGroup); actn->setData( k ); actn->setCheckable(true); theFilterMenu->addAction(actn); lModel = new QStringListModel; completers[FontStrings::Names()[k]] = new QCompleter(this); completers[FontStrings::Names()[k]]->setModel(lModel); } } fieldButton->setMenu(theFilterMenu); fieldButton->setToolTip(currentField); fieldButton->setText( currentField ); collapseAlphaAction = new QAction(tr("Collapse Top Level"), this); Shortcuts::getInstance()->add(collapseAlphaAction); collapseFamiliesAction = new QAction(tr("Collapse Families"), this); Shortcuts::getInstance()->add(collapseFamiliesAction); expandAlphaAction = new QAction(tr("Expand Top Level"), this); Shortcuts::getInstance()->add(expandAlphaAction); expandFamiliesAction = new QAction(tr("Expand Families"), this); Shortcuts::getInstance()->add(expandFamiliesAction); QMenu * collapseMenu = new QMenu(this); collapseMenu->addAction(collapseFamiliesAction); collapseMenu->addAction(collapseAlphaAction); collapseMenu->addAction(expandFamiliesAction); collapseMenu->addAction(expandAlphaAction); collapseButton->setMenu(collapseMenu); searchString->setCompleter(completers.value(currentField)); folderView->setDragDropMode(QAbstractItemView::DragDrop); initTagCombo(); // connect( panoseButton, SIGNAL(clicked( bool )), this, SLOT(slotPanoseChecked(bool))); connect(collapseAlphaAction, SIGNAL(triggered()),this,SLOT(slotCollapseAlpha())); connect(collapseFamiliesAction, SIGNAL(triggered()),this,SLOT(slotCollapseFamilies())); connect(expandAlphaAction,SIGNAL(triggered()), this, SLOT(slotExpandAlpha())); connect(expandFamiliesAction,SIGNAL(triggered()), this, SLOT(slotExpandFamilies())); connect( filterActGroup,SIGNAL(triggered( QAction* )),this,SLOT(slotFieldChanged(QAction*))); connect( searchString,SIGNAL(returnPressed()),this,SLOT(slotFeedTheCompleter())); connect(folderView, SIGNAL(activated( const QModelIndex& )), this, SLOT(slotFolderItemclicked(QModelIndex))); connect(folderView, SIGNAL(clicked( const QModelIndex& )), this, SLOT(slotFolderItemclicked(QModelIndex))); connect(folderView,SIGNAL(pressed( const QModelIndex& )),this,SLOT(slotFolderPressed(QModelIndex))); connect(folderView, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(slotFolderViewContextMenu(const QPoint &))); connect(folderView, SIGNAL(expanded(QModelIndex)),this, SLOT(slotFolderAddToWatcher(QModelIndex))); connect(folderView, SIGNAL(collapsed(QModelIndex)), this, SLOT(slotFolderRemoveFromWatcher(QModelIndex))); connect(dirWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(slotFolderRefresh(QString))); connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(slotTabChanged(int))); // connect(typotek::getInstance(),SIGNAL(previewHasChanged()),this,SLOT(slotPreviewUpdate())); // connect(listPreview, SIGNAL(widthChanged(int)),this,SLOT(slotPreviewUpdateSize(int))); // connect(listPreview,SIGNAL(activated ( const QModelIndex&)),this,SLOT( slotPreviewSelected(const QModelIndex& ))); // connect(listPreview,SIGNAL(clicked ( const QModelIndex&)),this,SLOT( slotPreviewSelected(const QModelIndex& ))); // connect(listPreview,SIGNAL(pressed( const QModelIndex&)),this,SLOT( slotPreviewSelected(const QModelIndex& ))); // connect(previewText, SIGNAL(textChanged( const QString& )), this, SLOT(slotPreviewText( const QString&))); // connect(previewSize, SIGNAL(valueChanged( double )), this, SLOT(slotPreviewSize(double))); } ListDockWidget::~ListDockWidget() { delete dirWatcher; } void ListDockWidget::initWatcher(QModelIndex parent) { // qDebug()<<"initWatcher"<filePath(parent); for(int fIdx(0); fIdx < theDirModel->rowCount(parent); ++fIdx) { QModelIndex mIdx(theDirModel->index(fIdx,0, parent)); // qDebug()<<"\t"<filePath(mIdx)<isExpanded(mIdx); if(folderView->isExpanded(mIdx)) { QString fp(theDirModel->filePath(mIdx)); dirWatcher->addPath(fp); qDebug()<<"***Watch"<verticalScrollBar()->value(); } void ListDockWidget::restorePosition() { fontTree->verticalScrollBar()->setValue(m_position); } bool ListDockWidget::nameItemIsVisible(QTreeWidgetItem * item) { int center = fontTree->viewport()->size().width() / 2; int begin = fontTree->verticalScrollBar()->value(); int end = begin + fontTree->viewport()->size().height(); for(int i(begin); i < end; ++i) { if(fontTree->itemAt(center,i) == item) return true; } return false; } void ListDockWidget::unlockFilter() { searchString->setEnabled(true); } void ListDockWidget::slotFolderItemclicked(QModelIndex mIdx) { QString path(theDirModel->data(mIdx,QDirModel::FilePathRole).toString()); QFileInfo pf(path); if(!pf.isDir()) { if(FMFontDb::DB()->insertTemporaryFont(path)) { emit folderSelectFont(pf.absoluteFilePath()); } } settingsDir(path); } void ListDockWidget::slotFolderPressed(QModelIndex mIdx) { currentFIndex = mIdx; } void ListDockWidget::slotFolderAddToWatcher(QModelIndex mIdx) { qDebug()<<"Add to watcher"<filePath(mIdx); dirWatcher->addPath(theDirModel->filePath(mIdx)); } void ListDockWidget::slotFolderRemoveFromWatcher(QModelIndex mIdx) { qDebug()<<"Remove from watcher"<filePath(mIdx); dirWatcher->removePath(theDirModel->filePath(mIdx)); } /** * Reload the file and folder list in the folder tab */ void ListDockWidget::slotFolderRefresh(const QString& dirPath) { if(folderView->isVisible()) { qDebug()<<"Refresh"<refresh(theDirModel->index(dirPath, 0 )); } } void ListDockWidget::slotFieldChanged(QAction * action) { currentField = action->text(); currentFieldAction = action; fieldButton->setToolTip(currentField); fieldButton->setText( fieldString( currentField ) ); searchString->setCompleter(completers.value(currentField)); if(currentFieldAction->data().toInt() == FILTER_FIELD_SPECIAL_TAG) { filterValueStack->setCurrentIndex(0); } else { filterValueStack->setCurrentIndex(1); } } void ListDockWidget::slotFeedTheCompleter() { QString w(searchString->text()); if(w.isEmpty()) return; QStringListModel *m = reinterpret_cast( completers.value(currentField)->model() ); QStringList l(m->stringList ()); if(!l.contains(w)) { l << w; m->setStringList(l); } // we want "all fields" completer to have all strings completed if(currentField != allFieldName ) { m = reinterpret_cast( completers.value(allFieldName)->model() ); l = m->stringList (); if(!l.contains(w)) { l << w; m->setStringList(l); } } } void ListDockWidget::slotFolderViewContextMenu(const QPoint& p) { QDirModel *dm = static_cast(folderView->model()); if (!dm) return; QModelIndex mi = folderView->currentIndex(); if (!mi.isValid()) return; slotFolderItemclicked(mi); // make sure the font in question is loaded // with a direct right click it would crash without this if (!folderViewContextMenu) folderViewContextMenu = new FolderViewMenu(); folderViewContextMenu->exec(dm->fileInfo(mi), tabWidget->pos() + mapToGlobal(p)); } FolderViewMenu::FolderViewMenu() : QMenu() { dirAction = new QAction(tr("Import Directory"), 0); dirRecursiveAction = new QAction(tr("Import recursively"), 0); fileAction = new QAction(tr("Import File"), 0); addAction(dirAction); addAction(dirRecursiveAction); addAction(fileAction); connect(dirAction, SIGNAL(triggered()), this, SLOT(slotImportDir())); connect(dirRecursiveAction, SIGNAL(triggered()), this, SLOT(slotImportDirRecursively())); connect(fileAction, SIGNAL(triggered()), this, SLOT(slotImportFile())); }// we want "all fields" completer to have all strings completed void FolderViewMenu::exec(const QFileInfo &fi, const QPoint &p) { if (fi.isDir()) { dirAction->setEnabled(true); dirRecursiveAction->setEnabled(true); fileAction->setEnabled(false); } else if (fi.isFile()) { dirAction->setEnabled(false); dirRecursiveAction->setEnabled(false); fileAction->setEnabled(true); } else return; // not a file or a directory selectedFileOrDir = fi; QMenu::exec(p); } void FolderViewMenu::slotImportDir() { QDir dir(selectedFileOrDir.absoluteFilePath()); QStringList ffilter; ffilter << "*.otf" << "*.ttf" << "*.pfb"; QStringList fontList = dir.entryList(ffilter); if (fontList.count() < 1) return; QString lastItem = fontList.at(fontList.count() - 1); fontList.removeAt(fontList.count() - 1); foreach(QString tmpFontPath, fontList) { QString absPath = dir.absolutePath() + "/" + tmpFontPath; typotek::getInstance()->open(absPath, false, true); } typotek::getInstance()->open(dir.absolutePath() + "/" + lastItem, true); // import the last font with the announce flag set to true } void FolderViewMenu::slotImportDirRecursively() { typotek::getInstance()->open(selectedFileOrDir.absoluteFilePath()); } void FolderViewMenu::slotImportFile() { typotek::getInstance()->open(selectedFileOrDir.absoluteFilePath()); } FolderViewMenu::~FolderViewMenu() { } void ListDockWidget::initTagCombo() { tagsCombo->clear(); tagsetIcon = QIcon(":/fontmatrix_tagseteditor.png"); tagsCombo->addItem(tr("All activated"),"ALL_ACTIVATED"); tagsCombo->addItem(tr("Similar to current"),"SIMILAR"); // QStringList ts_tmp = typotek::getInstance()->tagsets(); // foreach(QString tagset, ts_tmp) // { // tagsCombo->addItem(tagsetIcon,tagset,"TAGSET"); // } QStringList tl_tmp = FMFontDb::DB()->getTags(); qDebug()<<"RELOAD"<addItem(tag, "TAG"); } } void ListDockWidget::reloadTagsCombo() { initTagCombo(); } void ListDockWidget::settingsDir(const QString &path) { static QString s; if (s == path) return; QFileInfo fi(path); QString dirPath = fi.absoluteFilePath(); if (fi.isFile()) dirPath = fi.absoluteDir().absolutePath(); QSettings settings; settings.setValue("Places/LastUsedFolder", dirPath); s = path; } void ListDockWidget::slotTabChanged(int i) { if (i == 2) { // if the new tab is the folder view QSettings settings; QString lastUsedDir = settings.value("Places/LastUsedFolder", QDir::homePath()).toString(); QDir d(lastUsedDir); if (!d.exists()) lastUsedDir = QDir::homePath(); theDirModel->refresh(); folderView->setCurrentIndex(theDirModel->index(lastUsedDir)); } } // void ListDockWidget::slotPanoseChecked(bool checked) // { // if(checked) // { // tagsCombo->clear(); // QMap< FontStrings::PanoseKey , QMap >::const_iterator cip; // QMap::const_iterator cip2; // for(cip = FontStrings::Panose().constBegin(); cip != FontStrings::Panose().constEnd(); ++cip) // { // for(cip2 = cip->constBegin() + 2 ;cip2 != cip->constEnd(); ++cip2) // { // tagsCombo->addItem(FontStrings::PanoseKeyName( cip.key() ) + "-" + cip2.value(), "TAG_IS_PANOSE"); // } // } // // } // else // { // initTagCombo(); // } // } QString ListDockWidget::fieldString(const QString & f) { if(f.count() <= allFieldName.count()) return f; if(f.mid(0,maxFieldStringWidth - 1).at(maxFieldStringWidth -2) == QChar(0x20) ) { return f.mid(0,maxFieldStringWidth - 1); } return f.mid(0,maxFieldStringWidth - 1) + "."; } void ListDockWidget::slotPreviewUpdate() { previewModel->dataChanged(); } void ListDockWidget::slotPreviewUpdateSize(int w) { // listPreview->setIconSize(QSize(qRound(w ), 1.3 * typotek::getInstance()->getPreviewSize() * typotek::getInstance()->getDpiY() / 72.0)); // previewModel->dataChanged(); } void ListDockWidget::slotPreviewSelected(const QModelIndex & index) { qDebug()<<"slotPreviewSelected("<getFilteredFonts(true).at(index.row())); if(!fItem) { qDebug()<<"\t-FontItme invalid"; return; } QString fName(fItem->path()); qDebug()<<"\t+"<< fName; if(!fName.isEmpty()) { typotek::getInstance()->getTheMainView()->slotFontSelectedByName(fName); } } void ListDockWidget::slotPreviewText(const QString & p) { typotek::getInstance()->setWord( p , true ); } void ListDockWidget::slotPreviewSize(double d) { typotek::getInstance()->setPreviewSize( d ); } QStringList ListDockWidget::getOperation() const { QStringList ret; // foreach(QAction* action, theOperationMenu->actions()) // { // if(action->isChecked()) // ret << action->data().toString(); // } if(operationAND->isChecked()) ret << "AND"; if(operationNOT->isChecked()) ret << "NOT"; return ret; } void ListDockWidget::clearOperation() { // foreach(QAction* action, theOperationMenu->actions()) // { // action->setChecked(false); // } operationAND->setCheckState(Qt::Unchecked); operationNOT->setCheckState(Qt::Unchecked); } void ListDockWidget::slotCollapseFamilies() { const int tliCount(fontTree->topLevelItemCount()); for(int i(0); i < tliCount; ++i) { int fCount(fontTree->topLevelItem(i)->childCount()); for(int f(0); f < fCount; ++f) { fontTree->topLevelItem(i)->child(f)->setExpanded(false); } } } void ListDockWidget::slotCollapseAlpha() { const int tliCount(fontTree->topLevelItemCount()); for(int i(0); i < tliCount; ++i) { fontTree->topLevelItem(i)->setExpanded(false); } } void ListDockWidget::slotExpandFamilies() { const int tliCount(fontTree->topLevelItemCount()); for(int i(0); i < tliCount; ++i) { int fCount(fontTree->topLevelItem(i)->childCount()); for(int f(0); f < fCount; ++f) { fontTree->topLevelItem(i)->child(f)->setExpanded(true); } } } void ListDockWidget::slotExpandAlpha() { const int tliCount(fontTree->topLevelItemCount()); for(int i(0); i < tliCount; ++i) { fontTree->topLevelItem(i)->setExpanded(true); } } fontmatrix-0.6.0+svn20110930/src/fmbrowser.h0000644000175000017500000000102111147562531017275 0ustar malexmalex// // C++ Interface: fmbrowser // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMBROWSER_H #define FMBROWSER_H #include #include class FMBrowser : public QProcess { Q_OBJECT FMBrowser(); ~FMBrowser(); static FMBrowser * instance; public: static FMBrowser * getInstance(); void loadUrl(const QString& urlString); void loadUrl(const QUrl& url); }; #endif // FMBROWSER_H fontmatrix-0.6.0+svn20110930/src/helpwidget.h0000644000175000017500000000346511041364552017435 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef HELPWIDGET_H #define HELPWIDGET_H #include #include /** @author Pierre Marchand */ class HelpWidget : public QDialog, private Ui::Help { Q_OBJECT public: HelpWidget ( QWidget *parent ); ~HelpWidget(); private slots: void slotIsClosing(); void slotWebLink(const QUrl & url ); void slotWebStart(); void slotWebLoad(int i); void slotWebFinished(bool); signals: void end(); }; #endif fontmatrix-0.6.0+svn20110930/src/metawidget.cpp0000644000175000017500000001047111443651075017766 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "metawidget.h" #include "ui_metawidget.h" #include "fmfontstrings.h" #include #include #include #include #include #include #include #include #include QStringListModel * MetaWidget::mModel = 0; QStringList MetaWidget::mList = QStringList(); MetaWidget::MetaWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MetaWidget) { ui->setupUi(this); if(mModel == 0) { mModel = new QStringListModel; mModel->setStringList(mList); } // QGridLayout * ui->grid(new QGridLayout(this)); QCompleter * completer(new QCompleter(mModel)); // dont know why but it doesn't want to be placed in the ui->grid ### // QLabel *lab(new QLabel(tr("
Fill-in a text field and press enter.
"), this)); // ui->grid->addWidget(lab,0,0,0,-1); QList ln; ln << FMFontDb::FontFamily << FMFontDb::FontSubfamily << FMFontDb::Designer << FMFontDb::Description << FMFontDb::Copyright << FMFontDb::Trademark << FMFontDb::ManufacturerName << FMFontDb::LicenseDescription << FMFontDb::AllInfo; int limit(qRound((ln.count() + 1) / 2) - 1); for(int gIdx(0); gIdx < ln.count() ; ++gIdx) { FMFontDb::InfoItem k(ln[gIdx]); // if((k != FMFontDb::AllInfo)) { QString fieldname(FontStrings::Names().value(k)); if(k == FMFontDb::AllInfo) fieldname = QString("
%1
").arg(fieldname); QLabel *label(new QLabel(fieldname,this)); QLineEdit *line(new QLineEdit(this)); metFields[line] = k; line->setCompleter(completer); label->setBuddy(line); connect(line,SIGNAL(returnPressed()), this, SLOT(addFilter())); if((gIdx) < limit) { ui->grid->addWidget(label,gIdx,0); ui->grid->addWidget(line,gIdx ,1); } else { int row(gIdx - limit); ui->grid->addWidget(label, row, 3); ui->grid->addWidget(line, row , 4); } } } connect(ui->cancelButton, SIGNAL(clicked()), this, SIGNAL(Close())); connect(ui->filterButton, SIGNAL(clicked()), this, SLOT(addFilter())); } MetaWidget::~MetaWidget() { delete ui; } void MetaWidget::changeEvent(QEvent *e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void MetaWidget::addFilter() { // if(QString(sender()->metaObject()->className()) == QString("QLineEdit")) // { // QLineEdit *l(reinterpret_cast(sender())); // FMFontDb::InfoItem it(metFields[l]); // QString t(l->text()); // if(!mList.contains(t)) // { // mList.append(t); // mModel->setStringList(mList); // } // resultMap[it] = t; // } // else { foreach(QLineEdit *l, metFields.keys()) { QString t(l->text()); FMFontDb::InfoItem it(metFields[l]); if(!t.isEmpty()) { if(!mList.contains(t)) { mList.append(t); mModel->setStringList(mList); } resultMap[it] = t; } } } emit filterAdded(); } fontmatrix-0.6.0+svn20110930/src/m17nshaper.cpp0000644000175000017500000001010211020043405017567 0ustar malexmalex// // C++ Implementation: m17nshaper // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "m17nshaper.h" #include M17NShaper * M17NShaper::instance = 0; QString OTF_tag_name ( unsigned int tag ); M17NShaper::M17NShaper ( FMOtf * o, QString s ) :FMBaseShaper ( o,s ) { instance = this; M17N_INIT(); mFont.family = Mnil /*otf->face()->family_name*/; mFont.x_ppem = otf->face()->units_per_EM; mFont.y_ppem = otf->face()->units_per_EM; mFont.get_glyph_id = impl_get_glyph_id; mFont.get_metrics = impl_get_metrics ; mFont.check_otf = impl_check_otf; mFont.drive_otf = impl_drive_otf; } M17NShaper::~ M17NShaper() { M17N_FINI() ; } GlyphList M17NShaper::doShape ( const QString & s ) { GlyphList ret; if(s.isEmpty()) return ret; int sCount(s.count()); grrr = mflt_find (s.at(0).unicode(), &mFont); MFLTGlyphString * gs = new MFLTGlyphString; MFLTGlyph * gl = new MFLTGlyph[sCount]; gs->glyph_size = sizeof (MFLTGlyph) * ( sCount ); gs->glyphs = gl; gs->allocated = sCount ; for(int i(0); i < sCount ; ++i) { gl[i].c = s[i].unicode(); } mflt_run(gs, 0, sCount , &mFont, grrr); } /// One again that you can’t just attach a font file or face to :( int M17NShaper::impl_get_glyph_id( struct _MFLTFont *font, MFLTGlyphString *gstring, int from, int to ) { qDebug()<<"M17NShaper::impl_get_glyph_id()"; FT_Face face = instance->otf->face(); if(!face) return 8; // corresponds to "#define OTF_ERROR_FT_FACE 8" in libotf for(int idx(from); idx < to; ++idx) { gstring->glyphs[idx].code = FT_Get_Char_Index(face, gstring->glyphs[idx].c); gstring->glyphs[idx].encoded = 1; } return 0; } int M17NShaper::impl_get_metrics( struct _MFLTFont *font, MFLTGlyphString *gstring, int from, int to ) { qDebug()<<"M17NShaper::impl_get_metrics"; // I wonder if it will be called, normally no... FT_Face face = instance->otf->face(); if(!face) return 8; // corresponds to "#define OTF_ERROR_FT_FACE 8" in libotf for(int idx(from); idx < to; ++idx) { if(FT_Load_Glyph(face, gstring->glyphs[idx].code, FT_LOAD_NO_SCALE )) continue; //TODO convert values to 26.6 gstring->glyphs[idx].xadv = face->glyph->metrics.horiAdvance ; gstring->glyphs[idx].yadv = face->glyph->metrics.vertAdvance ; gstring->glyphs[idx].ascent = face->ascender ; gstring->glyphs[idx].descent= face->descender ; gstring->glyphs[idx].lbearing= face->glyph->metrics.horiBearingX ; gstring->glyphs[idx].rbearing= face->glyph->metrics.horiBearingX + face->glyph->metrics.width ; gstring->glyphs[idx].measured = 1; } return 0; } int M17NShaper::impl_check_otf( struct _MFLTFont *font, MFLTOtfSpec *spec ) { qDebug()<<"M17NShaper::impl_check_otf"; QString script ( OTF_tag_name ( spec->script ) ); QString lang ( OTF_tag_name ( spec->langsys ) ); QStringList subf; QStringList posf; unsigned int* cursor ( 0 ); for ( cursor = spec->features[0]; *cursor ; ++cursor ) { subf << OTF_tag_name ( *cursor ); } for ( cursor = spec->features[1]; *cursor ; ++cursor ) { posf << OTF_tag_name ( *cursor ); } qDebug()<cachedString.clear(); QString script ( OTF_tag_name ( spec->script ) ); QString lang ( "dflt" ); QStringList subf; QStringList posf; QList gl; unsigned int* cursor ( 0 ); for ( cursor = spec->features[0]; *cursor ; ++cursor ) { subf << OTF_tag_name ( *cursor ); } for ( cursor = spec->features[1]; *cursor ; ++cursor ) { posf << OTF_tag_name ( *cursor ); } for(int i(from); i < to; ++i) { gl << in->glyphs[i].code; } instance->otf->curString.clear() ; for(int i(from);i < to; ++i) instance->otf->curString += QChar(in->glyphs[i].c); instance->cachedString = instance->otf->procstring(gl,script,lang,subf,posf); } fontmatrix-0.6.0+svn20110930/src/fontbook.cpp0000644000175000017500000011266511476762013017466 0ustar malexmalex// // C++ Implementation: fontbook // // Description: // // // Author: Pierre Marchand , (C) 2007 // // Copyright: See COPYING file that comes with this distribution // // #include "fontbook.h" #include "fontbookdialog.h" #include "typotek.h" #include "fontitem.h" #include "fmlayout.h" #include "fmfontdb.h" #include "fmpaths.h" #include "progressbarduo.h" #include "fmvariants.h" #include #include #include #include #include #include #include #include #include #include FontBook::FontBook() { mapPSize[ "A0" ] = QPrinter::A0 ; mapPSize[ "A1" ] = QPrinter::A1 ; mapPSize[ "A2" ] = QPrinter::A2 ; mapPSize[ "A3" ] = QPrinter::A3 ; mapPSize[ "A4" ] = QPrinter::A4 ; mapPSize[ "A5" ] = QPrinter::A5 ; mapPSize[ "A6" ] = QPrinter::A6 ; mapPSize[ "A7" ] = QPrinter::A7 ; mapPSize[ "A8" ] = QPrinter::A8 ; mapPSize[ "A9" ] = QPrinter::A9 ; mapPSize[ "B0" ] = QPrinter::B0 ; mapPSize[ "B1" ] = QPrinter::B1 ; mapPSize[ "B10" ] = QPrinter::B10 ; mapPSize[ "B2" ] = QPrinter::B2 ; mapPSize[ "B3" ] = QPrinter::B3 ; mapPSize[ "B4" ] = QPrinter::B4 ; mapPSize[ "B5" ] = QPrinter::B5 ; mapPSize[ "B6" ] = QPrinter::B6 ; mapPSize[ "B7" ] = QPrinter::B7 ; mapPSize[ "B8" ] = QPrinter::B8 ; mapPSize[ "B9" ] = QPrinter::B9 ; mapPSize[ "Letter" ] = QPrinter::Letter ; mapPSize[ "Tabloid" ] = QPrinter::Tabloid ; mapPSize[ "Custom" ] = QPrinter::Custom ; QFile sf(FMPaths::ResourcesDir()+ QString("fontbook.strings")); if(sf.open(QIODevice::ReadOnly)) { QString ss(QString::fromUtf8(sf.readAll())); stringList = ss.split("\n", QString::SkipEmptyParts); } else { stringList << QString("Call me Ishmael. Some years ago —never mind how long precisely— having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world."); stringList << QString("It is a way I have of driving off the spleen and regulating the circulation."); stringList << QString("Whenever I find myself growing grim about the mouth; whenever it is a damp, drizzly November in my soul; whenever I find myself involuntarily pausing before coffin warehouses, and bringing up the rear of every funeral I meet; and especially whenever my hypos get such an upper hand of me, that it requires a strong moral principle to prevent me from deliberately stepping into the street, and methodically knocking people's hats off —then, I account it high time to get to sea as soon as I can."); stringList << QString("This is my substitute for pistol and ball."); stringList << QString("With a philosophical flourish Cato throws himself upon his sword; I quietly take to the ship."); stringList << QString("There is nothing surprising in this. If they but knew it, almost all men in their degree, some time or other, cherish very nearly the same feelings towards the ocean with me."); } } FontBook::~FontBook() { } void FontBook::doBook(FontBook::Style s) { printer = new QPrinter( QPrinter::HighResolution ); printerRect = printer->paperRect(QPrinter::Point); QPrintDialog dialog(printer); dialog.setWindowTitle("Fontmatrix - " + tr("Print Fontbook")); if ( dialog.exec() != QDialog::Accepted ) return; printer->setFullPage ( true ); painter = new QPainter( printer ); painter->setRenderHint(QPainter::Antialiasing, true); painter->setRenderHint(QPainter::TextAntialiasing, true); switch(s) { case Full: doFullBook(); break; case OneLiner: doOneLinerBook(); break; default: break; } delete painter; delete printer; } void FontBook::doFullBook() { // Full book // progress = new ProgressBarDuo(typotek::getInstance()); doFullBookCover(); progress->setLabel(QString("-"), 0); progress->setLabel(QString("-"), 1); progress->setMax(FMFontDb::DB()->getFilteredFonts(true).count(), 0); progress->setMax(0, 1); progress->show(); int familyCounter(0); foreach(FontItem * family, FMFontDb::DB()->getFilteredFonts(true)) { progress->setLabel(family->family(), 0); progress->setValue(++familyCounter, 0); printer->newPage(); if(doFullBookPageLeft(family->family())) { printer->newPage(); doFullBookPageRight(family->family()); } } delete progress; } void FontBook::doFullBookCover() { QGraphicsScene pScene(printerRect); QFont aFont; aFont.setPointSizeF(26.0); QGraphicsSimpleTextItem * title(pScene.addSimpleText(QString("Fontmatrix"),aFont)); title->setPos(60, printerRect.height()*.9); int module(250); double x(0); double y(0); double fsize(qrand() % module); int gray(qrand() % 160); foreach(FontItem * f, FMFontDb::DB()->getFilteredFonts()) { int lc(f->lastChar()); int charcode(qrand() % lc); while(!f->hasCharcode(charcode)) charcode = qrand() % lc; QGraphicsPathItem *p(f->itemFromChar(charcode, fsize)); if(p->data(GLYPH_DATA_ERROR).toBool()) { delete p; continue; } pScene.addItem(p); p->setPos(x + (qrand() % qRound(printerRect.width())), y + (qrand() % qRound(printerRect.height()))); p->setBrush(QColor(gray, gray, gray)); p->setPen(Qt::NoPen); gray = qrand() % 160; fsize = qrand() % module; } pScene.render(painter, printer->paperRect(), printerRect); } void FontBook::doFullBookPageRight(const QString &family) { qDebug()<<"=>"< familyFonts = FMFontDb::DB()->FamilySet(family); QRectF halfPage(printerRect); halfPage.setHeight(halfPage.height() * 0.7); QGraphicsScene tmpScene(halfPage); QGraphicsScene pScene(halfPage); /** BEGINING OF decorative multi sized samples */ QMap logWidth; QMap logAscend; QMap logDescend; QMap sampleString; QMap sampleFont; QString iString(stringList.join(" ")); QStringList stl; QList sizes; if(familyFonts.count() > 1) { int module(familyFonts.count() * 2); int idxS( qrand() % qMax(1, iString.count() / 3) ); int idxE( qMax( qMax(2,familyFonts.count()), qrand() % module) ); while(stl.count() < familyFonts.count()) { if((idxS + idxE) < iString.count()) { QString t(iString.mid(idxS,idxE).simplified()); if((t.count() >= 2) && !stl.contains(t) && !sizes.contains(t.count())) { qDebug()<<"\t"<rasterFreetype()); sampleFont[fidx]->setFTRaster(false); sampleFont[fidx]->setRenderReturnWidth(true); logWidth[fidx] = familyFonts[fidx]->renderLine(&tmpScene, sampleString[fidx], QPointF(0.0, 1000.0) , 999999.0, 1000.0, 1) ; sampleFont[fidx]->setRenderReturnWidth(false); sampleFont[fidx]->setFTRaster(rasterState); logAscend[fidx] = 1000.0 - tmpScene.itemsBoundingRect().top(); logDescend[fidx] = tmpScene.itemsBoundingRect().bottom() - 1000.0; // qDebug()<< sampleString[fidx] << logWidth[fidx]; QList lgit(tmpScene.items()); foreach(QGraphicsItem* git, lgit) { tmpScene.removeItem(git); delete git; } } const double defWidth( 480.0 ); const double defHeight( 570.0 ); const double xOff( 0.5 * (printerRect.width() - defWidth) ); double yPos( 33.0 ); QFont nameFont; nameFont.setPointSizeF(5.0); for(int fidx(0); fidx < familyFonts.count(); ++fidx) { double fSize( (defWidth * 1000.0) / logWidth[fidx]); double fAscend(logAscend[fidx] * fSize / 1000.0); double fDescend(logDescend[fidx] * fSize / 1000.0 ); if( (fidx > 0) && ((yPos + fAscend + fDescend) > defHeight)) break; yPos += fAscend; QPointF origine(xOff, yPos ); // qDebug()<< sampleString[fidx] << fSize; bool rasterState(sampleFont[fidx]->rasterFreetype()); sampleFont[fidx]->setFTRaster(false); sampleFont[fidx]->renderLine(&pScene, sampleString[fidx], origine, printerRect.width() , fSize, 0); // pScene.addLine(QLineF(origine, QPointF(xOff + defWidth, yPos))); sampleFont[fidx]->setFTRaster(rasterState); yPos += 4.0; QGraphicsSimpleTextItem * nameText = pScene.addSimpleText( QString("%1 %2pt").arg(familyFonts[fidx]->variant()) .arg((fSize > 16.0) ? qRound(fSize) : (fSize, 0, 'f', 1)), nameFont) ; nameText->setPos(xOff, yPos); nameText->setBrush(Qt::gray); yPos += fDescend ; yPos += nameText->boundingRect().height(); } pScene.addLine(QLineF(QPointF(xOff, defHeight + 30.0), QPointF(xOff + defWidth, defHeight + 30.0))); pScene.render(painter, printer->paperRect(), printerRect); /** END OF decorative multi sized samples */ /** BEGINING of paragraph preview */ //lets setup a double column layout QRectF colRectLayoutLeft(printerRect); colRectLayoutLeft.setHeight(142.0); colRectLayoutLeft.setWidth(200.0); QRectF colRectLayoutRight(printerRect); colRectLayoutRight.setHeight(142.0); colRectLayoutRight.setWidth(260.0); QRectF colLeftRect(colRectLayoutLeft); colLeftRect.translate(xOff, 630.0); QRectF colRightRect(colRectLayoutRight); colRightRect.translate(xOff + 220.0, 630.0); // Select a font, regular preferred FontItem * rFont(FMVariants::Preferred(familyFonts)); // Lets layout ! double littleSize(7.5); double bigSize(10.0); QGraphicsScene layoutLeftScene(printerRect); QGraphicsScene layoutRightScene(printerRect); FMLayout *layoutLeft = new FMLayout(&layoutLeftScene , rFont, colLeftRect); FMLayout *layoutRight = new FMLayout(&layoutRightScene , rFont, colRightRect); layoutLeft->setDeviceIndy(true); layoutLeft->setAdjustedSampleInter( littleSize*1.2 ); // layoutLeft->setRect(colLeftRect); layoutRight->setDeviceIndy(true); layoutRight->setAdjustedSampleInter( bigSize*1.2 ); // layoutRight->setRect(colRightRect); bool rasterState(rFont->rasterFreetype()); rFont->setFTRaster(false); QList lgl; foreach(QString s, stringList) { lgl << rFont->glyphs(s, littleSize); } layoutLeft->doLayout(lgl, littleSize); lgl.clear(); foreach(QString s, stringList) { lgl << rFont->glyphs(s, bigSize); } layoutRight->doLayout(lgl, bigSize); rFont->setFTRaster(rasterState); // qDebug()<<"R"<getRect()<paperRect(), printerRect); layoutRightScene.render(painter, printer->paperRect(), printerRect); /** END of paragraph preview */ // DEBUG // QImage image(printer->paperRect(QPrinter::Point).size().toSize(), QImage::Format_ARGB32); // QPainter debugPainter(&image); // pScene.render(&debugPainter); // layoutLeftScene.render(&debugPainter); // layoutRightScene.render(&debugPainter); // image.save(QString("/home/pierre/debug_%1.png").arg(QTime::currentTime().msec())); //////// delete layoutLeft; delete layoutRight; } bool FontBook::doFullBookPageLeft(const QString &family) { // TODOs QList familyFonts = FMVariants::Order(FMFontDb::DB()->FamilySet(family)); QGraphicsScene pScene(printerRect); QFont nameFont; nameFont.setPointSizeF(18.0); QGraphicsSimpleTextItem * familyText( pScene.addSimpleText( QString("%1").arg(family), nameFont) ); familyText->setPos(printerRect.width() * 0.1 , printerRect.height() * 0.1); double xPos(printerRect.width() * 0.1); double yPos(printerRect.height() * 0.20); double maxYPos(0); int colBreak(0); if(familyFonts.count() <= 60) { if((familyFonts.count() % 4) == 0) colBreak = familyFonts.count() / 4; else colBreak = qMax( 1, familyFonts.count() / 3); double colunit(100); for(int fidx(0); fidx < familyFonts.count(); ++fidx) { if((fidx >= colBreak) && ((fidx % colBreak) == 0)) { xPos += colunit + 20 ; yPos = printerRect.height() * 0.20; } nameFont.setPointSizeF(4.0); QGraphicsSimpleTextItem * varText( pScene.addSimpleText(familyFonts[fidx]->variant() , nameFont) ); varText->setBrush(Qt::gray); varText->setPos(xPos, yPos); yPos += varText->boundingRect().height() * 2.2; QPointF origine(xPos, yPos ); bool rasterState(familyFonts[fidx]->rasterFreetype()); familyFonts[fidx]->setFTRaster(false); familyFonts[fidx]->renderLine(&pScene, QString("foxy brown fox trot"), origine, printerRect.width() * 0.35 , 12.0); familyFonts[fidx]->setFTRaster(rasterState); yPos += 12.0 ; maxYPos = qMax(yPos, maxYPos); } // Characters; FontItem * pf(FMVariants::Preferred(familyFonts)); int cCount(pf->countChars()); int charcode(pf->firstChar()); double ccX(printerRect.width() * 0.1); double ccY(maxYPos + 30.0); const double ccW(printerRect.width() * .9); for(int i = 0; i < cCount; ++i) { if(ccY > 560) break; QGraphicsPathItem *p(pf->itemFromChar(charcode, 15.0)); if(p->data(GLYPH_DATA_ERROR).toBool()) { charcode = pf->nextChar(charcode); delete p; continue; } pScene.addItem(p); p->setPen(Qt::NoPen); double advance(p->data(GLYPH_DATA_HADVANCE_SCALED).toDouble()); double fakeAdvance(advance * 1.5); if((ccX + fakeAdvance) > ccW) { ccY += 22.0; if(ccY > 560) break; ccX = printerRect.width() * 0.1; } p->setPos(ccX, ccY); ccX += fakeAdvance; charcode = pf->nextChar(charcode); } // Unicode Coverage QStringList llist; foreach(FontItem * fi, familyFonts) { foreach(const QString& sl, fi->supportedLangDeclaration()) { if(!llist.contains(sl)) llist << sl; } } if(llist.count() > 0) { nameFont.setPointSizeF(6.0); QGraphicsSimpleTextItem * uniText( pScene.addSimpleText(tr("Unicode coverage") , nameFont) ); uniText->setPos(printerRect.width() * 0.5, 600); nameFont.setPointSizeF(4.0); QGraphicsTextItem * uniList(pScene.addText(llist.join(", ") + QString("."), nameFont)); uniList->setTextWidth(printerRect.width() * .4); uniList->setPos(printerRect.width() * 0.5, 630); } // OpenType pScene.render(painter, printer->paperRect(), printerRect); return true; } else // think Kepler :) { colBreak = 20; double colunit(100); bool more(false); for(int fidx(0); fidx < familyFonts.count(); ++fidx) { if((fidx >= colBreak)) { if(fidx >= (4 * colBreak)) { if(fidx == (4 * colBreak)) { pScene.render(painter, printer->paperRect(), printerRect); pScene.clear(); printer->newPage(); more = true; xPos = printerRect.width() * 0.1; yPos = printerRect.height() * 0.08; } else if(((fidx - (4 * colBreak)) % (colBreak + 4)) == 0) { xPos += colunit + 20 ; yPos = printerRect.height() * 0.08; } } else if((fidx % colBreak) == 0) { xPos += colunit + 20 ; yPos = printerRect.height() * 0.20; } } nameFont.setPointSizeF(4.0); QGraphicsSimpleTextItem * varText( pScene.addSimpleText(familyFonts[fidx]->variant() , nameFont) ); varText->setBrush(Qt::gray); varText->setPos(xPos, yPos); yPos += varText->boundingRect().height() * 2.2; QPointF origine(xPos, yPos ); bool rasterState(familyFonts[fidx]->rasterFreetype()); familyFonts[fidx]->setFTRaster(false); familyFonts[fidx]->renderLine(&pScene, QString("foxy brown fox trot"), origine, printerRect.width() * 0.35 , 12.0); familyFonts[fidx]->setFTRaster(rasterState); yPos += 12.0 ; } pScene.render(painter, printer->paperRect(), printerRect); return (!more); } } void FontBook::doOneLinerBook() { } // OBSOLETE void FontBook::doBookFromTemplate ( const QDomDocument &aTemplate ) { // /** // We build lists of contexts // */ // QList conPage; // QList conFamily; // QList conSubfamily; // QDomNodeList conList = aTemplate.elementsByTagName ( "context" ); // if ( conList.length() == 0 ) // { // qDebug ( ) << "ERROR: "<< conList.length() <<" context in template, see yourself :" ; // qDebug() << aTemplate.toString ( 1 ); // return; // } // QMap svgRendered; // QMap qfontCache; // abit of optim. // for ( uint i = 0; i < conList.length(); ++i ) // { // FontBookContext fbc; // QDomNode context = conList.item ( i ); // QString levelString = context.toElement().attributeNode ( "level" ).value(); // fbc.textElement.e = context.namedItem ( "text" ).toElement().text(); // if ( !fbc.textElement.e.isEmpty() ) // { // // QString textInternalString = context.namedItem ( "text" ).toElement().attributeNode ( "internal" ).value(); // // fbc.textElement.internal = ( textInternalString == "true" ) ? true : false; // fbc.textElement.valid = true; // QDomNode tStyle = context.namedItem ( "textstyle" ); // fbc.textStyle.name = tStyle.toElement().attributeNode ( "name" ).value(); // fbc.textStyle.font = tStyle.namedItem ( "font" ).toElement().text(); // fbc.textStyle.fontsize = QString ( tStyle.namedItem ( "fontsize" ).toElement().text() ).toDouble() ; // fbc.textStyle.color = QColor ( tStyle.namedItem ( "color" ).toElement().text() ); // bool ital = false; // QFont::Weight bold = QFont::Normal; // if ( fbc.textStyle.font.contains ( "italic", Qt::CaseInsensitive ) ) // ital = true; // if ( fbc.textStyle.font.contains ( "bold", Qt::CaseInsensitive ) ) // bold = QFont::Bold; // qfontCache[fbc.textStyle.name] = QFont ( fbc.textStyle.font,10, bold, ital ); // qfontCache[fbc.textStyle.name].setPointSizeF(fbc.textStyle.fontsize ); // fbc.textStyle.lineheight = QString ( tStyle.namedItem ( "lineheight" ).toElement().text() ).toDouble() ; // fbc.textStyle.margin_top = QString ( tStyle.namedItem ( "margintop" ).toElement().text() ).toDouble() ; // fbc.textStyle.margin_left = QString ( tStyle.namedItem ( "marginleft" ).toElement().text() ).toDouble() ; // fbc.textStyle.margin_bottom = QString ( tStyle.namedItem ( "marginbottom" ).toElement().text() ).toDouble() ; // fbc.textStyle.margin_right = QString ( tStyle.namedItem ( "marginright" ).toElement().text() ).toDouble() ; // } // QDomNode graphicNode = context.namedItem ( "graphic" ); // if ( graphicNode.isElement() ) // { // // QDomDocumentFragment svgFrag = aTemplate.createDocumentFragment(); // QDomNode svgNode = graphicNode.toElement().namedItem ( "svg" ).cloneNode ( true ); // // svgFrag.appendChild(svgNode); // // if(svgNode.isElement()) // { // fbc.graphic.name = graphicNode.toElement().attributeNode ( "name" ).value(); // fbc.graphic.x = QString ( graphicNode.toElement().attributeNode ( "xpos" ).value() ).toDouble(); // fbc.graphic.y = QString ( graphicNode.toElement().attributeNode ( "ypos" ).value() ).toDouble(); // QDomDocument svgDoc; // QDomNode svg = svgDoc.importNode ( svgNode,true ); // svgDoc.appendChild ( svg ); // QString svgString ( "\n" + svgDoc.toString ( 0 ) ); // QSvgRenderer *doc = new QSvgRenderer ( svgString.toUtf8() ); // svgRendered[fbc.graphic.name] = doc; // fbc.graphic.valid = true; // // qDebug() << fbc.graphic.svg; // } // } // if ( levelString == "page" ) // conPage << fbc; // else if ( levelString == "family" ) // conFamily << fbc; // else if ( levelString == "subfamily" ) // conSubfamily << fbc; // } // QString paperSize = QString ( aTemplate.documentElement().namedItem ( "papersize" ).toElement().text() ).toUpper(); // double prectx = QString ( aTemplate.documentElement().namedItem ( "papersize" ).toElement().attributeNode ( "bboxx" ).value() ).toDouble(); // double precty = QString ( aTemplate.documentElement().namedItem ( "papersize" ).toElement().attributeNode ( "bboxy" ).value() ).toDouble(); // double prectw = QString ( aTemplate.documentElement().namedItem ( "papersize" ).toElement().attributeNode ( "bboxw" ).value() ).toDouble(); // double precth = QString ( aTemplate.documentElement().namedItem ( "papersize" ).toElement().attributeNode ( "bboxh" ).value() ).toDouble(); // QPrinter thePrinter ( QPrinter::HighResolution ); // thePrinter.setOutputFormat ( QPrinter::PdfFormat ); // thePrinter.setCreator ( "Fontmatrix " + QString::number ( FONTMATRIX_VERSION_MAJOR ) + "." + QString::number ( FONTMATRIX_VERSION_MINOR ) ); // thePrinter.setDocName ( "A font book" ); // thePrinter.setOutputFileName ( outputFilePath ); // thePrinter.setPageSize ( mapPSize[paperSize] ); // thePrinter.setFullPage ( true ); // // qDebug() << thePrinter.pageSize() << thePrinter.pageRect() << thePrinter.paperRect() << thePrinter.resolution() ; // double paperWidth = thePrinter.pageRect().width() / thePrinter.resolution() * 72.0; // double paperHeight = thePrinter.pageRect().height() / thePrinter.resolution() * 72.0; // // qDebug()<< paperSize << paperWidth << paperHeight; // QGraphicsScene theScene; // QGraphicsScene measurementScene; // measurementScene.setSceneRect( 0,0,paperWidth,paperHeight ); // theScene.setSceneRect ( 0,0,paperWidth,paperHeight ); // QPainter thePainter ( &thePrinter ); // QPointF thePos ( prectx,precty ); // QList renderedFont; // QList renderedGraphic; // QList renderedText; // QList localFontMap = FMFontDb::DB()->getFilteredFonts(); // QMap > keyList; // for ( int i=0; i < localFontMap.count();++i ) // { // keyList[localFontMap[i]->family() ].append ( localFontMap[i] ); // } // QMap >::const_iterator kit; // QProgressDialog progress ( QObject::tr ( "Creating font book... " ), QObject::tr ( "cancel" ), 0, keyList.count(), typotek::getInstance() ); // progress.setWindowModality ( Qt::WindowModal ); // int progressindex=0; // QString pageNumStr; // int pageNumber = 0; // ///We begin in a PAGE context // // qDebug() << "PAGE"; // pageNumStr.setNum ( ++pageNumber ); // QMap pageReplace; // QMap familyReplace; // QMap subfamilyReplace; // QString currentFamily; // QString currentSubfamily; // /** Z policy is // PAGE_SVG 1 // PAGE_TEXT 10 // FAMILY_SVG 100 // FAMILY_TEXT 1000 // SUBFAMILY_SVG 10000 // SUBFAMILY_TEXT 100000 // */ // for ( int pIndex = 0; pIndex < conPage.count(); ++pIndex ) // { // // qDebug()<<"PI"<::const_iterator repIt = pageReplace.begin(); repIt != pageReplace.end(); ++repIt ) // place.replace ( repIt.key(),repIt.value(),Qt::CaseSensitive ); // pagelines << place; // } // // QFont pFont ( conPage[pIndex].textStyle.font, conPage[pIndex].textStyle.fontsize ); // for ( int pl = 0; pl < pagelines.count(); ++pl ) // { // QGraphicsTextItem * ti = theScene.addText ( pagelines[pl], qfontCache[conPage[pIndex].textStyle.name] ); // renderedText << ti; // ti->setPos ( conPage[pIndex].textStyle.margin_left , conPage[pIndex].textStyle.margin_top + ( pl * conPage[pIndex].textStyle.lineheight ) ); // ti->setZValue ( 10 ); // ti->setDefaultTextColor ( conPage[pIndex].textStyle.color ); // } // } // if ( conPage[pIndex].graphic.valid ) // { // QGraphicsSvgItem *svgIt = new QGraphicsSvgItem(); // svgIt->setSharedRenderer ( svgRendered[conPage[pIndex].graphic.name] ); // theScene.addItem ( svgIt ); // svgIt->setPos ( conPage[pIndex].graphic.x, conPage[pIndex].graphic.y ); // renderedGraphic << svgIt; // svgIt->setZValue ( 1 ); // } // } // /// Beginning of the big loop // for ( kit = keyList.begin(); kit != keyList.end(); ++kit ) // { // /// We are in a FAMILY context // // qDebug() << "FAMILY"; // { // if ( progress.wasCanceled() ) // break; // progress.setLabelText ( kit.key() ); // progress.setValue ( ++progressindex ); // } // currentFamily = kit.key(); // for ( int elemIndex = 0; elemIndex < conFamily.count() ; ++elemIndex ) // { // QStringList familylines; // QStringList tmplines = conFamily[elemIndex].textElement.e.split ( "\n" ); // familyReplace["##FAMILY##"] = kit.key(); // for ( int t = 0; t < tmplines.count(); ++t ) // { // QString place = tmplines[t]; // for ( QMap::const_iterator repIt = familyReplace.begin(); repIt != familyReplace.end(); ++repIt ) // place.replace ( repIt.key(),repIt.value(),Qt::CaseSensitive ); // if ( !place.isEmpty() ) // familylines << place; // } // double available = ( precty + precth ) - thePos.y(); // double needed = ( familylines.count() * conFamily[elemIndex].textStyle.lineheight ) // + conFamily[elemIndex].textStyle.margin_top // + conFamily[elemIndex].textStyle.margin_bottom; // if ( needed > available ) // { // /// We are in a PAGE context // // qDebug() << "NFPAGE"; // // close, clean and create // theScene.render ( &thePainter ); // thePos.ry() = precty; // // for ( int d = 0; d < renderedFont.count() ; ++d ) // // renderedFont[d]->deRenderAll(); // for ( int d = 0; d < renderedGraphic.count(); ++d ) // delete renderedGraphic[d]; // for ( int d = 0; d < renderedText.count(); ++d ) // delete renderedText[d]; // renderedFont.clear(); // renderedGraphic.clear(); // renderedText.clear(); // // theScene.removeItem ( theScene.createItemGroup ( theScene.items() ) ); // thePrinter.newPage(); // pageNumStr.setNum ( ++pageNumber ); // // // for ( int pIndex = 0; pIndex < conPage.count(); ++pIndex ) // { // QStringList pagelines ; // QStringList tmplines = conPage[pIndex].textElement.e.split ( "\n" ); // pageReplace["##PAGENUMBER##"] = pageNumStr; // pageReplace["##FAMILY##"] = currentFamily; // pageReplace["##SUBFAMILY##"] = currentSubfamily; // for ( int t = 0; t < tmplines.count(); ++t ) // { // QString pageplace = tmplines[t]; // for ( QMap::const_iterator repIt = pageReplace.begin(); repIt != pageReplace.end(); ++repIt ) // pageplace.replace ( repIt.key(),repIt.value(),Qt::CaseSensitive ); // pagelines << pageplace; // } // // QFont pFont ( conPage[pIndex].textStyle.font, conPage[pIndex].textStyle.fontsize ); // for ( int pl = 0; pl < pagelines.count(); ++pl ) // { // QGraphicsTextItem * ti = theScene.addText ( pagelines[pl], qfontCache[conPage[pIndex].textStyle.name] ); // renderedText << ti; // ti->setPos ( conPage[pIndex].textStyle.margin_left + prectx, conPage[pIndex].textStyle.margin_top + ( pl * conPage[pIndex].textStyle.lineheight ) ); // ti->setZValue ( 10 ); // ti->setDefaultTextColor ( conPage[pIndex].textStyle.color ); // } // if ( conPage[pIndex].graphic.valid ) // { // QGraphicsSvgItem *svgIt = new QGraphicsSvgItem(); // svgIt->setSharedRenderer ( svgRendered[conPage[pIndex].graphic.name] ); // theScene.addItem ( svgIt ); // svgIt->setPos ( conPage[pIndex].graphic.x + prectx, conPage[pIndex].graphic.y ); // renderedGraphic << svgIt; // svgIt->setZValue ( 1 ); // } // } // } // for ( int fl = 0; fl < familylines.count(); ++fl ) // { // QGraphicsTextItem * ti = theScene.addText ( familylines[fl], qfontCache[conFamily[elemIndex].textStyle.name] ); // renderedText << ti; // ti->setPos ( conFamily[elemIndex].textStyle.margin_left + prectx, thePos.y() + ( conFamily[elemIndex].textStyle.margin_top + ( fl * conFamily[elemIndex].textStyle.lineheight ) ) ); // ti->setZValue ( 1000 ); // ti->setDefaultTextColor ( conFamily[elemIndex].textStyle.color ); // } // if ( conFamily[elemIndex].graphic.valid ) // { // QGraphicsSvgItem *svgIt = new QGraphicsSvgItem(); // svgIt->setSharedRenderer ( svgRendered[conFamily[elemIndex].graphic.name] ); // theScene.addItem ( svgIt ); // svgIt->setPos ( conFamily[elemIndex].graphic.x + prectx, conFamily[elemIndex].graphic.y + thePos.y() ); // renderedGraphic << svgIt; // svgIt->setZValue ( 100 ); // } // thePos.ry() += needed; // } // end of FAMILY level elements // /// Looping through all faces for the current family // for ( int fontIndex = 0;fontIndex < kit.value().count(); ++fontIndex ) // { // FontItem * theFont = kit.value() [fontIndex]; // FMLayout *alay = new FMLayout(&theScene , theFont); // /// We are in a SUBFAMILY context // currentSubfamily = theFont->variant(); // for ( int elemIndex = 0; elemIndex < conSubfamily.count() ; ++elemIndex ) // { // // First, is there enough room for this element // QStringList sublines; // QStringList tmplines = conSubfamily[elemIndex].textElement.e.split ( "\n" ); // subfamilyReplace["##FAMILY##"] = theFont->family(); // subfamilyReplace["##SUBFAMILY##"] = theFont->variant(); // subfamilyReplace["##FILE##"]= theFont->path(); // subfamilyReplace["##TAGS##"]= theFont->tags().join ( ";" ) ; // subfamilyReplace["##COUNT##"]= QString::number ( theFont->glyphsCount() ); // subfamilyReplace["##TYPE##"]= theFont->type(); // subfamilyReplace["##CHARSETS##"]=theFont->charmaps().join ( ";" ); // for ( int t = 0; t < tmplines.count(); ++t ) // { // QString subplace = tmplines[t]; // for ( QMap::const_iterator repIt = subfamilyReplace.begin(); repIt != subfamilyReplace.end(); ++repIt ) // subplace.replace ( repIt.key(),repIt.value(),Qt::CaseSensitive ); // if ( !subplace.isEmpty() ) // sublines << subplace; // } // double available = ( precty + precth ) - thePos.y(); // double needed (0);/*= ( sublines.count() * conSubfamily[elemIndex].textStyle.lineheight ) // + conSubfamily[elemIndex].textStyle.margin_top // + conSubfamily[elemIndex].textStyle.margin_bottom;*/ // double mwidth( conSubfamily[elemIndex].textStyle.margin_right - (conSubfamily[elemIndex].textStyle.margin_left + prectx) ); // /// Let’s see how much room we need // // For that we’ll render all elements on a dedicated scene if needed. // if(conSubfamily[elemIndex].graphic.valid) // { // needed = svgRendered[conSubfamily[elemIndex].graphic.name]->defaultSize().height(); // } // else // { // if ( conSubfamily[elemIndex].textStyle.font == "_FONTMATRIX_" ) // We’ll use the current font // { // QList gl; // for ( int sl = 0; sl < sublines.count(); ++sl ) // { // gl << theFont->glyphs ( sublines[sl].trimmed(), conSubfamily[elemIndex].textStyle.fontsize ); // } // QRectF rf( measurementScene.sceneRect() ); // rf.setWidth(mwidth); // FMLayout *tlay = new FMLayout( &measurementScene ,theFont, rf ); // tlay->setPersistentScene(false); // tlay->setAdjustedSampleInter ( conSubfamily[elemIndex].textStyle.lineheight ); // tlay->setDeviceIndy ( true ); // tlay->doLayout ( gl , conSubfamily[elemIndex].textStyle.fontsize ); // // tlay->run(); // needed = tlay->drawnLines * conSubfamily[elemIndex].textStyle.lineheight; // delete tlay; // } // else // { // for ( int sl = 0; sl < sublines.count(); ++sl ) // { // QGraphicsTextItem gti( sublines[sl]); // gti.setFont( qfontCache[ conSubfamily[elemIndex].textStyle.name] ); // gti.setTextWidth( mwidth ); // needed = gti.document()->size().height(); // } // } // } // if ( needed > available ) // { // /// We are in a PAGE context // // qDebug() << "NSPAGE"; // // close, clean and create // theScene.render ( &thePainter ); // thePos.ry() = precty; // // for ( int d = 0; d < renderedFont.count() ; ++d ) // // renderedFont[d]->deRenderAll(); // for ( int d = 0; d < renderedGraphic.count(); ++d ) // delete renderedGraphic[d]; // for ( int d = 0; d < renderedText.count(); ++d ) // delete renderedText[d]; // renderedFont.clear(); // renderedGraphic.clear(); // renderedText.clear(); // // theScene.removeItem ( theScene.createItemGroup ( theScene.items() ) ); // thePrinter.newPage(); // pageNumStr.setNum ( ++pageNumber ); // // // for ( int pIndex = 0; pIndex < conPage.count(); ++pIndex ) // { // QStringList pagelines ; // QStringList tmplines = conPage[pIndex].textElement.e.split ( "\n" ); // pageReplace["##PAGENUMBER##"] = pageNumStr; // pageReplace["##FAMILY##"] = currentFamily; // pageReplace["##SUBFAMILY##"] = currentSubfamily; // for ( int t = 0; t < tmplines.count(); ++t ) // { // QString pageplace = tmplines[t]; // for ( QMap::const_iterator repIt = pageReplace.begin(); repIt != pageReplace.end(); ++repIt ) // pageplace.replace ( repIt.key(),repIt.value(),Qt::CaseSensitive ); // pagelines << pageplace; // } // // QFont pFont ( conPage[pIndex].textStyle.font, conPage[pIndex].textStyle.fontsize ); // for ( int pl = 0; pl < pagelines.count(); ++pl ) // { // QGraphicsTextItem * ti = theScene.addText ( pagelines[pl], qfontCache[conPage[pIndex].textStyle.name] ); // renderedText << ti; // ti->setPos ( conPage[pIndex].textStyle.margin_left + prectx, conPage[pIndex].textStyle.margin_top + ( pl * conPage[pIndex].textStyle.lineheight ) ); // ti->setZValue ( 10 ); // ti->setDefaultTextColor ( conPage[pIndex].textStyle.color ); // } // if ( conPage[pIndex].graphic.valid ) // { // QGraphicsSvgItem *svgIt = new QGraphicsSvgItem(); // svgIt->setSharedRenderer ( svgRendered[conPage[pIndex].graphic.name] ); // theScene.addItem ( svgIt ); // svgIt->setPos ( conPage[pIndex].graphic.x + prectx, conPage[pIndex].graphic.y ); // renderedGraphic << svgIt; // svgIt->setZValue ( 1 ); // } // } // } // if ( conSubfamily[elemIndex].graphic.valid ) // { // QGraphicsSvgItem *svgIt = new QGraphicsSvgItem(); // renderedGraphic << svgIt; // svgIt->setSharedRenderer ( svgRendered[conSubfamily[elemIndex].graphic.name] ); // theScene.addItem ( svgIt ); // svgIt->setPos ( conSubfamily[elemIndex].graphic.x + prectx, conSubfamily[elemIndex].graphic.y + thePos.y() ); // svgIt->setZValue ( 100000 ); // thePos.ry() += svgRendered[conSubfamily[elemIndex].graphic.name]->defaultSize().height(); // } // else // { // if ( conSubfamily[elemIndex].textStyle.font == "_FONTMATRIX_" ) // We’ll use the current font // { // QList gl; // for ( int sl = 0; sl < sublines.count(); ++sl ) // { // gl << theFont->glyphs ( sublines[sl].trimmed(), conSubfamily[elemIndex].textStyle.fontsize ); // } // QRectF parRect ( conSubfamily[elemIndex].textStyle.margin_left + prectx, // thePos.y() + conSubfamily[elemIndex].textStyle.margin_top, // conSubfamily[elemIndex].textStyle.margin_right, // precth - thePos.y() ); // alay->setRect(parRect); // if(renderedFont.count() > 0) // { // alay->setPersistentScene(true); // // FMLayout::getLayout()->resetScene(); // } // else // alay->setPersistentScene(false); // // qDebug()<<"PAR("+theFont->fancyName()+")("<< gl.count() <<")"<setTheScene ( ); // // FMLayout::getLayout()->setTheFont ( theFont ); // alay->setAdjustedSampleInter ( conSubfamily[elemIndex].textStyle.lineheight ); // alay->setDeviceIndy ( true ); // alay->doLayout ( gl , conSubfamily[elemIndex].textStyle.fontsize ); // // alay->run(); // thePos.ry() += alay->drawnLines * conSubfamily[elemIndex].textStyle.lineheight; // renderedFont.append ( theFont ); // } // else // { // // QFont aFont ( conSubfamily[elemIndex].textStyle.font,conSubfamily[elemIndex].textStyle.fontsize ); // for ( int sl = 0; sl < sublines.count(); ++sl ) // { // QGraphicsTextItem * ti = theScene.addText ( sublines[sl], qfontCache[ conSubfamily[elemIndex].textStyle.name] ); // renderedText << ti; // ti->setTextWidth( mwidth ); // ti->setPos ( conSubfamily[elemIndex].textStyle.margin_left + prectx, thePos.y() + ( conSubfamily[elemIndex].textStyle.margin_top + ( sl * conSubfamily[elemIndex].textStyle.lineheight ) ) ); // ti->setZValue ( 10000 ); // ti->setDefaultTextColor ( conSubfamily[elemIndex].textStyle.color ); // thePos.ry() += ti->document()->size().height(); // } // } // } // } // end of SUBFAMILY level elements // // qDebug() << "ENDOF_SUBFAMILY"; // delete alay; // } // } // if ( renderedFont.count() ) // { // theScene.render ( &thePainter ); // for ( int d = 0; d < renderedFont.count() ; ++d ) // { // renderedFont[d]->deRenderAll(); // } // for ( int d = 0; d < renderedGraphic.count(); ++d ) // delete renderedGraphic[d]; // for ( int d = 0; d < renderedText.count(); ++d ) // delete renderedText[d]; // renderedFont.clear(); // renderedGraphic.clear(); // renderedText.clear(); // } // for ( QMap::iterator sit ( svgRendered.begin() ); sit != svgRendered.end(); ++sit ) // delete sit.value(); } fontmatrix-0.6.0+svn20110930/src/messages/0000755000175000017500000000000011641435631016732 5ustar malexmalexfontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-fi.ts0000644000175000017500000032117411106120214022061 0ustar malexmalex About About Fontmatrix Tietoja Fontmatrixista TextLabel Tekstimerkintä The Project Projekti The People Ihmiset Splash Latausikkuna Close Sulje AboutWidget version versio fonts loaded fonttia ladattuna BookExportDialog Browse... Selaa... Export Font Book Tee fonttikirja Output Tiedostoon FMLayout Text engine options Tekstijärjestelmän ominaisuudet FolderViewMenu Import recursively Tuo rekursiivisesti Reload Tree Lataa uudelleen Import Directory Tuo hakemisto Import File Tuo tiedosto FontAction Form Lomake Add Tag Lisää luokka Action Toiminto FontBookDialog Save fontBook Tallenna fonttikirja FontItem Fontmatrix - Download Fontmatrix - Lataa Downloading %1. Ladataan %1. Category Osa Glyphs count Merkkien määrä Font Type Fonttityyppi Charmaps List Luettelo merkkikartoista FontStrings Copyright Tekijänoikeudet Font Family Fonttiperhe Font Subfamily Fonttiperheen alijoukko Unique font identifier Yksilöllinen tunniste Full font name Fontin täydellinen nimi Version string Versiomerkintä Postscript name Postscript-nimi Trademark Tavaramerkki Manufacturer Valmistaja Designer Suunnittelija Description Kuvaus URL Vendor Valmistajan URL URL Designer Suunnittelijan URL License Description Lisenssin kuvaus License Info URL Lisenssin URL Preferred Family Suositeltu perhe Preferred Subfamily Suositeltu perheen alijoukko Compatible Full (Macintosh only) Täysi yhteensopivuus (ainoastaan Macintosh) Sample text Esimerkkiteksti PostScript CID findfont name PostScript CID findfont -nimi Panose Panose All fields Kaikki kentät Any Mikä tahansa No Fit Ei sopivaa luokkaa Text and Display Family Type Leipäteksti Script Family Type Komentojono Decorative Family Type Koristeellinen Pictorial Family Type Kuvitettu Family Type Fonttiperheen tyyli Cove Serif style Kovera Obtuse Cove Serif style Loivasti kovera Square Cove Serif style Kulmikkaasti kovera Obtuse Square Cove Serif style Loivasti ja kulmikkaasti kovera Square Serif style Kulmikas Thin Serif style Ohut Bone Serif style Ovaali Exaggerated Serif style Liioiteltu Triangle Serif style Kolmio Normal Sans Serif style Suora pääteviivaton Obtuse Sans Serif style Vaakasuunnassa vino pääteviivaton Perp Sans Serif style Pystysuunnassa vino pääteviivaton Flared Serif style Levenevä Rounded Serif style Pyöristetty Serif style Pääteviivan tyyli Very Light Weight Erittäin kevyt Light Weight Kevyt Thin Weight Ohut Book Weight Kirja Medium Weight Keskipaksu Demi Weight Paksu Bold Weight Lihava Heavy Weight Raskas Black Weight Musta Nord Weight Hyvin musta Weight Vahvuus Old Style Proportion Vanhoillinen Modern Proportion Moderni Even Width Proportion Tasalevyinen Expanded Proportion Levennetty Condensed Proportion Kavennettu Very Expanded Proportion Huomattavasti levennetty Very Condensed Proportion Huomattavasti kavennettu Monospaced Proportion Tasavälinen Proportion Leveys None Contrast Ei ole Very Low Contrast Hyvin pieni Low Contrast Pieni Medium Low Contrast Keskipieni Medium Contrast Keskipaksu Medium High Contrast Keskiverto High Contrast Suuri Very High Contrast Hyvin suuri Contrast Kontrasti Gradual/Diagonal Stroke Variation Asteittainen ja diagonaalinen Gradual/Transitional Stroke Variation Asteittainen ja transitionaalinen Gradual/Vertical Stroke Variation Asteittainen ja pystysuora Gradual/Horizontal Stroke Variation Asteittainen ja vaakasuora Rapid/Vertical Stroke Variation Nopea ja pystysuora Rapid/Horizontal Stroke Variation Nopea ja vaakasuora Instant/Vertical Stroke Variation Välitön ja pystysuora Stroke Variation Viivan paksuuden muutos Straight Arms/Horizontal Arm Style Suorat ja vaakasuora Straight Arms/Wedge Arm Style Suorat ja kolmio Straight Arms/Vertical Arm Style Suorat ja pystysuora Straight Arms/Single Serif Arm Style Suorat ja yksipuoleinen pääteviiva Straight Arms/Double Serif Arm Style Suorat ja molemminpuoleinen pääteviiva Non-Straight Arms/Horizontal Arm Style Epäsuorat ja vaakasuora Non-Straight Arms/Wedge Arm Style Epäsuorat ja kolmio Non-Straight Arms/Vertical Arm Style Epäsuorat ja pystysuora Non-Straight Arms/Single Serif Arm Style Epäsuorat ja yksipuoleinen pääteviiva Non-Straight Arms/Double Serif Arm Style Epäsuorat ja molemminpuoleinen pääteviiva Arm Style Käsivarsien tyyli Normal/Contact Letterform Suora ja litistetty Normal/Weighted Letterform Suora ja huomattava Normal/Boxed Letterform Suora ja ahdettu Normal/Flattened Letterform Suora ja kaareva Normal/Rounded Letterform Suora ja pyöreäkulmainen Normal/Off Center Letterform Suora ja epäkesko Normal/Square Letterform Suora ja kulmikas Oblique/Contact Letterform Kallistettu ja litistetty Oblique/Weighted Letterform Kallistettu ja huomattava Oblique/Boxed Letterform Kallistettu ja ahdettu Oblique/Flattened Letterform Kallistettu ja kaareva Oblique/Rounded Letterform Kallistettu ja pyöreäkulmainen Oblique/Off Center Letterform Kallistettu ja epäkesko Oblique/Square Letterform Kallistettu ja kulmikas Letterform Muoto Standard/Trimmed Midline Normaali ja typistetty Standard/Pointed Midline Normaali ja terävä Standard/Serifed Midline Normaali ja päätteellinen High/Trimmed Midline Korkea ja typistetty High/Pointed Midline Korkea ja terävä High/Serifed Midline Korkea ja päätteellinen Constant/Trimmed Midline Vakio ja typistetty Constant/Pointed Midline Vakio ja terävä Constant/Serifed Midline Vakio ja päätteellinen Low/Trimmed Midline Matala ja typistetty Low/Pointed Midline Matala ja terävä Low/Serifed Midline Matala ja päätteellinen Midline Keskilinja Constant/Small X-Height Normaali ja pieni Constant/Standard X-Height Normaali ja keskikokoinen Constant/Large X-Height Normaali ja suuri Ducking/Small X-Height Supistettu ja pieni Ducking/Standard X-Height Supistettu ja keskikokoinen Ducking/Large X-Height Supistettu ja suuri X-Height X-korkeus This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Tämä arvo on poistettu käytöstä eikä sitä koskaan käytetty eikä FreeType koskaan huomauttanut siitä. Älä käytä tai testaa sitä. Character to glyph mapping Merkki-merkin esitys -yhteys Font header Horizontal header Horizontal metrics Maximum profile Naming table Nimitaulu OS/2 and Windows specific metrics OS/2- ja Windows -mitat PostScript information Postscript-tiedot Control Value Table Font program Fonttiohjelma Glyph data Merkin esityksen tiedot Index to location Osoitin sijaintiin CVT Program PostScript font program Postscript-fonttiohjelma Vertical Origin Embedded bitmap data Upotettu bittikarttadata Embedded bitmap location data Embedded bitmap scaling data Baseline data Peruslinjan tiedot Glyph definition data Merkin ulkoasun määritykset Glyph positioning data Merkin ulkoasun sijoittelu Glyph substitution data Merkin korvaus Justification data Tasaus Digital signature Sähköinen allekirjoitus Grid-fitting/Scan-conversion Horizontal device metrics Kerning Merkkiparien välistys Linear threshold data PCL 5 data Vertical device metrics Vertical Metrics header Vertical Metrics Help Fontmatrix Help Fontmatrixin ohje Close Sulje ImportTagsDialog Add Lisää Ok Ok Fontmatrix - Tags Fontmatrix - Luokat ImportedFonts Dialog Valintaikkuna Imported Fonts Tuodut fontit Ok Ok <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> <qt>Tämän ikkunan sijaan tuotujen fonttien lukumäärä näytetään tilarivillä. Jos poistat tämän ikkunan käytöstä, voit palauttaa sen asetuksista.</qt> Do not show this dialog again Älä näytä tätä ikkunaa uudestaan ImportedFontsDialog (not loaded) (ei ladattu) Number of Imported Fonts Tuotujen fonttien lukumäärä LayoutOptionWidget Form Lomake Weights Vahvuudet score pisteet before ennen exact tarkka after jälkeen end loppu penalty rangaistus H-penalty h-rangaistus space tila max compression maksimipakkaus ListDock Form Lomake Filter view by chosing tag Suodata valitulla luokalla Names Nimet Show complete collection of available fonts Näytä täydellinen fonttikokoelma TextLabel Tekstimerkintä Previews Esikatselut Folders Hakemistot F S Switch to panose filtering Vaihda Panose-suodatukseen Panose Panose reset tyhjennä <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want to negate the filter,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prefix the word with "!" such as in:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">"!pattern"</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want to enqueue the filter,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prefix it with "+".</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally, you can mix negate and queue in:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">"+!pattern"</span> or "!+pattern"</p></body></html> ListDockWidget All activated Kaikki käytössä olevat Unicode character Unicode-merkki MainView main view widget pääikkuna OpenType Features OpenType-ominaisuudet Friendly Name Nimi Glyphs Merkit Clicking on a glyph will show details about it Näet merkin lisätietojen kanssa napsauttamalla sitä Font Information Fontin tiedot Sample Text Esimerkkiteksti Use shaper Käytä muotoilijaa Coverage of Unicode Interval : Unicode-alueen peitto: Font Size Fonttikoko pt pt Playground Leikkikenttä push lisää Settings Asetukset OpenType Opentype Save as default Tallenna oletukseksi Reset Default Palauta oletus SampleText Esimerkkiteksti FreeType Freetype Native Qt objects Natiivit Qt-kohteet World is wide Maailma on suuri Shaper type Muotoilijan tyyppi Script Komentosarja Set Mode "Copy Character to Clipboard" Aseta tilaksi "Kopioi merkki leikepöydälle" Display Settings Näytön asetukset edit muokkaa No hinting Ei vihjeistystä Light Hinting Kevyt vihjeistys Normal Hinting Normaali vihjeistys Copy Kopioi MainViewWidget 000Basic Latin 000Latinalainen perusosa 001Latin-1 Supplement 001Latinalaisen merkistön täydennys Latin-1:ksi 002Latin Extended-A 002Latinalaisen merkistön laajennusosa A 003Latin Extended-B 003Latinalaisen merkistön laajennusosa B 004IPA Extensions 004IPA-täydennyksiä 005Spacing Modifier Letters 005Tarkkeenomaisia erillisiä merkkejä 006Combining Diacritical Marks 006Tarkkeita 007Greek and Coptic 007Kreikkalaiset ja koptilaiset 008Cyrillic 008Kyrilliset 009Cyrillic Supplement 009Kyrillisten täydennys 010Armenian 010Armenialaiset 011Hebrew 011Heprealaiset 012Arabic 012Arabialaiset 013Syriac 013Syyrialaiset 014Arabic Supplement 014Arabialaisten täydennys 015Thaana 015Thaana 016N'Ko 016N'Ko 017Devanagari 017Devanagari 018Bengali 018Bengali 019Gurmukhi 019Gurmukhi 020Gujarati 020Gujarati 021Oriya 021Oriya 022Tamil 022Tamil 023Telugu 023Telugu 024Kannada 024Kannada 025Malayalam 025Malayalam 026Sinhala 026Sinhala 027Thai 027Thai 028Lao 028Lao 029Tibetan 029Tiibettiläiset 030Burmese 030Burma 031Georgian 031Kartvelilaiset 032Hangul Jamo 032Hangulin jamo-merkkejä 033Ethiopic 033Etiopialaiset 034Ethiopic Supplement 034Etiopialaisten tarkennus 035Cherokee 035Cherokee 036Unified Canadian Aboriginal Syllabics 036Kanadalaisia tavumerkkejä 037Ogham 037Ogham 038Runic 038Riimukirjaimia 039Tagalog 039Tagalog 040Hanunóo 040Hanunóo 041Buhid 041Buhid 042Tagbanwa 042Tagbanwa 043Khmer 043Khmer 044Mongolian 044Mongolialaiset 045Limbu 045Limbu 046Tai Le 046Tai Le 047New Tai Lue 047Uusi Tai Lue 048Khmer Symbols 048Khmer-symbolit 049Buginese 049Buginese 050Balinese 050Balinese 051Lepcha 051Lepcha 052Phonetic Extensions 052Äännelaajennus 053Phonetic Extensions Supplement 053Äännelaajennuksen tarkennus 054Combining Diacritical Marks Supplement 054Tarkkeiden täydennys 055Latin Extended Additional 055Latinalaisen merkistön lisälaajennuksia 056Greek Extended 056Kreikkalaisen merkistön laajennusosa 057General Punctuation 057Yleisiä välimerkkejä 058Superscripts and Subscripts 058Ylä- ja alaindeksejä 059Currency Symbols 059Valuuttamerkkejä 060Combining Diacritical Marks for Symbols 060Symbolien tarkkeita 061Letterlike Symbols 061Kirjainsymboleita 062Number Forms 062Lukuilmaisuja 063Arrows 063Nuolia 064Mathematical Operators 064Matemaattisia operaattoreita 065Miscellaneous Technical 065Sekalaisia teknisiä merkkejä 066Control Pictures 066Ohjausmerkkien symboleita 067Optical Character Recognition 067OCR-merkkejä 068Enclosed Alphanumerics 068Ympäröityjä alfanumeerisia merkkejä 069Box Drawing 069Viivapiirrosmerkkejä 070Block Elements 070Lohko-osia 071Geometric Shapes 071Geometrisia muotoja 072Miscellaneous Symbols 072Sekalaisia symboleita 073Dingbats 073Dingbats 074Miscellaneous Mathematical Symbols-A 074Sekalaisia matemaattisia symboleita A 075Supplemental Arrows-A 075Nuolten tarkkenus A 076Braille Patterns 076Braille-merkkejä 077Supplemental Arrows-B 077Nuolten tarkennus B 078Miscellaneous Mathematical Symbols-B 078Sekalaisia matemaattisia symboleita B 079Supplemental Mathematical Operators 079Matemaattisten operaattoreitten tarkennus 080Miscellaneous Symbols and Arrows 080Sekalaisia symoleita ja nuolia 081Glagolitic 081Glagolitic 082Latin Extended-C 082Latinalaisen merkistön laajennusosa C 083Coptic 083Koptilaiset 084Georgian Supplement 084Kartvelilaisten tarkennus 085Tifinagh 085Tifinagh 086Ethiopic Extended 086Etiopialaisten merkkien laajennus 087Supplemental Punctuation 087Välimerkkien lisäosa 088CJK Radicals Supplement 088Lisää CJK-radikaaleja 089Kangxi Radicals 089Kangxi-radikaaleja 090Ideographic Description Characters 090Sanamerkkien kuvailumerkkejä 091CJK Symbols and Punctuation 091CJK-symboleita ja -välimerkkejä 092Hiragana 092Hiragana 093Katakana 093Katakana 094Bopomofo 094Bopomofo 095Hangul Compatibility Jamo 095Hangulin jamo-erillismerkkejä 096Kanbun 096Kanbun 097Bopomofo Extended 097Bopomofo-lisämerkkejä 098CJK Strokes 098CJK-viivoja 099Katakana Phonetic Extensions 099Katakana-äännelaajennos 100Enclosed CJK Letters and Months 100Ympäröityjä CJK-kirjaimia ja -kuukausimerkkejä 101CJK Compatibility 101CJK-yhteensopivia merkkejä 102CJK Unified Ideographs Extension A 102CJK-sanamerkkien laajennus A 103Yijing Hexagram Symbols 103Yijing-heksagrammisymboleja 104CJK Unified Ideographs 104CJK-sanamerkkejä 105Yi Syllables 105Yi-tavumerkkejä 106Yi Radicals 106Yi-juurimerkkejä 107Modifier Tone Letters 107Tarkkeenomaisia toonimerkkejä 108Latin Extended-D 108Latinalaisen merkistön laajennusosa D 109Syloti Nagri 109Syloti Nagri 110Phags-pa 110Phags-pa 111Hangul Syllables 111Hangul-tavumerkkejä 112High Surrogates 112Laajennuskoodien ykkösosia 113High Private Use Surrogates 113Laajennuskoodien ykkösosat erilliskäyttöön 114Low Surrogates 114Laajennuskoodien kakkososia 115Private Use Area 115Erilliskäytön lohko 116CJK Compatibility Ideographs 116CJK-yhteensopivuusmerkkejä 117Alphabetic Presentation Forms 117Kirjainten tulostusmuotoja 118Arabic Presentation Forms-A 118Arabialaisten merkkien esitysmuotoja A 119Variation Selectors 119Vaihtelun valitsimia 120Vertical Forms 120Pystysuoria muotoja 121Combining Half Marks 121Tarkkeiden puolikkaita 122CJK Compatibility Forms 122CJK-yhteensopivia merkkien muotoja 123Small Form Variants 123Pienikokoisia muunnelmia 124Arabic Presentation Forms-B 124Arabialaisten merkkien esitysmuotoja B 125Halfwidth and Fullwidth Forms 125Puoli- ja täyslevyisiä esitysmuotoja 126Specials 126Erikoismerkkejä 127Supplementary Multilingual Plane (SMP) 127 Monikielitason tarkennus (SMP) 128Supplementary Ideographic Plane (SIP) 128Käsitemerkkitason tarkennus 129unassigned 129nimeämättömät 130Supplementary Special-purpose Plane (SSP) 130Monikäyttötason tarkennus (SSP) 131Private Use Area 1 (PUA) 131Erilliskäytön lohko 1 (PUA) 132Private Use Area 2 (PUA) 132Erilliskäytön lohko 2 (PUA) 133Un-Mapped Glyphs 133Sijoittamattomat merkit Activation event Käyttöönottotapahtuma Cancel Peruuta Activation of : Käyttöönotto: Deactivation of : Käytöstäpoisto: 134View all mapped glyphs 134Näytä kaikki sijoitetut merkit Names Nimet Fontmatrix takes care of you Fontmatrix huolehtii sinusta is activated. If you want to remove it from Fontmatrix database, please deactivate it first. on aktivoitu. Jos haluat poistaa sen, poista ensin aktivointi. Fontmatrix safe Fontmatrix säiliö You are about to remove a font from Fontmatrix database Olet poistamassa fonttia Fonmatrixin tietokannasta Do you want to continue? Haluatko jatkaa? Welcome to Fontmatrix Tervetuloa Fontmatrixiin Load Lataa PrefsPanel Preferences Panel Ominaisuuspaletti General Yleiset Ask confirmation when activating or deactivating all fonts Kysy vahvistus, kun kaikki fontit otetaan käyttöön tai poistetaan käytöstä Add Lisää pt pt Ask confirmation when activating or deactivating fonts by tags Kysy vahvistus, kun fontit otetaan käyttöön tai poistetaan käytöstä luokan perusteella Show Fontmatrix in System Tray Näytä Fontmatrix ilmoitusalueella Preview Word Esikatselusana Font Editor Fonttimuokkain /usr/bin/fontforge /usr/bin/fontforge Browse... Selaa... Ask for tag names when importing fonts Kysy luokkaa, kun fontteja tuodaan Font Size: Fonttikoko Templates Folder Mallihakemisto Remote directories Etähakemistot Remove Poista Show "All" actions Näytä toiminnot kaikille is RTL on tyyppiä oikealta vasemmalle size koko Initial Layout Alkuasettelu http:// http:// Local storage Paikallinen säilö Close Sulje Add the full path to your preferred font editor Lisää täydellinen polku haluamaasi fonttimuokkaimeen. Show names of imported fonts after import process Näytä tuotujen fonttien nimet tuonnin jälkeen Show splash at startup Näytä latausikkuna käynnistettäessä Hyphenation Tavutus Left: Vasen Right: Oikea Dictionary: Sanakirja Browse Selaa ... ... Change Muuta TextLabel Tekstikenttä Sample text Esimerkkiteksti Files & Folders Tiedostot ja hakemistot Shotcuts Oikopolut Close to system tray Sulje ilmoitusalueelle Start minimized to system tray Käynnistä pienennettynä ilmoitusalueelle Chart Subtitle Font linespacing: riviväli: Select an hyphenation dict file as it comes with OpenOffice or Scribus Valitse sanakirja tavutusta varten. Sanakirjan tyyppi on sama kuin OpenOfficessa tai Scribuksessa. subtitled Don’t use preferred name scheme (will affect only newly imported fonts) Sample Texts Esimerkkitekstit + + PrefsPanelDialog Looks like your setup does not have a system tray available. Järjestelmästäsi ei löydy ilmoitusaluetta. Select font editor Valitse fonttimuokkain Select Templates Folder Valitse mallihakemisto Select Where remote font files will be stored Valitse etäfonttien säilöntäpaikka Please select an item in the list or create a new one. Valitse kohde luettelosta tai luo uusi Alt Alt Ctrl Ctrl Shift Vaihto Meta Meta Meta+ Meta+ Shift+ Vaihto+ Alt+ Alt+ Ctrl+ Ctrl+ Replace Korvaa Shortcut is already in use for action name will be appended to this Oikopolku on jo käytössä: Do you still want to assign it? Haluatko ottaa sen käyttöön siitä huolimatta? Action Toiminto Shortcut Oikopolku Tip Vihje Select hyphenation dictionary Valitse tavutussanasto Sample Text A default sample text inserted when creating a new sample Esimerkkiteksti Do you confirm that you want to remove: the name of a sample text will be append to the string Vahvista poista: QObject codepoint is U+ merkkikoodi on U+ Creating font book... Luodaan fonttikirjaa... cancel peruuta Copying files Kopioidaan tiedostoja Unable to copy Ei voi kopioida ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. ABCDEFGHI JKLMNOPQR STUVXYZÅÄÖ abcdefghi jklmnopqr stuvxyzåäö 0123456789 ,;:!?. hamburgefonstiv törkylempijä Access All Alternates Salli kaikki vaihtoehdot Above-Base Forms Yläosan muodot Above-Base Mark Positioning Yläosan merkkien sijoittelu Above-Base Substitutions Yläosan korvaukset Alternative Fractions Murtolukuvaihtoehdot Akhands Akahand-ligatuurit Below-Base Forms Alaosan muodot Below-Base Mark Positioning Alaosan merkkien sijoittelu Below-Base Substitutions Alaosan korvaukset Petite Capitals From Capitals Pienet kapiteelit kapiteeleista Small Capitals From Capitals Kapiteelit versaalikirjaimista Contextual Alternates Kontekstiriippuvaiset vaihtoehdot Case-Sensitive Forms Aakkoslajiriippuvaiset muodot Glyph Composition/Decomposition Merkkiyhdiste tai -hajote Contextual Ligatures Kontekstiriippuvaiset ligatuurit Capital Spacing Versaalivälistys Contextual Swash Kontekstiriippuvainen erikoismerkki Distances Etäisyydet Discretionary Ligatures Harkinnanvaraiset ligatuurit Denominators Nimittäjät Expert Forms Ammattilaismuodot Final glyph Alternates Päättävän merkin vaihtoehdot Fractions Murtoluvut Full Width Täysi leveys Alternate Half Width Vaihtoehtoiset puolikkaat Historical Forms Historialliset muodot Historical Ligatures Historialliset ligatuurit Half Width Puolikas Justification Alternatives Tasausvaihtoehdot Kerning Merkkiparien välistys Standard Ligatures Perusligatuurit Numerators Osoittajat Old Style Figures Lukujen vanha tyyli Optical Bounds Havainnollinen tasaus Ordinals Järjestysluvut Ornaments Ornamentit Proportional Alternate Width Vaihtoehtoinen suhteellinen leveys Petite Capitals Pienet kapiteelit Proportional Widths Suhteelliset leveydet Quarter Widths Neljäsosat Randomize Satunnainen Stylistic Alternates Tyylivaihtoehdot Optical Size Havainnollinen koko Small Capitals Kapiteelit Subscript Alaindeksi Superscript Yläindeksi Swash Erikoismerkki Titling Otsikointi Traditional Forms Perinteiset kuviot Third Widths Kolmasosat Vattu Variants Vattu-muunnelmat Vertical Writing Pystysuora kirjoitus Vertical Kerning Merkkiparien pystysuuntainen välistys Slashed Zero Lävistetty nolla Mark, NonSpacing Merkki, ei väli Mark, SpacingCombining Merkki, yhdistävä väli Mark, Enclosing Merkki, ympäröivä Number, DecimalDigit Numero, desimaalinumero Number, Letter Numero, kirjain Number, Other Numero, muut Separator, Space Erotin, väli Separator, Line Erotin, rivi Separator, Paragraph Erotin, kappale Other, Control Muu, hallinta Other, Format Muu, muoto Other, Surrogate Muu, korvaava Other, PrivateUse Muu, erilliskäyttö Other, NotAssigned Muu, sijoittamaton Letter, Uppercase Kirjain, versaali Letter, Lowercase Kirjain, gemena Letter, Titlecase Kirjain, otsikkokoko Letter, Modifier Kirjain, määrite Letter, Other Kirjain, muu Punctuation, Connector Välimerkki, yhdistin Punctuation, Dash Välimerkki, viiva Punctuation, Open Välimerkki, aloitus Punctuation, Close Välimerkki, lopetus Punctuation, InitialQuote Välimerkki, aloittava lainausmerkki Punctuation, FinalQuote Välimerkki, lopettava lainausmerkki Punctuation, Other Välimerkki, muu Symbol, Math Symboli, matematiikka Symbol, Currency Symboli, valuutta Symbol, Modifier Symboli, määrite Symbol, Other Symboli, muu Stylistic Set 1 Tyylijoukko 1 Stylistic Set 2 Tyylijoukko 2 Stylistic Set 3 Tyylijoukko 3 Stylistic Set 4 Tyylijoukko 4 Stylistic Set 5 Tyylijoukko 5 Stylistic Set 6 Tyylijoukko 6 Stylistic Set 7 Tyylijoukko 7 Stylistic Set 8 Tyylijoukko 8 Stylistic Set 9 Tyylijoukko 9 Stylistic Set 10 Tyylijoukko 10 Stylistic Set 11 Tyylijoukko 11 Stylistic Set 12 Tyylijoukko 12 Stylistic Set 13 Tyylijoukko 13 Stylistic Set 14 Tyylijoukko 14 Stylistic Set 15 Tyylijoukko 15 Stylistic Set 16 Tyylijoukko 16 Stylistic Set 17 Tyylijoukko 17 Stylistic Set 18 Tyylijoukko 18 Stylistic Set 19 Tyylijoukko 19 Stylistic Set 20 Tyylijoukko 20 Conjunct Forms Cursive Positioning Kursiivisijoittelu Default Processing Oletuskäsittely Terminal Forms #2 Terminaalimuodot #2 Terminal Forms #3 Terminaalimuodot #3 Terminal Forms Terminaalimuodot Half Forms Halant Forms Horizontal Kana Alternates Vaakasuorat Kana-vaihtoehdot Hangul Hojo Kanji Forms (JIS x 212-1990 Kanji Forms) Initial Forms Isolated Forms Italics Kursiivit JIS78 Forms JIS2004-muodot {78 ?} JIS83 Forms JIS83-muodot JIS90 Forms JIS90-muodot JIS2004 Forms JIS2004-muodot Left Bounds Leading Jamo Forms Lining Figures Localized Forms Mark Positioning Medial Forms #2 Medial Forms Mathematical Greek Mark to Mark Positioning Mark Positioning via Substitution Alternate Annotation Forms NLC Kanji Forms Nukta Forms Proportional Figures Pre-base Forms Pre-base Substitutions Post-base Forms Post-base Substitutions Rakar Forms Required Ligatures Vaaditut ligatuurit Reph Form Right Bounds Right-To-Left Alternates Ruby Notation Forms Scientific Inferiors Simplified Forms Yksinkertaistetut muodot Trailing Jamo Forms Traditional Name Forms Tabular Figures Unicase Alternate Vertical Metrics Alternate Vertical Half Metrics Vowel Jamo Forms Vertical Kana Alternates Proportional Alternate Vertical Metrics Vertical Rotation Fonts with this setting indicate that they may be embedded and permanently installed on the remote system by an application. The user of the remote system acquires the identical rights, obligations and licenses for that font as the original purchaser of the font, and is subject to the same end-user license agreement, copyright, design patent, and/or trademark as was the original purchaser. Fonts that have only this bit set must not be modified, embedded or exchanged in any manner without first obtaining permission of the legal owner. When this bit is set, the font may be embedded, and temporarily loaded on the remote system. Documents containing Preview & Print fonts must be opened "read-only;" no edits can be applied to the document. When this bit is set, the font may be embedded but must only be installed temporarily on other systems. In contrast to Preview & Print fonts, documents containing Editable fonts may be opened for reading, editing is permitted, and changes may be saved. When this bit is set, the font may not be subsetted prior to embedding. Other embedding restrictions specified in bits 0-3 and 9 also apply. When this bit is set, only bitmaps contained in the font may be embedded. No outline data may be embedded. If there are no bitmaps available in the font, then the font is considered unembeddable and the embedding services will fail. Other embedding restrictions specified in bits 0-3 and 8 also apply. RemoteDir Downloading Ladataan Systray &Activate all Ot&a kaikki käyttöön &Deactivate all Poista &kaikki käytöstä Mi&nimize Pie&nennä &Restore P&alauta &Tags Luoka&t E&xit &Poistu TTTableWidget Form Lomake TrueType Tables Truetype-taulukot Tag Luokka Description Kuvaus Size Koko TagSetDialog TagSet editor Muokkaa kokoelmia Collections of Tags Luokkakokoelmat Add selected tag to current set. Lisää valittu luokka kokoelmaan Collections Kokoelmat New Uusi delete poista Close Sulje Available Tags Käytettävissä olevat luokat Add Lisää Remove Poista TagsWidget Add new tag Lisää uusi luokka TextProgressionWidget Form Lomake Inline progression Rivin kulku e.g. Latin text esim. latinalainen teksti Left to right Vasemmalta oikealle e.g. Arabic text esim. arabialainen teksti Right to left Oikealta vasemmalle e.g. Traditional Chinese & Japanese text esim. perinteinen kiina ja japanilainen teksti Top to bottom Ylhäältä alas e.g. Runic text esim. riimukirjoitus Bottom to top Alhaalta ylös Block progression Lohkon kulku e.g. Traditional Mongolian text esim. perinteinen mongolialainen teksti e.g. Tarditionnal Chinese & Japanes text esim. perinteinen kiina ja japanilainen teksti multiPrintDialog Dialog Valintaikkuna Views Näkymät Informations Tiedot Preview Esikatselu Glyphs chart Merkkikartta Playground Leikkikenttä repairDialog Dialog Valintaikkuna Dead links Toimimattomat linkit Select all Valitse kaikki Remove Poista Activated Not Linked Käytössä, ei linkitetty Re-link Linkitä uudestaan Deactivate Poista käytöstä Deactivated Linked Käytöstä poistettu, linkitetty De-link Poista linkitys Activate Ota käyttöön Close Sulje tagsWidget Form Lomake Right mouse click on a tag to add it or remove it from TagSet Poista tai lisää luokka oikealla hiiren painikkeella Nothing selected Ei valintaa Add a tag Lisää luokka Add Lisää typotek Fontmatrix Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Ohjelmaa ei suljeta vaan se pienennetään ilmoitusalueelle. Voit sulkea ohjelman ilmoitusalueella olevan kuvakkeen valikon kohdasta <b>Poistu</b>. Add Directory Lisää hakemisto &Import... T&uo... Ctrl+O Ctrl+O Import a directory Tuo hakemisto Ctrl+S Ctrl+S Export font book... Tallenna fonttikirja... Export a pdf that show selected fonts Tallenna esimerkkitekstit valituista fonteista pdf-tiedostoon E&xit &Poistu Ctrl+Q Ctrl+Q Exit the application Poistu ohjelmasta &About &Tietoja Show the Typotek's About box Näytä Fontmatrixin tietoja-ikkuna Help Ohje Edit current font Muokkaa valittua fonttia Preferences Asetukset &File &Tiedosto &Help &Ohje Ready Valmis There is no font selected Fontteja ei ole valittuna Support of DragNDrop over http is sheduled but not yet effective Raahaa ja pudota -tuki http:lle on kehitteillä, muttei vielä toiminnassa You bring something over me I can’t handle Pudotit jotain, jota en osaa käsitellä You provided an empty string, it’s not fair Merkkijono on tyhjä. Activate all current Ota kaikki nykyiset käyttöön Deactivate all current Poista kaikki nykyiset käytöstä Try to run font editor with the selected font as argument Yritä ajaa fonttimuokkain valitulla fontilla You don't seem to have font editor installed. Path to font editor can be set in preferences. Fonttimuokkainta ei ole asennettu. Voit asettaa polun muokkaimeen asetuksissa. Nothing Selected Ei valintaa Importing font files... Tuodaan fonttitiedostoja... cancel peruuta Import Tuo Fontmatrix care You are about to activate a bunch of fonts, it is time to cancel if it was not your intent Olet aikeissa ottaa käyttöön runsaasti fontteja. Jos se ei ollut tarkoituksesi, voit vielä perua aikeesi. You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent Olet aikeissa poistaa käytöstä runsaasti fontteja. Jos se ei ollut tarkoituksesi, voit vielä perua aikeesi. Can’t import this font because it’s broken : Tätä fonttia ei voida tuoda, koska se on viallinen: Choose the tag for filter exported fonts Valitse tallennettavien fonttien luokka Choose Directory Valitse hakemisto Export &Fonts Kerää &fontteja Export a fontset Tallenna fonttikokoelma Check Database Tarkista tietokanta Tag All... Lisää kaikki luokkaan... Load settings Lataa asetukset Check for Fontmatrix own dir Tarkista Fontmatrixin oma hakemisto Catching font descriptions from network fonttien kuvaukset verkon kautta Collected System Font Löydetyt järjestelmäfontit Adding Lisätään fonts from system directories fontit järjestelmähakemistoista fonts available from system fontit järjestelmässä font descriptions imported from network verkosta haetut fonttien kuvaukset Browse Fonts Selaa fontteja default oletus "default" is a reserved "oletus" on varattu Print Info... Tiedot... Print informations about the current font Tulosta tietoja valitusta fontista Print Sample... Näyte... Print the sample as a specimen Tulosta näyte Print Chart... Taulukko... Print a chart of the current font Tulosta valittu fontti taulukkona Print Playground... Leikkikenttä Print the playground Tulosta leikkikentän sisältö Print Family... Perhe... Print a specimen of the whole family the current face belongs to Tulosta näyte koko fonttiperheestä, johon valittu fontti kuuluu About &Qt Tietoja Qt:stä Print Tulosta &Edit &Muokkaa Welcome maessage Tervetuloviesti Print Infos Tulosta tiedot Print Chart Tulosta taulukko Print Playground Tulosta leikkikenttä Print Family Tulosta perhe Fonts imported: %1 Tuotuja fontteja: %1 Next Family Seuraava perhe Next Face Seuraava fontti Previous Family Edellinen perhe Previous Face Edellinen fontti Layout Options Sijoitteluasetukset &Browse &Selaa &Sync &Synkronoi Sync with the DB file Synkronoi tietokannan kanssa Print Sample Tulosta näyte Not enough text to make a sample Ei tarpeeksi tekstiä näytettä varten Tags Luokat Show TrueType tables Näytä Truetype-taulukot Close Sulje fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-hi.ts0000644000175000017500000035020211023736606022075 0ustar malexmalex About About Fontmatrix TextLabel Splash The Project The People Close AboutWidget version fonts loaded BookExportDialog Export Font Book Output Browse... FMLayout Text engine options FolderViewMenu Reload Tree Import Directory Import recursively Import File FontBookDialog Save fontBook FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Copyright Font Family Font Subfamily Unique font identifier Full font name Version string Postscript name Trademark Manufacturer Designer Description URL Vendor URL Designer License Description License Info URL Reserved Preferred Family Preferred Subfamily Compatible Full (Macintosh only) Sample text PostScript CID findfont name Fontmatrix - Download Downloading %1. Any No Fit Text and Display Script Decorative Pictorial Family Type Cove Obtuse Cove Square Cove Obtuse Square Cove Square Thin Bone Exaggerated Triangle Normal Sans Obtuse Sans Perp Sans Flared Rounded Serif style Very Light Light Book Medium Demi Bold Heavy Black Nord Weight Old Style Modern Even Width Expanded Condensed Very Expanded Very Condensed Monospaced Proportion None Very Low Low Medium Low Medium High High Very High Contrast Gradual/Diagonal Gradual/Transitional Gradual/Vertical Gradual/Horizontal Rapid/Vertical Rapid/Horizontal Instant/Vertical Stroke Variation Straight Arms/Horizontal Straight Arms/Wedge Straight Arms/Vertical Straight Arms/Single Serif Straight Arms/Double Serif Non-Straight Arms/Horizontal Non-Straight Arms/Wedge Non-Straight Arms/Vertical Non-Straight Arms/Single Serif Non-Straight Arms/Double Serif Arm Style Normal/Contact Normal/Weighted Normal/Boxed Normal/Flattened Normal/Rounded Normal/Off Center Normal/Square Oblique/Contact Oblique/Weighted Oblique/Boxed Oblique/Flattened Oblique/Rounded Oblique/Off Center Oblique/Square Letterform Standard/Trimmed Standard/Pointed Standard/Serifed High/Trimmed High/Pointed High/Serifed Constant/Trimmed Constant/Pointed Constant/Serifed Low/Trimmed Low/Pointed Low/Serifed Midline Constant/Small Constant/Standard Constant/Large Ducking/Small Ducking/Standard Ducking/Large X-Height Category Help Fontmatrix Help ImportTagsDialog Fontmatrix - Tags Add Ok ImportedFonts Dialog Imported Fonts Ok <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> Do not show this dialog again ImportedFontsDialog (not loaded) Number of Imported Fonts LayoutOptionWidget Form Weights score before exact after end penalty H-penalty ListDock Form Tag: Filter view by chosing tag Switch to panose filtering P Filter: Field selection F TextLabel Show complete collection of available fonts Names Files Previews Folders ListDockWidget All fields Unicode All activated MainView part I part II main view widget Nothing selected Right mouse click on a tag to add it or remove it from TagSet Add a tag Font Information Settings S OpenType O OpenType Features Friendly Name Save as default Reset Default SampleText ... Layout Font Size pt Rendering FreeType Native Qt objects World is wide Shaper type Script Use shaper Text Progression Sample Text Coverage of Unicode Interval : Clicking on a glyph will show details about it Glyphs push Playground Set Mode "Copy Character to Clipboard" C MainViewWidget Activation event Cancel Activation of : Deactivation of : 000Basic Latin 001Latin-1 Supplement 002Latin Extended-A 003Latin Extended-B 004IPA Extensions 005Spacing Modifier Letters 006Combining Diacritical Marks 007Greek and Coptic 008Cyrillic 009Cyrillic Supplement 010Armenian 011Hebrew 012Arabic 013Syriac 014Arabic Supplement 015Thaana 016N'Ko 017Devanagari 018Bengali 019Gurmukhi 020Gujarati 021Oriya 022Tamil 023Telugu 024Kannada 025Malayalam 026Sinhala 027Thai 028Lao 029Tibetan 030Burmese 031Georgian 032Hangul Jamo 033Ethiopic 034Ethiopic Supplement 035Cherokee 036Unified Canadian Aboriginal Syllabics 037Ogham 038Runic 039Tagalog 040Hanunóo 041Buhid 042Tagbanwa 043Khmer 044Mongolian 045Limbu 046Tai Le 047New Tai Lue 048Khmer Symbols 049Buginese 050Balinese 051Lepcha 052Phonetic Extensions 053Phonetic Extensions Supplement 054Combining Diacritical Marks Supplement 055Latin Extended Additional 056Greek Extended 057General Punctuation 058Superscripts and Subscripts 059Currency Symbols 060Combining Diacritical Marks for Symbols 061Letterlike Symbols 062Number Forms 063Arrows 064Mathematical Operators 065Miscellaneous Technical 066Control Pictures 067Optical Character Recognition 068Enclosed Alphanumerics 069Box Drawing 070Block Elements 071Geometric Shapes 072Miscellaneous Symbols 073Dingbats 074Miscellaneous Mathematical Symbols-A 075Supplemental Arrows-A 076Braille Patterns 077Supplemental Arrows-B 078Miscellaneous Mathematical Symbols-B 079Supplemental Mathematical Operators 080Miscellaneous Symbols and Arrows 081Glagolitic 082Latin Extended-C 083Coptic 084Georgian Supplement 085Tifinagh 086Ethiopic Extended 087Supplemental Punctuation 088CJK Radicals Supplement 089Kangxi Radicals 090Ideographic Description Characters 091CJK Symbols and Punctuation 092Hiragana 093Katakana 094Bopomofo 095Hangul Compatibility Jamo 096Kanbun 097Bopomofo Extended 098CJK Strokes 099Katakana Phonetic Extensions 100Enclosed CJK Letters and Months 101CJK Compatibility 102CJK Unified Ideographs Extension A 103Yijing Hexagram Symbols 104CJK Unified Ideographs 105Yi Syllables 106Yi Radicals 107Modifier Tone Letters 108Latin Extended-D 109Syloti Nagri 110Phags-pa 111Hangul Syllables 112High Surrogates 113High Private Use Surrogates 114Low Surrogates 115Private Use Area 116CJK Compatibility Ideographs 117Alphabetic Presentation Forms 118Arabic Presentation Forms-A 119Variation Selectors 120Vertical Forms 121Combining Half Marks 122CJK Compatibility Forms 123Small Form Variants 124Arabic Presentation Forms-B 125Halfwidth and Fullwidth Forms 126Specials 127Supplementary Multilingual Plane (SMP) 128Supplementary Ideographic Plane (SIP) 129unassigned 130Supplementary Special-purpose Plane (SSP) 131Private Use Area 1 (PUA) 132Private Use Area 2 (PUA) 133Un-Mapped Glyphs 134View all mapped glyphs Names Fontmatrix takes care of you is activated. If you want to remove it from Fontmatrix database, please deactivate it first. Fontmatrix safe You are about to remove a font from Fontmatrix database Do you want to continue? Welcome to Fontmatrix PrefsPanel Preferences Panel Preferences Show Fontmatrix in System Tray Close to System Tray Show "All" actions Ask confirmation when activating or deactivating all fonts Ask confirmation when activating or deactivating fonts by tags Preview Word is RTL size pt Font Editor Add the full path to your preferred font editor /usr/bin/fontforge Browse... Ask for tag names when importing fonts Show names of imported fonts after import process Show splash at startup Don’t use preferred name scheme (will affect only newly imported fonts) General Named Sample Texts Add Initial Layout Font Size: Interline: Hyphenation Left: Right: Dictionary: Browse ... Apply Sample Text Templates Folder Remote directories http:// Remove Local storage Files and Folders Change TextLabel Shortcuts Close PrefsPanelDialog Looks like your setup does not have a system tray available. A text Select font editor Select Templates Folder Select Where remote font files will be stored Please select an item in the list or create a new one. Alt Ctrl Shift Meta Meta+ Shift+ Alt+ Ctrl+ Replace Shortcut is already in use for action name will be appended to this Do you still want to assign it? Action Shortcut Tip Select hyphenation dictionary QObject Creating font book... cancel codepoint is U+ Copying files Unable to copy ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv Mark, NonSpacing Mark, SpacingCombining Mark, Enclosing Number, DecimalDigit Number, Letter Number, Other Separator, Space Separator, Line Separator, Paragraph Other, Control Other, Format Other, Surrogate Other, PrivateUse Other, NotAssigned Letter, Uppercase Letter, Lowercase Letter, Titlecase Letter, Modifier Letter, Other Punctuation, Connector Punctuation, Dash Punctuation, Open Punctuation, Close Punctuation, InitialQuote Punctuation, FinalQuote Punctuation, Other Symbol, Math Symbol, Currency Symbol, Modifier Symbol, Other RemoteDir Downloading Systray &Activate all &Deactivate all Mi&nimize &Restore E&xit &Tags TagSetDialog TagSet editor Collections of Tags Available Tags Add selected tag to current set. Add Collections New delete Remove Close TextProgressionWidget Form Inline progression e.g. Latin text Left to right e.g. Arabic text Right to left e.g. Traditional Chinese & Japanese text Top to bottom e.g. Runic text Bottom to top Block progression e.g. Tarditionnal Chinese & Japanes text e.g. Traditional Mongolian text repairDialog Dialog Select all Remove Dead links Re-link Deactivate Activated Not Linked De-link Activate Deactivated Linked Close typotek Nothing Selected Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Add Directory Importing font files... cancel Import &Import... Ctrl+O Import a directory &Save Ctrl+S Save the document to disk Export font book... Export a pdf that show selected fonts E&xit Ctrl+Q Exit the application &About Show the Typotek's About box Help &Tag Sets Activate all current Deactivate all current Edit current font Try to run font editor with the selected font as argument You don't seem to have font editor installed. Path to font editor can be set in preferences. Preferences &File &Help Ready Fontmatrix care You are about to activate a bunch of fonts, it is time to cancel if it was not your intent You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent There is no font selected Support of DragNDrop over http is sheduled but not yet effective You bring something over me I can’t handle You provided an empty string, it’s not fair Can’t import this font because it’s broken : Choose the tag for filter exported fonts Choose Directory Export &Fonts Export a fontset Check Database Tag All... Load settings Check for Fontmatrix own dir Loading fonts present in database Catching font descriptions from network Collected System Font Adding fonts from system directories fonts available from system font descriptions imported from network Browse Fonts default "default" is a reserved Fonts imported: %1 Print Info... Print informations about the current font Print Sample... Print the sample as a specimen Print Chart... Print a chart of the current font Print Playground... Print the playground Print Family... Print a specimen of the whole family the current face belongs to About &Qt Next Family Next Face Previous Family Previous Face Layout Options Print &Edit &Browse Fontmatrix - data warning Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Unicode All fields Welcome maessage Print Infos Print Chart Print Playground Print Family fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-nb.ts0000644000175000017500000037337111023736606022110 0ustar malexmalex About About Fontmatrix Om Fontmatrix TextLabel Splash The Project The People Close AboutWidget version fonts loaded BookExportDialog Dialog Dialog Font book options Fontbok-alternativer File Fil Browse... Bla gjennom... Paper Size Papirst�rrelse X-Pos Vannrett plassering Family Familie Style Stil Text Tekst Font size Skriftst�rrelse Family Familie Style Stil Headline Overskrift Body Hovedtekst Sample text Eksempeltekst Export Font Book Output FMLayout Text engine options FolderViewMenu Reload Tree Import Directory Import recursively Import File FontAction action Handling Add Tag Legg til tagg FontBookDialog Save fontBook FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Font Subfamily Full font name Version string Description Copyright Font Family Unique font identifier Postscript name Trademark Manufacturer Designer URL Vendor URL Designer License Description License Info URL Reserved Preferred Family Preferred Subfamily Compatible Full (Macintosh only) Sample text Eksempeltekst PostScript CID findfont name Fontmatrix - Download Downloading %1. Any No Fit Text and Display Script Decorative Pictorial Family Type Cove Obtuse Cove Square Cove Obtuse Square Cove Square Thin Bone Exaggerated Triangle Normal Sans Obtuse Sans Perp Sans Flared Rounded Serif style Very Light Light Book Medium Demi Bold Heavy Black Nord Weight Old Style Modern Even Width Expanded Condensed Very Expanded Very Condensed Monospaced Proportion None Very Low Low Medium Low Medium High High Very High Contrast Gradual/Diagonal Gradual/Transitional Gradual/Vertical Gradual/Horizontal Rapid/Vertical Rapid/Horizontal Instant/Vertical Stroke Variation Straight Arms/Horizontal Straight Arms/Wedge Straight Arms/Vertical Straight Arms/Single Serif Straight Arms/Double Serif Non-Straight Arms/Horizontal Non-Straight Arms/Wedge Non-Straight Arms/Vertical Non-Straight Arms/Single Serif Non-Straight Arms/Double Serif Arm Style Normal/Contact Normal/Weighted Normal/Boxed Normal/Flattened Normal/Rounded Normal/Off Center Normal/Square Oblique/Contact Oblique/Weighted Oblique/Boxed Oblique/Flattened Oblique/Rounded Oblique/Off Center Oblique/Square Letterform Standard/Trimmed Standard/Pointed Standard/Serifed High/Trimmed High/Pointed High/Serifed Constant/Trimmed Constant/Pointed Constant/Serifed Low/Trimmed Low/Pointed Low/Serifed Midline Constant/Small Constant/Standard Constant/Large Ducking/Small Ducking/Standard Ducking/Large X-Height Category Help Fontmatrix Help Fontmatrix-hjelp ImportTagsDialog Dialog Dialog Fontmatrix - Tags Add Ok ImportedFonts Dialog Dialog Imported fonts Importerte skrifttyper Imported Fonts Ok <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> Do not show this dialog again ImportedFontsDialog (not loaded) Number of Imported Fonts LayoutOptionWidget Form Weights score before exact after end penalty H-penalty ListDock Search through font informations S�k i skrifttypens informasjonfelter Search S�k Respect entered text case when searching Skill mellom store og sm� bokstaver ved s�kning Case sensitive Skiller mellom store og sm� bokstaver Tag Tagg Filter view by chosing tag Begrens visning til tagg TagSet Taggruppe Show only fonts that belong to chosen tagset Vis bare skrifttyper som tilh�rer valgt taggruppe Names Navn Files Filer Preview Pr�ve Show complete collection of available fonts Vis alle tilgjengelige skrifttyper View all Vis alle Show all activated fonts Vis alle aktive skrifttyper View activated Vis aktive Form Tag: Switch to panose filtering P Filter: Field selection F TextLabel Previews Folders ListDockWidget All fields Unicode All activated MainView Right mouse click on a tag to add it or remove it from TagSet H�yreklikk p� en tagg for � legge den til eller fjerne den fra en Taggruppe Font Info Fontinformasjon Sample text Eksempeltekst Customising text used for preview rendering Tilpass tekst brukt for fontpr�ve Sample text... Pr�vetekst... Fit to view Tilpass til vindu Zoom is disabled, uncheck fit to view to enable zoom Zoom-funksjonen er avstengt; fravelg "Tilpass til vindu" for a aktivere zoom Glyphs Tegn No glyph selected Intet tegn valgt Clicking on a glyph will show details about it Klikk p� et tegn for � vise detaljer Tags Tagger part I part II main view widget Nothing selected Add a tag Font Information Settings S OpenType O OpenType Features Friendly Name Save as default Reset Default SampleText ... Layout Font Size pt Rendering FreeType Native Qt objects World is wide Shaper type Script Use shaper Text Progression Sample Text Coverage of Unicode Interval : push Playground Set Mode "Copy Character to Clipboard" C MainViewWidget Activation event Cancel Activation of : Deactivation of : 000Basic Latin 001Latin-1 Supplement 002Latin Extended-A 003Latin Extended-B 004IPA Extensions 005Spacing Modifier Letters 006Combining Diacritical Marks 007Greek and Coptic 008Cyrillic 009Cyrillic Supplement 010Armenian 011Hebrew 012Arabic 013Syriac 014Arabic Supplement 015Thaana 016N'Ko 017Devanagari 018Bengali 019Gurmukhi 020Gujarati 021Oriya 022Tamil 023Telugu 024Kannada 025Malayalam 026Sinhala 027Thai 028Lao 029Tibetan 030Burmese 031Georgian 032Hangul Jamo 033Ethiopic 034Ethiopic Supplement 035Cherokee 036Unified Canadian Aboriginal Syllabics 037Ogham 038Runic 039Tagalog 040Hanunóo 041Buhid 042Tagbanwa 043Khmer 044Mongolian 045Limbu 046Tai Le 047New Tai Lue 048Khmer Symbols 049Buginese 050Balinese 051Lepcha 052Phonetic Extensions 053Phonetic Extensions Supplement 054Combining Diacritical Marks Supplement 055Latin Extended Additional 056Greek Extended 057General Punctuation 058Superscripts and Subscripts 059Currency Symbols 060Combining Diacritical Marks for Symbols 061Letterlike Symbols 062Number Forms 063Arrows 064Mathematical Operators 065Miscellaneous Technical 066Control Pictures 067Optical Character Recognition 068Enclosed Alphanumerics 069Box Drawing 070Block Elements 071Geometric Shapes 072Miscellaneous Symbols 073Dingbats 074Miscellaneous Mathematical Symbols-A 075Supplemental Arrows-A 076Braille Patterns 077Supplemental Arrows-B 078Miscellaneous Mathematical Symbols-B 079Supplemental Mathematical Operators 080Miscellaneous Symbols and Arrows 081Glagolitic 082Latin Extended-C 083Coptic 084Georgian Supplement 085Tifinagh 086Ethiopic Extended 087Supplemental Punctuation 088CJK Radicals Supplement 089Kangxi Radicals 090Ideographic Description Characters 091CJK Symbols and Punctuation 092Hiragana 093Katakana 094Bopomofo 095Hangul Compatibility Jamo 096Kanbun 097Bopomofo Extended 098CJK Strokes 099Katakana Phonetic Extensions 100Enclosed CJK Letters and Months 101CJK Compatibility 102CJK Unified Ideographs Extension A 103Yijing Hexagram Symbols 104CJK Unified Ideographs 105Yi Syllables 106Yi Radicals 107Modifier Tone Letters 108Latin Extended-D 109Syloti Nagri 110Phags-pa 111Hangul Syllables 112High Surrogates 113High Private Use Surrogates 114Low Surrogates 115Private Use Area 116CJK Compatibility Ideographs 117Alphabetic Presentation Forms 118Arabic Presentation Forms-A 119Variation Selectors 120Vertical Forms 121Combining Half Marks 122CJK Compatibility Forms 123Small Form Variants 124Arabic Presentation Forms-B 125Halfwidth and Fullwidth Forms 126Specials 127Supplementary Multilingual Plane (SMP) 128Supplementary Ideographic Plane (SIP) 129unassigned 130Supplementary Special-purpose Plane (SSP) 131Private Use Area 1 (PUA) 132Private Use Area 2 (PUA) 133Un-Mapped Glyphs 134View all mapped glyphs Names Navn Fontmatrix takes care of you is activated. If you want to remove it from Fontmatrix database, please deactivate it first. Fontmatrix safe You are about to remove a font from Fontmatrix database Do you want to continue? Welcome to Fontmatrix PrefsPanel Browse... Bla gjennom... Close Lukk Preferences Panel Preferences Show Fontmatrix in System Tray Close to System Tray Show "All" actions Ask confirmation when activating or deactivating all fonts Ask confirmation when activating or deactivating fonts by tags Preview Word is RTL size pt Font Editor Add the full path to your preferred font editor /usr/bin/fontforge Ask for tag names when importing fonts Show names of imported fonts after import process Show splash at startup Don’t use preferred name scheme (will affect only newly imported fonts) General Named Sample Texts Add Initial Layout Font Size: Interline: Hyphenation Left: Right: Dictionary: Browse ... Apply Sample Text Templates Folder Remote directories http:// Remove Local storage Files and Folders Change TextLabel Shortcuts PrefsPanelDialog Looks like your setup does not have a system tray available. A text Select font editor Select Templates Folder Select Where remote font files will be stored Please select an item in the list or create a new one. Alt Ctrl Shift Meta Meta+ Shift+ Alt+ Ctrl+ Replace Shortcut is already in use for action name will be appended to this Do you still want to assign it? Action Shortcut Tip Select hyphenation dictionary QObject codepoint is U+ tegnkode er U+ Creating font book... cancel Copying files Unable to copy ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv Mark, NonSpacing Mark, SpacingCombining Mark, Enclosing Number, DecimalDigit Number, Letter Number, Other Separator, Space Separator, Line Separator, Paragraph Other, Control Other, Format Other, Surrogate Other, PrivateUse Other, NotAssigned Letter, Uppercase Letter, Lowercase Letter, Titlecase Letter, Modifier Letter, Other Punctuation, Connector Punctuation, Dash Punctuation, Open Punctuation, Close Punctuation, InitialQuote Punctuation, FinalQuote Punctuation, Other Symbol, Math Symbol, Currency Symbol, Modifier Symbol, Other RemoteDir Downloading Systray &Activate all &Deactivate all Mi&nimize &Restore E&xit A&vslutt &Tags TagSetDialog TagSet editor Rediger Taggrupper Collections of Tags Taggrupper Available tags Tilgjengelige tagger Add selected tag to current set. F�y markert tagg til aktiv gruppe add Legg til Collections Grupper New Ny delete Slett remove Fjern Close Lukk Available Tags Add Remove TextProgressionWidget Form Inline progression e.g. Latin text Left to right e.g. Arabic text Right to left e.g. Traditional Chinese & Japanese text Top to bottom e.g. Runic text Bottom to top Block progression e.g. Tarditionnal Chinese & Japanes text e.g. Traditional Mongolian text repairDialog Dialog Dialog Close Lukk Select all Remove Dead links Re-link Deactivate Activated Not Linked De-link Activate Deactivated Linked typotek Add Directory Legg til mappe &Import... &Importer fonter... Ctrl+O Import a directory Importer en mappe &Save &Lagre Ctrl+S Ctrl+S Save the document to disk Spar dokumentet til Print... Skriv ut... Print a specimen of the current font Skriv ut en pr�ve av markert font Export font book... Eksporter fontbok... Export a pdf that show selected fonts Eksporter en pdf-fil med de valgte fonter E&xit A&vslutt Ctrl+Q Ctrl+Q Exit the application Avslutt Fontmatrix &About &Om Show the Typotek's About box Vis informasjon om Fontmatrix Help Hjelp &Tag Sets Tag&grupper Activate all currents &Aktiver alle viste fonter Deactivate all currents &Deaktiver alle viste fonter Edit current font Rediger markert font Try to run Fontforge with the selected font as argument Pr�v � �pne markert font i Fontforge &File &Fil Edit Rediger &Help &Hjelp Ready Ferdig Print specimen Skriv ut pr�veside There is no font selected Ingen font er valgt Support of DragNDrop over http is sheduled but not yet effective Dra-og-slipp over http er planlagt, men enn� ikke innf�rt You bring something over me I can’t handle Objektet kan ikke slippes her Nothing Selected Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Importing font files... cancel Import Can’t import this font because it’s broken : Activate all current Deactivate all current Try to run font editor with the selected font as argument You don't seem to have font editor installed. Path to font editor can be set in preferences. Preferences Fontmatrix care You are about to activate a bunch of fonts, it is time to cancel if it was not your intent You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent You provided an empty string, it’s not fair Choose the tag for filter exported fonts Choose Directory Export &Fonts Export a fontset Check Database Tag All... Load settings Check for Fontmatrix own dir Loading fonts present in database Catching font descriptions from network Collected System Font Adding fonts from system directories fonts available from system font descriptions imported from network Browse Fonts default "default" is a reserved Fonts imported: %1 Print Info... Print informations about the current font Print Sample... Print the sample as a specimen Print Chart... Print a chart of the current font Print Playground... Print the playground Print Family... Print a specimen of the whole family the current face belongs to About &Qt Next Family Next Face Previous Family Previous Face Layout Options Print &Edit &Browse Fontmatrix - data warning Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Unicode All fields Welcome maessage Print Infos Print Chart Print Playground Print Family fontmatrix-0.6.0+svn20110930/src/messages/about_people.html0000644000175000017500000000477311216442071022303 0ustar malexmalex
Pierre Marchand
Initiator of Fontmatrix
pierremarc@oep-h.com
Mr Docs
Tester, Packager and Docs
mrdocs@scribus.info
Riku Leino
Systray, minor tweaks and the Finnish translation
riku@scribus.info
ParagAN
Enhancing GUI and working on Indic fonts.
paragn@fedoraproject.org
Alexandre Prokoudine
Usability, new user manual, Russian translation, website
alexandre.prokoudine@gmail.com
Vladimir Savic
General visual impact, documentation.
vladimir.firefly.savic@gmail.com
Pavel Fric
Czech Translation
pavelfric@seznam.cz
fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-sv.ts0000644000175000017500000037352711023736606022144 0ustar malexmalex About About Fontmatrix Om Fontmatrix TextLabel Splash The Project The People Close AboutWidget version fonts loaded BookExportDialog Dialog Dialog Font book options Fontbok-alternativ File Arkiv Browse... Bl�ddra... Paper Size �ndra storlek X-Pos Horisontell position Family Familj Style Stil Text Text Font size Teckenstorlek Family Familj Style Stil Headline Rubrik Body Huvudtext Sample text Exempeltext Export Font Book Output FMLayout Text engine options FolderViewMenu Reload Tree Import Directory Import recursively Import File FontAction action Handling Add Tag Tillfoga Tagg FontBookDialog Save fontBook FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Font Subfamily Full font name Version string Description Copyright Font Family Unique font identifier Postscript name Trademark Manufacturer Designer URL Vendor URL Designer License Description License Info URL Reserved Preferred Family Preferred Subfamily Compatible Full (Macintosh only) Sample text Exempeltext PostScript CID findfont name Fontmatrix - Download Downloading %1. Any No Fit Text and Display Script Decorative Pictorial Family Type Cove Obtuse Cove Square Cove Obtuse Square Cove Square Thin Bone Exaggerated Triangle Normal Sans Obtuse Sans Perp Sans Flared Rounded Serif style Very Light Light Book Medium Demi Bold Heavy Black Nord Weight Old Style Modern Even Width Expanded Condensed Very Expanded Very Condensed Monospaced Proportion None Very Low Low Medium Low Medium High High Very High Contrast Gradual/Diagonal Gradual/Transitional Gradual/Vertical Gradual/Horizontal Rapid/Vertical Rapid/Horizontal Instant/Vertical Stroke Variation Straight Arms/Horizontal Straight Arms/Wedge Straight Arms/Vertical Straight Arms/Single Serif Straight Arms/Double Serif Non-Straight Arms/Horizontal Non-Straight Arms/Wedge Non-Straight Arms/Vertical Non-Straight Arms/Single Serif Non-Straight Arms/Double Serif Arm Style Normal/Contact Normal/Weighted Normal/Boxed Normal/Flattened Normal/Rounded Normal/Off Center Normal/Square Oblique/Contact Oblique/Weighted Oblique/Boxed Oblique/Flattened Oblique/Rounded Oblique/Off Center Oblique/Square Letterform Standard/Trimmed Standard/Pointed Standard/Serifed High/Trimmed High/Pointed High/Serifed Constant/Trimmed Constant/Pointed Constant/Serifed Low/Trimmed Low/Pointed Low/Serifed Midline Constant/Small Constant/Standard Constant/Large Ducking/Small Ducking/Standard Ducking/Large X-Height Category Help Fontmatrix Help Fontmatrix Hj�lp ImportTagsDialog Dialog Dialog Fontmatrix - Tags Add Ok ImportedFonts Dialog Dialog Imported fonts Importerade teckensnitt Imported Fonts Ok <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> Do not show this dialog again ImportedFontsDialog (not loaded) Number of Imported Fonts LayoutOptionWidget Form Weights score before exact after end penalty H-penalty ListDock Search through font informations S�k i teckensnittsinformationer Search S�k Respect entered text case when searching Skilj mellan gemener och versaler vid s�kning Case sensitive Skillnad gemener/versaler Tag Tagg Filter view by chosing tag Visa bara vald Tagg TagSet Taggrupp Show only fonts that belong to chosen tagset Visa bara teckensnitt som tillh�r den valda Taggrupp Names Namn Files Filer Preview Provsida Show complete collection of available fonts Visa alla tillg�ngliga teckensnitt View all Visa alla Show all activated fonts Visa alla aktiva teckensnitt View activated Visa aktiva Form Tag: Switch to panose filtering P Filter: Field selection F TextLabel Previews Folders ListDockWidget All fields Unicode All activated MainView Right mouse click on a tag to add it or remove it from TagSet H�gerklicka p� en tagg f�r att l�gga den till eller ta bort den fr�n en Taggrupp Font Info Teckensnittsinformation Sample text Exempeltext Customising text used for preview rendering �ndra provtext f�r exempel Sample text... Exempeltext... Fit to view Tillpassa till f�nster Zoom is disabled, uncheck fit to view to enable zoom Zoom �r deaktiverat, avbocka Tillpassa till f�nster f�r att aktivera Glyphs Tecken No glyph selected Inget tecken markerat Clicking on a glyph will show details about it Klicka p� ett tecken f�r att visa detaljer Tags Taggar Add Tag Tillfoga Tagg part I part II main view widget Nothing selected Add a tag Font Information Settings S OpenType O OpenType Features Friendly Name Save as default Reset Default SampleText ... Layout Font Size pt Rendering FreeType Native Qt objects World is wide Shaper type Script Use shaper Text Progression Sample Text Coverage of Unicode Interval : push Playground Set Mode "Copy Character to Clipboard" C MainViewWidget Activation event Cancel Activation of : Deactivation of : 000Basic Latin 001Latin-1 Supplement 002Latin Extended-A 003Latin Extended-B 004IPA Extensions 005Spacing Modifier Letters 006Combining Diacritical Marks 007Greek and Coptic 008Cyrillic 009Cyrillic Supplement 010Armenian 011Hebrew 012Arabic 013Syriac 014Arabic Supplement 015Thaana 016N'Ko 017Devanagari 018Bengali 019Gurmukhi 020Gujarati 021Oriya 022Tamil 023Telugu 024Kannada 025Malayalam 026Sinhala 027Thai 028Lao 029Tibetan 030Burmese 031Georgian 032Hangul Jamo 033Ethiopic 034Ethiopic Supplement 035Cherokee 036Unified Canadian Aboriginal Syllabics 037Ogham 038Runic 039Tagalog 040Hanunóo 041Buhid 042Tagbanwa 043Khmer 044Mongolian 045Limbu 046Tai Le 047New Tai Lue 048Khmer Symbols 049Buginese 050Balinese 051Lepcha 052Phonetic Extensions 053Phonetic Extensions Supplement 054Combining Diacritical Marks Supplement 055Latin Extended Additional 056Greek Extended 057General Punctuation 058Superscripts and Subscripts 059Currency Symbols 060Combining Diacritical Marks for Symbols 061Letterlike Symbols 062Number Forms 063Arrows 064Mathematical Operators 065Miscellaneous Technical 066Control Pictures 067Optical Character Recognition 068Enclosed Alphanumerics 069Box Drawing 070Block Elements 071Geometric Shapes 072Miscellaneous Symbols 073Dingbats 074Miscellaneous Mathematical Symbols-A 075Supplemental Arrows-A 076Braille Patterns 077Supplemental Arrows-B 078Miscellaneous Mathematical Symbols-B 079Supplemental Mathematical Operators 080Miscellaneous Symbols and Arrows 081Glagolitic 082Latin Extended-C 083Coptic 084Georgian Supplement 085Tifinagh 086Ethiopic Extended 087Supplemental Punctuation 088CJK Radicals Supplement 089Kangxi Radicals 090Ideographic Description Characters 091CJK Symbols and Punctuation 092Hiragana 093Katakana 094Bopomofo 095Hangul Compatibility Jamo 096Kanbun 097Bopomofo Extended 098CJK Strokes 099Katakana Phonetic Extensions 100Enclosed CJK Letters and Months 101CJK Compatibility 102CJK Unified Ideographs Extension A 103Yijing Hexagram Symbols 104CJK Unified Ideographs 105Yi Syllables 106Yi Radicals 107Modifier Tone Letters 108Latin Extended-D 109Syloti Nagri 110Phags-pa 111Hangul Syllables 112High Surrogates 113High Private Use Surrogates 114Low Surrogates 115Private Use Area 116CJK Compatibility Ideographs 117Alphabetic Presentation Forms 118Arabic Presentation Forms-A 119Variation Selectors 120Vertical Forms 121Combining Half Marks 122CJK Compatibility Forms 123Small Form Variants 124Arabic Presentation Forms-B 125Halfwidth and Fullwidth Forms 126Specials 127Supplementary Multilingual Plane (SMP) 128Supplementary Ideographic Plane (SIP) 129unassigned 130Supplementary Special-purpose Plane (SSP) 131Private Use Area 1 (PUA) 132Private Use Area 2 (PUA) 133Un-Mapped Glyphs 134View all mapped glyphs Names Namn Fontmatrix takes care of you is activated. If you want to remove it from Fontmatrix database, please deactivate it first. Fontmatrix safe You are about to remove a font from Fontmatrix database Do you want to continue? Welcome to Fontmatrix PrefsPanel Browse... Bl�ddra... Close St�ng Preferences Panel Preferences Show Fontmatrix in System Tray Close to System Tray Show "All" actions Ask confirmation when activating or deactivating all fonts Ask confirmation when activating or deactivating fonts by tags Preview Word is RTL size pt Font Editor Add the full path to your preferred font editor /usr/bin/fontforge Ask for tag names when importing fonts Show names of imported fonts after import process Show splash at startup Don’t use preferred name scheme (will affect only newly imported fonts) General Named Sample Texts Add Initial Layout Font Size: Interline: Hyphenation Left: Right: Dictionary: Browse ... Apply Sample Text Templates Folder Remote directories http:// Remove Local storage Files and Folders Change TextLabel Shortcuts PrefsPanelDialog Looks like your setup does not have a system tray available. A text Select font editor Select Templates Folder Select Where remote font files will be stored Please select an item in the list or create a new one. Alt Ctrl Shift Meta Meta+ Shift+ Alt+ Ctrl+ Replace Shortcut is already in use for action name will be appended to this Do you still want to assign it? Action Shortcut Tip Select hyphenation dictionary QObject codepoint is U+ teckenkod �r U+ Creating font book... cancel Copying files Unable to copy ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv Mark, NonSpacing Mark, SpacingCombining Mark, Enclosing Number, DecimalDigit Number, Letter Number, Other Separator, Space Separator, Line Separator, Paragraph Other, Control Other, Format Other, Surrogate Other, PrivateUse Other, NotAssigned Letter, Uppercase Letter, Lowercase Letter, Titlecase Letter, Modifier Letter, Other Punctuation, Connector Punctuation, Dash Punctuation, Open Punctuation, Close Punctuation, InitialQuote Punctuation, FinalQuote Punctuation, Other Symbol, Math Symbol, Currency Symbol, Modifier Symbol, Other RemoteDir Downloading Systray &Activate all &Deactivate all Mi&nimize &Restore E&xit &Avsluta &Tags TagSetDialog TagSet editor Bearbeta Taggrupper Collections of Tags Taggrupper Available tags Tillg�ngliga taggar Add selected tag to current set. L�gg markerad tagg till vald Taggrupp add L�gg till Collections Taggrupper New Ny delete Sl�tt remove Ta bort Close St�ng Available Tags Add Remove TextProgressionWidget Form Inline progression e.g. Latin text Left to right e.g. Arabic text Right to left e.g. Traditional Chinese & Japanese text Top to bottom e.g. Runic text Bottom to top Block progression e.g. Tarditionnal Chinese & Japanes text e.g. Traditional Mongolian text repairDialog Dialog Dialog Close St�ng Select all Remove Dead links Re-link Deactivate Activated Not Linked De-link Activate Deactivated Linked typotek Add Directory L�gg till mapp &Import... &Importera... Ctrl+O Import a directory Importera en mapp &Save &Spara Ctrl+S Save the document to disk Spara dokumentet till disk Print... Skriv ut... Print a specimen of the current font Skriv ut ett provark med vald teckensnitt Export font book... Exportera fontbok... Export a pdf that show selected fonts Exportera en pdf-fil med valda teckensnitt E&xit &Avsluta Ctrl+Q Exit the application Avsluta Fontmatrix &About &Om Show the Typotek's About box Visa information om Fontmatrix Help Hj�lp &Tag Sets Tag&grupper Activate all currents Aktivera alla valda teckensnitt Deactivate all currents Avaktivera alla valda teckensnitt Edit current font Redigera markerat teckensnitt Try to run Fontforge with the selected font as argument F�rs�k att �ppna markerad teckensnitt i FontForge &File &Fil Edit Redigera &Help &Hj�lp Ready Klar Print specimen Skriv ut provsida There is no font selected Inget teckensnitt markerat Support of DragNDrop over http is sheduled but not yet effective Drag-och-sl�pp �ver http �r planerat men �nnu inte i funktion You bring something over me I can’t handle Detta objekt kan inte sl�ppas h�r Nothing Selected Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Importing font files... cancel Import Can’t import this font because it’s broken : Activate all current Deactivate all current Try to run font editor with the selected font as argument You don't seem to have font editor installed. Path to font editor can be set in preferences. Preferences Fontmatrix care You are about to activate a bunch of fonts, it is time to cancel if it was not your intent You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent You provided an empty string, it’s not fair Choose the tag for filter exported fonts Choose Directory Export &Fonts Export a fontset Check Database Tag All... Load settings Check for Fontmatrix own dir Loading fonts present in database Catching font descriptions from network Collected System Font Adding fonts from system directories fonts available from system font descriptions imported from network Browse Fonts default "default" is a reserved Fonts imported: %1 Print Info... Print informations about the current font Print Sample... Print the sample as a specimen Print Chart... Print a chart of the current font Print Playground... Print the playground Print Family... Print a specimen of the whole family the current face belongs to About &Qt Next Family Next Face Previous Family Previous Face Layout Options Print &Edit &Browse Fontmatrix - data warning Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Unicode All fields Welcome maessage Print Infos Print Chart Print Playground Print Family fontmatrix-0.6.0+svn20110930/src/messages/welcome_de.html0000644000175000017500000000274211035172507021725 0ustar malexmalex Welcome to Fontmatrix
##WELCOME_FONT##
Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.
Fontmatrix has some unique functionalities in the Open Source world :
Activate, deactivate fonts to reduce font lists and save resources
Allow to tag font for a better classification and group (de)activation
Make it easy to find particular glyph thanks to a glyph category display
Create a font book that can be printed to have a real overview of the fonts available
Display advanced OpenType features
Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/messages/welcome_fr.html0000644000175000017500000000361711040213073021734 0ustar malexmalex Bienvenue dans Fontmatrix
##WELCOME_FONT##

Fontmatrix se veut avant tout un gestionnaire de polices de caractères, ou fontes, numériques. Ensuite, il nous a paru intéressant d’en faire aussi un lieu d’expérimentations pour ce qui concerne le rendu de texte, etc.

Ce logiciel permet entre autres de :
  • Activer ou désactiver vos fontes
  • Étiqueter les fontes
  • Avoir un aperçu d’une fonte non installée, à l’écran ou imprimé
  • Produire un catalogue selon un gabarit
  • Avoir un aperçu des fonctionnalités OpenType
  • Plus ou moins gérer des fontes se trouvant sur un serveur distant
  • etc.
En espérant que vous en aurez l’usage.
fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-en.ts0000644000175000017500000041440311023736606022103 0ustar malexmalex About About Fontmatrix About Fontmatrix TextLabel Splash The Project The People Close AboutWidget version fonts loaded BookExportDialog Dialog Dialog Font book options Font book options File File Browse... Browse... Paper Size Paper Size X-Pos X-Pos Family Family Style Style Text Text Font size Font size Family Family Style Style Headline Headline Body Body Sample text Sample text Export Font Book Export Font Book Font Book Options Font Book Options File: File: Paper Size: Paper Size: X Position X Position Family: Family: Style: Style: Text: Text: Font Size Font Size Headline: Headline: Body: Body: Sample Text: Sample Text: Preview Preview Output FMLayout Text engine options FolderViewMenu Reload Tree Import Directory Import recursively Import File FontAction Form Form action action Add Tag Add Tag Action Action FontBookDialog Save fontBook FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Copyright Font Family Font Subfamily Unique font identifier Full font name Version string Postscript name Trademark Manufacturer Designer Description URL Vendor URL Designer License Description License Info URL Reserved Preferred Family Preferred Subfamily Compatible Full (Macintosh only) Sample text Sample text PostScript CID findfont name Fontmatrix - Download Downloading %1. Any No Fit Text and Display Script Decorative Pictorial Family Type Cove Obtuse Cove Square Cove Obtuse Square Cove Square Thin Bone Exaggerated Triangle Normal Sans Obtuse Sans Perp Sans Flared Rounded Serif style Very Light Light Book Medium Demi Bold Heavy Black Nord Weight Old Style Modern Even Width Expanded Condensed Very Expanded Very Condensed Monospaced Proportion None Very Low Low Medium Low Medium High High Very High Contrast Gradual/Diagonal Gradual/Transitional Gradual/Vertical Gradual/Horizontal Rapid/Vertical Rapid/Horizontal Instant/Vertical Stroke Variation Straight Arms/Horizontal Straight Arms/Wedge Straight Arms/Vertical Straight Arms/Single Serif Straight Arms/Double Serif Non-Straight Arms/Horizontal Non-Straight Arms/Wedge Non-Straight Arms/Vertical Non-Straight Arms/Single Serif Non-Straight Arms/Double Serif Arm Style Normal/Contact Normal/Weighted Normal/Boxed Normal/Flattened Normal/Rounded Normal/Off Center Normal/Square Oblique/Contact Oblique/Weighted Oblique/Boxed Oblique/Flattened Oblique/Rounded Oblique/Off Center Oblique/Square Letterform Standard/Trimmed Standard/Pointed Standard/Serifed High/Trimmed High/Pointed High/Serifed Constant/Trimmed Constant/Pointed Constant/Serifed Low/Trimmed Low/Pointed Low/Serifed Midline Constant/Small Constant/Standard Constant/Large Ducking/Small Ducking/Standard Ducking/Large X-Height Category Help Fontmatrix Help Fontmatrix Help ImportTagsDialog Dialog Dialog Add Add Fontmatrix - Tags Ok ImportedFonts Dialog Dialog Imported fonts Imported fonts Imported Fonts Imported Fonts Ok <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> Do not show this dialog again ImportedFontsDialog (not loaded) Number of Imported Fonts LayoutOptionWidget Form Form Weights score before exact after end penalty H-penalty ListDock Form Form Search through font informations Search through font information Search Search Respect entered text case when searching Respect entered text case when searching Case sensitive Case sensitive Tag Tag Filter view by chosing tag Filter view by chosing tag TagSet TagSet Show only fonts that belong to chosen tagset Show only fonts that belong to chosen tagset Names Names Files Files Preview Preview Show complete collection of available fonts Show complete collection of available fonts View all View all Show all activated fonts Show all activated fonts View activated View activated Case Sensitive Case Sensitive Tag: Tag: Tag Set: Tag Set: View All View All View Activated View Activated Remove Remove Switch to panose filtering P Filter: Field selection F TextLabel Previews Folders ListDockWidget All fields Unicode All activated MainView main view widget main view widget Right mouse click on a tag to add it or remove it from TagSet Right mouse click on a tag to add it or remove it from TagSet Font Info Font Info <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Sample text Sample text Fit to view Fit to view Zoom is disabled, uncheck fit to view to enable zoom Zoom is disabled, uncheck fit to view to enable zoom FT FT OpenType Features OpenType Features Friendly Name Friendly Name Apply features Apply features Glyphs Glyphs Coverage of unicode interval : Coverage of unicode interval : Clicking on a glyph will show details about it Clicking on a glyph will show details about it Tags Tags Font Information Font Information Sample Text Sample Text Fit to View Fit to View Simulate screen rendering (FreeType inside) Simulate screen rendering (FreeType inside) Coverage of Unicode Interval : Coverage of Unicode Interval : Add Tag Add Tag Font Size Font Size pt pt part I part II Nothing selected Add a tag Settings S OpenType O Save as default Reset Default SampleText ... Layout Layout Rendering FreeType Native Qt objects World is wide Shaper type Script Use shaper Text Progression push Playground Set Mode "Copy Character to Clipboard" C MainViewWidget 000Basic Latin 001Latin-1 Supplement 002Latin Extended-A 003Latin Extended-B 004IPA Extensions 005Spacing Modifier Letters 006Combining Diacritical Marks 007Greek and Coptic 008Cyrillic 009Cyrillic Supplement 010Armenian 011Hebrew 012Arabic 013Syriac 014Arabic Supplement 015Thaana 016N'Ko 017Devanagari 018Bengali 019Gurmukhi 020Gujarati 021Oriya 022Tamil 023Telugu 024Kannada 025Malayalam 026Sinhala 027Thai 028Lao 029Tibetan 030Burmese 031Georgian 032Hangul Jamo 033Ethiopic 034Ethiopic Supplement 035Cherokee 036Unified Canadian Aboriginal Syllabics 037Ogham 038Runic 039Tagalog 040Hanunóo 041Buhid 042Tagbanwa 043Khmer 044Mongolian 045Limbu 046Tai Le 047New Tai Lue 048Khmer Symbols 049Buginese 050Balinese 051Lepcha 052Phonetic Extensions 053Phonetic Extensions Supplement 054Combining Diacritical Marks Supplement 055Latin Extended Additional 056Greek Extended 057General Punctuation 058Superscripts and Subscripts 059Currency Symbols 060Combining Diacritical Marks for Symbols 061Letterlike Symbols 062Number Forms 063Arrows 064Mathematical Operators 065Miscellaneous Technical 066Control Pictures 067Optical Character Recognition 068Enclosed Alphanumerics 069Box Drawing 070Block Elements 071Geometric Shapes 072Miscellaneous Symbols 073Dingbats 074Miscellaneous Mathematical Symbols-A 075Supplemental Arrows-A 076Braille Patterns 077Supplemental Arrows-B 078Miscellaneous Mathematical Symbols-B 079Supplemental Mathematical Operators 080Miscellaneous Symbols and Arrows 081Glagolitic 082Latin Extended-C 083Coptic 084Georgian Supplement 085Tifinagh 086Ethiopic Extended 087Supplemental Punctuation 088CJK Radicals Supplement 089Kangxi Radicals 090Ideographic Description Characters 091CJK Symbols and Punctuation 092Hiragana 093Katakana 094Bopomofo 095Hangul Compatibility Jamo 096Kanbun 097Bopomofo Extended 098CJK Strokes 099Katakana Phonetic Extensions 100Enclosed CJK Letters and Months 101CJK Compatibility 102CJK Unified Ideographs Extension A 103Yijing Hexagram Symbols 104CJK Unified Ideographs 105Yi Syllables 106Yi Radicals 107Modifier Tone Letters 108Latin Extended-D 109Syloti Nagri 110Phags-pa 111Hangul Syllables 112High Surrogates 113High Private Use Surrogates 114Low Surrogates 115Private Use Area 116CJK Compatibility Ideographs 117Alphabetic Presentation Forms 118Arabic Presentation Forms-A 119Variation Selectors 120Vertical Forms 121Combining Half Marks 122CJK Compatibility Forms 123Small Form Variants 124Arabic Presentation Forms-B 125Halfwidth and Fullwidth Forms 126Specials 127Supplementary Multilingual Plane (SMP) 128Supplementary Ideographic Plane (SIP) 129unassigned 130Supplementary Special-purpose Plane (SSP) 131Private Use Area 1 (PUA) 132Private Use Area 2 (PUA) 133Un-Mapped Glyphs Activation event Cancel Activation of : Deactivation of : 134View all mapped glyphs Names Names Fontmatrix takes care of you is activated. If you want to remove it from Fontmatrix database, please deactivate it first. Fontmatrix safe You are about to remove a font from Fontmatrix database Do you want to continue? Welcome to Fontmatrix PrefsPanel Preferences Panel Preferences Panel General General Show Fontmatrix in system tray Show Fontmatrix in system tray Close to system tray Close to system tray Show Activate all and Deactivate all in system tray menu Show Activate all and Deactivate all in system tray menu Ask confirmation when activating or deactivating all fonts Ask confirmation when activating or deactivating all fonts Ask confirmation when activating or deactivating tags Ask confirmation when activating or deactivating tags Preview word Preview word Sample text Sample text Named sample texts Named sample texts Add Add Validate Validate Layout Layout Font size Font size pt pt Interline Interline Apply Apply Show Fontmatrix in System Tray Show Fontmatrix in System Tray Close to System Tray Close to System Tray Show Activate All and Deactivate All in the System Tray menu Show Activate All and Deactivate All in the System Tray menu Ask confirmation when activating or deactivating fonts by tags Ask confirmation when activating or deactivating fonts by tags Preview Word Preview Word Font Editor Font Editor /usr/bin/fontforge /usr/bin/fontforge Browse... Browse... Ask for tag names when importing fonts Ask for tag names when importing fonts Sample Text Sample Text Named Sample Texts Named Sample Texts Font Size: Font Size: Interline: Interline: Remove Remove Preferences Preferences Close Close Show "All" actions is RTL size Add the full path to your preferred font editor Show names of imported fonts after import process Show splash at startup Don’t use preferred name scheme (will affect only newly imported fonts) Initial Layout Hyphenation Left: Right: Dictionary: Browse ... Templates Folder Remote directories http:// Local storage Files and Folders Change TextLabel Shortcuts PrefsPanelDialog Looks like your setup does not have a system tray available. Looks like your setup does not have a system tray available. A text A text Select font editor Select font editor Select Templates Folder Select Where remote font files will be stored Please select an item in the list or create a new one. Alt Ctrl Shift Meta Meta+ Shift+ Alt+ Ctrl+ Replace Shortcut is already in use for action name will be appended to this Do you still want to assign it? Action Action Shortcut Tip Select hyphenation dictionary QObject codepoint is U+ codepoint is U+ Creating font book... cancel Copying files Unable to copy ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv Mark, NonSpacing Mark, SpacingCombining Mark, Enclosing Number, DecimalDigit Number, Letter Number, Other Separator, Space Separator, Line Separator, Paragraph Other, Control Other, Format Other, Surrogate Other, PrivateUse Other, NotAssigned Letter, Uppercase Letter, Lowercase Letter, Titlecase Letter, Modifier Letter, Other Punctuation, Connector Punctuation, Dash Punctuation, Open Punctuation, Close Punctuation, InitialQuote Punctuation, FinalQuote Punctuation, Other Symbol, Math Symbol, Currency Symbol, Modifier Symbol, Other RemoteDir Downloading Systray &Activate all &Activate all &Deactivate all &Deactivate all Mi&nimize Mi&nimize &Restore &Restore &Exit &Exit &Tags &Tags E&xit E&xit TagSetDialog TagSet editor TagSet editor Collections of Tags Collections of Tags Available tags Available tags Add selected tag to current set. Add selected tag to current set. add add Collections Collections New New delete delete remove remove Close Close Available Tags Available Tags Add Add Remove Remove TextProgressionWidget Form Form Inline progression e.g. Latin text Left to right e.g. Arabic text Right to left e.g. Traditional Chinese & Japanese text Top to bottom e.g. Runic text Bottom to top Block progression e.g. Tarditionnal Chinese & Japanes text e.g. Traditional Mongolian text repairDialog Dialog Dialog Remove Remove Close Close Select all Dead links Re-link Deactivate Activated Not Linked De-link Activate Deactivated Linked typotek Fontmatrix Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Add Directory Add Directory &Import... &Import... Ctrl+O Ctrl+O Import a directory Import a directory &Save &Save Ctrl+S Ctrl+S Save the document to disk Save the document to disk Print... Print... Print a specimen of the current font Print a specimen of the current font Export font book... Export font book... Export a pdf that show selected fonts Export a pdf that show selected fonts E&xit E&xit Ctrl+Q Ctrl+Q Exit the application Exit the application &About &About Show the Typotek's About box Show the Typotek's About box Help Help &Tag Sets &Tag Sets Activate all currents Activate all currents Deactivate all currents Deactivate all currents Edit current font Edit current font Try to run Fontforge with the selected font as argument Try to run Fontforge with the selected font as argument Preferences Preferences &File &File Edit Edit &Help &Help Ready Ready Print specimen Print specimen There is no font selected There is no font selected Support of DragNDrop over http is sheduled but not yet effective Support of DragNDrop over http is sheduled but not yet effective You bring something over me I can’t handle You bring something over me I can't handle You provided an empty string, it’s not fair You provided an empty string, it's not fair "default" is a reserved keyword "default" is a reserved keyword Activate all current Activate all current Deactivate all current Deactivate all current Try to run font editor with the selected font as argument Try to run font editor with the selected font as argument You don't seem to have font editor installed. Path to font editor can be set in preferences. You don't seem to have font editor installed. Path to font editor can be set in preferences. Nothing Selected Importing font files... cancel Import Fontmatrix care You are about to activate a bunch of fonts, it is time to cancel if it was not your intent You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent Can’t import this font because it’s broken : Choose the tag for filter exported fonts Choose Directory Export &Fonts Export a fontset Check Database Tag All... Load settings Check for Fontmatrix own dir Loading fonts present in database Catching font descriptions from network Collected System Font Adding fonts from system directories fonts available from system font descriptions imported from network Browse Fonts default "default" is a reserved Fonts imported: %1 Print Info... Print informations about the current font Print Sample... Print the sample as a specimen Print Chart... Print a chart of the current font Print Playground... Print the playground Print Family... Print a specimen of the whole family the current face belongs to About &Qt Next Family Next Face Previous Family Previous Face Layout Options Print &Edit &Browse Fontmatrix - data warning Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Unicode All fields Welcome maessage Print Infos Print Chart Print Playground Print Family fontmatrix-0.6.0+svn20110930/src/messages/welcome_zh_TW.html0000644000175000017500000000274211035172507022370 0ustar malexmalex Welcome to Fontmatrix
##WELCOME_FONT##
Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.
Fontmatrix has some unique functionalities in the Open Source world :
Activate, deactivate fonts to reduce font lists and save resources
Allow to tag font for a better classification and group (de)activation
Make it easy to find particular glyph thanks to a glyph category display
Create a font book that can be printed to have a real overview of the fonts available
Display advanced OpenType features
Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/messages/welcome_no.html0000644000175000017500000000274211035172507021751 0ustar malexmalex Welcome to Fontmatrix
##WELCOME_FONT##
Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.
Fontmatrix has some unique functionalities in the Open Source world :
Activate, deactivate fonts to reduce font lists and save resources
Allow to tag font for a better classification and group (de)activation
Make it easy to find particular glyph thanks to a glyph category display
Create a font book that can be printed to have a real overview of the fonts available
Display advanced OpenType features
Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/messages/welcome_ru.html0000644000175000017500000000352411037636007021764 0ustar malexmalex Добро пожаловать в Fontmatrix
##WELCOME_FONT##

Fontmatrix — удобная программа для управления шрифтами в Linux, Mac OS X и Windows. Мы стремимся создать программу с эргономичным и понятным интерфейсом.

Fontmatrix обладает возможностями, уникальными среди прочих свободных приложений такого рода:

  • активация и деактивация шрифтов для сокращения списка шрифтов и экономии ресурсов системы;
  • возможность разметки шрифтов, упрощающей их классификацию и деактивацию;
  • простой поиск нужного глифа благодаря категоризации по блокам Unicode;
  • создание печатаемых шрифтовых каталогов;
  • отображение расширенных функций OpenType;
  • импорт шрифтов из разделяемых сетевых каталогов.
Надеемся, что пользоваться Fontmatrix вам будет в радость.
fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-uk.ts0000644000175000017500000042166711023736606022132 0ustar malexmalex About About Fontmatrix Про програму Fontmatrix TextLabel ТекстоваМітка The Project Про проект The Peoples Про учасників Splash The People Close AboutWidget version версія fonts loaded BookExportDialog Browse... Перегляд... Export Font Book Експортувати книгу шрифтів Settings Параметри Font Book Options Параметри книги шрифтів Load Template Завантажити шаблон Not A Template Не шаблон Output Вивід Paper Size: Розмір паперу: X Position Координата X Family: Сім’я: Style: Стиль: Text: Текст: Font Size Розмір шрифту Headline: Заголовок: Body: Тіло: Sample Text: Текст зразка: Preview Перегляд FMLayout Text engine options FolderViewMenu Reload Tree Import Directory Import recursively Import File FontAction Form Формувати Add Tag Додати тег Action Дія FontBookDialog Save fontBook Зберегти книгу шрифтів family сім’я style стиль headline заголовок body тіло FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Це значення є застарілим, воно ніколи не використовувалося або визначалося у FreeType. Не використовуйте і не перевіряйте його. Copyright Право копіювання Font Family Сім’я шрифтів Font Subfamily Підсім’я шрифтів Unique font identifier Унікальний ідентифікатор шрифту Full font name Повна назва шрифту Version string Рядок версії Postscript name Postscript назва Trademark Торгова марка Manufacturer Виробник Designer Розробник Description Опис URL Vendor URL продавця URL Designer URL розробника License Description Опис ліцензії License Info URL URL інформації про ліцензію Reserved Зарезервовано Preferred Family Привілейована сім’я Preferred Subfamily Привілейована підсім’я Compatible Full (Macintosh only) Повністю сумісний (тільки для Macintosh) Sample text Текст зразка PostScript CID findfont name Назва для пошуку у PostScript Fontmatrix - Download Downloading %1. Any No Fit Text and Display Script Decorative Pictorial Family Type Cove Obtuse Cove Square Cove Obtuse Square Cove Square Thin Bone Exaggerated Triangle Normal Sans Obtuse Sans Perp Sans Flared Rounded Serif style Very Light Light Book Medium Demi Bold Heavy Black Nord Weight Old Style Modern Even Width Expanded Condensed Very Expanded Very Condensed Monospaced Proportion None Very Low Low Medium Low Medium High High Very High Contrast Gradual/Diagonal Gradual/Transitional Gradual/Vertical Gradual/Horizontal Rapid/Vertical Rapid/Horizontal Instant/Vertical Stroke Variation Straight Arms/Horizontal Straight Arms/Wedge Straight Arms/Vertical Straight Arms/Single Serif Straight Arms/Double Serif Non-Straight Arms/Horizontal Non-Straight Arms/Wedge Non-Straight Arms/Vertical Non-Straight Arms/Single Serif Non-Straight Arms/Double Serif Arm Style Normal/Contact Normal/Weighted Normal/Boxed Normal/Flattened Normal/Rounded Normal/Off Center Normal/Square Oblique/Contact Oblique/Weighted Oblique/Boxed Oblique/Flattened Oblique/Rounded Oblique/Off Center Oblique/Square Letterform Standard/Trimmed Standard/Pointed Standard/Serifed High/Trimmed High/Pointed High/Serifed Constant/Trimmed Constant/Pointed Constant/Serifed Low/Trimmed Low/Pointed Low/Serifed Midline Constant/Small Constant/Standard Constant/Large Ducking/Small Ducking/Standard Ducking/Large X-Height Category Help Fontmatrix Help Довідка з Fontmatrix ImportTagsDialog Dialog Діалог Add Додати Ok Гаразд Fontmatrix - Tags ImportedFonts Dialog Діалог Imported Fonts Імпортовані шрифти Ok Гаразд <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> Do not show this dialog again ImportedFontsDialog (not loaded) (не завантажено) Number of Imported Fonts LayoutOptionWidget Form Формувати Weights score before exact after end penalty H-penalty ListDock Form Форма Search through font informations Шукати серед інформації про шрифти Search Пошук Respect entered text case when searching Зважати на регістр введеного тексту від час пошуку Filter view by chosing tag Фільтрувати за обраним тегом Show only fonts that belong to chosen tagset Показувати тільки шрифти, що мають обраний набір тегів Names Назви Files Файли Preview Перегляд Show complete collection of available fonts Показати всю колекцію доступних шрифтів Show all activated fonts Показати всі активовані шрифти Case Sensitive З врахуванням регістру Tag: Тег: Tag Set: Набір тегів: View All Переглянути всі View Activated Переглянути активовані Remove Вилучити Switch to panose filtering P Filter: Field selection F TextLabel Previews Folders ListDockWidget All fields Unicode All activated MainView main view widget віджет головного вікна Right mouse click on a tag to add it or remove it from TagSet Клацніть правою кнопкою миші на тезі, щоб додати або вилучити його з Набору тегів <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Zoom is disabled, uncheck fit to view to enable zoom Зміну масштабу деактивовано, вимкніть підбір розміру за областю перегляду, щоб дозволити зміну Glyphs Ґлифи Clicking on a glyph will show details about it Клацніть на ґлифі, щоб отримати докладні відомості про нього Tags Теги OpenType Features Параметри OpenType Friendly Name Зрозуміла назва FT FT Font Information Інформація про шрифт Sample Text Текст зразка Fit to View Підібрати розмір Simulate screen rendering (FreeType inside) Імітувати відтворення на екрані (всередині FreeType) Use shaper Використовувати формування Right to Left Напрям письма ліворуч Coverage of Unicode Interval : Покриття проміжку Unicode: Anything selected Нічого не обрано Add Tag Додати тег +-~ +-~ Font Size Розмір шрифту pt пт part I part II Nothing selected Add a tag Settings Параметри S OpenType O Save as default Reset Default SampleText ... Layout Формат Rendering FreeType Native Qt objects World is wide Shaper type Script Text Progression push Playground Set Mode "Copy Character to Clipboard" C MainViewWidget default типовий zoom is enabled зміну масштабу дозволено zoom is disabled, uncheck fit to view to enable zoom зміну масштабу заборонено, вимкніть підбирання за роміром, щоб увімкнути 000Basic Latin 000Базова латиниця 001Latin-1 Supplement 001Латиниця-1, додаток 002Latin Extended-A 002Розширена латиниця-A 003Latin Extended-B 003Розширена латиниця-B 004IPA Extensions 004Фонетичні розширення 005Spacing Modifier Letters 005Символи пробілів 006Combining Diacritical Marks 006Комбінаційні діакритичні позначки 007Greek and Coptic 007Грецька та коптська 008Cyrillic 008Кирилиця 009Cyrillic Supplement 009Кирилиця, додаток 010Armenian 010Вірменська 011Hebrew 011Єврейська 012Arabic 012Арабська 013Syriac 013Сирійська 014Arabic Supplement 014Арабська, додаток 015Thaana 015Таана 016N'Ko 016Н'Ко 017Devanagari 017Девангарі 018Bengali 018Бенгальська 019Gurmukhi 019Гурмухі 020Gujarati 020Гуджараті 021Oriya 021Орія 022Tamil 022Тамільська 023Telugu 023Телузька 024Kannada 024Каннадьська 025Malayalam 025Малайялам 026Sinhala 026Сингальська 027Thai 027Тайська 028Lao 028Лаоська 029Tibetan 029Тибетська 030Burmese 030Бірманська 031Georgian 031Грузинська 032Hangul Jamo 032Корейська 033Ethiopic 033Ефіопська 034Ethiopic Supplement 034Ефіопська, додаток 035Cherokee 035Черокі 036Unified Canadian Aboriginal Syllabics 036Універсальна силабічна канадських аборигенів 037Ogham 037Огамічна 038Runic 038Рунічна 039Tagalog 039Тагальська 040Hanunóo 040Ганун’о 041Buhid 041Бухідська 042Tagbanwa 042Тагбанва 043Khmer 043Кхмерська 044Mongolian 044Монгольська 045Limbu 045Лімбу 046Tai Le 046Таї Ле 047New Tai Lue 047Нова Таї Ле 048Khmer Symbols 048Кхмерські символи 049Buginese 049Бугійська 050Balinese 050Балійська 051Lepcha 051Лепча 052Phonetic Extensions 052Фонетичні розширення 053Phonetic Extensions Supplement 053Фонетичні розширення, додаток 054Combining Diacritical Marks Supplement 054Комбінаційні діакритичні позначки, додаток 055Latin Extended Additional 055Розширена латиниця, додаткові 056Greek Extended 056Грецька розширена 057General Punctuation 057Знаки пунктуації 058Superscripts and Subscripts 058Нижні і верхні індекси 059Currency Symbols 059Символи грошових одиниць 060Combining Diacritical Marks for Symbols 060Комбінаційні діакритичні позначки для символів 061Letterlike Symbols 061Символи, схожі на літери 062Number Forms 062Різновиди чисел 063Arrows 063Стрілки 064Mathematical Operators 064Математичні оператори 065Miscellaneous Technical 065Технічні символи 066Control Pictures 066Контрольні піктограми 067Optical Character Recognition 067Символи оптичного розпізнавання 068Enclosed Alphanumerics 068Обведені буквено-цифрові символи 069Box Drawing 069Символи для малювання рамок 070Block Elements 070Елементи блоків 071Geometric Shapes 071Геометричні форми 072Miscellaneous Symbols 072Різноманітні символи 073Dingbats 073Декоративні символи 074Miscellaneous Mathematical Symbols-A 074Різноманітні математичні символи-A 075Supplemental Arrows-A 075Додаткові стрілки-A 076Braille Patterns 076Абетка Брайля 077Supplemental Arrows-B 077Додаткові стрілки-B 078Miscellaneous Mathematical Symbols-B 078Різноманітні математичні символи-B 079Supplemental Mathematical Operators 079Додаткові математичні оператори 080Miscellaneous Symbols and Arrows 080Різноманітні символи та стрілки 081Glagolitic 081Глаголиця 082Latin Extended-C 082Розширена латиниця-C 083Coptic 083Коптська 084Georgian Supplement 084Грузинська, додаток 085Tifinagh 085Тифінаг 086Ethiopic Extended 086Ефіопська розширена 087Supplemental Punctuation 087Знаки пунктуації, додаток 088CJK Radicals Supplement 088Ієрогліфічні радикали, додаток 089Kangxi Radicals 089Радикали Кандзі 090Ideographic Description Characters 090Ідеографічні символи опису 091CJK Symbols and Punctuation 091Ієрогліфічні символи та знаки пунктуації 092Hiragana 092Хірагана 093Katakana 093Катакана 094Bopomofo 094Бопомофо 095Hangul Compatibility Jamo 095Корейська сумісна 096Kanbun 096Китайська літературна 097Bopomofo Extended 097Розширена бопомофо 098CJK Strokes 098Ієрогліфічні штрихи 099Katakana Phonetic Extensions 099Фонетичні розширення катакани 100Enclosed CJK Letters and Months 100Обведені ієрогліфічні літери та ієрогліфи місяців 101CJK Compatibility 101Сумісні ієрогліфи 102CJK Unified Ideographs Extension A 102Універсальні ідеографічні ієрогліфи, додаток A 103Yijing Hexagram Symbols 103Символи гексаграм "Книги змін" 104CJK Unified Ideographs 104Універсальні ідеографічні ієрогліфи 105Yi Syllables 105Склади Йї 106Yi Radicals 106Радикали Йї 107Modifier Tone Letters 107Літери зі зміненою інтонацією 108Latin Extended-D 108Розширена латиниця-D 109Syloti Nagri 109Силоті Нагрі 110Phags-pa 110Фагз-па 111Hangul Syllables 111Корейські склади 112High Surrogates 112Високі замінники 113High Private Use Surrogates 113Високі замінники особистого використання 114Low Surrogates 114Низькі замінники 115Private Use Area 115Область особистого використання 116CJK Compatibility Ideographs 116Сумісні ієрогліфічні ідеограми 117Alphabetic Presentation Forms 117Форми відтворення абеток 118Arabic Presentation Forms-A 118Форми відтворення арабської-A 119Variation Selectors 119Форми вибору варіантів 120Vertical Forms 120Вертикальні форми 121Combining Half Marks 121Комбінаційні півпозначки 122CJK Compatibility Forms 122Форми сумісності ієрогліфів 123Small Form Variants 123Варіанти малих форм 124Arabic Presentation Forms-B 124Форми відтворення арабської-B 125Halfwidth and Fullwidth Forms 125Форми половинної та повної ширини 126Specials 126Спеціальні 127Supplementary Multilingual Plane (SMP) 127Додаткова багатомовна сторінка (SMP) 128Supplementary Ideographic Plane (SIP) 127Додаткова ідеографічна сторінка (SMP) 129unassigned 129Невизначені 130Supplementary Special-purpose Plane (SSP) 130Додаткова сторінка для спеціальних потреб (SMP) 131Private Use Area 1 (PUA) 131Область особистого використання 1 (PUA) 132Private Use Area 2 (PUA) 132Область особистого використання 2 (PUA) 133Un-Mapped Glyphs 133Ґлифи поза сторінками Activation event Подія активації Cancel Скасувати Activation of : Активація: Deactivation of : Деактивація: 134View all mapped glyphs 134Перегляд всіх ґлифів карти Names Назви Fontmatrix takes care of you is activated. If you want to remove it from Fontmatrix database, please deactivate it first. Fontmatrix safe You are about to remove a font from Fontmatrix database Do you want to continue? Welcome to Fontmatrix PrefsPanel Preferences Panel Панель уподобань General Загальні Ask confirmation when activating or deactivating all fonts Підтверджувати активацію та деактивацію всіх шрифтів Add Додати Validate Перевірити Layout Формат pt пт Apply Застосувати Show Fontmatrix in System Tray Показувати Fontmatrix у системному лотку Close to System Tray Закривати до системного лотка Show Activate All and Deactivate All in the System Tray menu Показувати пункти "Активувати всі" та "Деактивувати всі" у меню системного лотка Ask confirmation when activating or deactivating fonts by tags Підтверджувати активацію та деактивацію шрифтів за тегами Preview Word Слово для перегляду Font Editor Редактор шрифтів /usr/bin/fontforge /usr/bin/fontforge Browse... Пошук... Ask for tag names when importing fonts Питати про назви тегів під час імпорту шрифтів Sample Text Текст зразка Named Sample Texts Іменовані тексти зразків Font Size: Розмір шрифту: Interline: Міжрядковий інтервал: Preferences Уподобання Remove Вилучити Close Закрити Show "All" actions is RTL size Add the full path to your preferred font editor Show names of imported fonts after import process Show splash at startup Don’t use preferred name scheme (will affect only newly imported fonts) Initial Layout Hyphenation Left: Right: Dictionary: Browse ... Templates Folder Remote directories http:// Local storage Files and Folders Change TextLabel Shortcuts PrefsPanelDialog Looks like your setup does not have a system tray available. Схоже, у ваших налаштуваннях взагалі відсутній системний лоток. A text Текст Select font editor Оберіть редактор шрифтів Select Templates Folder Select Where remote font files will be stored Please select an item in the list or create a new one. Alt Ctrl Shift Meta Meta+ Shift+ Alt+ Ctrl+ Replace Shortcut is already in use for action name will be appended to this Do you still want to assign it? Action Дія Shortcut Tip Select hyphenation dictionary QObject codepoint is U+ кодовою точкою є U+ family сім’я headline заголовок body тіло style стиль Creating font book... Створення книги шрифтів... cancel скасувати Copying files Unable to copy ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv default типовий Mark, NonSpacing Mark, SpacingCombining Mark, Enclosing Number, DecimalDigit Number, Letter Number, Other Separator, Space Separator, Line Separator, Paragraph Other, Control Other, Format Other, Surrogate Other, PrivateUse Other, NotAssigned Letter, Uppercase Letter, Lowercase Letter, Titlecase Letter, Modifier Letter, Other Punctuation, Connector Punctuation, Dash Punctuation, Open Punctuation, Close Punctuation, InitialQuote Punctuation, FinalQuote Punctuation, Other Symbol, Math Symbol, Currency Symbol, Modifier Symbol, Other RemoteDir Downloading Systray &Activate all &Активувати всі &Deactivate all &Деактивувати всі Mi&nimize Мі&німізувати &Restore &Відновити &Tags &Теги E&xit Ви&йти TagSetDialog TagSet editor Редактор набору тегів Collections of Tags Збірки тегів Add selected tag to current set. Додати обраний тег до поточного набору. Collections Збірки New Створити delete Вилучити Close Закрити Available Tags Доступні теги Add Додати Remove Вилучити TextProgressionWidget Form Формувати Inline progression e.g. Latin text Left to right e.g. Arabic text Right to left e.g. Traditional Chinese & Japanese text Top to bottom e.g. Runic text Bottom to top Block progression e.g. Tarditionnal Chinese & Japanes text e.g. Traditional Mongolian text repairDialog Dialog Діалог Remove Вилучити Close Закрити Select all Dead links Re-link Deactivate Activated Not Linked De-link Activate Deactivated Linked typotek Add Directory Додати теку &Import... &Імпортувати... Ctrl+O Ctrl+O Import a directory Імпортувати з теки &Save &Зберегти Ctrl+S Ctrl+S Save the document to disk Зберегти документ на диск Print... Надрукувати... Print a specimen of the current font Надрукувати зразок поточного шрифту Export font book... Експортувати книгу шрифтів... Export a pdf that show selected fonts Експортувати до pdf з демонстрацією обраних шрифтів E&xit Ви&йти Ctrl+Q Ctrl+Q Exit the application Вийти з програми &About &Про програму Show the Typotek's About box Показати діалог з інформацією Typotek Help Довідка &Tag Sets &Набори тегів Edit current font Редагувати поточний шрифт &File &Файл Edit Правка &Help &Довідка Ready Готово Print specimen Надрукувати зразок There is no font selected Не обрано жодного шрифту Support of DragNDrop over http is sheduled but not yet effective Робота з впровадження технології "Перетягни і відпусти" триває You bring something over me I can’t handle Ви надали програмі щось таке, з чим вона не може впоратися Fontmatrix Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Програма продовжить працювати у системному лотку. Щоб припинити виконання програми, оберіть пункт <b>Вийти</b> у контекстному меню елемента системного лотка. Preferences Уподобання You provided an empty string, it’s not fair Ви ввели порожній рядок, так нечесно "default" is a reserved keyword "default" є зарезервованим ключовим словом Activate all current Активувати всі поточні Deactivate all current Деактивувати всі поточні Try to run font editor with the selected font as argument Спробувати запустити редактор шрифтів з аргументом у вигляді назви обраного шрифту You don't seem to have font editor installed. Path to font editor can be set in preferences. Здається, ви не встановили редактора шрифтів. Шлях до програми редактора можна встановити в уподобаннях. Lists Списки Nothing Selected Нічого не обрано Initial tags. The string you type will be split by "#" to obtain a tags list. Початкові теги. Рядок, який ви введете, буде розбито за символами "#" на список тегів. Importing font files... Імпортування файлів шрифтів... cancel скасувати Import Імпортувати Fontmatrix care Задача Fontmatrix You are about to activate a bunch of fonts, it is time to cancel if it was not your intent Ви збираєтеся активувати групу шрифтів, якщо ви не мали наміру це робити, ще не пізно скасувати дію You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent Ви збираєтеся деактивувати групу шрифтів,якщо ви не мали наміру це робити, ще не пізно скасувати дію Can’t import this font because it’s broken : Цей шрифт неможливо імпортувати, оскільки його пошкоджено: Choose the tag for filter exported fonts Choose Directory Export &Fonts Export a fontset Check Database Tag All... Load settings Check for Fontmatrix own dir Loading fonts present in database Catching font descriptions from network Collected System Font Adding fonts from system directories fonts available from system font descriptions imported from network Browse Fonts default типовий "default" is a reserved Fonts imported: %1 Print Info... Print informations about the current font Print Sample... Print the sample as a specimen Print Chart... Print a chart of the current font Print Playground... Print the playground Print Family... Print a specimen of the whole family the current face belongs to About &Qt Next Family Next Face Previous Family Previous Face Layout Options Print &Edit &Browse Fontmatrix - data warning Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Unicode All fields Welcome maessage Print Infos Print Chart Print Playground Print Family fontmatrix-0.6.0+svn20110930/src/messages/about_fi.html0000644000175000017500000000132411035713362021405 0ustar malexmalex

Fontmatrix

Ohjelma fonttien hallintaan Linuxille

Fontmatrix on apuväline graafisille suunnittelijoille, jotka joutuvat työskentelemään satojen ehkä jopa tuhansien fonttien kanssa. Fontmatrixin kanssa ei ohjelmissa tarvitse selailla ylipitkiä fonttiluetteloita.

Yksinkertaistettuna Fontmatrix auttaa sinua kolmessa asiassa:

  • fonttien käyttöönotossa ja käytöstä poistamisessa
  • fonttien luokittelussa
  • PDF-fonttikirjan tekemisessä

Lisää tietoa löytyy osoitteesta fontmatrix.net

fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-zh_TW.ts0000644000175000017500000035020211023736606022530 0ustar malexmalex About About Fontmatrix TextLabel Splash The Project The People Close AboutWidget version fonts loaded BookExportDialog Export Font Book Output Browse... FMLayout Text engine options FolderViewMenu Reload Tree Import Directory Import recursively Import File FontBookDialog Save fontBook FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Copyright Font Family Font Subfamily Unique font identifier Full font name Version string Postscript name Trademark Manufacturer Designer Description URL Vendor URL Designer License Description License Info URL Reserved Preferred Family Preferred Subfamily Compatible Full (Macintosh only) Sample text PostScript CID findfont name Fontmatrix - Download Downloading %1. Any No Fit Text and Display Script Decorative Pictorial Family Type Cove Obtuse Cove Square Cove Obtuse Square Cove Square Thin Bone Exaggerated Triangle Normal Sans Obtuse Sans Perp Sans Flared Rounded Serif style Very Light Light Book Medium Demi Bold Heavy Black Nord Weight Old Style Modern Even Width Expanded Condensed Very Expanded Very Condensed Monospaced Proportion None Very Low Low Medium Low Medium High High Very High Contrast Gradual/Diagonal Gradual/Transitional Gradual/Vertical Gradual/Horizontal Rapid/Vertical Rapid/Horizontal Instant/Vertical Stroke Variation Straight Arms/Horizontal Straight Arms/Wedge Straight Arms/Vertical Straight Arms/Single Serif Straight Arms/Double Serif Non-Straight Arms/Horizontal Non-Straight Arms/Wedge Non-Straight Arms/Vertical Non-Straight Arms/Single Serif Non-Straight Arms/Double Serif Arm Style Normal/Contact Normal/Weighted Normal/Boxed Normal/Flattened Normal/Rounded Normal/Off Center Normal/Square Oblique/Contact Oblique/Weighted Oblique/Boxed Oblique/Flattened Oblique/Rounded Oblique/Off Center Oblique/Square Letterform Standard/Trimmed Standard/Pointed Standard/Serifed High/Trimmed High/Pointed High/Serifed Constant/Trimmed Constant/Pointed Constant/Serifed Low/Trimmed Low/Pointed Low/Serifed Midline Constant/Small Constant/Standard Constant/Large Ducking/Small Ducking/Standard Ducking/Large X-Height Category Help Fontmatrix Help ImportTagsDialog Fontmatrix - Tags Add Ok ImportedFonts Dialog Imported Fonts Ok <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> Do not show this dialog again ImportedFontsDialog (not loaded) Number of Imported Fonts LayoutOptionWidget Form Weights score before exact after end penalty H-penalty ListDock Form Tag: Filter view by chosing tag Switch to panose filtering P Filter: Field selection F TextLabel Show complete collection of available fonts Names Files Previews Folders ListDockWidget All fields Unicode All activated MainView part I part II main view widget Nothing selected Right mouse click on a tag to add it or remove it from TagSet Add a tag Font Information Settings S OpenType O OpenType Features Friendly Name Save as default Reset Default SampleText ... Layout Font Size pt Rendering FreeType Native Qt objects World is wide Shaper type Script Use shaper Text Progression Sample Text Coverage of Unicode Interval : Clicking on a glyph will show details about it Glyphs push Playground Set Mode "Copy Character to Clipboard" C MainViewWidget Names Activation event Cancel Activation of : Deactivation of : 000Basic Latin 001Latin-1 Supplement 002Latin Extended-A 003Latin Extended-B 004IPA Extensions 005Spacing Modifier Letters 006Combining Diacritical Marks 007Greek and Coptic 008Cyrillic 009Cyrillic Supplement 010Armenian 011Hebrew 012Arabic 013Syriac 014Arabic Supplement 015Thaana 016N'Ko 017Devanagari 018Bengali 019Gurmukhi 020Gujarati 021Oriya 022Tamil 023Telugu 024Kannada 025Malayalam 026Sinhala 027Thai 028Lao 029Tibetan 030Burmese 031Georgian 032Hangul Jamo 033Ethiopic 034Ethiopic Supplement 035Cherokee 036Unified Canadian Aboriginal Syllabics 037Ogham 038Runic 039Tagalog 040Hanunóo 041Buhid 042Tagbanwa 043Khmer 044Mongolian 045Limbu 046Tai Le 047New Tai Lue 048Khmer Symbols 049Buginese 050Balinese 051Lepcha 052Phonetic Extensions 053Phonetic Extensions Supplement 054Combining Diacritical Marks Supplement 055Latin Extended Additional 056Greek Extended 057General Punctuation 058Superscripts and Subscripts 059Currency Symbols 060Combining Diacritical Marks for Symbols 061Letterlike Symbols 062Number Forms 063Arrows 064Mathematical Operators 065Miscellaneous Technical 066Control Pictures 067Optical Character Recognition 068Enclosed Alphanumerics 069Box Drawing 070Block Elements 071Geometric Shapes 072Miscellaneous Symbols 073Dingbats 074Miscellaneous Mathematical Symbols-A 075Supplemental Arrows-A 076Braille Patterns 077Supplemental Arrows-B 078Miscellaneous Mathematical Symbols-B 079Supplemental Mathematical Operators 080Miscellaneous Symbols and Arrows 081Glagolitic 082Latin Extended-C 083Coptic 084Georgian Supplement 085Tifinagh 086Ethiopic Extended 087Supplemental Punctuation 088CJK Radicals Supplement 089Kangxi Radicals 090Ideographic Description Characters 091CJK Symbols and Punctuation 092Hiragana 093Katakana 094Bopomofo 095Hangul Compatibility Jamo 096Kanbun 097Bopomofo Extended 098CJK Strokes 099Katakana Phonetic Extensions 100Enclosed CJK Letters and Months 101CJK Compatibility 102CJK Unified Ideographs Extension A 103Yijing Hexagram Symbols 104CJK Unified Ideographs 105Yi Syllables 106Yi Radicals 107Modifier Tone Letters 108Latin Extended-D 109Syloti Nagri 110Phags-pa 111Hangul Syllables 112High Surrogates 113High Private Use Surrogates 114Low Surrogates 115Private Use Area 116CJK Compatibility Ideographs 117Alphabetic Presentation Forms 118Arabic Presentation Forms-A 119Variation Selectors 120Vertical Forms 121Combining Half Marks 122CJK Compatibility Forms 123Small Form Variants 124Arabic Presentation Forms-B 125Halfwidth and Fullwidth Forms 126Specials 127Supplementary Multilingual Plane (SMP) 128Supplementary Ideographic Plane (SIP) 129unassigned 130Supplementary Special-purpose Plane (SSP) 131Private Use Area 1 (PUA) 132Private Use Area 2 (PUA) 133Un-Mapped Glyphs 134View all mapped glyphs Fontmatrix takes care of you is activated. If you want to remove it from Fontmatrix database, please deactivate it first. Fontmatrix safe You are about to remove a font from Fontmatrix database Do you want to continue? Welcome to Fontmatrix PrefsPanel Preferences Panel Preferences Show Fontmatrix in System Tray Close to System Tray Show "All" actions Ask confirmation when activating or deactivating all fonts Ask confirmation when activating or deactivating fonts by tags Preview Word is RTL size pt Font Editor Add the full path to your preferred font editor /usr/bin/fontforge Browse... Ask for tag names when importing fonts Show names of imported fonts after import process Show splash at startup Don’t use preferred name scheme (will affect only newly imported fonts) General Named Sample Texts Add Initial Layout Font Size: Interline: Hyphenation Left: Right: Dictionary: Browse ... Apply Sample Text Templates Folder Remote directories http:// Remove Local storage Files and Folders Change TextLabel Shortcuts Close PrefsPanelDialog Looks like your setup does not have a system tray available. A text Select font editor Select Templates Folder Select Where remote font files will be stored Please select an item in the list or create a new one. Alt Ctrl Shift Meta Meta+ Shift+ Alt+ Ctrl+ Replace Shortcut is already in use for action name will be appended to this Do you still want to assign it? Action Shortcut Tip Select hyphenation dictionary QObject Copying files cancel Unable to copy ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv Creating font book... codepoint is U+ Mark, NonSpacing Mark, SpacingCombining Mark, Enclosing Number, DecimalDigit Number, Letter Number, Other Separator, Space Separator, Line Separator, Paragraph Other, Control Other, Format Other, Surrogate Other, PrivateUse Other, NotAssigned Letter, Uppercase Letter, Lowercase Letter, Titlecase Letter, Modifier Letter, Other Punctuation, Connector Punctuation, Dash Punctuation, Open Punctuation, Close Punctuation, InitialQuote Punctuation, FinalQuote Punctuation, Other Symbol, Math Symbol, Currency Symbol, Modifier Symbol, Other RemoteDir Downloading Systray &Activate all &Deactivate all Mi&nimize &Restore E&xit &Tags TagSetDialog TagSet editor Collections of Tags Available Tags Add selected tag to current set. Add Collections New delete Remove Close TextProgressionWidget Form Inline progression e.g. Latin text Left to right e.g. Arabic text Right to left e.g. Traditional Chinese & Japanese text Top to bottom e.g. Runic text Bottom to top Block progression e.g. Tarditionnal Chinese & Japanes text e.g. Traditional Mongolian text repairDialog Dialog Select all Remove Dead links Re-link Deactivate Activated Not Linked De-link Activate Deactivated Linked Close typotek Nothing Selected Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Add Directory Importing font files... cancel Import Can’t import this font because it’s broken : Choose the tag for filter exported fonts Choose Directory &Import... Ctrl+O Import a directory &Save Ctrl+S Save the document to disk Export &Fonts Export a fontset Export font book... Export a pdf that show selected fonts E&xit Ctrl+Q Exit the application &About Show the Typotek's About box Help &Tag Sets Activate all current Deactivate all current Edit current font Try to run font editor with the selected font as argument You don't seem to have font editor installed. Path to font editor can be set in preferences. Preferences Check Database Tag All... &File &Help Ready Load settings Check for Fontmatrix own dir Loading fonts present in database Collected System Font Adding fonts from system directories fonts available from system Catching font descriptions from network font descriptions imported from network Fontmatrix care You are about to activate a bunch of fonts, it is time to cancel if it was not your intent You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent There is no font selected Support of DragNDrop over http is sheduled but not yet effective You bring something over me I can’t handle You provided an empty string, it’s not fair Browse Fonts default "default" is a reserved Fonts imported: %1 Print Info... Print informations about the current font Print Sample... Print the sample as a specimen Print Chart... Print a chart of the current font Print Playground... Print the playground Print Family... Print a specimen of the whole family the current face belongs to About &Qt Next Family Next Face Previous Family Previous Face Layout Options Print &Edit &Browse Fontmatrix - data warning Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Unicode All fields Welcome maessage Print Infos Print Chart Print Playground Print Family fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-da.ts0000644000175000017500000037340211023736606022070 0ustar malexmalex About About Fontmatrix Om Fontmatrix TextLabel Splash The Project The People Close AboutWidget version fonts loaded BookExportDialog Dialog Dialog Font book options Fontbog alternativer File Fil Browse... Gennemse... Paper Size Papirst�rrelse X-Pos Horisontal position Family Familie Style Stil Text Tekst Font size Skriftst�rrelse Family Familie Style Stil Headline Overskrift Body Hovedtekst Sample text Eksempeltekst Export Font Book Output FMLayout Text engine options FolderViewMenu Reload Tree Import Directory Import recursively Import File FontAction action handling Add Tag Tilf�j Tag FontBookDialog Save fontBook FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Font Subfamily Full font name Version string Description Copyright Font Family Unique font identifier Postscript name Trademark Manufacturer Designer URL Vendor URL Designer License Description License Info URL Reserved Preferred Family Preferred Subfamily Compatible Full (Macintosh only) Sample text PostScript CID findfont name Fontmatrix - Download Downloading %1. Any No Fit Text and Display Script Decorative Pictorial Family Type Cove Obtuse Cove Square Cove Obtuse Square Cove Square Thin Bone Exaggerated Triangle Normal Sans Obtuse Sans Perp Sans Flared Rounded Serif style Very Light Light Book Medium Demi Bold Heavy Black Nord Weight Old Style Modern Even Width Expanded Condensed Very Expanded Very Condensed Monospaced Proportion None Very Low Low Medium Low Medium High High Very High Contrast Gradual/Diagonal Gradual/Transitional Gradual/Vertical Gradual/Horizontal Rapid/Vertical Rapid/Horizontal Instant/Vertical Stroke Variation Straight Arms/Horizontal Straight Arms/Wedge Straight Arms/Vertical Straight Arms/Single Serif Straight Arms/Double Serif Non-Straight Arms/Horizontal Non-Straight Arms/Wedge Non-Straight Arms/Vertical Non-Straight Arms/Single Serif Non-Straight Arms/Double Serif Arm Style Normal/Contact Normal/Weighted Normal/Boxed Normal/Flattened Normal/Rounded Normal/Off Center Normal/Square Oblique/Contact Oblique/Weighted Oblique/Boxed Oblique/Flattened Oblique/Rounded Oblique/Off Center Oblique/Square Letterform Standard/Trimmed Standard/Pointed Standard/Serifed High/Trimmed High/Pointed High/Serifed Constant/Trimmed Constant/Pointed Constant/Serifed Low/Trimmed Low/Pointed Low/Serifed Midline Constant/Small Constant/Standard Constant/Large Ducking/Small Ducking/Standard Ducking/Large X-Height Category Help Fontmatrix Help Fontmatrix Hj�lp ImportTagsDialog Dialog Dialog Fontmatrix - Tags Add Ok ImportedFonts Dialog Dialog Imported fonts Importerede skrifttyper Imported Fonts Ok <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> Do not show this dialog again ImportedFontsDialog (not loaded) Number of Imported Fonts LayoutOptionWidget Form Weights score before exact after end penalty H-penalty ListDock Search through font informations S�g i fontinformationer Search S�g Respect entered text case when searching Skil mellem store og sm� bogstaver ved s�gning Case sensitive Forskel store/sm� Tag Tag Filter view by chosing tag Begr�ns til tag TagSet Taggruppe Show only fonts that belong to chosen tagset Vis kun skrifttyper som tilh�rer den valgte Taggruppe Names Navne Files Filer Preview Testside Show complete collection of available fonts Vis alle tilg�ngelige skrifttyper View all Vis alle Show all activated fonts Vis alle aktive fonter View activated Vis aktive Form Tag: Switch to panose filtering P Filter: Field selection F TextLabel Previews Folders ListDockWidget All fields Unicode All activated MainView Right mouse click on a tag to add it or remove it from TagSet H�jreklik p� en Tag for at l�gge den til eller fjerne den fra en Taggruppe Font Info Skrifttypeinformation Sample text Pr�vetekst Customising text used for preview rendering Rediger tekst til pr�veside Sample text... Pr�vetekst... Fit to view Tilpas til vindue Zoom is disabled, uncheck fit to view to enable zoom Zoom er deaktiveret, frav�lg Tilpas til vindue for at aktivere zoom Glyphs Tegn No glyph selected Intet tegn valgt Clicking on a glyph will show details about it Klik p� et tegn for at vise tegninformation Tags Tagger Add Tag Tilf�j Tag part I part II main view widget Nothing selected Add a tag Font Information Settings S OpenType O OpenType Features Friendly Name Save as default Reset Default SampleText ... Layout Font Size pt Rendering FreeType Native Qt objects World is wide Shaper type Script Use shaper Text Progression Sample Text Coverage of Unicode Interval : push Playground Set Mode "Copy Character to Clipboard" C MainViewWidget Activation event Cancel Activation of : Deactivation of : 000Basic Latin 001Latin-1 Supplement 002Latin Extended-A 003Latin Extended-B 004IPA Extensions 005Spacing Modifier Letters 006Combining Diacritical Marks 007Greek and Coptic 008Cyrillic 009Cyrillic Supplement 010Armenian 011Hebrew 012Arabic 013Syriac 014Arabic Supplement 015Thaana 016N'Ko 017Devanagari 018Bengali 019Gurmukhi 020Gujarati 021Oriya 022Tamil 023Telugu 024Kannada 025Malayalam 026Sinhala 027Thai 028Lao 029Tibetan 030Burmese 031Georgian 032Hangul Jamo 033Ethiopic 034Ethiopic Supplement 035Cherokee 036Unified Canadian Aboriginal Syllabics 037Ogham 038Runic 039Tagalog 040Hanunóo 041Buhid 042Tagbanwa 043Khmer 044Mongolian 045Limbu 046Tai Le 047New Tai Lue 048Khmer Symbols 049Buginese 050Balinese 051Lepcha 052Phonetic Extensions 053Phonetic Extensions Supplement 054Combining Diacritical Marks Supplement 055Latin Extended Additional 056Greek Extended 057General Punctuation 058Superscripts and Subscripts 059Currency Symbols 060Combining Diacritical Marks for Symbols 061Letterlike Symbols 062Number Forms 063Arrows 064Mathematical Operators 065Miscellaneous Technical 066Control Pictures 067Optical Character Recognition 068Enclosed Alphanumerics 069Box Drawing 070Block Elements 071Geometric Shapes 072Miscellaneous Symbols 073Dingbats 074Miscellaneous Mathematical Symbols-A 075Supplemental Arrows-A 076Braille Patterns 077Supplemental Arrows-B 078Miscellaneous Mathematical Symbols-B 079Supplemental Mathematical Operators 080Miscellaneous Symbols and Arrows 081Glagolitic 082Latin Extended-C 083Coptic 084Georgian Supplement 085Tifinagh 086Ethiopic Extended 087Supplemental Punctuation 088CJK Radicals Supplement 089Kangxi Radicals 090Ideographic Description Characters 091CJK Symbols and Punctuation 092Hiragana 093Katakana 094Bopomofo 095Hangul Compatibility Jamo 096Kanbun 097Bopomofo Extended 098CJK Strokes 099Katakana Phonetic Extensions 100Enclosed CJK Letters and Months 101CJK Compatibility 102CJK Unified Ideographs Extension A 103Yijing Hexagram Symbols 104CJK Unified Ideographs 105Yi Syllables 106Yi Radicals 107Modifier Tone Letters 108Latin Extended-D 109Syloti Nagri 110Phags-pa 111Hangul Syllables 112High Surrogates 113High Private Use Surrogates 114Low Surrogates 115Private Use Area 116CJK Compatibility Ideographs 117Alphabetic Presentation Forms 118Arabic Presentation Forms-A 119Variation Selectors 120Vertical Forms 121Combining Half Marks 122CJK Compatibility Forms 123Small Form Variants 124Arabic Presentation Forms-B 125Halfwidth and Fullwidth Forms 126Specials 127Supplementary Multilingual Plane (SMP) 128Supplementary Ideographic Plane (SIP) 129unassigned 130Supplementary Special-purpose Plane (SSP) 131Private Use Area 1 (PUA) 132Private Use Area 2 (PUA) 133Un-Mapped Glyphs 134View all mapped glyphs Names Navne Fontmatrix takes care of you is activated. If you want to remove it from Fontmatrix database, please deactivate it first. Fontmatrix safe You are about to remove a font from Fontmatrix database Do you want to continue? Welcome to Fontmatrix PrefsPanel Browse... Gennemse... Close Luk Preferences Panel Preferences Show Fontmatrix in System Tray Close to System Tray Show "All" actions Ask confirmation when activating or deactivating all fonts Ask confirmation when activating or deactivating fonts by tags Preview Word is RTL size pt Font Editor Add the full path to your preferred font editor /usr/bin/fontforge Ask for tag names when importing fonts Show names of imported fonts after import process Show splash at startup Don’t use preferred name scheme (will affect only newly imported fonts) General Named Sample Texts Add Initial Layout Font Size: Interline: Hyphenation Left: Right: Dictionary: Browse ... Apply Sample Text Templates Folder Remote directories http:// Remove Local storage Files and Folders Change TextLabel Shortcuts PrefsPanelDialog Looks like your setup does not have a system tray available. A text Select font editor Select Templates Folder Select Where remote font files will be stored Please select an item in the list or create a new one. Alt Ctrl Shift Meta Meta+ Shift+ Alt+ Ctrl+ Replace Shortcut is already in use for action name will be appended to this Do you still want to assign it? Action Shortcut Tip Select hyphenation dictionary QObject codepoint is U+ tegnkode er U+ Creating font book... cancel Copying files Unable to copy ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv Mark, NonSpacing Mark, SpacingCombining Mark, Enclosing Number, DecimalDigit Number, Letter Number, Other Separator, Space Separator, Line Separator, Paragraph Other, Control Other, Format Other, Surrogate Other, PrivateUse Other, NotAssigned Letter, Uppercase Letter, Lowercase Letter, Titlecase Letter, Modifier Letter, Other Punctuation, Connector Punctuation, Dash Punctuation, Open Punctuation, Close Punctuation, InitialQuote Punctuation, FinalQuote Punctuation, Other Symbol, Math Symbol, Currency Symbol, Modifier Symbol, Other RemoteDir Downloading Systray &Activate all &Deactivate all Mi&nimize &Restore E&xit &Tags TagSetDialog TagSet editor Rediger Taggrupper Collections of Tags Taggrupper Available tags Tilg�ngelige tagger Add selected tag to current set. L�g valgt tag til den aktive Taggruppe. add Tilf�j Collections Grupper New Ny delete Slet remove Fjern Close Luk Available Tags Add Remove TextProgressionWidget Form Inline progression e.g. Latin text Left to right e.g. Arabic text Right to left e.g. Traditional Chinese & Japanese text Top to bottom e.g. Runic text Bottom to top Block progression e.g. Tarditionnal Chinese & Japanes text e.g. Traditional Mongolian text repairDialog Dialog Dialog Close Luk Select all Remove Dead links Re-link Deactivate Activated Not Linked De-link Activate Deactivated Linked typotek Add Directory Tilf�j mappe &Import... Importer... Ctrl+O Import a directory Importer en mappe &Save &Gem Ctrl+S Save the document to disk Gem dokumentet Print... Udskriv... Print a specimen of the current font Udskriv en pr�veside af valgt skrifttype Export font book... Eksporter Fontbog... Export a pdf that show selected fonts Eksporter en pdf-fil med de valgte skrifttyper E&xit &Afslut Ctrl+Q Exit the application Afslut programmet &About &Om Show the Typotek's About box Vis information om Fontmatrix Help Hj�lp &Tag Sets &Taggrupper Activate all currents Aktiver alle valgte Deactivate all currents Deaktiver alle valgte Edit current font Rediger markeret skrifttype Try to run Fontforge with the selected font as argument Fors�g at �bne markeret skrifttype i Fontforge &File &Fil Edit Rediger &Help &Hj�lp Ready Ferdig Print specimen Udskriv pr�veside There is no font selected Ingen skrifttype valgt Support of DragNDrop over http is sheduled but not yet effective Tr�k-og-slip over http er planlagt men endnu ikke i funktion You bring something over me I can’t handle Objektet kan ikke slippes her Nothing Selected Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Importing font files... cancel Import Can’t import this font because it’s broken : Activate all current Deactivate all current Try to run font editor with the selected font as argument You don't seem to have font editor installed. Path to font editor can be set in preferences. Preferences Fontmatrix care You are about to activate a bunch of fonts, it is time to cancel if it was not your intent You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent You provided an empty string, it’s not fair Choose the tag for filter exported fonts Choose Directory Export &Fonts Export a fontset Check Database Tag All... Load settings Check for Fontmatrix own dir Loading fonts present in database Catching font descriptions from network Collected System Font Adding fonts from system directories fonts available from system font descriptions imported from network Browse Fonts default "default" is a reserved Fonts imported: %1 Print Info... Print informations about the current font Print Sample... Print the sample as a specimen Print Chart... Print a chart of the current font Print Playground... Print the playground Print Family... Print a specimen of the whole family the current face belongs to About &Qt Next Family Next Face Previous Family Previous Face Layout Options Print &Edit &Browse Fontmatrix - data warning Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Unicode All fields Welcome maessage Print Infos Print Chart Print Playground Print Family fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-no.ts0000644000175000017500000035020211023736606022111 0ustar malexmalex About About Fontmatrix TextLabel Splash The Project The People Close AboutWidget version fonts loaded BookExportDialog Export Font Book Output Browse... FMLayout Text engine options FolderViewMenu Reload Tree Import Directory Import recursively Import File FontBookDialog Save fontBook FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Copyright Font Family Font Subfamily Unique font identifier Full font name Version string Postscript name Trademark Manufacturer Designer Description URL Vendor URL Designer License Description License Info URL Reserved Preferred Family Preferred Subfamily Compatible Full (Macintosh only) Sample text PostScript CID findfont name Fontmatrix - Download Downloading %1. Any No Fit Text and Display Script Decorative Pictorial Family Type Cove Obtuse Cove Square Cove Obtuse Square Cove Square Thin Bone Exaggerated Triangle Normal Sans Obtuse Sans Perp Sans Flared Rounded Serif style Very Light Light Book Medium Demi Bold Heavy Black Nord Weight Old Style Modern Even Width Expanded Condensed Very Expanded Very Condensed Monospaced Proportion None Very Low Low Medium Low Medium High High Very High Contrast Gradual/Diagonal Gradual/Transitional Gradual/Vertical Gradual/Horizontal Rapid/Vertical Rapid/Horizontal Instant/Vertical Stroke Variation Straight Arms/Horizontal Straight Arms/Wedge Straight Arms/Vertical Straight Arms/Single Serif Straight Arms/Double Serif Non-Straight Arms/Horizontal Non-Straight Arms/Wedge Non-Straight Arms/Vertical Non-Straight Arms/Single Serif Non-Straight Arms/Double Serif Arm Style Normal/Contact Normal/Weighted Normal/Boxed Normal/Flattened Normal/Rounded Normal/Off Center Normal/Square Oblique/Contact Oblique/Weighted Oblique/Boxed Oblique/Flattened Oblique/Rounded Oblique/Off Center Oblique/Square Letterform Standard/Trimmed Standard/Pointed Standard/Serifed High/Trimmed High/Pointed High/Serifed Constant/Trimmed Constant/Pointed Constant/Serifed Low/Trimmed Low/Pointed Low/Serifed Midline Constant/Small Constant/Standard Constant/Large Ducking/Small Ducking/Standard Ducking/Large X-Height Category Help Fontmatrix Help ImportTagsDialog Fontmatrix - Tags Add Ok ImportedFonts Dialog Imported Fonts Ok <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> Do not show this dialog again ImportedFontsDialog (not loaded) Number of Imported Fonts LayoutOptionWidget Form Weights score before exact after end penalty H-penalty ListDock Form Tag: Filter view by chosing tag Switch to panose filtering P Filter: Field selection F TextLabel Show complete collection of available fonts Names Files Previews Folders ListDockWidget All fields Unicode All activated MainView part I part II main view widget Nothing selected Right mouse click on a tag to add it or remove it from TagSet Add a tag Font Information Settings S OpenType O OpenType Features Friendly Name Save as default Reset Default SampleText ... Layout Font Size pt Rendering FreeType Native Qt objects World is wide Shaper type Script Use shaper Text Progression Sample Text Coverage of Unicode Interval : Clicking on a glyph will show details about it Glyphs push Playground Set Mode "Copy Character to Clipboard" C MainViewWidget 000Basic Latin 001Latin-1 Supplement 002Latin Extended-A 003Latin Extended-B 004IPA Extensions 005Spacing Modifier Letters 006Combining Diacritical Marks 007Greek and Coptic 008Cyrillic 009Cyrillic Supplement 010Armenian 011Hebrew 012Arabic 013Syriac 014Arabic Supplement 015Thaana 016N'Ko 017Devanagari 018Bengali 019Gurmukhi 020Gujarati 021Oriya 022Tamil 023Telugu 024Kannada 025Malayalam 026Sinhala 027Thai 028Lao 029Tibetan 030Burmese 031Georgian 032Hangul Jamo 033Ethiopic 034Ethiopic Supplement 035Cherokee 036Unified Canadian Aboriginal Syllabics 037Ogham 038Runic 039Tagalog 040Hanunóo 041Buhid 042Tagbanwa 043Khmer 044Mongolian 045Limbu 046Tai Le 047New Tai Lue 048Khmer Symbols 049Buginese 050Balinese 051Lepcha 052Phonetic Extensions 053Phonetic Extensions Supplement 054Combining Diacritical Marks Supplement 055Latin Extended Additional 056Greek Extended 057General Punctuation 058Superscripts and Subscripts 059Currency Symbols 060Combining Diacritical Marks for Symbols 061Letterlike Symbols 062Number Forms 063Arrows 064Mathematical Operators 065Miscellaneous Technical 066Control Pictures 067Optical Character Recognition 068Enclosed Alphanumerics 069Box Drawing 070Block Elements 071Geometric Shapes 072Miscellaneous Symbols 073Dingbats 074Miscellaneous Mathematical Symbols-A 075Supplemental Arrows-A 076Braille Patterns 077Supplemental Arrows-B 078Miscellaneous Mathematical Symbols-B 079Supplemental Mathematical Operators 080Miscellaneous Symbols and Arrows 081Glagolitic 082Latin Extended-C 083Coptic 084Georgian Supplement 085Tifinagh 086Ethiopic Extended 087Supplemental Punctuation 088CJK Radicals Supplement 089Kangxi Radicals 090Ideographic Description Characters 091CJK Symbols and Punctuation 092Hiragana 093Katakana 094Bopomofo 095Hangul Compatibility Jamo 096Kanbun 097Bopomofo Extended 098CJK Strokes 099Katakana Phonetic Extensions 100Enclosed CJK Letters and Months 101CJK Compatibility 102CJK Unified Ideographs Extension A 103Yijing Hexagram Symbols 104CJK Unified Ideographs 105Yi Syllables 106Yi Radicals 107Modifier Tone Letters 108Latin Extended-D 109Syloti Nagri 110Phags-pa 111Hangul Syllables 112High Surrogates 113High Private Use Surrogates 114Low Surrogates 115Private Use Area 116CJK Compatibility Ideographs 117Alphabetic Presentation Forms 118Arabic Presentation Forms-A 119Variation Selectors 120Vertical Forms 121Combining Half Marks 122CJK Compatibility Forms 123Small Form Variants 124Arabic Presentation Forms-B 125Halfwidth and Fullwidth Forms 126Specials 127Supplementary Multilingual Plane (SMP) 128Supplementary Ideographic Plane (SIP) 129unassigned 130Supplementary Special-purpose Plane (SSP) 131Private Use Area 1 (PUA) 132Private Use Area 2 (PUA) 133Un-Mapped Glyphs Activation event Cancel Activation of : Deactivation of : Names 134View all mapped glyphs Fontmatrix takes care of you is activated. If you want to remove it from Fontmatrix database, please deactivate it first. Fontmatrix safe You are about to remove a font from Fontmatrix database Do you want to continue? Welcome to Fontmatrix PrefsPanel Preferences Panel Preferences Show Fontmatrix in System Tray Close to System Tray Show "All" actions Ask confirmation when activating or deactivating all fonts Ask confirmation when activating or deactivating fonts by tags Preview Word is RTL size pt Font Editor Add the full path to your preferred font editor /usr/bin/fontforge Browse... Ask for tag names when importing fonts Show names of imported fonts after import process Show splash at startup Don’t use preferred name scheme (will affect only newly imported fonts) General Named Sample Texts Add Initial Layout Font Size: Interline: Hyphenation Left: Right: Dictionary: Browse ... Apply Sample Text Templates Folder Remote directories http:// Remove Local storage Files and Folders Change TextLabel Shortcuts Close PrefsPanelDialog Looks like your setup does not have a system tray available. A text Select font editor Select Templates Folder Select Where remote font files will be stored Please select an item in the list or create a new one. Alt Ctrl Shift Meta Meta+ Shift+ Alt+ Ctrl+ Replace Shortcut is already in use for action name will be appended to this Do you still want to assign it? Action Shortcut Tip Select hyphenation dictionary QObject codepoint is U+ Creating font book... cancel Copying files Unable to copy ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv Mark, NonSpacing Mark, SpacingCombining Mark, Enclosing Number, DecimalDigit Number, Letter Number, Other Separator, Space Separator, Line Separator, Paragraph Other, Control Other, Format Other, Surrogate Other, PrivateUse Other, NotAssigned Letter, Uppercase Letter, Lowercase Letter, Titlecase Letter, Modifier Letter, Other Punctuation, Connector Punctuation, Dash Punctuation, Open Punctuation, Close Punctuation, InitialQuote Punctuation, FinalQuote Punctuation, Other Symbol, Math Symbol, Currency Symbol, Modifier Symbol, Other RemoteDir Downloading Systray &Activate all &Deactivate all Mi&nimize &Restore &Tags E&xit TagSetDialog TagSet editor Collections of Tags Available Tags Add selected tag to current set. Add Collections New delete Remove Close TextProgressionWidget Form Inline progression e.g. Latin text Left to right e.g. Arabic text Right to left e.g. Traditional Chinese & Japanese text Top to bottom e.g. Runic text Bottom to top Block progression e.g. Tarditionnal Chinese & Japanes text e.g. Traditional Mongolian text repairDialog Dialog Select all Remove Dead links Re-link Deactivate Activated Not Linked De-link Activate Deactivated Linked Close typotek Add Directory &Import... Ctrl+O Import a directory &Save Ctrl+S Save the document to disk Export font book... Export a pdf that show selected fonts E&xit Ctrl+Q Exit the application &About Show the Typotek's About box Help &Tag Sets Edit current font &File &Help Ready There is no font selected Support of DragNDrop over http is sheduled but not yet effective You bring something over me I can’t handle Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Preferences You provided an empty string, it’s not fair Activate all current Deactivate all current Try to run font editor with the selected font as argument You don't seem to have font editor installed. Path to font editor can be set in preferences. Nothing Selected Importing font files... cancel Import Fontmatrix care You are about to activate a bunch of fonts, it is time to cancel if it was not your intent You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent Can’t import this font because it’s broken : Choose the tag for filter exported fonts Choose Directory Export &Fonts Export a fontset Check Database Tag All... Load settings Check for Fontmatrix own dir Loading fonts present in database Catching font descriptions from network Collected System Font Adding fonts from system directories fonts available from system font descriptions imported from network Browse Fonts default "default" is a reserved Fonts imported: %1 Print Info... Print informations about the current font Print Sample... Print the sample as a specimen Print Chart... Print a chart of the current font Print Playground... Print the playground Print Family... Print a specimen of the whole family the current face belongs to About &Qt Next Family Next Face Previous Family Previous Face Layout Options Print &Edit &Browse Fontmatrix - data warning Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Unicode All fields Welcome maessage Print Infos Print Chart Print Playground Print Family fontmatrix-0.6.0+svn20110930/src/messages/about_ru.html0000644000175000017500000000235711216442071021441 0ustar malexmalex

Fontmatrix

Менеджер шрифтов

Fontmatrix предназначен для использования дизайнерами и верстальщиками, которым приходится иметь дело с сотнями и тысячами шрифтов и при этом не иметь постоянно перед глазами полный их список.

В целом, Fontmatrix позволяет вам решать следующие задачи:

  • активировать и деактивировать шрифты;
  • категоризовывать их метками;
  • находить подходящие шрифты при помощи простых или сложных запросов;
  • уточнять этот выбор путем подробного сравнения глифов;
  • создавать печатаемые шрифтовые каталоги;

Подробности вы можете узнать на сайте программы и из встроенной справочной системы.

fontmatrix-0.6.0+svn20110930/src/messages/about_de.html0000644000175000017500000000122110741365420021374 0ustar malexmalex

Fontmatrix

Ein Fontmanager für Linux.

Fontmatrix richtet sich vor allem an Grafikdesigner und Typographen, die mit Hunderten von Schriften umgehen und dabei endlos lange Schriftenlisten durchsehen müssen.

Fontmatrix ermöglicht im wesentlichen drei Dinge:
die Aktivierung und Deaktivierung von Schriften, die Auszeichnung ("Tagging") von Schriften und die Herstellung von Musterbüchern für Schriften.

Weiter Informationen finden Sie unter fontmatrix.net

. fontmatrix-0.6.0+svn20110930/src/messages/about_fr.html0000644000175000017500000000040310741365420021414 0ustar malexmalex

Fontmatrix

Un gestionnaire de polices pour Linux.

Retrouvez le sur fontmatrix.net

fontmatrix-0.6.0+svn20110930/src/messages/welcome_nb.html0000644000175000017500000000274211035172507021734 0ustar malexmalex Welcome to Fontmatrix
##WELCOME_FONT##
Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.
Fontmatrix has some unique functionalities in the Open Source world :
Activate, deactivate fonts to reduce font lists and save resources
Allow to tag font for a better classification and group (de)activation
Make it easy to find particular glyph thanks to a glyph category display
Create a font book that can be printed to have a real overview of the fonts available
Display advanced OpenType features
Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-fr.ts0000644000175000017500000077755511223322743022127 0ustar malexmalex About About Fontmatrix À propos de Fontmatrix TextLabel étiquette The Project Le projet The Peoples Les gens The People Les gens Splash splash Close Fermer AboutWidget version Version version Version fonts loaded fontes chargées ActivationReportDialog Dialog Dialogue Activation - Deactivation Error Report Raport d’activation Close Fermer Font path Chemin Error Erreur AltSelectorWidget Form form BookExportDialog X-Pos pos-x Dialog Dialogue Family Famille Style Style Text Texte Font size Taille de fonte Family Famille Style Style Body Corps de texte Headline Première ligne Sample text Texte insensé Font book options Paramètres du livre de fontes File Fichier Browse... Parcourir... Paper Size Format du papier Export Font Book Exporte un catalogue de fontes Settings Paramètres Font Book Options Options du catalogue Load Template Charge un patron Not A Template Pas de patron Output Destination Paper Size: Taille du papier X Position pos-x Family: Famille Style: Style Text: Texte Font Size Taille de fonte Headline: Première ligne Body: Corps de texte Sample Text: Exemple : Preview Aperçu CompareWidget Form Formulaire Fonts Polices Add Ajout Remove Supprimer Show Montrer Fill Remplir Metrics Métriques Points Points Controls de contrôle Offset Décalage 0 0 Select a character Sélectionne un caractère Keep in sync Synchronise Fill: Remplir : DumpDialog Fontmatrix - Dump Font Info Fontmatrix - Infos Fontmatrix - Export font info for packaging Fontmatrix - export des informations TextLabel tl Save to: Enregistrer sous : Browse... Parcourir... Model Modèle <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Available names Identifiants disponibles Load... Charger… FMActivate Unable to link Activation subroutine failed to make a symbolic link to the font file Impossible de lier Font already activated The Font asked for activation is already activated Fontes déjà active Unable to un-link Activation subroutine failed to remove a symbolic link to the font file Impossible de délier Font already de-activated The Font asked for de-activation is already de-activated Fontes déjà désactivée Cannot link or copy the metrics file A postcript font (pfb) without its metrics file (afm) Impossible de lier ou copier le fichier de métriques Error activation A generic error in activation or deactivation process Erreur FMFontExtract File does not exist: Ce fichier n’existe pas : Format not handled. Format non pris en charge. Failed to extract: %1 Impossible d’opérer l’extraction : %1 FMLayout Text engine options Paramètres de mise en page FMMatchRaster The font %1 scores %2. Do you want to add it to the filtered fonts? La fonte %1 fait %2 Souhaitez vous l’intégrer au lot de fontes filtrées ? No font match the submitted image Aucune fonte ne correspond à l’image que vous avez soumise FolderViewMenu Reload Tree Recharger Import Directory Importer un répertoire Import recursively Importer un répertoire récursivement Import File Importer un fichier FontAction Form Formulaire action Action Add Tag Ajouter une Étiquette Action Action FontBook family Famille headline Première ligne body Corps de texte style Style Creating font book... Livre de fontes... cancel Annuler FontBookDialog Save fontBook Sauvegarde le catalogue family Famille style Style headline Première ligne body Corps de texte FontCompareWidget None No fill color in comprae glyph Aucune FontExtractorDialog Font extractor Extracteur de fontes Select PDF Sélectionner un document ou une archive File name Nom de fichier &Browse &Parcourir Fonts Fontes &Select Dir &Sélectionner un répertoire &Extract &Extraire Close Fermer FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Passe ton chemin. Copyright Droit de copie Font Family Nom de famille Font Subfamily Variante Unique font identifier Identifiant unique Full font name Nom complet Version string Version Postscript name Nom Postscript Trademark Marque déposée Manufacturer Fabricant Designer Créateur Description Description URL Vendor URL du fournisseur URL Designer URL du créateur License Description Licence License Info URL URL de la license Reserved réservé Preferred Family Famille péférée Preferred Subfamily Variante préférée Compatible Full (Macintosh only) Compatibilité Macintosh Sample text Exemple PostScript CID findfont name Identifiant CID Fontmatrix - Download Fontmatrix - téléchargement Downloading %1. Télécharge %1. Any Aucun Script Écriture Category Catégorie Glyphs count Nombre de glyphes Font Type Type de fonte Charmaps List Cartes de caractères Unable to get a face of this font file. Impossible de construire une fonte depuis ce fichier. FontStrings Copyright Droit de copie Font Family Nom de famille Font Subfamily Variante Unique font identifier Identifiant unique Full font name Nom complet Version string Version Postscript name Nom Postscript Trademark Marque déposée Manufacturer Fabricant Designer Créateur Description Description URL Vendor URL du fournisseur URL Designer URL du créateur License Description Licence License Info URL URL de la license Preferred Family Famille péférée Preferred Subfamily Variante préférée Compatible Full (Macintosh only) Compatibilité Macintosh Sample text Texte d’exemple PostScript CID findfont name Identifiant CID Panose Panose All fields Tous Any Aucun No Fit PAs de correspondance Text and Display Family Type Texte Script Family Type Écriture Decorative Family Type Decoratif Pictorial Family Type Illustratif Family Type Type Cove Serif style Obtuse Cove Serif style Square Cove Serif style Obtuse Square Cove Serif style Square Serif style Thin Serif style Bone Serif style Exaggerated Serif style Triangle Serif style Normal Sans Serif style Obtuse Sans Serif style Perp Sans Serif style Flared Serif style Rounded Serif style Serif style Very Light Weight Light Weight Thin Weight Book Weight Medium Weight Demi Weight Bold Weight Heavy Weight Black Weight Nord Weight Weight Old Style Proportion Modern Proportion Even Width Proportion Expanded Proportion Condensed Proportion Very Expanded Proportion Very Condensed Proportion Monospaced Proportion Proportion None Contrast Aucune Very Low Contrast Low Contrast Medium Low Contrast Medium Contrast Medium High Contrast High Contrast Very High Contrast Contrast Gradual/Diagonal Stroke Variation Gradual/Transitional Stroke Variation Gradual/Vertical Stroke Variation Gradual/Horizontal Stroke Variation Rapid/Vertical Stroke Variation Rapid/Horizontal Stroke Variation Instant/Vertical Stroke Variation Stroke Variation Straight Arms/Horizontal Arm Style Straight Arms/Wedge Arm Style Straight Arms/Vertical Arm Style Straight Arms/Single Serif Arm Style Straight Arms/Double Serif Arm Style Non-Straight Arms/Horizontal Arm Style Non-Straight Arms/Wedge Arm Style Non-Straight Arms/Vertical Arm Style Non-Straight Arms/Single Serif Arm Style Non-Straight Arms/Double Serif Arm Style Arm Style Normal/Contact Letterform Normal/Weighted Letterform Normal/Boxed Letterform Normal/Flattened Letterform Normal/Rounded Letterform Normal/Off Center Letterform Normal/Square Letterform Oblique/Contact Letterform Oblique/Weighted Letterform Oblique/Boxed Letterform Oblique/Flattened Letterform Oblique/Rounded Letterform Oblique/Off Center Letterform Oblique/Square Letterform Letterform Standard/Trimmed Midline Standard/Pointed Midline Standard/Serifed Midline High/Trimmed Midline High/Pointed Midline High/Serifed Midline Constant/Trimmed Midline Constant/Pointed Midline Constant/Serifed Midline Low/Trimmed Midline Low/Pointed Midline Low/Serifed Midline Midline Constant/Small X-Height Constant/Standard X-Height Constant/Large X-Height Ducking/Small X-Height Ducking/Standard X-Height Ducking/Large X-Height X-Height This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Passe ton chemin. Character to glyph mapping Association du caractère au glyphe Font header En-tête, informations générales Horizontal header Informations disposition horizontale Horizontal metrics Métriques horizontales Maximum profile Informations taille de la fonte Naming table Noms OS/2 and Windows specific metrics OS/2 et informations spécifiques à Windows PostScript information Informations nécessaires pour utilisation avec un interpréteur Postscript Control Value Table Tableau de variables Font program Instructions TrueType exécutées au chargement de la fonte Glyph data Contours de glyphes des fontes TrueType Index to location Indices dans la table «glyf» CVT Program Instructions TrueType PostScript font program Programme de fonte Postscript (Compact Font Format) Vertical Origin Origines Verticales de chaque glyphe pour une fonte OpenType Embedded bitmap data Images de glyphes incluses (données) Embedded bitmap location data Images de glyphes incluses (offsets) Embedded bitmap scaling data Images de glyphes incluses (mise à l’échelle) Baseline data Informations d’alignement Glyph definition data Nature des glyphes Glyph positioning data Positionnement des glyphes Glyph substitution data Substitutions de glyphes Justification data Justification Digital signature Signature digitale Grid-fitting/Scan-conversion Alignement à la grille Horizontal device metrics Métriques horizontales dépendantes du prériphérique Kerning Crénage Linear threshold data Ajustements des approches PCL 5 data Table PCL 5 Vertical device metrics Métriques verticales dépendantes du prériphérique Vertical Metrics header Informations dispositions verticales Vertical Metrics Métriques verticales This font may be embedded and permanently installed on the remote system by an application. The user of the remote system acquires the identical rights, obligations and licenses for that font as the original purchaser of the font, and is subject to the same end-user license agreement, copyright, design patent, and/or trademark as was the original purchaser. This font must not be modified, embedded or exchanged in any manner without first obtaining permission of the legal owner. This font may be embedded, and temporarily loaded on the remote system. Documents containing this font must be opened "read-only;" no edits can be applied to the document. This font may be embedded but must only be installed temporarily on other systems. In contrast to Preview &amp; Print fonts, documents containing this font may be opened for reading, editing is permitted, and changes may be saved. This font may not be subsetted prior to embedding. Other embedding restrictions specified in bits 0-3 and 9 also apply. Only bitmaps contained in this font may be embedded. No outline data may be embedded. If there are no bitmaps available in this font, then it is considered unembeddable and the embedding services will fail. Other embedding restrictions specified in bits 0-3 and 8 also apply. Not Restricted Restricted Preview/Print Edit/Embed No Subset Bitmap Only Help Fontmatrix Help Aide de Fontmatrix Close Fermer HelpBrowser Fontmatrix Online Help Aide de Fontmatrix &File &Fichier &Edit &Édition &Bookmarks &Marque-pages &Print... &Imprimer… &Quit &Quitter &Find... &Chercher… Find &Next Chercher le &Suivant Find &Previous Chercher le &Précédent &Add Bookmark &Ajouter un marque-page &Delete &Supprimer D&elete All S&upprimer tout Find Chercher Search Term: Terme recherché : New Bookmark Nouveau marque-page New Bookmark's Title: Titre du nouveau marque-page : <h2><p>Sorry, no manual is installed!</p><p>Please contact your package provider or Fontmatrix team if you built the application yourself</p></h2> HTML message for no documentation available to show <h2> <p>Désolé, aucune page d’aide trouvée!</p> <p>Prenez contact avec le fournisseur de votre paquet ou avec l’équipe Fontmatrix si vous avez installé le logiciel par vos propres moyens.</p> </h2> Fontmatrix Help Aide de Fontmatrix &Contents &Contenu Se&arch &Recherche Searching is case insensitive Recherche sensible à la casse &Search &Cherche 1 1 Book&marks Marqu&e-pages &New &Nouveau &Exit &Quitter Find &Next... Chercher le &Suivant… Find &Previous... Chercher le &Précédent… &Add &Ajouter ImportTagsDialog Dialog Dialogue Add Ajout Ok Ok Fontmatrix - Tags Fontmatrix - étiquettes ImportedFonts Dialog Dialogue Imported fonts Fontes importées Imported Fonts Fontes importées Ok Ok <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> <qt>Plutôt que de montrer ce message, un décompte des fontes importées sera visible dans la bar d’état. Votre choix pourra être changé dans les préférences</qt> Do not show this dialog again Ne plus montrer ce message Imported Fonts: Fontes importées : &Do not show this dialog again &Ne plus montrer ce message &OK &Ok ImportedFontsDialog (not loaded) (pas chargée) Number of Imported Fonts Nombre de fontes importées LayoutOptionWidget Form Formulaire Weights Poids score score before Avant exact Exact after Aprés end Fin penalty Pénalité H-penalty Pénalité de coupure space Espace max compression compression maximum Text layout engine options Paramètres de mise en page Before Avant Exact Exact After Aprés End Fin Max. compression compression maximum ListDock Filter view by chosing tag Filtre en fonction des étiquettes Form Formulaire TagSet Collection d’étiquettes Show only fonts that belong to chosen tagset Filtre en fonction des collections Names Noms Files Fichiers Preview Aperçu Show complete collection of available fonts Montre toutes les fontes disponibles View all Tout voir Show all activated fonts Voir toutes les fontes activées View activated Voir les fontes actives Search through font informations Recherche dans les informations extraites des fontes Search Recherche Respect entered text case when searching Recherche en tenant compte de la différence entre b. d. c. et cap. Case sensitive sensible Tag Étiquette Case Sensitive Sensible à la casse Tag: Étiquettes : Tag Set: Collections : View All Tout voir View Activated Voir les actives Case Sensitive search Recherche sensible à la casse CS SC Live search Résultats au fil de la saisie L F Remove Supprimer Filter: Filtre : Switch to panose filtering Filtre par attributs Panose Field selection Choix du champ F F TextLabel tl Previews Aperçu Folders Dossiers Panose Panose reset Vider <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want to negate the filter,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prefix the word with "!" such as in:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">"!pattern"</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want to enqueue the filter,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prefix it with "+".</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally, you can mix negate and queue in:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">"+!pattern"</span> or "!+pattern"</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want to negate the filter,</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prefix the word with "!" such as in:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">"!pattern"</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want to enqueue the filter,</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prefix it with "+".</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally, you can mix negate and queue in:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">"+!pattern"</span> or "!+pattern"</p></body></html> Tags Étiquettes Not Non And Et save Enregistrer Collapse or expand déplie ou replie Show face boxes coches pour fichiers ListDockWidget All fields Tous All activated Toutes les fontes actives Unicode character Caractère unicode You can use the following keywords to be replaced by data from fonts: <strong>&#60;name&#62;</strong> ; <strong>&#60;family&#62;</strong> ; <strong>&#60;variant&#62;</strong> Vous pouvez utiliser les mot clés suivants qui seront remplacés par les données correspondantes extraites de la fonte : <strong>&#60;name&#62;</strong> ; <strong>&#60;family&#62;</strong> ; <strong>&#60;variant&#62;</strong> Tags Étiquettes Similar to current Similaire Collapse Top Level Replie au plus haut niveau Collapse Families Replie les familles Expand Top Level Déplie le plus haut niveau Expand Families Déplie les familles MainView Fit to view Ajuster à la vue| main view widget composant vue principale Zoom is disabled, uncheck fit to view to enable zoom Le zoom est exclusif de l’ajustement Customising text used for preview rendering Écrire le texte insensé Sample text... Texte insensé... FT Ft OpenType Features Fonctionnalités OpenType Friendly Name Appellation complète Apply features Appliquer Glyphs Glyphes Coverage of unicode interval : Couverture de l’intervalle Unicode : Right mouse click on a tag to add it or remove it from TagSet Un clic droit sur une étiquette vous donne l’ocaasion de l’ajouter ou la retirer d’une collection Clicking on a glyph will show details about it Pointer un glyphe le montre plus en détail No glyph selected Aucun dessin sélectionné Tags Étiquettes Font Info Informations <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }(new line)</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">(new line)<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Sample text Texte insensé Font Information Informations Sample Text Exemple Fit to View Ajuster à la vue Simulate screen rendering (FreeType inside) FreeType comme si vous y étiez Use shaper Utiliser un moteur de mise en forme Right to Left De droite à gauche Coverage of Unicode Interval : Couverture Unicode : <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }(new line)</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">(new line)<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Anything selected Rien n’est sélectionné Add Tag Ajouter une Étiquette +-~ +- Absolute view vue absolue FreeType view Rendu par FreeType Font Size Taille de fonte pt pt Advanced Avancé Text Progression Directions Playground Aire de jeu Nothing selected Rien Add a tag Ajouter une étiquette Settings Paramètres OpenType OpenType Sample Exemple Save as default Enregistrer comme modèle Reset Default Vider le modèle SampleText Exemple Layout Mise en place FreeType FreeType Native Qt objects Éléments Qt natifs World is wide Le monde est vaste Shaper type Type de moteur Script Écriture push Mettre Set Mode "Copy Character to Clipboard" Passe en mode «Copie le caractère dans le presse-papier» Add Ajout Display Settings Montre les paramètres edit Édition No hinting Sans instruction Light Hinting Instructions lumineuses Normal Hinting Instructions normales Copy Copie Classification Classification Compare Comparaison Edit sample text Éditer l’exemple Edit Édition FreeType based rasterized rendering Rendu par Freetype Appearance Apparence Vectorized rendering using native toolkit (Qt) Rendu par Qt (objets natifs) Script Writing system Écriture Search a character by name, press enter after editing to run the search. Recherche d’un caractère par son nom. Frappez à l’entrée après votre saisie. Coverage of Unicode Interval Couverture Unicode Block: bloc : More Options Plus d’options ... ... Search: Recherche Copy Mode Mode copie 1 1 Search a character by its codepoint (expressed in hexadecimal and prefixed with "U+", "u+" or "+") or a glyph by its name. Press enter after editing to run the search. <p>Recherche d’un caractère par son point de code (exprimé en hexadécimal et préfixé d’un «U+», «u+» ou juste «+»)</p> <p>Recherche d’un glyphe par son nom. Profitez du complétement automatique pour les noms de glyphes.</p> <p>Saisissez <em>Entrée</em> après avoir éditer le champs pour lancer la recherche.</p> MainViewWidget default default zoom is enabled Le zoom est disponible zoom is disabled, uncheck fit to view to enable zoom Le zoom est exclusif de l’ajustement 000Basic Latin 000Latin de base 001Latin-1 Supplement 001Supplement Latin-1 002Latin Extended-A 002Latin étendu A 003Latin Extended-B 003Latin étendu B 004IPA Extensions 004Alphabet phonétique international (API) 005Spacing Modifier Letters 005Lettres modificatives avec chasse 006Combining Diacritical Marks 006Diacritiques 007Greek and Coptic 007Grec et copte 008Cyrillic 008Cyrillique 009Cyrillic Supplement 009Supplément cyrillique 010Armenian 010Arménien 011Hebrew 011Hébreu 012Arabic 012Arabe 013Syriac 013Syriaque 014Arabic Supplement 014Supplément arabe 015Thaana 015Thâna 016N'Ko 016N'Ko 017Devanagari 017Dévanâgarî 018Bengali 018Bengali 019Gurmukhi 019Gourmoukhî 020Gujarati 020Goudjerate 021Oriya 021Oriya 022Tamil 022Tamoul 023Telugu 023Télougou 024Kannada 024Kannara 025Malayalam 025Malayalam 026Sinhala 026Singhalais 027Thai 027Thai 028Lao 028Lao 029Tibetan 029Tibétain 030Burmese 030Birman 031Georgian 031Géorgien 032Hangul Jamo 032Jamos hangûl 033Ethiopic 033Éthiopien 034Ethiopic Supplement 034Supplément Éthiopien 035Cherokee 035Chérokî 036Unified Canadian Aboriginal Syllabics 036Syllabaires autochtones canadiens unifiés 037Ogham 037Ogam 038Runic 038Runes 039Tagalog 039Tagalog 040Hanunóo 040Hanounóo 041Buhid 041Bouhide 042Tagbanwa 042Tagbanoua 043Khmer 043Khmer 044Mongolian 044Mongol 045Limbu 045Limbou 046Tai Le 046Taï-le 047New Tai Lue 047Nouveau Taï-le 048Khmer Symbols 048Symboles khmer 049Buginese 049Buginese 050Balinese 050Balinese 051Lepcha 051Lepcha 052Phonetic Extensions 052Supplément phonétique 053Phonetic Extensions Supplement 053Extensions au supplément phonétique 054Combining Diacritical Marks Supplement 054Supplément Signes Diacritiques 055Latin Extended Additional 055Latin étendu additionnel 056Greek Extended 056Grec étendu 057General Punctuation 057Ponctution générale 058Superscripts and Subscripts 058Exposants et indices 059Currency Symbols 059Symboles monétaires 060Combining Diacritical Marks for Symbols 060Signes combinatoires pour symboles 061Letterlike Symbols 061Symboles de type letrre 062Number Forms 062Formes numérales 063Arrows 063Flèches 064Mathematical Operators 064Opérateurs mathématiques 065Miscellaneous Technical 065Signes techniques divers 066Control Pictures 066Pictogrammes de commande 067Optical Character Recognition 067Reconnaissance optique de caractères 068Enclosed Alphanumerics 068Alphanumériques cerclés 069Box Drawing 069Filets 070Block Elements 070Pavés 071Geometric Shapes 071Formes géométriques 072Miscellaneous Symbols 072Symboles divers 073Dingbats 073Casseau 074Miscellaneous Mathematical Symbols-A 074Divers symboles mathématiques - A 075Supplemental Arrows-A 075Supplément B de flèches 076Braille Patterns 076Combinaisons brailles 077Supplemental Arrows-B 077Supplément B de flèches 078Miscellaneous Mathematical Symbols-B 078Divers symboles mathématiques-B 079Supplemental Mathematical Operators 079Opérateurs mathématiques supplémentaires 080Miscellaneous Symbols and Arrows 080Divers symboles et flèches 081Glagolitic 081Glagolitique 082Latin Extended-C 082Latin étendu-C 083Coptic 083Copte 084Georgian Supplement 084Supplément géeorgien 085Tifinagh 085Alphabet Tifinagh 086Ethiopic Extended 086Ethiopien étendu 087Supplemental Punctuation 087Ponctuation supplémentaire 088CJK Radicals Supplement 088Formes supplémentaires des clés CJC 089Kangxi Radicals 089Clés chinoises (Kangxi) 090Ideographic Description Characters 090Description idéophonographiques 091CJK Symbols and Punctuation 091Symboles et ponctuation CJC 092Hiragana 092Hiragana 093Katakana 093Katakana 094Bopomofo 094Bopomofo 095Hangul Compatibility Jamo 095Jamos de compatibilité hangûls 096Kanbun 096Kanboun 097Bopomofo Extended 097Bopomofo étendu 098CJK Strokes 098Contours CJC 099Katakana Phonetic Extensions 099Extensions phonétiques Katakana 100Enclosed CJK Letters and Months 100Lettres et mois CJC cerclés 101CJK Compatibility 101Compatibilité CJC 102CJK Unified Ideographs Extension A 102Supplément A aux idéophonogrammes unifiés CJC 103Yijing Hexagram Symbols 103Hexagrammes du Classique des mutations ou Yi-king 104CJK Unified Ideographs 104Idéophonogrammes unifiés CJC 105Yi Syllables 105Syllabaire yi des Monts frais 106Yi Radicals 106Clés yi 107Modifier Tone Letters 107Lettres modificatives de la tonalité 108Latin Extended-D 108Latin étendu-D 109Syloti Nagri 109Sylotî nagrî 110Phags-pa 110Phagspa 111Hangul Syllables 111Hangûl 112High Surrogates 112Demi-zone haute 113High Private Use Surrogates 113Partie à usage privé de la demi-zonz haute 114Low Surrogates 114Demi-zone basse 115Private Use Area 115Zonz à usage privé 116CJK Compatibility Ideographs 116Idéogrammes de compatibilité CJC 117Alphabetic Presentation Forms 117Formes de présentation alphabétique 118Arabic Presentation Forms-A 118Formes A de présentation arabe 119Variation Selectors 119Sélecteurs de variante 120Vertical Forms 120Formes verticales 121Combining Half Marks 121Demi-signes combinatoires 122CJK Compatibility Forms 122Formes de compatibilité CJC 123Small Form Variants 123Petites variantes de forme 124Arabic Presentation Forms-B 124Formes B de présentation arabe 125Halfwidth and Fullwidth Forms 125Formes de demi et pleine chasse 126Specials 126Caractères spéciaux 127Supplementary Multilingual Plane (SMP) 127Plan Multilingue Supplémentaire (PMS) 128Supplementary Ideographic Plane (SIP) 128Plan Supplémentaires des Idéogrammes (PSI) 129unassigned 129Non-assigné 130Supplementary Special-purpose Plane (SSP) 130Plan Suplémentaire à Usage Spécial (PSUS) 131Private Use Area 1 (PUA) 131Zone à usage privé 1 (ZUP) 132Private Use Area 2 (PUA) 132Zone à usage privé 2 (ZUP) 133Un-Mapped Glyphs 133Glyphs non référencés Activation event événement Cancel Annuler Activation of : Activation de : Deactivation of : Désactivation de : 134View all mapped glyphs 134Voir toutes les glyphes référencées Names Noms Fontmatrix takes care of you Fontmatrix prends soin de vous is activated. If you want to remove it from Fontmatrix database, please deactivate it first. est activée. Avant de la supprimer, vous devez la désactiver. Fontmatrix safe Fontmatrix You are about to remove a font from Fontmatrix database Vous êtes sur le point de supprimer une fonte de la base de données Do you want to continue? Voulez-vous continuer ? Welcome to Fontmatrix Bienvenue dans Fontmatrix Add new tag Ajouter une étiquette Load Charge Activated Active Un-Mapped Glyphs Glyphs non référencés View all mapped glyphs tous les glyphes référencées 122.0 Size of the welcome message 122.0 An error occured when tried to load %1 with command: %2 %1 is an url and %2 a program Une erreur est survenue en chargeant %1 avec la commande : %2 Block (%1): bloc (%1) : User Identify root of user defined sample texts Personnel MatchRasterDialog Find a font using raster sample Trouver une fonte depuis à une image Input Image Image source &Browse &Parcourir &Load &Charge Raster sample preview Aperçu de l’image C&haracter: Ca&ractère : A unique character or a four digits hexadecimal Unicode value Un caractère unique ou les quatres chiffres d’une valeur Unicode en héxadécimal &Search &Cherche Interactive Interactif Click on the letter to let Fontmatrix compute the bounding box Pointez et pressez l’œil de la lettre, laissez faire l’artiste Compare with: Compare avec : Stop Stop &Cancel &Annuler Grab mode Zoom level If set, you will be prompted for each matching font Tweak rect PanoseDialog Fontmatrix - Panose Editor Fontmatrix - PANOSE TextLabel tl PrefsPanel Sample text Exemple de texte Preferences Panel Préférences Named sample texts Textes insensés nommés Add Ajout Validate Valider Layout Mise en place Font size Taille de la police Interline Interligne pt pt Apply Appliquer General Général Show Fontmatrix in system tray Montrer Fontmatrix dans la boîte à miniatures| Close to system tray Fermer «miniaturise» dans la boîte à miniatures Show Activate all and Deactivate all in system tray menu Rendre disponible Tout désactiver et Tout activer Ask confirmation when activating or deactivating all fonts Demande confirmation avant de tout désactiver ou activer Ask confirmation when activating or deactivating tags Demande confirmation avant de désactiver ou activer par étiquette Preview word Le mot aperçu Show Fontmatrix in System Tray Montrer Fontmatrix dans la boîte à miniatures Close to System Tray Fermer "miniaturise" dans la boîte à miniatures Show Activate All and Deactivate All in the System Tray menu Rendre disponible Tout désactiver et Tout activer Ask confirmation when activating or deactivating fonts by tags Demande confirmation avant de désactiver ou activer par étiquette Preview Word Le mot aperçu Font Editor Éditeur de police /usr/bin/fontforge /usr/bin/fontforge Browse... Parcourir... Ask for tag names when importing fonts Demande un nom d’étiquette à l’import Sample Text Exemple Named Sample Texts Exemples nommés Font Size: Taille de fonte : Interline: Interligne : Files and Folders Fichiers et répertoires Templates Folder Répertoire des modèles Remote directories Répertoires distants Remove Supprimer Preferences Préférences Show "All" actions Montre les actions globales is RTL de droite à gauche size taille Initial Layout Mise en page initiale http:// http:// Local storage Emplacement de stockage locale Close Fermer Add the full path to your preferred font editor Ajouter le chemin vers votre éditeur de fontes Show names of imported fonts after import process Montrer les fontes importées à la fin Show splash at startup Écran de démarrage Hyphenation Coupure Left: gauche : Right: droite : Dictionary: Dictionnaire : Browse Parcourir ... ... Change Changer TextLabel tl Files & Folders Fichiers et répertoires Shotcuts Raccourcis Start minimized to system tray Démarre réduit dans la boîte à miniatures subtitled Sous-titré Chart Subtitle Font Fonte de dous-titres dans le tableau Help Browser Sample Texts Texte d’exemple + + - Select an hyphenation dict file as it comes with OpenOffice or Scribus Séction d’un dictionnaire de coupures tel que fourni par OpenOffice ou Scribus linespacing: Interligne : System tray Boîte à miniatures Display Affichage Service Services Samples collection Collection d’exemples Shortcuts Raccourcis Ask for confirmation when activating or deactivating all fonts Ask for confirmation when activating or deactivating fonts by tags Word: Mot : Default font size: Taille par défaut : Size: Taille : Information Style Style panneau d’information Select Style Selection d’un style Fonts Editor Éditeur de fonte Web Browser Navigateur web Extra options: Options supplémentaires Hyphenation dictionary Dictionnaire de coupures Save PrefsPanelDialog Looks like your setup does not have a system tray available. Il semble que vous ne disposez pas de boîte à miniatures A text Un text Select font editor Éditeur de police Select Templates Folder Séctionnez un répertoire contenant les modèles Select Where remote font files will be stored Sélectionnez où les fontes distantes seront entreposées Please select an item in the list or create a new one. Veuillez sélectionner une entrée dans la liste ou en créer une. Alt Alt Ctrl Ctrl Shift Shift Meta Meta Meta+ Meta+ Shift+ Shift+ Alt+ Alt+ Ctrl+ Ctrl+ Replace Remplacer Shortcut is already in use for action name will be appended to this Raccourci déjà utilisé pour Do you still want to assign it? Voulez-vous vraiment lui assigner ? Action Action Shortcut Raccourcis Tip Astuce Select hyphenation dictionary Sélectionnez un dictionnaire de coupures Sample Text A default sample text inserted when creating a new sample Exemple Do you confirm that you want to remove: the name of a sample text will be append to the string Confirmez-vous la suppression de : You can use the following keywords to be replaced by data from fonts: <strong>&#60;name&#62;</strong> ; <strong>&#60;family&#62;</strong> ; <strong>&#60;variant&#62;</strong> Vous pouvez utiliser les mot clés suivants qui seront remplacés par les données correspondantes extraites de la fonte : <strong>&#60;name&#62;</strong> ; <strong>&#60;family&#62;</strong> ; <strong>&#60;variant&#62;</strong> Select web browser Sélection d’un navigateur web QObject codepoint is U+ le point de code est U+ family Famille headline Première ligne body Corps de texte style Style Creating font book... Livre de fontes... cancel Annuler Copying files Copie des fichiers Unable to copy Impossible de copier ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. Ma mère, quand il fut question d’avoir pour la première fois M. de Norpois à dîner, ayant exprimé le regret que le Professeur Cottard fût en voyage et qu’elle-même eût entièrement cessé de fréquenter Swann, car l’un et l’autre eussent sans doute intéressé l’ancien Ambassadeur, mon père répondit qu’un convive éminent, un savant illustre, comme Cottard, ne pouvait jamais mal faire dans un dîner, mais que Swann, avec son ostentation, avec sa manière de crier sur les toits ses moindres relations, était un vulgaire esbrouffeur que le Marquis de Norpois eût sans doute trouvé selon son expression, «puant». Or cette réponse de mon père demande quelques mots d’explication, certaines personnes se souvenant peut-être d’un Cottard bien médiocre et d’un Swann poussant jusqu’à la plus extrême délicatesse, en matière mondaine, la modestie et la discrétion. Mais pour ce qui regarde celui-ci, il était arrivé qu’au «fils Swann» et aussi au Swann du Jockey, l’ancien ami de mes parents avait ajouté une personnalité nouvelle (et qui ne devait pas être la dernière), celle de mari d’Odette. Adaptant aux humbles ambitions de cette femme, l’instinct, le désir, l’industrie, qu’il avait toujours eus, il s’était ingénié à se bâtir, fort au-dessous de l’ancienne, une position nouvelle et appropriée à la compagne qui l’occuperait avec lui. Or il s’y montrait un autre homme. Puisque (tout en continuant à fréquenter seul ses amis personnels, à qui il ne voulait pas imposer Odette quand ils ne lui demandaient pas spontanément à la connaître) c’était une seconde vie qu’il commençait, en commun avec sa femme, au milieu d’êtres nouveaux, on eût encore compris que pour mesurer le rang de ceux-ci, et par conséquent le plaisir d’amour-propre qu’il pouvait éprouver à les recevoir, il se fût servi, comme un point de comparaison, non pas des gens les plus brillants qui formaient sa société avant son mariage, mais des relations antérieures d’Odette. Mais, même quand on savait que c’était avec d’inélégants fonctionnaires, avec des femmes tarées, parure des bals de ministères, qu’il désirait de se lier, on était étonné de l’entendre, lui qui autrefois et même encore aujourd’hui dissimulait si gracieusement une invitation de Twickenham ou de Buckingham Palace, faire sonner bien haut que la femme d’un sous-chef de cabinet était venue rendre sa visite à Madame Swann. On dira peut-être que cela tenait à ce que la simplicité du Swann élégant, n’avait été chez lui qu’une forme plus raffinée de la vanité et que, comme certains israélites, l’ancien ami de mes parents avait pu présenter tour à tour les états successifs par où avaient passé ceux de sa race, depuis le snobisme le plus naïf et la plus grossière goujaterie, jusqu’à la plus fine politesse. Mais la principale raison, et celle-là applicable à l’humanité en général, était que nos vertus elles-mêmes ne sont pas quelque chose de libre, de flottant, de quoi nous gardions la disponibilité permanente; elles finissent par s’associer si étroitement dans notre esprit avec les actions à l’occasion desquelles nous nous sommes fait un devoir de les exercer, que si surgit pour nous une activité d’un autre ordre, elle nous prend au dépourvu et sans que nous ayons seulement l’idée qu’elle pourrait comporter la mise en œuvre de ces mêmes vertus. Swann empressé avec ces nouvelles relations et les citant avec fierté, était comme ces grands artistes modestes ou généreux qui, s’ils se mettent à la fin de leur vie à se mêler de cuisine ou de jardinage, étalent une satisfaction naïve des louanges qu’on donne à leurs plats ou à leurs plates-bandes pour lesquels ils n’admettent pas la critique qu’ils acceptent aisément s’il s’agit de leurs chefs-d’œuvre; ou bien qui, donnant une de leurs toiles pour rien, ne peuvent en revanche sans mauvaise humeur perdre quarante sous aux dominos. hamburgefonstiv <name> Access All Alternates Toutes les variantes Above-Base Forms Formes supérieures Above-Base Mark Positioning Positionnement supérieur Above-Base Substitutions Substitutions supérieures Alternative Fractions Fractions alternatives Akhands Ligatures (écritures indiennes) Below-Base Forms Formes inférieures Below-Base Mark Positioning Positionnement inférieur Below-Base Substitutions Substitutions inférieures Petite Capitals From Capitals Capitales en petites capitales Small Capitals From Capitals Capitales en «Small caps» Contextual Alternates Variantes contextuelles Case-Sensitive Forms Formes dépendantes de la casse Glyph Composition/Decomposition Composition et décomposition des glyphes Contextual Ligatures Ligatures contextuelles Conjunct Forms Formes jointives Capital Spacing Espacement pour les capitales Contextual Swash Décoratives contextuelles Cursive Positioning Positionnement des cursives Default Processing Traitement par défaut Distances Distances Discretionary Ligatures Ligatures supplémentaires Denominators Dénominateurs Expert Forms Formes expertes (mais en quoi ?) Final glyph Alternates Variantes de glyphes en fin de mot Terminal Forms #2 Formes terminales #2 Terminal Forms #3 Formes terminales #3 Terminal Forms Formes terminales Fractions Fractions Full Width Pleines chasses Half Forms Demi formes Halant Forms Formes du halant Alternate Half Width Variantes de demi chasses Historical Forms Formes historiques Horizontal Kana Alternates Variantes hrizontales de kana Historical Ligatures Ligatures historiques Hangul Hangul Hojo Kanji Forms (JIS x 212-1990 Kanji Forms) Hojo Kanji Forms (JIS x 212-1990 Kanji Forms) Half Width Demi chasses Initial Forms Formes de début de mot Isolated Forms Formes isolées Italics Italiques Justification Alternatives Variantes justifiantes JIS78 Forms Formes JIS78 JIS83 Forms Formes JIS83 JIS90 Forms Formes JIS90 JIS2004 Forms Formes JIS2004 Kerning Crénage Left Bounds Limites gauche Standard Ligatures Ligatures habituelles Leading Jamo Forms Formes de Jamo en chef Lining Figures Figures appuyées Localized Forms Formes localisées Mark Positioning Positionnelment par repères Medial Forms #2 Form de milieu de mot #2 Medial Forms Form de milieu de mot Mathematical Greek Grec pour les mathématiques Mark to Mark Positioning Positionnement de repère à repère Mark Positioning via Substitution Positionnement par repère via une substitution (confus?) Alternate Annotation Forms Variantes de formes annotativatoires NLC Kanji Forms Formes de kanjis NLC Nukta Forms Formes du Nukta Numerators Numérateurs Old Style Figures Figures à l’anciennes (chiffres elzéviriens) Optical Bounds Limites optiques Ordinals Ordinaux Ornaments Ornements Proportional Alternate Width Variantes à chasse variable Petite Capitals Petites capitales Proportional Figures Figures proportionnelles Pre-base Forms Formes antérieures Pre-base Substitutions Substitutions antérieures Post-base Forms Formes postérieures Post-base Substitutions Substitutions postérieures Proportional Widths Chasses proportionnelles Quarter Widths Quart de chasse Randomize Hasard Rakar Forms Formes du rakar Required Ligatures Ligatures requises Reph Form Formes du repha Right Bounds Limites droite Right-To-Left Alternates Variantes pour disposition de droite à gauche Ruby Notation Forms Formes de noation rubinique Stylistic Alternates Variantes de style Scientific Inferiors Inférieures scientifiques Optical Size Taille optique Small Capitals Petites (small) capitales Simplified Forms Formes simplifiées Sylistic Set 1 Ensemble de styles 1 Sylistic Set 2 Ensemble de styles 2 Sylistic Set 3 Ensemble de styles 3 Sylistic Set 4 Ensemble de styles 4 Sylistic Set 5 Ensemble de styles 5 Sylistic Set 6 Ensemble de styles 6 Sylistic Set 7 Ensemble de styles 7 Sylistic Set 8 Ensemble de styles 8 Sylistic Set 9 Ensemble de styles 9 Sylistic Set 10 Ensemble de styles 10 Sylistic Set 11 Ensemble de styles 11 Sylistic Set 12 Ensemble de styles 12 Sylistic Set 13 Ensemble de styles 13 Sylistic Set 14 Ensemble de styles 14 Sylistic Set 15 Ensemble de styles 15 Sylistic Set 16 Ensemble de styles 16 Sylistic Set 17 Ensemble de styles 17 Sylistic Set 18 Ensemble de styles 18 Sylistic Set 19 Ensemble de styles 19 Sylistic Set 20 Ensemble de styles 20 Subscript Souscrit Superscript Suscrit Swash Variantes «Swash» Titling Titrage Trailing Jamo Forms Formes Jamo en queue Traditional Name Forms Formes de noms traditionnels Tabular Figures Figures pour tableaux Traditional Forms Formes traditionnelles Third Widths Tiers de chasse Unicase Casse unique Alternate Vertical Metrics Variantes de métriques verticales Vattu Variants Variantes vattu Vertical Writing Ecriture verticale Alternate Vertical Half Metrics Variantes de demi-mesures verticales Vowel Jamo Forms Formes de voyelles Jamo Vertical Kana Alternates Variantes de kana à la verticale Vertical Kerning Crénage vertical Proportional Alternate Vertical Metrics Variantes proportionnelles des métriques verticales Vertical Rotation Rotation verticale Slashed Zero Zéro barré default défaut Mark, NonSpacing Repère, sans chasse Mark, SpacingCombining Repère, combinatoire Mark, Enclosing Repère, fermant Number, DecimalDigit Nombre, chiffre décimal Number, Letter Nombre, lettre Number, Other Nombre, autre Separator, Space Séparateur, espace Separator, Line Séparateur, ligne Separator, Paragraph Séparateur, paragraphe Other, Control Autre, contrôle Other, Format Autre, formatage Other, Surrogate Autre, substitut Other, PrivateUse Autre, usage privé Other, NotAssigned Autre, non assigné Letter, Uppercase Lettre, haut de casse Letter, Lowercase Lettre, bas de casse Letter, Titlecase Lettre, casse de titrage Letter, Modifier Lettre, modificateur Letter, Other Lettre, autre Punctuation, Connector Ponctuation, connecteur Punctuation, Dash Ponctuation, trait Punctuation, Open Ponctuation, ouverture Punctuation, Close Ponctuation, fermeture Punctuation, InitialQuote Ponctutation, début de citation Punctuation, FinalQuote Ponctutation, fin de citation Punctuation, Other Ponctuation, autre Symbol, Math Symbole, mathématiques Symbol, Currency Symbole, monnaie Symbol, Modifier Symbole, modificateur Symbol, Other Symbole, autre Glyphs count Nombre de glyphes Font Type Type de fonte Charmaps List Cartes de caractères Basic Latin Latin de base Latin-1 Supplement supplément Latin - 1 Latin Extended-A Latin étendu - A Latin Extended-B Latin étendu - B IPA Extensions alphabet phonétique international (API) Spacing Modifier Letters lettres modificatives avec chasse Combining Diacritical Marks diacritiques Greek and Coptic Grec et Copte Cyrillic Cyrillique Cyrillic Supplement suppléments au Cyrillique Armenian Arménien Hebrew Hébreu Arabic Arabe Syriac Syriaque Arabic Supplement supplément à l’Arabe Thaana Thâna NKo N’ko Devanagari Dévanâgarî Bengali Bengali Gurmukhi Gourmoukhî Gujarati Goudjerate Oriya Oriya Tamil Tamoul Telugu Télougou Kannada Kannara Malayalam Malayalam Sinhala Singhalais Thai Thaï Lao Lao Tibetan Tibétain Myanmar Birman Georgian Géorgien Hangul Jamo Jamos Hangûl Ethiopic Éthiopien Ethiopic Supplement supplément à l’Éthiopien Cherokee Chérokî Unified Canadian Aboriginal Syllabics syllabaires autochtones canadiens unifiés Ogham Ogam Runic Runes Tagalog Tagalog Hanunoo Hanounó Buhid Bouhide Tagbanwa Tagbanoua Khmer Khmer Mongolian Mongol Limbu Limbou Tai Le Taï-le New Tai Lue nouveau Taî-le Khmer Symbols symboles Khmer Buginese Buginese Balinese Balinais Sundanese Sundanais Lepcha Lepcha Ol Chiki Santâlî Phonetic Extensions extensions phonétiques Phonetic Extensions Supplement extensions phonétiques supplémentaires Combining Diacritical Marks Supplement signes diacritiques supplémentaires Latin Extended Additional additions au Latin étendu Greek Extended Grec étendu General Punctuation ponctuation générale Superscripts and Subscripts exposants et indices Currency Symbols symboles monétaires Combining Diacritical Marks for Symbols signes combinatoires pour symboles Letterlike Symbols symboles de type lettre Number Forms formes numérales Arrows flèches Mathematical Operators opérateurs mathématiques Miscellaneous Technical signes techniques divers Control Pictures pictogrammes de commande Optical Character Recognition reconnaissance optique de caractères Enclosed Alphanumerics alphanumériques cerclés Box Drawing filets Block Elements pavés Geometric Shapes formes géométriques Miscellaneous Symbols symboles divers Dingbats casseau Miscellaneous Mathematical Symbols-A symboles mathématiques divers - A Supplemental Arrows-A flèches supplémentaires - A Braille Patterns combinaisons brailles Supplemental Arrows-B flèches supplémentaires - B Miscellaneous Mathematical Symbols-B symboles mathématiques divers - B Supplemental Mathematical Operators opérateurs mathématiques supplémentaires Miscellaneous Symbols and Arrows symboles et flèches divers Glagolitic Glagolitique Latin Extended-C Latin étendu - C Coptic Copte Georgian Supplement Supplément au Géorgien Tifinagh Tifinagh Ethiopic Extended Ethiopien étendu Cyrillic Extended-A Cyrillique étendu - A Supplemental Punctuation Supplément de ponctuation CJK Radicals Supplement formes supplémentaires des clés CJC Kangxi Radicals clés chinoises (Kangxi) Ideographic Description Characters descriptions idéophonographiques CJK Symbols and Punctuation symboles et ponctuations CJC Hiragana Hiragana Katakana Katakana Bopomofo Bopomofo Hangul Compatibility Jamo Jamos de compatibilité hangûls Kanbun Kanboun Bopomofo Extended Bopomofo étendu CJK Strokes contours CJC Katakana Phonetic Extensions extensions phonétiques Katakana Enclosed CJK Letters and Months lettres et mois CJC cerclés CJK Compatibility compatibilité CJC CJK Unified Ideographs Extension A supplément A aux idéophonogrammes unifiés Yijing Hexagram Symbols Hexagrammes du Classique des mutations ou Yi-king CJK Unified Ideographs idéophonogrammes unifiés CJC Yi Syllables syllabes Yi des Monts frais Yi Radicals clés Yi Vai Vaï Cyrillic Extended-B Cyrillique étendu - B Modifier Tone Letters lettres modificatives de la tonalité Latin Extended-D Latin étendu - D Syloti Nagri Sylotî Nagrî Phags-pa Phagspa Saurashtra Saurashtra Kayah Li Kayah Li Rejang Rejang Cham Cham Hangul Syllables syllabes hangûles High Surrogates demi-zone haute High Private Use Surrogates partie à usage privé de la demi-zone haute Low Surrogates demi-zone basse Private Use Area zone à usage privée CJK Compatibility Ideographs idéogrammes de compatibilité CJC Alphabetic Presentation Forms formes de présentation alphabétique Arabic Presentation Forms-A formes de présentation de l’Arabe - A Variation Selectors sélecteurs de variantes Vertical Forms formes verticales Combining Half Marks demi-signes combinatoires CJK Compatibility Forms formes de compatibilité CJC Small Form Variants petites formes Arabic Presentation Forms-B formes de présentation de l’Arabe - B Halfwidth and Fullwidth Forms formes de demi et pleine chasse Specials caractères spéciaux Linear B Syllabary syllabaire linéaire B Linear B Ideograms Idéogrammes du linéaire B Aegean Numbers nombres Égéens Ancient Greek Numbers Grec ancien, nombres Ancient Symbols symboles anciens Phaistos Disc disque de Phaistós Lycian Lydien Carian Carien Old Italic Italien, ancien Gothic Gotique Ugaritic Ougaritique Old Persian Vieux-perse Deseret Déséret Shavian Shavien (alphabet de Shaw) Osmanya Osmanya Cypriot Syllabary syllabaire chypriote Phoenician Phénicien Lydian Lydien Kharoshthi Kharoṣṭhī Cuneiform cunéiforme Cuneiform Numbers and Punctuation nombres et ponctuation cunéiformes Byzantine Musical Symbols symboles musicaux byzantins Musical Symbols symboles musicaux Ancient Greek Musical Notation notation musicale du Grec ancien Tai Xuan Jing Symbols symboles du Classique du mystère suprême Counting Rod Numerals numération à bâtons Mathematical Alphanumeric Symbols symboles mathématiques alphanumériques Mahjong Tiles tuiles de mahjong Domino Tiles pièces de domino CJK Unified Ideographs Extension B idéogrammes unifiés CJC étendus B CJK Compatibility Ideographs Supplement supplément aux idéogrammes de compatibilité CJC Tags étiquesttes Variation Selectors Supplement sélecteurs de variantes supplémentaires Supplementary Private Use Area-A zone à usage privé supplémentaire - A Supplementary Private Use Area-B zone à usage privé supplémentaire - B RemoteDir Downloading Télécharge Systray &Activate all Tout &Activer &Deactivate all Tout &Désactiver Mi&nimize Mi&nimiser &Restore &Restaurer &Exit &Quitter &Tags É&tiquettes E&xit &Quitter TTTableView Save File Fichier TTTableWidget Form Tables TrueType Tables Tables TrueType Tag Étiquette Description Description Size Taille TrueType tables display Fontmatrix - TT &Export &Exporter TagSetDialog Add selected tag to current set. Ajouter l’étiquette à la collection. add Ajout Collections Collections New Nouveau delete Supprimer remove Supprimer TagSet editor Éditeur de collections Close Fermer Collections of Tags Collections d’étiquettes Available tags Étiquettes disponibles Available Tags Étiquettes disponibles Add Ajout Remove Supprimer TagsWidget Edit followed by a tag name Édition Remove tag "%1" from database the %%1 is a tag name Retirer l’étiquette %1 de la base de données Please confirm that you want to remove the following tag from database: Veuillez confirmer votre farouche volonté de ne plus entendre parler de : Please provide a replacement name for the following tag: Un nom de remplacement pour l’étiquette : TextProgressionWidget Form Formulaire Inline progression En-ligne e.g. Latin text ex. : texte en français Left to right de gauche à droite e.g. Arabic text ex. : texte en arabe Right to left de droite à gauche e.g. Traditional Chinese & Japanese text ex. : texte traditionnel en chinois & en japonais Top to bottom de haut en bas e.g. Runic text ex. : texte Runique Bottom to top de bas en haut Block progression Morceaux e.g. Traditional Mongolian text ex. : texte en mongol e.g. Tarditionnal Chinese & Japanes text ex. : text traditionnel en chinois & en japonais repairDialog Dialog Dialogue Dead links Liens morts Select all Sélectionne tout Remove Supprimer Activated Not Linked Activée Non Liées Re-link Re-lie Deactivate Désactive Deactivated Linked Liées Désactivées De-link Dé-lie Activate Active Close Fermer Database repair Vérifie la base Unreferenced Files Fichiers introuvables tagsWidget Form Formulaire Nothing selected Rien Right mouse click on a tag to add it or remove it from TagSet *** Add a tag Ajout Add Tag Ajouter typotek Fontmatrix Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. L’application continuera à vivre dans la boîte à miniatures, pour l’achever, selectionnez l’entrée <b>Quitter</b> du menu contextuel de l’icône et tirer. Add Directory Ajouter un répertoire &Import... &Importer... Ctrl+O Ctrl+O Import a directory Importer un répertoire &Save Enregi&strer Ctrl+S Ctrl+S Save the document to disk Enregistrer Print... Imprimer... Print a specimen of the current font Imprime un specimen de la fonte courante Export font book... Livre de fontes... Export a pdf that show selected fonts Exporte un document PDF exposant les fontes visibles E&xit &Quitter Ctrl+Q Ctrl+Q Exit the application Éteint Fontmatrix Edit preview word Éditer le mot aperçu &About À &propos Show the Typotek's About box À propos de Fontmatrix Help Aide &Tag Sets &Collection d’étiquettes Activate all currents Active les fontes visibles Deactivate all currents Désactive les fontes visibles Edit current font Éditer la fonte sélectionnée Try to run Fontforge with the selected font as argument Essaie de lancer Fontforge avec la fontes sélectionnée comme argument Preferences Préférences &File &Fichier Edit Édition &Help &Aide Ready Prêt Print specimen Imprime un specimen There is no font selected Il n’y a pas de fonte sélectionnée Support of DragNDrop over http is sheduled but not yet effective Le "glisser-déposer" ne marche pas encore pour des ressources sur le web Give a preview word Entrez un mot Fontmatrix wants a word Entrez un mot You bring something over me I can’t handle Je gère pas çà You provided an empty string, it’s not fair Une blague "default" is a reserved keyword "default" est un mot réservé Activate all current Active les fontes visibles Deactivate all current Désactive les fontes visibles Try to run font editor with the selected font as argument Essaie de lancer Fontforge avec la fonte sélectionnée comme argument You don't seem to have font editor installed. Path to font editor can be set in preferences. Il semble que vous ne disposez pas de boîte à miniatures Lists Listes Nothing Selected Aucune sélection Initial tags. The string you type will be split by "#" to obtain a tags list. Étiquette initial La chaîne que vous fournissez va être scindée par le caractère "#" Importing font files... Importe les fichiers de fonte... cancel Annuler Import Importe Fontmatrix care Fontmatrix prends soin de vous You are about to activate a bunch of fonts, it is time to cancel if it was not your intent Vous allez activer un paquet de fontes C’est le moment ou janmais d’annuler You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent Vous allez désactiver un paquet de fontesC’est le moment ou janmais d’annuler Can’t import this font because it’s broken : Cette fonte ne peut être importée car elle est cassée : Choose the tag for filter exported fonts Choisissez une étiquette pour filtrer les fontes qui seront exportées Choose Directory Choisissez un répertoire Export &Fonts Export des &Fontes Export a fontset Exporte un choix de fontes Check Database Vérifie la base Tag All... Étiquette tout... Load settings Chargement des paramètres Check for Fontmatrix own dir Vérification du répertoire Loading Chargement fonts present in database fontes dans la base de données Catching Récupère font descriptions from network descriptions de fontes depuis le réseau Collected System Font Fontes système Adding Ajoute fonts from system directories fontes provenant des répertoires systèmes fonts available from system fontes mises à disposition par le système font descriptions imported from network descriptions de fontes importées depuis le réseau Browse Fonts Parcourir default défaut "default" is a reserved "défaut" est réservé Fonts imported: %1 Fontes importées : %1 Export &fonts Print Info... Imprimer les informations... Print informations about the current font Imprime des informations relatives à la fonte sélectionnée Print Sample... Imprimer l’exemple... Print the sample as a specimen Imprime la page d’exemple dans la fonte sélectionnée Print Chart... Imprimer le tableau... Print a chart of the current font Imprime la table Unicode de la fonte courante Print Playground... Imprimer l’aire de jeu... Print the playground Imprime le contenu de l’aire de jeu Print Family... Imprime la famille... Print a specimen of the whole family the current face belongs to Imprime un specimen de la famille àlaquelle la fonte sélectionnée appartient Export font info for packaging... About &Qt À propos de &Qt Next Family Famille suivante Next Face Fonte suivante Previous Family Famille précèdente Previous Face Fonte pécèdente Layout Options Paramètres de mise en page Print Imprime &Edit &Édition &Browse &Parcourir Fontmatrix - data warning Fontmatrix - attention aux données Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is All fields Tous Welcome maessage Bienvenue dans Fontmatrix Print Infos Imprimer les informations Print Chart Imprimer le tableau Print Playground Imprimer l’aire de jeu Print Family Imprime la famille &Sync &Synchroniser Sync with the DB file Synchroniser l’état de l’application et la base de donnée Unicode character Caractère unicode Print Sample Imprimer l’exemple Not enough text to make a sample Pas assez de texte pour construire un example Tags Étiquettes Show TrueType tables Affiche les tables TT &View &Affichage System Fonts Fontes systèmes fonts from followed by a directory name fontes depuis system fonts added. fontes système ajoutées Close Fermer %n font(s) number of filtererd fonts showed in status bar %n police %n polices Filtered Font(s) : %n number of filtererd fonts showed in status bar Aucune police filtrée Polices filtrées : %n Current Font : followed by currently selected font name (in status bar) Police sélectionnée : Show/hide fonts browsing sidebar Affiche ou cache le volet d’exploration Show/hide tags list sidebar Affiche ou cache le volet d’étiquetage Cannot import this font because it is broken: Impossible d’importer cette fonte défectueuse : Cannot import this font because it is broken: Impossible d’importer cette fonte défectueuse : Fontmatrix Tags Fontmatrix Étiquettes Export a PDF document that shows selected fonts Exporter un document PDF montrant les fontes sélectionnées Export modelled info... Exporter des informations… Fill a template file with metadata for packaging currently selected font to a Linux distribution Exporter des informations selon un modèle (SPEC file par exemple) Show information about Fontmatrix Affiche quelques information à-propos de Fontmatrix Show information about Qt Affiche quelques informations à-propos de Qt F1 F1 Read documentation on Fontmatrix Affiche la documentation en ligne de Fontmatrix Activate all currently visible fonts Active toutes les fontes actuellement filtrées Deactivate all currently visible fonts Désactive toutes les fontes actuellement filtrées Edit currently selected font in a font editor of your choice Éditer la fonte courante You don't seem to have a font editor installed. Path to font editor can be set in Preferences dialog. Fontmatrix n’a pu détecter un éditeur de fonte sur votre système, vous pouvez le sélectionner dans les préférences. Setup Fontmatrix Ajuster Fontmatrix Check Fontmatrix database for dead links to font files Vérifie la bonne synchronisation entre l’état des fichiers de fontes sur le disque et la base de donnée Tag All Filtered... Tag all currently visible files Étiquetter toutes les fontes filtrées View hexadecimal values of TrueType tables for currently selected font file Affiche les tables TrueType Edit PANOSE metadata Éditer les infos PANOSE Edit PANOSE metadata without saving changes to font files Éditer les informations PANOSE sans toucher au fichier de fonte lui-même Switch to the next font family in the list Aller à la famille suivante Switch to the next font face in the list Aller à la fonte suivante Switch to the previous font family in the list Aller à la famille précédente Switch to the previous font face in the list Aller à la fonte suivante Text layout engine options Paramètres de mise en page View and edit text layout engine variables Altére les paramètres du moteur de mise en page tel que mis en œuvre dans l’onglet présentant un texte d’exemple Extract fonts... Extraire des fontes… Extract fonts from documents like PDF to PFM file format Extrait des fontes d’un containeur tel que PDF, ZIP, etc. Find a font using raster sample... Trouver une fonte depuis à une image… Find a font using a raster sample of a letter Trouve une fonte dans la collection à partir de l’image d’une lettre Execute Script... Lancer un script… Execute a Python script Lance un script Python Execute Last Script Relancer le dernier script Execute the last chosen Python script Relance le dernier script exécuté Script Console... Script Console... Open Python scripting console Ouvre l’interface de suivi des scripts &Scripts &Scripts &Service Loading System Fonts Fontmatrix Help Aide de Fontmatrix Python scripts (*.py) Scripts Python (*.py) Filtered Font(s): %n number of filtererd fonts showed in status bar Fonte filtrée : %n Fontes filtrées : %n Current Font: followed by currently selected font name (in status bar) Fonte courante : confirmation Do you confirm you want to import these %1 fonts? fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-zh_CN.ts0000644000175000017500000035231011023736606022500 0ustar malexmalex About About Fontmatrix 关于Fontmatrix The Project 项目 The People 人民 TextLabel 文本标签 Splash Close AboutWidget version 版本 fonts loaded 个字体加载 BookExportDialog Export Font Book 输出字体书 Output 输出 Browse... 浏览... FMLayout Text engine options FolderViewMenu Reload Tree Import Directory Import recursively Import File FontAction Action 行动 FontBookDialog Save fontBook 保存字体书 FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Copyright 版权 Font Family 字形族群 Font Subfamily 字形亚科 Unique font identifier Full font name Version string Postscript name Postscript名字 Trademark 商标 Manufacturer 厂商 Designer 设计者 Description 形容 URL Vendor URL Designer License Description License Info URL Reserved 预约的 Preferred Family 首選的字形族群 Preferred Subfamily 首選的字形亚科 Compatible Full (Macintosh only) Sample text 样本文 PostScript CID findfont name Fontmatrix - Download Fontmatrix - 下栽 Downloading %1. 下栽 %1. Any No Fit Text and Display Script Decorative Pictorial Family Type Cove Obtuse Cove Square Cove Obtuse Square Cove Square Thin Bone Exaggerated Triangle Normal Sans Obtuse Sans Perp Sans Flared Rounded Serif style Very Light Light Book Medium Demi Bold Heavy Black Nord Weight Old Style Modern Even Width Expanded Condensed Very Expanded Very Condensed Monospaced Proportion None Very Low Low Medium Low Medium High High Very High Contrast Gradual/Diagonal Gradual/Transitional Gradual/Vertical Gradual/Horizontal Rapid/Vertical Rapid/Horizontal Instant/Vertical Stroke Variation Straight Arms/Horizontal Straight Arms/Wedge Straight Arms/Vertical Straight Arms/Single Serif Straight Arms/Double Serif Non-Straight Arms/Horizontal Non-Straight Arms/Wedge Non-Straight Arms/Vertical Non-Straight Arms/Single Serif Non-Straight Arms/Double Serif Arm Style Normal/Contact Normal/Weighted Normal/Boxed Normal/Flattened Normal/Rounded Normal/Off Center Normal/Square Oblique/Contact Oblique/Weighted Oblique/Boxed Oblique/Flattened Oblique/Rounded Oblique/Off Center Oblique/Square Letterform Standard/Trimmed Standard/Pointed Standard/Serifed High/Trimmed High/Pointed High/Serifed Constant/Trimmed Constant/Pointed Constant/Serifed Low/Trimmed Low/Pointed Low/Serifed Midline Constant/Small Constant/Standard Constant/Large Ducking/Small Ducking/Standard Ducking/Large X-Height Category Help Fontmatrix Help Fontmatrix 帮助 ImportTagsDialog Dialog 对话框 Add 添加 Ok 确定 Fontmatrix - Tags ImportedFonts Dialog 对话框 Ok 确定 Imported Fonts <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> Do not show this dialog again ImportedFontsDialog (not loaded) Number of Imported Fonts LayoutOptionWidget Form Weights score before exact after end penalty H-penalty ListDock Search 搜索 Tag: 标签: Remove 去除 Form Filter view by chosing tag Switch to panose filtering P Filter: Field selection F TextLabel Show complete collection of available fonts Names Files Previews Folders ListDockWidget All fields Unicode All activated MainView part I part II main view widget Nothing selected Right mouse click on a tag to add it or remove it from TagSet Add a tag Font Information Settings S OpenType O OpenType Features Friendly Name Save as default Reset Default SampleText ... Layout Font Size pt Rendering FreeType Native Qt objects World is wide Shaper type Script Use shaper Text Progression Sample Text Coverage of Unicode Interval : Clicking on a glyph will show details about it Glyphs push Playground Set Mode "Copy Character to Clipboard" C MainViewWidget Names Activation event Cancel 取消 Activation of : Deactivation of : 000Basic Latin 001Latin-1 Supplement 002Latin Extended-A 003Latin Extended-B 004IPA Extensions 005Spacing Modifier Letters 006Combining Diacritical Marks 007Greek and Coptic 008Cyrillic 009Cyrillic Supplement 010Armenian 011Hebrew 012Arabic 013Syriac 014Arabic Supplement 015Thaana 016N'Ko 017Devanagari 018Bengali 019Gurmukhi 020Gujarati 021Oriya 022Tamil 023Telugu 024Kannada 025Malayalam 026Sinhala 027Thai 028Lao 029Tibetan 030Burmese 031Georgian 032Hangul Jamo 033Ethiopic 034Ethiopic Supplement 035Cherokee 036Unified Canadian Aboriginal Syllabics 037Ogham 038Runic 039Tagalog 040Hanunóo 041Buhid 042Tagbanwa 043Khmer 044Mongolian 045Limbu 046Tai Le 047New Tai Lue 048Khmer Symbols 049Buginese 050Balinese 051Lepcha 052Phonetic Extensions 053Phonetic Extensions Supplement 054Combining Diacritical Marks Supplement 055Latin Extended Additional 056Greek Extended 057General Punctuation 058Superscripts and Subscripts 059Currency Symbols 060Combining Diacritical Marks for Symbols 061Letterlike Symbols 062Number Forms 063Arrows 064Mathematical Operators 065Miscellaneous Technical 066Control Pictures 067Optical Character Recognition 068Enclosed Alphanumerics 069Box Drawing 070Block Elements 071Geometric Shapes 072Miscellaneous Symbols 073Dingbats 074Miscellaneous Mathematical Symbols-A 075Supplemental Arrows-A 076Braille Patterns 077Supplemental Arrows-B 078Miscellaneous Mathematical Symbols-B 079Supplemental Mathematical Operators 080Miscellaneous Symbols and Arrows 081Glagolitic 082Latin Extended-C 083Coptic 084Georgian Supplement 085Tifinagh 086Ethiopic Extended 087Supplemental Punctuation 088CJK Radicals Supplement 089Kangxi Radicals 090Ideographic Description Characters 091CJK Symbols and Punctuation 092Hiragana 093Katakana 094Bopomofo 095Hangul Compatibility Jamo 096Kanbun 097Bopomofo Extended 098CJK Strokes 099Katakana Phonetic Extensions 100Enclosed CJK Letters and Months 101CJK Compatibility 102CJK Unified Ideographs Extension A 103Yijing Hexagram Symbols 104CJK Unified Ideographs 105Yi Syllables 106Yi Radicals 107Modifier Tone Letters 108Latin Extended-D 109Syloti Nagri 110Phags-pa 111Hangul Syllables 112High Surrogates 113High Private Use Surrogates 114Low Surrogates 115Private Use Area 116CJK Compatibility Ideographs 117Alphabetic Presentation Forms 118Arabic Presentation Forms-A 119Variation Selectors 120Vertical Forms 121Combining Half Marks 122CJK Compatibility Forms 123Small Form Variants 124Arabic Presentation Forms-B 125Halfwidth and Fullwidth Forms 126Specials 127Supplementary Multilingual Plane (SMP) 128Supplementary Ideographic Plane (SIP) 129unassigned 130Supplementary Special-purpose Plane (SSP) 131Private Use Area 1 (PUA) 132Private Use Area 2 (PUA) 133Un-Mapped Glyphs 134View all mapped glyphs Fontmatrix takes care of you is activated. If you want to remove it from Fontmatrix database, please deactivate it first. Fontmatrix safe You are about to remove a font from Fontmatrix database Do you want to continue? Welcome to Fontmatrix PrefsPanel Preferences 偏好设置 size 尺寸 Browse... 浏览... Add 添加 http:// http:// Remove 去除 Close 关闭 Preferences Panel Show Fontmatrix in System Tray Close to System Tray Show "All" actions Ask confirmation when activating or deactivating all fonts Ask confirmation when activating or deactivating fonts by tags Preview Word is RTL pt Font Editor Add the full path to your preferred font editor /usr/bin/fontforge Ask for tag names when importing fonts Show names of imported fonts after import process Show splash at startup Don’t use preferred name scheme (will affect only newly imported fonts) General Named Sample Texts Initial Layout Font Size: Interline: Hyphenation Left: Right: Dictionary: Browse ... Apply Sample Text Templates Folder Remote directories Local storage Files and Folders Change TextLabel Shortcuts PrefsPanelDialog Looks like your setup does not have a system tray available. A text Select font editor Select Templates Folder Select Where remote font files will be stored Please select an item in the list or create a new one. Alt Ctrl Shift Meta Meta+ Shift+ Alt+ Ctrl+ Replace Shortcut is already in use for action name will be appended to this Do you still want to assign it? Action 行动 Shortcut Tip Select hyphenation dictionary QObject Copying files cancel 取消 Unable to copy ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv Creating font book... codepoint is U+ Mark, NonSpacing Mark, SpacingCombining Mark, Enclosing Number, DecimalDigit Number, Letter Number, Other Separator, Space Separator, Line Separator, Paragraph Other, Control Other, Format Other, Surrogate Other, PrivateUse Other, NotAssigned Letter, Uppercase Letter, Lowercase Letter, Titlecase Letter, Modifier Letter, Other Punctuation, Connector Punctuation, Dash Punctuation, Open Punctuation, Close Punctuation, InitialQuote Punctuation, FinalQuote Punctuation, Other Symbol, Math Symbol, Currency Symbol, Modifier Symbol, Other RemoteDir Downloading 下栽 Systray &Activate all &Deactivate all Mi&nimize &Restore E&xit 退出 &Tags TagSetDialog Add 添加 New 新建 delete 删除 Remove 去除 Close 关闭 TagSet editor Collections of Tags Available Tags Add selected tag to current set. Collections TextProgressionWidget Form Inline progression e.g. Latin text Left to right e.g. Arabic text Right to left e.g. Traditional Chinese & Japanese text Top to bottom e.g. Runic text Bottom to top Block progression e.g. Tarditionnal Chinese & Japanes text e.g. Traditional Mongolian text repairDialog Dialog 对话框 Select all 全选 Remove 去除 Deactivate 未激活 Activate 激活 Close 关闭 Dead links Re-link Activated Not Linked De-link Deactivated Linked typotek Nothing Selected 未选择 Fontmatrix Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Add Directory 添加目录 Importing font files... 导入 cancel 取消 Import 导入 Can’t import this font because it’s broken : 不能导入那个字体,它是错: Choose the tag for filter exported fonts Choose Directory &Import... 导入... Ctrl+O Ctrl+O Import a directory 导入目录 &Save 保存 Ctrl+S Ctrl+S Save the document to disk Export &Fonts Export a fontset Print... 打印... Export font book... 导出字体书... Export a pdf that show selected fonts E&xit 退出 Ctrl+Q Ctrl+Q Exit the application 退出Fontmatrix &About 关于 Show the Typotek's About box Help 帮助 &Tag Sets Activate all current Deactivate all current Edit current font Try to run font editor with the selected font as argument You don't seem to have font editor installed. Path to font editor can be set in preferences. Preferences 偏好设置 Check Database Tag All... &File 文件 Edit 编辑 &Help 帮助 Ready 就绪 Load settings Check for Fontmatrix own dir Loading 装载 fonts present in database Collected System Font Adding 添加 fonts from system directories fonts available from system Catching font descriptions from network font descriptions imported from network Fontmatrix care You are about to activate a bunch of fonts, it is time to cancel if it was not your intent You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent There is no font selected Support of DragNDrop over http is sheduled but not yet effective You bring something over me I can’t handle You provided an empty string, it’s not fair Browse Fonts default "default" is a reserved Fonts imported: %1 Print Info... Print informations about the current font Print Sample... Print the sample as a specimen Print Chart... Print a chart of the current font Print Playground... Print the playground Print Family... Print a specimen of the whole family the current face belongs to About &Qt Next Family Next Face Previous Family Previous Face Layout Options Print &Edit &Browse Fontmatrix - data warning Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Unicode All fields Welcome maessage Print Infos Print Chart Print Playground Print Family fontmatrix-0.6.0+svn20110930/src/messages/about.html0000644000175000017500000000136311216442071020727 0ustar malexmalex

Fontmatrix

A font manager for Linux.

Fontmatrix is aimed at adventurous graphic designers and typesetters who need to manage hundreds and even thousands of fonts for their work - avoiding the need to browse overly long lists in dialogs.

Basically, Fontmatrix helps you do three things:

  • Activating and deactivating your fonts
  • Tagging fonts with sets
  • Finding suitable fonts by constructing simple or complex queries
  • Refining the fonts selection by comparing glyphs in details
  • Generating font "books" as PDF.

Find more at fontmatrix.net or from built-in help system.

fontmatrix-0.6.0+svn20110930/src/messages/welcome_sv.html0000644000175000017500000000274211035172507021765 0ustar malexmalex Welcome to Fontmatrix
##WELCOME_FONT##
Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.
Fontmatrix has some unique functionalities in the Open Source world :
Activate, deactivate fonts to reduce font lists and save resources
Allow to tag font for a better classification and group (de)activation
Make it easy to find particular glyph thanks to a glyph category display
Create a font book that can be printed to have a real overview of the fonts available
Display advanced OpenType features
Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/messages/about_uk.html0000644000175000017500000000213110751052532021422 0ustar malexmalex

Fontmatrix

Програма для керування шрифтами у Linux.

Програму призначено для заповзятливих розробників графічної продукції та працівників друкарської промисловості, які мають справу з сотнями, а іноді і більшою кількістю шрифтів під час своєї роботи — мандруючи нескінченними списками та діалогами вибору шрифтів.

Загалом, Fontmatrix допоможе вам з трьома речами:
активацією та деактивацією шрифтів, зміною тегів шрифтів та створенням книги шрифтів.

Дізнатися більше про програму ви можете за адресою fontmatrix.net

fontmatrix-0.6.0+svn20110930/src/messages/welcome_hi.html0000644000175000017500000000274211035172507021735 0ustar malexmalex Welcome to Fontmatrix
##WELCOME_FONT##
Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.
Fontmatrix has some unique functionalities in the Open Source world :
Activate, deactivate fonts to reduce font lists and save resources
Allow to tag font for a better classification and group (de)activation
Make it easy to find particular glyph thanks to a glyph category display
Create a font book that can be printed to have a real overview of the fonts available
Display advanced OpenType features
Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-ru.ts0000644000175000017500000073546611431031121022125 0ustar malexmalex About About Fontmatrix О Fontmatrix Splash Заставка TextLabel TextLabel The Project Проект The People Участники Close Закрыть AboutWidget fonts loaded шрифтов загружено version Версия ActivationReportDialog Dialog Диалог Activation - Deactivation Error Report Отчет об ошибке активации-деактивации Close Закрыть Font path Расположение шрифта Error Ошибка AltSelectorWidget Form Form BookExportDialog Export Font Book Создание каталога шрифтов Output Вывод Browse... Просмотреть... ChartWidget Form Form Coverage of Unicode Interval Охват блока Unicode Block: Блок: Search: Искать: Search a character by its codepoint (expressed in hexadecimal and prefixed with "U+", "u+" or "+") or a glyph by its name. Press enter after editing to run the search. Поиск глифа по его коду (шестнадцатиричное значение с префиксом в виде "U+", "u+" или "+") или названию. Нажатие клавиши ввода запускает поиск. Clicking on a glyph will show details about it Щелкните по символу для подробного просмотра Set Mode "Copy Character to Clipboard" Включить режим копирования символов в буфер обмена Copy Mode Режим копирования Un-Mapped Glyphs Несвязанные глифы View all mapped glyphs Все связанные глифы Block (%1): Блок (%1): Print Chart Печать таблицы символов CompareWidget Form Form Fonts Шрифты Add Добавить Remove Удалить Show Показывать Controls Рычаги Metrics Метрики Select a character Выберите символ Points Узлы Keep in sync Синхронизировать Offset Смещение: 0 0 Fill: Заливка: DumpDialog TextLabel TextLabel Save to: Сохранить в: Browse... Просмотреть... Model Модель <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Available names Доступные поля метаданных Load... Загрузить... Fontmatrix - Export font info for packaging Fontmatrix — Экспорт данных о шрифте для упаковки FMActivate Unable to link Activation subroutine failed to make a symbolic link to the font file Не удалось связать Font already activated The Font asked for activation is already activated Шрифт уже активирован Unable to un-link Activation subroutine failed to remove a symbolic link to the font file Не удалось снять связь Font already de-activated The Font asked for de-activation is already de-activated Шрифт уже деактивирован Cannot link or copy the metrics file A postcript font (pfb) without its metrics file (afm) Не удалось связать или скопировать файл метрик Error activation A generic error in activation or deactivation process Ошибка FMFloatingMenu Activate Активировать close Закрыть FMFontExtract File does not exist: Файл не существует: Format not handled. Этот формат не поддерживается. Failed to extract: %1 Не удалось извлечь: %1 FMLayout Text engine options Параметры текстового движка FMMatchRaster The font %1 scores %2. Do you want to add it to the filtered fonts? No font match the submitted image Ни один шрифт в коллекции не соответствует указанному образцу FMMissingFontHelper Missing Font File Отсутствует файл шрифта Fontmatrix has been unable to load the font in file %1. Please check missing files. Fontmatrix has been unable to load fonts in files %1. Please check missing files. FMScriptConsole A name for the script to save: Имя сохраняемого сценарий: The file %1 already exists Файл %1 уже существует Running Выполняется FamilyWidget Form Form Return To List Вернуться в коллекцию Info Сводка Sample Образец Chart Таблица символов Activate Активировать Deactivate Деактивировать Family Name Название гарнитуры about:blank about:blank FilterBar Form Form Add Filter: Добавить фильтр: Meta Мета Add a generic metadata field to the filter Добавить в фильтр поле из типовых метаданных шрифта Metadata Метаданные Add a Panose metadata field to the filter Добавить в фильтр поле из метаданных Panose Panose Panose Manage named filters Управление именованными фильтрами Filters Фильтры Clear Очистить Tags Метки All activated Все активированные FilterItem Form Form TextLabel Метка Remove Filter Удалить фильтры X X <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <table style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If set, the filter will <span style=" font-weight:600;">intersect</span> with the previous filters.</p></td></tr></table></body></html> && && if set, it will filter all the fonts but these matching this filter ! ! FilterTagDialog Dialog Диалог FiltersDialog Dialog Диалог Filters Manager Управление фильтрами Filter Name: Название фильтра: OK ОК current filter Текущий фильтр Add Filter Добавить фильтр And И Not НЕ Or ИЛИ FiltersDialogItem Form Form filter name Название фильтра Apply this filter to the list Применить этот фильтр к списку Filter Фильтр Delete this filter Удалить этот фильтр Remove Удалить TextLabel TextLabel FloatingWidgetToolBar Form Form Close Закрыть Hide Скрыть Detach Отцепить Print Печать FolderViewMenu Import recursively Импортировать рекурсивно Import Directory Импортировать каталог Import File Импортировать файл Reload Tree Повторно загрузить дерево FontAction Form Form Action Действие Add Tag Добавить FontBookDialog Save fontBook Сохранить каталог шрифтов FontCompareWidget None No fill color in comprae glyph Нет FontExtractorDialog Select PDF Файл PDF Fonts Шрифты Font extractor Извлечение шрифтов &Browse &Указать... &Select Dir &Выбрать каталог &Extract &Извлечь File name Имя файла Close Закрыть FontItem Fontmatrix - Download Fontmatrix — Скачать Downloading %1. Скачивается %1. Category Категория FontStrings Copyright Авторские права Font Family Гарнитура Font Subfamily Начертание Unique font identifier Уникальный идентификатор шрифта Full font name Полное название шрифта Version string Строка версии Postscript name Имя по правилам PostScript Trademark Торговая марка Manufacturer Производитель Designer Дизайнер Description Описание URL Vendor URL производителя URL Designer URL дизайнера License Description Текст лицензии License Info URL URL текста лицензии Preferred Family Предпочитаемое семейство Preferred Subfamily Предпочитаемое начертание Compatible Full (Macintosh only) Полная совместимость (только Macintosh) Sample text Образец PostScript CID findfont name Имя для поиска по PostScript CID All fields Все поля Any Любой вариант No Fit Все остальное Text and Display Family Type Текстовая Script Family Type Рукописная Decorative Family Type Декоративная Pictorial Family Type Картиночная Family Type Тип гарнитуры Cove Serif style Куполообразные Obtuse Cove Serif style Куполообразные тупоугольные Square Cove Serif style Граненные куполообразные Obtuse Square Cove Serif style Граненные куполообразные тупоугольные Square Serif style Прямоугольные Thin Serif style Нитевидные Bone Serif style Шипообразные Exaggerated Serif style Резко расширяющиеся Triangle Serif style Треугольные Normal Sans Serif style Нормальные Obtuse Sans Serif style Тупоугольные Perp Sans Serif style Перпендикулярные Flared Serif style Расширяющиеся Rounded Serif style Закругленные Serif style Стиль засечек Very Light Weight Сверхсветлый Light Weight Светлый Thin Weight Тонкий Book Weight Нормальный Medium Weight Средний Demi Weight Полужирный Bold Weight Жирный Heavy Weight Сверхжирный Black Weight Черный Nord Weight Нордический Weight Насыщенность Old Style Proportion Старый стиль Modern Proportion Модерн Even Width Proportion Равноширинный Expanded Proportion Расширенный Condensed Proportion Сжатый Very Expanded Proportion Очень расширенный Very Condensed Proportion Очень сжатый Monospaced Proportion Моноширинный Proportion Пропорции None Contrast Нет Very Low Contrast Очень низкий Low Contrast Низкий Medium Low Contrast Умеренно низкий Medium Contrast Средний Medium High Contrast Умеренно высокий High Contrast Высокий Very High Contrast Очень высокий Contrast Контраст Gradual/Diagonal Stroke Variation Постепенное, диагональное Gradual/Transitional Stroke Variation Постепенное, переходное Gradual/Vertical Stroke Variation Постепенное, вертикальное Gradual/Horizontal Stroke Variation Постепенное, горизонтальное Rapid/Vertical Stroke Variation Резкое, вертикальное Rapid/Horizontal Stroke Variation Резкое, горизонтальное Instant/Vertical Stroke Variation Постоянное, вертикальное Stroke Variation Изменение штриха Straight Arms/Horizontal Arm Style Прямой штрих, горизонтальные Straight Arms/Wedge Arm Style Прямой штрих, клинообразные Straight Arms/Vertical Arm Style Прямой штрих, вертикальные Straight Arms/Single Serif Arm Style Прямой штрих, одиночная засечка Straight Arms/Double Serif Arm Style Прямой штрих, двойная засечка Non-Straight Arms/Horizontal Arm Style Непрямой штрих, горизонтальные Non-Straight Arms/Wedge Arm Style Непрямой штрих, клинообразные Non-Straight Arms/Vertical Arm Style Непрямой штрих, вертикальные Non-Straight Arms/Single Serif Arm Style Непрямой штрих, одиночная засечка Non-Straight Arms/Double Serif Arm Style Непрямой штрих, двойная засечка Arm Style Горизонтальный штрих и концевые элементы Normal/Contact Letterform Прямой, окружность Normal/Weighted Letterform Прямой, утяжеленный Normal/Boxed Letterform Прямой, оквадраченный Normal/Flattened Letterform Прямой, плоский Normal/Rounded Letterform Прямой, закругленный Normal/Off Center Letterform Прямой, со смещенным центром Normal/Square Letterform Прямой, квадрат Oblique/Contact Letterform Наклонный, окружность Oblique/Weighted Letterform Наклонный, утяжеленный Oblique/Boxed Letterform Наклонный, оквадраченный Oblique/Flattened Letterform Наклонный, плоский Oblique/Rounded Letterform Наклонный, закругленный Oblique/Off Center Letterform Наклонный, со смещенным центром Oblique/Square Letterform Наклонный, квадрат Letterform Форма символа Standard/Trimmed Midline Обычная, вершина укорочена Standard/Pointed Midline Обычная, вершина остроконечна Standard/Serifed Midline Обычная, вершина с засечкой High/Trimmed Midline Высокая, вершина укорочена High/Pointed Midline Высокая, вершина остроконечна High/Serifed Midline Высокая, вершина с засечкой Constant/Trimmed Midline Постоянная, вершина укорочена Constant/Pointed Midline Постоянная, вершина остроконечна Constant/Serifed Midline Постоянная, вершина с засечкой Low/Trimmed Midline Низкая, вершина укорочена Low/Pointed Midline Низкая, вершина остроконечна Low/Serifed Midline Низкая, вершина с засечкой Midline Средняя линия Constant/Small X-Height Постоянный, небольшой Constant/Standard X-Height Постоянный, обычный Constant/Large X-Height Постоянный, большой Ducking/Small X-Height Ныряющий, небольшой Ducking/Standard X-Height Ныряющий, обычный Ducking/Large X-Height Ныряющий, большой X-Height Рост строчных This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Это значение устарело и никогда не использовалось во FreeType. Не используйте его и не пытайтесь его тестировать. Character to glyph mapping Привязка символов к глифам Font header Заголовок шрифта Horizontal header Заголовок горизонтального размещения Horizontal metrics Горизонтальные метрики Maximum profile Профиль максимума Naming table Таблица имен OS/2 and Windows specific metrics Специфичные для OS/2 и Windows метрики PostScript information Данные для PostScript-принтеров Control Value Table Таблица контрольных значений (CVT) Font program Программа шрифта Glyph data Данные глифов Index to location Смещения относительно расположения глифов в шрифте CVT Program Программа таблицы контрольных значений (CVT) PostScript font program Компактное представление шрифта PostScript Type1 (CFF) Vertical Origin Начальная координата Y каждого глифа в шрифте Embedded bitmap data Встроенные растровые данные Embedded bitmap location data Адрес встроенных растровых данных Embedded bitmap scaling data Масштабирование встроенных растровых данных Baseline data Данные линии шрифта Glyph definition data Данные определения глифов Glyph positioning data Данные позиционирования глифов Glyph substitution data Данные подстановки глифов Justification data Данные выключки Digital signature Цифровая подпись Grid-fitting/Scan-conversion Вписывание в пиксельную сетку Horizontal device metrics Kerning Кернинг Linear threshold data Данные линейного порога PCL 5 data Данные PCL5 Vertical device metrics Vertical Metrics header Заголовок вертикального размещения Vertical Metrics Вертикальные метрики This font may be embedded and permanently installed on the remote system by an application. The user of the remote system acquires the identical rights, obligations and licenses for that font as the original purchaser of the font, and is subject to the same end-user license agreement, copyright, design patent, and/or trademark as was the original purchaser. Этот шрифт можно встраивать в документы и постоянно устанавливать в другие системы. Пользователь другой системы имеет те же права, обязанности и лицензию на этот шрифт, что и первоначальный покупатель этого шрифта, и является субъектом того же лицензионного соглашения, авторских прав, патента на дизайн и/или торговой марки. This font must not be modified, embedded or exchanged in any manner without first obtaining permission of the legal owner. Этот шрифт нельзя изменять, встраивать или передавать третьим лицам без предварительного разрешения от владельца авторских права. This font may be embedded, and temporarily loaded on the remote system. Documents containing this font must be opened "read-only;" no edits can be applied to the document. Этот шрифт может быть встроен в документ и временно загружен в других системах. Содержащие этот шрифт документы могут открываться только для чтения; изменение таких документов запрещено. This font may be embedded but must only be installed temporarily on other systems. In contrast to Preview &amp; Print fonts, documents containing this font may be opened for reading, editing is permitted, and changes may be saved. Этот шрифт может быть встроен в документ, но на других системах он может быть установлен лишь временно. В отличии от шрифтов, которые можно только читать и печатать, содержащие этот шрифт документы можно читать, редактировать и сохранять изменения. This font may not be subsetted prior to embedding. Other embedding restrictions specified in bits 0-3 and 9 also apply. Подмножество глифов этого шрифта нельзя встраивать в документы. Only bitmaps contained in this font may be embedded. No outline data may be embedded. If there are no bitmaps available in this font, then it is considered unembeddable and the embedding services will fail. Other embedding restrictions specified in bits 0-3 and 8 also apply. Not Restricted Нет ограничений Restricted Есть ограничения Preview/Print Просмотр и печать Edit/Embed Встраивание и правка документов No Subset Без подмножества Bitmap Only Только растр Help Fontmatrix Help Справка по Fontmatrix Close Закрыть HelpBrowser &File &Файл &Edit &Правка &Bookmarks &Закладки &Print... &Печать... &Quit В&ыход &Find... &Найти... Find &Next Найти &следующее совпадение Find &Previous Найти &предыдущее совпадение &Add Bookmark &Добавить закладку &Delete &Удалить D&elete All &Удалить все Find Искать Search Term: Искомый термин: New Bookmark Новая закладка New Bookmark's Title: Название новой закладки: <h2><p>Sorry, no manual is installed!</p><p>Please contact your package provider or Fontmatrix team if you built the application yourself</p></h2> HTML message for no documentation available to show <h2><p>Извините, но руководство пользователя не установлено!</p><p>Свяжитесь с создателем пакета дял вашего дистрибутива, либо, если вы самостоятельно собирали Fontmatrix, с разработчиками программы.</p></h2> Fontmatrix Help Справка по Fontmatrix &Contents &Содержание Se&arch Ис&кать Searching is case insensitive Поиск регистронезависим &Search &Искать 1 1 Book&marks &Закладки &New &Добавить &Exit В&ыход Find &Next... Найти &следующее совпадение... Find &Previous... Найти &предыдущее совпадение... &Add &Добавить Fontmatrix Online Help Справка по Fontmatrix ImportTagsDialog Add Добавить Ok ОК Fontmatrix - Tags Fontmatrix — Метки ImportedFonts <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> <qt>Вместо этого диалога показывать число импортированных шрифтов в статусной строке. Вы можете отменить этот выбор в диалоге настройки программы.</qt> Imported fonts Импортированные шрифты Imported Fonts: Импортированы следующие шрифты: &Do not show this dialog again &Больше не показывать этот диалог &OK &ОК ImportedFontsDialog (not loaded) (не загружено) Number of Imported Fonts Количество импортированных шрифтов: LayoutOptionWidget Weights Вес переменных score penalty H-penalty space Пробел Text layout engine options Параметры текстового движка Before До Exact Точно After После End В конце Max. compression Макс. сжатие ListDock Form Form Filter view by chosing tag Отфильтровать список шрифтов выбором метки Names Названия Show complete collection of available fonts Показать всю коллекцию шрифтов F П TextLabel TextLabel Previews Миниатюры Folders Папки reset Сбросить <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want to negate the filter,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prefix the word with "!" such as in:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">"!pattern"</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want to enqueue the filter,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prefix it with "+".</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally, you can mix negate and queue in:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">"+!pattern"</span> or "!+pattern"</p></body></html> Not НЕ And И save Сохранить Collapse or expand Развернуть/Свернуть Show face boxes Отключаемые начертания ListDockWidget All activated Все активированные Unicode character Юникодный символ Similar to current Схожие с текущим Tags Метки You can use the following keywords to be replaced by data from fonts: <strong>&#60;name&#62;</strong> ; <strong>&#60;family&#62;</strong> ; <strong>&#60;variant&#62;</strong> Вы можете использовать следующие ключевые слова для подстановки метаданных шрифтов: <strong>&#60;name&#62;</strong> ; <strong>&#60;family&#62;</strong> ; <strong>&#60;variant&#62;</strong> Collapse Top Level Свернуть верхний уровень Collapse Families Свернуть гарнитуры Expand Top Level Развернуть верхний уровень Expand Families Развернуть гарнитуры MainView main view widget main view widget Quick Search: Быстрый поиск: Font Information Сводка Sample Text Образец текста Font Size Кегль шрифта pt pt Use shaper Использовать шейпер OpenType Features Функции OpenType Friendly Name Удобочитаемое название Glyphs Глифы Clicking on a glyph will show details about it Щелкните по символу для подробного просмотра Playground Песочница push Добавить Settings Параметры OpenType OpenType Save as default Запомнить Reset Default Сбросить FreeType Отрисовка через FreeType Native Qt objects Отрисовка средствами Qt World is wide Мир велик Shaper type Шейпер: Set Mode "Copy Character to Clipboard" Включить режим копирования символов в буфер обмена No hinting Без уточнения Light Hinting Слабое уточнение Normal Hinting Обычное уточнение Display Settings Параметры отображения Classification Классификация Compare Сравнение глифов Script Writing system Письменность: Edit sample text Изменить текст образца Edit Изменить FreeType based rasterized rendering Растрированный рендеринг на основе FreeType Vectorized rendering using native toolkit (Qt) Векторный рендеринг средствами графической библиотеки Qt Coverage of Unicode Interval Охват блока Unicode Block: Блок: More Options Больше параметров ... ... Search: Искать: Copy Mode Режим копирования 1 1 Search a character by its codepoint (expressed in hexadecimal and prefixed with "U+", "u+" or "+") or a glyph by its name. Press enter after editing to run the search. Поиск глифа по его коду (шестнадцатиричное значение с префиксом в виде "U+", "u+" или "+") или названию. Нажатие клавиши ввода запускает поиск. Sample Выбор текста Appearance Отрисовка Font Size: Кегль шрифта: Sample text rendering options Параметры отрисовки образца текста Display settings Параметры отображения Enable and disable OpenType features implemented in the font Включение и отключение функций OpenType, доступных в выбранном шрифте OpenType features Функции OpenType Choose a sample text from your collection Выбор образцов текста из коллекции Samples collection Образцы текста Rasterized Растрированная Freely scalable vector rendering using native toolkit (Qt) Свободно масштабируемая отрисовка текста Vector Векторная MainViewWidget Names Названия Fontmatrix takes care of you Fontmatrix заботится о вас is activated. If you want to remove it from Fontmatrix database, please deactivate it first. активирован. Если вы хотите убрать его из базы данных Fontmatrix, деактивируйте его для начала. Fontmatrix safe Fontmatrix волнуется You are about to remove a font from Fontmatrix database Вы собираетесь удалить шрифт из базы данных Fontmatrix Do you want to continue? Вы хотите продолжить? Welcome to Fontmatrix Добро пожаловать в Fontmatrix Load Загрузить An error occured when tried to load %1 with command: %2 %1 is an url and %2 a program Произошла ошибка при попытке загрузить %1 командой: %2 122.0 Size of the welcome message 18.0 Block (%1): Блок (%1): User Добавленный Un-Mapped Glyphs Несвязанные глифы View all mapped glyphs Все связанные глифы MatchRasterDialog Input Image Изображение символа A unique character or a four digits hexadecimal Unicode value Значение символа по таблице Unicode (четыре символа в шестнадцатеричной кодировке) Compare with: Образец сравнивается с: &Browse &Указать C&haracter: &Символ: &Search &Искать &Cancel О&тменить Find a font using raster sample Поиск шрифта по растровому образцу Raster sample preview Предпросмотр образца символа Interactive Интерактивно Click on the letter to let Fontmatrix compute the bounding box Щёлкните по символу, чтобы Fontmatrix вычислил его площадку Stop Стоп Grab mode Режим захвата Zoom level Масштаб If set, you will be prompted for each matching font Если включено, будет запрашиваться подтверждение на каждый подходящий шрифт Tweak rect Редактируемый прямоугольник MetaWidget Form Form Fill-in a text field and press enter to filter on a single domain or click "Add Filters" button for multiple filters. Add Filters Добавить фильтры PanoseDialog Fontmatrix - Panose Editor Fontmatrix — Редактор PANOSE TextLabel TextLabel PanoseWidget Form Form Panose Metadata Метаданные Panose Panose Attributes Атрибуты Panose PlayWidget Form Form Font Size: Кегль шрифта: pt pt Playground Песочница Print Playground Печать содержимого песочницы PrefsPanel Preferences Panel Диалог настройки General Общие Show Fontmatrix in System Tray Показывать Fontmatrix в области уведомления Show "All" actions Показывать «все» действия Preview Word Слово в области предпросмотра is RTL Справа налево pt pt Add the full path to your preferred font editor Полный путь к исполняемому файлу предпочитаемого редактора шрифтов /usr/bin/fontforge /usr/bin/fontforge Browse... Просмотреть... Ask for tag names when importing fonts Спрашивать имена меток при импорте шрифтов Add Добавить Initial Layout Исходный макет Font Size: Кегль шрифта: Templates Folder Каталог со шрифтами Remote directories Удаленные каталоги http:// http:// Remove Удалить Local storage Локальное хранилище Close Закрыть Show names of imported fonts after import process Показывать названия импортированных шрифтов после импорта Change Изменить TextLabel TextLabel Show splash at startup Показывать заставку при старте Left: Слева: Right: Справа: Browse Указать... Files & Folders Файлы и папки Close to system tray Закрывать в область уведомления Start minimized to system tray При запуске прятать главное окно в область уведомления subtitled Подписывать Chart Subtitle Font Шрифт для подписи под эскизом linespacing: Интерлиньяж: Select an hyphenation dict file as it comes with OpenOffice or Scribus Укажите файл с таблицей переноса, который обычно есть в комплекте с OpenOffice.org и Scribus Sample Texts Образцы текста + + Fonts Editor Редактор шрифтов Extra options: Дополнительные параметры: System tray Область уведомления Display Отображение Samples collection Образцы текста Shortcuts Комбинации клавиш Word: Слово: Hyphenation dictionary Словарь переносов Service Сервис Size: Кегль шрифта: Default font size: Кегль шрифта по умолчанию: Information Style Стиль оформления сводки Select Style Выберите стиль: Save Сохранить Ask for confirmation when activating or deactivating all fonts Запрашивать подтверждение на активацию и деактивацию всех шрифтов Ask for confirmation when activating or deactivating fonts by tags Запрашивать подтверждение на активацию и деактивацию по меткам Help Browser Браузер по справке PrefsPanelDialog Looks like your setup does not have a system tray available. Похоже, в вашей системе нет области уведомления. Select font editor Укажите редактор шрифтов Select Templates Folder Укажите каталог с шаблонами Select Where remote font files will be stored Укажите расположение разделяемых шрифтов Action Действие Shortcut Комбинация Please select an item in the list or create a new one. Выберите вариант из списка или добавьте собственный. Alt Alt Ctrl Ctrl Shift Shift Meta Meta Meta+ Meta+ Shift+ Shift+ Alt+ Alt+ Ctrl+ Ctrl+ Replace Заменить Shortcut is already in use for action name will be appended to this Комбинация уже используется для Do you still want to assign it? Вы все еще хотите назначить ее? Tip Подсказка Select hyphenation dictionary Выберите словарь переносов Sample Text A default sample text inserted when creating a new sample Образец текста Sample text Ein Textbeispiel Do you confirm that you want to remove: the name of a sample text will be append to the string Вы действительно хотите удалить: Select web browser Выберите веб-браузер You can use the following keywords to be replaced by data from fonts: <strong>&#60;name&#62;</strong> ; <strong>&#60;family&#62;</strong> ; <strong>&#60;variant&#62;</strong> Вы можете использовать следующие ключевые слова для подстановки метаданных шрифтов: <strong>&#60;name&#62;</strong> ; <strong>&#60;family&#62;</strong> ; <strong>&#60;variant&#62;</strong> QObject Copying files Копируются файлы cancel Отменить Unable to copy Не удалось скопировать Creating font book... Создается каталог шрифтов... codepoint is U+ Mark, NonSpacing Mark, SpacingCombining Mark, Enclosing Number, DecimalDigit Числа, десятичные Number, Letter Number, Other Числа, прочие Separator, Space Разделители, пробелы Separator, Line Разделители, строки Separator, Paragraph Разделители, абзацы Other, Control Other, Format Other, Surrogate Other, PrivateUse Other, NotAssigned Letter, Uppercase Буквы, прописные Letter, Lowercase Буквы, строчные Letter, Titlecase Буквы, Заглавные Letter, Modifier Буквы, модификаторы Letter, Other Буквы, прочие Punctuation, Connector Знаки препинания, соединители Punctuation, Dash Знаки препинания, тире Punctuation, Open Знаки препинания, открывающие Punctuation, Close Знаки препинания, закрывающие Punctuation, InitialQuote Знаки препинания, открывающие кавычки Punctuation, FinalQuote Знаки препинания, закрывающие кавычки Punctuation, Other Знаки препинания, прочие Symbol, Math Символы, математика Symbol, Currency Символы, валюта Symbol, Modifier Символы, модификаторы Symbol, Other Символы, прочее Access All Alternates Все альтернативные варианты Above-Base Forms Above-Base Mark Positioning Above-Base Substitutions Alternative Fractions Альтернативные дроби Akhands Below-Base Forms Below-Base Mark Positioning Below-Base Substitutions Petite Capitals From Capitals Маленькая капитель из прописных Small Capitals From Capitals Капитель из прописных Contextual Alternates Контекстные альтернативы Case-Sensitive Forms Формы с учетом регистра Glyph Composition/Decomposition Композиция/декомпозиция глифа Contextual Ligatures Контекстные лигатуры Conjunct Forms Объединенные формы Capital Spacing Интервал прописных Contextual Swash Контекстный росчерк Cursive Positioning Курсивное размещение Default Processing Distances Расстояния Discretionary Ligatures Дискреционные лигатуры Denominators Знаменатели Expert Forms Экспертные формы Final glyph Alternates Альтернативные формы последнего глифа строки Terminal Forms #2 Конечные формы #2 Terminal Forms #3 Конечные формы #3 Terminal Forms Конечные формы Fractions Дроби Full Width Замена глифами шириной в 1 em Half Forms Половинные формы согласных Halant Forms Alternate Half Width Перестройка глифов из 1 em в 1/2 em Historical Forms Исторические формы Horizontal Kana Alternates Замена горизонт. альтернативами глифов каны Historical Ligatures Исторические лигатуры Hangul Замена глифов ханджи глифами хангула Hojo Kanji Forms (JIS x 212-1990 Kanji Forms) Half Width Замена глифами в 1/2 em Initial Forms Начальные формы Isolated Forms Изолированные формы Italics Курсивные варианты Justification Alternatives Улучшающие выключку варианты JIS78 Forms Формы из спецификации JIS78 JIS83 Forms Формы из спецификации JIS83 JIS90 Forms Формы из спецификации JIS90 JIS2004 Forms Формы из спецификации JIS2004 Kerning Кернинг Left Bounds Визуальная выключка по левому краю Standard Ligatures Стандартные лигатуры Leading Jamo Forms Начальные формы Жамо Lining Figures Выстраивание цифр Localized Forms Локализованные формы Mark Positioning Размещение значка Medial Forms #2 Срединные формы 2 Medial Forms Срединные формы Mathematical Greek Математические символы из греческого алфавита Mark to Mark Positioning Размещение одного значка по отношению к другому Mark Positioning via Substitution Размещение значка через подстановку Alternate Annotation Forms Альтернативные формы аннотации NLC Kanji Forms Формы кандзи по NLC Nukta Forms Numerators Числители Old Style Figures Минускульные цифры Optical Bounds Визуальная выключка Ordinals Порядковые числительные Ornaments Орнаменты Proportional Alternate Width Перестройка глифов из 1 em в пропорциональную ширину Petite Capitals Маленькая капитель Proportional Figures Пропорциональные цифры Pre-base Forms Pre-base Substitutions Post-base Forms Post-base Substitutions Proportional Widths Замена единообразных глифов пропорциональными Quarter Widths Замена на глифы в 1/4 em Randomize Случайный выбор альтернативных форм Rakar Forms Required Ligatures Необходимые лигатуры Reph Form Right Bounds Визуальная выключка по правому краю Right-To-Left Alternates Альтернативы для письменностей слева направо Ruby Notation Forms Рубиновые формы письма Stylistic Alternates Стилистические альтернативы Scientific Inferiors Научные подстрочные знаки Optical Size Оптический размер Small Capitals Капитель Simplified Forms Упрощенные формы Subscript Нижний индекс Superscript Верхний индекс Swash Росчерк Titling Формы для заголовков Trailing Jamo Forms Замыкающие формы Жамо Traditional Name Forms Формы для имен собственных (кандзи) Tabular Figures Табличные цифры Traditional Forms Традиционные формы Third Widths Замена на глифы в 1/3 em Unicase Единый регистр Alternate Vertical Metrics Альтернативные вертикальные метрики Vattu Variants Vertical Writing Замена вариантами для вертикального письма Alternate Vertical Half Metrics Перестройка глифов с 1 em на 1/2 em в высоту Vowel Jamo Forms Гласные формы Жамо Vertical Kana Alternates Вертикальные альтернативы каны Vertical Kerning Вертикальный кернинг Proportional Alternate Vertical Metrics Перестройка глифов с 1em на пропорциональную высоту Vertical Rotation Замена вариантами для вертикального письма Slashed Zero Перечеркнутый ноль Stylistic Set 1 Стилистический набор 1 Stylistic Set 2 Стилистический набор 2 Stylistic Set 3 Стилистический набор 3 Stylistic Set 4 Стилистический набор 4 Stylistic Set 5 Стилистический набор 5 Stylistic Set 6 Стилистический набор 6 Stylistic Set 7 Стилистический набор 7 Stylistic Set 8 Стилистический набор 8 Stylistic Set 9 Стилистический набор 9 Stylistic Set 10 Стилистический набор 10 Stylistic Set 11 Стилистический набор 11 Stylistic Set 12 Стилистический набор 12 Stylistic Set 13 Стилистический набор 13 Stylistic Set 14 Стилистический набор 14 Stylistic Set 15 Стилистический набор 15 Stylistic Set 16 Стилистический набор 16 Stylistic Set 17 Стилистический набор 17 Stylistic Set 18 Стилистический набор 18 Stylistic Set 19 Стилистический набор 19 Stylistic Set 20 Стилистический набор 20 Glyphs count Число глифов Font Type Тип шрифта Charmaps List Список кодировок Basic Latin Основная латиница Latin-1 Supplement Latin-1, дополнение 1 Latin Extended-A Латиница, расширение А Latin Extended-B Латиница, расширение B IPA Extensions Расширения IPA Spacing Modifier Letters Модификаторы пробелов Combining Diacritical Marks Объединяющие диакритические знаки Greek and Coptic Греческий и коптский Cyrillic Кириллица Cyrillic Supplement Кириллица, дополнение Armenian Армянский Hebrew Иврит Arabic Арабский Syriac Сирийский Arabic Supplement Арабские дополнительные Thaana Таана NKo Н'ко Devanagari Деванагари Bengali Бенгали Gurmukhi Гурмухи Gujarati Гуджарати Oriya Орийя Tamil Тамильский Telugu Телугу Kannada Каннада Malayalam Малайский Sinhala Сингалезский Thai Тайский Lao Лаосский Tibetan Тибетский Georgian Грузинский Hangul Jamo Хангул Ямо Ethiopic Эфиопский Ethiopic Supplement Эфиопский, дополнение Cherokee Чероки Ogham Огамическое письмо Runic Руническое письмо Tagalog Тагалог Hanunoo Хануноо Buhid Бухид Tagbanwa Тагбанва Khmer Кхмерский Mongolian Монгольский Limbu Лимбу Tai Le Тайский Ле New Tai Lue Новый Тайский Ле Khmer Symbols Кхмерские символы Buginese Бугинский Balinese Балинезийский Sundanese Сунданский Lepcha Лепча Ol Chiki Ол Чики Phonetic Extensions Фонетические расширения Phonetic Extensions Supplement Фонетические расширения, дополнение Combining Diacritical Marks Supplement Комбинированные диакритические знаки, дополнение Latin Extended Additional Латиница расширенная дополнительная Greek Extended Греческий расширенный General Punctuation Общая пунктуация Superscripts and Subscripts Надстрочные и подстрочные Currency Symbols Символы валют Combining Diacritical Marks for Symbols Комбинированные диакритические знаки для символов Letterlike Symbols Буквообразные символы Number Forms Формы чисел Arrows Стрелки Mathematical Operators Математические операторы Miscellaneous Technical Различные технические символы Control Pictures Управляющие картинки Optical Character Recognition Оптическое распознавание символов Enclosed Alphanumerics Алфавитно-цифровые символы в рамке Box Drawing Для рисования рамок Block Elements Блочные элементы Geometric Shapes Геометрические фигуры Miscellaneous Symbols Различные символы Dingbats Условные знаки Miscellaneous Mathematical Symbols-A Различные математические символы A Supplemental Arrows-A Дополнительные стрелки A Braille Patterns Азбука Брайля Supplemental Arrows-B Дополнительные стрелки B Miscellaneous Mathematical Symbols-B Различные математические символы B Supplemental Mathematical Operators Дополнительные математические операторы Miscellaneous Symbols and Arrows Различные символы и стрелки Glagolitic Глаголица Latin Extended-C Латиница, расширение C Coptic Коптский Georgian Supplement Грузинский, дополнения Tifinagh Тифинаг Ethiopic Extended Эфиопский, расширенный Cyrillic Extended-A Кириллица, расширение А Supplemental Punctuation Дополнительные знаки препинания CJK Radicals Supplement Дополнения корней CJK Kangxi Radicals Корни Кангхи Ideographic Description Characters Символы идеографического описания CJK Symbols and Punctuation Символы и знаки препинания CJK Hiragana Хирагана Katakana Катакана Bopomofo Бопомото Hangul Compatibility Jamo Хангул, совместимый с Ямо Kanbun Канбун Bopomofo Extended Бопомото, расширенный CJK Strokes Росчерки CJK Katakana Phonetic Extensions Катакана, фонетические расширения Enclosed CJK Letters and Months Знаки и месяца CJK в рамке CJK Compatibility CJK, совместимость CJK Unified Ideographs Extension A CJK, объединенные идеограммы, расширение A Yijing Hexagram Symbols Гексаграммы Юиджинг CJK Unified Ideographs CJK, объединенные идеограммы Yi Syllables Слоги Юи Yi Radicals Корни Юи Vai Ваи Cyrillic Extended-B Кириллица, расширение B Modifier Tone Letters Модификаторы тона Latin Extended-D Латиница, расширение D Syloti Nagri Силоти Нагри Phags-pa Фагс-па Hangul Syllables Слоги Хангул High Surrogates Заменители в верхнем регистре High Private Use Surrogates Заменители в верхнем регистре, пользовательские Low Surrogates Заменители в нижнем регистре Private Use Area Область пользователя CJK Compatibility Ideographs CJK, идеограммы для совместимости Alphabetic Presentation Forms Формы алфавитного представления (лигатуры) Arabic Presentation Forms-A Арабские формы представления A Vertical Forms Вертикальные формы CJK Compatibility Forms CJK, формы для совместимости Small Form Variants Малые варианты форм Arabic Presentation Forms-B Арабские формы представления B Specials Специальные Linear B Syllabary Линейное слоговое письмо Б Linear B Ideograms Линейное идеографическое письмо Б Aegean Numbers Эгейские числа Ancient Greek Numbers Древнегреческие числа Phaistos Disc Фестский диск Lycian Ликийский Carian Карийский Old Italic Этрусский Gothic Готское письмо Ugaritic Угаритский Old Persian Древнеперсидский Deseret Дезерет Shavian Скорописный алфавит Бернарда Шоу Osmanya Сомалийское письмо Cypriot Syllabary Кипрское письмо Phoenician Финикийский Lydian Лидийский Kharoshthi Кхароштхи Cuneiform Клинопись Cuneiform Numbers and Punctuation Клинописные числа и знаки препинания Byzantine Musical Symbols Визайнтийская нотная грамота Musical Symbols Нотная грамота Ancient Greek Musical Notation Древнегреческая нотная грамота Counting Rod Numerals Счетные палочки Mathematical Alphanumeric Symbols Математические алфавитно-цифровые символы Mahjong Tiles Кости для игры в маджонг Domino Tiles Кости для игры в домино CJK Unified Ideographs Extension B CJK, объединенные идеограммы, расширение B Tags Метки Supplementary Private Use Area-A Дополнительная область пользователя A Supplementary Private Use Area-B Дополнительная область пользователя B Unicode Ranges Блоки Unicode Chart Таблица символов Sample Выбор текста RemoteDir Downloading Скачивается SampleWidget Form Form OpenType Features Функции OpenType Friendly Name Удобочитаемое название Save as default Запомнить Reset Default Сбросить Appearance Отрисовка Font Size Кегль шрифта pt pt FreeType based rasterized rendering Растрированный рендеринг на основе FreeType Rasterized Растрированная No hinting Без уточнения Light Hinting Слабое уточнение Normal Hinting Обычное уточнение Freely scalable vector rendering using native toolkit (Qt) Свободно масштабируемая отрисовка текста Vector Векторная World is wide Мир велик Script Writing system Письменность Shaper type Шейпер: Use shaper Использовать шейпер 1 1 Edit sample text Изменить текст образца Edit Изменить Sample text rendering options Параметры отрисовки образца текста Display settings Параметры отображения Enable and disable OpenType features implemented in the font Включение и отключение функций OpenType, доступных в выбранном шрифте OpenType features Функции OpenType Choose a sample text from your collection Выбор образцов текста из коллекции Samples collection Образцы текста User Identify root of user defined sample texts Добавленный Print Sample Печать образца текста ScriptConsole Script Console Консоль Output Вывод clear Очистить Input Ввод # Type your script right here # Введите сюда свой сценарий close Закрыть Standard Output Поток вывода Standard Error Поток ошибок Load Загрузить Save Сохранить Execute Выполнить Running label Systray &Activate all &Активировать все &Deactivate all &Деактивировать все Mi&nimize &Свернуть &Restore &Развернуть E&xit В&ыход &Tags &Метки TTTableView Save File Сохранить файл TTTableWidget TrueType Tables Таблицы TrueType Tag Обозначение Description Описание Size Размер TrueType tables display Отображение таблиц TrueType &Export &Экспортировать TagSetDialog TagSet editor Редактор наборов шрифтов Collections of Tags Наборы меток Available Tags Доступные метки Add selected tag to current set. Добавить выбранную метку в активный набор Add Добавить Collections Наборы New Создать delete Удалить Remove Удалить Close Закрыть TagsWidget Edit followed by a tag name Изменить метку Remove tag "%1" from database the %%1 is a tag name Удалить метку «%1» из базы данных Please confirm that you want to remove the following tag from database: Подтвердите желание удалить из базы данных следующую метку: Please provide a replacement name for the following tag: Укажите новой название следующей метки: TextProgressionWidget Form Form Inline progression Направление строки e.g. Latin text Например, текст на латыни Left to right Слева направо e.g. Arabic text Например, арабский текст Right to left Справа налево e.g. Traditional Chinese & Japanese text Например, текст на традицонном китайском или японском языках Top to bottom Сверху вниз e.g. Runic text Например, рунический текст Bottom to top Снизу вверх Block progression Направление блока e.g. Traditional Mongolian text Например, текст на традиционном монгольском e.g. Tarditionnal Chinese & Japanes text Например, текст на традицонном китайском или японском языках multiPrintDialog Views Панели Informations Данные Preview Предпросмотр Glyphs chart Карта глифов Playground Песочница Printing multiple items Печать нескольких типов данных repairDialog Dead links Мертвые ссылки Select all Выбрать все Remove Удалить Activated Not Linked Активированные несвязанные Re-link Повторно связать Deactivate Деактивировать Deactivated Linked Деактивированные связанные De-link Убрать ссылку Activate Активировать Close Закрыть Database repair Проверка и восстановление базы данных Unreferenced Files Несвязанные файлы tagsWidget Form Form Right mouse click on a tag to add it or remove it from TagSet Щелкните правой клавишей мыши метку, чтобы добавить или удалить ее из набора меток Tags Метки Nothing selected Ничего не выбрано Add a tag Добавить метку Add Tag Добавить метку typotek default По умолчанию Browse Fonts Поиск шрифтов Fontmatrix Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Программа останется в области уведомления. Для завершения работы с ней выберите команду «Выйти» в контекстном меню программы из области уведомления. Add Directory Добавить каталог Importing font files... Импортируются шрифтовые файлы... cancel Отменить Import Импортируются Choose the tag for filter exported fonts Выберите метку для фильтрации экспортируемых шрифтов Choose Directory Укажите каталог &Import... &Импортировать... Ctrl+O Ctrl+O Import a directory Импортировать шрифты из каталога Ctrl+S Ctrl+S Export a fontset Экспортировать набор шрифтов Print Info... Напечатать сводку... Print informations about the current font Напечатать сводку по текущему шрифту Print Sample... Напечатать образец... Print the sample as a specimen Напечатать образец текста Print Chart... Напечатать таблицу символов... Print a chart of the current font Напечатать таблицу символов текущего шрифта Print Playground... Напечатать песочницу... Print the playground Напечатать содержимое песочницы Print Family... Напечатать всю гарнитуру... Print a specimen of the whole family the current face belongs to Напечатать образец гарнитуры, которой принадлежит выбранное начертание Export font book... Создать каталог шрифтов... E&xit В&ыход Ctrl+Q Ctrl+Q Exit the application Завершить работу с программой &About &О программе About &Qt О &Qt Help Справка Activate all current Активировать все выбранные Deactivate all current Деактивировать все выбранные Edit current font Изменить выбранный шрифт Playground Песочница Show/Hide Playground Close All Close all floating windows Show All Show all floating windows Hide All Hide all floating windows Try to run font editor with the selected font as argument Попытаться открыть текущий шрифт в редакторе шрифтов You don't seem to have font editor installed. Path to font editor can be set in preferences. Похоже, редактор шрифтов не установлен. Его расположение можно указать в диалоге настройки. Preferences Параметры Check Database Проверить базу данных &File &Файл Print Печать &Help &Справка Ready Готово Load settings Загрузка параметров Check for Fontmatrix own dir Проверка каталога Fontmatrix Adding Добавляется font descriptions imported from network Взятые из сети описания шрифтов Fontmatrix care Fontmatrix заботится о вас You are about to activate a bunch of fonts, it is time to cancel if it was not your intent Сейчас будет активирована куча шрифтов, самое время отменить активацию, если вы это нечаянно затеяли. You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent Сейчас будет деактивирована куча шрифтов, самое время отменить деактивацию, если вы это нечаянно затеяли. There is no font selected Ни один шрифт не выбран Support of DragNDrop over http is sheduled but not yet effective Поддержка перетаскивания с http запланирована, но пока не реализована You bring something over me I can’t handle Программа не умеет обрабатывать данные такого типа Welcome maessage Приветственное сообщение Print Infos Печати сводки Print Chart Печать таблицы символов Print Playground Печать содержимого песочницы Print Family Печать гарнитуры &Edit &Правка Fonts imported: %1 Импортировано шрифтов: %1 Next Family Следующая гарнитура Next Face Следующее начертание Previous Family Предыдущая гарнитура Previous Face Предыдущее начертание &Browse Пере&ход Not enough text to make a sample Недостаточно текста для создания образца &Sync &Синхронизироваться Sync with the DB file Синхронизироваться с базой данных Print Sample Печать образца текста Tags Метки Show TrueType tables Показать таблицы TrueType Close Закрыть &View &Вид System Fonts Системные шрифты system fonts added. системных шрифтов добавлено. fonts from followed by a directory name шрифтов из Execute Last Script Выполнить последний сценарий &Scripts С&ценарии Python scripts (*.py) Сценарии на Python (*.py) Fontmatrix Help Справка по Fontmatrix Extract fonts... Извлечь шрифты... Cannot import this font because it is broken: Не удалось импортировать этот испорченный шрифт: Cannot import this font because it is broken: Не удалось импортировать этот испорченный шрифт: Filtered Font(s): %n number of filtererd fonts showed in status bar Отфильтровано шрифтов: %n Отфильтровано шрифтов: %n Отфильтровано шрифтов: %n Current Font: followed by currently selected font name (in status bar) Текущий шрифт: Show/hide fonts browsing sidebar Показать или скрыть боковую панель для поиска шрифтов Show/hide tags list sidebar Показать или скрыть боковую панель со списком меток Fontmatrix Tags Метки Fontmatrix Export a PDF document that shows selected fonts Создать шрифтовый альбом в формате PDF Show information about Fontmatrix Показывать информацию о Fontmatrix Show information about Qt Показывать информацию о Qt F1 F1 Read documentation on Fontmatrix Открыть документацию по Fontmatrix Activate all currently visible fonts Активировать все видимые сейчас в списке шрифты Deactivate all currently visible fonts Деактивировать все видимые сейчас в списке шрифты Edit currently selected font in a font editor of your choice Изменить выбранный шрифтовый файл в избранном редакторе шрифтов You don't seem to have a font editor installed. Path to font editor can be set in Preferences dialog. Похоже, что у вас не установлен или не найден редактор шрифтов. Укажите путь к нему в диалоге настройки программы. Setup Fontmatrix Настроить Fontmatrix Check Fontmatrix database for dead links to font files Проверить базу данных Fontmatrix на ссылки к несуществующим шрифтам Tag all currently visible files Присвоить метки всем видимым сейчас в списке шрифтам View hexadecimal values of TrueType tables for currently selected font file Просмотреть шестнадцатиричные значения таблиц TrueType для выбранного шрифтового файла Edit PANOSE metadata Изменить метаданные PANOSE... Edit PANOSE metadata without saving changes to font files Изменить метаданные PANOSE, не сохраняя изменения в сами шрифтовые файлы Switch to the next font family in the list Перейти к следующей в списке гарнитуре Switch to the next font face in the list Перейти к следующему в списке начертанию Switch to the previous font family in the list Перейти к предыдущей в списке гарнитуре Switch to the previous font face in the list Перейти к предыдущему в списке начертанию Extract fonts from documents like PDF to PFM file format Извлечь встроенные в PDF грифты в файлы формата PFM Execute Script... Исполнить сценарий... Execute a Python script Исполнить сценарий на языке Python Execute the last chosen Python script Исполнить последний выбранный сценарий на языке Python Script Console... Консоль... Open Python scripting console Открыть консоль для тестирования сценариев на языке Python Fill a template file with metadata for packaging currently selected font to a Linux distribution Заполнить метаданными шаблон для упаковки выбранного шрифта в дистрибутив Linux Find a font using raster sample... Найти шрифты по растровому образцу... Find a font using a raster sample of a letter Найти шрифты по растровому образцу одного символа Text layout engine options Параметры текстового движка View and edit text layout engine variables Просмотреть и изменить переменные текстового движка confirmation Подтверждение Do you confirm you want to import these %1 fonts? Вы действительно хотите импортировать %1 шрифтов? Loading System Fonts Загружаются системные шрифты Export &fonts &Экспортировать шрифты... Export font info for packaging... Экспортировать данные для упаковки... Tag All Filtered... Метки для всех отфильтрованных... &Service С&ервис Reload Filtered Повторно загрузить отфильтрованные Reload informations for filtered fonts from the font files they belong to Повторно загрузить информацию об отфильтрованных шрифтах из их файлов Reload Selected Повторно загрузить выбранный Reload informations for selected font from the font file Повторно загрузить информацию о текущем выбранном шрифте из его файла Failed to reload %n fonts Не удалось загрузить %n шрифт Не удалось загрузить %n шрифта Не удалось загрузить %n шрифтов fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-de.ts0000644000175000017500000050142211023736606022067 0ustar malexmalex About About Fontmatrix Über Fontmatrix TextLabel TextLabel The Project Das Projekt The People Die Menschen dahinter Splash Close AboutWidget version Version fonts loaded Geladene Schriften BookExportDialog Browse... Durchsuchen... Export Font Book Schriftenbuch exportieren Settings Einstellungen Font Book Options Schriftenbuchoptionen Load Template Vorlage laden Not A Template Keine Vorlage Output Ausgabe Paper Size: Seitengröße: X Position X-Position Family: Familie: Style: Stil: Text: Überschrift: Font Size Schriftgröße Headline: Überschrift: Body: Fließtext: Sample Text: Beispieltext: Preview Vorschau FMLayout Text engine options FolderViewMenu Reload Tree Import Directory Import recursively Import File FontAction Form Form Add Tag Tag hinzufügen Action Aktion FontBookDialog Save fontBook Schriftenbuch speichern family Familie style Stil headline Überschrift body Fließtext FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Dieser Wert ist veraltet und wurde niemals von FreeType verwendet oder erwähnt. Verwenden Sie ihn nicht. Copyright Urheberrecht Font Family Schriftfamilie Font Subfamily Unterfamilie Unique font identifier Eindeutige Schriftbezeichnung Full font name Vollständiger Schriftname Version string Versionsnummer Postscript name PostScript-Name Trademark Warenzeichen Manufacturer Hersteller Designer Typograph Description Beschreibung URL Vendor Internetadresse des Herstellers URL Designer Internetadresse des Typographen License Description Lizenzbeschreibung License Info URL Internetadresse mit der Lizenz Reserved Reserviert Preferred Family Bevorzugte Schriftfamilie Preferred Subfamily Bevorzugte Unterfamilie Compatible Full (Macintosh only) Voll kompatibel (Nur Macintosh) Sample text Beispieltext PostScript CID findfont name PostScript-CID-findfont-Name Fontmatrix - Download Fontmatrix-Download Downloading %1. Lade %1 herunter. Any No Fit Text and Display Script Decorative Pictorial Family Type Cove Obtuse Cove Square Cove Obtuse Square Cove Square Thin Bone Exaggerated Triangle Normal Sans Obtuse Sans Perp Sans Flared Rounded Serif style Very Light Light Book Medium Demi Bold Heavy Black Nord Weight Old Style Modern Even Width Expanded Condensed Very Expanded Very Condensed Monospaced Proportion None Very Low Low Medium Low Medium High High Very High Contrast Gradual/Diagonal Gradual/Transitional Gradual/Vertical Gradual/Horizontal Rapid/Vertical Rapid/Horizontal Instant/Vertical Stroke Variation Straight Arms/Horizontal Straight Arms/Wedge Straight Arms/Vertical Straight Arms/Single Serif Straight Arms/Double Serif Non-Straight Arms/Horizontal Non-Straight Arms/Wedge Non-Straight Arms/Vertical Non-Straight Arms/Single Serif Non-Straight Arms/Double Serif Arm Style Normal/Contact Normal/Weighted Normal/Boxed Normal/Flattened Normal/Rounded Normal/Off Center Normal/Square Oblique/Contact Oblique/Weighted Oblique/Boxed Oblique/Flattened Oblique/Rounded Oblique/Off Center Oblique/Square Letterform Standard/Trimmed Standard/Pointed Standard/Serifed High/Trimmed High/Pointed High/Serifed Constant/Trimmed Constant/Pointed Constant/Serifed Low/Trimmed Low/Pointed Low/Serifed Midline Constant/Small Constant/Standard Constant/Large Ducking/Small Ducking/Standard Ducking/Large X-Height Category Help Fontmatrix Help Fontmatrix-Hilfe ImportTagsDialog Dialog Dialog Add Hinzufügen Ok OK Fontmatrix - Tags ImportedFonts Dialog Dialog Imported Fonts Importierte Schriften Ok OK <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> Do not show this dialog again ImportedFontsDialog (not loaded) (nicht geladen) Number of Imported Fonts Anzahl der importierten Schriften LayoutOptionWidget Form Form Weights score before exact after end penalty H-penalty ListDock Form Form Search through font informations Suche nach Schriftinformationen Search Suche Respect entered text case when searching Groß- und Kleinschreibung bei der Suche beachten Filter view by chosing tag Ansicht mit Hilfe von Tags filtern Show only fonts that belong to chosen tagset Zeigt nur Schriften an, die zu der gewählten Tagsammlung passen Names Namen Files Dateien Preview Vorschau Show complete collection of available fonts Zeigt alle vorhandenen Schriten an Show all activated fonts Zeigt alle aktivierten Schriften an Case Sensitive Groß- und Kleinschreibung beachten Tag: Tag: Tag Set: Tag-Sammlung: View All Alle Schriften anzeigen View Activated Aktivierte Schriften anzeigen Remove Entfernen Filter: Filter: Switch to panose filtering P Field selection F TextLabel Previews Folders ListDockWidget All fields Unicode All activated MainView main view widget main view widget Right mouse click on a tag to add it or remove it from TagSet Klicken Sie mit der echten Maustaste auf ein Tag, um es aus der Sammlung zu entfernen oder hinzuzufügen <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Zoom is disabled, uncheck fit to view to enable zoom Zoom ist ausgeschaltet. Entfernen Sie die Markierung, um das Zoomen zu ermöglichen Glyphs Glyphen Clicking on a glyph will show details about it Ein Klick auf eine Glyphe zeigt weitere Details an Tags Tags OpenType Features OpenType Features Friendly Name Vollständiger Name FT FT Font Information Font-Information Sample Text Beispieltext Fit to View An Fenster anpassen Simulate screen rendering (FreeType inside) Simuliert das Rendern auf dem Bildschirm mit Hilfe von Freetype Use shaper Shaper verwenden Right to Left Linksläufig Coverage of Unicode Interval : Abdeckung dieses Unicode-Bereiches: <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"></p></body></html> Anything selected Alle ausgewählten Add Tag Tag hinzufügen +-~ +-~ Absolute view Absolute Ansicht FreeType view FreeType-Ansicht Font Size Schriftgröße pt pt Advanced Erweitert Text Progression Textfortschritt Playground Spielwiese part I part II Nothing selected Add a tag Settings Einstellungen S OpenType O Save as default Reset Default SampleText ... Layout Layout Rendering FreeType Native Qt objects World is wide Shaper type Script push Set Mode "Copy Character to Clipboard" C MainViewWidget default Grundeinstellung zoom is enabled Zoom ist aktiviert zoom is disabled, uncheck fit to view to enable zoom Zoom ist deaktiviert. Entfernen Sie die Markierung, um das Zoomen zu ermöglichen 000Basic Latin 000Basis Latein 001Latin-1 Supplement 001Latein 1 002Latin Extended-A 002Latein erweitert A 003Latin Extended-B 003Latein erweitert B 004IPA Extensions 004IPA-Erweiterungen 005Spacing Modifier Letters 005Modifizierende Zeichen mit eigenem Platzbedarf 006Combining Diacritical Marks 006Kombinierende diakritische Zeichen 007Greek and Coptic 007Griechisch und Koptisch 008Cyrillic 008Kyrillisch 009Cyrillic Supplement 009Kyrillisch erweitert 010Armenian 010Armenisch 011Hebrew 011Hebräisch 012Arabic 012Arabisch 013Syriac 013Syrisch 014Arabic Supplement 014Arabisch erweitert 015Thaana 015Thaana 016N'Ko 016N'Ko 017Devanagari 017Devnangari 018Bengali 018Bengali 019Gurmukhi 019Gurmukhi 020Gujarati 020Gujarati 021Oriya 021Oriya 022Tamil 022Tamilisch 023Telugu 023Telugu 024Kannada 024Kannada 025Malayalam 025Malayalam 026Sinhala 026Sinhala 027Thai 027Thailändisch 028Lao 028Laotisch 029Tibetan 029Tibetanisch 030Burmese 030Birmesisch 031Georgian 031Georgisch 032Hangul Jamo 032Hangui Jamo 033Ethiopic 033Äthiopisch 034Ethiopic Supplement 034Äthiopisch erweitert 035Cherokee 035Cherokee 036Unified Canadian Aboriginal Syllabics 036Cree (Kanada) 037Ogham 037Ogam 038Runic 038Runen 039Tagalog 039Baybayin 040Hanunóo 040Hanunoo 041Buhid 041Buid 042Tagbanwa 042Tagbanuwa 043Khmer 043Khmer 044Mongolian 044Mongolisch 045Limbu 045Limbu 046Tai Le 046Tai Le 047New Tai Lue 048Tai Lue 048Khmer Symbols 048Khmer-Symbole 049Buginese 049Buginesisch 050Balinese 050Balinesisch 051Lepcha 051Lepcha 052Phonetic Extensions 052Phonetische Erweiterungen 053Phonetic Extensions Supplement 053Phonetische Erweiterungen - Supplement 054Combining Diacritical Marks Supplement 054Kombinierende diakritische Zeichen - Supplement 055Latin Extended Additional 055 Latei erweitert - Zusatz 056Greek Extended 056Griechisch erweitert 057General Punctuation 057Allgemeine Interpunktion 058Superscripts and Subscripts 058Hoch- und tiefgestellte Zeichen 059Currency Symbols 059Währungssymbole 060Combining Diacritical Marks for Symbols 060Kombinierende diakritische Zeichen für Symbole 061Letterlike Symbols 061Buchstabenähnliche Symbole 062Number Forms 062Zahlzeichen 063Arrows 063Pfeile 064Mathematical Operators 064Mathematische Operatoren 065Miscellaneous Technical 065Verschiedene technische Zeichen 066Control Pictures 066Steuerzeichen 067Optical Character Recognition 067Optische Zeichenerkennung 068Enclosed Alphanumerics 068Umschlossene alphanumerische Zeichen 069Box Drawing 069Rahmenzeichen 070Block Elements 070Blockelemente 071Geometric Shapes 071Geometrische Zeichen 072Miscellaneous Symbols 072Verschiedene Symbole 073Dingbats 073Dingbats 074Miscellaneous Mathematical Symbols-A 074Verschiedene mathematische Symbole A 075Supplemental Arrows-A 075Ergänzende Pfeile A 076Braille Patterns 076Braille-Zeichen 077Supplemental Arrows-B 077Ergänzende Pfeile B 078Miscellaneous Mathematical Symbols-B 078Verschiedene mathematische Symbole B 079Supplemental Mathematical Operators 079Ergänzende mathematische Operatoren 080Miscellaneous Symbols and Arrows 080Verschiedene Symbole und Pfeile 081Glagolitic 081Glagolitisch 082Latin Extended-C 082Latein erweitert C 083Coptic 083Koptisch 084Georgian Supplement 084Georgisch - Supplement 085Tifinagh 085Tifinagh 086Ethiopic Extended 086Äthiopisch erweitert 087Supplemental Punctuation 087Ergänzende Interpunktion 088CJK Radicals Supplement 088CJK-Radikale - Supplement 089Kangxi Radicals 089Kangxi-Radikale 090Ideographic Description Characters 090Ideographische Zeichen 091CJK Symbols and Punctuation 091CJK-Symbole und Interpunktion 092Hiragana 092Hiragana 093Katakana 093Katakana 094Bopomofo 094Zhuyin (Bopomofo) 095Hangul Compatibility Jamo 095Hangul-Jamo - Kompatibilität 096Kanbun 096Kanbun 097Bopomofo Extended 097Zhuyin (Bopomofo) erweitert 098CJK Strokes 098CJK-Striche 099Katakana Phonetic Extensions 099Katakana phonetische Erweiterungen 100Enclosed CJK Letters and Months 100Umschlossene CJK-Zeichen und Monate 101CJK Compatibility 101CJK-Kompatibilität 102CJK Unified Ideographs Extension A 102CJK - vereinheitlichte ideographische Erweiterungen A 103Yijing Hexagram Symbols 103Yijing-Hexagramme 104CJK Unified Ideographs 104CJK - vereinheitlichte Ideogramme 105Yi Syllables 105Yi - Silben 106Yi Radicals 106Yi - Radikale 107Modifier Tone Letters 107Modifizierende Tonzeichen 108Latin Extended-D 108Latein erweitert D 109Syloti Nagri 109Syloti Nagri 110Phags-pa 110Phagspa 111Hangul Syllables 111Hangul-Silben 112High Surrogates 112High Surrogates 113High Private Use Surrogates 113High Private Use Surrogates 114Low Surrogates 114Low Surrogates 115Private Use Area 115Benutzerdefinierte Zeichen 116CJK Compatibility Ideographs 116CJK - Kompatibilitätsideogramme 117Alphabetic Presentation Forms 117Alphabetische Präsentationsformen 118Arabic Presentation Forms-A 118Arabische Präsentationsformen A 119Variation Selectors 119Variantenselektoren 120Vertical Forms 120Vertikale Formen 121Combining Half Marks 121Kombinierende halbe diakritische Zeichen 122CJK Compatibility Forms 122CJK Kompatibilitätsformen 123Small Form Variants 123Kleine Formvarianten 124Arabic Presentation Forms-B 124Arabische Präsentationsformen B 125Halfwidth and Fullwidth Forms 125Halbbreite und vollbreite Formen für CJK 126Specials 127Spezielle Zeichen 127Supplementary Multilingual Plane (SMP) 127Supplementary Multilingual Plane (SMP) 128Supplementary Ideographic Plane (SIP) 128Supplementary Ideographic Plane (SIP) 129unassigned 129nicht besetzt 130Supplementary Special-purpose Plane (SSP) 130Supplementary Special-purpose Plane (SSP) 131Private Use Area 1 (PUA) 131Beliebig verwendbar 1 132Private Use Area 2 (PUA) 132Beliebig verwendbar 2 133Un-Mapped Glyphs 133Nichtabgebildete Glyphen Activation event Aktivierung Cancel Abbrechen Activation of : Aktivierung von: Deactivation of : Deaktivierung von: 134View all mapped glyphs 134Alle verzeichneten Glyphe anzeigen Names Namen Fontmatrix takes care of you Fontmatrix kümmert sich um Sie is activated. If you want to remove it from Fontmatrix database, please deactivate it first. Ist aktiviert. Wenn Sie die Schrift aus der Fontmatrix-Datenbank entfernen möchten, deaktivieren Sie sie bitte erst. Fontmatrix safe Fontamtrix-Safe You are about to remove a font from Fontmatrix database Sie sind dabei, eine Schrift aus der Fontmatrix-Datenbank zu entfernen Do you want to continue? Möchten Sie fortfahren? Welcome to Fontmatrix PrefsPanel Preferences Panel Einstellungen General Allgemein Ask confirmation when activating or deactivating all fonts Um Bestätigung bitten, wenn Schriften aktiviert oder deaktiviert werden sollen Add Hinzufügen Validate Bestätigen Layout Layout pt pt Apply Anwenden Show Fontmatrix in System Tray Fontmatrix in der Kontrolleiste anzeigen Close to System Tray Beim Schließen im Hintergrund (Kontrolleiste) weiterlaufen lassen Show Activate All and Deactivate All in the System Tray menu "Alle aktivieren" und "Alle deaktivieren" im Kontrolleistenmenu anzeigen Ask confirmation when activating or deactivating fonts by tags Um Bestätigung bitten, wenn Schriften nach Tags aktiviert oder deaktiviert werden Preview Word Vorschauwort Font Editor Font-Editor /usr/bin/fontforge /usr/bin/fontforge Browse... Durchsuchen... Ask for tag names when importing fonts Beim Import nach Tag-Namen fragen Sample Text Beispieltext Named Sample Texts Beispieltexte Font Size: Schriftgröße: Interline: Zeilenabstand: Files and Folders Dateien und Verzeichnisse Templates Folder Vorlagenverzeichnis Remote directories Netzwerkzeichnisse Remove Entfernen Preferences Einstellungen Show "All" actions Alle Aktionen anzeigen is RTL ist eine linksläufige Schrift size Größe Initial Layout Ursprüngliches Layout http:// http:// Local storage Lokale Speicherung Close Schließen Add the full path to your preferred font editor Fügen Sie den Pfad zu Ihrem Fonteditor hinzu Show names of imported fonts after import process Show splash at startup Don’t use preferred name scheme (will affect only newly imported fonts) Hyphenation Left: Right: Dictionary: Browse ... Change TextLabel Shortcuts PrefsPanelDialog Looks like your setup does not have a system tray available. Anscheinend verfügt Ihr Desktop über keine Kontrolleiste. A text Ein Text Select font editor Font-Editor auswählen Select Templates Folder Wählen Sie ein Vorlagenverzeichnis aus Select Where remote font files will be stored Wählen Sie ein Verzeichnis aus, in dem Dateien aus dem Netzwerk gespeichert werden Please select an item in the list or create a new one. Alt Ctrl Shift Meta Meta+ Shift+ Alt+ Ctrl+ Replace Shortcut is already in use for action name will be appended to this Do you still want to assign it? Action Aktion Shortcut Tip Select hyphenation dictionary QObject codepoint is U+ Code ist U+ family Familie headline Überschrift body Fließtext style Stil Creating font book... Erzeuge Schriftenbuch ... cancel Abbrechen Copying files Kopiere Dateien Unable to copy Kopieren nicht möglich ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv hamburgefonstiv Access All Alternates Zugriff auf alle Alternativen Above-Base Forms Above-Base Forms Above-Base Mark Positioning Above-Base Mark Positioning Above-Base Substitutions Above-Base Substitutions Alternative Fractions Alternative Fractions Akhands Akhands Below-Base Forms Below-Base Forms Below-Base Mark Positioning Below-Base Mark Positioning Below-Base Substitutions Below-Base Substitutions Petite Capitals From Capitals Petite Capitals From Capitals Small Capitals From Capitals Small Capitals From Capitals Contextual Alternates Contextual Alternates Case-Sensitive Forms Case-Sensitive Forms Glyph Composition/Decomposition Glyph Composition/Decomposition Contextual Ligatures Contextual Ligatures Conjunct Forms Conjunct Forms Capital Spacing Capital Spacing Contextual Swash Contextual Swash Cursive Positioning Cursive Positioning Default Processing Default Processing Distances Distances Discretionary Ligatures Discretionary Ligatures Denominators Denominators Expert Forms Expert Forms Final glyph Alternates Final glyph Alternates Terminal Forms #2 Terminal Forms #2 Terminal Forms #3 Terminal Forms #3 Terminal Forms Terminal Forms Fractions Fractions Full Width Full Width Half Forms Half Forms Halant Forms Halant Forms Alternate Half Width Alternate Half Width Historical Forms Historical Forms Horizontal Kana Alternates Horizontal Kana Alternates Historical Ligatures Historical Ligatures Hangul Hangul Hojo Kanji Forms (JIS x 212-1990 Kanji Forms) Hojo Kanji Forms (JIS x 212-1990 Kanji Forms) Half Width Half Width Initial Forms Initial Forms Isolated Forms Isolated Forms Italics Italics Justification Alternatives Justification Alternatives JIS78 Forms JIS78 Forms JIS83 Forms JIS83 Forms JIS90 Forms JIS90 Forms JIS2004 Forms JIS2004 Forms Kerning Kerning Left Bounds Left Bounds Standard Ligatures Standard Ligatures Leading Jamo Forms Leading Jamo Forms Lining Figures Lining Figures Localized Forms Localized Forms Mark Positioning Mark Positioning Medial Forms #2 Medial Forms #2 Medial Forms Medial Forms Mathematical Greek Mathematical Greek Mark to Mark Positioning Mark to Mark Positioning Mark Positioning via Substitution Mark Positioning via Substitution Alternate Annotation Forms Alternate Annotation Forms NLC Kanji Forms NLC Kanji Forms Nukta Forms Nukta Forms Numerators Numerators Old Style Figures Old Style Figures Optical Bounds Optical Bounds Ordinals Ordinals Ornaments Ornaments Proportional Alternate Width Proportional Alternate Width Petite Capitals Petite Capitals Proportional Figures Proportional Figures Pre-base Forms Pre-base Forms Pre-base Substitutions Pre-base Substitutions Post-base Forms Post-base Forms Post-base Substitutions Post-base Substitutions Proportional Widths Proportional Widths Quarter Widths Quarter Widths Randomize Randomize Rakar Forms Rakar Forms Required Ligatures Required Ligatures Reph Form Reph Form Right Bounds Right Bounds Right-To-Left Alternates Right-To-Left Alternates Ruby Notation Forms Ruby Notation Forms Stylistic Alternates Stylistic Alternates Scientific Inferiors Scientific Inferiors Optical Size Optical Size Small Capitals Small Capitals Simplified Forms Simplified Forms Sylistic Set 1 Stylistic Set 1 Sylistic Set 2 Stylistic Set 2 Sylistic Set 3 Stylistic Set 3 Sylistic Set 4 Stylistic Set 4 Sylistic Set 5 Stylistic Set 5 Sylistic Set 6 Stylistic Set 6 Sylistic Set 7 Stylistic Set 7 Sylistic Set 8 Stylistic Set 8 Sylistic Set 9 Stylistic Set 9 Sylistic Set 10 Stylistic Set 10 Sylistic Set 11 Stylistic Set 11 Sylistic Set 12 Stylistic Set 12 Sylistic Set 13 Stylistic Set 13 Sylistic Set 14 Stylistic Set 14 Sylistic Set 15 Stylistic Set 15 Sylistic Set 16 Stylistic Set 16 Sylistic Set 17 Stylistic Set 17 Sylistic Set 18 Stylistic Set 18 Sylistic Set 19 Stylistic Set 19 Sylistic Set 20 Stylistic Set 20 Subscript Subscript Superscript Superscript Swash Swash Titling Titling Trailing Jamo Forms Trailing Jamo Forms Traditional Name Forms Traditional Name Forms Tabular Figures Tabular Figures Traditional Forms Traditional Forms Third Widths Third Widths Unicase Unicase Alternate Vertical Metrics Alternate Vertical Metrics Vattu Variants Vattu Variants Vertical Writing Vertical Writing Alternate Vertical Half Metrics Alternate Vertical Half Metrics Vowel Jamo Forms Vowel Jamo Forms Vertical Kana Alternates Vertical Kana Alternates Vertical Kerning Vertical Kerning Proportional Alternate Vertical Metrics Proportional Alternate Vertical Metrics Vertical Rotation Vertical Rotation Slashed Zero Slashed Zero Mark, NonSpacing Mark, NonSpacing Mark, SpacingCombining Mark, SpacingCombining Mark, Enclosing Mark, Enclosing Number, DecimalDigit Number, DecimalDigit Number, Letter Number, Letter Number, Other Number, Other Separator, Space Separator, Space Separator, Line Separator, Line Separator, Paragraph Separator, Paragraph Other, Control Other, Control Other, Format Other, Format Other, Surrogate Other, Surrogate Other, PrivateUse Other, PrivateUse Other, NotAssigned Other, NotAssigned Letter, Uppercase Letter, Uppercase Letter, Lowercase Letter, Lowercase Letter, Titlecase Letter, Titlecase Letter, Modifier Letter, Modifier Letter, Other Letter, Other Punctuation, Connector Punctuation, Connector Punctuation, Dash Punctuation, Dash Punctuation, Open Punctuation, Open Punctuation, Close Punctuation, Close Punctuation, InitialQuote Punctuation, InitialQuote Punctuation, FinalQuote Punctuation, FinalQuote Punctuation, Other Punctuation, Other Symbol, Math Symbol, Math Symbol, Currency Symbol, Currency Symbol, Modifier Symbol, Modifier Symbol, Other Symbol, Other default Grundeinstellung RemoteDir Downloading Herunterladen Systray &Activate all &Alle aktivieren &Deactivate all Alle &deaktivieren Mi&nimize Verklei&nern &Restore &Wiederherstellen &Tags &Tags E&xit Sch&ließen TagSetDialog TagSet editor Editor für Tag-Sammlungen Collections of Tags Tag-Sammlungen Add selected tag to current set. Ausgewähltes Tag zur ausgewählten Sammlung hinzufügen. Collections Sammlungen New Neu delete Löschen Close Schließen Available Tags Verfügbare Tags Add Hinzufügen Remove Entfernen TextProgressionWidget Form Form Inline progression Textrichtung e.g. Latin text z.B. lateinischer Text Left to right Rechtsläufig e.g. Arabic text z.B. arabischer Text Right to left Linksläufig e.g. Traditional Chinese & Japanese text z.B. traditioneller chinesischer & japanischer Text Top to bottom Textrichtung vertikal e.g. Runic text z.b. Runentext Bottom to top Von oben nach unten Block progression Blockverlauf e.g. Traditional Mongolian text z.B. traditioneller mongolischer Text e.g. Tarditionnal Chinese & Japanes text z.B. traditioneller chinesischer & japanischer Text repairDialog Dialog Dialog Dead links Tote Links Select all Alles auswählen Remove Entfernen Activated Not Linked Aktiviert, aber nicht verlinkt Re-link Erneut verlinken Deactivate Deaktivieren Deactivated Linked Deaktiviert, verlinkt De-link Link entfernen Activate Aktivieren Close Schließen typotek Add Directory Verzeichnis hinzufügen &Import... &Importieren ... Ctrl+O Ctrl+O Import a directory Verzeichnis importieren &Save &Speichern Ctrl+S Ctrl+S Save the document to disk Dokument speichern Print... Drucken ... Print a specimen of the current font Drucken eines Musters der ausgewählten Schrift Export font book... Schriftenbuch exportieren ... Export a pdf that show selected fonts Exportiert eine PDF-Datei, die die ausgewählten Schriften anzeigt E&xit &Beenden Ctrl+Q Ctrl+Q Exit the application Beendet das Programm &About &Über Show the Typotek's About box Zeigt Informationen über Fontmatrix an Help Hilfe &Tag Sets &Tag-Sammlungen Edit current font Ausgewählte Schrift bearbeiten &File &Datei Edit Bearbeiten &Help &Hilfe Ready Fertig Print specimen Drucke Muster There is no font selected Es ist keine Schrift ausgewählt Support of DragNDrop over http is sheduled but not yet effective Support of DragNDrop over http is sheduled but not yet effective You bring something over me I can’t handle Sie verlangen etwas von mir, das ich nicht kann Fontmatrix Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Das Programm wird im Hintergrund weiterlaufen. Um es zu beenden, wählen Sie <b>Beenden</b> in der Kontrolleiste. Preferences Einstellungen You provided an empty string, it’s not fair Sie haben keinen Text eingegeben. Das ist unfair "default" is a reserved keyword "default" ist ein vom Programm reserviertes Wort Activate all current Aktiviert alle ausgewähten Schriften Deactivate all current Deaktiviert alle ausgewählten Schriften Try to run font editor with the selected font as argument Versucht, den Font-Editor mit der ausgewählten Schrift als Argument zu starten You don't seem to have font editor installed. Path to font editor can be set in preferences. Anscheinend haben Sie keinen Font-Editor installiert. Der Pfad zum Font-Editor kann in den Programmeinstellungen gesetzt werden. Lists Listen Nothing Selected Nichts ausgewählt Initial tags. The string you type will be split by "#" to obtain a tags list. Ursprüngliche Tags. Die Zeichen, die Sie eingeben, werden mit "#" abgetrennt, um eine Tag-Liste zu erhalten. Importing font files... Importiere Schriftdateien ... cancel Abbruch Import Import Fontmatrix care Fontmatrix-Wartung You are about to activate a bunch of fonts, it is time to cancel if it was not your intent Sie sind im Begriff, jede Menge Schriftarten zu deaktivieren. Falls dies nicht Ihre Absicht war, können Sie jetzt noch abbrechen You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent Sie sind im Begriff, jede Menge Schriftarten zu deaktivieren. Falls dies nicht Ihre Absicht war, können Sie jetzt noch abbrechen Can’t import this font because it’s broken : Die Schrift kann nicht importiert werden, weil sie fehlerhaft ist: Choose the tag for filter exported fonts Wählen Sie einen Tag aus, um exportierte Schriften zu exportieren Choose Directory Wählen Sie ein Verzeichnis Export &Fonts &Schriften exportieren Export a fontset Einen Satz Schriften exportieren Check Database Datenbank überprüfen Tag All... Alle mit Tags versehen... Load settings Einstellungen laden Check for Fontmatrix own dir Das Fontmatrix-Verzeichnis überprüfen Loading Laden fonts present in database Schriften in der Datenbank Catching Holen font descriptions from network Schriftbeschreibungen aus dem Netzwerk Collected System Font Systemschriften Adding Hinzufügen fonts from system directories Schriften in den Systemverzeichnissen fonts available from system Schriften, die vom System zur Verfügung gestellt werden font descriptions imported from network Schriftbeschreibungen, die aus dem Netzwerk importiert wurden Browse Fonts Schriften durchsuchen default Grundeinstellung "default" is a reserved "Grundeinstellung" ist ein reserviertes Wort Fonts imported: %1 Print Info... Print informations about the current font Print Sample... Print the sample as a specimen Print Chart... Print a chart of the current font Print Playground... Print the playground Print Family... Print a specimen of the whole family the current face belongs to About &Qt Next Family Next Face Previous Family Previous Face Layout Options Print &Edit &Browse Fontmatrix - data warning Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Unicode All fields Welcome maessage Print Infos Print Chart Print Playground Print Family fontmatrix-0.6.0+svn20110930/src/messages/welcome_uk.html0000644000175000017500000000274211035172507021754 0ustar malexmalex Welcome to Fontmatrix
##WELCOME_FONT##
Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.
Fontmatrix has some unique functionalities in the Open Source world :
Activate, deactivate fonts to reduce font lists and save resources
Allow to tag font for a better classification and group (de)activation
Make it easy to find particular glyph thanks to a glyph category display
Create a font book that can be printed to have a real overview of the fonts available
Display advanced OpenType features
Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/messages/welcome_fi.html0000644000175000017500000000435711116032624021732 0ustar malexmalex Tervetuloa Fontmatrixiin
##WELCOME_FONT##

Fontmatrix on käyttäjäystävällinen ohjelma fonttien hallintaan Linuxille. Tavoitteenamme on tarjota siisti ja kättäjäystävällinen kokonaisuus.

Fontmatrix tuo uusia asioita vapaaseen maailmaan
  • Ota fontteja käyttöön ja poista niitä käytöstä. Fonttiluettelot pysyvät hallinnassa ja resursseja säästyy.
  • Voit luokitella fontteja. Luokat helpottavat oikean fontin löytämisessä ja voit luokkien avulla helposti ottaa käyttöön joukon fontteja tai poistaa ne käytöstä.
  • Juuri oikean merkin löytäminen on helppoa merkkikarttanäkymässä.
  • Luo fonttikirja, jonka voit tulostaa. Saat helposti todellisen käsityksen haluamistasi fonteista.
  • Voit tarkastella OpenType-ominaisuuksia.
  • Voit tuoda fontteja etähakemistoista. Kätevää esimerkiksi yrityksen verkkoympäristössä.

Toivomme, että viihdyt Fontmatrixin käyttäjänä.
fontmatrix-0.6.0+svn20110930/src/messages/welcome_nl.html0000644000175000017500000000274211035172507021746 0ustar malexmalex Welcome to Fontmatrix
##WELCOME_FONT##
Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.
Fontmatrix has some unique functionalities in the Open Source world :
Activate, deactivate fonts to reduce font lists and save resources
Allow to tag font for a better classification and group (de)activation
Make it easy to find particular glyph thanks to a glyph category display
Create a font book that can be printed to have a real overview of the fonts available
Display advanced OpenType features
Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/messages/welcome.html0000644000175000017500000000274211002076440021246 0ustar malexmalex Welcome to Fontmatrix
##WELCOME_FONT##
Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.
Fontmatrix has some unique functionalities in the Open Source world :
Activate, deactivate fonts to reduce font lists and save resources
Allow to tag font for a better classification and group (de)activation
Make it easy to find particular glyph thanks to a glyph category display
Create a font book that can be printed to have a real overview of the fonts available
Display advanced OpenType features
Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/messages/CMakeLists.txt0000644000175000017500000000335711220170637021475 0ustar malexmalex########################################### ## THIS FILE IS OBSOLETE !!!!! # SET ( fontmatrix_TSS # fontmatrix-cs.ts # fontmatrix-da.ts # fontmatrix-de.ts # fontmatrix-en.ts # fontmatrix-fi.ts # fontmatrix-fr.ts # fontmatrix-hi.ts # fontmatrix-nb.ts # fontmatrix-nl.ts # fontmatrix-no.ts # fontmatrix-ru.ts # fontmatrix-sr.ts # fontmatrix-sv.ts # fontmatrix-uk.ts # fontmatrix-zh_CN.ts # fontmatrix-zh_TW.ts # ) # # IF ( TRANSLATOR ) # MESSAGE (STATUS "We are glad to see you handle the fontmatrix-${TRANSLATOR}.ts file, thank you very much" ) # MESSAGE (STATUS "Files to translate SRCS - ${fontmatrix_SRCS}") # MESSAGE (STATUS "Files to translate UIS - ${fontmatrix_UIS}") # MESSAGE (STATUS "Files to translate EXTRA- ${FONTMATRIX_TR_EXTRA}") # QT4_CREATE_TRANSLATION ( fontmatrix_QMS # ${fontmatrix_SRCS} # ${fontmatrix_UIS} # ${FONTMATRIX_TR_EXTRA} # "fontmatrix-${TRANSLATOR}.ts" ) # QT4_ADD_TRANSLATION ( fontmatrix_QMS ${fontmatrix_TSS} ) # ELSE ( TRANSLATOR ) # QT4_ADD_TRANSLATION ( fontmatrix_QMS ${fontmatrix_TSS} ) # ENDIF ( TRANSLATOR ) # # ADD_CUSTOM_TARGET ( translation ALL DEPENDS ${fontmatrix_QMS} ) # # IF ( UNIX AND NOT APPLE ) # INSTALL ( FILES ${fontmatrix_QMS} DESTINATION ${FONTMATRIX_QMDIR} ) # ENDIF ( UNIX AND NOT APPLE ) # # IF ( APPLE ) # # ADD_EXECUTABLE ( fontmatrix MACOSX_BUNDLE ${fontmatrix_QMS} ) # SET_SOURCE_FILES_PROPERTIES ( ${fontmatrix_QMS} PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) # # INSTALL ( TARGETS fontmatrix BUNDLE DESTINATION ${FONTMATRIX_BUNDLE_RESOURCE}) # ENDIF ( APPLE ) # # IF ( WIN32 ) # INSTALL ( FILES ${fontmatrix_QMS} DESTINATION ${FONTMATRIX_QMDIR} ) # ENDIF ( WIN32 ) # fontmatrix-0.6.0+svn20110930/src/messages/welcome_da.html0000644000175000017500000000274211035172507021721 0ustar malexmalex Welcome to Fontmatrix
##WELCOME_FONT##
Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.
Fontmatrix has some unique functionalities in the Open Source world :
Activate, deactivate fonts to reduce font lists and save resources
Allow to tag font for a better classification and group (de)activation
Make it easy to find particular glyph thanks to a glyph category display
Create a font book that can be printed to have a real overview of the fonts available
Display advanced OpenType features
Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-nl.ts0000644000175000017500000040256411023736606022117 0ustar malexmalex About About Fontmatrix Info Fontmatrix TextLabel Splash The Project The People Close AboutWidget version fonts loaded BookExportDialog Export Font Book Output fontboek Settings Instellingen Font Book Options Opties fontbook Load Template Laadmodel Not A Template Geen model Browse... Bladeren... Paper Size: Blad maat: X Position X Positie Family: Familie: Style: Stijl: Text: Tekst: Font Size Font maat Headline: Hoofdlijn: Body: Body: Sample Text: Tekstvoorbeeld: Preview Voorzien Output FMLayout Text engine options FolderViewMenu Reload Tree Import Directory Import recursively Import File FontAction Form vorm Action Actie Add Tag Label Toevoegen FontBookDialog Save fontBook Save fontboek family familie headline hoofdlijn body body style stijl FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Ga door en gebruik of test dit niet. Full font name Kompleet font naam Version string Versie naam Description Beschrijving Copyright auteursrecht Font Family Familie font Font Subfamily Subfamilie font Unique font identifier Uniek font identificeerder Postscript name Postscriptnaam Trademark Handelsmerk Manufacturer Vervaardigt Designer Ontwerper URL Vendor URL Provider URL Designer URL Ontwerper License Description Licentie beschrijving License Info URL Licentie Info Reserved Gereserveerd Preferred Family Familie Voorkeur Preferred Subfamily Subfamilie Voorkeur Compatible Full (Macintosh only) Aansluitbaar op Macintosh Sample text Tekstvoorbeeld PostScript CID findfont name PostScript Identificatie CID Fontmatrix - Download Downloading %1. Any No Fit Text and Display Script Decorative Pictorial Family Type Cove Obtuse Cove Square Cove Obtuse Square Cove Square Thin Bone Exaggerated Triangle Normal Sans Obtuse Sans Perp Sans Flared Rounded Serif style Very Light Light Book Medium Demi Bold Heavy Black Nord Weight Old Style Modern Even Width Expanded Condensed Very Expanded Very Condensed Monospaced Proportion None Very Low Low Medium Low Medium High High Very High Contrast Gradual/Diagonal Gradual/Transitional Gradual/Vertical Gradual/Horizontal Rapid/Vertical Rapid/Horizontal Instant/Vertical Stroke Variation Straight Arms/Horizontal Straight Arms/Wedge Straight Arms/Vertical Straight Arms/Single Serif Straight Arms/Double Serif Non-Straight Arms/Horizontal Non-Straight Arms/Wedge Non-Straight Arms/Vertical Non-Straight Arms/Single Serif Non-Straight Arms/Double Serif Arm Style Normal/Contact Normal/Weighted Normal/Boxed Normal/Flattened Normal/Rounded Normal/Off Center Normal/Square Oblique/Contact Oblique/Weighted Oblique/Boxed Oblique/Flattened Oblique/Rounded Oblique/Off Center Oblique/Square Letterform Standard/Trimmed Standard/Pointed Standard/Serifed High/Trimmed High/Pointed High/Serifed Constant/Trimmed Constant/Pointed Constant/Serifed Low/Trimmed Low/Pointed Low/Serifed Midline Constant/Small Constant/Standard Constant/Large Ducking/Small Ducking/Standard Ducking/Large X-Height Category Help Fontmatrix Help Fontmatrix Help ImportTagsDialog Dialog Dialoog Add Toevoegen Fontmatrix - Tags Ok ImportedFonts Dialog Dialoog Imported Fonts Geïmporteerde fonts Ok <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> Do not show this dialog again ImportedFontsDialog (not loaded) Number of Imported Fonts LayoutOptionWidget Form vorm Weights score before exact after end penalty H-penalty ListDock Form Formulier Search through font informations Doorzoek font informatie Search Zoek Respect entered text case when searching Pas op voor hooge en laage letters om te zoeken Case Sensitive Kast Gevoelig Tag: Label: Filter view by chosing tag Filter zicht door label keuz Tag Set: collectie: Show only fonts that belong to chosen tagset Toon alleen fonts dat behoort tot de gekozen collectie Names Namen Files Dossiers Show complete collection of available fonts Toon complete collectie van beschikbare fonts View All Toon alles Show all activated fonts Toon alle geäctiveerde fonts View Activated Toon geäctiveerd Remove Verwijder Switch to panose filtering P Filter: Field selection F TextLabel Previews Folders ListDockWidget All fields Unicode All activated MainView main view widget component hoofdbeeld Font Information Font Informatie <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Nothing selected Niets geselecteerd Right mouse click on a tag to add it or remove it from TagSet Rechts Kliken op een label om het aan de collectie toe te voegen of te verwijderen Add Tag Label Toevoegen Sample Text Tekstvoorbeeld Fit to View Zicht aanpassen Zoom is disabled, uncheck fit to view to enable zoom Zichtaanpassing moet uitgeschakelt om te zoomen Simulate screen rendering (FreeType inside) Schermweergave simuleeren (FreeType inside) FT FT OpenType Features OpenType functies Friendly Name Benaming Compleet Use shaper Gebruik shaper Right to Left Van rechts naar links Glyphs Glyphs Coverage of Unicode Interval : Unicode Interval Vulling: Clicking on a glyph will show details about it Glyph kliken voor details Font Size Font maat pt pt part I part II Add a tag Settings Instellingen S OpenType O Save as default Reset Default SampleText ... Layout Layout Rendering FreeType Native Qt objects World is wide Shaper type Script Text Progression push Playground Set Mode "Copy Character to Clipboard" C MainViewWidget Activation event Activeer uitkomst Cancel Cancel Activation of : Activeert : Deactivation of : Deactiveert : zoom is enabled zoom is mogelijk zoom is disabled, uncheck fit to view to enable zoom Zichtaanpassing moet uitgeschakelt om te zoomen 000Basic Latin 000Basis Latijn 001Latin-1 Supplement 001Supplement Latijn-1 002Latin Extended-A 002Uitgebreid Latijn-A 003Latin Extended-B 003Uitgebreid Latijn-B 004IPA Extensions 004Aanvulling IPA 005Spacing Modifier Letters 005Spatie Modificeerder 006Combining Diacritical Marks 006Combineert Diakritische Tekens 007Greek and Coptic 007Grieks en Koptisch 008Cyrillic 008Cyrillisch 009Cyrillic Supplement 009Supplement Cyrillisch 010Armenian 010Armeens 011Hebrew 011Hebreeuws 012Arabic 012Arabisch 013Syriac 013Syrisch 014Arabic Supplement 014Supplement Arabisch 015Thaana 015Thaana 016N'Ko 016N'ko 017Devanagari 017Devanagari 018Bengali 018Bengaals 019Gurmukhi 019Gurmukhi 020Gujarati 020Gujarati 021Oriya 021Orya 022Tamil 022Tamil 023Telugu 023Telugu 024Kannada 024Kannada 025Malayalam 025Malayalam 026Sinhala 026Singhalees 027Thai 027Thais 028Lao 028Laotiaans 029Tibetan 029Tibetaans 030Burmese 030Birmees 031Georgian 031Georgisch 032Hangul Jamo 032Hangul Jamo 033Ethiopic 033Ethiopisch 034Ethiopic Supplement 034Supplement Ethiopsch 035Cherokee 035Cherokee 036Unified Canadian Aboriginal Syllabics 036Samenvoeging Autochtoon Canadese syllabi 037Ogham 037Ogham 038Runic 038Runisch 039Tagalog 039Tagalog 040Hanunóo 040HanunÄ 041Buhid 041Buhid 042Tagbanwa 042Tagbawna 043Khmer 043Khmer 044Mongolian 044Mongools 045Limbu 045Limbu 046Tai Le 046Tai Le 047New Tai Lue 047Nieuw Tai Lue 048Khmer Symbols 048Khmer Symbolen 049Buginese 049Buginees 050Balinese 050Balinees 051Lepcha 051Lepcha 052Phonetic Extensions 052 Fonetische aanvullingen 053Phonetic Extensions Supplement 053Supplement Fonetische Aanvullingen 054Combining Diacritical Marks Supplement 054Combineert Supplement Diakritische Tekens 055Latin Extended Additional 055Aanvullend Uitgebreid Latijn 056Greek Extended 056Uitgebreid Grieks 057General Punctuation 057Algemene Interpunctie 058Superscripts and Subscripts 058Superscripts en Subscripts 059Currency Symbols 059Valuta Symbolen 060Combining Diacritical Marks for Symbols 060Combineert Diakritische Tekens met Symbolen 061Letterlike Symbols 061Letterachtige Symbolen 062Number Forms 062cijfersymbolen 063Arrows 063Pijlen 064Mathematical Operators 064Mathematische Operators 065Miscellaneous Technical 065Technisch gevarieerd 066Control Pictures 066Controleer Afbeeldingen 067Optical Character Recognition 067Optisch Karakterherkenning 068Enclosed Alphanumerics 068Bijgesloten Alfanumerieken 069Box Drawing 069Box Tekeningen 070Block Elements 070Blokkeer Elementen 071Geometric Shapes 071Geometrische Vormen 072Miscellaneous Symbols 072Gevarieerde Symbolen 073Dingbats 073Droedels 074Miscellaneous Mathematical Symbols-A 074Gevarieerde Mathematische Symbolen-A 075Supplemental Arrows-A 075Aanvullende Pijlen-A 076Braille Patterns 076Braillepatronen 077Supplemental Arrows-B 077Aanvullende Pijlen-B 078Miscellaneous Mathematical Symbols-B 078Gavarieerde Mathematische Symbolen-B 079Supplemental Mathematical Operators 079Supplementair Mathematische Operators 080Miscellaneous Symbols and Arrows 080Gevarieerde Symbolen en Pijlen 081Glagolitic 081Glagolitisch 082Latin Extended-C 082Uitgebreid Latijn-C 083Coptic 083Koptisch 084Georgian Supplement 084Supplement Georgisch 085Tifinagh 085Tifinagh 086Ethiopic Extended 086Uitgebreid Ethopisch 087Supplemental Punctuation 087Aanvullende interpunctie 088CJK Radicals Supplement 088Supplement CJK Worteltekens 089Kangxi Radicals 089Kangxi Tekens 090Ideographic Description Characters 090Oleografisch 091CJK Symbols and Punctuation 091CJK Symbolen en Interpunctie 092Hiragana 092Hiragana 093Katakana 093Katakana 094Bopomofo 094Bopomofo 095Hangul Compatibility Jamo 095Hangul Verenigbaar met Jamo 096Kanbun 096Kanbun 097Bopomofo Extended 097Uitgebreid Bopomofo 098CJK Strokes 098CJK Strokes 099Katakana Phonetic Extensions 099Uitgebreid Fonetisch Katakana 100Enclosed CJK Letters and Months 100Bijgesloten CJK Letters en Maanden 101CJK Compatibility 101Verenigbaar CJK 102CJK Unified Ideographs Extension A 102Uitgebreid Samengevoegde ideografiën A 103Yijing Hexagram Symbols 103Yijing Hexagram Symbolen 104CJK Unified Ideographs 104CJK Samengevoegde Ideografiën 105Yi Syllables 105Yi syllabi 106Yi Radicals 106Yi Tekens 107Modifier Tone Letters 107klankletter Modificeerder 108Latin Extended-D 108Uitgebreid Latijn-D 109Syloti Nagri 109Syloti Nagri 110Phags-pa 110Phags-Pa 111Hangul Syllables 111Hangul Syllabi 112High Surrogates 112Belangrijke Surrogaten 113High Private Use Surrogates 113Belangrijk Prive Gebruikte Surrogaten 114Low Surrogates 114Eenvoudige Surrogaten 115Private Use Area 115Ruimte Voor Persoonlijk Gebruik 116CJK Compatibility Ideographs 116CJK Verenigbare Ideografiën 117Alphabetic Presentation Forms 117Presentatie Alfabetische vormen 118Arabic Presentation Forms-A 118Presentatie Arabische Vormen-A 119Variation Selectors 119Kiezersvariatie 120Vertical Forms 120Verticale vormen 121Combining Half Marks 121Combinerende Halve Tekens 122CJK Compatibility Forms 122CJK Verenigbare Vormen 123Small Form Variants 123Kleine Vorm Varianten 124Arabic Presentation Forms-B 124Presentatie Arabische Vormen-B 125Halfwidth and Fullwidth Forms 125Halfbreed en Volle Breedte Vormen 126Specials 126Extra's 127Supplementary Multilingual Plane (SMP) 127Supplementair Meertalig niveau (SMP) 128Supplementary Ideographic Plane (SIP) 128Supplementair Ideografisch Niveau (SIP) 129unassigned 129Niet Toegewezen 130Supplementary Special-purpose Plane (SSP) 130Supplementair Special-purpose PLane (SSP) 131Private Use Area 1 (PUA) 131Ruimte 1 (PUA) Voor Persoonlijk Gebruik 132Private Use Area 2 (PUA) 132Ruimte 2 (PUA) Alleen Persoonlijk Gebruik 133Un-Mapped Glyphs 133Niet Ingedeelde Glyphs 134View all mapped glyphs 134Overzicht alle ingedeelde glyphs default ontbreekt Names Namen Fontmatrix takes care of you is activated. If you want to remove it from Fontmatrix database, please deactivate it first. Fontmatrix safe You are about to remove a font from Fontmatrix database Do you want to continue? Welcome to Fontmatrix PrefsPanel Preferences Panel Voorkeurpaneel General Algemeen Show Fontmatrix in System Tray Toon Fontmatrix in System Tray Close to System Tray Sluit System Tray af Show Activate All and Deactivate All in the System Tray menu Toon Activeer Alles en Deactiveer Alles in het System Tray menu Ask confirmation when activating or deactivating all fonts Vraag bevestiging bij activeren of deactiveren van alle fonts Ask confirmation when activating or deactivating fonts by tags Vraag bevestiging bij activeren of deactiveren fonts via labels Preview Word Woord Voorzicht Font Editor Font Editor /usr/bin/fontforge /usr/bin/fontforge Browse... Bladeren... Ask for tag names when importing fonts Vraag naar labelnamen bij het fonts importatie Sample Text Tekstvoorbeeld Named Sample Texts Benoemde Tekstvoorbeelden Add Toevoegen Validate Bevestigen Layout Layout Font Size: Font maat: pt pt Interline: Tussenlijn: Apply Toepassen Remove Verwijder Preferences Voorkeuren Close Sluit Show "All" actions is RTL size Add the full path to your preferred font editor Show names of imported fonts after import process Show splash at startup Don’t use preferred name scheme (will affect only newly imported fonts) Initial Layout Hyphenation Left: Right: Dictionary: Browse ... Templates Folder Remote directories http:// Local storage Files and Folders Change TextLabel Shortcuts PrefsPanelDialog Looks like your setup does not have a system tray available. Het lijkt erop dat uw setup geen system tray beschikbaar heeft. A text Een tekst Select font editor Selecteer font editor Select Templates Folder Select Where remote font files will be stored Please select an item in the list or create a new one. Alt Ctrl Shift Meta Meta+ Shift+ Alt+ Ctrl+ Replace Shortcut is already in use for action name will be appended to this Do you still want to assign it? Action Actie Shortcut Tip Select hyphenation dictionary QObject Creating font book... Creëer font boek... cancel annuleer codepoint is U+ codepunt is U+ Copying files Unable to copy ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv default ontbreekt Mark, NonSpacing Mark, SpacingCombining Mark, Enclosing Number, DecimalDigit Number, Letter Number, Other Separator, Space Separator, Line Separator, Paragraph Other, Control Other, Format Other, Surrogate Other, PrivateUse Other, NotAssigned Letter, Uppercase Letter, Lowercase Letter, Titlecase Letter, Modifier Letter, Other Punctuation, Connector Punctuation, Dash Punctuation, Open Punctuation, Close Punctuation, InitialQuote Punctuation, FinalQuote Punctuation, Other Symbol, Math Symbol, Currency Symbol, Modifier Symbol, Other RemoteDir Downloading Systray &Activate all &Activeer alles &Deactivate all &Deactiveer alles Mi&nimize Mi&nimaliseer &Restore &Herstel E&xit E&xit &Tags &Labels TagSetDialog TagSet editor Labelset editor Collections of Tags Collectie Labels Available Tags Beschikbare Labels Add selected tag to current set. Voeg geselecteerd label toe aan huidige set. Add Toevoegen Collections Collecties New Nieuw delete delete Remove Verwijder Close Sluit TextProgressionWidget Form vorm Inline progression e.g. Latin text Left to right e.g. Arabic text Right to left e.g. Traditional Chinese & Japanese text Top to bottom e.g. Runic text Bottom to top Block progression e.g. Tarditionnal Chinese & Japanes text e.g. Traditional Mongolian text repairDialog Dialog Dialoog Remove Verwijder Close Sluit Select all Dead links Re-link Deactivate Activated Not Linked De-link Activate Deactivated Linked typotek Lists Lijsten Nothing Selected Niets Geselecteerd Fontmatrix Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Het programma blijft lopen in het system tray. Om het programma af te sluiten, kies <b>Exit</b> in het context menu van het system tray entry. Add Directory Voeg Directory toe Initial tags. The string you type will be split by "#" to obtain a tags list. Initiaal labels. De reeks die je typt zal afsplitsen in "#" om een labellijst te verkrijgen. Importing font files... Importeer font dossiers... cancel annuleer Import Importeer Can’t import this font because it’s broken : Dit font can niet geimporteerd worden wijgens gebroken : &Import... &Import... Ctrl+O Ctrl+O Import a directory Importeer een directory &Save &Save Ctrl+S Ctrl+S Save the document to disk Save het document op de schijf Print... Print... Print a specimen of the current font Print een specimen van het huidig font Export font book... Exporteer font boek... Export a pdf that show selected fonts Exporteer een pdf dat geselecteerde fonts toont E&xit E&xit Ctrl+Q Ctrl+Q Exit the application Verlaat de programma &About &About Show the Typotek's About box Toon de Typoteks About Box Help Help &Tag Sets &Label Sets Activate all current Activeer al het huidig Deactivate all current Deactiveer al het huidig Edit current font Edit het huidig font Try to run font editor with the selected font as argument Probeer font editor te starten met het geselecteerde font als argument You don't seem to have font editor installed. Path to font editor can be set in preferences. Je hebt waarschijnlijk font editor niet geïnstalleerd. Font editor path moet in Voorkeuren gestelt. Preferences Voorkeuren &File &Dossier Edit Edit &Help &Help Ready Klaar Print specimen Print Specimen Fontmatrix care Fontmatrix pas voor u op You are about to activate a bunch of fonts, it is time to cancel if it was not your intent U zal veel fonten activeeren, verwijder deze wanneer het niet de bedoeling is You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent U zal veel fonten deactiveeren, verwijder deze wanneer het niet de bedoeling is There is no font selected Er is geen font geselecteerd Support of DragNDrop over http is sheduled but not yet effective Hulp bij DragNDrop door http is sheduled maar nog niet effectief You bring something over me I can’t handle Je brengt mij iets dat ik niet kan behandelen You provided an empty string, it’s not fair Je bepaald een lege reeks, het is niet fatsoenlijk "default" is a reserved keyword "ontbreekt" is een gereserveerd sleutelwoord Choose the tag for filter exported fonts Choose Directory Export &Fonts Export a fontset Check Database Tag All... Load settings Check for Fontmatrix own dir Loading fonts present in database Catching font descriptions from network Collected System Font Adding fonts from system directories fonts available from system font descriptions imported from network Browse Fonts default ontbreekt "default" is a reserved Fonts imported: %1 Print Info... Print informations about the current font Print Sample... Print the sample as a specimen Print Chart... Print a chart of the current font Print Playground... Print the playground Print Family... Print a specimen of the whole family the current face belongs to About &Qt Next Family Next Face Previous Family Previous Face Layout Options Print &Edit &Browse Fontmatrix - data warning Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Unicode All fields Welcome maessage Print Infos Print Chart Print Playground Print Family fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-sr.ts0000644000175000017500000035023211023736606022124 0ustar malexmalex About About Fontmatrix Fontmatrix TextLabel Splash The Project The People Close AboutWidget version fonts loaded BookExportDialog Export Font Book Output Browse... FMLayout Text engine options FolderViewMenu Reload Tree Import Directory Import recursively Import File FontBookDialog Save fontBook FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Copyright Font Family Font Subfamily Unique font identifier Full font name Version string Postscript name Trademark Manufacturer Designer Description URL Vendor URL Designer License Description License Info URL Reserved Preferred Family Preferred Subfamily Compatible Full (Macintosh only) Sample text PostScript CID findfont name Fontmatrix - Download Downloading %1. Any No Fit Text and Display Script Decorative Pictorial Family Type Cove Obtuse Cove Square Cove Obtuse Square Cove Square Thin Bone Exaggerated Triangle Normal Sans Obtuse Sans Perp Sans Flared Rounded Serif style Very Light Light Book Medium Demi Bold Heavy Black Nord Weight Old Style Modern Even Width Expanded Condensed Very Expanded Very Condensed Monospaced Proportion None Very Low Low Medium Low Medium High High Very High Contrast Gradual/Diagonal Gradual/Transitional Gradual/Vertical Gradual/Horizontal Rapid/Vertical Rapid/Horizontal Instant/Vertical Stroke Variation Straight Arms/Horizontal Straight Arms/Wedge Straight Arms/Vertical Straight Arms/Single Serif Straight Arms/Double Serif Non-Straight Arms/Horizontal Non-Straight Arms/Wedge Non-Straight Arms/Vertical Non-Straight Arms/Single Serif Non-Straight Arms/Double Serif Arm Style Normal/Contact Normal/Weighted Normal/Boxed Normal/Flattened Normal/Rounded Normal/Off Center Normal/Square Oblique/Contact Oblique/Weighted Oblique/Boxed Oblique/Flattened Oblique/Rounded Oblique/Off Center Oblique/Square Letterform Standard/Trimmed Standard/Pointed Standard/Serifed High/Trimmed High/Pointed High/Serifed Constant/Trimmed Constant/Pointed Constant/Serifed Low/Trimmed Low/Pointed Low/Serifed Midline Constant/Small Constant/Standard Constant/Large Ducking/Small Ducking/Standard Ducking/Large X-Height Category Help Fontmatrix Help ImportTagsDialog Fontmatrix - Tags Add Ok ImportedFonts Dialog Imported Fonts Ok <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> Do not show this dialog again ImportedFontsDialog (not loaded) Number of Imported Fonts LayoutOptionWidget Form Weights score before exact after end penalty H-penalty ListDock Form Tag: Filter view by chosing tag Switch to panose filtering P Filter: Field selection F TextLabel Show complete collection of available fonts Names Files Previews Folders ListDockWidget All fields Unicode All activated MainView part I part II main view widget Nothing selected Right mouse click on a tag to add it or remove it from TagSet Add a tag Font Information Settings S OpenType O OpenType Features Friendly Name Save as default Reset Default SampleText ... Layout Font Size pt Rendering FreeType Native Qt objects World is wide Shaper type Script Use shaper Text Progression Sample Text Coverage of Unicode Interval : Clicking on a glyph will show details about it Glyphs push Playground Set Mode "Copy Character to Clipboard" C MainViewWidget 000Basic Latin 001Latin-1 Supplement 002Latin Extended-A 003Latin Extended-B 004IPA Extensions 005Spacing Modifier Letters 006Combining Diacritical Marks 007Greek and Coptic 008Cyrillic 009Cyrillic Supplement 010Armenian 011Hebrew 012Arabic 013Syriac 014Arabic Supplement 015Thaana 016N'Ko 017Devanagari 018Bengali 019Gurmukhi 020Gujarati 021Oriya 022Tamil 023Telugu 024Kannada 025Malayalam 026Sinhala 027Thai 028Lao 029Tibetan 030Burmese 031Georgian 032Hangul Jamo 033Ethiopic 034Ethiopic Supplement 035Cherokee 036Unified Canadian Aboriginal Syllabics 037Ogham 038Runic 039Tagalog 040Hanunóo 041Buhid 042Tagbanwa 043Khmer 044Mongolian 045Limbu 046Tai Le 047New Tai Lue 048Khmer Symbols 049Buginese 050Balinese 051Lepcha 052Phonetic Extensions 053Phonetic Extensions Supplement 054Combining Diacritical Marks Supplement 055Latin Extended Additional 056Greek Extended 057General Punctuation 058Superscripts and Subscripts 059Currency Symbols 060Combining Diacritical Marks for Symbols 061Letterlike Symbols 062Number Forms 063Arrows 064Mathematical Operators 065Miscellaneous Technical 066Control Pictures 067Optical Character Recognition 068Enclosed Alphanumerics 069Box Drawing 070Block Elements 071Geometric Shapes 072Miscellaneous Symbols 073Dingbats 074Miscellaneous Mathematical Symbols-A 075Supplemental Arrows-A 076Braille Patterns 077Supplemental Arrows-B 078Miscellaneous Mathematical Symbols-B 079Supplemental Mathematical Operators 080Miscellaneous Symbols and Arrows 081Glagolitic 082Latin Extended-C 083Coptic 084Georgian Supplement 085Tifinagh 086Ethiopic Extended 087Supplemental Punctuation 088CJK Radicals Supplement 089Kangxi Radicals 090Ideographic Description Characters 091CJK Symbols and Punctuation 092Hiragana 093Katakana 094Bopomofo 095Hangul Compatibility Jamo 096Kanbun 097Bopomofo Extended 098CJK Strokes 099Katakana Phonetic Extensions 100Enclosed CJK Letters and Months 101CJK Compatibility 102CJK Unified Ideographs Extension A 103Yijing Hexagram Symbols 104CJK Unified Ideographs 105Yi Syllables 106Yi Radicals 107Modifier Tone Letters 108Latin Extended-D 109Syloti Nagri 110Phags-pa 111Hangul Syllables 112High Surrogates 113High Private Use Surrogates 114Low Surrogates 115Private Use Area 116CJK Compatibility Ideographs 117Alphabetic Presentation Forms 118Arabic Presentation Forms-A 119Variation Selectors 120Vertical Forms 121Combining Half Marks 122CJK Compatibility Forms 123Small Form Variants 124Arabic Presentation Forms-B 125Halfwidth and Fullwidth Forms 126Specials 127Supplementary Multilingual Plane (SMP) 128Supplementary Ideographic Plane (SIP) 129unassigned 130Supplementary Special-purpose Plane (SSP) 131Private Use Area 1 (PUA) 132Private Use Area 2 (PUA) 133Un-Mapped Glyphs Activation event Cancel Activation of : Deactivation of : 134View all mapped glyphs Names Fontmatrix takes care of you is activated. If you want to remove it from Fontmatrix database, please deactivate it first. Fontmatrix safe You are about to remove a font from Fontmatrix database Do you want to continue? Welcome to Fontmatrix PrefsPanel Preferences Panel Preferences Show Fontmatrix in System Tray Close to System Tray Show "All" actions Ask confirmation when activating or deactivating all fonts Ask confirmation when activating or deactivating fonts by tags Preview Word is RTL size pt Font Editor Add the full path to your preferred font editor /usr/bin/fontforge Browse... Ask for tag names when importing fonts Show names of imported fonts after import process Show splash at startup Don’t use preferred name scheme (will affect only newly imported fonts) General Named Sample Texts Add Initial Layout Font Size: Interline: Hyphenation Left: Right: Dictionary: Browse ... Apply Sample Text Templates Folder Remote directories http:// Remove Local storage Files and Folders Change TextLabel Shortcuts Close PrefsPanelDialog Looks like your setup does not have a system tray available. A text Select font editor Select Templates Folder Select Where remote font files will be stored Please select an item in the list or create a new one. Alt Ctrl Shift Meta Meta+ Shift+ Alt+ Ctrl+ Replace Shortcut is already in use for action name will be appended to this Do you still want to assign it? Action Shortcut Tip Select hyphenation dictionary QObject codepoint is U+ Creating font book... cancel Copying files Unable to copy ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv Mark, NonSpacing Mark, SpacingCombining Mark, Enclosing Number, DecimalDigit Number, Letter Number, Other Separator, Space Separator, Line Separator, Paragraph Other, Control Other, Format Other, Surrogate Other, PrivateUse Other, NotAssigned Letter, Uppercase Letter, Lowercase Letter, Titlecase Letter, Modifier Letter, Other Punctuation, Connector Punctuation, Dash Punctuation, Open Punctuation, Close Punctuation, InitialQuote Punctuation, FinalQuote Punctuation, Other Symbol, Math Symbol, Currency Symbol, Modifier Symbol, Other RemoteDir Downloading Systray &Activate all &Deactivate all Mi&nimize &Restore &Tags E&xit TagSetDialog TagSet editor Collections of Tags Available Tags Add selected tag to current set. Add Collections New delete Remove Close TextProgressionWidget Form Inline progression e.g. Latin text Left to right e.g. Arabic text Right to left e.g. Traditional Chinese & Japanese text Top to bottom e.g. Runic text Bottom to top Block progression e.g. Tarditionnal Chinese & Japanes text e.g. Traditional Mongolian text repairDialog Dialog Select all Remove Dead links Re-link Deactivate Activated Not Linked De-link Activate Deactivated Linked Close typotek Add Directory &Import... Ctrl+O Import a directory &Save Ctrl+S Save the document to disk Export font book... Export a pdf that show selected fonts E&xit Ctrl+Q Exit the application &About Show the Typotek's About box Help &Tag Sets Edit current font &File &Help Ready There is no font selected Support of DragNDrop over http is sheduled but not yet effective You bring something over me I can’t handle Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Preferences You provided an empty string, it’s not fair Activate all current Deactivate all current Try to run font editor with the selected font as argument You don't seem to have font editor installed. Path to font editor can be set in preferences. Nothing Selected Importing font files... cancel Import Fontmatrix care You are about to activate a bunch of fonts, it is time to cancel if it was not your intent You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent Can’t import this font because it’s broken : Choose the tag for filter exported fonts Choose Directory Export &Fonts Export a fontset Check Database Tag All... Load settings Check for Fontmatrix own dir Loading fonts present in database Catching font descriptions from network Collected System Font Adding fonts from system directories fonts available from system font descriptions imported from network Browse Fonts default "default" is a reserved Fonts imported: %1 Print Info... Print informations about the current font Print Sample... Print the sample as a specimen Print Chart... Print a chart of the current font Print Playground... Print the playground Print Family... Print a specimen of the whole family the current face belongs to About &Qt Next Family Next Face Previous Family Previous Face Layout Options Print &Edit &Browse Fontmatrix - data warning Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Unicode All fields Welcome maessage Print Infos Print Chart Print Playground Print Family fontmatrix-0.6.0+svn20110930/src/messages/welcome_zh_CN.html0000644000175000017500000000274211035172507022336 0ustar malexmalex Welcome to Fontmatrix
##WELCOME_FONT##
Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.
Fontmatrix has some unique functionalities in the Open Source world :
Activate, deactivate fonts to reduce font lists and save resources
Allow to tag font for a better classification and group (de)activation
Make it easy to find particular glyph thanks to a glyph category display
Create a font book that can be printed to have a real overview of the fonts available
Display advanced OpenType features
Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/messages/welcome_en.html0000644000175000017500000000400411041066611021723 0ustar malexmalex Bienvenue dans Fontmatrix
##WELCOME_FONT##

Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.

Fontmatrix has some unique functionalities in the Open Source world :
  • Activate, deactivate fonts to reduce font lists and save resources
  • Allow to tag font for a better classification and group (de)activation
  • Make it easy to find particular glyph thanks to a glyph category display
  • Create a font book that can be printed to have a real overview of the fonts available
  • Display advanced OpenType features
  • Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network
  • etc.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/messages/fontmatrix-cs.ts0000644000175000017500000074674211301527350022115 0ustar malexmalex About About Fontmatrix O programu Fontmatrix TextLabel Textová jmenovka Splash Senzační obrázek The Project Projekt The People Lidé Close Zavřít AboutWidget version Verze version verze fonts loaded písem nahráno ActivationReportDialog Dialog Dialog Activation - Deactivation Error Report Hlášení chyb při aktivaci nebo deaktivaci písem Close Zavřít Font path Cesta k písmu Error Chyba AltSelectorWidget Form Formulář BookExportDialog Dialog Dialog Font book options Font book options File File Browse... Procházet... Paper Size Paper Size X-Pos X-Pos Family Family Style Style Text Text Font size Font size Family Family Style Style Headline Headline Body Body Sample text Sample text Export Font Book Exportovat knihu písem Font Book Options Font Book Options File: File: Paper Size: Paper Size: X Position X Position Family: Family: Style: Style: Text: Text: Font Size Font Size Headline: Headline: Body: Body: Sample Text: Sample Text: Preview Preview Output Výstup CompareWidget Form Formulář Fonts Písma Add Přidat Remove Odebrat Show Ukázat Metrics Metrika Points Body Controls Řídicí body Offset Posunutí 0 0 Fill: Výplň: Select a character Výběr znaku Keep in sync Synchronizovat DumpDialog Fontmatrix - Export font info for packaging Fontmatrix - Export informací o písmu pro balíčky TextLabel TextLabel Save to: Uložit jako: Browse... Procházet... Model Model <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Available names Dostupná jména Load... Načíst... FMActivate Unable to link Activation subroutine failed to make a symbolic link to the font file Nelze vytvořit symbolický odkaz Font already activated The Font asked for activation is already activated Písmo už je aktivováno Unable to un-link Activation subroutine failed to remove a symbolic link to the font file Nelze odstranit symbolický odkaz Font already de-activated The Font asked for de-activation is already de-activated Písmo už je deaktivováno Cannot link or copy the metrics file A postcript font (pfb) without its metrics file (afm) Nelze odkazovat nebo kopírovat metrický soubor Error activation A generic error in activation or deactivation process Chyba FMFloatingMenu Activate Aktivovat close Zavřít FMFontExtract File does not exist: Soubor neexistuje: Format not handled. Formát nelze zpracovat. Failed to extract: %1 Selhalo vytažení z %1 FMLayout Text engine options Volby zobrazovače textu FMMatchRaster The font %1 scores %2. Do you want to add it to the filtered fonts? Písmo %1 získalo %2 bodů.\nChcete jej přidat k filtrovaným písmům? No font match the submitted image Žádné písmo se neshoduje s použitým obrázkem FolderViewMenu Reload Tree Znovu nahrát strom Import Directory Zavést adresář Import recursively Zavádět vnořené adresáře Import File Zavést soubor FontAction Form Form action action Add Tag Add Tag Action Action FontBookDialog Save fontBook Uložit knihu písem FontCompareWidget None No fill color in comprae glyph Žádná FontExtractorDialog Font extractor Vytahovač písem Select PDF Výběr PDF File name Jméno souboru &Browse &Procházet Fonts Písma &Select Dir Vybrat &adresář &Extract &Vytáhnout Close Zavřít FontItem This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Tato hodnota je odmítnuta a nikdy nebyla používána ani hlášena od FreeType. Nepoužívejte ji a nezkoušejte ji. Copyright Autorské právo Font Family Rodina písem Font Subfamily Podrodina písem Unique font identifier Jedinečný identifikátor písma Full font name Úplný název písma Version string Řetězec verze Postscript name Postscriptový název Trademark Obchodní značka Manufacturer Výrobce Designer Návrhář Description Popis URL Vendor Adresa prodejce URL Designer Adresa návrháře License Description Popis licenčního ujednání License Info URL Adresa informací o licenčním ujednání Reserved Zamluveno Preferred Family Upřednostňovaná rodina Preferred Subfamily Upřednostňovaná podrodina Compatible Full (Macintosh only) Plně slučitelné (pouze Macintosh) Sample text Ukázkový text PostScript CID findfont name Název nelezeného písma PostScript CID Fontmatrix - Download Fontmatrix - Stažení Downloading %1. Stahuje se %1. Any Jakékoli No Fit Žádné spojení Text and Display Text a zobrazení Script Skript Decorative Ozdobné Pictorial Obrázkové Family Type Rodinný typ Cove Výklenek Obtuse Cove Neostrý výklenek Square Cove Čtvercový výklenek Obtuse Square Cove Neostrý čtvercový výklenek Square Čtvercové Thin Tenké Bone Kostěné Exaggerated Zvětšené Triangle Trojúhelníkové Normal Sans Normální bez Obtuse Sans Neostré bez Perp Sans Pachatel bez Flared Zvonové Rounded Zakulacené Serif style Patkový styl Very Light Velmi lehké Light Lehké Book Knižní Medium Středně velké Demi Polo Bold Tučné Heavy Těžké Black Černé Nord Severské Weight Váhové Old Style Starý styl Modern Moderní Even Width Neměnná šířka Expanded Roztažené Condensed Zhuštěné Very Expanded Velmi roztažené Very Condensed Velmi zhuštěné Monospaced Jednoprostorové Proportion Úměrnost None Žádný Very Low Velmi nízké Low Nízké Medium Low Středně nízké Medium High Středně vysoké High Vysoké Very High Velmi vysoké Contrast Kontrastní Gradual/Diagonal Postupné/Úhlopříčné Gradual/Transitional Postupné/Přechodné Gradual/Vertical Postupné/Svislé Gradual/Horizontal Postupné/Vodorovné Rapid/Vertical Svižné/Svislé Rapid/Horizontal Svižné/Vodorovné Instant/Vertical Bezprostřední/Svislé Stroke Variation Obměna tahu Straight Arms/Horizontal Urovnané ruce/Vodorovné Straight Arms/Wedge Urovnané ruce/Klínové Straight Arms/Vertical Urovnané ruce/Svislé Straight Arms/Single Serif Urovnané ruce/Jednoduché patkové Straight Arms/Double Serif Urovnané ruce/Dvojité patkové Non-Straight Arms/Horizontal Neurovnané ruce/Vodorovné Non-Straight Arms/Wedge Neurovnané ruce/Klínové Non-Straight Arms/Vertical Neurovnané ruce/Svislé Non-Straight Arms/Single Serif Neurovnané ruce/Jednoduché patkové Non-Straight Arms/Double Serif Neurovnané ruce/Dvojité patkové Arm Style Styl ruky Normal/Contact Běžné/Dotykové Normal/Weighted Běžné/Zatěžkané Normal/Boxed Běžné/Uložené v krabici Normal/Flattened Běžné/Zploštěné Normal/Rounded Běžné/Kulaté Normal/Off Center Běžné/Mimo střed Normal/Square Běžné/Čtvercové Oblique/Contact Šikmé/Dotykové Oblique/Weighted Šikmé/Zatěžkané Oblique/Boxed Šikmé/Uložené v krabici Oblique/Flattened Šikmé/Zploštěné Oblique/Rounded Šikmé/Kulaté Oblique/Off Center Šikmé/Mimo střed Oblique/Square Šikmé/Čtvercové Letterform Tvar písmene Standard/Trimmed Obvyklé/Štíhlé Standard/Pointed Obvyklé/Špičaté Standard/Serifed Obvyklé/Patkové High/Trimmed Vysoké/Štíhlé High/Pointed Vysoké/Špičaté High/Serifed Vysoké/Patkové Constant/Trimmed Stálé/Štíhlé Constant/Pointed Stálé/Špičaté Constant/Serifed Stálé/Patkové Low/Trimmed Nízké/Štíhlé Low/Pointed Nízké/Špičaté Low/Serifed Nízké/Patkové Midline Středová čára Constant/Small Stálé/Malé Constant/Standard Stálé/Obvyklé Constant/Large Stálé/Velké Ducking/Small Skrčené/Malé Ducking/Standard Skrčené/Obvyklé Ducking/Large Skrčené/Velké X-Height Výška malých písmen Category Skupina FontStrings Copyright Autorské právo Font Family Rodina písma Font Subfamily Podrodina písma Unique font identifier Jedinečný identifikátor písma Full font name Úplný název písma Version string Řetězec verze Postscript name Postscriptový název Trademark Obchodní značka Manufacturer Výrobce Designer Návrhář Description Popis URL Vendor Adresa prodejce URL Designer Adresa návrháře License Description Popis licenčního ujednání License Info URL Adresa informací o licenčním ujednání Preferred Family Upřednostňovaná rodina Preferred Subfamily Upřednostňovaná podrodina Compatible Full (Macintosh only) Plně slučitelné (pouze Macintosh) Sample text Ukázkový text PostScript CID findfont name Název CID písma v PostScriptu All fields Všechna pole Any Jakékoli No Fit Žádná shoda Text and Display Family Type Text a zobrazení Script Family Type Skript Decorative Family Type Ozdobné Pictorial Family Type Obrázkové Family Type Typ rodiny Cove Serif style Výklenek Obtuse Cove Serif style Neostrý výklenek Square Cove Serif style Čtvercový výklenek Obtuse Square Cove Serif style Neostrý čtvercový výklenek Square Serif style Čtvercové Thin Serif style Tenké Bone Serif style Kostěné Exaggerated Serif style Zvětšené Triangle Serif style Trojúhelníkové Normal Sans Serif style Normální bez Obtuse Sans Serif style Neostré bez Perp Sans Serif style Pachatel bez Flared Serif style Zvonové Rounded Serif style Zakulacené Serif style Typ patek Very Light Weight Velmi světlé Light Weight Světlé Thin Weight Tenké Book Weight Knižní Medium Weight Střední Demi Weight Polotučné Bold Weight Tučné Heavy Weight Těžké Black Weight Černé Nord Weight Severské Weight Váha Old Style Proportion Starý styl Modern Proportion Moderní Even Width Proportion Pevná šířka Expanded Proportion Roztažené Condensed Proportion Zúžené Very Expanded Proportion Velmi roztažené Very Condensed Proportion Velmi zúžené Monospaced Proportion S pevnou šířkou Proportion Proporce None Contrast Žádný Very Low Contrast Velmi nízký Low Contrast Nízký Medium Low Contrast Středně nízký Medium Contrast Střední Medium High Contrast Středně velký High Contrast Velký Very High Contrast Velmi velký Contrast Kontrast Gradual/Diagonal Stroke Variation Pozvolná/Úhlopříčná Gradual/Transitional Stroke Variation Pozvolná/Přechodná Gradual/Vertical Stroke Variation Pozvolná/Svislá Gradual/Horizontal Stroke Variation Pozvolná/Vodorovná Rapid/Vertical Stroke Variation Svižná/Svislá Rapid/Horizontal Stroke Variation Svižná/Vodorovná Instant/Vertical Stroke Variation Bezprostřední/Svislá Stroke Variation Obměna tahu Straight Arms/Horizontal Arm Style Rovná ramena/Vodorovná Straight Arms/Wedge Arm Style Rovná ramena/Klínová Straight Arms/Vertical Arm Style Rovná ramena/Svislá Straight Arms/Single Serif Arm Style Rovná ramena/Jednoduché patky Straight Arms/Double Serif Arm Style Rovná ramena/Dvojité patky Non-Straight Arms/Horizontal Arm Style Nerovná ramena/Vodorovná Non-Straight Arms/Wedge Arm Style Nerovná ramena/Klínová Non-Straight Arms/Vertical Arm Style Nerovná ramena/Svislá Non-Straight Arms/Single Serif Arm Style Nerovná ramena/Jednoduché patky Non-Straight Arms/Double Serif Arm Style Nerovná ramena/Dvojité patky Arm Style Styl ramen Normal/Contact Letterform Běžné/Dotykové Normal/Weighted Letterform Běžné/Zatěžkané Normal/Boxed Letterform Běžné/Uložené v krabici Normal/Flattened Letterform Běžné/Zploštěné Normal/Rounded Letterform Běžné/Kulaté Normal/Off Center Letterform Běžné/Mimo střed Normal/Square Letterform Běžné/Čtvercové Oblique/Contact Letterform Šikmé/Dotykové Oblique/Weighted Letterform Šikmé/Zatěžkané Oblique/Boxed Letterform Šikmé/Uložené v krabici Oblique/Flattened Letterform Šikmé/Zploštěné Oblique/Rounded Letterform Šikmé/Kulaté Oblique/Off Center Letterform Šikmé/Mimo střed Oblique/Square Letterform Šikmé/Čtvercové Letterform Tvar písmene Standard/Trimmed Midline Obvyklé/Štíhlé Standard/Pointed Midline Obvyklé/Špičaté Standard/Serifed Midline Obvyklé/Patkové High/Trimmed Midline Vysoké/Štíhlé High/Pointed Midline Vysoké/Špičaté High/Serifed Midline Vysoké/Patkové Constant/Trimmed Midline Stálé/Štíhlé Constant/Pointed Midline Stálé/Špičaté Constant/Serifed Midline Stálé/Patkové Low/Trimmed Midline Nízké/Štíhlé Low/Pointed Midline Nízké/Špičaté Low/Serifed Midline Nízké/Patkové Midline Středová čára Constant/Small X-Height Stálé/Malé Constant/Standard X-Height Stálé/Obvyklé Constant/Large X-Height Stálé/Velké Ducking/Small X-Height Skrčené/Malé Ducking/Standard X-Height Skrčené/Obvyklé Ducking/Large X-Height Skrčené/Velké X-Height Výška malých písmen This value is deprecated and was never used nor reported by FreeType. Don't use or test for it. Tato hodnota je odmítnuta a nikdy nebyla používána ani hlášena od FreeType. Nepoužívejte ji a nezkoušejte ji. Character to glyph mapping Převod znaků na glyfy Font header Hlavička písma Horizontal header Vodorovná hlavička Horizontal metrics Vodorovné metriky Maximum profile Maximální profil Naming table Tabulka jmen OS/2 and Windows specific metrics Metriky určené pro OS/2 a Windows PostScript information Informace pro PostScript Control Value Table Font program Program písma Glyph data Data glyfů Index to location CVT Program PostScript font program Program písma v PostScriptu Vertical Origin Svislý počátek Embedded bitmap data Embedded bitmap location data Embedded bitmap scaling data Baseline data Glyph definition data Glyph positioning data Glyph substitution data Justification data Digital signature Digitální podpis Grid-fitting/Scan-conversion Horizontal device metrics Kerning Kerny Linear threshold data PCL 5 data Data pro PCL 5 Vertical device metrics Vertical Metrics header Vertical Metrics Svislé metriky This font may be embedded and permanently installed on the remote system by an application. The user of the remote system acquires the identical rights, obligations and licenses for that font as the original purchaser of the font, and is subject to the same end-user license agreement, copyright, design patent, and/or trademark as was the original purchaser. Toto písmo lze vkládat do dokumentů a trvale instalovat na vzdálených systémech, přičemž uživatel vzdáleného systému získá pro toto písmo stejná oprávnění a licence jako ten, kdo si písmo koupil. Zároveň musí respektovat stejná licenční ujednání, autorská práva, patenty na návrh a/nebo obchodní značky jako původní kupec. This font must not be modified, embedded or exchanged in any manner without first obtaining permission of the legal owner. Toto písmo nelze měnit, vkládat do dokumentů nebo si žádným způsobem vyměňovat bez předchozího souhlasu zákonného vlastníka. This font may be embedded, and temporarily loaded on the remote system. Documents containing this font must be opened "read-only;" no edits can be applied to the document. Toto písmo lze sice vložit do dokumentu, ale na vzdáleném systému ho lze načíst pouze dočasně. Dokumenty, které písmo obsahují, lze otevírat pouze ke čtení, nesmějí být upravovány. This font may be embedded but must only be installed temporarily on other systems. In contrast to Preview &amp; Print fonts, documents containing this font may be opened for reading, editing is permitted, and changes may be saved. Toto písmo lze sice vložit do dokumentu, ale na vzdáleném systému ho lze načíst pouze dočasně. Oproti písmům s oprávněním „Prohlížet/Tisknout“ lze dokumenty s tímto písmem nejen zobrazovat, ale také upravovat a změny případně ukládat. This font may not be subsetted prior to embedding. Other embedding restrictions specified in bits 0-3 and 9 also apply. Z tohoto písma nelze vkládat do dokumentu jen jednotlivé znaky. Dále se uplatní další omezení podle bitů 0-3 a 9. Only bitmaps contained in this font may be embedded. No outline data may be embedded. If there are no bitmaps available in this font, then it is considered unembeddable and the embedding services will fail. Other embedding restrictions specified in bits 0-3 and 8 also apply. Z tohoto písma lze do dokumentu vložit pouze bitmapy, nikoliv vektorové obrysy. Pokud písmo žádné bitmapy neobsahuje, nelze jej do dokumentu vložit a vkládání skončí s chybou. Dále se uplatní další omezení podle bitů 0-3 a 9. Not Restricted Bez omezení Restricted S omezením Preview/Print Prohlížet/Tisknout Edit/Embed Upravovat/Vkládat No Subset Bez podmnožin Bitmap Only Pouze bitmapy Help Fontmatrix Help Nápověda k programu Fontmatrix Fontmatrix Help HelpBrowser Fontmatrix Online Help Nápověda Fontmatrix &File &Soubor &Edit &Upravovat &Bookmarks &Záložky &Print... &Tisknout... &Quit &Ukončit &Find... &Najít... Find &Next Najít &další Find &Previous Najít &předchozí &Add Bookmark Přidat záložku &Delete Smazat D&elete All Smazat vše Find Najít Search Term: Hledaný výraz: New Bookmark Nová záložka New Bookmark's Title: Název záložky: <h2><p>Sorry, no manual is installed!</p><p>Please contact your package provider or Fontmatrix team if you built the application yourself</p></h2> HTML message for no documentation available to show <h2><p>Lituji, ale není nápověda není nainstalovaná.</p><p>Kontaktujte, prosím, dodavatele vašeho balíčku, nebo tým vývojářů programu Fontmatrix, pokud jste si aplikaci překládal sám.</p></h2> Fontmatrix Help Nápověda Fontmatrix &Contents &Obsah Se&arch &Hledat Searching is case insensitive Hledání nerozlišuje velikost písmen &Search &Hledat 1 1 Book&marks Zálo&žky &New &Nová &Exit &Ukončit Find &Next... Najít &další... Find &Previous... Najít &předchozí... &Add &Přidat ImportTagsDialog Dialog Dialog Add Přidat Fontmatrix - Tags Fontmatrix - Značky Ok OK ImportedFonts Dialog Dialog Imported fonts Zavedená písma Imported Fonts: Zavedená písma: &Do not show this dialog again Tento &dialog znovu nezobrazovat &OK &OK Imported Fonts Zavedená písma Ok OK <qt>Instead of showing this dialog imported font count will be shown in the status bar. If you choose not to show this dialog anymore you can reset the state in preferences.</qt> <qt>Namísto zobrazení tohoto dialogu, bude počet zavedených písem ukázán ve stavovém řádku. Jestliže si vyberete, aby se tento dialog více neukazoval, můžete tuto volbu zrušit v nastavení.</qt> Do not show this dialog again Znovu již tento dialog nezobrazovat ImportedFontsDialog (not loaded) (nenahráno) Number of Imported Fonts Počet zavedených písem LayoutOptionWidget Form Formulář Text layout engine options Volby zobrazovače textu Weights Váhy score body Before Před Exact Přesně After Po End Konec space Mezera Max. compression Max. stlačení before předtím exact přesně after poté end konec penalty Postih H-penalty H-postih ListDock Form Formulář Search through font informations Search through font information Search Search Respect entered text case when searching Respect entered text case when searching Case sensitive Case sensitive Tag Tag Filter view by chosing tag Zobrazení filtru při výběru značky TagSet TagSet Show only fonts that belong to chosen tagset Show only fonts that belong to chosen tagset Names Jména Files Soubory Preview Preview Show complete collection of available fonts Ukázat celou sbírku dostupných písem View all View all Show all activated fonts Show all activated fonts View activated View activated Case Sensitive Case Sensitive Tag: Značka: Tag Set: Tag Set: View All View All View Activated View Activated Remove Remove Switch to panose filtering Přepnout na "panose" filtrování P P Filter: Filtr: Field selection Výběr pole <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want to negate the filter,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prefix the word with "!" such as in:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">"!pattern"</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want to enqueue the filter,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prefix it with "+".</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally, you can mix negate and queue in:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">"+!pattern"</span> or "!+pattern"</p></body></html> F F Not And reset Vymazat TextLabel Textový štítek save Uložit Collapse or expand Sbalit nebo rozbalit Show face boxes Zobrazit značky u řezů Previews Náhledy Folders Složky ListDockWidget You can use the following keywords to be replaced by data from fonts: <strong>&#60;name&#62;</strong> ; <strong>&#60;family&#62;</strong> ; <strong>&#60;variant&#62;</strong> Můžete použít následující klíčová slova, která budou nahrazena podle konkrétního písma: <strong>&#60;name&#62;</strong> (jméno); <strong>&#60;family&#62;</strong> (rodina); <strong>&#60;variant&#62;</strong> (varianta) Tags Značky Unicode character Znak Unicode Collapse Top Level Sbalit vrchní úrovně Collapse Families Sbalit rodiny Expand Top Level Rozbalit vrchní úrovně Expand Families Rozbalit rodiny Similar to current Podobné současnému All fields Všechna pole Unicode Unicode All activated Vše aktivováno MainView main view widget Prvek uživatelského rozhraní pro hlavní pohled Right mouse click on a tag to add it or remove it from TagSet Klepnutí pravým tlačítkem myši na značku pro její přidání nebo odstranění ze sady značek Font Info Font Info <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Sample text Sample text Fit to view Fit to view Zoom is disabled, uncheck fit to view to enable zoom Zoom is disabled, uncheck fit to view to enable zoom FT FT Sample text rendering options Volby zobrazení ukázkového textu Display settings Nastavení zobrazení Enable and disable OpenType features implemented in the font Povolení nebo zakázání vlastností OpenType daného písma OpenType features Vlastnosti OpenType Choose a sample text from your collection Výběr ukázkového textu z vaší sbírky Samples collection Sbírka ukázek OpenType Features Vlastnosti OpenType Friendly Name Přátelský název Appearance Vzhled FreeType based rasterized rendering Zobrazení založené na rastrovači FreeType Rasterized Rastrované No hinting Bez hintů Light Hinting Slabé hintování Normal Hinting Běžné hintování Freely scalable vector rendering using native toolkit (Qt) Libovolně zvětšitelné vektorové zobrazení s použitím Qt Vector Vektorové 1 1 Edit sample text Upravit ukázkový text Edit Upravit Coverage of Unicode Interval Pokrytí intervalu Unicode Block: Blok: Search: Hledat: Search a character by its codepoint (expressed in hexadecimal and prefixed with "U+", "u+" or "+") or a glyph by its name. Press enter after editing to run the search. Hledat znak pomocí jeho pozice (vyjádřené šestnáctkově a uvozené "U+", "u+" nebo "+") nebo glyf pomocí jména. Hledání začně až po stisku Enter. Copy Mode Režim kopírování Font Size: Velikost písma: Classification Třídění Compare Porovnání Apply features Apply features Glyphs Piktogramy Coverage of unicode interval : Coverage of unicode interval : Clicking on a glyph will show details about it Klepnutím na piktogram se ukážou jeho podrobnosti Tags Tags Font Information Informace o písmu Sample Text Ukázkový text Fit to View Fit to View Simulate screen rendering (FreeType inside) Simulate screen rendering (FreeType inside) Coverage of Unicode Interval : Pokrytí rozmezí Unicode: Add Tag Add Tag Font Size Velikost písma pt pt part I část I part II část II Nothing selected Nic nebylo označeno Add a tag Přidat značku Settings Nastavení S S OpenType OpenType O O Save as default Uložit jako výchozí Reset Default Přenastavit na výchozí SampleText Ukázkový text ... ... Layout Rozvržení Rendering Předvedení FreeType FreeType Native Qt objects Přirozené Qt objekty World is wide Svět je široký Script Writing system Skript Shaper type Druh tvarovače Script Skript Use shaper Použít tvarovač Text Progression Vývoj textu push Tlačit Playground Hřiště Set Mode "Copy Character to Clipboard" Nastavit režim "Kopírovat znak do schránky" C C MainViewWidget 000Basic Latin 000 Základní latinské 001Latin-1 Supplement 001 Latinské-1 doplněk 002Latin Extended-A 002 Latinské rozšířené-A 003Latin Extended-B 003 Latinské rozšířené-B 004IPA Extensions 004 IPA Rozšíření 005Spacing Modifier Letters 005 Písmena mezer rozvíjejícího větného členu (před podstatným jménem) 006Combining Diacritical Marks 006 Spojovací rozlišovací znaky 007Greek and Coptic 007 Řecké a koptské 008Cyrillic 008 Cyrilické 009Cyrillic Supplement 009 Cyrilické doplněk 010Armenian 010 Arménské 011Hebrew 011 Hebrejské 012Arabic 012 Arabské 013Syriac 013 Syrské 014Arabic Supplement 014 Arabské doplněk 015Thaana 015 Thaana 016N'Ko 016 N'Ko 017Devanagari 017 Devanagari 018Bengali 018 Bengálské 019Gurmukhi 019 Gurmukhi 020Gujarati 020 Gujarati 021Oriya 021 Oriya 022Tamil 022 Tamilské 023Telugu 023 Telugu 024Kannada 024 Kannada 025Malayalam 025 Malayalam 026Sinhala 026 Sinhala 027Thai 027 Thajské 028Lao 028 Lao 029Tibetan 029 Tibetské 030Burmese 030 Barmské 031Georgian 031 Gruzínské 032Hangul Jamo 032 Hangul Jamo 033Ethiopic 033 Etiopské 034Ethiopic Supplement 034 Etiopské doplněk 035Cherokee 035 Cherokee 036Unified Canadian Aboriginal Syllabics 036 Sjednocené kanadské původní slabikotvorné souhláskové 037Ogham 037 Ogamské 038Runic 038 Runové 039Tagalog 039 Filipínské 040Hanunóo 040 Hanunóo 041Buhid 041 Buhid 042Tagbanwa 042 Tagbanwa 043Khmer 043 Khmerské 044Mongolian 044 Mongolské 045Limbu 045 Limbu 046Tai Le 046 Tai Le 047New Tai Lue 047 Nové Tai Lue 048Khmer Symbols 048 Khmérské symboly 049Buginese 049 Buginese 050Balinese 050 Balijské 051Lepcha 051 Lepcha 052Phonetic Extensions 052 Hláskoslovná rozšíření 053Phonetic Extensions Supplement 053 Doplněk k hláskoslovným rozšířením 054Combining Diacritical Marks Supplement 054 Doplněk ke sloučeným rozlišovacím znakům 055Latin Extended Additional 055 Latinské rozšířené-doplňkové 056Greek Extended 056 Řecké rozšířené 057General Punctuation 057 Obecná interpunkční znaménka 058Superscripts and Subscripts 058 Horní a dolní indexy 059Currency Symbols 059 Měnové symboly 060Combining Diacritical Marks for Symbols 060 Sloučené rozlišovací znaky pro symboly 061Letterlike Symbols 061 Písmena na způsob symbolů 062Number Forms 062 Druhy čísel 063Arrows 063 Šipky 064Mathematical Operators 064 Matematické operátory 065Miscellaneous Technical 065 Různé technické 066Control Pictures 066 Obrázky ovládání 067Optical Character Recognition 067 Optické rozpoznávání znaků 068Enclosed Alphanumerics 068 Uzavřené alfanumerické 069Box Drawing 069 Kresba krabiček 070Block Elements 070 Blokové prvky 071Geometric Shapes 071 Geometrické tvary 072Miscellaneous Symbols 072 Různé symboly 073Dingbats 073 Pošahané věci 074Miscellaneous Mathematical Symbols-A 074 Různé matematické symboly A 075Supplemental Arrows-A 075 Doplňkové šipky A 076Braille Patterns 076 Vzory Braillova/slepeckého písma 077Supplemental Arrows-B 077 Doplňkové šipky B 078Miscellaneous Mathematical Symbols-B 078 Různé matematické symboly B 079Supplemental Mathematical Operators 079 Doplňkové matematické operátory 080Miscellaneous Symbols and Arrows 080 Různé symboly a šipky 081Glagolitic 081 Hlaholické 082Latin Extended-C 082 Latinské rozšířené-C 083Coptic 083 Koptské 084Georgian Supplement 084 Gruzínské doplněk 085Tifinagh 085 Tifinagh 086Ethiopic Extended 086 Etiopské rozšířené 087Supplemental Punctuation 087 Doplňková interpunkční znaménka 088CJK Radicals Supplement 088 CJK kořeny doplněk 089Kangxi Radicals 089 Kangxi kořeny 090Ideographic Description Characters 090 Znaky ideografického popisu 091CJK Symbols and Punctuation 091 CJK symboly a interpunkční znaménka 092Hiragana 092 Hiragana 093Katakana 093 Katakana 094Bopomofo 094 Bopomofo 095Hangul Compatibility Jamo 095 Hangul slučitelnosti Jamo 096Kanbun 096 Kanbun 097Bopomofo Extended 097 Bopomofo rozšířené 098CJK Strokes 098 CJK tahy 099Katakana Phonetic Extensions 099 Fonetická rozšíření pro Katakanu 100Enclosed CJK Letters and Months 100 Uzavřená CJK písmena a měsíce 101CJK Compatibility 101 CJK slučitelnost 102CJK Unified Ideographs Extension A 102 CJK sjednocené ideografické rozšíření A 103Yijing Hexagram Symbols 103 Yijing hexagramové symboly 104CJK Unified Ideographs 104 CJK sjednocené ideogramy 105Yi Syllables 105 Yi slabiky 106Yi Radicals 106 Yi kořeny 107Modifier Tone Letters 107 Písmena tónového rozvíjejícího větného členu (před podstatným jménem) 108Latin Extended-D 082 Latinské rozšířené-D 109Syloti Nagri 109 Syloti Nagri 110Phags-pa 110 Phags-pa 111Hangul Syllables 111 Hangul slabiky 112High Surrogates 112 Vysoké náhrady 113High Private Use Surrogates 113 Vysoké náhrady pro soukromé použití 114Low Surrogates 114 Nízké náhrady 115Private Use Area 115 Oblast soukromého použití 116CJK Compatibility Ideographs 116 Ideogramy CJK slučitelnosti 117Alphabetic Presentation Forms 117 Abecední provedení tvarů 118Arabic Presentation Forms-A 118 Arabské provedení tvarů A 119Variation Selectors 119 Voliče obměn 120Vertical Forms 120 Svislé tvary 121Combining Half Marks 121 Spojující poloznaky 122CJK Compatibility Forms 122 Tvary CJK slučitelnosti 123Small Form Variants 123 Malé obměny tvarů 124Arabic Presentation Forms-B 124 Arabské provedení tvarů B 125Halfwidth and Fullwidth Forms 125 Tvary s poloviční a plnou šířkou 126Specials 126 Zvláštní znaky 127Supplementary Multilingual Plane (SMP) 127 Doplňková vícejazyčná rovina (SMP) 128Supplementary Ideographic Plane (SIP) 128 Doplňková ideogramatická rovina (SIP) 129unassigned 129 Nepřidělené 130Supplementary Special-purpose Plane (SSP) 130 Doplňková rovina pro zvláštní účel (SSP) 131Private Use Area 1 (PUA) 131 Oblast soukromého použití 1 (PUA) 132Private Use Area 2 (PUA) 132 Oblast soukromého použití 2 (PUA) 133Un-Mapped Glyphs 133 Nezobrazované piktogramy Activation event Událost aktivace Cancel Zrušit Activation of : Aktivace: Deactivation of : Deaktivace: 134View all mapped glyphs 134 Zobrazit všechny zobrazované piktogramy Un-Mapped Glyphs Nenamapované glyfy View all mapped glyphs Všechny namapované glyfy Names Názvy Activated Aktivované User Identify root of user defined sample texts Uživatelské Block (%1): Blok (%1): Fontmatrix takes care of you Fontmatrix se o Vás postará is activated. If you want to remove it from Fontmatrix database, please deactivate it first. je aktivován. Pokud je chcete odstranit z databáze programu Fontmatrix, nejprve je, prosím, deaktivujte. Fontmatrix safe Ochrana Fontmatrixu You are about to remove a font from Fontmatrix database Chystáte se odstranit písmo z databáze programu Fontmatrix Do you want to continue? Chcete pokračovat? Welcome to Fontmatrix Fontmatrix vás vítá 122.0 Size of the welcome message 122.0 Load Načítám An error occured when tried to load %1 with command: %2 %1 is an url and %2 a program Při pokusu načíst %1 příkazem %2 došlo k chybě MatchRasterDialog Find a font using raster sample Najít písmo pomocí rastrovaného vzorku Input Image Vstupní obrázek Grab mode Režim záchytu Zoom level Zvětšení &Browse &Procházet Raster sample preview Náhled obrázku C&haracter: &Znak: A unique character or a four digits hexadecimal Unicode value Jediný znak nebo čtyři číslice jeho Unicode hodnoty v šestnáctkovém vyjádření &Search &Hledat If set, you will be prompted for each matching font Je-li zvoleno, budete vyzvání u každého odpovídajícího písma Interactive Interaktivní Click on the letter to let Fontmatrix compute the bounding box Klikněte na písmeno a Fontmatrix určí jeho ohraničující obdélník Tweak rect Upravit obdélník Compare with: Srovnat s: Stop Zastavit &Cancel &Zrušit PanoseDialog Fontmatrix - Panose Editor Fontmatrix - Panose Editor TextLabel TextLabel PrefsPanel Preferences Panel Panel voleb General Obecné Show Fontmatrix in system tray Show Fontmatrix in system tray Close to system tray Zavřít do systémové části panelu Show Activate all and Deactivate all in system tray menu Show Activate all and Deactivate all in system tray menu Ask confirmation when activating or deactivating all fonts Při aktivaci nebo deaktivaci všech fontů se zeptat na potvrzení Ask confirmation when activating or deactivating tags Ask confirmation when activating or deactivating tags Preview word Preview word Sample text Sample text Named sample texts Named sample texts Add Přidat Validate Validate Layout Layout Font size Font size pt pt Interline Interline Apply Použít Show Fontmatrix in System Tray Ukázat Fontmatrix v systémové části panelu Close to System Tray Při zavření ponechat v systémové části panelu Show Activate All and Deactivate All in the System Tray menu Show Activate All and Deactivate All in the System Tray menu Ask confirmation when activating or deactivating fonts by tags Při aktivaci nebo deaktivaci písem podle značek se zeptat na potvrzení Preview Word Slovo náhledu Font Editor Editor písem /usr/bin/fontforge /usr/bin/fontforge Browse... Procházet... Ask for tag names when importing fonts Při zavádění písem se ptát na názvy značek Sample Text Ukázkový text Named Sample Texts Pojmenovaný ukázkový text Font Size: Velikost písma: Interline: Psát ob řádek: Remove Odstranit Preferences Volby Close Zavřít System tray Systémová část panelu Display Zobrazení Service Služby Samples collection Sbírka ukázek Files & Folders Soubory & složky Start minimized to system tray Spouštět minimalizované do systémové části panelu Show "All" actions Ukázat "všechny" kroky Ask for confirmation when activating or deactivating all fonts Žádat potvrzení při aktivaci/deaktivaci všech písem Ask for confirmation when activating or deactivating fonts by tags Žádat potvrzení při aktivaci/deaktivaci písem podle značek Word: Slovo: Default font size: Výchozí velikost písma: subtitled podtitulek is RTL je RTL Chart Subtitle Font Písmo podtitulku v tabulce Size: Velikost: linespacing: Vzdálenost řádků: Information Style Styl informací Select Style Vybrat styl Fonts Editor Editor písem Help Browser Prohlížeč nápovědy Extra options: Další volby: Select an hyphenation dict file as it comes with OpenOffice or Scribus Vyberte slovník s dělením slov (buď z OpenOffice nebo ze Scribusu) Hyphenation dictionary Slovník dělení slov Sample Texts Ukázkové texty + + - Save Uložit size velikost Add the full path to your preferred font editor Přidat celou cestu k vašemu oblíbenému editoru Show names of imported fonts after import process Po dokončení zaváděcího procesu ukázat názvy zavedených písem Show splash at startup Při spuštění ukázat ten senzační obrázek Don’t use preferred name scheme (will affect only newly imported fonts) Nepoužívat oblíbené schéma názvů (ovlivní pouze nově zaváděná písma) Initial Layout Rozvržení na začátku Hyphenation Dělení slov Left: Levý: Right: Pravý: Dictionary: Slovník: Browse Procházet ... ... Templates Folder Složka se šablonami Remote directories Vzdálené adresáře http:// http:// Local storage Místní úložiště Files and Folders Soubory a složky Change Změnit TextLabel Textová jmenovka Shortcuts Klávesové zkratky PrefsPanelDialog Looks like your setup does not have a system tray available. Zdá se, že systémová část panelu není dostupná. A text A text Select font editor Výběr editoru písem Select Templates Folder Výběr složky šablon Select Where remote font files will be stored Výběr složky pro uložení souborů vzdálených písem Please select an item in the list or create a new one. Vyberte, prosím, ze seznamu jednu položku, nebo jednu vytvořte. You can use the following keywords to be replaced by data from fonts: <strong>&#60;name&#62;</strong> ; <strong>&#60;family&#62;</strong> ; <strong>&#60;variant&#62;</strong> Můžete použít následující klíčová slova, která budou nahrazena podle konkrétního písma: <strong>&#60;name&#62;</strong> (jméno); <strong>&#60;family&#62;</strong> (rodina); <strong>&#60;variant&#62;</strong> (varianta) Sample Text A default sample text inserted when creating a new sample Ukázkový text Do you confirm that you want to remove: the name of a sample text will be append to the string Opravdu chcete odstranit: Select web browser Výběr prohlížeče webu Alt Alt Ctrl Ctrl Shift Shift Meta Meta Meta+ Meta+ Shift+ Shift+ Alt+ Alt+ Ctrl+ Ctrl+ Replace Nahradit Shortcut is already in use for action name will be appended to this Zkratka se již používá pro Do you still want to assign it? Stále ještě ji chcete přiřadit? Action Akce Shortcut Zkratka Tip Rada Select hyphenation dictionary Vybrat slovník dělení slov QObject codepoint is U+ pozice je U+ Creating font book... Vytváří se kniha písem... cancel Zrušit Copying files Kopírují se soubory Unable to copy Nelze kopírovat ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. ABCDEFGH IJKLMNOPQ RSTUVXYZ abcdefgh ijklmnopq rstuvxyz 0123456789 ,;:!?. hamburgefonstiv hamburgefonstiv Mark, NonSpacing Značka, bez šířky Mark, SpacingCombining Značka, diakritická, s šířkou Mark, Enclosing Značka, obklopující Number, DecimalDigit Číslo, desítková číslice Number, Letter Číslo, písmeno Number, Other Číslo, jiné Separator, Space Oddělovač, mezera Separator, Line Oddělovač, řádek Separator, Paragraph Oddělovač, odstavec Other, Control Jiné, řídicí Other, Format Jiné, formát Other, Surrogate Jiné, náhrada (surrogate) Other, PrivateUse Jiné, soukromé použití Other, NotAssigned Jiné, nepřiděleno Letter, Uppercase Písmeno, velká písmena Letter, Lowercase Písmeno, malá písmena Letter, Titlecase Písmeno, titlecase (první velké, druhé malé) Letter, Modifier Písmeno, modifikátor Letter, Other Písmeno, jiné Punctuation, Connector Interpunkční znaménka, spojovník Punctuation, Dash Interpunkční znaménka, pomlčka Punctuation, Open Interpunkční znaménka, otevírací Punctuation, Close Interpunkční znaménka, zavírací Punctuation, InitialQuote Interpunkční znaménka, počáteční uvozovky Punctuation, FinalQuote Interpunkční znaménka, závěrečné uvozovky Punctuation, Other Interpunkční znaménka, jiná Symbol, Math Symbol, matematika Symbol, Currency Symbol, měna Symbol, Modifier Symbol, modifikátor Symbol, Other Symbol, jiný Unicode Ranges Rozsahy Unicode Glyphs count Počet glyfů Font Type Typ písma Charmaps List Basic Latin Základní latinka Latin-1 Supplement Dodatečná latinka Latin Extended-A Rozšířená latinka A Latin Extended-B Rozšířená latinka B IPA Extensions Rozšíření IPA Spacing Modifier Letters Písmenné modifikátory s šířkou Combining Diacritical Marks Kombinující se diakritika Greek and Coptic Řečtina a kopština Cyrillic Azbuka Cyrillic Supplement Dodatečná azbuka Armenian Arménština Hebrew Hebrejština Arabic Arabština Syriac Syrština Arabic Supplement Dodatečná arabština Thaana NKo Devanagari Bengali Bengálština Gurmukhi Gujarati Oriya Tamil Tamilština Telugu Kannada Malayalam Sinhala Thai Thajština Lao Tibetan Tibetština Myanmar Georgian Gruzínština Hangul Jamo Ethiopic Etiopština Ethiopic Supplement Dodatečná etiopština Cherokee Unified Canadian Aboriginal Syllabics Ogham Runic Tagalog Hanunoo Buhid Tagbanwa Khmer Mongolian Mongolština Limbu Tai Le New Tai Lue Khmer Symbols Buginese Balinese Sundanese Lepcha Ol Chiki Phonetic Extensions Fonetické rozšíření Phonetic Extensions Supplement Dodatečné fonetické rozšíření Combining Diacritical Marks Supplement Dodatečná kombinující se diakritika Latin Extended Additional Přídavná rozšířená latinka Greek Extended Rozšířená řečtina General Punctuation Obecné značky Superscripts and Subscripts Horní a dolní indexy Currency Symbols Měnové symboly Combining Diacritical Marks for Symbols Kombinující se diakritika pro symboly Letterlike Symbols Písmenné symboly Number Forms Číselné formy Arrows Šipky Mathematical Operators Matematické operátory Miscellaneous Technical Různé technické symboly Control Pictures Kontrolní obrázky Optical Character Recognition Optické rozpoznávání znaků Enclosed Alphanumerics Obklopené alfanumerické Box Drawing Kreslení boxů Block Elements Blokové prvky Geometric Shapes Geometrické tvary Miscellaneous Symbols Různé symboly Dingbats Dingbats Miscellaneous Mathematical Symbols-A Různé matematické symboly A Supplemental Arrows-A Dodatečné šipky A Braille Patterns Braillovy vzory Supplemental Arrows-B Dodatečné šipky B Miscellaneous Mathematical Symbols-B Různé matematické symboly B Supplemental Mathematical Operators Dodatečné matematické operátory Miscellaneous Symbols and Arrows Různé symboly a šipky Glagolitic Hlaholice Latin Extended-C Rozšířená latinka C Coptic Kopština Georgian Supplement Dodatečná gruzínština Tifinagh Ethiopic Extended Rozšířená etiopština Cyrillic Extended-A Rozšířená azbuka A Supplemental Punctuation Dodatečná interpunkce CJK Radicals Supplement Kangxi Radicals Ideographic Description Characters CJK Symbols and Punctuation Hiragana Katakana Bopomofo Hangul Compatibility Jamo Kanbun Bopomofo Extended CJK Strokes Katakana Phonetic Extensions Enclosed CJK Letters and Months CJK Compatibility CJK Unified Ideographs Extension A Yijing Hexagram Symbols CJK Unified Ideographs Yi Syllables Yi Radicals Vai Cyrillic Extended-B Rozšířená azbuka B Modifier Tone Letters Latin Extended-D Rozšířená latinka D Syloti Nagri Phags-pa Saurashtra Kayah Li Rejang Cham Hangul Syllables High Surrogates High Private Use Surrogates Low Surrogates Private Use Area Oblast soukromého použití CJK Compatibility Ideographs Alphabetic Presentation Forms Arabic Presentation Forms-A Variation Selectors Vertical Forms Combining Half Marks CJK Compatibility Forms Small Form Variants Arabic Presentation Forms-B Halfwidth and Fullwidth Forms Specials Speciální Linear B Syllabary Linear B Ideograms Aegean Numbers Ancient Greek Numbers Ancient Symbols Phaistos Disc Lycian Carian Old Italic Gothic Ugaritic Old Persian Deseret Shavian Osmanya Cypriot Syllabary Phoenician Lydian Kharoshthi Cuneiform Cuneiform Numbers and Punctuation Byzantine Musical Symbols Musical Symbols Hudební symboly Ancient Greek Musical Notation Tai Xuan Jing Symbols Counting Rod Numerals Mathematical Alphanumeric Symbols Matematické alfanumerické symboly Mahjong Tiles Dlaždice pro Mahjong Domino Tiles Dlaždice pro domino CJK Unified Ideographs Extension B CJK Compatibility Ideographs Supplement Tags Značky Variation Selectors Supplement Supplementary Private Use Area-A Dodatečná oblast soukromého použití A Supplementary Private Use Area-B Dodatečná oblast soukromého použití B RemoteDir Downloading Stahuje se Systray &Activate all &Aktivovat vše &Deactivate all &Deaktivovat vše Mi&nimize Mi&nimalizovat &Restore &Obnovit &Exit &Exit &Tags &Značky E&xit &Ukončit TTTableView Save File Uložit soubor TTTableWidget TrueType tables display Zobrazení tabulek TrueType TrueType Tables Tabulky TrueType Tag Značka Description Popis Size Velikost &Export &Exportovat TagSetDialog TagSet editor Editor nastavení značek Collections of Tags Sbírky značek Available tags Available tags Add selected tag to current set. Přidat vybranou značku k nynější sadě. add add Collections Sbírky New Nový delete Smazat remove remove Close Zavřít Available Tags Dostupné značky Add Přidat Remove Odstranit TagsWidget Edit followed by a tag name Upravit Remove tag "%1" from database the %%1 is a tag name Odstranit značku %1 z databáze Please confirm that you want to remove the following tag from database: Potvrďte, prosím, že chcete z databáze odstranit tuto značku: Please provide a replacement name for the following tag: Zadejte, prosím, nové jméno pro tuto značku: TextProgressionWidget Form Formulář Inline progression Směr řádku e.g. Latin text např. latinský text Left to right Zleva doprava e.g. Arabic text např. arabský text Right to left Zprava doleva e.g. Traditional Chinese & Japanese text např. tradiční čínský & japonský text Top to bottom Shora dolů e.g. Runic text např. runový text Bottom to top Zdola nahoru Block progression Směr bloku e.g. Tarditionnal Chinese & Japanes text např. tradiční čínský & japonský text e.g. Traditional Mongolian text např. tradiční mongolský text repairDialog Dialog Dialog Remove Odstranit Close Zavřít Select all Vybrat vše Dead links Nefunkční odkazy Database repair Kontrola databáze Re-link Znovu spojovat Deactivate Vyřadit z provozu Unreferenced Files Nepřiřazené soubory Activated Not Linked Spuštěné nespojené De-link Odpojit Activate Spustit Deactivated Linked Spojené vyřazené z provozu tagsWidget Form Formulář Nothing selected Nic nebylo označeno Right mouse click on a tag to add it or remove it from TagSet Klepnutí pravým tlačítkem myši na značku pro její přidání nebo odstranění ze sady značek Add a tag Přidat značku Add Tag Přidat značku typotek Fontmatrix Fontmatrix The program will keep running in the system tray. To terminate the program, choose <b>Exit</b> in the context menu of the system tray entry. Program poběží i nadále v systémové části panelu. Pro ukončení programu zvolte <b>Ukončit</b> v kontextovém menu programu vyvolaném ze systemové lišty. Add Directory Přidat adresář confirmation potvrzení Do you confirm you want to import these %1 fonts? Potvrzujete, že chcete zavést %1 fontů? Cannot import this font because it is broken: Nemohu zavést tento font, protože je poškozený: &Import... &Zavést... Ctrl+O Ctrl+O Import a directory Zavést adresář &Save &Uložit Ctrl+S Ctrl+S Save the document to disk Uložit dokument na disk Print... Print... Print a specimen of the current font Print a specimen of the current font Export font book... Exportovat knihu fontů... Export a pdf that show selected fonts Exportovat pdf, které ukazuje vybraná písma E&xit U&končit Ctrl+Q Ctrl+Q Exit the application Ukončit aplikaci &About &O Show the Typotek's About box Ukázat informační okénko Typotéky "O" Help Nápověda &Tag Sets &Sady značek Activate all currents Activate all currents Deactivate all currents Deactivate all currents Edit current font Upravit nynější písmo Try to run Fontforge with the selected font as argument Try to run Fontforge with the selected font as argument Preferences Volby &File &Soubor Edit Edit &Help &Nápověda Ready Připraven Print specimen Print specimen There is no font selected Žádné písmo nebylo vybráno Support of DragNDrop over http is sheduled but not yet effective Podpora pro "táhni a pusť" přes http je naplánována, ale dosud není účinná You bring something over me I can’t handle Dal jste mi něco, s čím si nedovedu poradit You provided an empty string, it’s not fair Poskytl jste prázdný řetězec, a to přeci není správné "default" is a reserved keyword "default" is a reserved keyword Activate all current Aktivovat všechna nynější Deactivate all current Deaktivovat všechna nynější Try to run font editor with the selected font as argument Zkusit spustit editor písem editor s označeným písmem jako argumentem You don't seem to have font editor installed. Path to font editor can be set in preferences. Nezdá se, že byste měl nainstalován editor písem. Cestu k editoru písem lze nastavit ve volbách. Nothing Selected Nic nebylo označeno Importing font files... Importují se soubory s písmy... cancel Zrušit Import Zavést Switch to the previous font face in the list Přejde na předchozí řez písma v seznamu Text layout engine options Volby zobrazovače textu View and edit text layout engine variables Zobrazí a upraví proměnné zobrazovače textu Extract fonts... Vytáhnout písma... Extract fonts from documents like PDF to PFM file format Vytáhne písma, která jsou vložena v dokumentech PDF a uloží je ve formátu PFM Find a font using raster sample... Najít písmo podle obrázku... Find a font using a raster sample of a letter Najde písmo podle rastrového obrázku písmena Execute Script... Vykonat skript... Execute a Python script Vykoná skript v Pythonu Execute Last Script Vykonat poslední skript Execute the last chosen Python script Znovu vykoná poslední skript v Pythonu Script Console... Konzole skriptu... Open Python scripting console Otevře konzoli pro psaní skriptu v Pythonu &View P&ohled &Scripts S&kripty &Service S&lužby Loading System Fonts Nahrávám systémová písma System Fonts Systémová písma fonts from followed by a directory name písem z system fonts added. systémových fontů přidáno. Fontmatrix care Péče programu Fontmatrix You are about to activate a bunch of fonts, it is time to cancel if it was not your intent Vypadá to, že se chystáte aktivovat skupinu písem. Teď je čas na zrušení této akce, pokud jste tedy její provedení neměl v úmyslu You are about to deactivate a bunch of fonts, it is time to cancel if it was not your intent Vypadá to, že se chystáte deaktivovat skupinu písem. Teď je čas na zrušení této akce, pokud jste tedy její provedení neměl v úmyslu Can’t import this font because it’s broken : Toto písmo nelze zavést, protože je poškozeno: Choose the tag for filter exported fonts Vybrat značku pro filtrování exportovaných písem Choose Directory Vybrat adresář Export &Fonts Exportovat &písma Export a fontset Exportovat soubor písem Check Database Zkontrolovat databázi Tag All... Označit vše... Load settings Nahrát nastavení Check for Fontmatrix own dir Zkontrolovat vlastní adresář Fontmatrixu Loading Nahrává se fonts present in database Písma přítomná v databázi Catching Zachycení font descriptions from network Popisy písem ze sítě Collected System Font Shromážděná systémová písma Adding Přidává se fonts from system directories Písma ze systémových adresářů fonts available from system Písma dostupná ze systému font descriptions imported from network Popisy písem zavedené ze sítě Browse Fonts Procházet písma Show/hide fonts browsing sidebar Zobrazí/schová boční panel k procházení písem Tags Značky Show/hide tags list sidebar Zobrazí/schová boční panel se značkami Fontmatrix Help Nápověda Fontmatrix default Výchozí "default" is a reserved "Výchozí" je zamluveno Fonts imported: %1 Zavedená písma: %1 Cannot import this font because it is broken: Nemohu načíst toto písmo, protože je poškozené: Fontmatrix Tags Značky Fontmatrixu &Sync &Synchronizovat Sync with the DB file Synchronizuje s databází Export &fonts Exportovat &písmo Print Info... Vytisknout informace... Print informations about the current font Vytisknout informace o nynějším písmu Print Sample... Vytisknout ukázku... Print the sample as a specimen Vytisknout ukázku jako vzorový exemplář Print Chart... Vytisknout tabulku... Print a chart of the current font Vytisknout tabulku nynějšího písma Print Playground... Vytisknout hřiště... Print the playground Vytisknout oblíbené místo Print Family... Vytisknout rodinu písem... Print a specimen of the whole family the current face belongs to Vytisknout ukázku celé rodiny písem, ke které náleží nynější její část Export a PDF document that shows selected fonts Vytvoří dokument PDF se vzorky vybraných písem Export font info for packaging... Export informací o písmu pro balíčky... Fill a template file with metadata for packaging currently selected font to a Linux distribution Vyplní šablonu, určenou pro linuxový balíček, metadaty vybraného písma Show information about Fontmatrix Zobrazí informace o Fontmatrixu About &Qt O &Qt Show information about Qt Zobrazí informace o Qt F1 F1 Read documentation on Fontmatrix Číst nápovědu k Fontmatrixu Activate all currently visible fonts Aktivuje všechna nyní viditelná písma Deactivate all currently visible fonts Deaktivuje všechna nyní viditelná písma Edit currently selected font in a font editor of your choice Upraví vybrané písmo v editoru, který jste si zvolili You don't seem to have a font editor installed. Path to font editor can be set in Preferences dialog. Zdá se, že nemáte nainstalovaný editor písma. Cestu k editoru můžete zadat v dialogu Volby. Reload Filtered Znovu načíst filtrované Reload informations for filtered fonts from the font files they belong to Znovu načte informace o filtrovaných písmech z jejich souborů Reload Selected Znovu načíst vybrané Reload informations for selected font from the font file Znovu načte informace o vybraném písmu z jeho souboru Setup Fontmatrix Nastavit Fontmatrix Check Fontmatrix database for dead links to font files Zkontroluje databázi Fontmatrixu na mrtvé odkazy na soubory písem Tag All Filtered... Označit vše filtrované... Tag all currently visible files Přidá značku všem nyní viditelným písmům Show TrueType tables Zobrazit tabulky TrueType View hexadecimal values of TrueType tables for currently selected font file Zobrazí šestnáctkové hodnoty tabulek TrueType vybraných písem Edit PANOSE metadata Upravit metadata PANOSE Edit PANOSE metadata without saving changes to font files Upraví metadata PANOSE, ale bez ukládání změn do souborů písem Next Family Další rodina písem Switch to the next font family in the list Přejde na další rodinu písem v seznamu Next Face Další část Switch to the next font face in the list Přejde na další řez písma v seznamu Previous Family Předchozí rodina písem Switch to the previous font family in the list Přejde na předchozí rodinu písma v seznamu Previous Face Předchozí část Not enough text to make a sample Na tvorbu vzorku je málo textu Close Zavřít Failed to reload %n fonts Selhalo opakované načtení jednoho písma Selhalo opakované načtení dvou písem Selhalo opakované načtení %n písem Python scripts (*.py) Skripty pythonu (*.py) Filtered Font(s): %n number of filtererd fonts showed in status bar Jedno filtrované písmo Dvě filtrovaná písma %n filtrovaných písem Current Font: followed by currently selected font name (in status bar) Současné písmo: Layout Options Volby rozvržení Print Vytisknout &Edit &Upravovat &Browse &Procházet Fontmatrix - data warning Fontmatrix - Varování týkající se dat Your database has not been loaded because of a version mismatch. It is not a problem, you just lost fonts references, tags & sample texts. If you badly need to keep these datas, do not quit Fontmatrix before you have copied the database*. At this point and with a minimum of XML skill, you should be able to get old database into new format. *database is Vaše databáze nemohla být nahrána z důvodu nesouladu mezi verzemi. Není to problém, pouze jste ztratil volby pro písma, značky & texty s ukázkami. Pokud opravdu potřebujete tato data, neukončujte Fontmatrix pře zkopírováním databáze*. V tomto bodě a s minimem znalostí formátu XML, byste měl být schopen dostat starou databázi do nového formátu. *databáze je Unicode Unicode All fields Všechna pole Welcome maessage Sdělení na uvítanou Print Infos Vytisknout informace Print Sample Tisk vzorku Print Chart Vytisknout tabulku Print Playground Vytisknout oblíbené místo Print Family Vytisknout rodinu písem fontmatrix-0.6.0+svn20110930/src/messages/welcome_sr.html0000644000175000017500000000274211035172507021761 0ustar malexmalex Welcome to Fontmatrix
##WELCOME_FONT##
Fontmatrix is a user-friendly font manager for linux. Our aim is to offer a clear and user friendly interface, while making it very simple to learn and use.
Fontmatrix has some unique functionalities in the Open Source world :
Activate, deactivate fonts to reduce font lists and save resources
Allow to tag font for a better classification and group (de)activation
Make it easy to find particular glyph thanks to a glyph category display
Create a font book that can be printed to have a real overview of the fonts available
Display advanced OpenType features
Can import fonts stored in remote directories, for example when they are shared in an enterprise or a network.
We hope you'll enjoy using Fontmatrix.
fontmatrix-0.6.0+svn20110930/src/fmvariants.cpp0000644000175000017500000001222411446420470020000 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "fmvariants.h" #include "fontitem.h" FMVariants * FMVariants::instance = 0; FMVariants::FMVariants() { // init sorted variant names variants.clear(); QStringList weight; weight << QString("Hairline") << QString("Thin") << QString("UltraLight") << QString("ExtraLight") << QString("Light") << QString("Book") << QString("Normal") << QString("Regular") << QString("Roman") << QString("Plain") << QString("Medium") << QString() << QString("Demi") << QString("DemiBold") << QString("SemiBold") << QString("Bold") << QString("ExtraBold") << QString("Extra") << QString("Heavy") << QString("Black") << QString("ExtraBlack") << QString("UltraBlack") << QString("Ultra"); QStringList slope; slope << QString() << QString("Italic") << QString("Oblique") << QString("Slanted"); QStringList width; width << QString() << QString("UltraCompressed") << QString("Compressed") << QString("UltraCondensed") << QString("Condensed") << QString("SemiCondensed") << QString("Narrow") << QString("SemiExtended") << QString("SemiExpanded") << QString("Extended") << QString("Expanded") << QString("ExtraExtended") << QString("ExtraExpanded"); QStringList optical; optical << QString() << QString("Poster") << QString("Display") << QString("SubHead") << QString("SmallText") << QString("Caption"); foreach(const QString& w, weight) { foreach(const QString& s, slope) { foreach(const QString& wi, width) { foreach(const QString& o, optical) { appendVariants(w, s, wi, o); } } } } // foreach(const QStringList& v, variants) // qDebug()< FMVariants::Order(QList ul) { if(instance == 0) instance = new FMVariants; FMVariants *vs(instance); QList ret; QMap fl; foreach(FontItem* f, ul) { fl.insert(f, f->variant().split(QString(" "))); } foreach(const QStringList& v, vs->variants) { foreach(FontItem* f, fl.keys()) { if(vs->compareVariants(v,fl[f])) { ret.append(f); fl.remove(f); } } } if(fl.count() > 0) { // for Univers-like fonts, we get the number key QMap > ulikeFonts; bool intOK(false); foreach(FontItem* f, fl.keys()) { intOK = false; QString fs(fl[f].first()); int idx(fs.toInt(&intOK, 10)); if(intOK) { ulikeFonts[idx][f->variant()] = f; fl.remove(f); } } foreach(int k, ulikeFonts.keys()) { foreach(const QString& v, ulikeFonts[k].keys()) ret << ulikeFonts[k][v]; } // still fonts unsorted; if(fl.count() > 0) { QMap lastChance; foreach(FontItem* f, fl.keys()) { lastChance[f->variant()] = f; } foreach(const QString& v, lastChance.keys()) ret << lastChance[v]; } } return ret; } FontItem * FMVariants::Preferred(QList ul) { if(ul.isEmpty()) return 0; if(instance == 0) instance = new FMVariants; foreach(FontItem* it, ul) { if(instance->priorList.contains(it->variant(), Qt::CaseInsensitive)) { return it; } } return ul.first(); } fontmatrix-0.6.0+svn20110930/src/about.ui0000644000175000017500000001307311217731442016576 0ustar malexmalex About 0 0 470 405 0 0 About Fontmatrix :/fontmatrix_icon.png:/fontmatrix_icon.png 0 Splash :/fontmatrix_splash.png true 75 true TextLabel Qt::AlignCenter Qt::Horizontal 121 20 9 TextLabel Qt::AlignCenter The Project 0 0 Qt::NoFocus false QFrame::Panel QFrame::Plain true The People 0 0 Qt::NoFocus false QFrame::Panel QFrame::Plain true Qt::Horizontal 361 20 Close closeButton clicked() About close() 610 571 488 587 fontmatrix-0.6.0+svn20110930/src/filtermeta.h0000644000175000017500000000325411420017003017414 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FILTERMETA_H #define FILTERMETA_H #include "filterdata.h" #define FILTER_FIELD_SPECIAL_UNICODE 2001 class FilterMeta : public FilterData { public: FilterMeta(); enum TagIndex{ Field = FilterData::UserIndex, Value }; QString type() const; void operate(); }; #endif // FILTERMETA_H fontmatrix-0.6.0+svn20110930/src/fmfontextractorbase.h0000644000175000017500000000274311156713117021361 0ustar malexmalex// // C++ Interface: fmfontextractorbase // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMFONTEXTRACTORBASE_H #define FMFONTEXTRACTORBASE_H #include #include #include class FMFontExtractorBase { public: FMFontExtractorBase(){} virtual ~FMFontExtractorBase(){} /** * Indicate on which the extractor must operate * @param filePath file path of the resources container * @return false if it failed to load the file */ virtual bool loadFile(const QString& filePath) = 0; /** * Expose which extensions an implementation can handle * @return a list of file suffixes */ virtual QStringList extensions() = 0; /** * Extract names of resources contained in the file to be extracted * @return a list of names (identifiers) */ virtual QStringList list() = 0; /** * Indicates type of resource * @param name an identifier as returned by list() * @return a suffix reflecting the type of the font */ virtual QString fontType ( const QString& name ) = 0; /** * Write one of the font to a device * @param name an identifier as returned by list() * @param openedDevice an opened QIODevice * @return result of write operation */ virtual bool write ( const QString& name, QIODevice * openedDevice ) = 0; }; #endif // FMFONTEXTRACTORBASE_H fontmatrix-0.6.0+svn20110930/src/langs/0000755000175000017500000000000011641435631016227 5ustar malexmalexfontmatrix-0.6.0+svn20110930/src/langs/deva.dict0000644000175000017500000000420511004340731020001 0ustar malexmalex% Dict file generated by dodict for "deva", please edit it. % Records are of the form : FFFF|prop1|prop2 % Where FFFF is a raw hex value representing a code point in Unicode space % and "props" are arbitrary ascii strings. % Records begining by "%" are comments. % Space, hey it’s not idiot ;-) 0020|X % BTW, because they’re "out of range", ZW* were not imported from FLT file % ZWNJ 200C|ZWNJ % ZWJ 200D|ZWJ % ऀ 0900|X|Z % ँ 0901|X|A % ं 0902|X|A % ः 0903|X|a % ऄ 0904|X|V % अ 0905|X|V % आ 0906|X|V % इ 0907|X|V % ई 0908|X|V % उ 0909|X|V % ऊ 090a|X|V % ऋ 090b|X|V % ऌ 090c|X|V % ऍ 090d|X|V % ऎ 090e|X|V % ए 090f|X|V % ऐ 0910|X|V % ऑ 0911|X|V % ऒ 0912|X|V % ओ 0913|X|V % औ 0914|X|V % क 0915|X|C % ख 0916|X|C % ग 0917|X|C % घ 0918|X|C % ङ 0919|X|C % च 091a|X|C % छ 091b|X|C % ज 091c|X|C % झ 091d|X|C % ञ 091e|X|C % ट 091f|X|C % ठ 0920|X|C % ड 0921|X|C % ढ 0922|X|C % ण 0923|X|C % त 0924|X|C % थ 0925|X|C % द 0926|X|C % ध 0927|X|C % न 0928|X|C % ऩ 0929|X|C % प 092a|X|C % फ 092b|X|C % ब 092c|X|C % भ 092d|X|C % म 092e|X|C % य 092f|X|C % र 0930|X|R % ऱ 0931|X|RR % ल 0932|X|C % ळ 0933|X|C % ऴ 0934|X|C % व 0935|X|C % श 0936|X|C % ष 0937|X|C % स 0938|X|C % ह 0939|X|C % ऺ 093a|X % ऻ 093b|X % ़ 093c|X|Nukta % ऽ 093d|X % ा 093e|X|p % ि 093f|X|m % ी 0940|X|p % ु 0941|X|b % ू 0942|X|b % ृ 0943|X|b % ॄ 0944|X|b % ॅ 0945|X|u % ॆ 0946|X|u % े 0947|X|u % ै 0948|X|u % ॉ 0949|X|p % ॊ 094a|X|p % ो 094b|X|p % ौ 094c|X|p % ् 094d|H % ॎ 094e|X % ॏ 094f|X % ॐ 0950|X % ॑ 0951|X|S % ॒ 0952|X|s % ॓ 0953|X|S % ॔ 0954|X|S % ॕ 0955|X % ॖ 0956|X % ॗ 0957|X % क़ 0958|X|N % ख़ 0959|X|N % ग़ 095a|X|N % ज़ 095b|X|N % ड़ 095c|X|N % ढ़ 095d|X|N % फ़ 095e|X|N % य़ 095f|X|N % ॠ 0960|X|V % ॡ 0961|X|V % ॢ 0962|X|b % ॣ 0963|X|b % । 0964|X % ॥ 0965|X % ० 0966|X % १ 0967|X % २ 0968|X % ३ 0969|X % ४ 096a|X % ५ 096b|X % ६ 096c|X % ७ 096d|X % ८ 096e|X % ९ 096f|X % ॰ 0970|X fontmatrix-0.6.0+svn20110930/src/langs/latn.dict0000644000175000017500000000523311176003214020024 0ustar malexmalex% Dict file generated by dodict for "latn", please edit it. % Records are of the form : FFFF|prop1|prop2 % Where FFFF is a raw hex value representing a code point in Unicode space % and "props" are arbitrary ascii strings. % Records begining by "%" are comments. % 0020|SPACE % ! 0021|X|PUNCT % " 0022|X % # 0023|X % $ 0024|X % % 0025|X % & 0026|X % ' 0027|X % ( 0028|X % ) 0029|X % * 002a|X % + 002b|X % , 002c|X|PUNCT % - 002d|X % . 002e|X|PUNCT % / 002f|X % 0 0030|X % 1 0031|X % 2 0032|X % 3 0033|X % 4 0034|X % 5 0035|X % 6 0036|X % 7 0037|X % 8 0038|X % 9 0039|X % : 003a|X|PUNCT % ; 003b|X|PUNCT % < 003c|X % = 003d|X % > 003e|X % ? 003f|X|PUNCT % @ 0040|X % A 0041|X % B 0042|X % C 0043|X % D 0044|X % E 0045|X % F 0046|X % G 0047|X % H 0048|X % I 0049|X % J 004a|X % K 004b|X % L 004c|X % M 004d|X % N 004e|X % O 004f|X % P 0050|X % Q 0051|X % R 0052|X % S 0053|X % T 0054|X % U 0055|X % V 0056|X % W 0057|X % X 0058|X % Y 0059|X % Z 005a|X % [ 005b|X % \ 005c|X % ] 005d|X % ^ 005e|X % _ 005f|X % ` 0060|X % a 0061|X % b 0062|X % c 0063|X % d 0064|X % e 0065|X % f 0066|X % g 0067|X % h 0068|X % i 0069|X % j 006a|X % k 006b|X % l 006c|X % m 006d|X % n 006e|X % o 006f|X % p 0070|X % q 0071|X % r 0072|X % s 0073|X % t 0074|X % u 0075|X % v 0076|X % w 0077|X % x 0078|X % y 0079|X % z 007a|X % { 007b|X % | 007c|X % } 007d|X % ~ 007e|X %   00a0|X % ¡ 00a1|X|PUNCT % ¢ 00a2|X % £ 00a3|X % ¤ 00a4|X % ¥ 00a5|X % ¦ 00a6|X % § 00a7|X % ¨ 00a8|X % © 00a9|X % ª 00aa|X % « 00ab|X % ¬ 00ac|X % ­ 00ad|X % ® 00ae|X % ¯ 00af|X % ° 00b0|X % ± 00b1|X % ² 00b2|X % ³ 00b3|X % ´ 00b4|X % µ 00b5|X % ¶ 00b6|X % · 00b7|X % ¸ 00b8|X % ¹ 00b9|X % º 00ba|X % » 00bb|X % ¼ 00bc|X % ½ 00bd|X % ¾ 00be|X % ¿ 00bf|X|PUNCT % À 00c0|X % Á 00c1|X % Â 00c2|X % Ã 00c3|X % Ä 00c4|X % Å 00c5|X % Æ 00c6|X % Ç 00c7|X % È 00c8|X % É 00c9|X % Ê 00ca|X % Ë 00cb|X % Ì 00cc|X % Í 00cd|X % Î 00ce|X % Ï 00cf|X % Ð 00d0|X % Ñ 00d1|X % Ò 00d2|X % Ó 00d3|X % Ô 00d4|X % Õ 00d5|X % Ö 00d6|X % × 00d7|X % Ø 00d8|X % Ù 00d9|X % Ú 00da|X % Û 00db|X % Ü 00dc|X % Ý 00dd|X % Þ 00de|X % ß 00df|X % à 00e0|X % á 00e1|X % â 00e2|X % ã 00e3|X % ä 00e4|X % å 00e5|X % æ 00e6|X % ç 00e7|X % è 00e8|X % é 00e9|X % ê 00ea|X % ë 00eb|X % ì 00ec|X % í 00ed|X % î 00ee|X % ï 00ef|X % ð 00f0|X % ñ 00f1|X % ò 00f2|X % ó 00f3|X % ô 00f4|X % õ 00f5|X % ö 00f6|X % ÷ 00f7|X % ø 00f8|X % ù 00f9|X % ú 00fa|X % û 00fb|X % ü 00fc|X % ý 00fd|X % þ 00fe|X % ÿ 00ff|X % Ā 0100|X fontmatrix-0.6.0+svn20110930/src/langs/unicode/0000755000175000017500000000000011641435631017655 5ustar malexmalexfontmatrix-0.6.0+svn20110930/src/langs/unicode/uniblocks.cxx0000644000175000017500000002532211220170637022371 0ustar malexmalexp[ bKey( 0x0000 , 0x007F) ] = QObject::tr("Basic Latin") ; p[ bKey( 0x0080 , 0x00FF) ] = QObject::tr("Latin-1 Supplement") ; p[ bKey( 0x0100 , 0x017F) ] = QObject::tr("Latin Extended-A") ; p[ bKey( 0x0180 , 0x024F) ] = QObject::tr("Latin Extended-B") ; p[ bKey( 0x0250 , 0x02AF) ] = QObject::tr("IPA Extensions") ; p[ bKey( 0x02B0 , 0x02FF) ] = QObject::tr("Spacing Modifier Letters") ; p[ bKey( 0x0300 , 0x036F) ] = QObject::tr("Combining Diacritical Marks") ; p[ bKey( 0x0370 , 0x03FF) ] = QObject::tr("Greek and Coptic") ; p[ bKey( 0x0400 , 0x04FF) ] = QObject::tr("Cyrillic") ; p[ bKey( 0x0500 , 0x052F) ] = QObject::tr("Cyrillic Supplement") ; p[ bKey( 0x0530 , 0x058F) ] = QObject::tr("Armenian") ; p[ bKey( 0x0590 , 0x05FF) ] = QObject::tr("Hebrew") ; p[ bKey( 0x0600 , 0x06FF) ] = QObject::tr("Arabic") ; p[ bKey( 0x0700 , 0x074F) ] = QObject::tr("Syriac") ; p[ bKey( 0x0750 , 0x077F) ] = QObject::tr("Arabic Supplement") ; p[ bKey( 0x0780 , 0x07BF) ] = QObject::tr("Thaana") ; p[ bKey( 0x07C0 , 0x07FF) ] = QObject::tr("NKo") ; p[ bKey( 0x0900 , 0x097F) ] = QObject::tr("Devanagari") ; p[ bKey( 0x0980 , 0x09FF) ] = QObject::tr("Bengali") ; p[ bKey( 0x0A00 , 0x0A7F) ] = QObject::tr("Gurmukhi") ; p[ bKey( 0x0A80 , 0x0AFF) ] = QObject::tr("Gujarati") ; p[ bKey( 0x0B00 , 0x0B7F) ] = QObject::tr("Oriya") ; p[ bKey( 0x0B80 , 0x0BFF) ] = QObject::tr("Tamil") ; p[ bKey( 0x0C00 , 0x0C7F) ] = QObject::tr("Telugu") ; p[ bKey( 0x0C80 , 0x0CFF) ] = QObject::tr("Kannada") ; p[ bKey( 0x0D00 , 0x0D7F) ] = QObject::tr("Malayalam") ; p[ bKey( 0x0D80 , 0x0DFF) ] = QObject::tr("Sinhala") ; p[ bKey( 0x0E00 , 0x0E7F) ] = QObject::tr("Thai") ; p[ bKey( 0x0E80 , 0x0EFF) ] = QObject::tr("Lao") ; p[ bKey( 0x0F00 , 0x0FFF) ] = QObject::tr("Tibetan") ; p[ bKey( 0x1000 , 0x109F) ] = QObject::tr("Myanmar") ; p[ bKey( 0x10A0 , 0x10FF) ] = QObject::tr("Georgian") ; p[ bKey( 0x1100 , 0x11FF) ] = QObject::tr("Hangul Jamo") ; p[ bKey( 0x1200 , 0x137F) ] = QObject::tr("Ethiopic") ; p[ bKey( 0x1380 , 0x139F) ] = QObject::tr("Ethiopic Supplement") ; p[ bKey( 0x13A0 , 0x13FF) ] = QObject::tr("Cherokee") ; p[ bKey( 0x1400 , 0x167F) ] = QObject::tr("Unified Canadian Aboriginal Syllabics") ; p[ bKey( 0x1680 , 0x169F) ] = QObject::tr("Ogham") ; p[ bKey( 0x16A0 , 0x16FF) ] = QObject::tr("Runic") ; p[ bKey( 0x1700 , 0x171F) ] = QObject::tr("Tagalog") ; p[ bKey( 0x1720 , 0x173F) ] = QObject::tr("Hanunoo") ; p[ bKey( 0x1740 , 0x175F) ] = QObject::tr("Buhid") ; p[ bKey( 0x1760 , 0x177F) ] = QObject::tr("Tagbanwa") ; p[ bKey( 0x1780 , 0x17FF) ] = QObject::tr("Khmer") ; p[ bKey( 0x1800 , 0x18AF) ] = QObject::tr("Mongolian") ; p[ bKey( 0x1900 , 0x194F) ] = QObject::tr("Limbu") ; p[ bKey( 0x1950 , 0x197F) ] = QObject::tr("Tai Le") ; p[ bKey( 0x1980 , 0x19DF) ] = QObject::tr("New Tai Lue") ; p[ bKey( 0x19E0 , 0x19FF) ] = QObject::tr("Khmer Symbols") ; p[ bKey( 0x1A00 , 0x1A1F) ] = QObject::tr("Buginese") ; p[ bKey( 0x1B00 , 0x1B7F) ] = QObject::tr("Balinese") ; p[ bKey( 0x1B80 , 0x1BBF) ] = QObject::tr("Sundanese") ; p[ bKey( 0x1C00 , 0x1C4F) ] = QObject::tr("Lepcha") ; p[ bKey( 0x1C50 , 0x1C7F) ] = QObject::tr("Ol Chiki") ; p[ bKey( 0x1D00 , 0x1D7F) ] = QObject::tr("Phonetic Extensions") ; p[ bKey( 0x1D80 , 0x1DBF) ] = QObject::tr("Phonetic Extensions Supplement") ; p[ bKey( 0x1DC0 , 0x1DFF) ] = QObject::tr("Combining Diacritical Marks Supplement") ; p[ bKey( 0x1E00 , 0x1EFF) ] = QObject::tr("Latin Extended Additional") ; p[ bKey( 0x1F00 , 0x1FFF) ] = QObject::tr("Greek Extended") ; p[ bKey( 0x2000 , 0x206F) ] = QObject::tr("General Punctuation") ; p[ bKey( 0x2070 , 0x209F) ] = QObject::tr("Superscripts and Subscripts") ; p[ bKey( 0x20A0 , 0x20CF) ] = QObject::tr("Currency Symbols") ; p[ bKey( 0x20D0 , 0x20FF) ] = QObject::tr("Combining Diacritical Marks for Symbols") ; p[ bKey( 0x2100 , 0x214F) ] = QObject::tr("Letterlike Symbols") ; p[ bKey( 0x2150 , 0x218F) ] = QObject::tr("Number Forms") ; p[ bKey( 0x2190 , 0x21FF) ] = QObject::tr("Arrows") ; p[ bKey( 0x2200 , 0x22FF) ] = QObject::tr("Mathematical Operators") ; p[ bKey( 0x2300 , 0x23FF) ] = QObject::tr("Miscellaneous Technical") ; p[ bKey( 0x2400 , 0x243F) ] = QObject::tr("Control Pictures") ; p[ bKey( 0x2440 , 0x245F) ] = QObject::tr("Optical Character Recognition") ; p[ bKey( 0x2460 , 0x24FF) ] = QObject::tr("Enclosed Alphanumerics") ; p[ bKey( 0x2500 , 0x257F) ] = QObject::tr("Box Drawing") ; p[ bKey( 0x2580 , 0x259F) ] = QObject::tr("Block Elements") ; p[ bKey( 0x25A0 , 0x25FF) ] = QObject::tr("Geometric Shapes") ; p[ bKey( 0x2600 , 0x26FF) ] = QObject::tr("Miscellaneous Symbols") ; p[ bKey( 0x2700 , 0x27BF) ] = QObject::tr("Dingbats") ; p[ bKey( 0x27C0 , 0x27EF) ] = QObject::tr("Miscellaneous Mathematical Symbols-A") ; p[ bKey( 0x27F0 , 0x27FF) ] = QObject::tr("Supplemental Arrows-A") ; p[ bKey( 0x2800 , 0x28FF) ] = QObject::tr("Braille Patterns") ; p[ bKey( 0x2900 , 0x297F) ] = QObject::tr("Supplemental Arrows-B") ; p[ bKey( 0x2980 , 0x29FF) ] = QObject::tr("Miscellaneous Mathematical Symbols-B") ; p[ bKey( 0x2A00 , 0x2AFF) ] = QObject::tr("Supplemental Mathematical Operators") ; p[ bKey( 0x2B00 , 0x2BFF) ] = QObject::tr("Miscellaneous Symbols and Arrows") ; p[ bKey( 0x2C00 , 0x2C5F) ] = QObject::tr("Glagolitic") ; p[ bKey( 0x2C60 , 0x2C7F) ] = QObject::tr("Latin Extended-C") ; p[ bKey( 0x2C80 , 0x2CFF) ] = QObject::tr("Coptic") ; p[ bKey( 0x2D00 , 0x2D2F) ] = QObject::tr("Georgian Supplement") ; p[ bKey( 0x2D30 , 0x2D7F) ] = QObject::tr("Tifinagh") ; p[ bKey( 0x2D80 , 0x2DDF) ] = QObject::tr("Ethiopic Extended") ; p[ bKey( 0x2DE0 , 0x2DFF) ] = QObject::tr("Cyrillic Extended-A") ; p[ bKey( 0x2E00 , 0x2E7F) ] = QObject::tr("Supplemental Punctuation") ; p[ bKey( 0x2E80 , 0x2EFF) ] = QObject::tr("CJK Radicals Supplement") ; p[ bKey( 0x2F00 , 0x2FDF) ] = QObject::tr("Kangxi Radicals") ; p[ bKey( 0x2FF0 , 0x2FFF) ] = QObject::tr("Ideographic Description Characters") ; p[ bKey( 0x3000 , 0x303F) ] = QObject::tr("CJK Symbols and Punctuation") ; p[ bKey( 0x3040 , 0x309F) ] = QObject::tr("Hiragana") ; p[ bKey( 0x30A0 , 0x30FF) ] = QObject::tr("Katakana") ; p[ bKey( 0x3100 , 0x312F) ] = QObject::tr("Bopomofo") ; p[ bKey( 0x3130 , 0x318F) ] = QObject::tr("Hangul Compatibility Jamo") ; p[ bKey( 0x3190 , 0x319F) ] = QObject::tr("Kanbun") ; p[ bKey( 0x31A0 , 0x31BF) ] = QObject::tr("Bopomofo Extended") ; p[ bKey( 0x31C0 , 0x31EF) ] = QObject::tr("CJK Strokes") ; p[ bKey( 0x31F0 , 0x31FF) ] = QObject::tr("Katakana Phonetic Extensions") ; p[ bKey( 0x3200 , 0x32FF) ] = QObject::tr("Enclosed CJK Letters and Months") ; p[ bKey( 0x3300 , 0x33FF) ] = QObject::tr("CJK Compatibility") ; p[ bKey( 0x3400 , 0x4DBF) ] = QObject::tr("CJK Unified Ideographs Extension A") ; p[ bKey( 0x4DC0 , 0x4DFF) ] = QObject::tr("Yijing Hexagram Symbols") ; p[ bKey( 0x4E00 , 0x9FFF) ] = QObject::tr("CJK Unified Ideographs") ; p[ bKey( 0xA000 , 0xA48F) ] = QObject::tr("Yi Syllables") ; p[ bKey( 0xA490 , 0xA4CF) ] = QObject::tr("Yi Radicals") ; p[ bKey( 0xA500 , 0xA63F) ] = QObject::tr("Vai") ; p[ bKey( 0xA640 , 0xA69F) ] = QObject::tr("Cyrillic Extended-B") ; p[ bKey( 0xA700 , 0xA71F) ] = QObject::tr("Modifier Tone Letters") ; p[ bKey( 0xA720 , 0xA7FF) ] = QObject::tr("Latin Extended-D") ; p[ bKey( 0xA800 , 0xA82F) ] = QObject::tr("Syloti Nagri") ; p[ bKey( 0xA840 , 0xA87F) ] = QObject::tr("Phags-pa") ; p[ bKey( 0xA880 , 0xA8DF) ] = QObject::tr("Saurashtra") ; p[ bKey( 0xA900 , 0xA92F) ] = QObject::tr("Kayah Li") ; p[ bKey( 0xA930 , 0xA95F) ] = QObject::tr("Rejang") ; p[ bKey( 0xAA00 , 0xAA5F) ] = QObject::tr("Cham") ; p[ bKey( 0xAC00 , 0xD7AF) ] = QObject::tr("Hangul Syllables") ; p[ bKey( 0xD800 , 0xDB7F) ] = QObject::tr("High Surrogates") ; p[ bKey( 0xDB80 , 0xDBFF) ] = QObject::tr("High Private Use Surrogates") ; p[ bKey( 0xDC00 , 0xDFFF) ] = QObject::tr("Low Surrogates") ; p[ bKey( 0xE000 , 0xF8FF) ] = QObject::tr("Private Use Area") ; p[ bKey( 0xF900 , 0xFAFF) ] = QObject::tr("CJK Compatibility Ideographs") ; p[ bKey( 0xFB00 , 0xFB4F) ] = QObject::tr("Alphabetic Presentation Forms") ; p[ bKey( 0xFB50 , 0xFDFF) ] = QObject::tr("Arabic Presentation Forms-A") ; p[ bKey( 0xFE00 , 0xFE0F) ] = QObject::tr("Variation Selectors") ; p[ bKey( 0xFE10 , 0xFE1F) ] = QObject::tr("Vertical Forms") ; p[ bKey( 0xFE20 , 0xFE2F) ] = QObject::tr("Combining Half Marks") ; p[ bKey( 0xFE30 , 0xFE4F) ] = QObject::tr("CJK Compatibility Forms") ; p[ bKey( 0xFE50 , 0xFE6F) ] = QObject::tr("Small Form Variants") ; p[ bKey( 0xFE70 , 0xFEFF) ] = QObject::tr("Arabic Presentation Forms-B") ; p[ bKey( 0xFF00 , 0xFFEF) ] = QObject::tr("Halfwidth and Fullwidth Forms") ; p[ bKey( 0xFFF0 , 0xFFFF) ] = QObject::tr("Specials") ; p[ bKey( 0x10000 , 0x1007F) ] = QObject::tr("Linear B Syllabary") ; p[ bKey( 0x10080 , 0x100FF) ] = QObject::tr("Linear B Ideograms") ; p[ bKey( 0x10100 , 0x1013F) ] = QObject::tr("Aegean Numbers") ; p[ bKey( 0x10140 , 0x1018F) ] = QObject::tr("Ancient Greek Numbers") ; p[ bKey( 0x10190 , 0x101CF) ] = QObject::tr("Ancient Symbols") ; p[ bKey( 0x101D0 , 0x101FF) ] = QObject::tr("Phaistos Disc") ; p[ bKey( 0x10280 , 0x1029F) ] = QObject::tr("Lycian") ; p[ bKey( 0x102A0 , 0x102DF) ] = QObject::tr("Carian") ; p[ bKey( 0x10300 , 0x1032F) ] = QObject::tr("Old Italic") ; p[ bKey( 0x10330 , 0x1034F) ] = QObject::tr("Gothic") ; p[ bKey( 0x10380 , 0x1039F) ] = QObject::tr("Ugaritic") ; p[ bKey( 0x103A0 , 0x103DF) ] = QObject::tr("Old Persian") ; p[ bKey( 0x10400 , 0x1044F) ] = QObject::tr("Deseret") ; p[ bKey( 0x10450 , 0x1047F) ] = QObject::tr("Shavian") ; p[ bKey( 0x10480 , 0x104AF) ] = QObject::tr("Osmanya") ; p[ bKey( 0x10800 , 0x1083F) ] = QObject::tr("Cypriot Syllabary") ; p[ bKey( 0x10900 , 0x1091F) ] = QObject::tr("Phoenician") ; p[ bKey( 0x10920 , 0x1093F) ] = QObject::tr("Lydian") ; p[ bKey( 0x10A00 , 0x10A5F) ] = QObject::tr("Kharoshthi") ; p[ bKey( 0x12000 , 0x123FF) ] = QObject::tr("Cuneiform") ; p[ bKey( 0x12400 , 0x1247F) ] = QObject::tr("Cuneiform Numbers and Punctuation") ; p[ bKey( 0x1D000 , 0x1D0FF) ] = QObject::tr("Byzantine Musical Symbols") ; p[ bKey( 0x1D100 , 0x1D1FF) ] = QObject::tr("Musical Symbols") ; p[ bKey( 0x1D200 , 0x1D24F) ] = QObject::tr("Ancient Greek Musical Notation") ; p[ bKey( 0x1D300 , 0x1D35F) ] = QObject::tr("Tai Xuan Jing Symbols") ; p[ bKey( 0x1D360 , 0x1D37F) ] = QObject::tr("Counting Rod Numerals") ; p[ bKey( 0x1D400 , 0x1D7FF) ] = QObject::tr("Mathematical Alphanumeric Symbols") ; p[ bKey( 0x1F000 , 0x1F02F) ] = QObject::tr("Mahjong Tiles") ; p[ bKey( 0x1F030 , 0x1F09F) ] = QObject::tr("Domino Tiles") ; p[ bKey( 0x20000 , 0x2A6DF) ] = QObject::tr("CJK Unified Ideographs Extension B") ; p[ bKey( 0x2F800 , 0x2FA1F) ] = QObject::tr("CJK Compatibility Ideographs Supplement") ; p[ bKey( 0xE0000 , 0xE007F) ] = QObject::tr("Tags") ; p[ bKey( 0xE0100 , 0xE01EF) ] = QObject::tr("Variation Selectors Supplement") ; p[ bKey( 0xF0000 , 0xFFFFF) ] = QObject::tr("Supplementary Private Use Area-A") ; p[ bKey( 0x100000 , 0x10FFFF) ] = QObject::tr("Supplementary Private Use Area-B") ; fontmatrix-0.6.0+svn20110930/src/langs/unicode/Blocks-fr.txt0000644000175000017500000001263711221733502022241 0ustar malexmalex# Version Française des intervalles Unicode 0000..007F; Latin de base 0080..00FF; supplément Latin - 1 0100..017F; Latin étendu - A 0180..024F; Latin étendu - B 0250..02AF; alphabet phonétique international (API) 02B0..02FF; lettres modificatives avec chasse 0300..036F; diacritiques 0370..03FF; Grec et Copte 0400..04FF; Cyrillique 0500..052F; suppléments au Cyrillique 0530..058F; Arménien 0590..05FF; Hébreu 0600..06FF; Arabe 0700..074F; Syriaque 0750..077F; supplément à l’Arabe 0780..07BF; Thâna 07C0..07FF; N’ko 0900..097F; Dévanâgarî 0980..09FF; Bengali 0A00..0A7F; Gourmoukhî 0A80..0AFF; Goudjerate 0B00..0B7F; Oriya 0B80..0BFF; Tamoul 0C00..0C7F; Télougou 0C80..0CFF; Kannara 0D00..0D7F; Malayalam 0D80..0DFF; Singhalais 0E00..0E7F; Thaï 0E80..0EFF; Lao 0F00..0FFF; Tibétain 1000..109F; Birman 10A0..10FF; Géorgien 1100..11FF; Jamos Hangûl 1200..137F; Éthiopien 1380..139F; supplément à l’Éthiopien 13A0..13FF; Chérokî 1400..167F; syllabaires autochtones canadiens unifiés 1680..169F; Ogam 16A0..16FF; Runes 1700..171F; Tagalog 1720..173F; Hanounó 1740..175F; Bouhide 1760..177F; Tagbanoua 1780..17FF; Khmer 1800..18AF; Mongol 1900..194F; Limbou 1950..197F; Taï-le 1980..19DF; nouveau Taî-le 19E0..19FF; symboles Khmer 1A00..1A1F; Buginese 1B00..1B7F; Balinais 1B80..1BBF; Sundanais 1C00..1C4F; Lepcha 1C50..1C7F; Santâlî 1D00..1D7F; extensions phonétiques 1D80..1DBF; extensions phonétiques supplémentaires 1DC0..1DFF; signes diacritiques supplémentaires 1E00..1EFF; additions au Latin étendu 1F00..1FFF; Grec étendu 2000..206F; ponctuation générale 2070..209F; exposants et indices 20A0..20CF; symboles monétaires 20D0..20FF; signes combinatoires pour symboles 2100..214F; symboles de type lettre 2150..218F; formes numérales 2190..21FF; flèches 2200..22FF; opérateurs mathématiques 2300..23FF; signes techniques divers 2400..243F; pictogrammes de commande 2440..245F; reconnaissance optique de caractères 2460..24FF; alphanumériques cerclés 2500..257F; filets 2580..259F; pavés 25A0..25FF; formes géométriques 2600..26FF; symboles divers 2700..27BF; casseau 27C0..27EF; symboles mathématiques divers - A 27F0..27FF; flèches supplémentaires - A 2800..28FF; combinaisons brailles 2900..297F; flèches supplémentaires - B 2980..29FF; symboles mathématiques divers - B 2A00..2AFF; opérateurs mathématiques supplémentaires 2B00..2BFF; symboles et flèches divers 2C00..2C5F; Glagolitique 2C60..2C7F; Latin étendu - C 2C80..2CFF; Copte 2D00..2D2F; Supplément au Géorgien 2D30..2D7F; Tifinagh 2D80..2DDF; Ethiopien étendu 2DE0..2DFF; Cyrillique étendu - A 2E00..2E7F; Supplément de ponctuation 2E80..2EFF; formes supplémentaires des clés CJC 2F00..2FDF; clés chinoises (Kangxi) 2FF0..2FFF; descriptions idéophonographiques 3000..303F; symboles et ponctuations CJC 3040..309F; Hiragana 30A0..30FF; Katakana 3100..312F; Bopomofo 3130..318F; Jamos de compatibilité hangûls 3190..319F; Kanboun 31A0..31BF; Bopomofo étendu 31C0..31EF; contours CJC 31F0..31FF; extensions phonétiques Katakana 3200..32FF; lettres et mois CJC cerclés 3300..33FF; compatibilité CJC 3400..4DBF; supplément A aux idéophonogrammes unifiés 4DC0..4DFF; Hexagrammes du Classique des mutations ou Yi-king 4E00..9FFF; idéophonogrammes unifiés CJC A000..A48F; syllabes Yi des Monts frais A490..A4CF; clés Yi A500..A63F; Vaï A640..A69F; Cyrillique étendu - B A700..A71F; lettres modificatives de la tonalité A720..A7FF; Latin étendu - D A800..A82F; Sylotî Nagrî A840..A87F; Phagspa A880..A8DF; Saurashtra A900..A92F; Kayah Li A930..A95F; Rejang AA00..AA5F; Cham AC00..D7AF; syllabes hangûles D800..DB7F; demi-zone haute DB80..DBFF; partie à usage privé de la demi-zone haute DC00..DFFF; demi-zone basse E000..F8FF; zone à usage privée F900..FAFF; idéogrammes de compatibilité CJC FB00..FB4F; formes de présentation alphabétique FB50..FDFF; formes de présentation de l’Arabe - A FE00..FE0F; sélecteurs de variantes FE10..FE1F; formes verticales FE20..FE2F; demi-signes combinatoires FE30..FE4F; formes de compatibilité CJC FE50..FE6F; petites formes FE70..FEFF; formes de présentation de l’Arabe - B FF00..FFEF; formes de demi et pleine chasse FFF0..FFFF; caractères spéciaux 10000..1007F; syllabaire linéaire B 10080..100FF; Idéogrammes du linéaire B 10100..1013F; nombres Égéens 10140..1018F; Grec ancien, nombres 10190..101CF; symboles anciens 101D0..101FF; disque de Phaistós 10280..1029F; Lydien 102A0..102DF; Carien 10300..1032F; Italien, ancien 10330..1034F; Gotique 10380..1039F; Ougaritique 103A0..103DF; Vieux-perse 10400..1044F; Déséret 10450..1047F; Shavien (alphabet de Shaw) 10480..104AF; Osmanya 10800..1083F; syllabaire chypriote 10900..1091F; Phénicien 10920..1093F; Lydien 10A00..10A5F; Kharoṣṭhī 12000..123FF; cunéiforme 12400..1247F; nombres et ponctuation cunéiformes 1D000..1D0FF; symboles musicaux byzantins 1D100..1D1FF; symboles musicaux 1D200..1D24F; notation musicale du Grec ancien 1D300..1D35F; symboles du Classique du mystère suprême 1D360..1D37F; numération à bâtons 1D400..1D7FF; symboles mathématiques alphanumériques 1F000..1F02F; tuiles de mahjong 1F030..1F09F; pièces de domino 20000..2A6DF; idéogrammes unifiés CJC étendus B 2F800..2FA1F; supplément aux idéogrammes de compatibilité CJC E0000..E007F; étiquesttes E0100..E01EF; sélecteurs de variantes supplémentaires F0000..FFFFF; zone à usage privé supplémentaire - A 100000..10FFFF; zone à usage privé supplémentaire - B fontmatrix-0.6.0+svn20110930/src/langs/unicode/BlocksToCpp.awk0000644000175000017500000000065511220170637022545 0ustar malexmalexBEGIN{ FS=";" modele="p[ bKey( 0xSTART , 0xEND) ] = QObject::tr(\"BLOCK\") ;" } { m = modele if(!($1 ~ /#/) && (length($0) > 0)) { # we want to split XXXXX..XXXXX split($1, StartAndEnd,".") start = StartAndEnd[1] end = StartAndEnd[3] sub(/START/, start , m) sub(/END/, end , m) block = $2 sub(/^ */,"",block) sub(/ *$/,"",block) sub(/BLOCK/, block, m) print m > "uniblocks.cxx" # print m } }fontmatrix-0.6.0+svn20110930/src/langs/unicode/frblockstots.awk0000644000175000017500000000101411220173776023076 0ustar malexmalexBEGIN{ FS=";" i = 1 j = 1 fr[0] = "NONE" while((getline line < "Blocks-fr.txt") > 0) { split(line, top, ";") block = top[2] sub(/^ */,"",block) sub(/ *$/,"",block) fr[i] = block i = i + 1 } close("Blocks-fr.txt") } { if(!($1 ~ /#/) && (length($0) > 0)) { block = $2 sub(/^ */,"",block) sub(/ *$/,"",block) print ""block""fr[j]" " j = j + 1 } }fontmatrix-0.6.0+svn20110930/src/langs/unicode/COPYING0000644000175000017500000000422011220133272020673 0ustar malexmalexCOPYRIGHT AND PERMISSION NOTICE Copyright © 1991-2009 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that (a) the above copyright notice(s) and this permission notice appear with all copies of the Data Files or Software, (b) both the above copyright notice(s) and this permission notice appear in associated documentation, and (c) there is clear notice in each modified Data File or in the Software as well as in the documentation associated with the Data File(s) or Software that the data or software has been modified. THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. Unicode and the Unicode logo are trademarks of Unicode, Inc., and may be registered in some jurisdictions. All other trademarks and registered trademarks mentioned herein are the property of their respective owners.fontmatrix-0.6.0+svn20110930/src/langs/unicode/Blocks.txt0000644000175000017500000001334111220133272021622 0ustar malexmalex# Blocks-5.1.0.txt # Date: 2008-03-20, 17:41:00 PDT [KW] # # Unicode Character Database # Copyright (c) 1991-2008 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see UCD.html # # Note: The casing of block names is not normative. # For example, "Basic Latin" and "BASIC LATIN" are equivalent. # # Format: # Start Code..End Code; Block Name # ================================================ # Note: When comparing block names, casing, whitespace, hyphens, # and underbars are ignored. # For example, "Latin Extended-A" and "latin extended a" are equivalent. # For more information on the comparison of property values, # see UCD.html. # # All code points not explicitly listed for Block # have the value No_Block. # Property: Block # # @missing: 0000..10FFFF; No_Block 0000..007F; Basic Latin 0080..00FF; Latin-1 Supplement 0100..017F; Latin Extended-A 0180..024F; Latin Extended-B 0250..02AF; IPA Extensions 02B0..02FF; Spacing Modifier Letters 0300..036F; Combining Diacritical Marks 0370..03FF; Greek and Coptic 0400..04FF; Cyrillic 0500..052F; Cyrillic Supplement 0530..058F; Armenian 0590..05FF; Hebrew 0600..06FF; Arabic 0700..074F; Syriac 0750..077F; Arabic Supplement 0780..07BF; Thaana 07C0..07FF; NKo 0900..097F; Devanagari 0980..09FF; Bengali 0A00..0A7F; Gurmukhi 0A80..0AFF; Gujarati 0B00..0B7F; Oriya 0B80..0BFF; Tamil 0C00..0C7F; Telugu 0C80..0CFF; Kannada 0D00..0D7F; Malayalam 0D80..0DFF; Sinhala 0E00..0E7F; Thai 0E80..0EFF; Lao 0F00..0FFF; Tibetan 1000..109F; Myanmar 10A0..10FF; Georgian 1100..11FF; Hangul Jamo 1200..137F; Ethiopic 1380..139F; Ethiopic Supplement 13A0..13FF; Cherokee 1400..167F; Unified Canadian Aboriginal Syllabics 1680..169F; Ogham 16A0..16FF; Runic 1700..171F; Tagalog 1720..173F; Hanunoo 1740..175F; Buhid 1760..177F; Tagbanwa 1780..17FF; Khmer 1800..18AF; Mongolian 1900..194F; Limbu 1950..197F; Tai Le 1980..19DF; New Tai Lue 19E0..19FF; Khmer Symbols 1A00..1A1F; Buginese 1B00..1B7F; Balinese 1B80..1BBF; Sundanese 1C00..1C4F; Lepcha 1C50..1C7F; Ol Chiki 1D00..1D7F; Phonetic Extensions 1D80..1DBF; Phonetic Extensions Supplement 1DC0..1DFF; Combining Diacritical Marks Supplement 1E00..1EFF; Latin Extended Additional 1F00..1FFF; Greek Extended 2000..206F; General Punctuation 2070..209F; Superscripts and Subscripts 20A0..20CF; Currency Symbols 20D0..20FF; Combining Diacritical Marks for Symbols 2100..214F; Letterlike Symbols 2150..218F; Number Forms 2190..21FF; Arrows 2200..22FF; Mathematical Operators 2300..23FF; Miscellaneous Technical 2400..243F; Control Pictures 2440..245F; Optical Character Recognition 2460..24FF; Enclosed Alphanumerics 2500..257F; Box Drawing 2580..259F; Block Elements 25A0..25FF; Geometric Shapes 2600..26FF; Miscellaneous Symbols 2700..27BF; Dingbats 27C0..27EF; Miscellaneous Mathematical Symbols-A 27F0..27FF; Supplemental Arrows-A 2800..28FF; Braille Patterns 2900..297F; Supplemental Arrows-B 2980..29FF; Miscellaneous Mathematical Symbols-B 2A00..2AFF; Supplemental Mathematical Operators 2B00..2BFF; Miscellaneous Symbols and Arrows 2C00..2C5F; Glagolitic 2C60..2C7F; Latin Extended-C 2C80..2CFF; Coptic 2D00..2D2F; Georgian Supplement 2D30..2D7F; Tifinagh 2D80..2DDF; Ethiopic Extended 2DE0..2DFF; Cyrillic Extended-A 2E00..2E7F; Supplemental Punctuation 2E80..2EFF; CJK Radicals Supplement 2F00..2FDF; Kangxi Radicals 2FF0..2FFF; Ideographic Description Characters 3000..303F; CJK Symbols and Punctuation 3040..309F; Hiragana 30A0..30FF; Katakana 3100..312F; Bopomofo 3130..318F; Hangul Compatibility Jamo 3190..319F; Kanbun 31A0..31BF; Bopomofo Extended 31C0..31EF; CJK Strokes 31F0..31FF; Katakana Phonetic Extensions 3200..32FF; Enclosed CJK Letters and Months 3300..33FF; CJK Compatibility 3400..4DBF; CJK Unified Ideographs Extension A 4DC0..4DFF; Yijing Hexagram Symbols 4E00..9FFF; CJK Unified Ideographs A000..A48F; Yi Syllables A490..A4CF; Yi Radicals A500..A63F; Vai A640..A69F; Cyrillic Extended-B A700..A71F; Modifier Tone Letters A720..A7FF; Latin Extended-D A800..A82F; Syloti Nagri A840..A87F; Phags-pa A880..A8DF; Saurashtra A900..A92F; Kayah Li A930..A95F; Rejang AA00..AA5F; Cham AC00..D7AF; Hangul Syllables D800..DB7F; High Surrogates DB80..DBFF; High Private Use Surrogates DC00..DFFF; Low Surrogates E000..F8FF; Private Use Area F900..FAFF; CJK Compatibility Ideographs FB00..FB4F; Alphabetic Presentation Forms FB50..FDFF; Arabic Presentation Forms-A FE00..FE0F; Variation Selectors FE10..FE1F; Vertical Forms FE20..FE2F; Combining Half Marks FE30..FE4F; CJK Compatibility Forms FE50..FE6F; Small Form Variants FE70..FEFF; Arabic Presentation Forms-B FF00..FFEF; Halfwidth and Fullwidth Forms FFF0..FFFF; Specials 10000..1007F; Linear B Syllabary 10080..100FF; Linear B Ideograms 10100..1013F; Aegean Numbers 10140..1018F; Ancient Greek Numbers 10190..101CF; Ancient Symbols 101D0..101FF; Phaistos Disc 10280..1029F; Lycian 102A0..102DF; Carian 10300..1032F; Old Italic 10330..1034F; Gothic 10380..1039F; Ugaritic 103A0..103DF; Old Persian 10400..1044F; Deseret 10450..1047F; Shavian 10480..104AF; Osmanya 10800..1083F; Cypriot Syllabary 10900..1091F; Phoenician 10920..1093F; Lydian 10A00..10A5F; Kharoshthi 12000..123FF; Cuneiform 12400..1247F; Cuneiform Numbers and Punctuation 1D000..1D0FF; Byzantine Musical Symbols 1D100..1D1FF; Musical Symbols 1D200..1D24F; Ancient Greek Musical Notation 1D300..1D35F; Tai Xuan Jing Symbols 1D360..1D37F; Counting Rod Numerals 1D400..1D7FF; Mathematical Alphanumeric Symbols 1F000..1F02F; Mahjong Tiles 1F030..1F09F; Domino Tiles 20000..2A6DF; CJK Unified Ideographs Extension B 2F800..2FA1F; CJK Compatibility Ideographs Supplement E0000..E007F; Tags E0100..E01EF; Variation Selectors Supplement F0000..FFFFF; Supplementary Private Use Area-A 100000..10FFFF; Supplementary Private Use Area-B # EOFfontmatrix-0.6.0+svn20110930/src/langs/test.dict0000644000175000017500000000013610764365653020066 0ustar malexmalex% This is the "test" dict file %A 0041|CAP|VOYELLE %B 0042|CAP|CONSONNE %C 0043|CAP|CHUINTANTEfontmatrix-0.6.0+svn20110930/src/langs/latn.match0000644000175000017500000000023711176003214020174 0ustar malexmalex% this is the "test match file % set finals and initials .(X) .(SPACE) | .1(fina; liga; kern) .2 .(X) .(PUNCT) | .1(fina; liga; kern) .2 .(X) | .1(liga; kern)fontmatrix-0.6.0+svn20110930/src/langs/test.match0000644000175000017500000000031010765244743020226 0ustar malexmalex% this is the "test match file % "ABC" => "BCA" U0041U0042U0043|U0042U0043U0041 % "B(VOYELLE)C" => "C\1" U0042.(VOYELLE)U0043|U0043.1 % f f i => f_f_i U0066U0066U0069|U0066(liga)U0066(liga)U0069(liga)fontmatrix-0.6.0+svn20110930/src/langs/deva.match0000644000175000017500000001064711004340731020161 0ustar malexmalex% "Pierre Marchand ne doute de rien :-)" % We’ll try to give the relevant syntax for the % 16 rules edicted in chapter 9 section 1 of % Unicode 5.0 for the rendering of Devanagari. % Note: knowing average nothing in Devanagari, % expect that it will be all wrong. % Note2: I try to always use Unicode value when % it’s possible to clearly distinguish between % fixed and dynamic points. In real world a compact form % with only char properties would be appropriate. % Note3: To have it actually working, one wants to % reorder so longer patterns come first. % Note4: OTF Features are basically those that give good % results with Lohit Hindi font, I tried sometimes to % get the same result with Gargi font by appending other % features (e.g. R14 "blws"). % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%% CUSTOM %%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .(R) .(H) .(C) .(H) .(C) .(H) .(C) .(H) .(C) | .3(half) .4(half) .5(half) .6(half) .7(half) .8(half) .9 .1(rphf) .2(rphf) .(C) .(H) .(C) .(H) .(R) | .1(half;pres) .2(half;pres) .3(half;pres) .5(blwf) .4(blwf) .(C) .(H) .(R) .(H) .(C) .(m) | .6 .1(half;blwf;vatu) .2(half;blwf;vatu) .3(half;blwf;vatu) .4(half;blwf;vatu) .5(half) .(C) .(H) .(R) .(H) | .1(half;blwf;vatu) .2(half;blwf;vatu) .3(half;blwf;vatu) .4(half;blwf;vatu) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% - R16 - % TAd + [ZWNJ] + RAl + Ivs => TAd + Ivs + RAl .(C) .(H) .(ZWNJ) .(R) .(m) | .1(blwm) .2(blwm) .5 .4 % % - R15 - % TAd + RAl + Ivs => T.RAn + Ivs => Ivs + T.RAd .(C) .(H) .(R) .(m) | .4 .1(blwf;vatu;half) .3(blwf;vatu;half) .2(blwf;vatu;half) % %% - Figure 9-8 - % Still here but I guess that, at some point, we’ll have to put it at the end % KAn + Ivs => Ivs + KAn .(C) .(m) | .2 .1 % %% - R14 - % RAl + Uvs => RUn .(R) .(b) | .1(psts;blws) .2(psts;blws) % %% - R13 - % KAn + RAsub => K.RAn .(C) .(R) .(H) .(C) | .1 .4 .2(rphf;abvm) .3 .(C) .(R) .(m) | .3 .1 .2(blwf) .(C) .(R) | .1 .2(blwf) % %% - R12 - % SAd + TAd + RAn => SAd + T.RAn => S.T.RAn .(C) .(H) .(C) .(H) .(R) | .1(akhn;half) .2(akhn;half) .3(akhn;half) .4(akhn;half) .5 % %% - R11 - % JAd + NYAl => J.NYAn % We need to match CHCH before CHC. .(C) .(H) .(C) .(H) | .1(akhn;half) .2(akhn;half) .3(akhn;half) .4(akhn;half) .(C) .(H) .(C) .(m)| .4 .1(akhn;half) .2(akhn;half) .3(akhn;half) .(C) .(H) .(C) | .1(akhn;half;pres) .2(akhn;half;pres) .3(akhn;half;pres) % %% - R10 - % KAn + AAvs + CANDRABINDUn % I must be under-equiped with brain, I can’t get it. % %% - R9 - % KAn + NUKTAn + VIRAMAn => QAd .(C) .(Nukta) .(H) .(m) | .4 .1(nukt) .2(nukt) .3 .(C) .(Nukta) .(H) | .1(nukt) .2(nukt) .3 % %% - R8 - % T.RAd + YAl => T.R.YAn .(C) .(H) .(R) .(H) .(C) .(m) | .6 .1(half) .3(blwf;vatu;half) .4(half) .5 .(C) .(H) .(R) .(H) .(C) | .1(half) .3(blwf;vatu;half) .4(half) .5 % TAd + RAd => TAn + RAsub + VIRAMAn => T.RAd .(C) .(H) .(R) .(H) | .1 .3(blwf;vatu) .2 % %% - R7 - % "For certain consonants"? "may"? It’s not how % a _rule_ should be written IYWMO. But the most important % point is that I don’t know what’s different in pattern % from R6. #TODO ask to RahulB % PHAd + RAl => PHAn + RAsub .(C) .(H) .(R) .(m) | .4 .1(blwf;vatu) .3(blwf;vatu) .2(blwf;vatu) .(C) .(H) .(R) | .1(blwf;vatu) .3(blwf;vatu) .2(blwf;vatu) % %% - R6 - % TTHAd + RAl => TTHAn + RAsub .(C) .(H) .(R) .(m) | .4 .1 .3(blwf) .2(blwf) .(C) .(H) .(R) | .1 .3(blwf) .2(blwf) % %% - R5a - % RAd + ZWJ => RAh .(R) .(H) .(ZWJ) .(m) | .3 .1(half) .2(half) .(R) .(H) .(ZWJ) | .1(half) .2(half) % %% - R5 - % RRAn + VIRAMAn => RRAh .(RR) .(H) .(m) | .3 .1(half) .1(half) .(RR) .(H) | .1(half) .1(half) % %% - R4 - % RAd + GAd + [ZWJ] + GHAl => GAh + GHAl + RAsup .(R) .(H) .(C) .(H) .(ZWJ) .(C) .(m) | .7 .3(half) .6 .1(rphf) .2 .(R) .(H) .(C) .(H) .(ZWJ) .(C) | .3(half) .6 .1(rphf) .2 % %% - R3 - % RAd + JAd + NYAl => J.NYAn + RAsup .(R) .(H) .(C) .(H) .(C) .(m) | .6 .3(akhn;half) .5(akhn;half) .1(rphf) .2 .(R) .(H) .(C) .(H) .(C) | .3(akhn;half) .5(akhn;half) .1(rphf) .2 % %% - R2 - % RAd + KAl => KAl + RAsup .(R) .(H) .(C) .(H) .(R) .(m) .(A) | .6 .3(blwf;vatu) .1(blwf;vatu) .2(blwf;vatu) .1(rphf;abvs) .2(rphf;abvs) .7(abvs) .(R) .(H) .(C) .(m) | .4 .3 .1(rphf) .2 .(R) .(H) .(C) | .3(abvm) .1(rphf;abvm) .2 % %% - R1 - % If "dead" feature would exist, it would give: % .(C)U094D|.1(dead) % % % Follow some "guessed rules". Ça vaut ce que ça vaut :) .(N) .(H) | .1(blwm) .2(blwm) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%fontmatrix-0.6.0+svn20110930/src/tagseteditor.h0000644000175000017500000000357211036350327017775 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TAGSETEDITOR_H #define TAGSETEDITOR_H #include class typotek; /** @author Pierre Marchand */ class TagSetEditor : public QDialog, private Ui::TagSetDialog { Q_OBJECT public: TagSetEditor(QWidget *parent); ~TagSetEditor(); private: typotek *m_typo; void doConnect(); void doInitLists(); private slots: void slotAddTagToSet(); void slotRemoveToSet(); void slotNewSet(); void slotUpdateTagsOfSet(QListWidgetItem* item); void slotDeleteSet(); }; #endif fontmatrix-0.6.0+svn20110930/src/winutils.h0000644000175000017500000000056211002475507017152 0ustar malexmalex// Thanks to jghali #ifdef _WIN32 #include #include QString getWin32SystemFontDir() { QString qstr; WCHAR dir[512]; if ( SHGetSpecialFolderPathW(NULL, dir, CSIDL_FONTS, false) ) { qstr = QString::fromUtf16((const unsigned short*) dir); if( !qstr.endsWith("\\") ) qstr += "\\"; qstr.replace( '\\', '/' ); } return qstr; } #endif fontmatrix-0.6.0+svn20110930/src/filtersdialog.ui0000644000175000017500000001574711443703053020324 0ustar malexmalex FiltersDialog 0 0 494 448 Filters Manager 0 0 2 QFrame::StyledPanel QFrame::Sunken true 0 0 480 311 0 In order to add filters, you have to first select some of tags, meta informations or classifications elements. Qt::AutoText true 75 true Add Filter 0 10 Qt::Horizontal QFrame::StyledPanel QFrame::Raised Filter Name: newName 10 0 0 0 Add current filter 0 0 Qt::Horizontal 402 20 Close closeButton clicked() FiltersDialog close() 459 441 250 230 fontmatrix-0.6.0+svn20110930/src/filterbar.ui0000644000175000017500000003241411524253232017433 0ustar malexmalex FilterBar 0 0 240 761 Form 6 2 Qt::Vertical 20 40 0 3 Filters Qt::Horizontal 40 20 0 0 QFrame::NoFrame true 0 0 226 172 0 0 0 0 Qt::Vertical 20 200 0 Tags Qt::Horizontal 40 20 0 0 255 255 255 255 255 255 212 208 200 Qt::NoFocus false QFrame::NoFrame QFrame::Plain Qt::ScrollBarAlwaysOff false QAbstractItemView::DoubleClicked QAbstractItemView::NoSelection QListView::Static QListView::Adjust QListView::ListMode 0 false Qt::Horizontal 0 Metadata Qt::Horizontal 40 20 0 0 3 3 3 0 Search 0 0 172 0 0 in 0 0 172 0 0 3 3 Panose Qt::Horizontal 40 20 0 0 Qt::Horizontal Qt::Horizontal PanoseWidget QWidget
panosewidget.h
1
OpenCloseArrow QLabel
openclosearrow.h
TagListView QListView
filterbar.h
fontmatrix-0.6.0+svn20110930/src/glyphtosvghelper.h0000644000175000017500000000345611125205407020703 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef GLYPHTOSVGHELPER_H #define GLYPHTOSVGHELPER_H #include #include #include #include class GlyphToSVGHelper { QPainterPath m_path; QTransform m_transform; QString m_svg; public: GlyphToSVGHelper(QPainterPath path, QTransform tf = QTransform()); QString getSVG(int pSize = 1000) const; QString getSVGPath() const; QRectF getRect() const; }; #endif // GLYPHTOSVGHELPER_H fontmatrix-0.6.0+svn20110930/src/fmpaths.cpp0000644000175000017500000001000011420024060017241 0ustar malexmalex// // C++ Implementation: fmpaths // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fmpaths.h" #include "typotek.h" #include // #include FMPaths *FMPaths::instance = 0; FMPaths * FMPaths::getThis() { if(!instance) instance = new FMPaths; return instance; } QString FMPaths::TranslationsDir() { if(getThis()->FMPathsDB.contains("TranslationsDir")) return getThis()->FMPathsDB["TranslationsDir"]; QString dirsep(QDir::separator()); #ifdef PLATFORM_APPLE QString QMDirPath = QApplication::applicationDirPath(); QMDirPath += dirsep + ".." + dirsep + "Resources" + dirsep + "Locales" + dirsep; #elif _WIN32 QString QMDirPath = QApplication::applicationDirPath(); QMDirPath += dirsep + "share" + dirsep + "qm" + dirsep; #else QString QMDirPath = PREFIX; QMDirPath += dirsep + "share" + dirsep + "fontmatrix" + dirsep + "qm" + dirsep; #endif getThis()->FMPathsDB["TranslationsDir"] = QMDirPath; return QMDirPath; } QString FMPaths::HelpDir() { if(getThis()->FMPathsDB.contains("HelpDir")) return getThis()->FMPathsDB["HelpDir"]; QString hf; QString dirsep(QDir::separator()); #ifdef PLATFORM_APPLE hf = LocalizedDirPath( QApplication::applicationDirPath() + dirsep + "help" + dirsep ); #elif _WIN32 hf = LocalizedDirPath(QApplication::applicationDirPath() + dirsep + "help" + dirsep ); #else hf = LocalizedDirPath( PREFIX + dirsep + "share" + dirsep + "fontmatrix" + dirsep + "help" + dirsep ); #endif getThis()->FMPathsDB["HelpDir"] = hf; return getThis()->FMPathsDB["HelpDir"]; } QString FMPaths::ResourcesDir() { if(getThis()->FMPathsDB.contains("ResourcesDir")) return getThis()->FMPathsDB["ResourcesDir"]; QString dirsep(QDir::separator()); #ifdef PLATFORM_APPLE QString QMDirPath = QApplication::applicationDirPath(); QMDirPath += dirsep + ".." + dirsep + "Resources" + dirsep ; #elif _WIN32 QString QMDirPath = QApplication::applicationDirPath(); QMDirPath += dirsep + "share" + dirsep + "resources" + dirsep; #else QString QMDirPath = PREFIX; QMDirPath += dirsep + "share" + dirsep + "fontmatrix" + dirsep + "resources" + dirsep; #endif getThis()->FMPathsDB["ResourcesDir"] = QMDirPath; return getThis()->FMPathsDB["ResourcesDir"]; } QString FMPaths::ScriptsDir() { QString sep(QDir::separator()); return typotek::getInstance()->getOwnDir().absolutePath() + sep + "Scripts"+ sep; } QString FMPaths::SamplesDir() { QString sep(QDir::separator()); return typotek::getInstance()->getOwnDir().absolutePath() + sep + "Samples"+ sep; } QString FMPaths::FiltersDir() { QString sep(QDir::separator()); QDir bdir(typotek::getInstance()->getOwnDir().absolutePath()); if (!bdir.exists(QString("Filters"))) bdir.mkdir(QString("Filters")); return typotek::getInstance()->getOwnDir().absolutePath() + sep + "Filters"+ sep; } QString FMPaths::LocalizedDirPath(const QString & base, const QString& fallback ) { QString sep("_"); QStringList l_c(QLocale::system().name().split(sep)); QString langcode( l_c.first() ); QString countrycode(l_c.last()); QStringList names; if((!langcode.isEmpty()) || (!countrycode.isEmpty())) { names << base + langcode + sep + countrycode ; names << base + langcode ; } names << base + fallback ; names << base ; foreach(QString t, names) { QDir d(t); if( d.exists() ) { return d.absolutePath() + QString(QDir::separator()) ; } } return QString(); } QString FMPaths::LocalizedFilePath(const QString & base, const QString & ext, const QString& fallback) { QString sep("_"); QStringList l_c(QLocale::system().name().split(sep)); QString langcode( l_c.first() ); QString countrycode(l_c.last()); QStringList names; if((!langcode.isEmpty()) || (!countrycode.isEmpty())) { names << base + langcode + sep + countrycode + ext ; names << base + langcode + ext ; } names << base + fallback + ext ; names << base + ext ; foreach(QString t, names) { if( QFile::exists(t) ) { return t; } } return QString(); } fontmatrix-0.6.0+svn20110930/src/fmbaseshaper.cpp0000644000175000017500000000434111217731442020267 0ustar malexmalex// // C++ Implementation: fmbaseshaper // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fmbaseshaper.h" #include "fontmatrixshaper.h" #ifdef HAVE_HARFBUZZ #include "harfbuzzqtshaper.h" #endif #ifdef HAVE_ICU #include "icushaper.h" #endif #ifdef HAVE_M17N #include "m17nshaper.h" #endif #ifdef HAVE_PANGO #include "pangoshaper.h" #endif #include QMap FMShaperFactory::types() { QMap ret; ret.clear(); ret["Fontmatrix"] = FONTMATRIX; #ifdef HAVE_HARFBUZZ ret["Harfbuzz"] = HARFBUZZ; #endif #ifdef HAVE_ICU ret["ICU"] = ICU; #endif #ifdef HAVE_M17N ret["m17n"] = M17N; #endif #ifdef HAVE_PANGO ret["Pango"] = PANGO; #endif // ret << "OMEGA"; return ret; } FMShaperFactory::FMShaperFactory ( FMOtf * o, QString s, SHAPER_TYPE st ) :otf ( o ), script ( s ), shaperType ( st ) { switch ( shaperType ) { case FONTMATRIX : qDebug() << "NEW FontmatrixShaper"; shaperImpl = new FontmatrixShaper ( otf, script ); break; #ifdef HAVE_HARFBUZZ case HARFBUZZ: qDebug() << "NEW HarfbuzzShaper"; shaperImpl = new HarfbuzzShaper ( otf, script ); break; #endif #ifdef HAVE_PANGO case PANGO: qDebug() << "NEW PangoShaper"; shaperImpl = new PangoShaper ( otf, script ); break; #endif #ifdef HAVE_ICU case ICU : qDebug() << "NEW IcuShaper"; shaperImpl = new IcuShaper ( otf, script ); break; #endif #ifdef HAVE_M17N case M17N : qDebug() << "NEW M17NShaper"; shaperImpl = new M17NShaper ( otf, script ); break; #endif // case OMEGA : shaperImpl = new OmegaShaper ( otf, script ); // break; default:break; } } FMShaperFactory::~ FMShaperFactory() { if ( shaperImpl ) delete shaperImpl; } // void FMShaperFactory::resetShaperType ( SHAPER_TYPE st ) // { // if ( shaperType == st ) // return; // // if ( shaperImpl ) // { // delete shaperImpl; // shaperImpl = 0; // } // // shaperType = st; // } GlyphList FMShaperFactory::doShape ( const QString & aString ) { return shaperImpl->doShape ( aString ); } FMBaseShaper::FMBaseShaper(FMOtf * o, QString s) :otf(o), script(s) { } FMBaseShaper::~ FMBaseShaper() { } fontmatrix-0.6.0+svn20110930/src/remotedir.cpp0000644000175000017500000001425711513341510017620 0ustar malexmalex// // C++ Implementation: remotedir // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "remotedir.h" #include "typotek.h" #include #include #include #include #include #include #include extern QWaitCondition remoteDirsCond; RemoteDir::RemoteDir(const QStringList &dirs) : argDirs(dirs), m_ready(false) { qDebug()<<"RemoteDir::RemoteDir("<setBuffer(ba); buffer->open(QIODevice::WriteOnly); QUrl url(argDirs[ridx]); QHttp *rd = new QHttp(url.host()); rd->setObjectName(argDirs[ridx]); https << rd; connect(rd,SIGNAL(requestFinished( int, bool )),this,SLOT(slotEndReq(int, bool))); // connect(rd,SIGNAL(dataReadProgress( int, int )),this,SLOT(slotProgress(int, int))); int rdId(rd->get(url.path()+"/fontmatrix.data", buffer)); typotek::getInstance()->showStatusMessage(tr("Downloading")+" " + url.toString() + "/fontmatrix.data"); rDirs[rdId] = argDirs[ridx]; httpRequests[rdId] = 1; httpBuffers[rdId] = ba; reverseHttp[rdId] = rd; httpPaths[rdId] = url.path(); } } RemoteDir::~RemoteDir() { foreach(QHttp *h, https) { delete h; } foreach(QBuffer *b, buffers) { delete b; } for(QMap::iterator ba = httpBuffers.begin(); ba != httpBuffers.end(); ++ba) delete ba.value(); } void RemoteDir::slotEndPreviews(int id, bool error) { // qDebug()<<"RemoteDir::slotEndPreviews("<< id<<", "<hasPendingRequests()) { ++pendingReqs; } else { https[i]->close(); } } if(!pendingReqs) { qDebug() <<"Get all previews"; stopperEndPreviews = true; eventEndDownload(); } } void RemoteDir::slotEndReq(int id, bool error) { qDebug()<<"RemoteDir::slotEndReq("<< id<<", "<hasPendingRequests()) { ++pendingReqs; } // else // { // https[i]->close(); // } } if(!pendingReqs) { stopperEndReq = true; getPreviews(); } } void RemoteDir::eventEndDownload() { if(stopper) return; QMap::const_iterator bIt; for(bIt = httpBuffers.begin(); bIt != httpBuffers.end(); ++bIt) { if(httpRequests[bIt.key()] == 0) continue; QString path(rDirs[bIt.key()]); qDebug()<< "Path("<"<< path; QDomDocument doc ( "fontdata" ); doc.setContent(*(bIt.value())); //loading fonts QDomNodeList colList = doc.elementsByTagName ( "fontfile" ); for ( uint i = 0; i < colList.length(); ++i ) { QDomNode col = colList.item ( i ); FontInfo fi; fi.family = col.toElement().attributeNode("family").value(); fi.variant = col.toElement().attributeNode("variant").value(); fi.type = col.toElement().attributeNode("type").value(); QString basename(col.namedItem ( "file" ).toElement().text()); fi.file = path + basename; fi.info = col.namedItem ( "info" ).toElement().text(); if(pixmaps.contains(basename)) { fi.pix = QPixmap::fromImage (QImage::fromData( (const uchar*)pixmaps[basename]->data(), pixmaps[basename]->count() )); } else { qDebug() << "No pixmap for " + fi.file; fi.pix = QPixmap(); } QDomNodeList taglist = col.toElement().elementsByTagName ( "tag" ); fi.tags.clear(); for(int ti = 0; ti < taglist.count(); ++ti) { if(!fi.tags.contains(taglist.at(ti).toElement().text())) fi.tags << taglist.at(ti).toElement().text(); } m_fonts << fi; } } m_ready = true; stopper = true; emit listIsReady(); } void RemoteDir::getPreviews() { QMap::const_iterator bIt; for(bIt = httpBuffers.begin(); bIt != httpBuffers.end(); ++bIt) { if(httpRequests[bIt.key()] == 0) continue; QDomDocument doc ( "fontdata" ); doc.setContent(*(bIt.value())); QDomNodeList colList = doc.elementsByTagName ( "fontfile" ); for ( uint i = 0; i < colList.length(); ++i ) { QDomNode col = colList.item ( i ); QString p = col.namedItem ( "file" ).toElement().text(); QByteArray *ba = new QByteArray; QBuffer *buffer = new QBuffer; buffers << buffer; buffer->setBuffer(ba); buffer->open(QIODevice::WriteOnly); pixmaps[p] = ba; connect(reverseHttp[bIt.key()],SIGNAL(requestFinished( int, bool )),this,SLOT(slotEndPreviews(int, bool))); int rdId(reverseHttp[bIt.key()]->get(httpPaths[bIt.key()]+"/"+ p + ".png", buffer)); pendingPixmaps[rdId] = 1; // qDebug() << "Started download of " << httpPaths[bIt.key()]+"/"+ p + ".png"; typotek::getInstance()->showStatusMessage(tr("Downloading") +" "+ httpPaths[bIt.key()]+"/"+ p + ".png"); } } } void RemoteDir::slotProgress(int done, int total) { // qDebug()<<"RemoteDir::slotProgress(int done, int total)"; int ih(0); bool hFound = false; for(;ih < https.count();++ih) { if(sender() == https[ih]) { hFound = true; break; } } if(!hFound) { qDebug()<< "Oops - Can’t determine which Http object called me"; return; } QString file(https[ih]->objectName()); qDebug()<< file <<" [" <, (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "importtags.h" #include "fmfontdb.h" //#include "listdockwidget.h" #include ImportTags::ImportTags(QWidget * parent, QStringList tags) : QDialog(parent) { qDebug()<< "ImportTags(" << tags << ")"; setupUi(this); m_tags = tags; // m_tags.removeAll("Activated_On"); // m_tags.removeAll("Activated_Off"); for(int i = 0 ; i < m_tags.count() ; ++i) { QListWidgetItem *it = new QListWidgetItem( m_tags[i] , tagsList ); it->setCheckState(Qt::Unchecked); } connect(tagNewButton,SIGNAL(released()),this,SLOT(slotNewTag())); connect(tagText,SIGNAL(editingFinished()),this,SLOT(slotNewTag())); connect(okButton,SIGNAL(released()),this,SLOT(slotEnd())); } ImportTags::~ImportTags() { for(int i = 0 ; i < tagsList->count() ; ++i) { delete tagsList->item(i); } } void ImportTags::slotNewTag() { QString nTag(tagText->text()); if(m_tags.contains(nTag)) return; if(nTag.simplified().isEmpty()) return; m_tags << nTag; QListWidgetItem *it = new QListWidgetItem(nTag , tagsList); it->setCheckState(Qt::Checked); tagText->clear(); FMFontDb::DB()->addTagToDB ( nTag ); // ListDockWidget::getInstance()->reloadTagsCombo(); } void ImportTags::slotEnd() { m_tags.clear(); for(int i = 0 ; i < tagsList->count() ; ++i) { if(tagsList->item(i)->checkState() == Qt::Checked) m_tags << tagsList->item(i)->text(); } close(); } fontmatrix-0.6.0+svn20110930/src/dumpdialog.cpp0000644000175000017500000000376211117277172017766 0ustar malexmalex// // C++ Implementation: dumpdialog // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "dumpdialog.h" #include "fmdumpinfo.h" #include "fontitem.h" #include #include #include FMDumpDialog::FMDumpDialog(FontItem * font, QWidget * parent) : QDialog(parent), m_dumpinfo(0) { setupUi(this); fontName->setText(font->fancyName()); m_dumpinfo = new FMDumpInfo(font); nameList->addItems(m_dumpinfo->infos()); connect(browseButton, SIGNAL(clicked()), this, SLOT(browseFile())); connect(loadButton, SIGNAL(clicked()), this, SLOT(browseModel())); connect(buttonBox, SIGNAL(accepted()), this, SLOT(slotDumpIt())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); connect(modelText, SIGNAL(insertContent()), this, SLOT(insertSelectedField())); } FMDumpDialog::~ FMDumpDialog() { if(m_dumpinfo) delete m_dumpinfo; } QString FMDumpDialog::getModel() const { return modelText->toPlainText(); } QString FMDumpDialog::getFilePath() const { return filePath->text(); } void FMDumpDialog::slotDumpIt() { m_dumpinfo->setModel(getModel()); if(m_dumpinfo->dumpInfo(getFilePath())) accept(); else reject(); } void FMDumpDialog::browseFile() { QString s( QFileDialog::getSaveFileName(this, "Fontmatrix", QDir::homePath()) ); if(!s.isEmpty()) { filePath->setText(s); } } void FMDumpDialog::browseModel() { QString s( QFileDialog::getOpenFileName(this, "Fontmatrix", QDir::homePath()) ); if(!s.isEmpty()) { QFile file(s); if(file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream ts(&file); modelText->setPlainText( ts.readAll() ); } file.close(); } else modelText->setPlainText( "" ); } void FMDumpDialog::insertSelectedField() { if(!nameList->selectedItems().isEmpty()) { QTextCursor cursor = modelText->textCursor(); cursor.insertText(m_dumpinfo->info( nameList->selectedItems().first()->text())); } } fontmatrix-0.6.0+svn20110930/src/sctextbrowser.cpp0000644000175000017500000000144311147562531020550 0ustar malexmalex/* For general Scribus (>=1.3.2) copyright and licensing information please refer to the COPYING file provided with the program. Following this notice may exist a copyright and/or license notice that predates the release of Scribus 1.3.2 for which a new license (GPL+exception) is in place. */ #include #include #include #include #include #include #include #include #include #include #if defined(_WIN32) #include #include #endif // #include "prefsmanager.h" #include "sctextbrowser.h" // #include "urllauncher.h" ScTextBrowser::ScTextBrowser( QWidget * parent ) : QWebView(parent) { } void ScTextBrowser::home() { if(m_home.isValid()) load(m_home); } fontmatrix-0.6.0+svn20110930/src/QHexView.cpp0000644000175000017500000010423711104167575017341 0ustar malexmalex/* Copyright (C) 2006 Evan Teran eteran@alum.rit.edu This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "QHexView.h" #include #include #include #include #include #include #include #include #include #include #include #include #include // #include "ByteStream.h" // #include "Util.h" // #include "CommentServerInterface.h" //------------------------------------------------------------------------------ // Name: QHexView(QWidget * parent) // Desc: constructor //------------------------------------------------------------------------------ QHexView::QHexView(QWidget * parent) : QAbstractScrollArea(parent), m_RowWidth(16), m_WordWidth(1), m_AddressColor(Qt::red), m_ShowHex(true), m_ShowAscii(true), m_ShowAddress(true), m_ShowComments(true), m_Origin(0), m_AddressOffset(0), m_SelectionStart(-1), m_SelectionEnd(-1), m_Data(0), m_Highlighting(Highlighting_None), m_EvenWord(Qt::blue), m_NonPrintableText(Qt::red), m_UnprintableChar('.'), m_ShowLine1(true), m_ShowLine2(true), m_ShowLine3(true), m_CommentServer(0) { setShowAddressSeparator(true); // default to a simple monospace font setFont(QFont("Monospace", 8)); } //------------------------------------------------------------------------------ // Name: setShowAddressSeparator(bool value) // Desc: //------------------------------------------------------------------------------ void QHexView::setShowAddressSeparator(bool value) { if(value) { #if QT_POINTER_SIZE == 4 strncpy(m_AddressFormatString, "%04x:%04x", sizeof(m_AddressFormatString)); #elif QT_POINTER_SIZE == 8 strncpy(m_AddressFormatString, "%08x:%08x", sizeof(m_AddressFormatString)); #endif } else { #if QT_POINTER_SIZE == 4 strncpy(m_AddressFormatString, "%04x%04x", sizeof(m_AddressFormatString)); #elif QT_POINTER_SIZE == 8 strncpy(m_AddressFormatString, "%08x%08x", sizeof(m_AddressFormatString)); #endif } m_AddressFormatString[sizeof(m_AddressFormatString) - 1] = '\0'; m_ShowAddressSeparator = value; } //------------------------------------------------------------------------------ // Name: ~QHexView() // Desc: destructor //------------------------------------------------------------------------------ QString QHexView::formatAddress(address_t address) { QString ret; #if QT_POINTER_SIZE == 4 ret.sprintf(m_AddressFormatString, (address >> 16) & 0xffff, address & 0xffff); #elif QT_POINTER_SIZE == 8 ret.sprintf(m_AddressFormatString, (address >> 32) & 0xffffffff, address & 0xffffffff); #endif return ret; } //------------------------------------------------------------------------------ // Name: // Desc: //------------------------------------------------------------------------------ void QHexView::repaint() { viewport()->repaint(); } //------------------------------------------------------------------------------ // Name: dataSize() const // Desc: returns how much data we are viewing //------------------------------------------------------------------------------ int QHexView::dataSize() const { return m_Data != 0 ? m_Data->size() : 0; } //------------------------------------------------------------------------------ // Name: setFont(const QFont &f) // Desc: overloaded version of setFont, calculates font metrics for later //------------------------------------------------------------------------------ void QHexView::setFont(const QFont &f) { // recalculate all of our metrics/offsets const QFontMetrics fm(f); m_FontWidth = fm.maxWidth(); m_FontHeight = fm.height(); updateScrollbars(); // TODO: assert that we are using a fixed font & find out if we care? QAbstractScrollArea::setFont(f); } //------------------------------------------------------------------------------ // Name: addToggleActionToMenu(QMenu *menu, const QString &caption, bool checked, QObject *reciever, const char *slot) // Desc: convinience function used to add a checkable menu item to the context menu //------------------------------------------------------------------------------ QAction *QHexView::addToggleActionToMenu(QMenu *menu, const QString &caption, bool checked, QObject *reciever, const char *slot) { QAction *const action = new QAction(caption, menu); action->setCheckable(true); action->setChecked(checked); menu->addAction(action); connect(action, SIGNAL(toggled(bool)), reciever, slot); return action; } //------------------------------------------------------------------------------ // Name: createStandardContextMenu() // Desc: creates the "standard" context menu for the widget //------------------------------------------------------------------------------ QMenu *QHexView::createStandardContextMenu() { QMenu *const menu = new QMenu(this); menu->addAction("Set &Font", this, SLOT(mnuSetFont())); menu->addSeparator(); addToggleActionToMenu(menu, "Show A&ddress", m_ShowAddress, this, SLOT(setShowAddress(bool))); addToggleActionToMenu(menu, "Show &Hex", m_ShowHex, this, SLOT(setShowHexDump(bool))); addToggleActionToMenu(menu, "Show &Ascii", m_ShowAscii, this, SLOT(setShowAsciiDump(bool))); addToggleActionToMenu(menu, "Show &Comments", m_ShowComments, this, SLOT(setShowComments(bool))); QSignalMapper *wordWidthMapper = new QSignalMapper(this); QMenu *const wordMenu = new QMenu("Set Word Width", this); QAction *const a1 = addToggleActionToMenu(wordMenu, "1 Byte", m_WordWidth == 1, wordWidthMapper, SLOT(map())); QAction *const a2 = addToggleActionToMenu(wordMenu, "2 Bytes", m_WordWidth == 2, wordWidthMapper, SLOT(map())); QAction *const a3 = addToggleActionToMenu(wordMenu, "4 Bytes", m_WordWidth == 4, wordWidthMapper, SLOT(map())); QAction *const a4 = addToggleActionToMenu(wordMenu, "8 Bytes", m_WordWidth == 8, wordWidthMapper, SLOT(map())); wordWidthMapper->setMapping(a1, 1); wordWidthMapper->setMapping(a2, 2); wordWidthMapper->setMapping(a3, 4); wordWidthMapper->setMapping(a4, 8); connect(wordWidthMapper, SIGNAL(mapped(int)), SLOT(setWordWidth(int))); QSignalMapper *rowWidthMapper = new QSignalMapper(this); QMenu *const rowMenu = new QMenu("Set Row Width", this); QAction *const a5 = addToggleActionToMenu(rowMenu, "1 Word", m_RowWidth == 1, rowWidthMapper, SLOT(map())); QAction *const a6 = addToggleActionToMenu(rowMenu, "2 Words", m_RowWidth == 2, rowWidthMapper, SLOT(map())); QAction *const a7 = addToggleActionToMenu(rowMenu, "4 Words", m_RowWidth == 4, rowWidthMapper, SLOT(map())); QAction *const a8 = addToggleActionToMenu(rowMenu, "8 Words", m_RowWidth == 8, rowWidthMapper, SLOT(map())); QAction *const a9 = addToggleActionToMenu(rowMenu, "16 Words", m_RowWidth == 16, rowWidthMapper, SLOT(map())); rowWidthMapper->setMapping(a5, 1); rowWidthMapper->setMapping(a6, 2); rowWidthMapper->setMapping(a7, 4); rowWidthMapper->setMapping(a8, 8); rowWidthMapper->setMapping(a9, 16); connect(rowWidthMapper, SIGNAL(mapped(int)), SLOT(setRowWidth(int))); menu->addSeparator(); menu->addMenu(wordMenu); menu->addMenu(rowMenu); menu->addSeparator(); menu->addAction("&Copy Selection To Clipboard", this, SLOT(mnuCopy())); return menu; } //------------------------------------------------------------------------------ // Name: contextMenuEvent(QContextMenuEvent *event) // Desc: default context menu event, simply shows standard menu //------------------------------------------------------------------------------ void QHexView::contextMenuEvent(QContextMenuEvent *event) { QMenu *const menu = createStandardContextMenu(); menu->exec(event->globalPos()); delete menu; } //------------------------------------------------------------------------------ // Name: // Desc: //------------------------------------------------------------------------------ void QHexView::mnuCopy() { if(hasSelectedText()) { QApplication::clipboard()->setText(selectedBytes()); } } //------------------------------------------------------------------------------ // Name: mnuSetFont() // Desc: slot used to set the font of the widget based on dialog selector //------------------------------------------------------------------------------ void QHexView::mnuSetFont() { setFont(QFontDialog::getFont(0, font(), this)); } //------------------------------------------------------------------------------ // Name: clear() // Desc: clears all data from the view //------------------------------------------------------------------------------ void QHexView::clear() { if(m_Data != 0) { m_Data->clear(); } repaint(); } //------------------------------------------------------------------------------ // Name: hasSelectedText() const // Desc: returns true if any text is selected //------------------------------------------------------------------------------ bool QHexView::hasSelectedText() const { return !(m_SelectionStart == -1 || m_SelectionEnd == -1); } //------------------------------------------------------------------------------ // Name: isInViewableArea(int index) const // Desc: returns true if the word at the given index is in the viewable area //------------------------------------------------------------------------------ bool QHexView::isInViewableArea(int index) const { const int firstViewableWord = verticalScrollBar()->value() * m_RowWidth; const int viewableLines = viewport()->height() / m_FontHeight; const int viewableWords = viewableLines * m_RowWidth; const int lastViewableWord = firstViewableWord + viewableWords; return index >= firstViewableWord && index < lastViewableWord; } //------------------------------------------------------------------------------ // Name: keyPressEvent(QKeyEvent *event) // Desc: //------------------------------------------------------------------------------ void QHexView::keyPressEvent(QKeyEvent *event) { if(event->modifiers() & Qt::ControlModifier) { switch(event->key()) { case Qt::Key_A: selectAll(); repaint(); break; case Qt::Key_Home: scrollTo(0); break; case Qt::Key_End: scrollTo(dataSize() - bytesPerRow()); break; case Qt::Key_Down: do { int offset = verticalScrollBar()->value() * bytesPerRow(); if(m_Origin != 0) { if(offset > 0) { offset += m_Origin; offset -= bytesPerRow(); } } if(offset + 1 < dataSize()) { scrollTo(offset + 1); } } while(0); // return so we don't pass on the key event return; case Qt::Key_Up: do { int offset = verticalScrollBar()->value() * bytesPerRow(); if(m_Origin != 0) { if(offset > 0) { offset += m_Origin; offset -= bytesPerRow(); } } if(offset > 0) { scrollTo(offset - 1); } } while(0); // return so we don't pass on the key event return; } } QAbstractScrollArea::keyPressEvent(event); } //------------------------------------------------------------------------------ // Name: isPrintable(unsigned int ch) // Desc: determines if a character has a printable ascii symbol //------------------------------------------------------------------------------ bool QHexView::isPrintable(unsigned int ch) { // if it's standard ascii use isprint, otherwise go with our observations if(ch < 128) { // return safe_ctype(ch); return std::isprint(ch); } else { return (ch & 0xff) >= 0xa0; } } //------------------------------------------------------------------------------ // Name: line3() const // Desc: returns the x coordinate of the 3rd line //------------------------------------------------------------------------------ int QHexView::line3() const { if(m_ShowAscii) { const int elements = bytesPerRow(); return asciiDumpLeft() + (elements * m_FontWidth) + (m_FontWidth / 2); } else { return line2(); } } //------------------------------------------------------------------------------ // Name: line2() const // Desc: returns the x coordinate of the 2nd line //------------------------------------------------------------------------------ int QHexView::line2() const { if(m_ShowHex) { const int elements = m_RowWidth * (charsPerWord() + 1) - 1; return hexDumpLeft() + (elements * m_FontWidth) + (m_FontWidth / 2); } else { return line1(); } } //------------------------------------------------------------------------------ // Name: line1() const // Desc: returns the x coordinate of the 1st line //------------------------------------------------------------------------------ int QHexView::line1() const { if(m_ShowAddress) { const int elements = addressLen(); return (elements * m_FontWidth) + (m_FontWidth / 2); } else { return 0; } } //------------------------------------------------------------------------------ // Name: hexDumpLeft() const // Desc: returns the x coordinate of the hex-dump field left edge //------------------------------------------------------------------------------ int QHexView::hexDumpLeft() const { return line1() + (m_FontWidth / 2); } //------------------------------------------------------------------------------ // Name: asciiDumpLeft() const // Desc: returns the x coordinate of the ascii-dump field left edge //------------------------------------------------------------------------------ int QHexView::asciiDumpLeft() const { return line2() + (m_FontWidth / 2); } //------------------------------------------------------------------------------ // Name: commentLeft() const // Desc: returns the x coordinate of the comment field left edge //------------------------------------------------------------------------------ int QHexView::commentLeft() const { return line3() + (m_FontWidth / 2); } //------------------------------------------------------------------------------ // Name: charsPerWord() const // Desc: returns how many characters each word takes up //------------------------------------------------------------------------------ unsigned int QHexView::charsPerWord() const { return m_WordWidth * 2; } //------------------------------------------------------------------------------ // Name: addressLen() const // Desc: returns the lenth in characters the address will take up //------------------------------------------------------------------------------ unsigned int QHexView::addressLen() const { static const unsigned int addressLength = (sizeof(address_t) * CHAR_BIT) / 4; return addressLength + (m_ShowAddressSeparator ? 1 : 0); } //------------------------------------------------------------------------------ // Name: updateScrollbars() // Desc: recalculates scrollbar maximum value base on lines total and lines viewable //------------------------------------------------------------------------------ void QHexView::updateScrollbars() { const unsigned int totalLines = dataSize() / bytesPerRow(); const unsigned int viewableLines = viewport()->height() / m_FontHeight; unsigned int scrollMax = (totalLines > viewableLines) ? totalLines - 1 : 0; if(m_Origin != 0) { ++scrollMax; } verticalScrollBar()->setMaximum(scrollMax); } //------------------------------------------------------------------------------ // Name: scrollTo(unsigned int offset) // Desc: scrolls view to given byte offset //------------------------------------------------------------------------------ void QHexView::scrollTo(unsigned int offset) { const int bpr = bytesPerRow(); m_Origin = offset % bpr; address_t address = offset / bpr; updateScrollbars(); if(m_Origin != 0) { ++address; } verticalScrollBar()->setValue(address); repaint(); } //------------------------------------------------------------------------------ // Name: setShowAddress(bool show) // Desc: sets if we are to display the address column //------------------------------------------------------------------------------ void QHexView::setShowAddress(bool show) { m_ShowAddress = show; repaint(); } //------------------------------------------------------------------------------ // Name: setShowHexDump(bool show) // Desc: sets if we are to display the hex-dump column //------------------------------------------------------------------------------ void QHexView::setShowHexDump(bool show) { m_ShowHex = show; repaint(); } //------------------------------------------------------------------------------ // Name: setShowComments(bool show) // Desc: sets if we are to display the comments column //------------------------------------------------------------------------------ void QHexView::setShowComments(bool show) { m_ShowComments = show; repaint(); } //------------------------------------------------------------------------------ // Name: setShowAsciiDump(bool show) // Desc: sets if we are to display the ascii-dump column //------------------------------------------------------------------------------ void QHexView::setShowAsciiDump(bool show) { m_ShowAscii = show; repaint(); } //------------------------------------------------------------------------------ // Name: setRowWidth(int rowWidth) // Desc: sets the row width (units is words) //------------------------------------------------------------------------------ void QHexView::setRowWidth(int rowWidth) { m_RowWidth = rowWidth; updateScrollbars(); repaint(); } //------------------------------------------------------------------------------ // Name: setWordWidth(int wordWidth) // Desc: sets how many bytes represent a word //------------------------------------------------------------------------------ void QHexView::setWordWidth(int wordWidth) { m_WordWidth = wordWidth; updateScrollbars(); repaint(); } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ unsigned int QHexView::bytesPerRow() const { return m_RowWidth * m_WordWidth; } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ int QHexView::pixelToWord(int x, int y) const { int word = -1; switch(m_Highlighting) { case Highlighting_Data: // the right edge of a box is kinda quirky, so we pretend there is one // extra character there x = qBound(line1(), x, line2() + m_FontWidth); // the selection is in the data view portion x -= line1(); // scale x/y down to character from pixels x /= m_FontWidth; y /= m_FontHeight; // make x relative to rendering mode of the bytes x /= (charsPerWord() + 1); break; case Highlighting_Ascii: x = qBound(asciiDumpLeft(), x, line3()); // the selection is in the ascii view portion x -= asciiDumpLeft(); // scale x/y down to character from pixels x /= m_FontWidth; y /= m_FontHeight; // make x relative to rendering mode of the bytes x /= m_WordWidth; break; default: Q_ASSERT(0); break; } // starting offset in bytes unsigned int startOffset = verticalScrollBar()->value() * bytesPerRow(); // take into account the origin if(m_Origin != 0) { if(startOffset > 0) { startOffset += m_Origin; startOffset -= bytesPerRow(); } } // convert byte offset to word offset, rounding up startOffset /= m_WordWidth; if((m_Origin % m_WordWidth) != 0) { startOffset += 1; } word = ((y * m_RowWidth) + x) + startOffset; return word; } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ void QHexView::mouseDoubleClickEvent(QMouseEvent * event) { if(event->button() == Qt::LeftButton) { const int x = event->x(); const int y = event->y(); if(x >= line1() && x < line2()) { m_Highlighting = Highlighting_Data; const int offset = pixelToWord(x, y); int byteOffset = offset * m_WordWidth; if(m_Origin) { if(m_Origin % m_WordWidth) { byteOffset -= m_WordWidth - (m_Origin % m_WordWidth); } } m_SelectionStart = byteOffset; m_SelectionEnd = m_SelectionStart + m_WordWidth; repaint(); } } } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ void QHexView::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { const int x = event->x(); const int y = event->y(); if(x < line2()) { m_Highlighting = Highlighting_Data; } else if(x >= line2()) { m_Highlighting = Highlighting_Ascii; } const int offset = pixelToWord(x, y); int byteOffset = offset * m_WordWidth; if(m_Origin) { if(m_Origin % m_WordWidth) { byteOffset -= m_WordWidth - (m_Origin % m_WordWidth); } } if(offset < dataSize()) { m_SelectionStart = m_SelectionEnd = byteOffset; } else { m_SelectionStart = m_SelectionEnd = -1; } repaint(); } } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ void QHexView::mouseMoveEvent(QMouseEvent *event) { if(m_Highlighting != Highlighting_None) { const int x = event->x(); const int y = event->y(); const int offset = pixelToWord(x, y); if(m_SelectionStart != -1) { if(offset == -1) { m_SelectionEnd = (m_RowWidth - m_SelectionStart) + m_SelectionStart; } else { int byteOffset = (offset * m_WordWidth); if(m_Origin) { if(m_Origin % m_WordWidth) { byteOffset -= m_WordWidth - (m_Origin % m_WordWidth); } } m_SelectionEnd = byteOffset; } if(m_SelectionEnd < 0) { m_SelectionEnd = 0; } if(!isInViewableArea(m_SelectionEnd)) { // TODO: scroll to an appropriate location } } repaint(); } } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ void QHexView::mouseReleaseEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { m_Highlighting = Highlighting_None; } } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ void QHexView::setData(C *d) { m_Data = d; deselect(); updateScrollbars(); repaint(); } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ void QHexView::resizeEvent(QResizeEvent *) { updateScrollbars(); } //------------------------------------------------------------------------------ // Name: setAddressOffset(address_t offset) //------------------------------------------------------------------------------ void QHexView::setAddressOffset(address_t offset) { m_AddressOffset = offset; } //------------------------------------------------------------------------------ // Name: isSelected(int index) const //------------------------------------------------------------------------------ bool QHexView::isSelected(int index) const { bool ret = false; if(index < static_cast(dataSize())) { if(m_SelectionStart != m_SelectionEnd) { if(m_SelectionStart < m_SelectionEnd) { ret = (index >= m_SelectionStart && index < m_SelectionEnd); } else { ret = (index >= m_SelectionEnd && index < m_SelectionStart); } } } return ret; } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ void QHexView::drawComments(QPainter &painter, unsigned int offset, unsigned int row) const { painter.setPen(QPen(palette().text().color())); const address_t address = m_AddressOffset + offset; QString comment; // if(m_CommentServer != 0) { // comment = m_CommentServer->getComment(address, m_WordWidth); // } painter.drawText( commentLeft(), row, comment.length() * m_FontWidth, m_FontHeight, Qt::AlignTop, comment ); } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ void QHexView::drawHexDump(QPainter &painter, unsigned int offset, unsigned int row, int &wordCount) const { const C &dataRef(*m_Data); const int size = dataSize(); // i is the word we are currently rendering for(int i = 0; i < m_RowWidth; ++i) { // index of first byte of current "word" const int index = offset + (i * m_WordWidth); // equal <=, not < because we want to test the END of the word we // about to render, not the start, it's allowed to end at the very last // byte if(index + m_WordWidth <= size) { union { quint64 q; quint32 d; quint16 w; quint8 b; } value = { 0 }; QString byteBuffer; switch(m_WordWidth) { case 1: value.b |= dataRef[index + 0]; byteBuffer.sprintf("%02x", value.b); break; case 2: value.w |= dataRef[index + 0]; value.w |= dataRef[index + 1] << 8; byteBuffer.sprintf("%04x", value.w); break; case 4: value.d |= dataRef[index + 0]; value.d |= dataRef[index + 1] << 8; value.d |= dataRef[index + 2] << 16; value.d |= dataRef[index + 3] << 24; byteBuffer.sprintf("%08x", value.d); break; case 8: // we need the cast to ensure that it won't assume 32-bit // and drop bits shifted more that 31 value.q |= static_cast(dataRef[index + 0]); value.q |= static_cast(dataRef[index + 1]) << 8; value.q |= static_cast(dataRef[index + 2]) << 16; value.q |= static_cast(dataRef[index + 3]) << 24; value.q |= static_cast(dataRef[index + 4]) << 32; value.q |= static_cast(dataRef[index + 5]) << 40; value.q |= static_cast(dataRef[index + 6]) << 48; value.q |= static_cast(dataRef[index + 7]) << 56; byteBuffer.sprintf("%016llx", value.q); break; } const int drawLeft = hexDumpLeft() + (i * (charsPerWord() + 1) * m_FontWidth); if(isSelected(index)) { painter.fillRect( drawLeft, row, charsPerWord() * m_FontWidth, m_FontHeight, palette().highlight() ); // should be highlight the space between us and the next word? if(i != (m_RowWidth - 1)) { if(isSelected(index + 1)) { painter.fillRect( drawLeft + m_FontWidth, row, charsPerWord() * m_FontWidth, m_FontHeight, palette().highlight() ); } } painter.setPen(QPen(palette().highlightedText().color())); } else { painter.setPen(QPen((wordCount & 1) ? m_EvenWord : palette().text().color())); } painter.drawText( drawLeft, row, byteBuffer.length() * m_FontWidth, m_FontHeight, Qt::AlignTop, byteBuffer ); ++wordCount; } else { break; } } } //------------------------------------------------------------------------------ // Name: drawAsciiDump(QPainter &painter, unsigned int offset, unsigned int row) const //------------------------------------------------------------------------------ void QHexView::drawAsciiDump(QPainter &painter, unsigned int offset, unsigned int row) const { const C &dataRef(*m_Data); const int size = dataSize(); // i is the byte index const int charsPerRow = bytesPerRow(); for(int i = 0; i < charsPerRow; ++i) { const int index = offset + i; if(index < size) { const char ch = dataRef[index]; const int drawLeft = asciiDumpLeft() + i * m_FontWidth; const bool printable = isPrintable(ch); // drawing a selected character if(isSelected(index)) { painter.fillRect( drawLeft, row, m_FontWidth, m_FontHeight, palette().highlight() ); painter.setPen(QPen(palette().highlightedText().color())); } else { painter.setPen(QPen(printable ? palette().text().color() : m_NonPrintableText)); } const QString byteBuffer(printable ? ch : m_UnprintableChar); painter.drawText( drawLeft, row, m_FontWidth, m_FontHeight, Qt::AlignTop, byteBuffer ); } else { break; } } } //------------------------------------------------------------------------------ // Name: paintEvent(QPaintEvent *) //------------------------------------------------------------------------------ void QHexView::paintEvent(QPaintEvent *) { QPainter painter(viewport()); int wordCount = 0; // pixel offset of this row unsigned int row = 0; // current actual offset (in bytes) unsigned int offset = verticalScrollBar()->value() * bytesPerRow(); if(m_Origin != 0) { if(offset > 0) { offset += m_Origin; offset -= bytesPerRow(); } else { m_Origin = 0; updateScrollbars(); } } while(row + m_FontHeight < static_cast(height()) && offset < static_cast(dataSize())) { if(m_ShowAddress) { const address_t addressRVA = m_AddressOffset + offset; const QString addressBuffer = formatAddress(addressRVA); painter.setPen(QPen(m_AddressColor)); painter.drawText(0, row, addressBuffer.length() * m_FontWidth, m_FontHeight, Qt::AlignTop, addressBuffer); } if(m_ShowHex) { drawHexDump(painter, offset, row, wordCount); } if(m_ShowAscii) { drawAsciiDump(painter, offset, row); } if(m_ShowComments) { drawComments(painter, offset, row); } offset += bytesPerRow(); row += m_FontHeight; } painter.setPen(QPen(palette().shadow().color())); if(m_ShowAddress && m_ShowLine1) { painter.drawLine(line1(), 0, line1(), height()); } if(m_ShowHex && m_ShowLine2) { painter.drawLine(line2(), 0, line2(), height()); } if(m_ShowAscii && m_ShowLine3) { painter.drawLine(line3(), 0, line3(), height()); } } //------------------------------------------------------------------------------ // Name: selectAll() //------------------------------------------------------------------------------ void QHexView::selectAll() { m_SelectionStart = 0; m_SelectionEnd = dataSize(); } //------------------------------------------------------------------------------ // Name: deselect() //------------------------------------------------------------------------------ void QHexView::deselect() { m_SelectionStart = -1; m_SelectionEnd = -1; } //------------------------------------------------------------------------------ // Name: allBytes() const //------------------------------------------------------------------------------ QByteArray QHexView::allBytes() const { QByteArray ret; const C &dataRef(*m_Data); const int size = dataSize(); for(int i = 0; i < size; ++i) { ret.push_back(dataRef[i]); } return ret; } //------------------------------------------------------------------------------ // Name: selectedBytes() const //------------------------------------------------------------------------------ QByteArray QHexView::selectedBytes() const { QByteArray ret; const C &dataRef(*m_Data); const int size = dataSize(); for(int i = 0; i < size; ++i) { if(isSelected(i)) { ret.push_back(dataRef[i]); } } return ret; } //------------------------------------------------------------------------------ // Name: selectedBytesAddress() const //------------------------------------------------------------------------------ QHexView::address_t QHexView::selectedBytesAddress() const { const address_t selectBase = qMin(m_SelectionStart, m_SelectionEnd); return selectBase + m_AddressOffset; } //------------------------------------------------------------------------------ // Name: selectedBytesSize() const //------------------------------------------------------------------------------ unsigned int QHexView::selectedBytesSize() const { unsigned int ret; if(m_SelectionEnd > m_SelectionStart) { ret = m_SelectionEnd - m_SelectionStart; } else { ret = m_SelectionStart - m_SelectionEnd; } return ret; } //------------------------------------------------------------------------------ // Name: addressOffset() const //------------------------------------------------------------------------------ QHexView::address_t QHexView::addressOffset() const { return m_AddressOffset; } //------------------------------------------------------------------------------ // Name: setCommentServer(CommentServerInterface *p) //------------------------------------------------------------------------------ void QHexView::setCommentServer(CommentServerInterface *p) { m_CommentServer = p; } //------------------------------------------------------------------------------ // Name: commentServer() const //------------------------------------------------------------------------------ CommentServerInterface *QHexView::commentServer() const { return m_CommentServer; } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ bool QHexView::showHexDump() const { return m_ShowHex; } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ bool QHexView::showAddress() const { return m_ShowAddress; } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ bool QHexView::showAsciiDump() const { return m_ShowAscii; } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ bool QHexView::showComments() const { return m_ShowComments; } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ int QHexView::wordWidth() const { return m_WordWidth; } //------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ int QHexView::rowWidth() const { return m_RowWidth; } fontmatrix-0.6.0+svn20110930/src/filterdata.cpp0000644000175000017500000001605611423011263017743 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "filterdata.h" #include "fmfontdb.h" #include "filteritem.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include FilterData::FilterData() { vData.clear(); // default operation vData.insert(Replace, false); vData.insert(Or, true); vData.insert(And, false); vData.insert(Not, false); } void FilterData::setData(int index, QVariant data, bool signalChange) { vData.insert(index, data); if(signalChange) emit Changed(); } QVariant FilterData::data(int index) const { return vData.value(index); } QString FilterData::getText() const { return vData.value(Text, QString("*")).toString(); } FilterItem* FilterData::item() { if(f.isNull()) f = new FilterItem(this); return f.data(); } void FilterData::operateFilter(QListfl) { QList sourceList = fl; QList notList; QList andList; bool notOp(vData[Not].toBool()); bool andOp(vData[And].toBool()); bool orOp(vData[Or].toBool()); FMFontDb* fmdb(FMFontDb::DB()); if(andOp) { andList = fmdb->getFilteredFonts(); } if(notOp) notList = fmdb->AllFonts(); if(!orOp) fmdb->clearFilteredFonts(); if(notOp) { if(andOp) { foreach(FontItem* f, notList) { if(!sourceList.contains(f) && andList.contains(f)) fmdb->insertFilteredFont(f); } } else { foreach(FontItem* f, notList) { if(!sourceList.contains(f)) fmdb->insertFilteredFont(f); } } } else // not notOp { if(andOp) { foreach(FontItem* f, sourceList) { if(andList.contains(f)) fmdb->insertFilteredFont(f); } } else { foreach(FontItem* f, sourceList) { fmdb->insertFilteredFont(f); } } } emit Operated(); } QByteArray FilterData::toByteArray() const { QByteArray ba; QDataStream ds(&ba, QIODevice::WriteOnly); foreach(int idx, vData.keys()) { QVariant::Type t(vData.value(idx).type()); QVariant v(vData[idx]); ds << idx << t; switch(t) { // We keep a large subset of supported types, but well, it's rather optimistic. case QVariant::BitArray : { ds << v.value(); break; } case QVariant::Bool : { ds << v.value(); break; } case QVariant::ByteArray : { ds << v.value(); break; } case QVariant::Char : { ds << v.value(); break; } case QVariant::Double : { ds << v.value(); break; } case QVariant::Icon : { ds << v.value(); break; } case QVariant::Image : { ds << v.value(); break; } case QVariant::Int : { ds << v.value(); break; } case QVariant::Locale : { ds << v.value(); break; } case QVariant::LongLong : { ds << v.value(); break; } case QVariant::Matrix : { ds << v.value(); break; } case QVariant::Transform : { ds << v.value(); break; } case QVariant::Pixmap : { ds << v.value(); break; } case QVariant::PointF : { ds << v.value(); break; } case QVariant::RectF : { ds << v.value(); break; } case QVariant::RegExp : { ds << v.value(); break; } case QVariant::SizeF : { ds << v.value(); break; } case QVariant::String : { ds << v.value(); break; } case QVariant::Time : { ds << v.value(); break; } case QVariant::UInt : { ds << v.value(); break; } case QVariant::ULongLong : { ds << v.value(); break; } case QVariant::Url : { ds << v.value(); break; } } } return ba; } void FilterData::fromByteArray(const QByteArray &ba) { QDataStream ds(ba); int idx(0); ds >> idx; while(idx != 0) { QVariant::Type t; ds >> t; QVariant v(t); switch(t) { case QVariant::BitArray : { QBitArray data; ds >> data ; v.setValue(data); break; } case QVariant::Bitmap : { QBitmap data; ds >> data ; v.setValue(data); break; } case QVariant::Bool : { bool data; ds >> data ; v.setValue(data); break; } case QVariant::ByteArray : { QByteArray data; ds >> data ; v.setValue(data); break; } case QVariant::Char : { QChar data; ds >> data ; v.setValue(data); break; } case QVariant::Double : { double data; ds >> data ; v.setValue(data); break; } case QVariant::Icon : { QIcon data; ds >> data ; v.setValue(data); break; } case QVariant::Image : { QImage data; ds >> data ; v.setValue(data); break; } case QVariant::Int : { int data; ds >> data ; v.setValue(data); break; } case QVariant::Locale : { QLocale data; ds >> data ; v.setValue(data); break; } case QVariant::LongLong : { qlonglong data; ds >> data ; v.setValue(data); break; } case QVariant::Matrix : { QMatrix data; ds >> data ; v.setValue(data); break; } case QVariant::Transform : { QTransform data; ds >> data ; v.setValue(data); break; } case QVariant::Pixmap : { QPixmap data; ds >> data ; v.setValue(data); break; } case QVariant::PointF : { QPointF data; ds >> data ; v.setValue(data); break; } case QVariant::RectF : { QRectF data; ds >> data ; v.setValue(data); break; } case QVariant::RegExp : { QRegExp data; ds >> data ; v.setValue(data); break; } case QVariant::SizeF : { QSizeF data; ds >> data ; v.setValue(data); break; } case QVariant::String : { QString data; ds >> data ; v.setValue(data); break; } case QVariant::Time : { QTime data; ds >> data ; v.setValue(data); break; } case QVariant::UInt : { uint data; ds >> data ; v.setValue(data); break; } case QVariant::ULongLong : { qulonglong data; ds >> data ; v.setValue(data); break; } case QVariant::Url : { QUrl data; ds >> data ; v.setValue(data); break; } } vData.insert(idx, v); ds >> idx; } } fontmatrix-0.6.0+svn20110930/src/filtertag.h0000644000175000017500000000314511420013425017244 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FILTERTAG_H #define FILTERTAG_H #include "filterdata.h" class FilterTag : public FilterData { public: FilterTag(); enum TagIndex{ Key = FilterData::UserIndex, Tag }; QString type() const; void operate(); }; #endif // FILTERTAG_H fontmatrix-0.6.0+svn20110930/src/fontitem.h0000644000175000017500000002667011450616562017136 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FONTITEM_H #define FONTITEM_H #include #include #include #include #include #include #include #include #include #include #include // #include #include #include #include #include #include FT_FREETYPE_H #include "fmsharestruct.h" class QGraphicsPixmapItem; class QGraphicsScene; class QGraphicsRectItem; class QGraphicsTextItem; struct OTFSet; class FMOtf; class QGraphicsView; class QGraphicsObject; class QProgressDialog; class QHttp; class QFile; #define PROGRESSION_LTR 0 #define PROGRESSION_RTL 2 #define PROGRESSION_TTB 4 #define PROGRESSION_BTT 8 #define GLYPH_DATA_GLYPH 1 #define GLYPH_DATA_BITMAPLEFT 2 #define GLYPH_DATA_BITMAPTOP 3 #define GLYPH_DATA_HADVANCE 4 #define GLYPH_DATA_VADVANCE 5 #define GLYPH_DATA_HADVANCE_SCALED 6 #define GLYPH_DATA_ERROR 7 #define GLYPH_DATA_FONTNAME 100 /** @author Pierre Marchand (reminder) glyph data -> 1 = index, 2 = charcode */ struct FontLocalInfo { QString file; QString family; QString variant; QString type; QString panose; // QMap > info; QStringList tags; QPixmap pix; }; class MetaGlyphItem : public QGraphicsItem { QMap m_Data; public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){} QRectF boundingRect() const {return QRectF();} void setMetaData(int key, const QVariant &value) { m_Data.insert(key,value); } QVariant metaData(int key) const { return m_Data.value(key); } }; class FontItem : public QObject { Q_OBJECT Q_PROPERTY(QString Family READ family) Q_PROPERTY(QString Variant READ variant) Q_PROPERTY(QString Path READ path) Q_PROPERTY(QStringList Tags READ tags WRITE setTags) Q_PROPERTY(bool OpenType READ isOpenType) Q_PROPERTY(bool Active READ isActivated WRITE setActivated) Q_PROPERTY(int GlyphsCount READ glyphsCount) public: enum FsType { NOT_RESTRICTED = 0x0000, RESTRICTED = 0x0002, PREVIEW_PRINT = 0x0004, EDIT_EMBED = 0x0008, NOSUBSET = 0x0100, BITMAP_ONLY = 0x0200 }; FontItem ( QString path , bool remote = false, bool faststart = false); FontItem (QString path, QString family, QString variant, QString type , bool active); FontItem * Clone(); /** Needed when the item has been instantiate with "faststart=true" */ void updateItem(); ~FontItem(); static QList legitimateNonPathChars; void fillLegitimateSpaces(); private: bool isUpToDate; bool m_valid; bool m_active; bool m_remote; bool remoteCached; QString remoteHerePath; bool stopperDownload; QHttp *rHttp; QFile *rFile; int remoteId; QProgressDialog *rProgressDialog; QString m_path; QUrl m_url; QString m_afm; QString m_name; // Basically, we collect all infos that are in an FT_FaceRec QString m_faceFlags; QString m_type; QString m_styleFlags; QString m_family; QString m_variant; QString m_fileSize; double m_size; int m_numGlyphs; int m_numFaces; // QString m_panose; double unitPerEm; QString getAlternateFamilyName(); QString getAlternateVariantName(); QList m_charsets; QList spaceIndex; bool m_isOpenType; FMOtf *otf; // FT_Library theLibrary; FT_Face m_face; FT_Face lastFace; FT_Error ft_error; // QMap faces; int facesRef; FT_GlyphSlot m_glyph; QImage glyphImage(QColor color = Qt::black); void fill256Palette(); void fillInvertedPalette(); bool m_rasterFreetype; unsigned int m_FTHintMode; // unsigned int m_FTRenderMode;not yet implemented bool ensureFace(); void releaseFace(); void encodeFace(); QList getAlternates(int ccode); QString panose(); QString testFlag ( long flag , long against, QString yes, QString no ); QByteArray pixarray ( uchar *b, int len ); QList pixList; QList glyphList; QList labList; QList selList; QMap fancyGlyphs; QMap fancyTexts; QMap > fancyAlternates; bool allIsRendered; bool isDerendered; int m_glyphsPerRow; bool m_isEncoded; bool m_unicodeBuiltIn; FT_Encoding m_currentEncoding; int currentChar; // bool m_RTL;// Right to Left // bool m_VertUD;// Vertical Up Down int m_progression; // bool m_lock; QMap advanceCache; // QIcon theOneLinePreviewIcon; // QPixmap theOneLinePreviewPixmap; static QGraphicsScene *theOneLineScene; FontInfoMap moreInfo_sfnt(); FontInfoMap moreInfo_type1(); // FontInfoMap moreInfo; // QMap panoseInfo; int m_shaperType; // if true return width, else return number of _chars_ consumed bool renderReturnWidth; private slots: void slotDownloadStart(int id); void slotDowloadProgress(int done, int total ); void slotDownloadEnd(int id, bool error ); void slotDownloadDone(bool error); void slotDownloadState(int state); signals: void dowloadFinished(); public slots: QString renderSVG(const QString& s, const double& size); int countCoverage ( int begin_code, int end_code ); bool hasCharcode(int cc); bool hasChars(const QString& s); int firstChar(); int lastChar(); int countChars(); int nextChar(int from, int offset = 1); unsigned short getNamedChar(const QString& name); QStringList getNames(); /// We prepare ejection of renderLine methods GlyphList glyphs(QString spec, double fsize); GlyphList glyphs(QString spec, double fsize, OTFSet set); GlyphList glyphs(QString spec, double fsize, QString script); // experiences go there void exploreKernFeature(); public: QString path() const {return m_path;} QString afm() const {return m_afm;} void setAfm ( QString apath ) {m_afm = apath;} QString faceFlags() const {return m_faceFlags;} QString family() const {return m_family;} QString variant() const {return m_variant;} QStringList tags() const ; int glyphsCount() const; QString type(){return m_type;} QStringList charmaps(); void setTags ( QStringList l ); void addTag(const QString &t); QString name(); QString fancyName() {return m_family + " " + m_variant;} QString infoGlyph ( int index, int code = 0 ); QString glyphName(int codepoint, bool codeIsChar = true); FontInfoMap rawInfo(); FontInfoMap moreInfo(); FsType getFsType(); QStringList supportedLangDeclaration(); double italicAngle(); // Return the length of a TT table int table(const QString& tableName); QByteArray tableData(const QString& tableName); // QString value ( QString k ); // QString panose( QString k ); double renderLine ( QGraphicsScene *scene, QString spec, QPointF origine, double lineWidth, double fsize, double zindex = 100.0); double renderLine ( OTFSet set, QGraphicsScene *scene, QString spec, QPointF origine, double lineWidth,double fsize); double renderLine ( QString script, QGraphicsScene *scene, QString spec, QPointF origine, double lineWidth,double fsize); QGraphicsPathItem* itemFromChar ( int charcode, double size ); QGraphicsPathItem* itemFromGindex ( int index, double size ); QGraphicsPixmapItem* itemFromCharPix ( int charcode, double size); QGraphicsPixmapItem* itemFromGindexPix ( int index, double size); // cant have qpixmap outside main thread and QGraphicsPixmapItem create at least a null one when instantiated MetaGlyphItem* itemFromGindexPix_mt ( int index, double size ); QImage charImage(int charcode, double size); QImage glyphImage(int index, double size); void renderAll ( QGraphicsScene *scene, int begin_code, int end_code ); //return count codes that remain int renderChart(QGraphicsScene *scene, int begin_code, int end_code ,double pwidth, double pheight); void deRenderAll(); //Return a ref that will be asked for destroy the element. -1 if failed int showFancyGlyph(QGraphicsView *view, int charcode, bool charcodeIsAGlyphIndex = false); void hideFancyGlyph(int ref); QString toElement(); QGraphicsPathItem* hasCodepointLoaded ( int code ); void trimSpacesIndex(); QString activationName(); QString activationAFMName(); // QIcon oneLinePreviewIcon ( QString oneline ); QPixmap oneLinePreviewPixmap ( QString oneline , QColor fg_color, QColor bg_color, int size_w = 0, int fsize = 0); void clearPreview(); bool isActivated() const; void setActivated ( bool act ); bool isLocal(); // Relative to fontactionwidget // void lock() {m_lock=true;}; // void unLock() {m_lock=false;}; // bool isLocked() {return m_lock;}; // int debug_size(); void adjustGlyphsPerRow ( int width ); bool isOpenType(){return m_isOpenType;} FMOtf *takeOTFInstance(); void releaseOTFInstance(FMOtf * rotf); // Returns a flat list of OT features QStringList features(); void setFTRaster(bool f){m_rasterFreetype = f;} bool rasterFreetype()const{return m_rasterFreetype;} void setProgression(int p){m_progression = p;} int progression()const{return m_progression;} // sfnt names // static void fillNamesMeaning(); // // static void fillPanoseMap(); static void fillFSftypeMap(); bool isValid(){return m_valid;} bool isRemote(){return m_remote;} bool isCached(){return remoteCached;} void fileRemote(QString family, QString variant, QString type, QString info, QPixmap pixmap); void fileLocal(QString family, QString variant, QString type, QString p); void fileLocal(FontLocalInfo); // retval : 1 => Ready; 2 => Wait ; ... int getFromNetwork(); void setShaperType ( int theValue ); int shaperType() const; void setRenderReturnWidth ( bool theValue ) { renderReturnWidth = theValue; } double getUnitPerEm(); void setFTHintMode ( unsigned int theValue ); unsigned int getFTHintMode() const; void dumpIntoDB(); bool getUnicodeBuiltIn() const; FT_Encoding getCurrentEncoding() const; double getUnitPerEm() const; QList< FT_Encoding > getCharsets() const; }; #endif fontmatrix-0.6.0+svn20110930/src/activationwidget.cpp0000644000175000017500000000605711431446461021204 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "activationwidget.h" #include "ui_activationwidget.h" #include "fmfontdb.h" #include "fmactivate.h" #include "fmactivationreport.h" #include "fontitem.h" #include "activationwidgetitem.h" #include "fmvariants.h" const QString ActivationWidget::Name = QObject::tr("Activation"); ActivationWidget::ActivationWidget(const QString& familyName, QWidget *parent) : FloatingWidget(familyName, Name, parent), family(familyName), ui(new Ui::ActivationWidget) { ui->setupUi(this); QList fl(FMVariants::Order(FMFontDb::DB()->FamilySet(family))); foreach(FontItem* f, fl) { ActivationWidgetItem * i(new ActivationWidgetItem(f->path(), this)); ui->listLayout->addWidget(i); items.append(i); connect(i, SIGNAL(fontStateChanged()), this, SIGNAL(familyStateChanged())); } connect(ui->activateAll, SIGNAL(clicked()), this, SLOT(slotActivate())); connect(ui->deactivateAll, SIGNAL(clicked()), this, SLOT(slotDeactivate())); } ActivationWidget::~ActivationWidget() { delete ui; } void ActivationWidget::changeEvent(QEvent *e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void ActivationWidget::slotActivate() { activateAll(true); } void ActivationWidget::slotDeactivate() { activateAll(false); } void ActivationWidget::activateAll(bool c) { FMActivate::getInstance()->errors(); FMActivate::getInstance()->activate(FMFontDb::DB()->FamilySet(family), c); QMap actErr(FMActivate::getInstance()->errors()); if(actErr.count() > 0) { FMActivationReport ar(this, actErr); ar.exec(); } foreach(ActivationWidgetItem *i, items) { i->changeState(c); } emit familyStateChanged(); } fontmatrix-0.6.0+svn20110930/src/fmactivationreport.h0000644000175000017500000000324711204344352021214 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FMACTIVATIONREPORT_H #define FMACTIVATIONREPORT_H #include "ui_activationreportdialog.h" #include class FMActivationReport : public QDialog, private Ui::ActivationReportDialog { public: FMActivationReport(QWidget * parent, const QMap& errorMap); }; #endif // FMACTIVATIONREPORT_H fontmatrix-0.6.0+svn20110930/src/sctextbrowser.h0000644000175000017500000000122511147562531020213 0ustar malexmalex/* For general Scribus (>=1.3.2) copyright and licensing information please refer to the COPYING file provided with the program. Following this notice may exist a copyright and/or license notice that predates the release of Scribus 1.3.2 for which a new license (GPL+exception) is in place. */ #ifndef SCTEXTBROWSER_H #define SCTEXTBROWSER_H // #include #include #include class ScTextBrowser : public QWebView { Q_OBJECT QUrl m_home; public: ScTextBrowser( QWidget * parent = 0 ); void setHome(const QUrl& h){m_home = h;} signals: void overLink(const QString &link); public slots: void home(); }; #endif fontmatrix-0.6.0+svn20110930/src/fmglyphsview.cpp0000644000175000017500000001115111412121675020346 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "fmglyphsview.h" #include #include #include #include #ifdef HAVE_QTOPENGL #include #endif FMGlyphsView::FMGlyphsView ( QWidget *parent ) : QGraphicsView ( parent ) { // There is just one instance and we want to identify it setObjectName ( "theglyphsview" ); #ifdef HAVE_QTOPENGL QGLFormat glfmt; glfmt.setSampleBuffers ( true ); QGLWidget *glwgt = new QGLWidget ( glfmt ); if ( glwgt->format().sampleBuffers() ) { setViewport ( glwgt ); qDebug() <<"opengl enabled - DirectRendering("<< glwgt->format().directRendering() <<") - SampleBuffers("<< glwgt->format().sampleBuffers() <<")"; } else { qDebug() <<"opengl disabled - DirectRendering("<< glwgt->format().directRendering() <<") - SampleBuffers("<< glwgt->format().sampleBuffers() <<")"; delete glwgt; } #endif setAlignment ( Qt::AlignLeft | Qt::AlignTop ); setHorizontalScrollBarPolicy ( Qt::ScrollBarAlwaysOff ); setBackgroundBrush ( Qt::white ); m_state = AllView; m_lock = false; m_oper = false; connect ( verticalScrollBar() , SIGNAL ( valueChanged ( int ) ), this, SLOT ( slotViewMoved ( int ) ) ); } FMGlyphsView::~FMGlyphsView() { } void FMGlyphsView::resizeEvent ( QResizeEvent * event ) { if ( m_state == SingleView ) emit pleaseUpdateSingle(); emit pleaseUpdateMe(); } void FMGlyphsView::showEvent ( QShowEvent * event ) { emit pleaseUpdateMe(); } void FMGlyphsView::mouseReleaseEvent ( QMouseEvent * e ) { // Basically, we just do the job, but legacy implementation // does something I can’t figure out that leads to segfault ?? if ( e->button() == Qt::LeftButton ) { QList gg = scene()->items ( mapToScene ( e->pos() ) ); foreach ( QGraphicsItem* ii, gg ) { if ( ii->data ( 1 ).toString() == "select" && m_state == AllView ) ii->setSelected ( true ); } if ( m_state == AllView ) emit pleaseShowSelected(); else if ( m_state == SingleView ) emit pleaseShowAll(); } } void FMGlyphsView::mousePressEvent ( QMouseEvent * e ) { // We just catch it to avoid a waeird segfault ... we’ll see later for a plain fix // if(e->button() == Qt::LeftButton) // QGraphicsView::mouseReleaseEvent(e); } void FMGlyphsView::setState ( ViewState s ) { if ( s == SingleView ) { setVerticalScrollBarPolicy ( Qt::ScrollBarAlwaysOff ); setFocusPolicy ( Qt::NoFocus ); } else if ( s == AllView ) { setVerticalScrollBarPolicy ( Qt::ScrollBarAsNeeded ); setFocusPolicy ( Qt::WheelFocus ); } m_state = s; } void FMGlyphsView::hideEvent ( QHideEvent * event ) { // if ( m_state == SingleView ) // emit pleaseShowAll(); } void FMGlyphsView::wheelEvent ( QWheelEvent * e ) { if ( m_state == AllView ) { QGraphicsView::wheelEvent ( e ); } } QRectF FMGlyphsView::visibleSceneRect() { QRectF rr ( mapToScene ( 0.0, 0.0, static_cast ( width() ), static_cast ( height() ) ).boundingRect() ); return rr; } void FMGlyphsView::slotViewMoved ( int v ) { if ( m_state == AllView ) emit pleaseUpdateMe(); } void FMGlyphsView::keyPressEvent ( QKeyEvent * e ) { if ( m_state == AllView ) QAbstractScrollArea::keyPressEvent ( e ); } bool FMGlyphsView::lock() { if ( m_lock ) return false; m_lock = true; return true; } void FMGlyphsView::unlock() { m_lock = false; } fontmatrix-0.6.0+svn20110930/src/listsdock.ui0000644000175000017500000003710111407657061017466 0ustar malexmalex ListDock 0 0 447 723 0 0 true Form :/fontmatrix_icon.png:/fontmatrix_icon.png 3 0 Qt::Vertical 3 0 0 0 64 0 16000 16777215 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want to negate the filter,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prefix the word with "!" such as in:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">"!pattern"</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want to enqueue the filter,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prefix it with "+".</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally, you can mix negate and queue in:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">"+!pattern"</span> or "!+pattern"</p></body></html> F QToolButton::InstantPopup Qt::ToolButtonTextBesideIcon true Qt::NoArrow 0 0 0 3 0 Qt::DefaultContextMenu Filter view by chosing tag QComboBox::AdjustToContentsOnFirstShow false 2 0 0 0 Not And 0 0 16777215 100 Show complete collection of available fonts reset 16 16 false false 2 0 QFrame::StyledPanel QFrame::Plain TextLabel viewAllButton 0 0 save 0 5 Qt::NoContextMenu true 0 Names Qt::Vertical 0 3 9 ArrowCursor Qt::StrongFocus true false QFrame::StyledPanel QFrame::Sunken 1 QAbstractItemView::DropOnly true QAbstractItemView::NoSelection Qt::ElideRight 1 1 Names 0 Collapse or expand QToolButton::InstantPopup Qt::ToolButtonTextOnly Qt::UpArrow Show face boxes true Qt::Horizontal 40 20 Folders 4 2 FMNameList QTreeWidget
fmnamelist.h
fontmatrix-0.6.0+svn20110930/src/filtertag.cpp0000644000175000017500000000353611420013425017603 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "filtertag.h" #include "filteritem.h" #include "fmfontdb.h" FilterTag::FilterTag(): FilterData() { } QString FilterTag::type() const { return QString("Tag"); } void FilterTag::operate() { QString key(vData.value(Key).toString()); QString tag(vData.value(Tag).toString()); if(key == "TAG") // regular tag { operateFilter( FMFontDb::DB()->Fonts(tag, FMFontDb::Tags ) ); } else if(key == "ALL_ACTIVATED") { operateFilter( FMFontDb::DB()->Fonts(1, FMFontDb::Activation ) ); } } fontmatrix-0.6.0+svn20110930/src/importtags.ui0000644000175000017500000000415511015467641017661 0ustar malexmalex ImportTagsDialog 0 0 402 320 Fontmatrix - Tags :/fontmatrix_tags.png:/fontmatrix_tags.png QFrame::Panel :/fontmatrix_tags_graphic.png false Add Qt::Horizontal Qt::Horizontal 40 20 Ok fontmatrix-0.6.0+svn20110930/src/importedfontsdialog.cpp0000644000175000017500000000454111007416332021701 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "importedfontsdialog.h" #include #include "typotek.h" ImportedFontsDialog::ImportedFontsDialog(QWidget * parent, QStringList fontlist) : QDialog(parent) { setupUi(this); // fontList->addItems(fontlist); int buggyFonts = 0; for(int i=0; i < fontlist.count();++i) { QString s(fontlist[i]); bool success = true; if(s.startsWith("__FAILEDTOLOAD__", Qt::CaseSensitive)) { success = false; s = s.mid(16) + tr(" (not loaded)"); ++buggyFonts; } QListWidgetItem *it=new QListWidgetItem(s); it->setTextColor(success ? Qt::black : Qt::red); fontList->addItem(it); } label->setText(tr("Number of Imported Fonts ") + QString::number(fontList->count() - buggyFonts)); dontShowBox->setChecked(false); connect(dontShowBox, SIGNAL(stateChanged(int)),typotek::getInstance(), SLOT(showImportedFonts(int))); } ImportedFontsDialog::~ImportedFontsDialog() { disconnect(dontShowBox, SIGNAL(stateChanged(int)),typotek::getInstance(), SLOT(showImportedFonts(int))); } fontmatrix-0.6.0+svn20110930/src/tttableview.h0000644000175000017500000000133011160442441017614 0ustar malexmalex// // C++ Interface: tttableview // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef TTTABLEVIEW_H #define TTTABLEVIEW_H #include "ui_tttablewidget.h" class FontItem; class QTreeWidgetItem; class TTTableView : public QWidget, private Ui::TTTableWidget { Q_OBJECT enum Tfield_p{ NAME = 0, DESCRIPTION = 1, SIZE = 2 }; FontItem * m_font; QList twiList; QVector m_data; public: TTTableView(FontItem * font, QWidget * parent = 0); ~TTTableView(); private: QByteArray curTable; private slots: void updateHexView(); void exportHex(); }; #endif fontmatrix-0.6.0+svn20110930/src/helpbrowser.h0000644000175000017500000001345311147562531017637 0ustar malexmalex/* For general Scribus (>=1.3.2) copyright and licensing information please refer to the COPYING file provided with the program. Following this notice may exist a copyright and/or license notice that predates the release of Scribus 1.3.2 for which a new license (GPL+exception) is in place. */ /*************************************************************************** * Copyright (C) 2004 by Craig Bradney * * cbradney@zip.com.au * * Copyright (C) 2005 by Petr Vanek * * petr@yarpen.cz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef HELPBROWSER_H #define HELPBROWSER_H #include #include #include #include #include #include #include #include #include #include #include #include class QEvent; class ScHelpTreeModel; #include "ui_helpbrowser.h" //! \brief A structure holding title/file url reference. struct histd2 { QString url; QString title; }; class HelpBrowser : public QMainWindow, Ui::HelpBrowser { Q_OBJECT public: HelpBrowser(QWidget* parent); HelpBrowser(QWidget* parent, const QString& caption, const QString& guiLangage="en", const QString& jumpToSection="", const QString& jumpToFile=""); ~HelpBrowser(); virtual void changeEvent(QEvent *e); /*! \brief History menu. It's public because of history reader - separate class */ QMenu* histMenu; /*! \brief Mapping the documents for history. */ QMap mHistory; /*! \brief Set text to the browser \param str a QString with text (html) */ void setText(const QString& str); static bool firstRun; protected: void closeEvent(QCloseEvent * event); void setupLocalUI(); /*! \brief Reads saved bookmarks from external file */ void readBookmarks(); /*! \brief Search in doc files in spec. dir. It uses directory-recursion. I hope that the documentation will have only 2-3 level dir structure so it doesn't matter. \author Petr Vanek */ void searchingInDirectory(const QString&); /*! \brief Reads saved history of browsing. */ void readHistory(); /*! \brief Tell the user there is no help available */ void displayNoHelp(); QMenu* fileMenu; QMenu* editMenu; QMenu* bookMenu; QAction* filePrint; QAction* fileExit; QAction* editFind; QAction* editFindNext; QAction* editFindPrev; QAction* bookAdd; QAction* bookDel; QAction* bookDelAll; QAction* goHome; QAction* goBack; QAction* goFwd; //! \brief Selected language is here. If there is no docs for this language, "en" is used. QString language; //! \brief QString holding location of menu.xml we are using, we load the help files from here QString finalBaseDir; /*! \brief Text to be found in document */ QString findText; ScHelpTreeModel* menuModel; QMap quickHelpIndex; QMap > bookmarkIndex; protected slots: virtual void languageChange(); void histChosen(QAction* i); void jumpToHelpSection(const QString& jumpToSection, const QString& jumpToFile=""); void loadHelp(const QString& filename); void loadMenu(); void showLinkContents(const QString &link); QString bookmarkFile(); QString historyFile(); /*! \brief Load doc file when user select filename in content view. */ void itemSelected(const QItemSelection & selected, const QItemSelection & deselected); /*! \brief Load doc file when user select filename in search view. */ void itemSearchSelected(QTreeWidgetItem *, int); /*! \brief Load doc file when user select filename in bookmark view. */ void itemBookmarkSelected(QTreeWidgetItem *, int); /*! \brief Performs searching in documentation. It walks through installed documentation and searching in all text files \author Petr Vanek */ void searchingButton_clicked(); /*! \brief Find text in one document. Classical ctrl+f searching. \author Petr Vanek */ void find(); /*! \brief Find next occurences of the text in one document. \author Petr Vanek */ void findNext(); /*! \brief Find previous occurences of the text in one document. \author Petr Vanek */ void findPrevious(); /*! \brief Print the documentation. Based on the Qt example. */ void print(); /*! \brief Add document into bookmarks. */ void bookmarkButton_clicked(); /*! \brief Delete selected document from bookmarks. */ void deleteBookmarkButton_clicked(); /*! \brief Delete all bookmarks */ void deleteAllBookmarkButton_clicked(); signals: void closed(); }; #endif // HELPBROWSER_H fontmatrix-0.6.0+svn20110930/src/shortcuts.cpp0000644000175000017500000000616211111756471017672 0ustar malexmalex/*************************************************************************** * Copyright (C) 2008 by Riku Leino * * riku@scribus.info * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "shortcuts.h" #include Shortcuts* Shortcuts::instance = 0; Shortcuts::Shortcuts() { } Shortcuts* Shortcuts::getInstance() { if (instance == 0) instance = new Shortcuts(); return instance; } void Shortcuts::add(QAction *a) { if (actions.contains(cleanName(a))) return; QString key = settingsKey(a); if (settings.contains(key)) a->setShortcut(QKeySequence(settings.value(key).toString())); actions[cleanName(a)] = a; } QList Shortcuts::getActions() { return actions.values(); } QString Shortcuts::settingsKey(QAction *action) { return QString("ActionShortcut/%1").arg(cleanName(action)); } QString Shortcuts::cleanName(QAction *action) { return cleanName(action->text()); } QString Shortcuts::cleanName(const QString &s) { QString h = s; return h.remove("&"); } QString Shortcuts::isReserved(const QString &shortcut, const QString &actionText) { QString isTaken = QString::null; if (actions.contains(cleanName(actionText))) { QList alist = actions.values(); foreach(QAction *act, alist) { if (act->shortcut() == shortcut) { isTaken = act->text(); break; } } } return isTaken; } void Shortcuts::setShortcut(const QString &shortcut, const QString &actionText) { if (actions.contains(cleanName(actionText))) { actions[cleanName(actionText)]->setShortcut(shortcut); settings.setValue(settingsKey(actions[cleanName(actionText)]), shortcut); } } void Shortcuts::clearShortcut(const QString &actionText) { if (actions.contains(cleanName(actionText))) { actions[cleanName(actionText)]->setShortcut(QString("")); settings.setValue(settingsKey(actions[cleanName(actionText)]), QString("")); } } Shortcuts::~Shortcuts() { } fontmatrix-0.6.0+svn20110930/src/fmaltcontext.h0000644000175000017500000001076311204063022017775 0ustar malexmalex// // C++ Interface: fmaltcontext // // Description: Maintains state of user defined alternate glyphs in specific context // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMALTCONTEXT_H #define FMALTCONTEXT_H #include #include #include #include class FMAltContext { int runPar; int runWord; int runChunk; /** We store lists of alternates at the glyph level in the intermediate form of the text Text ----> Paragraph ----> Word ----> Chunk (as returned by hyphenator, and actually sent to OT processor) ----> Glyph ----> List */ // alternate lists QMap > > > > m_alt; // base glyph QMap > > > m_control; // selected glyph (indexOf, 0 by default) QMap > > > m_select; // actual words QMap > m_words; // actual chunks QMap > > m_chunks; struct run { int par; int word; int chunk; }; QList runStore; public: QString fontID; QString textID; FMAltContext():runPar(0),runWord(0),runChunk(0){} // void reset() // { // m_alt.clear(); // m_control.clear(); // m_select.clear(); // // runChunk = 0; // runPar = 0; // runWord = 0; // } void saveRun(){run r;r.chunk = runChunk;r.par = runPar; r.word = runWord; runStore << r;} void restoreRun(){run r = runStore.takeLast(); runPar = r.par;runWord = r.word; runChunk = r.chunk;} int maxPar(){return m_alt.count();} int maxWord(){return m_alt[runPar].count();} int maxChunk(){return m_alt[runPar][runWord].count();} int maxGlyph(){return m_alt[runPar][runWord][runChunk].count();} int maxAlt(const int& gIdx){return m_alt[runPar][runWord][runChunk][gIdx].count();} void setPar(const int& p = 0){runPar = p;} int par() const {return runPar;} void setWord(const int& w = 0){runWord = w;} int word() const{return runWord;} void setChunk(const int& c = 0){runChunk = c;} int chunk() const{return runChunk;} void addAlt(const int& gIndex, const int& gAlt) { if(!m_alt[runPar][runWord][runChunk][gIndex].contains(gAlt)) m_alt[runPar][runWord][runChunk][gIndex].append(gAlt); } QList alts(const int& gIndex) const { return m_alt[runPar][runWord][runChunk][gIndex]; } void setControl(const int& gIndex, const int& c){ m_control[runPar][runWord][runChunk][gIndex] = c; } int control(const int& gIndex) const {return m_control[runPar][runWord][runChunk][gIndex];} void setSelect(const int& gIndex, const int& s){ m_select[runPar][runWord][runChunk][gIndex] = s; } int select(const int& gIndex) const { return m_select[runPar][runWord][runChunk][gIndex]; } void fileWord(const QString& s){m_words[runPar][runWord] = s;} QString wordString()const{return m_words[runPar][runWord];} void fileChunk(const QString& s){m_chunks[runPar][runWord][runChunk] = s;} QString chunkString()const{return m_chunks[runPar][runWord][runChunk];} void cleanup() { QMap > > > > t_alt; QMap > > > t_control; QMap > > > t_select; QMap > t_words; QMap > > t_chunks; for(int p(0);p < m_alt.count(); ++p) { for(int w(0);w < m_alt[p].count(); ++w) { for(int c(0);c < m_alt[p][w].count(); ++c) { for(int g(0);g < m_alt[p][w][c].count(); ++g) { if(m_alt[p][w][c][g].count()) { t_alt[p][w][c][g] = m_alt[p][w][c][g]; t_control[p][w][c][g] = m_control[p][w][c][g]; t_select[p][w][c][g] = m_select[p][w][c][g]; t_words[p][w] = m_words[p][w]; t_chunks[p][w][c] = m_chunks[p][w][c]; } } } } } m_alt = t_alt; m_control = t_control; m_select = t_select; m_words = t_words; m_chunks = t_chunks; } }; class FMAltContextLib : private QObject { Q_OBJECT static FMAltContextLib * instance; static FMAltContextLib * that(); FMAltContextLib(); ~FMAltContextLib(); QMap cmap; QString current; public: static FMAltContext * SetCurrentContext(const QString& tid, const QString& font); static FMAltContext * GetCurrentContext(); static void GetConnected(const QObject * receiver, const char * method); signals: void contextChanged(); }; #endif // FMALTCONTEXT_H fontmatrix-0.6.0+svn20110930/src/fmnamelist.cpp0000644000175000017500000000732111217731442017767 0ustar malexmalex// // C++ Implementation: fmnamelist // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fmnamelist.h" #include #include #include FMNameList::FMNameList(QWidget * parent) :QTreeWidget(parent) , m_waitKey (2000 /*ms*/) { } FMNameList::~ FMNameList() { } void FMNameList::keyPressEvent(QKeyEvent * e) { if(e->text().isEmpty()) return; int t(m_keyTime.elapsed()); // qDebug()<<"FMNameList::keyPressEvent"< m_waitKey) ) { m_keyString = e->text().toUpper(); QTreeWidgetItem *item = 0; for(int i(0); i < topLevelItemCount() ; ++i) { item = topLevelItem(i); if(item->data(0,100).toString() == "alpha" && item->text(0) == m_keyString) { scrollToItem(item, QAbstractItemView::PositionAtTop); m_keyTime.start(); return; } } } else if(t < m_waitKey) { m_keyString += e->text().toUpper(); int tli(topLevelItemCount()); for(int i(0); i < tli ; ++i) { QTreeWidgetItem * TL(topLevelItem(i)); for(int family(0); family < TL->childCount(); ++family) { if( TL->child(family)->text(0).toUpper().startsWith(m_keyString) ) { scrollToItem(TL->child(family) , QAbstractItemView::PositionAtTop); m_keyTime.start(); return; } } } } else { m_keyString.clear(); } } void FMNameList::slotNextFamily() { if (!findBelow(currentItem(), "family")) { /* Goto first family on the list */ findBelow(topLevelItem(0), "family"); } } void FMNameList::slotPreviousFamily() { if (!findAbove(currentItem(), "family")) { /*TODO Goto last family on the list */ } } void FMNameList::slotNextFont() { if (!findBelow(currentItem(), "fontfile")) { /*Goto first font on the list */ findBelow(topLevelItem(0), "fontfile"); } } void FMNameList::slotPreviousFont() { if (!findAbove(currentItem(), "fontfile")) { /*TODO Goto last font on the list! */ } } bool FMNameList::findAbove(QTreeWidgetItem *current, const QString &role) { QTreeWidgetItem *above = current; if (current) { setCurrentItem(current); above = itemAbove(current); if (!above) return false; if (!above->isExpanded()) above->setExpanded(true); while (above->data ( 0,100 ).toString() != role) { above = itemAbove(above); if (!above) break; else { if (!above->isExpanded()) above->setExpanded(true); } } } if (above) { setCurrentItem(above); emit currentChanged(above, 0); return true; } else return false; } bool FMNameList::findBelow(QTreeWidgetItem *current, const QString &role) { QTreeWidgetItem *below = current; if (current) { setCurrentItem(current); below = itemBelow(current); if (!below) return false; if (!below->isExpanded()) below->setExpanded(true); while (below->data ( 0,100 ).toString() != role) { below = itemBelow(below); if (!below) break; else { if (!below->isExpanded()) below->setExpanded(true); } } } if (below) { setCurrentItem(below); emit currentChanged(below, 0); return true; } else return false; } bool FMNameList::slotSetCurrent(const QString & fname) { // qDebug()<<"FMNameList::slotSetCurrent"<childCount(); ++family) { for(int face(0); face < TL->child(family)->childCount(); ++face) { QTreeWidgetItem * F( TL->child(family)->child(face) ); if(F->toolTip(0) == fname) { setCurrentItem(F); emit currentChanged(F,0); return true; } } } } return false; } fontmatrix-0.6.0+svn20110930/src/fontmatrixshaper.h0000644000175000017500000000100011014251162020646 0ustar malexmalex// // C++ Interface: fontmatrixshaper // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FONTMATRIXSHAPER_H #define FONTMATRIXSHAPER_H #include "fmbaseshaper.h" #include "fmshaper_own.h" class FontmatrixShaper : public FMBaseShaper { public: FontmatrixShaper(FMOtf* o, QString s); ~FontmatrixShaper(); GlyphList doShape( const QString& s ); private: FMOwnShaper *fmos; }; #endif fontmatrix-0.6.0+svn20110930/src/tttablewidget.ui0000644000175000017500000000543311163316645020334 0ustar malexmalex TTTableWidget 0 0 525 457 TrueType tables display TrueType Tables Qt::Vertical 3 Tag Description Size 0 3 0 QFrame::StyledPanel QFrame::Raised Qt::Vertical 20 64 &Export QHexView QFrame
QHexView.h
1
fontmatrix-0.6.0+svn20110930/src/textprogression.h0000644000175000017500000000131111445710452020546 0ustar malexmalex// // C++ Interface: textprogression // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef TEXTPROGRESSION_H #define TEXTPROGRESSION_H //#include "ui_textprogression.h" class TextProgression { public: enum Progression {INLINE_LTR, INLINE_RTL, INLINE_TTB, INLINE_BTT, BLOCK_TTB, BLOCK_LTR, BLOCK_RTL, UNDEFINED}; TextProgression(); Progression inBlock(); Progression inLine(); static TextProgression* getInstance(){return instance;} private: static TextProgression *instance; // signals: // void stateChanged(); // private slots: // void forwardStateChanged(); }; #endif fontmatrix-0.6.0+svn20110930/src/fmmatchraster.cpp0000644000175000017500000001757211404170477020504 0ustar malexmalex// // C++ Implementation: fmmatchraster // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #include "puzzleviewimp.h" #include "fmmatchraster.h" #include "typotek.h" #include "mainviewwidget.h" #include "fontitem.h" #include "fmfontdb.h" #include #include #include #include #include #include #include #include #include FMMatchRaster::FMMatchRaster ( QWidget * parent ) :QDialog ( parent ) { setupUi ( this ); QSettings settings; m_compsize = settings.value ( "MatchRaster/CompareSize", 120 ).toInt(); m_matchLimit = settings.value ( "MatchRaster/Limit", 800.0 ).toDouble(); m_minRefSize = settings.value ( "MatchRaster/ReferenceSize", 160 ).toInt(); m_progressValue = 0; m_waitingForButton = false; waitingFont = 0; refCodepoint = 0; connect ( browseButton,SIGNAL ( clicked() ),this, SLOT ( browseImage() ) ); connect ( grabZoom , SIGNAL ( valueChanged(int) ) ,this, SLOT ( zoomChanged(int)) ); connect ( grabModeBox , SIGNAL ( toggled(bool) ) ,this, SLOT ( enterGrabMode(bool) ) ); connect ( tweakRectBox, SIGNAL(toggled(bool)),this,SLOT(switchControlRect(bool))); connect ( letter,SIGNAL ( textChanged ( const QString & ) ),this,SLOT ( addImage ( const QString & ) ) ); connect ( searchButton,SIGNAL ( clicked() ),this,SLOT ( search() ) ); connect ( iView,SIGNAL ( rectChange ( QRect ) ),this,SLOT ( recordCurrentRect ( QRect ) ) ); connect ( iView,SIGNAL ( selColorChanged ( QRgb ) ),this,SLOT ( recordCurrentColor ( QRgb ) ) ); connect ( buttonBox,SIGNAL ( rejected() ),this,SLOT ( slotRefuseFont() ) ); connect ( buttonBox,SIGNAL ( accepted() ),this,SLOT ( slotAcceptFont() ) ); connect ( stopButton,SIGNAL ( clicked() ), this, SLOT ( slotStop() ) ); } FMMatchRaster::~ FMMatchRaster() { } void FMMatchRaster::browseImage() { QString ifile ( QFileDialog::getOpenFileName ( this, "Fontmatrix - Browse Image", QDir::homePath() ) ); imagePath->setText ( ifile ); loadImage(); } void FMMatchRaster::loadImage() { QString ifile ( imagePath->text() ); if ( QFile::exists ( ifile ) ) iView->setImage ( ifile ); } void FMMatchRaster::addImage ( const QString & text ) { if ( letter->text().isEmpty() ) return; bool ok; refCodepoint = ( letter->text().count() != 4 ) ? letter->text().at ( 0 ).unicode() : letter->text().toUInt ( &ok, 16 ); refImage = iView->getPixmap().toImage().copy ( curRect ); const unsigned int iw(refImage.width()); const unsigned int ih(refImage.height()); if((iw < m_minRefSize) && (ih < m_minRefSize)) { double dw(iw); double dh(ih); double minS(m_minRefSize); double ratio( minS / qMin(dw, dh) ); dw *= ratio; dh *= ratio; refImage = refImage.scaled(qRound(dw), qRound(dh), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); } else if(iw < m_minRefSize) { refImage = refImage.scaledToWidth(m_minRefSize, Qt::SmoothTransformation); } else if(ih < m_minRefSize) { refImage = refImage.scaledToHeight(m_minRefSize, Qt::SmoothTransformation); } // refImage.save("REFIMAGE.png"); } void FMMatchRaster::search() { if((refImage.isNull()) || (!refCodepoint)) { return; } buttonBox->setEnabled ( false ); if ( !m_waitingForButton ) { remainFonts = compFonts = FMFontDb::DB()->getFilteredFonts(); progressBar->setRange ( 0, compFonts.count() ); stackedWidget->setCurrentIndex ( 1 ); if ( !checkInteractive->isChecked() ) questionWidget->setVisible ( false ); } else { compFonts = remainFonts; } PuzzleViewImp ref ( refImage , curCol ); foreach ( FontItem* fit, compFonts ) { progressBar->setValue ( ++m_progressValue ); remainFonts.removeAll ( fit ); fontName->setText ( fit->fancyName() ); QImage adjustedImg ( autoCrop ( fit->charImage ( refCodepoint , m_compsize ) ) ); if ( !adjustedImg.isNull() ) { PuzzleViewImp comp ( adjustedImg , QColor ( Qt::black ).rgb() ); double compResult ( ref.CompMean ( comp ) ); if ( compResult >= 0.0 ) { // qDebug()<<((compResult < m_matchLimit)? "****":"\t")<fancyName(); if ( compResult < m_matchLimit ) { if ( !filteredFonts.contains ( fit ) ) { if ( checkInteractive->isChecked() ) { compView->setEnabled ( true ); compView->setImage ( QPixmap::fromImage ( adjustedImg ) ); compView->setEnabled ( false ); scoreLabel->setText ( tr ( "The font %1 scores %2.\nDo you want to add it to the filtered fonts?" ) .arg ( fit->fancyName() ) .arg ( compResult ) ); buttonBox->setEnabled ( true ); waitingFont = fit; m_waitingForButton = true; return; } else { if ( !filteredFonts.contains ( fit ) ) filteredFonts << fit; } } } } } } slotStop(); } void FMMatchRaster::recordCurrentRect ( QRect r ) { curRect = r; } void FMMatchRaster::recordCurrentColor ( QRgb c ) { curCol = c; } void FMMatchRaster::slotAcceptFont() { if ( !filteredFonts.contains ( waitingFont ) ) filteredFonts << waitingFont; waitingFont = 0; search(); } void FMMatchRaster::slotRefuseFont() { waitingFont = 0; search(); } void FMMatchRaster::slotStop() { if ( (waitingFont != 0) && (!filteredFonts.contains ( waitingFont )) ) filteredFonts << waitingFont; if ( filteredFonts.count() > 0 ) { typotek::getInstance()->getTheMainView()->setCurFonts ( filteredFonts ); } else { QMessageBox::information ( this, "Fontmatrix", tr ( "No font match the submitted image" ) ); } close(); } QImage FMMatchRaster::autoCrop ( const QImage & cImg ) { const int cw = cImg.width(); const int ch = cImg.height(); if ( ( !cImg.isNull() ) && ( cw > 0 ) && ( ch > 0 ) ) { QRect r; const QRgb wp = cImg.pixel ( 0,0 ); bool topReached ( false ); for ( int y ( 0 ); y < ch; ++y ) { for ( int x ( 0 );x < cw; ++x ) { if ( cImg.pixel ( x,y ) != wp ) { topReached = true; r.setTop ( y ); break; } } if ( topReached ) break; } bool bottomReached ( false ); for ( int y ( ch - 1 ); y >= 0; --y ) { for ( int x ( cw-1 );x >=0; --x ) { if ( cImg.pixel ( x,y ) != wp ) { bottomReached = true; r.setBottom ( y ); break; } } if ( bottomReached ) break; } r.setLeft ( cw ); for ( int y ( 0 ); y < ch; ++y ) { for ( int x ( 0 );x < cw; ++x ) { if ( cImg.pixel ( x,y ) != wp ) { r.setLeft ( qMin ( x,r.left() ) ); break; } } } r.setRight ( 0 ); for ( int y ( 0 ); y < ch; ++y ) { for ( int x ( cw -1 );x >= 0; --x ) { if ( cImg.pixel ( x,y ) != wp ) { r.setRight ( qMax ( x,r.right() ) ); break; } } } if ( (!r.isNull()) && ( r.width() > 0) && (r.height() > 0) ) return cImg.copy ( r ).scaled ( refImage.width(),refImage.height() ); } return QImage(); } void FMMatchRaster::switchControlRect(bool cr) { if(cr && grabModeBox->isChecked()) { grabModeBox->setChecked(false); } iView->setControlRect(cr); } void FMMatchRaster::grabScreen() { int ratio(grabZoom->value()); QRect wr(geometry()); QRect vr(iView->geometry()); QRect absr(wr.x() - (vr.width() /ratio), wr.y() + vr.y() + sampleBox->geometry().y(), vr.width() / ratio, vr.height() / ratio); iView->setImage(QPixmap::grabWindow ( QApplication::desktop()->winId(), absr.x(), absr.y(), absr.width(), absr.height())); // qDebug()<<"iView"<geometry()<<"this"<isChecked()) { grabScreen(); } QDialog::moveEvent(event); } void FMMatchRaster::resizeEvent ( QResizeEvent * event ) { if(grabModeBox->isChecked()) { grabScreen(); } QDialog::resizeEvent(event); } void FMMatchRaster::enterGrabMode(bool e) { if(e) grabScreen(); } void FMMatchRaster::zoomChanged(int) { grabScreen(); } fontmatrix-0.6.0+svn20110930/src/panosedialog.h0000644000175000017500000000166111116247731017744 0ustar malexmalex// // C++ Interface: panosedialog // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef PANOSEDIALOG_H #define PANOSEDIALOG_H #include "ui_panosedialog.h" class FontItem; class QComboBox; class QLabel; class FMPanoseDialog : public QDialog, private Ui::PanoseDialog { Q_OBJECT public: FMPanoseDialog(FontItem * font, QWidget *parent); ~FMPanoseDialog(); QString getSourcePanose() const{return m_sourcepanose;} QString getTargetPanose() const{return m_targetpanose;} bool getOk() const{return m_ok;} private: FontItem *m_font; QString m_sourcepanose; QString m_targetpanose; QMap m_box; QMap m_label; bool m_ok; void populateDialog(); private slots: void panoseChange( int index ); void closeOk(); void closeCancel(); }; #endif //PANOSEDIALOG_H fontmatrix-0.6.0+svn20110930/src/fmpdffontextractor.h0000644000175000017500000000154611156713117021220 0ustar malexmalex// // C++ Interface: fmpdffontextractor // // Description: A dead simple font extractor from PDF docs // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMPDFFONTEXTRACTOR #define FMPDFFONTEXTRACTOR #include #include "fmfontextractorbase.h" #include class FMPDFFontExtractor : public FMFontExtractorBase { public: FMPDFFontExtractor(); ~FMPDFFontExtractor(); bool loadFile(const QString& filePath); QStringList extensions(); QStringList list(); QString fontType(const QString& name); bool write(const QString& name, QIODevice * openedDevice); private: bool cachedList; PoDoFo::PdfMemDocument * document; QMap mfont; QMap mType; }; #endif // FMPDFFONTEXTRACTOR fontmatrix-0.6.0+svn20110930/src/dataexport.ui0000644000175000017500000000362511443717220017640 0ustar malexmalex DataExport 0 0 499 307 Export Data The font files currently filtered and selected here will be copied in a directory of your choice. true Cancel Continue Qt::Horizontal 40 20 listWidget label widget horizontalSpacer fontmatrix-0.6.0+svn20110930/src/fmglyphhighlight.h0000644000175000017500000000132511151220112020611 0ustar malexmalex// // C++ Interface: FMGlyphHighlight // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMGLYPHHIGHLIGHT_H #define FMGLYPHHIGHLIGHT_H #include #include #include class QGraphicsScene; class QGraphicsRectItem; class QTimeLine; class FMGlyphHighlight : QObject { Q_OBJECT public: FMGlyphHighlight(QGraphicsScene* scene, const QRectF& rect, int time = 300, int frames = 12); ~FMGlyphHighlight(); private: QGraphicsRectItem *m_rect; QTimeLine *m_timeline; QPointF initialPos; int maxFrame; void lastFrame(); private slots: void animate(int); }; #endif fontmatrix-0.6.0+svn20110930/src/pangoshaper.h0000644000175000017500000000064711015111755017603 0ustar malexmalex// // C++ Interface: pangoshaper // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef PANGOSHAPER_H #define PANGOSHAPER_H #include "fmbaseshaper.h" class PangoShaper : public FMBaseShaper { public: PangoShaper(FMOtf* o, QString s); ~PangoShaper(); GlyphList doShape( const QString& s ); }; #endif fontmatrix-0.6.0+svn20110930/src/floatingwidgettoolbar.cpp0000644000175000017500000000531111527175576022235 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "floatingwidgettoolbar.h" #include "ui_floatingwidgettoolbar.h" #include "floatingwidget.h" #include #include FloatingWidgetToolBar::FloatingWidgetToolBar(QWidget *parent) : QWidget(parent), ui(new Ui::FloatingWidgetToolBar), noClose(false), isDetached(false) { ui->setupUi(this); connect(ui->closeButton, SIGNAL(clicked()), this, SIGNAL(Close())); connect(ui->hideButton, SIGNAL(clicked()), this, SIGNAL(Hide())); connect(ui->printButton, SIGNAL(clicked()), this, SIGNAL(Print())); connect(ui->detachButton, SIGNAL(clicked()), this, SLOT(setDetached())); setupMenu(); } FloatingWidgetToolBar::~FloatingWidgetToolBar() { delete ui; } void FloatingWidgetToolBar::changeEvent(QEvent *e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void FloatingWidgetToolBar::setupMenu() { if(isDetached) { if(!noClose) ui->closeButton->show(); else ui->closeButton->hide(); ui->hideButton->show(); ui->detachButton->hide(); } else { ui->closeButton->hide(); ui->hideButton->hide(); ui->detachButton->show(); } ui->printButton->show(); } void FloatingWidgetToolBar::setDetached() { isDetached = true; setupMenu(); emit Detach(); } void FloatingWidgetToolBar::setNoClose(bool c) { noClose = c; setupMenu(); } fontmatrix-0.6.0+svn20110930/src/filterbar.h0000644000175000017500000001070711524253232017246 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FILTERBAR_H #define FILTERBAR_H #include #include #include #include #include #include #include #include #include class FiltersDialogItem; class FilterItem; class FilterData; class TagListModel : public QAbstractListModel { Q_OBJECT const int specialTagsCount; QStringList currentTags; public: enum TagListRole { TagType = Qt::UserRole, TagString }; TagListModel(QObject * parent); int rowCount ( const QModelIndex & parent = QModelIndex() ) const; int columnCount ( const QModelIndex & parent = QModelIndex() ) const; QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const; bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ); Qt::ItemFlags flags ( const QModelIndex & index ) const; void clearCurrents(); void addToCurrents(const QString& t); void removeFromCurrents(const QString& t); public slots: void tagsDBChanged(); }; class TagListView : public QListView { Q_OBJECT int m_andOrKey; public: TagListView(QWidget * parent): QListView(parent), m_andOrKey(0) {} int getAndKey(){int ret(m_andOrKey), m_andOrKey = 0; return ret;} protected: void mouseReleaseEvent(QMouseEvent *event) { if(event->modifiers().testFlag(Qt::ShiftModifier)) m_andOrKey = 1; else if(event->modifiers().testFlag(Qt::ControlModifier)) m_andOrKey = 2; else m_andOrKey = 0; QListView::mouseReleaseEvent(event); } }; namespace Ui { class FilterBar; } class FilterBar : public QWidget { Q_OBJECT public: explicit FilterBar(QWidget *parent = 0); ~FilterBar(); void setFilterListLayout(QHBoxLayout *l){filterListLayout = l;} void setCurFilterWidget(QWidget * w){curFilterWidget = w;} protected: void changeEvent(QEvent *e); private: Ui::FilterBar *ui; QHBoxLayout * filterListLayout; QWidget * curFilterWidget; QList filters; void addFilterItem(FilterData* f, bool process = true); void removeAllFilters(); TagListModel * tagListModel; // QMenu * metaFieldsMenu; int metaFieldKey; QString filterString(FilterData *d, bool first = false); void loadFilters(); QList items; static QString andOpString; static QString notOpString; static QString orOpString; QStringListModel *mModel; QStringList mList; signals: void initSearch(int, QString); void filterChanged(); private slots: void processFilters(); void slotPanoFilter(); void metaFilter(); void metaSelectField(int idx); void filtersDialog(); void slotLoadFilter(const QString& fname); void slotRemoveFilter(const QString& fname); void slotRemoveFilterItem(bool process = true); void slotTagSelect(const QModelIndex & index); void slotTagEdit(const QModelIndex & index); void slotClearFilter(); void slotToggleTags(bool t); void slotToggleMeta(bool t); void slotTogglePano(bool t); void slotToggleFilter(bool t); public slots: void slotSaveFilter(); }; #endif // FILTERBAR_H fontmatrix-0.6.0+svn20110930/src/fontaction.ui0000644000175000017500000000443710730033166017631 0ustar malexmalex Pierre Marchand FontAction 0 0 354 411 Form 10 QFrame::StyledPanel Action Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Qt::Horizontal 40 20 Add Tag Qt::Horizontal 40 20 tagsListWidget newTagText newTagButton fontmatrix-0.6.0+svn20110930/src/fmkernfeat.h0000644000175000017500000000355211166341433017421 0ustar malexmalex// // C++ Interface: fmkernfeat // // Description: Test how to build a kern table out of a kern feature // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMKERNFEAT_H #define FMKERNFEAT_H #include #include #include #include #include FT_FREETYPE_H class FMKernFeature { public: FMKernFeature ( FT_Face face ); ~FMKernFeature(); private: FT_Face p_face; QString glyphname ( int index ); QByteArray GPOSTableRaw; QMap > coverages; QMap > pairs; void makeCoverage(); void makePairs ( quint16 subtableOffset ); typedef QMap > ClassDefTable; // > ClassDefTable getClass ( quint16 classDefOffset, quint16 coverageId ); // return a uint16 from position index in GPOSTableRaw inline quint16 toUint16 ( quint16 index ); // return a int16 from position index in GPOSTableRaw inline qint16 toInt16 ( quint16 index ); /* 0x0001 XPlacement Includes horizontal adjustment for placement 0x0002 YPlacement Includes vertical adjustment for placement 0x0004 XAdvance Includes horizontal adjustment for advance 0x0008 YAdvance Includes vertical adjustment for advance 0x0010 XPlaDevice Includes horizontal Device table for placement 0x0020 YPlaDevice Includes vertical Device table for placement 0x0040 XAdvDevice Includes horizontal Device table for advance 0x0080 YAdvDevice Includes vertical Device table for advance 0xF000 Reserved For future use */ enum ValueFormat { XPlacement = 0x0001, YPlacement = 0x0002, XAdvance = 0x0004, YAdvance = 0x0008, XPlaDevice = 0x0010, YPlaDevice = 0x0020, XAdvDevice = 0x0040, YAdvDevice = 0x0080 }; }; #endif // FMKERNFEAT_H fontmatrix-0.6.0+svn20110930/src/ReadMe0000644000175000017500000000052610704756373016216 0ustar malexmalexREAD THIS IN ORDER TO COMPILE THE Qt4 TEMPLATE ---------------------------------------------- Before compiling, check the Qt Options, go to Project->Project Options->C++ Support and open the Qt Options tab. Check that the Qt installation directory is correct for the Qt version you've chosen. ------------------ Andreas Pakulat July 2006 fontmatrix-0.6.0+svn20110930/src/samplewidget.ui0000644000175000017500000002427411445710452020157 0ustar malexmalex SampleWidget 0 0 663 620 Form 5 0 0 0 Qt::NoFocus QFrame::NoFrame 0 Qt::NoFocus QFrame::NoFrame 100 70 260 131 World is wide 2 3 2 0 2 0 1 0 Script langCombo 1 0 Shaper type shaperTypeCombo 0 0 Use shaper 40 0 321 591 Qt::Vertical 0 0 Qt::NoFocus true 2 OpenType Features Friendly Name Save as default Reset Default Qt::Horizontal 40 20 60 80 451 381 1 0 QAbstractItemView::NoEditTriggers true 1 Add Remove 3 0 FloatingWidget QWidget
floatingwidget.h
1
FMSampleTextView QGraphicsView
fmsampletextview.h
FloatingWidgetToolBar QWidget
floatingwidgettoolbar.h
1
fontmatrix-0.6.0+svn20110930/src/filtertagdialog.cpp0000644000175000017500000000347511406645124021000 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "filtertagdialog.h" #include "ui_filtertagdialog.h" FilterTagDialog::FilterTagDialog(QWidget *parent) : QDialog(parent), ui(new Ui::FilterTagDialog) { ui->setupUi(this); } FilterTagDialog::~FilterTagDialog() { delete ui; } void FilterTagDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } fontmatrix-0.6.0+svn20110930/src/panosewidget.ui0000644000175000017500000000332611512640400020144 0ustar malexmalex PanoseWidget 0 0 415 443 Panose Metadata 0 0 1 Qt::NoFocus QFrame::NoFrame Qt::ScrollBarAlwaysOff QAbstractItemView::NoEditTriggers QAbstractItemView::SingleSelection 12 true true false Panose Attributes fontmatrix-0.6.0+svn20110930/src/iview.h0000644000175000017500000000253411204527444016422 0ustar malexmalex// // C++ Interface: iview // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #ifndef IVIEW_H #define IVIEW_H #include #include #include #include #include class IView: public QGraphicsView { Q_OBJECT public: IView(QWidget* parent); ~IView(){} void setImage(const QString& path); void setImage(const QPixmap& pixmap); QPixmap getPixmap(); // control if the rect can be tweak by user or not void setControlRect(bool u); signals: void rectChange(QRect); void selColorChanged(QRgb); protected: void mouseMoveEvent ( QMouseEvent * e ); void mousePressEvent ( QMouseEvent * e ); void mouseReleaseEvent ( QMouseEvent * e ); void resizeEvent ( QResizeEvent * event ); private: QGraphicsPixmapItem * curImage; QGraphicsPolygonItem * curSel; QGraphicsRectItem * curRect; QGraphicsEllipseItem * curTL; QGraphicsEllipseItem * curTR; QGraphicsEllipseItem * curBL; QGraphicsEllipseItem * curBR; QPointF mouseStartPoint; QRect theRect; bool isSelecting; bool isPanning; void fitImage(); void selectGlyph(const QPointF& scenepos); bool m_controlRect; private slots: void drawSelRect(QRect); }; #endif fontmatrix-0.6.0+svn20110930/src/parallelcoor.cpp0000644000175000017500000004632211241276662020320 0ustar malexmalex// // C++ Implementation: parallelcoor // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "parallelcoor.h" #include "typotek.h" #include #ifdef HAVE_QTOPENGL #include #endif #include #include #include #include #include #include #include #include /** DataSet */ const QString ParallelCoorDataSet::FieldSep = ":"; ParallelCoorDataSet::ParallelCoorDataSet() { } ParallelCoorDataSet::~ ParallelCoorDataSet() { } QMap< QString , QString> ParallelCoorDataSet::getCategoryDescriptions() const { return m_categoryDescriptions; } void ParallelCoorDataSet::setCategoryDescriptions ( const QMap< QString , QString >& theValue ) { m_categoryDescriptions = theValue; } QMap< QString , QString> ParallelCoorDataSet::getValueDescriptions() const { return m_valueDescriptions; } void ParallelCoorDataSet::setValueDescriptions ( const QMap< QString , QString >& theValue ) { m_valueDescriptions = theValue; } ParallelCoorDataType ParallelCoorDataSet::getData() const { return m_data; } void ParallelCoorDataSet::setData ( const ParallelCoorDataType& theValue ) { m_data = theValue; } /** View */ QMap ParallelCoorView::pens; QMap ParallelCoorView::brushes; QPainterPath ParallelCoorView::markPath; ParallelCoorView::ParallelCoorView(QWidget * parent) :QGraphicsView(parent), m_dataSet(0) { setScene(new QGraphicsScene(this)); #ifdef HAVE_QTOPENGL QGLFormat glfmt; glfmt.setSampleBuffers ( true ); QGLWidget *glwgt = new QGLWidget ( glfmt ); if ( glwgt->format().sampleBuffers() ) { setViewport ( glwgt ); setRenderHint(QPainter::Antialiasing,true); } else { delete glwgt; setRenderHint(QPainter::Antialiasing,false); } #endif setBackgroundBrush(Qt::white); initPensAndBrushes(); doConnect(); } ParallelCoorView::ParallelCoorView(ParallelCoorDataSet * dataset, QWidget * parent) :QGraphicsView(parent), m_dataSet(dataset) { setScene(new QGraphicsScene(this)); #ifdef HAVE_QTOPENGL QGLFormat glfmt; glfmt.setSampleBuffers ( true ); QGLWidget *glwgt = new QGLWidget ( glfmt ); if ( glwgt->format().sampleBuffers() ) { setViewport ( glwgt ); setRenderHint(QPainter::Antialiasing,true); } else { delete glwgt; setRenderHint(QPainter::Antialiasing,false); } #endif setBackgroundBrush(Qt::white); initPensAndBrushes(); doConnect(); } ParallelCoorView::~ParallelCoorView() { } void ParallelCoorView::selectField(const QString & field) { emit selectedField(field); setCurrentField(field); } QString ParallelCoorView::getCurrentField() const { return m_currentField; } void ParallelCoorView::setCurrentField ( const QString& theValue ) { if(theValue!=m_currentField) { m_currentField = theValue; cleanLists(ValueList); drawValues(); } } ParallelCoorDataSet* ParallelCoorView::getDataSet() const { return m_dataSet; } void ParallelCoorView::setDataSet ( ParallelCoorDataSet* theValue ) { if(m_dataSet && (m_dataSet != theValue)) delete m_dataSet; m_dataSet = theValue; } ParallelCoorView::Units::Units(int width, int height, int count) { hunit = static_cast ( height ) /1000.0 ; wunit = static_cast ( width ) /1000.0 ; XOffset = wunit * 200.0; YOffset = hunit * 100.0 ; H = hunit * 800.0 ; W = wunit * 700.0 ; C = count ; step = W / static_cast ( C-1 ) ; } void ParallelCoorView::initPensAndBrushes() { // bars pens["bar"] = QPen(QColor(200,200,200), 6.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin); pens["bar-hover"] = QPen(QColor(160,160,160), 6.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin); // vertices pens["vertice-filter"] = QPen(Qt::black, 1.0); pens["vertice-unfilter"] = QPen(QColor(200,200,200), 1.0); // marks double size(0.5); markPath.addRect(-10.0*size,-10.0*size,20.0*size,20.0*size); brushes["mark"] = QBrush(Qt::black); brushes["mark-active"] = QBrush(Qt::red); // debug pens["debug-1"] = QPen(Qt::blue, 5.0); QString cat("Panose/color-%1"); QSettings settings; foreach(QString attr, pens.keys()) { pens[attr].setColor( QColor(settings.value(cat.arg(attr),pens[attr].color().name()).toString()) ); settings.setValue(cat.arg(attr),pens[attr].color().name()); } foreach(QString attr, brushes.keys()) { brushes[attr].setColor( QColor(settings.value(cat.arg(attr),brushes[attr].color().name()).toString()) ); settings.setValue(cat.arg(attr),pens[attr].color().name()); } } void ParallelCoorView::cleanLists(ItemList il) { if((il == AllList) || (il == ValueList)) { foreach(ParallelCoorValueItem* ti, valueLabels) { delete ti; } valueLabels.clear(); foreach(ParallelCoorMarkItem *mi, marks) { delete mi; } marks.clear(); } if((il == AllList) || (il == FieldList)) { foreach(ParallelCoorFieldItem* ti, fieldLabels) { delete ti; } fieldLabels.clear(); } if((il == AllList) || (il == VerticeList)) { foreach(QGraphicsLineItem* pi, vertices) { delete pi; } vertices.clear(); } if((il == AllList) || (il == BarList)) { foreach(ParallelCoorBarItem* li, bars) { delete li; } bars.clear(); } } void ParallelCoorView::redraw() { // qDebug()<<"ParallelCoorView::redraw"; if ( !m_dataSet ) { qWarning()<<"No Dataset"; return; } if ( m_dataSet->isEmpty() ) { qWarning()<<"Empty Dataset"; return; } if(controlSize != size()) { // there will be another resize event soon, no need to draw now return; } units = Units(width(), height(), m_dataSet->count()); // QTime t; // int tclean, tbar, tvert, tfield, tval; // t.start(); cleanLists(AllList); // // tclean = t.elapsed(); // t.start(); drawBars(); // tbar = t.elapsed(); // t.start(); drawVertices(); // // tvert = t.elapsed(); // // t.start(); drawFields(); // tfield = t.elapsed(); // t.start(); drawValues(); // tval = t.elapsed(); // qDebug()<<"C"< ( i ) ); QLineF bl(units.XOffset + ( di * units.step ), units.YOffset, units.XOffset + ( di * units.step ), units.YOffset + units.H); ParallelCoorBarItem * bi ( new ParallelCoorBarItem(m_dataSet->at(i).first, this) ); bars << bi; bi->setPen(pens["bar"]); bi->setLine(bl); scene()->addItem(bi); } } void ParallelCoorView::drawVertices() { // qDebug()<getData().count(); int tc, td, ta, to; tc = td = ta = to = 0; QTime t; t.start(); const int N ( m_dataSet->getData().count() ); QMap > placeCoords; for ( int k ( 0 );k < m_dataSet->count(); ++k ) { QStringList list ( m_dataSet->at ( k ).second ); double x ( units.XOffset + ( static_cast ( k ) * units.step ) ); double v ( units.H / static_cast ( list.count()-1 ) ); for ( int l ( 0 ); l < list.count(); ++l ) { double y ( units.YOffset + ( static_cast ( l ) * v ) ); placeCoords[k][l] = QPointF ( x,y ); } } // QList cflines; // QList culines; QMap > > cflines; QMap > > culines; to = t.elapsed(); QGraphicsLineItem *li; for ( int a ( 0 );agetData().at(a).count() == m_dataSet->count() ) { QList pol; t.start(); for ( int b ( 0 ); b < m_dataSet->getData().at ( a ).count() ; ++b ) { if(placeCoords[b].contains( m_dataSet->getData().at ( a ).at ( b ) )) pol << QPointF( placeCoords[b][m_dataSet->getData().at ( a ).at ( b ) ] ); else pol << QPointF( placeCoords[b][0] ); } tc += t.elapsed(); t.start(); if ( pol.count() == m_dataSet->count() ) { for(int vi(1);vigetData().at ( a ) ) ); if(f) { if(cflines.contains(pol[vi-1].x())) { if(cflines[pol[vi-1].x()].contains(pol[vi-1].y())) { if(cflines[pol[vi-1].x()][pol[vi-1].y()].contains(pol[vi])) { continue; } } } QLineF lf(pol[vi-1],pol[vi]); li = new QGraphicsLineItem( lf ); li->setPen( pens["vertice-filter"] ); li->setZValue(100.0); vertices << li; cflines[pol[vi-1].x()][pol[vi-1].y()] << pol[vi]; } else { if(culines.contains(pol[vi-1].x())) { if(culines[pol[vi-1].x()].contains(pol[vi-1].y())) { if(culines[pol[vi-1].x()][pol[vi-1].y()].contains(pol[vi])) { continue; } } } QLineF lf(pol[vi-1],pol[vi]); li = new QGraphicsLineItem( lf ); li->setPen( pens["vertice-unfilter"] ); vertices << li; culines[pol[vi-1].x()][pol[vi-1].y()] << pol[vi]; } } } td += t.elapsed(); } } t.start(); int vcount(vertices.count()); QGraphicsScene * ls(scene()); for(int i(0); i < vcount; ++i) { ls->addItem( vertices[i] ); } ta = t.elapsed(); qDebug()<<"R"<< to << tc << td << ta; } void ParallelCoorView::drawFields() { // qDebug()<<"ParallelCoorView::drawFields"; QFont fontF( "Helvetica" , 100.0 , QFont::DemiBold, false ); double lastW(0.0); bool lastPosShifted(false); double maxAscent(0.0); for(int k(0);k < m_dataSet->count(); ++k) { QString f(m_dataSet->at(k).first); QFontMetricsF metrics(fontF); double w(metrics.boundingRect(f).width()); double fsize( units.step * 100.0 / w ); double ascent(metrics.ascent() * fsize / 100.0 ); maxAscent = qMax(maxAscent, ascent); } for(int k(0);k < m_dataSet->count(); ++k) { QString f(m_dataSet->at(k).first); fontF.setPointSizeF(100.0); QFontMetricsF metrics(fontF); double w(metrics.boundingRect(f).width()); double fsize( (units.step * 0.9) * 100.0 / w ); double ascent(metrics.ascent() * fsize / 100.0); double sw(w * fsize / 100.0 ); fontF.setPointSizeF(fsize); ParallelCoorFieldItem * ti = new ParallelCoorFieldItem(f,this); fieldLabels << ti; ti->setFont(fontF); scene()->addItem(ti); ti->setPos(units.XOffset + (k*units.step) - (sw/2.0), units.H + units.YOffset + (maxAscent - ascent)); // double h(ti->boundingRect().height()); // if(lastW > units.step * 1.1) // { // if(!lastPosShifted) // { // ti->setPos(units.XOffset + (k*units.step) , units.H + units.YOffset + h); // lastPosShifted = true; // } // else // { // ti->setPos(units.XOffset + (k*units.step) , units.H + units.YOffset ); // lastPosShifted = false; // } // } // else // { // ti->setPos(units.XOffset + (k*units.step) /*- (w/3.0)*/, units.H+units.YOffset); // lastPosShifted = false; // } // lastW = w; } } void ParallelCoorView::drawValues() { int di(0); if(!m_currentField.isEmpty()) { for(int i(0);icount();++i) { if(m_dataSet->at(i).first == m_currentField) { di = i; break; } } } else m_currentField = m_dataSet->at(0).first; QFont fontV( "Helvetica" , 9, QFont::Normal , true ); QFont fontS( "Helvetica" , 10, QFont::DemiBold , true ); double din(static_cast(di)); double dn(static_cast(m_dataSet->at(di).second.count()-1)); double vsep(units.H / dn); QList list (m_dataSet->at(di).second); for(int i(0); i< list.count(); ++i) { ParallelCoorValueItem *vi = new ParallelCoorValueItem(list[i], this); valueLabels << vi; ParallelCoorMarkItem *mi = new ParallelCoorMarkItem(vi, this); marks << mi; if(cfilter.contains(di)) { if(cfilter[di].contains(i)) vi->setFont(fontS); else vi->setFont(fontV); } else vi->setFont(fontV); scene()->addItem(vi); scene()->addItem(mi); double w((units.XOffset * .9) - vi->boundingRect().width()); double h(vi->boundingRect().height() / 2.0); // qDebug()<<"V"<boundingRect().width()<setPos( w , units.YOffset + (static_cast(i) * vsep) - h); mi->setPos( units.XOffset + ( static_cast(di) * units.step ), units.YOffset + (static_cast(i) * vsep)); vi->setZValue(1000.0); mi->setZValue(1000.0); // qDebug()<<"========================================================="; // qDebug()< ParallelCoorView::getFilter() const { return m_filter; } QString ParallelCoorView::filterAsString() { QString ret; foreach(QString key, m_filter.keys()) { const QStringList& l = m_filter[key]; if(!l.isEmpty()) { if(ret.isEmpty()) ret += key + " {" + l.join(";") + "}"; else ret += "\n" + key + " {" + l.join(";") + "}"; } } return ret; } void ParallelCoorView::setFilter ( const QMap< QString, QStringList >& theValue ) { m_filter.clear(); cfilter.clear(); m_filter = theValue; for(int i(0);i < m_dataSet->count(); i++) { if(m_filter.contains(m_dataSet->at(i).first)) { foreach(QString v, m_filter[m_dataSet->at(i).first]) { cfilter[i] << m_dataSet->at(i).second.indexOf(v); } } } emit filterChanged(); updateGraphic(); } bool ParallelCoorView::matchFilter(QList< int > list) const { if(list.isEmpty()) { // qDebug()<<"List empty"; return false; } if(m_filter.isEmpty()) { // qDebug()<<"Filter empty"; return true; } bool ret(false); for(int i(0); i < list.count();++i) { if(cfilter.contains(i)) { if(cfilter[i].contains(list[i])) ret = true; else { ret = false; break; } } } return ret; } /** Field label */ void ParallelCoorFieldItem::hoverEnterEvent(QGraphicsSceneHoverEvent * event) { qApp->setOverrideCursor(Qt::PointingHandCursor); QBrush b = brush(); b.setColor(Qt::red); setBrush(b); } void ParallelCoorFieldItem::hoverLeaveEvent(QGraphicsSceneHoverEvent * event) { QBrush b = brush(); b.setColor(Qt::black); setBrush(b); qApp->restoreOverrideCursor(); } void ParallelCoorFieldItem::mousePressEvent(QGraphicsSceneMouseEvent * event) { event->accept(); } void ParallelCoorFieldItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) { if(QString(pview->metaObject()->className()) == QString("ParallelCoorView") ) { ParallelCoorView *pcv = reinterpret_cast(pview); pcv->selectField(text()); } qApp->restoreOverrideCursor(); } ParallelCoorFieldItem::ParallelCoorFieldItem(QString text, QGraphicsView* pcv, QGraphicsItem * parent) :QGraphicsSimpleTextItem(parent), pview(pcv) { setText(text); setEnabled(true); setAcceptHoverEvents ( true ); } /** Value label */ ParallelCoorValueItem::ParallelCoorValueItem(QString text, QGraphicsView * pcv, QGraphicsItem * parent) :QGraphicsSimpleTextItem(parent), pview(pcv) { setText(text); setEnabled(true); setAcceptHoverEvents ( true ); } void ParallelCoorValueItem::hoverEnter() { qApp->setOverrideCursor(Qt::PointingHandCursor); QBrush b = brush(); b.setColor(Qt::red); setBrush(b); } void ParallelCoorValueItem::hoverLeave() { QBrush b = brush(); b.setColor(Qt::black); setBrush(b); qApp->restoreOverrideCursor(); } void ParallelCoorValueItem::click(int mod) { if(QString(pview->metaObject()->className()) == QString("ParallelCoorView") ) { ParallelCoorView *pcv = reinterpret_cast(pview); QMap filter; if(mod == 0) // bare left click { filter[pcv->getCurrentField()] << text(); } else if(mod == 1) // with Shift { filter = pcv->getFilter(); filter[pcv->getCurrentField()] << text(); } else if(mod == 2) // with Control { filter = pcv->getFilter(); filter[pcv->getCurrentField()].removeAll(text()); } pcv->setFilter(filter); } qApp->restoreOverrideCursor(); } void ParallelCoorValueItem::hoverEnterEvent(QGraphicsSceneHoverEvent * event) { hoverEnter(); } void ParallelCoorValueItem::hoverLeaveEvent(QGraphicsSceneHoverEvent * event) { hoverLeave(); } void ParallelCoorValueItem::mousePressEvent(QGraphicsSceneMouseEvent * event) { event->accept(); } void ParallelCoorValueItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) { if(event->modifiers() & Qt::ShiftModifier) click(1); else if(event->modifiers() & Qt::ControlModifier) click(2); else click(); } /** Bars */ ParallelCoorBarItem::ParallelCoorBarItem(const QString& field, QGraphicsView * pcv, QGraphicsItem * parent) :QGraphicsLineItem(parent), pview(pcv), attachedField(field) { setEnabled(true); setAcceptHoverEvents ( true ); } void ParallelCoorBarItem::hoverEnterEvent(QGraphicsSceneHoverEvent * event) { // qApp->setOverrideCursor(Qt::PointingHandCursor); setPen(ParallelCoorView::pens["bar-hover"]); if(QString(pview->metaObject()->className()) == QString("ParallelCoorView") ) { ParallelCoorView *pcv = reinterpret_cast(pview); pcv->selectField(attachedField); } } void ParallelCoorBarItem::hoverLeaveEvent(QGraphicsSceneHoverEvent * event) { setPen(ParallelCoorView::pens["bar"]); // qApp->restoreOverrideCursor(); } void ParallelCoorBarItem::mousePressEvent(QGraphicsSceneMouseEvent * event) { // event->accept(); } void ParallelCoorBarItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) { // if(QString(pview->metaObject()->className()) == QString("ParallelCoorView") ) // { // ParallelCoorView *pcv = reinterpret_cast(pview); // pcv->selectField(attachedField); // } // qApp->restoreOverrideCursor(); } /** Marks */ ParallelCoorMarkItem::ParallelCoorMarkItem(ParallelCoorValueItem * relative, QGraphicsView * pcv, QGraphicsItem * parent) :QGraphicsPathItem(parent), pview(pcv), value(relative) { setEnabled(true); setAcceptHoverEvents ( true ); setBrush(ParallelCoorView::brushes["mark"]); setPen(QPen(Qt::transparent,0.0)); setPath(ParallelCoorView::markPath); } void ParallelCoorMarkItem::hoverEnterEvent(QGraphicsSceneHoverEvent * event) { setBrush(ParallelCoorView::brushes["mark-active"]); value->hoverEnter(); QGraphicsPathItem::hoverEnterEvent(event); } void ParallelCoorMarkItem::hoverLeaveEvent(QGraphicsSceneHoverEvent * event) { setBrush(ParallelCoorView::brushes["mark"]); value->hoverLeave(); QGraphicsPathItem::hoverLeaveEvent(event); } void ParallelCoorMarkItem::mousePressEvent(QGraphicsSceneMouseEvent * event) { event->accept(); } void ParallelCoorMarkItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) { if(event->modifiers() & Qt::ShiftModifier) value->click(1); else if(event->modifiers() & Qt::ControlModifier) value->click(2); else value->click(); } void ParallelCoorView::slotSaveColors() { // qDebug()<<"ParallelCoorView::~ParallelCoorView()"; // QString cat("Panose/%1"); // QSettings settings; // foreach(QString attr, pens.keys()) // { // qDebug()<, (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #include "fmpdffontextractor.h" #include #include FMPDFFontExtractor::FMPDFFontExtractor() :cachedList(false) { document = 0; } bool FMPDFFontExtractor::loadFile(const QString & filePath) { cachedList = false; mfont.clear(); mType.clear(); if(document) delete document; if(!QFile::exists(filePath)) { document = 0; return false; } else { try { document = new PoDoFo::PdfMemDocument(filePath.toLocal8Bit().data()); } catch(PoDoFo::PdfError& e) { qDebug()<<"PoDoFo::Error:"<GetObjects().begin() ); PoDoFo::PdfName pType("Type"); PoDoFo::PdfName pSubtype("Subtype"); PoDoFo::PdfName pFont("Font"); PoDoFo::PdfName pType1("Type1"); PoDoFo::PdfName pTrueType("TrueType"); PoDoFo::PdfName pFontDescriptor( "FontDescriptor" ); PoDoFo::PdfName pFontFile( "FontFile" ); PoDoFo::PdfName pFontFile3( "FontFile3" ); PoDoFo::PdfName pFontName( "FontName" ); while( objIt != document->GetObjects().end() ) { PoDoFo::PdfObject* obj(*objIt); if ( obj->IsDictionary() ) { if(obj->GetIndirectKey(pType)) { PoDoFo::PdfName type( obj->GetIndirectKey(pType)->GetName() ); if(type == pFont) { if(obj->GetIndirectKey( pSubtype )) { PoDoFo::PdfName subtype ( obj->GetIndirectKey( pSubtype )->GetName() ); if ((subtype == pType1) || (subtype == pTrueType)) { PoDoFo::PdfObject * fontDescriptor ( obj->GetIndirectKey ( pFontDescriptor ) ); if (fontDescriptor ) { bool hasFile(false); PoDoFo::PdfObject * fontFile ( fontDescriptor->GetIndirectKey ( pFontFile ) ); if ( !fontFile ) { fontFile = fontDescriptor->GetIndirectKey(pFontFile3) ; if ( !fontFile ) qWarning ( "Font not embedded not supported yet" ); else hasFile = true; } else hasFile = true; if(hasFile) { PoDoFo::PdfName fontName(fontDescriptor->GetIndirectKey(pFontName)->GetName()); if(1) { QString n(QString::fromStdString( fontName.GetName() )); mfont[n] = fontFile; // we know naming it pfb is wrong mType[n] = (subtype == pType1) ? "pfb" : "ttf"; } else qDebug()<<"Error: no /FontName key"; } } } } } } } objIt++; } return mfont.keys(); } bool FMPDFFontExtractor::write(const QString & name, QIODevice* openedDevice) { if(!mfont.contains(name)) return false; PoDoFo::PdfObject * fontFile(mfont[name]); PoDoFo::PdfMemoryOutputStream outMemStream ( 1 ); try { fontFile->GetStream()->GetFilteredCopy ( &outMemStream ); } catch ( PoDoFo::PdfError & e ) { qDebug() <<"Arg, unable to get a filtered copy of a fontfile stream"; return false; } outMemStream.Close(); QByteArray a(outMemStream.TakeBuffer(), outMemStream.GetLength()); return (openedDevice->write(a) == outMemStream.GetLength()); } QString FMPDFFontExtractor::fontType(const QString & name) { return mType.value(name); } fontmatrix-0.6.0+svn20110930/src/fmotf.h0000644000175000017500000000752711154747154016427 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef WRAPLIBOTF #define WRAPLIBOTF #include #include FT_FREETYPE_H #include FT_TRUETYPE_TABLES_H #include #include #include #include #include "fmshaper_own.h" #include "fmsharestruct.h" // added to pacify gcc44 PL #include #include #include // using namespace std; class FMOtf { public: FMOtf ( FT_Face, double scale = 0.0 ); ~FMOtf (); QString curString; private: FT_Face _face; // ScShaper * shaper; bool useShaper; HB_FontRec hbFont; QByteArray _memgdef,_memgsub,_memgpos; HB_StreamRec* gdefstream; HB_StreamRec* gsubstream; HB_StreamRec* gposstream; HB_GDEF _gdef; HB_GSUB _gsub; HB_GPOS _gpos; //OTF_GlyphString mys; HB_Buffer _buffer; bool glyphAlloc; int GDEF, GSUB, GPOS; public: // OTF_GlyphString * FMOtfString() {return &mys;} // int unicode(int gid){ return OTF_get_unicode(my, gid);} int get_glyph ( int index );//{return _buffer->out_string[index].gindex;} QString curTable; HB_UShort curScript, curLang, curLangReq; QString curScriptName, curLangName; QStringList curFeatures; static HB_UShort manageAlternates ( HB_UInt pos,HB_UShort glyphID,HB_UShort num_alternates,HB_UShort* alternates, void* data ); static QList altGlyphs; /* * These members functions apply features currently set */ public: // Yes there are a lot, doubtless too much. int procstring ( QString s, QString script, QString lang, QStringList gsub, QStringList gpos ); QList procstring ( QString s, OTFSet set ); QList procstring ( QList shaped , QString script ); QList procstring ( QList glyList , QString script, QString lang, QStringList gsub, QStringList gpos ); /* * These functions give access to informations contained in the fontfile */ QStringList get_tables (); QStringList get_scripts (); QStringList get_langs (); QStringList get_features ( bool required=false ); /* * These allow to set up the features ( Tab -> Scr -> Lan -> Fea ) */ void set_table ( QString ); void set_script ( QString ); void set_lang ( QString ); void set_features ( QStringList ); // uint get_position(int,GlyphLayout *); // uint presentAlternates(HB_UInt, HB_UShort, QList); GlyphList get_position ( HB_Buffer abuffer = 0 ); FT_Face face() const { return _face; } friend class FontItem; friend class FMShaper; }; #endif fontmatrix-0.6.0+svn20110930/src/repair.ui0000644000175000017500000001522311166407050016743 0ustar malexmalex repairDialog 0 0 697 497 Database repair Qt::Horizontal 271 20 Close 0 Dead links 0 4 Select all Qt::Horizontal 241 30 Remove Activated Not Linked 0 5 Select all Qt::Horizontal 161 30 Re-link Deactivate Deactivated Linked 0 5 Select all Qt::Horizontal 141 30 De-link Activate Unreferenced Files Select all Qt::Horizontal 489 20 Remove fontmatrix-0.6.0+svn20110930/src/tagset.ui0000644000175000017500000001551710730033166016755 0ustar malexmalex TagSetDialog 0 0 618 670 0 0 TagSet editor :/fontmatrix_tagseteditor_icon.png QFrame::StyledPanel QFrame::Raised 0 0 :/fontmatrix_tagseteditor.png 14 50 false PreferDefault true Collections of Tags Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft Available Tags QAbstractItemView::ExtendedSelection Qt::Horizontal 173 27 0 0 Add selected tag to current set. Add Qt::Vertical Collections New delete Qt::Horizontal 40 20 Remove Qt::Horizontal 151 27 Qt::Horizontal 40 20 Close fontmatrix-0.6.0+svn20110930/src/samplewidget.h0000644000175000017500000001240011524253232017751 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SAMPLEWIDGET_H #define SAMPLEWIDGET_H #include "floatingwidget.h" #include "fmotf.h" #include #include #include #include #include class QGraphicsScene; class FMLayout; class QButtonGroup; class QAbstractButton; class QFileSystemWatcher; class QTimer; class SampleToolBar; class QTreeWidgetItem; class QStyledItemDelegate; class FontItem; namespace Ui { class SampleWidget; } #define VIEW_PAGE_FREETYPE 0 #define VIEW_PAGE_ABSOLUTE 1 #define VIEW_PAGE_OPENTYPE 3 //#define VIEW_PAGE_SETTINGS 1 #define VIEW_PAGE_SAMPLES 4 class FMLayoutThread : public QThread { FMLayout * pLayout; QList gl; double fontSize; FontItem * font; unsigned int fHinting; public: void setLayout(FMLayout * l, const QList& spec , double fs, FontItem * f, unsigned int hinting); void run(); }; class SampleWidget : public FloatingWidget { Q_OBJECT public: struct State { bool set; State() : set(false) {} State(const QString& sn, double fs, unsigned int rh, const QString& sh, const QString& sc): set(true), sampleName(sn), fontSize(fs), renderHinting(rh), shaper(sh), script(sc) {} State(const State& other) : set(true) { sampleName = other.sampleName; fontSize = other.fontSize; renderHinting = other.renderHinting; shaper = other.shaper; script = other.script; } QString sampleName; double fontSize; unsigned int renderHinting; // 0 = No; 1 = Normal; 2 = Light QString shaper; QString script; QByteArray toByteArray() const; State fromByteArray(QByteArray b); private: State operator= (const State&){} }; static const QString Name; explicit SampleWidget(const QString& fid, QWidget *parent = 0); ~SampleWidget(); QGraphicsScene* textScene() const; State state() const; void setState(const State& s); protected: void changeEvent(QEvent *e); void refillSampleList(); unsigned int hinting(); private: Ui::SampleWidget *ui; SampleToolBar * sampleToolBar; QTreeWidgetItem * uRoot; QTreeWidgetItem * newSampleName; QStyledItemDelegate * sampleNameEditor; const QString fontIdentifier; QGraphicsScene *loremScene; QGraphicsScene *ftScene; FMLayout *textLayoutVect; FMLayout *textLayoutFT; // QButtonGroup *radioRenderGroup; QButtonGroup *radioFTHintingGroup; double sampleFontSize; double sampleInterSize; double sampleRatio; int toolPanelWidth; QFileSystemWatcher *sysWatcher; QTimer *reloadTimer; void createConnections(); void removeConnections(); void fillOTTree(); OTFSet deFillOTTree(); bool layoutForPrint; bool firstUpdateRequest; int firstUpdateRequestTimeStamp; QTime layoutTime; QTimer *layoutTimer; int layoutWait; FMLayoutThread * layoutThread; bool layoutSwitch; int pixmapDrawn; #ifdef PLATFORM_APPLE QFileInfo fileInfo; qint64 fileLastModified; #endif void reSize(double fSize, double lSize){sampleFontSize = fSize; sampleInterSize = lSize;} private slots: void slotView(); void drawPixmap(int index, double fontsize, double x, double y); void drawBaseline(double y); void clearFTScene(); void endLayout(); // void slotChangeViewPage(QAbstractButton* ); // void slotHintChanged(int); // void slotChangeViewPageSetting(bool); void slotUpdateSView(); void slotZoom(int z); void slotUpdateRView(); void slotSampleChanged(); void slotLiveFontSize(double); void slotFeatureChanged(); void slotDefaultOTF(); void slotResetOTF(); void slotChangeScript(); void slotProgressionChanged(); void slotWantShape(); void slotFileChanged(const QString&); void slotReload(); void slotScriptChange(); void slotAddSample(); void slotSampleNameEdited(QWidget* w); void slotRemoveSample(); void slotEditSample(); void slotUpdateSample(); void slotShowSamples(bool); void slotShowOpenType(bool); void slotPrint(); void slotDoPrinting(); void saveState(); signals: void stopLayout(); void stateChanged(); }; #endif // SAMPLEWIDGET_H fontmatrix-0.6.0+svn20110930/src/filtersdialogitem.cpp0000644000175000017500000000562211527175576021357 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "filtersdialogitem.h" #include "ui_filtersdialogitem.h" #include FiltersDialogItem::FiltersDialogItem(const QString& name, const QString& f, QWidget *parent) : QWidget(parent), ui(new Ui::FiltersDialogItem), filterName(name) { ui->setupUi(this); QString ssheet; ssheet += QString("QToolButton{border:none;}"); ssheet += QString("QToolButton:checked{border-bottom:2px solid black;}"); ssheet += QString("QToolButton:hover{background:white;}"); // ssheet += QString(); // ssheet += QString(); // ssheet += QString(); // ssheet += QString(); this->setStyleSheet(ssheet); // setButtonsVisible(false); ui->filterName->setText(filterName); ui->filterName->setToolTip(f); // ui->filters->setText(f); connect(ui->filterButton, SIGNAL(clicked()), this, SLOT(slotFilter())); connect(ui->removeButton, SIGNAL(clicked()), this, SLOT(slotRemove())); } FiltersDialogItem::~FiltersDialogItem() { delete ui; } void FiltersDialogItem::slotFilter() { emit Filter(filterName); } void FiltersDialogItem::slotRemove() { if(QMessageBox::question(0, tr("Remove Filter"), tr("Confirm deletion of filter:") + filterName, QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok) == QMessageBox::Ok) emit Remove(filterName); } void FiltersDialogItem::setButtonsVisible(bool v) { ui->filterButton->setVisible(v); ui->removeButton->setVisible(v); } void FiltersDialogItem::enterEvent(QEvent *) { // setButtonsVisible(true); } void FiltersDialogItem::leaveEvent(QEvent *) { // setButtonsVisible(false); } fontmatrix-0.6.0+svn20110930/src/icushaper.cpp0000644000175000017500000002224011217731442017610 0ustar malexmalex// // C++ Implementation: icushaper // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include #include "icushaper.h" #include using std::cerr; QString OTF_tag_name ( unsigned int tag ); unsigned int OTF_name_tag ( QString s ); IcuShaper::IcuShaper ( FMOtf * o, QString s ) :FMBaseShaper ( o,s ) { fillTagToCode(); qDebug()<<"IcuShaper::IcuShaper("<< tagToCode.value ( script ) <<")"; LEErrorCode err(LE_NO_ERROR); icuFont = new IcuFontImpl ( otf ); icuLE = LayoutEngine::layoutEngineFactory ( icuFont, tagToCode.value ( script ), -1 , err ); IcuError(err); } IcuShaper::~ IcuShaper() { icuLE->reset(); delete icuLE; delete icuFont; } void IcuShaper::fillTagToCode() { if ( tagToCode.isEmpty() ) { tagToCode["zyyy"] = zyyyScriptCode ; tagToCode["qaai"] = qaaiScriptCode ; tagToCode["arab"] = arabScriptCode ; tagToCode["armn"] = armnScriptCode ; tagToCode["beng"] = bengScriptCode ; tagToCode["bopo"] = bopoScriptCode ; tagToCode["cher"] = cherScriptCode ; tagToCode["copt"] = coptScriptCode ; tagToCode["cyrl"] = cyrlScriptCode ; tagToCode["dsrt"] = dsrtScriptCode ; tagToCode["deva"] = devaScriptCode ; tagToCode["ethi"] = ethiScriptCode ; tagToCode["geor"] = georScriptCode ; tagToCode["goth"] = gothScriptCode ; tagToCode["grek"] = grekScriptCode ; tagToCode["gujr"] = gujrScriptCode ; tagToCode["guru"] = guruScriptCode ; tagToCode["hani"] = haniScriptCode ; tagToCode["hang"] = hangScriptCode ; tagToCode["hebr"] = hebrScriptCode ; tagToCode["hira"] = hiraScriptCode ; tagToCode["knda"] = kndaScriptCode ; tagToCode["kana"] = kanaScriptCode ; tagToCode["khmr"] = khmrScriptCode ; tagToCode["lao "] = laooScriptCode ; tagToCode["latn"] = latnScriptCode ; tagToCode["mlym"] = mlymScriptCode ; tagToCode["mong"] = mongScriptCode ; tagToCode["mymr"] = mymrScriptCode ; tagToCode["ogam"] = ogamScriptCode ; tagToCode["ital"] = italScriptCode ; tagToCode["orya"] = oryaScriptCode ; tagToCode["runr"] = runrScriptCode ; tagToCode["sinh"] = sinhScriptCode ; tagToCode["syrc"] = syrcScriptCode ; tagToCode["taml"] = tamlScriptCode ; tagToCode["telu"] = teluScriptCode ; tagToCode["thaa"] = thaaScriptCode ; tagToCode["thai"] = thaiScriptCode ; tagToCode["tibt"] = tibtScriptCode ; tagToCode["cans"] = cansScriptCode ; tagToCode["yi "] = yiiiScriptCode ; tagToCode["tglg"] = tglgScriptCode ; tagToCode["hano"] = hanoScriptCode ; tagToCode["buhd"] = buhdScriptCode ; tagToCode["tagb"] = tagbScriptCode ; tagToCode["brai"] = braiScriptCode ; tagToCode["cprt"] = cprtScriptCode ; tagToCode["limb"] = limbScriptCode ; tagToCode["linb"] = linbScriptCode ; tagToCode["osma"] = osmaScriptCode ; tagToCode["shaw"] = shawScriptCode ; tagToCode["tale"] = taleScriptCode ; tagToCode["ugar"] = ugarScriptCode ; tagToCode["hrkt"] = hrktScriptCode ; tagToCode["bugi"] = bugiScriptCode ; tagToCode["glag"] = glagScriptCode ; tagToCode["khar"] = kharScriptCode ; tagToCode["sylo"] = syloScriptCode ; tagToCode["talu"] = taluScriptCode ; tagToCode["tfng"] = tfngScriptCode ; tagToCode["xpeo"] = xpeoScriptCode ; tagToCode["bali"] = baliScriptCode ; tagToCode["batk"] = batkScriptCode ; tagToCode["blis"] = blisScriptCode ; tagToCode["brah"] = brahScriptCode ; tagToCode["cham"] = chamScriptCode ; tagToCode["cirt"] = cirtScriptCode ; tagToCode["cyrs"] = cyrsScriptCode ; tagToCode["egyd"] = egydScriptCode ; tagToCode["egyh"] = egyhScriptCode ; tagToCode["egyp"] = egypScriptCode ; tagToCode["geok"] = geokScriptCode ; tagToCode["hans"] = hansScriptCode ; tagToCode["hant"] = hantScriptCode ; tagToCode["hmng"] = hmngScriptCode ; tagToCode["hung"] = hungScriptCode ; tagToCode["inds"] = indsScriptCode ; tagToCode["java"] = javaScriptCode ; tagToCode["kali"] = kaliScriptCode ; tagToCode["latf"] = latfScriptCode ; tagToCode["latg"] = latgScriptCode ; tagToCode["lepc"] = lepcScriptCode ; tagToCode["lina"] = linaScriptCode ; tagToCode["mand"] = mandScriptCode ; tagToCode["maya"] = mayaScriptCode ; tagToCode["mero"] = meroScriptCode ; tagToCode["nko "] = nkooScriptCode ; tagToCode["orkh"] = orkhScriptCode ; tagToCode["perm"] = permScriptCode ; tagToCode["phag"] = phagScriptCode ; tagToCode["phnx"] = phnxScriptCode ; tagToCode["plrd"] = plrdScriptCode ; tagToCode["roro"] = roroScriptCode ; tagToCode["sara"] = saraScriptCode ; tagToCode["syre"] = syreScriptCode ; tagToCode["syrj"] = syrjScriptCode ; tagToCode["syrn"] = syrnScriptCode ; tagToCode["teng"] = tengScriptCode ; tagToCode["vai "] = vaiiScriptCode ; tagToCode["visp"] = vispScriptCode ; tagToCode["xsux"] = xsuxScriptCode ; tagToCode["zxxx"] = zxxxScriptCode ; tagToCode["zzzz"] = zzzzScriptCode ; } } GlyphList IcuShaper::doShape ( const QString & s ) { GlyphList ret; int glAllocated ( 0 ); LEErrorCode err(LE_NO_ERROR); LEUnicode16 *ts = new LEUnicode[s.count() ]; for ( int i ( 0 ); i< s.count();++i ) { ts[i] = s[i].unicode(); // cerr << "["<< s[i].unicode() << "]"; } // cerr<< std::endl; icuLE->reset(); int sCount (s.count()); glAllocated = icuLE->layoutChars ( ts, 0,sCount , sCount, false, 0, 0, err ) ; IcuError(err); // cerr<<"provided "<getGlyphs ( glyphs, err ); icuLE->getCharIndices ( indices, err ); icuLE->getGlyphPositions ( positions, err ); float stackX ( 0.0 ); for ( int gIdx ( 0 ); gIdx < glAllocated ; ++gIdx ) { if(glyphs[gIdx] != 0xFFFF) { RenderedGlyph rg; rg.glyph = glyphs[gIdx]; rg.log = indices[gIdx]; rg.lChar = s[rg.log].unicode(); rg.xadvance = positions[ ( gIdx + 1 ) * 2] - stackX; rg.yadvance = positions[ ( ( gIdx + 1 ) * 2 ) + 1]; rg.xoffset = rg.yoffset = 0; stackX += rg.xadvance; ret << rg; } // cerr<< "["<< indices[gIdx] <<"]"; // cerr<< "["<< glyphs[gIdx] <<"]"; // cerr<< std::endl; } icuLE->reset(); delete ts; delete glyphs; delete indices; delete positions; return ret; } void IcuShaper::IcuError(int err) { switch ( err ) { case LE_NO_SUBFONT_WARNING : qDebug()<<"The font does not contain subfonts.";break; // case LE_NO_ERROR : qDebug()<<"No error, no warning.";break; case LE_ILLEGAL_ARGUMENT_ERROR : qDebug()<<"An illegal argument was detected.";break; case LE_MEMORY_ALLOCATION_ERROR : qDebug()<<"Memory allocation error.";break; case LE_INDEX_OUT_OF_BOUNDS_ERROR : qDebug()<<"Trying to access an index that is out of bounds.";break; case LE_NO_LAYOUT_ERROR : qDebug()<<"You must call layoutChars() first.";break; case LE_INTERNAL_ERROR : qDebug()<<"An internal error was encountered.";break; case LE_FONT_FILE_NOT_FOUND_ERROR : qDebug()<<"The requested font file cannot be opened.";break; case LE_MISSING_FONT_TABLE_ERROR : qDebug()<<"The requested font table does not exist.";break; default:/*qDebug()<<"NoCode"*/; } } /// Je suis furieux d’avoir à écrire ça - pm IcuFontImpl *IcuFontImpl::instance = 0; IcuFontImpl::IcuFontImpl ( FMOtf * o ) :otf ( o ) { instance = this; } IcuFontImpl::~ IcuFontImpl() { foreach(unsigned char* p, tables) { delete p; } } const void * IcuFontImpl::getFontTable ( LETag tableTag ) const { // qDebug()<< "IcuFontImpl::getFontTable" << OTF_tag_name( tableTag ); FT_Face face ( otf->face() ); FT_ULong length(0); if ( !FT_Load_Sfnt_Table ( face, tableTag, 0, NULL, &length ) ) { if ( length > 0 ) { // qDebug()<<"Table len"<< length; FT_Byte * bA = new FT_Byte[length]; FT_Load_Sfnt_Table ( face, tableTag, 0, bA, &length ); regTables( tableTag, bA ); return (const void*) tables.value(tableTag); } } return 0; } le_int32 IcuFontImpl::getUnitsPerEM() const { return otf->face()->units_per_EM; } LEGlyphID IcuFontImpl::mapCharToGlyph ( LEUnicode32 ch ) const { int gi(FT_Get_Char_Index ( otf->face(), ch )); // cerr << "IcuFontImpl::mapCharToGlyph("<< ch <<") = "<face() ); if ( !FT_Load_Glyph ( face, glyph , FT_LOAD_NO_SCALE ) ) { advance.fX = face->glyph->metrics.horiAdvance; advance.fY = face->glyph->metrics.vertAdvance; } else { advance.fX = 0; advance.fY = 0; } } le_bool IcuFontImpl::getGlyphPoint ( LEGlyphID glyph, le_int32 pointNumber, LEPoint & point ) const { // cerr<< "IcuFontImpl::getGlyphPoint" <face()->ascender; } le_int32 IcuFontImpl::getDescent() const { return otf->face()->descender; } le_int32 IcuFontImpl::getLeading() const { return 0; } fontmatrix-0.6.0+svn20110930/src/treeitem.h0000644000175000017500000000302111147562531017107 0ustar malexmalex/**************************************************************************** ** ** Copyright (C) 2005-2007 Trolltech ASA. All rights reserved. ** ** This file is part of the example classes of the Qt Toolkit. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://www.trolltech.com/products/qt/opensource.html ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://www.trolltech.com/products/qt/licensing.html or contact the ** sales department at sales@trolltech.com. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #ifndef TREEITEM_H #define TREEITEM_H #include #include class TreeItem { public: TreeItem ( const QList &data, TreeItem *parent = 0 ); ~TreeItem(); void appendChild ( TreeItem *child ); TreeItem *child ( int row ); int childCount() const; int columnCount() const; QVariant data ( int column ) const; int row() const; TreeItem *parent(); private: QList childItems; QList itemData; TreeItem *parentItem; }; #endif fontmatrix-0.6.0+svn20110930/src/fmencdata.h0000644000175000017500000000120311221431364017203 0ustar malexmalex// // C++ Interface: fmencdata // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMENCDATA_H #define FMENCDATA_H #include #include #include class FMEncData { static FMEncData * instance; FMEncData(); static FMEncData * that(); QMap langIdMap; void fillLangIdMap(); QMap > os2URangeMap; void fillOs2URAnges(); public: static const QMap& LangIdMap(); static const QMap >& Os2URanges(); }; #endif // FMENCDATA_H fontmatrix-0.6.0+svn20110930/src/filteritem.h0000644000175000017500000000366411423011263017436 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FILTERITEM_H #define FILTERITEM_H #include class FilterData; namespace Ui { class FilterItem; } class FilterItem : public QWidget { Q_OBJECT FilterData* d; QString text; public: enum Operation{ AND, OR, NOT }; explicit FilterItem(FilterData *filter, QWidget *parent = 0); ~FilterItem(); FilterData* filter(){return d;} void hideOperation(Operation op); protected: void changeEvent(QEvent *e); private: Ui::FilterItem *ui; signals: void remove(); private slots: void setAndMode(bool c); void setNoMode(bool c); }; #endif // FILTERITEM_H fontmatrix-0.6.0+svn20110930/src/remotedir.h0000644000175000017500000000314711513341510017261 0ustar malexmalex// // C++ Interface: remotedir // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef REMOTEDIR_H #define REMOTEDIR_H #include #include #include #include // #include class QBuffer; class QByteArray; class QHttp; /** @author Pierre Marchand */ class RemoteDir : public QObject { Q_OBJECT public: struct FontInfo { QString file; QString family; QString variant; QString type; QString info; QStringList tags; QPixmap pix; QString dump(); }; RemoteDir ( const QStringList &dirs ); ~RemoteDir(); void run(); QList rFonts(){return m_fonts;} bool isReady(){return m_ready;} private: QStringList argDirs; bool m_ready; QList https; QList buffers; QMap rDirs; // < GET Id, QMap httpRequests; // < GET Id, buffer > QMap httpBuffers; // < GET Id, http > QMap reverseHttp; // < GET Id, path > QMap httpPaths; //< file, preview> QMap pixmaps; QMap pendingPixmaps; QList m_fonts; void getPreviews(); void eventEndDownload(); bool stopperEndReq; bool stopperEndPreviews; bool stopper; private slots: void slotProgress(int done, int total); void slotEndReq(int id, bool error); void slotEndPreviews(int id, bool error); signals: void listIsReady(); }; #endif fontmatrix-0.6.0+svn20110930/src/fmmatchraster.h0000644000175000017500000000254311204527444020137 0ustar malexmalex// // C++ Interface: fmmatchraster // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FMMATCHRASTER_H #define FMMATCHRASTER_H #include "ui_matchraster.h" #include #include class FontItem; class FMMatchRaster : public QDialog , private Ui::MatchRasterDialog { Q_OBJECT public: FMMatchRaster(QWidget * parent); ~FMMatchRaster(); private: QRect curRect; QRgb curCol; // QMap mItems; unsigned int refCodepoint; QImage refImage; int m_compsize; int m_minRefSize; bool m_waitingForButton; int m_progressValue; double m_matchLimit; QList compFonts; QList remainFonts; QList filteredFonts; FontItem* waitingFont; QImage autoCrop(const QImage& img); protected: void moveEvent ( QMoveEvent * event ); void resizeEvent ( QResizeEvent * event ); private slots: void browseImage(); void loadImage(); void grabScreen(); void enterGrabMode(bool); void zoomChanged(int); void addImage(const QString & text); void search(); void switchControlRect(bool); void slotAcceptFont(); void slotRefuseFont(); void slotStop(); void recordCurrentRect(QRect); void recordCurrentColor(QRgb); }; #endif // FMMATCHRASTER_H fontmatrix-0.6.0+svn20110930/src/layoutoptions.ui0000644000175000017500000003336111167457123020424 0ustar malexmalex LayoutOptionWidget 0 0 396 350 0 0 Text layout engine options Weights Qt::Horizontal 40 20 Qt::Horizontal 40 20 1 1000 true Qt::Vertical QSlider::NoTicks score Qt::AlignCenter beforeSlid Before Qt::AlignHCenter|Qt::AlignTop true 1 1000 true Qt::Vertical score Qt::AlignCenter fitSlid Exact Qt::AlignHCenter|Qt::AlignTop true Qt::Horizontal 40 20 Qt::Horizontal 40 20 1 1000 true Qt::Vertical Qt::Horizontal 40 20 Qt::Horizontal 40 20 score Qt::AlignCenter afterSlid After Qt::AlignHCenter|Qt::AlignTop true 1 1000 true Qt::Vertical Qt::Horizontal 40 20 Qt::Horizontal 40 20 score Qt::AlignCenter endSlid End Qt::AlignCenter 1000 true Qt::Vertical Qt::Horizontal 40 20 Qt::Horizontal 40 20 penalty Qt::AlignCenter hyphSlid H-penalty Qt::AlignHCenter|Qt::AlignTop true 1 100 Qt::Vertical Qt::Horizontal 40 20 Qt::Horizontal 40 20 space Qt::AlignCenter spaceSlid Max. compression Qt::AlignCenter true fontmatrix-0.6.0+svn20110930/src/puzzleviewimp.cpp0000644000175000017500000000503411167445115020564 0ustar malexmalex// // C++ Implementation: puzzleviewimp // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #include "puzzleviewimp.h" #include PuzzleViewImp::PuzzleViewImp ( const QString & iPath , QRgb patternColor) :pc(patternColor) { QImage qimage( iPath ); if ( !qimage.isNull() ) { init(qimage); } } PuzzleViewImp::PuzzleViewImp ( const QImage & qimg , QRgb patternColor) :pc(patternColor) { init(qimg); } PuzzleViewImp::~ PuzzleViewImp() { } void PuzzleViewImp::init(const QImage & qimg) { // qDebug()<<"PuzzleViewImp::init"< sumrow; QList sumcol; sumrow.clear(); sumcol.clear(); double sum(0); // sums of patterns by row for(unsigned int y(0);y < ih;++y) { sum = 0; for(int x(0);x < iw;++x) { if(qimg.pixel(x,y) == pc) sum += 1.0; } sumrow << sum; } // sums of patterns by column for(unsigned int x(0);x < iw;++x) { sum = 0; for(int y(0);y < ih;++y) { if(qimg.pixel(x,y) == pc) sum += 1.0; } sumcol << sum; } const unsigned int maxIdx(qMax(iw,ih)); for(unsigned int i(0); i < maxIdx;++i) { if(i >= iw) append(SVect(sumrow[i], 0.0)); else if(i >= ih) append(SVect(0.0 , sumcol[i])); else append(SVect(sumrow[i], sumcol[i])); } } QList< double > PuzzleViewImp::CompList(const PuzzleViewImp & other) { // qDebug()<<"PuzzleViewImp::CompList"; QList ret; if((!count()) || (count() != other.count())) { return ret; } const unsigned int c(count()); for(unsigned int i(0);i < c;++i) { ret << at(i).squareDistance(other.at(i)); } return ret; } double PuzzleViewImp::CompSum(const PuzzleViewImp & other) { // qDebug()<<"PuzzleViewImp::CompSum"; double ret(0); if((!count()) || (count() != other.count())) { return -1.0; } const unsigned int c(count()); for(unsigned int i(0);i < c;++i) { ret += at(i).squareDistance(other.at(i)); } return ret; } double PuzzleViewImp::CompMean(const PuzzleViewImp & other) { // qDebug()<<"PuzzleViewImp::CompMean"; double ret(0); if((!count()) || (count() != other.count())) { // qDebug()<<"C"<< count()<<"O.C"<(c); } fontmatrix-0.6.0+svn20110930/src/iview.cpp0000644000175000017500000001773611204527444016767 0ustar malexmalex// // C++ Implementation: iview // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #include "iview.h" #include #include #include #include #include IView::IView ( QWidget * parent ) :QGraphicsView ( parent ) { curImage = 0; m_controlRect = false; setScene ( new QGraphicsScene ); setInteractive ( true ); theRect = QRect(); isSelecting = false; isPanning = false; setAlignment ( Qt::AlignTop | Qt::AlignHCenter ); setTransformationAnchor ( QGraphicsView::NoAnchor ); setRenderHint ( QPainter::Antialiasing, true ); curSel = scene()->addPolygon ( QPolygonF() ,QPen ( Qt::NoPen ), QColor ( 10,10,10,100 ) ); curSel->setZValue ( 1.0 ); QPen rctPen(Qt::blue, 2); rctPen.setCosmetic(true); curRect = scene()->addRect(QRect(),rctPen, QBrush(Qt::NoBrush)); curRect->setZValue(10.0); QPen edgP(Qt::NoPen); edgP.setCosmetic(true); curTL = scene()->addEllipse(QRect(), edgP, Qt::red); curTR = scene()->addEllipse(QRect(), edgP, Qt::red); curBL = scene()->addEllipse(QRect(), edgP, Qt::red); curBR = scene()->addEllipse(QRect(), edgP, Qt::red); curTL->setZValue(100.0); curTR->setZValue(100.0); curBL->setZValue(100.0); curBR->setZValue(100.0); connect(this, SIGNAL(rectChange(QRect)), this, SLOT(drawSelRect(QRect))); } void IView::mouseMoveEvent ( QMouseEvent * e ) { ////qDebug()<<"IView::mouseMoveEvent"; if ( isPanning ) { QPointF pos ( e->pos() ); int vDelta ( qRound ( mouseStartPoint.y() - pos.y() ) ); int hDelta ( qRound ( mouseStartPoint.x() - pos.x() ) ); verticalScrollBar()->setValue ( verticalScrollBar()->value() + vDelta ); horizontalScrollBar()->setValue ( horizontalScrollBar()->value() + hDelta ); mouseStartPoint = pos; return; } else { QPointF pressPoint(mapToScene ( e->pos() )); QRectF rectTL(curTL->rect()); rectTL.translate(curRect->rect().topLeft()); QRectF rectTR(curTR->rect()); rectTR.translate(curRect->rect().topRight()); QRectF rectBR(curBR->rect()); rectBR.translate(curRect->rect().bottomRight()); QRectF rectBL(curBL->rect()); rectBL.translate(curRect->rect().bottomLeft()); if(rectTL.contains( pressPoint )) { QApplication::setOverrideCursor (Qt::SizeFDiagCursor); } else if(rectTR.contains( pressPoint )) { QApplication::setOverrideCursor (Qt::SizeBDiagCursor); } else if(rectBR.contains( pressPoint )) { QApplication::setOverrideCursor (Qt::SizeFDiagCursor); } else if(rectBL.contains( pressPoint )) { QApplication::setOverrideCursor (Qt::SizeBDiagCursor); } else QApplication::restoreOverrideCursor(); } if ( !isSelecting ) return; if(m_controlRect) { QPointF mp(mapToScene ( e->pos() )); { QRectF r ( mouseStartPoint, mp ); theRect = r.normalized().toRect() ; } emit rectChange(theRect); } } void IView::mousePressEvent ( QMouseEvent * e ) { //qDebug()<<"IView::mousePressEvent"; if ( !scene() ) return; if ( e->button() == Qt::MidButton ) { mouseStartPoint = e->pos() ; isPanning = true; QApplication::setOverrideCursor ( QCursor ( Qt::ClosedHandCursor ) ); } else { QPointF pressPoint(mapToScene ( e->pos() )); if(!m_controlRect) selectGlyph(pressPoint); else { QRectF rectTL(curTL->rect()); rectTL.translate(curRect->rect().topLeft()); QRectF rectTR(curTR->rect()); rectTR.translate(curRect->rect().topRight()); QRectF rectBR(curBR->rect()); rectBR.translate(curRect->rect().bottomRight()); QRectF rectBL(curBL->rect()); rectBL.translate(curRect->rect().bottomLeft()); if(rectTL.contains( pressPoint )) { mouseStartPoint = curRect->rect().bottomRight(); } else if(rectTR.contains( pressPoint )) { mouseStartPoint = curRect->rect().bottomLeft(); } else if(rectBR.contains( pressPoint )) { mouseStartPoint = curRect->rect().topLeft(); } else if(rectBL.contains( pressPoint )) { mouseStartPoint = curRect->rect().topRight(); } else mouseStartPoint = pressPoint; } isSelecting = true; } } void IView::mouseReleaseEvent ( QMouseEvent * e ) { //qDebug()<<"IView::mouseReleaseEvent"; if ( isPanning ) { isPanning = false; QApplication::restoreOverrideCursor(); return; } if ( !isSelecting ) return; isSelecting = false; // theRect = QRect(); } void IView::setImage ( const QString & path ) { //qDebug()<<"IView::setImage"; if ( curImage ) { delete curImage; curImage = 0; } QImage i ( path ); if ( i.isNull() ) return; curImage = scene()->addPixmap ( QPixmap::fromImage ( i ) ); fitImage(); drawSelRect(QRect()); } void IView::setImage(const QPixmap & pixmap) { //qDebug()<<"IView::setImage"; if ( curImage ) { delete curImage; curImage = 0; } curImage = scene()->addPixmap ( pixmap ); fitImage(); drawSelRect(QRect()); } QPixmap IView::getPixmap() { //qDebug()<<"IView::getPixmap"; if ( curImage ) { return curImage->pixmap(); } return QPixmap(); } void IView::drawSelRect(QRect r) { //qDebug()<<"IView::drawSelRect"; if(r.isNull()) { curSel->setPolygon ( QPolygonF() ); curRect->setRect(QRect()); curTL->setRect(QRect()); curTR->setRect(QRect()); curBR->setRect(QRect()); curBL->setRect(QRect()); return; } // mask QPolygonF p; QRect ir(curImage->boundingRect().toRect()); p << ir.topLeft() << ir.topRight() << ir.bottomRight() << ir.bottomLeft() << ir.topLeft() ; p << r.topLeft() << r.bottomLeft() << r.bottomRight() << r.topRight()<< r.topLeft() ; curSel->setPolygon (p); // rect curRect->setRect(r); // edges if(m_controlRect) { QRectF baseR(-4,-4,8,8); QTransform t; double hs(transform().m11()); double vs(transform().m22()); t.scale(1.0 / hs, 1.0 / vs); baseR = t.mapRect(baseR); curTL->setRect(baseR); curTR->setRect(baseR); curBR->setRect(baseR); curBL->setRect(baseR); curTL->setPos(r.topLeft()); curTR->setPos(r.topRight()); curBL->setPos(r.bottomLeft()); curBR->setPos(r.bottomRight()); } } void IView::fitImage() { //qDebug()<<"IView::fitImage"; if(!curImage) return; double wR = width() /curImage->boundingRect().width() ; double hR = height()/ curImage->boundingRect().height(); double R = (wR > hR) ? hR : wR; QTransform T; T.scale(R,R); setTransform( T , false); } void IView::resizeEvent(QResizeEvent * event) { //qDebug()<<"View::resizeEvent"; fitImage(); } void IView::selectGlyph(const QPointF & scenepos) { //qDebug()<<"IView::selectGlyph"; // const unsigned int treshold (5); if(!curImage) return; QPoint imgp(curImage->mapFromScene(scenepos).toPoint()); QImage cImg(curImage->pixmap().toImage()); QRgb ref(cImg.pixel(imgp)); // crop it QRect r; const int cw = cImg.width(); const int ch = cImg.height(); bool topReached(false); for(int y(0); y < ch; ++y) { for(int x(0);x < cw; ++x) { if(cImg.pixel(x,y) == ref) { topReached = true; r.setTop(y); break; } } if(topReached) break; } bool bottomReached(false); for(int y(ch - 1); y >= 0; --y) { for(int x(cw-1);x >=0; --x) { if(cImg.pixel(x,y) == ref) { bottomReached = true; r.setBottom(y); break; } } if(bottomReached) break; } r.setLeft(cw); for(int y(0); y < ch; ++y) { for(int x(0);x < cw; ++x) { if(cImg.pixel(x,y) == ref) { r.setLeft(qMin(x,r.left())); break; } } } r.setRight(0); for(int y(0); y < ch; ++y) { for(int x(cw -1);x >= 0; --x) { if(cImg.pixel(x,y) == ref) { r.setRight(qMax(x,r.right())); break; } } } //qDebug()<<"R"<setRect(QRect()); curTR->setRect(QRect()); curBR->setRect(QRect()); curBL->setRect(QRect()); } } fontmatrix-0.6.0+svn20110930/src/helpbrowser.ui0000644000175000017500000001244211150601271020007 0ustar malexmalex HelpBrowser 0 0 630 548 Fontmatrix Help Qt::Horizontal false 0 &Contents Qt::ScrollBarAsNeeded Se&arch Searching is case insensitive &Search 1 Book&marks 1 &New &Delete D&elete All 0 0 630 28 Fontmatrix Help TopToolBarArea false &Print... &Exit &Find... Find &Next... Find &Previous... &Add &Delete D&elete All ScTextBrowser QWidget
sctextbrowser.h
fontmatrix-0.6.0+svn20110930/src/prefspaneldialog.h0000644000175000017500000000515311166164170020616 0ustar malexmalex// // C++ Interface: prefspaneldialog // // Description: // // // Author: Pierre Marchand , (C) 2007 // // Copyright: See COPYING file that comes with this distribution // // #ifndef PREFSPANELDIALOG_H #define PREFSPANELDIALOG_H #include #include class QStandardItemModel; /** @author Pierre Marchand */ class PrefsPanelDialog : public QDialog, private Ui::PrefsPanel { Q_OBJECT public: PrefsPanelDialog ( QWidget *parent ); ~PrefsPanelDialog(); enum PAGE{PAGE_GENERAL = 0, PAGE_SYSTRAY, PAGE_DISPLAY, PAGE_SERVICES, PAGE_SAMPLETEXT, PAGE_FILES, PAGE_SHORTCUTS}; void initSystrayPrefs(bool hasSystray, bool isVisible, bool hasActivateAll, bool allConfirmation, bool tagConfirmation); void initSampleTextPrefs(); void initFilesAndFolders(); void initShortcuts(); void showPage(PAGE page); bool event( QEvent* ev ); void keyPressEvent(QKeyEvent *k); void keyReleaseEvent(QKeyEvent *k); static QString getKeyText(int KeyC); private: void doConnect(); QStandardItemModel *shortcutModel; /* For the keyboard shortcut */ int keyCode; QString Part0; QString Part1; QString Part2; QString Part3; QString Part4; void shortcutSet(const QString &shortcut); void reloadShortcuts(); void setSelected(const QString &actionText); private slots: void slotSelectPage(QListWidgetItem * item); void applySampleText(); void addSampleName(); void deleteSampleName(); void validateSampleName(); void displayNamedText(); void setSystrayVisible(bool); void setSystrayActivateAll(bool); void setSystrayAllConfirmation(bool); void setSystrayTagsConfirmation(bool); void updateWord(QString); void updateWordSize(double); void updateWordRTL(int); void updateWordSubtitled(int); void updateChartFontFamily(const QFont & font); void updateChartFontSize(int); void setupFontEditor(QString); void slotFontEditorBrowse(); void addAndSelectWebBrowser(); void selectWebBrowser(const QString & text ); void setupWebBrowserOptions(const QString & text ); void selectInfoStyle(const QString& css); void setupTemplates(const QString&); void slotTemplatesBrowse(); void slotAddRemote(); void slotRemoveRemote(); void slotSetLocalStorage(QString s); void slotBrowseLocalStorage(); void slotShowImportedFonts(int i); // void slotFamilyNotPreferred(bool state); void slotSplashScreen(bool state); void slotChangeShortcut(); void slotClearShortcut(); void slotActionSelected(const QModelIndex &mi); void slotDictDialog(); void slotClose(); }; #endif fontmatrix-0.6.0+svn20110930/src/fmbrowser.cpp0000644000175000017500000000076111147562531017642 0ustar malexmalex// // C++ Implementation: fmbrowser // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fmbrowser.h" #include FMBrowser * FMBrowser::instance = 0; FMBrowser::FMBrowser() :QProcess() { } FMBrowser::~ FMBrowser() { } FMBrowser * FMBrowser::getInstance() { } void FMBrowser::loadUrl(const QString & urlString) { } void FMBrowser::loadUrl(const QUrl & url) { } fontmatrix-0.6.0+svn20110930/src/tagswidget_listmodel.cpp0000644000175000017500000000672511513120141022040 0ustar malexmalex// Author: Pierre Marchand , (C) 2011 // // Copyright: See COPYING file that comes with this distribution // // #include "tagswidget_listmodel.h" #include "fontitem.h" #include "fmfontdb.h" #include #include #include TagsWidget_ListModel::TagsWidget_ListModel(QObject *parent) :QAbstractListModel(parent), newTagString(tr("New Tag")) { connect(FMFontDb::DB(), SIGNAL(tagsChanged()), this, SLOT(updateTags())); } void TagsWidget_ListModel::updateTags() { emit dataChanged(index(0), index(rowCount() - 1)); } int TagsWidget_ListModel::rowCount(const QModelIndex &parent) const { if(parent.isValid()) return 0; return FMFontDb::DB()->getTags().count(); } int TagsWidget_ListModel::columnCount(const QModelIndex &parent) const { if(parent.isValid()) return 0; return 1; } QVariant TagsWidget_ListModel::data(const QModelIndex &index, int role) const { if(!index.isValid() && index.column() != 0) return QVariant(); QStringList tl_tmp = FMFontDb::DB()->getTags(); tl_tmp.sort(); QString tag(tl_tmp.at(index.row())); if(role == Qt::DisplayRole) { return tag; } else if(role == Qt::EditRole) return tag; else if(role == Qt::CheckStateRole) { if(tags.contains(tag)) return Qt::Checked; return Qt::Unchecked; } else if(role == Qt::FontRole) { QFont dfont; if(tags.contains(tag)) { dfont.setBold(true); return dfont; } return dfont; } return QVariant(); } bool TagsWidget_ListModel::setData(const QModelIndex &index, const QVariant &value, int role) { if(!index.isValid()) return false; if(value.toString().isEmpty()) return false; if(role == Qt::CheckStateRole) { QStringList tl_tmp = FMFontDb::DB()->getTags(); tl_tmp.sort(); QString tag(tl_tmp.at(index.row())); if(Qt::CheckState(value.toInt()) == Qt::Checked) { if(!tags.contains(tag)) { FMFontDb::DB()->TransactionBegin(); foreach(FontItem* f, fonts) f->addTag(tag); FMFontDb::DB()->TransactionEnd(); tags.append(tag); emit dataChanged(index, index); return true; } else return false; } else if(Qt::CheckState(value.toInt()) == Qt::Unchecked) { if(tags.contains(tag)) { FMFontDb::DB()->TransactionBegin(); foreach(FontItem* f, fonts) FMFontDb::DB()->removeTag(f->path(), tag); FMFontDb::DB()->TransactionEnd(); tags.removeAll(tag); emit dataChanged(index, index); return true; } else return false; } } else if(role == Qt::EditRole || role == Qt::DisplayRole) { QStringList tl_tmp = FMFontDb::DB()->getTags(); tl_tmp.sort(); if(value.toString() == tl_tmp.at(index.row())) return false; FMFontDb::DB()->editTag ( tl_tmp.at(index.row()), value.toString()); emit dataChanged(index, index); return true; } return false; } Qt::ItemFlags TagsWidget_ListModel::flags(const QModelIndex &index) const { return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable; } void TagsWidget_ListModel::setFonts(const QList &flist) { fonts.clear(); fonts = flist; if(fonts.count() > 0) tags = fonts.first()->tags(); updateTags(); } QModelIndex TagsWidget_ListModel::addTag() { if(FMFontDb::DB()->getTags().contains(newTagString)) return QModelIndex(); FMFontDb::DB()->addTagToDB(newTagString); updateTags(); QStringList tl_tmp = FMFontDb::DB()->getTags(); tl_tmp.sort(); for(int i(0); i < tl_tmp.count(); ++i) { if(tl_tmp.at(i) == newTagString) return index(i); } } fontmatrix-0.6.0+svn20110930/src/prefs_panel.ui0000644000175000017500000010414311223146560017757 0ustar malexmalex PrefsPanel 0 0 701 430 Preferences Panel :/fontmatrix_icon.png:/fontmatrix_icon.png Qt::Horizontal 729 20 Close Qt::Horizontal 1 0 150 0 9 50 false false Qt::ScrollBarAlwaysOff 5 General System tray Display Service Samples collection Files & Folders Shortcuts 2 0 0 General Ask for tag names when importing fonts Show names of imported fonts after import process Show splash at startup Qt::Vertical 20 40 Show Fontmatrix in System Tray false true false Close to system tray true Start minimized to system tray Show "All" actions Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter false true Ask for confirmation when activating or deactivating all fonts true Ask for confirmation when activating or deactivating fonts by tags Qt::Vertical 20 40 Preview Word Word: previewWord 300 0 Qt::Horizontal 40 20 1 0 Default font size: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter previewSizeSpin 2 0 false true pt 1 1.000000000000000 10.000000000000000 subtitled is RTL Chart Subtitle Font 0 0 pt 1 0 Size: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter chartFontSpin chartFontCombo chartFontSpin label_8 Initial Layout Font Size: fontSizeSpin pt 1.000000000000000 linespacing: interLineSpin pt 1.000000000000000 fontSizeSpin label_3 interLineSpin label_2 Information Style Select Style infoStyleCombo Fonts Editor 300 0 Add the full path to your preferred font editor /usr/bin/fontforge Browse... Qt::Horizontal 151 22 Help Browser 0 0 Extra options: browserOptions Qt::Horizontal 40 20 Browse... Qt::Horizontal 40 20 Select an hyphenation dict file as it comes with OpenOffice or Scribus Hyphenation dictionary Browse Browse... Qt::Horizontal 205 20 Left: fontSizeSpin Right: interLineSpin Qt::Vertical 469 69 0 0 Sample Texts Qt::Horizontal 1 0 0 2 0 0 30 16777215 + 0 0 30 16777215 3 0 3 0 Save Qt::Horizontal 40 20 Qt::Horizontal 40 20 Templates Folder 300 0 Browse... Qt::Horizontal 40 20 Remote directories http:// 100 0 Add Remove Qt::Vertical 100 41 Qt::Horizontal Local storage Browse... 0 0 Change true 0 0 Remove TextLabel Qt::Horizontal 387 26 QAbstractItemView::NoEditTriggers fontmatrix-0.6.0+svn20110930/src/fontbook.h0000644000175000017500000000542711446426067017133 0ustar malexmalex// // C++ Interface: fontbook // // Description: // // // Author: Pierre Marchand , (C) 2007 // // Copyright: See COPYING file that comes with this distribution // // #ifndef FONTBOOK_H #define FONTBOOK_H #include #include #include #include #include #include #include #include class ProgressBarDuo; /** @author Pierre Marchand It’s time to write something more "definitive" :) */ struct TextElementStyle { QString name; QString font; // _FONTMATRIX_ is reserved double fontsize; double lineheight; QColor color; double margin_top,margin_left,margin_bottom,margin_right; TextElementStyle () {} TextElementStyle ( QString n, QString f, double fs, double lh, double mt, double ml, double mb, double mr, QColor co) : name(n), font ( f ), fontsize ( fs ), lineheight ( lh ), margin_top ( mt ), margin_left ( ml ), margin_bottom ( mb ), margin_right ( mr ), color ( co ) {} }; struct TextElement { QString e; bool valid; /** Has to be set if "e" must be substituted with a contextual info available infos depend of level and are : - Family - SubFamily - Encoding - PageNumber - ... At some point, I’ll provide a reference. */ // bool internal; OBSOLETE - substitution will be regexpizated ##KEYWORD## TextElement():valid(false){} TextElement ( QString elem) :e ( elem ), valid(true){} }; /** GraphicElement will be made by where svg comes from regular svg file. */ struct GraphicElement { QString name; double x,y; QString svg; // OBSOLETE :) bool valid; GraphicElement(QString aName, QString svgstring, double xpos,double ypos):name(aName),svg(svgstring.startsWith("\n" + svgstring)),x(xpos),y(ypos),valid(true){} GraphicElement():name("noname"),svg(""),x(0.0),y(0.0),valid(false){} }; struct FontBookContext { TextElement textElement; TextElementStyle textStyle; GraphicElement graphic; /* enum FBCLevel{PAGE, FAMILY, SUBFAMILY}; FBCLevel level;*/ }; class FontBook : public QObject { public: enum Style { Full, OneLiner }; FontBook(); ~FontBook(); void doBook(Style s); private: void doFullBook(); void doFullBookCover(); // return true if uses only its page, false if it spreads over the 2 pages bool doFullBookPageLeft(const QString& family); void doFullBookPageRight(const QString& family); void doOneLinerBook(); QPrinter * printer; QPainter * painter; QRectF printerRect; QStringList stringList; ProgressBarDuo * progress; QString outputFilePath; QMap mapPSize; void doBookFromTemplate ( const QDomDocument &aTemplate ); }; #endif fontmatrix-0.6.0+svn20110930/src/filtersdialogitem.h0000644000175000017500000000377411422257063021014 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FILTERSDIALOGITEM_H #define FILTERSDIALOGITEM_H #include #include namespace Ui { class FiltersDialogItem; } class FiltersDialogItem : public QWidget { Q_OBJECT public: explicit FiltersDialogItem(const QString& name, const QString& f, QWidget *parent = 0); ~FiltersDialogItem(); protected: void enterEvent(QEvent *); void leaveEvent(QEvent *); private: Ui::FiltersDialogItem *ui; void setButtonsVisible(bool v); QString filterName; private slots: void slotFilter(); void slotRemove(); signals: void Filter(QString); void Remove(QString); }; #endif // FILTERSDIALOGITEM_H fontmatrix-0.6.0+svn20110930/src/activationwidgetitem.h0000644000175000017500000000361211431446461021522 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef ACTIVATIONWIDGETITEM_H #define ACTIVATIONWIDGETITEM_H #include namespace Ui { class ActivationWidgetItem; } class ActivationWidgetItem : public QWidget { Q_OBJECT public: explicit ActivationWidgetItem(const QString& fontID, QWidget *parent = 0); ~ActivationWidgetItem(); void changeState(bool s); protected: void changeEvent(QEvent *e); private: const QString fileName; Ui::ActivationWidgetItem *ui; private slots: void activate(bool a); signals: void fontStateChanged(); }; #endif // ACTIVATIONWIDGETITEM_H fontmatrix-0.6.0+svn20110930/src/tttableview.cpp0000644000175000017500000000357211160442441020161 0ustar malexmalex// // C++ Implementation: tttableview // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include #include #include #include "tttableview.h" #include "fontitem.h" #include "fmfontstrings.h" TTTableView::TTTableView(FontItem * font, QWidget * parent) :QWidget(parent), m_font(font) { setupUi(this); // tView->setColumnCount (3); bool hasTable(false); QTreeWidgetItem *first; foreach( QString tname, FontStrings::Tables().keys() ) { int len(font->table(tname)); if(len > 0) { QTreeWidgetItem *twi(new QTreeWidgetItem); twi->setText(NAME, tname); twi->setText(DESCRIPTION, FontStrings::Tables()[tname]); twi->setText(SIZE, QString::number(len)); twiList << twi; tView->addTopLevelItem(twi); if(!hasTable) { hasTable = true; first = twi; } } // else // qDebug()<resizeColumnToContents(DESCRIPTION); connect(tView,SIGNAL(itemSelectionChanged()),this,SLOT(updateHexView())); connect(exportButton,SIGNAL(clicked()),this,SLOT(exportHex())); if(hasTable) { tView->setItemSelected(first,true); updateHexView(); } } TTTableView::~ TTTableView() { foreach(QTreeWidgetItem *twi, twiList) { delete twi; } } void TTTableView::updateHexView() { if(!tView->selectedItems().count()) return; QString table(tView->selectedItems()[0]->text(NAME)); curTable = m_font->tableData(table); m_data.clear(); for(int i(0);isetData(&m_data); } void TTTableView::exportHex() { if(curTable.isEmpty()) return; QString fileName = QFileDialog::getSaveFileName(this, tr("Save File")); if(fileName.isEmpty()) return; QFile f(fileName); if(f.open(QIODevice::WriteOnly)) { f.seek(0); f.write(curTable); } } fontmatrix-0.6.0+svn20110930/src/savedata.h0000644000175000017500000000326510712037452017067 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SAVEDATA_H #define SAVEDATA_H #include #include class QFile; class typotek; /** @author Pierre Marchand */ class SaveData : public QXmlStreamWriter { public: SaveData ( QFile *file,typotek *typo ); ~SaveData(); private: typotek *m_typo; void doSave(); }; #endif fontmatrix-0.6.0+svn20110930/src/familywidget.ui0000644000175000017500000001524011444077545020160 0ustar malexmalex FamilyWidget 0 0 674 627 Form 2 2 QFrame::StyledPanel QFrame::Raised 0 2 0 0 200 24 Return To List Qt::Vertical 16777215 24 Sample 16777215 24 Chart 16777215 24 Info 16777215 24 Activation Qt::Horizontal 100 20 75 true Family Name 0 30 Qt::Horizontal 0 Qt::Vertical 0 2 0 1 0 about:blank QWebView QWidget
QtWebKit/QWebView
1
FMPreviewView QListView
fmpreviewlist.h
TagsWidget QWidget
tagswidget.h
1
fontmatrix-0.6.0+svn20110930/src/fontcomparewidget.cpp0000644000175000017500000002655011443357651021365 0ustar malexmalex// // C++ Implementation: fontcomparewidget // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fontcomparewidget.h" #include "fontitem.h" #include "typotek.h" #include "fmfontdb.h" // #define RECORD_MY_REMIX #ifdef RECORD_MY_REMIX #include #include #endif #include #include FontCompareWidget* FontCompareWidget::instance = 0; FontCompareWidget::FontCompareWidget(QWidget * parent) :QWidget(parent),neverUsed(true) { setupUi(this); QSettings settings; int maxOffset(settings.value("Compare/MaxOffset", 2000).toInt()); settings.setValue("Compare/MaxOffset",maxOffset); compareOffset->setRange(0, maxOffset); initColors(); doconnect(); } FontCompareWidget::~ FontCompareWidget() { } FontCompareWidget* FontCompareWidget::getInstance() { if(instance == 0) { instance = new FontCompareWidget(0); Q_ASSERT(instance); } return instance; } void FontCompareWidget::initColors() { QSettings settings; QStringList defaultColors; defaultColors << "aqua" << "brown" << "chartreuse" << "cornflowerblue" << "darkblue" << "darkmagenta" << "olive" << "darkgrey" << "mediumvioletred" << "palevioletred" << "midnightblue" << "red" ; QPixmap px(32,32); compareFillColor->addItem(tr("None", "No fill color in comprae glyph"), "transparent"); QString colorN("Compare/color%1"); for(int i(0); i < 12; ++i) { QString colStr(settings.value(colorN.arg(i), defaultColors[i]).toString()); QColor col(colStr); px.fill(col); compareFillColor->addItem(QIcon(px), colStr, col.name()); } for(int i(0); i < 12; ++i) { QString colStr(settings.value(colorN.arg(i), defaultColors[i]).toString()); settings.setValue(colorN.arg(i), colStr);// as usual, we write it back to settings so user (me as well ;)) can see it if he opens the config file } } void FontCompareWidget::doconnect() { connect( compareAdd,SIGNAL(clicked()), this, SLOT(addFont())); connect( compareRemove,SIGNAL(clicked()), this, SLOT(removeFont())); connect( compareShow,SIGNAL(clicked()), this, SLOT(showChange())); connect( compareFillColor,SIGNAL(currentIndexChanged(int)), this, SLOT(fillChange(int))); connect( comparePoints,SIGNAL(clicked()), this, SLOT(pointsChange())); connect( compareControls,SIGNAL(clicked()), this, SLOT(controlsChange())); connect( compareMetrics,SIGNAL(clicked()), this, SLOT(metricsChange())); connect( compareOffset, SIGNAL(valueChanged(int)), this, SLOT(offsetChange(int))); connect( compareCharSelect,SIGNAL(valueChanged(int)), this, SLOT(characterChange(int))); connect( compareCharBox,SIGNAL(currentIndexChanged(int)), this, SLOT(characterBoxChange(int))); connect( compareList, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(fontChange(QListWidgetItem*,QListWidgetItem*))); connect( compareSyncChars, SIGNAL(stateChanged( int )), this, SLOT(syncChange(int))); } void FontCompareWidget::dodisconnect() { disconnect( compareAdd,SIGNAL(clicked()), this, SLOT(addFont())); disconnect( compareRemove,SIGNAL(clicked()), this, SLOT(removeFont())); disconnect( compareShow,SIGNAL(clicked()), this, SLOT(showChange())); disconnect( compareFillColor,SIGNAL(currentIndexChanged(int)), this, SLOT(fillChange(int))); disconnect( comparePoints,SIGNAL(clicked()), this, SLOT(pointsChange())); disconnect( compareControls,SIGNAL(clicked()), this, SLOT(controlsChange())); disconnect( compareMetrics,SIGNAL(clicked()), this, SLOT(metricsChange())); disconnect( compareOffset, SIGNAL(valueChanged(int)), this, SLOT(offsetChange(int))); disconnect( compareCharSelect,SIGNAL(valueChanged(int)), this, SLOT(characterChange(int))); disconnect( compareCharBox,SIGNAL(currentIndexChanged(int)), this, SLOT(characterBoxChange(int))); disconnect( compareList, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(fontChange(QListWidgetItem*,QListWidgetItem*))); disconnect( compareSyncChars, SIGNAL(stateChanged( int )), this, SLOT(syncChange(int))); } void FontCompareWidget::resetElements() { compareShow->setChecked(true); compareCharBox->adjustSize(); compareFillColor->setCurrentIndex(0); comparePoints->setChecked(false); compareControls->setCheckState(Qt::Unchecked); compareMetrics->setCheckState(Qt::Unchecked); compareOffset->setValue(0); compareOffsetValue->setText(QString::number(0)); } void FontCompareWidget::addFont() { FontItem *f(typotek::getInstance()->getSelectedFont()); if(!f) return; dodisconnect(); curFont = f->path(); QListWidgetItem* witem = new QListWidgetItem(f->fancyName()); witem->setData(Qt::UserRole, f->path()); witem->setToolTip(f->path()); // Here we say: « Deux fois valent mieux qu’une !» compareList->addItem(witem); compareList->setItemSelected(witem, true); int r(compareList->row(witem)); compareView->changeFont(compareList->row(witem), f); QColor c(compareFillColor->itemData(0).toString()); compareView->setColor(r, c); QPixmap px(32,32); px.fill(compareView->getColor(r)); witem->setIcon( QIcon(px) ); int cn(f->countChars()); compareCharSelect->setRange( 0 , cn ); compareCharBox->clear(); int cc(f->firstChar()); int curCIdx(0); for(int co(1); co <= cn; co++) { if(cc <= curcode) curCIdx = co; compareCharBox->addItem(QString("%1 (U+%2)").arg(QChar(cc)).arg(cc,4,16,QChar('0')),cc); cc = f->nextChar(cc,1); } if(!neverUsed) { characterChange(curCIdx - 1); } else { compareView->fitGlyphsView(); characterChange(0); neverUsed = false; } resetElements(); doconnect(); } void FontCompareWidget::removeFont() { if(compareList->selectedItems().isEmpty()) return; QListWidgetItem *witem(compareList->selectedItems().first()); int idx(compareList->row(witem)); compareView->removeFont(idx); resetElements(); delete witem; } void FontCompareWidget::showChange() { if(compareList->selectedItems().isEmpty()) return; int r(compareList->row(compareList->selectedItems().first())); if(compareShow->isChecked()) compareView->setElements(r, compareView->getElements(r) | FMFontCompareItem::Contour); else compareView->setElements(r, compareView->getElements(r) ^ FMFontCompareItem::Contour); } void FontCompareWidget::fillChange(int newIdx) { if(compareList->selectedItems().isEmpty()) return; QListWidgetItem * witem(compareList->selectedItems().first()); int r(compareList->row(witem)); QString colorString(compareFillColor->itemData( newIdx ).toString()); QColor color(colorString); compareView->setColor(r,color); QPixmap px(32,32); px.fill(color); witem->setIcon( QIcon(px) ); } void FontCompareWidget::pointsChange() { if(compareList->selectedItems().isEmpty()) return; int r(compareList->row(compareList->selectedItems().first())); if(comparePoints->isChecked()) compareView->setElements(r, compareView->getElements(r) | FMFontCompareItem::Points); else compareView->setElements(r, compareView->getElements(r) ^ FMFontCompareItem::Points); } void FontCompareWidget::controlsChange() { if(compareList->selectedItems().isEmpty()) return; int r(compareList->row(compareList->selectedItems().first())); if(compareControls->isChecked()) compareView->setElements(r, compareView->getElements(r) | FMFontCompareItem::Controls); else compareView->setElements(r, compareView->getElements(r) ^ FMFontCompareItem::Controls); } void FontCompareWidget::metricsChange() { if(compareList->selectedItems().isEmpty()) return; int r(compareList->row(compareList->selectedItems().first())); if(compareMetrics->isChecked()) compareView->setElements(r, compareView->getElements(r) | FMFontCompareItem::Metrics); else compareView->setElements(r, compareView->getElements(r) ^ FMFontCompareItem::Metrics); } void FontCompareWidget::offsetChange(int o) { if(compareList->selectedItems().isEmpty()) return; int r(compareList->row(compareList->selectedItems().first())); compareView->setOffset(r, o); compareOffsetValue->setText(QString::number(o)); } void FontCompareWidget::characterChange(int v) { // qDebug()<<"FontCompareWidget::characterChange"<Font(curFont)); if(!f) return; // int nc(0); if(v < 0) { // nc = curcode; } else if(v == 0) // someone asked for first char, just avoid a white space! { do { compareCharSelect->setValue(v); compareCharBox->setCurrentIndex(v); curcode = f->nextChar( f->firstChar() , v); ++v; }while(f->legitimateNonPathChars.contains(curcode)); --v; } else { curcode = f->nextChar( f->firstChar() , v); } // qDebug()<<"V"<setCurrentIndex(v); if(compareSyncChars->isChecked()) compareView->changeChar(curcode); else { if(!compareList->selectedItems().isEmpty()) { int r(compareList->row(compareList->selectedItems().first())); compareView->changeChar(r,curcode); } } // compareCharName->setText(QChar(nc)); #ifdef RECORD_MY_REMIX // a bit of fun! QImage img(compareView->size(), QImage::Format_ARGB32); QPainter p(&img); p.setRenderHint(QPainter::Antialiasing,true); compareView->render(&p); QString ip(QString("cmp-%1.png").arg(curcode,8, 10, QChar('0') )); img.save(ip.toLocal8Bit()); #endif } void FontCompareWidget::characterBoxChange(int i) { // qDebug()<<"FontCompareWidget::characterBoxChange"<Font(curFont)); if(!f) return; compareCharSelect->setValue(i); int nc(compareCharBox->itemData(i).toInt()); curcode = nc; if(compareSyncChars->isChecked()) compareView->changeChar(curcode); else { if(!compareList->selectedItems().isEmpty()) { int r(compareList->row(compareList->selectedItems().first())); compareView->changeChar(r,curcode); } } } void FontCompareWidget::fontChange(QListWidgetItem * witem, QListWidgetItem * olditem) { if(!witem) { resetElements(); return; } dodisconnect(); resetElements(); curFont = witem->data(Qt::UserRole).toString(); FontItem *f(FMFontDb::DB()->Font(curFont)); int cn(f->countChars()); compareCharBox->clear(); int curCIdx(0); int cc(f->firstChar()); for(int co(1); co <= cn; co++) { compareCharBox->addItem( QString("%1 (U+%2)").arg(QChar(cc)).arg(cc,4,16,QChar('0')),cc); if(cc < curcode) { curCIdx = co; } cc = f->nextChar(cc,1); } compareCharBox->setCurrentIndex(curCIdx); compareCharSelect->setRange( 0, cn ); compareCharSelect->setValue(curCIdx); int r(compareList->row(witem)); FMFontCompareItem::GElements e(compareView->getElements(r)); compareOffset->setValue(qRound(compareView->getOffset(r))); compareOffsetValue->setText(QString::number(compareView->getOffset(r))); QString colStr(compareView->getColor(r).name()); int colIdx(compareFillColor->findData(colStr)); compareFillColor->setCurrentIndex(colIdx); if(e.testFlag(FMFontCompareItem::Contour)) { compareShow->setChecked(true); } else { compareShow->setChecked(false); } if(e.testFlag(FMFontCompareItem::Points)) { comparePoints->setChecked(true); } else { comparePoints->setChecked(false); } if(e.testFlag(FMFontCompareItem::Controls)) { compareControls->setCheckState(Qt::Checked); } else { compareControls->setCheckState(Qt::Unchecked); } if(e.testFlag(FMFontCompareItem::Metrics)) { compareMetrics->setCheckState(Qt::Checked); } else { compareMetrics->setCheckState(Qt::Unchecked); } doconnect(); } void FontCompareWidget::syncChange(int state) { if((state == Qt::Checked) && (!neverUsed)) { characterChange(-1); } } fontmatrix-0.6.0+svn20110930/src/comparewidget.ui0000644000175000017500000001673311150757423020327 0ustar malexmalex CompareWidget 0 0 547 434 Form Qt::Horizontal 1 0 0 0 0 Fonts Add Remove Qt::Horizontal 40 20 Show true Metrics true Points true false Controls 1000 Qt::Horizontal QSlider::NoTicks 500 Offset compareOffset 0 Fill: compareFillColor 3 0 Select a character 1 1 true Qt::Horizontal Keep in sync true 12 QComboBox::AdjustToMinimumContentsLengthWithIcon 8 FMFontCompareView QGraphicsView
fmfontcompareview.h
fontmatrix-0.6.0+svn20110930/src/activationwidget.ui0000644000175000017500000000461311431446461021033 0ustar malexmalex ActivationWidget 0 0 465 364 Form Activate All Deactivate All Qt::Horizontal 147 20 true 0 0 451 320 0 Qt::Vertical 20 40 FloatingWidget QWidget
floatingwidget.h
1
fontmatrix-0.6.0+svn20110930/src/tagswidget.ui0000644000175000017500000000533411513114114017615 0ustar malexmalex tagsWidget 0 0 305 177 0 1 Form 0 1 1 2 Tags 0 0 Add a tag Add Tag false Remove Tag true Right mouse click on a tag to add it or remove it from TagSet QListView::Adjust 0 true fontmatrix-0.6.0+svn20110930/src/fmfontcompareview.cpp0000644000175000017500000003017011217731442021361 0ustar malexmalex// // C++ Implementation: fmfontcompareview // // Description: // // // Author: Pierre Marchand , (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "fmfontcompareview.h" #include "fontitem.h" #include #include #include #include #include #include #include #include #include const QString FMFontCompareItem::toolTipModel = QString("x: %1 y: %2"); /// Item FMFontCompareItem::FMFontCompareItem() :uuid(QUuid::createUuid()), scene(0),font(0),zindex(0),char_code(0),path(0) { // Nothing special :) // qDebug()<< "Create" <sceneRect()); foreach(QGraphicsLineItem* li, lines_controls) { scene->addItem(li); itemsBB = itemsBB.united(li->boundingRect()); li->setZValue(zindex); } foreach(QGraphicsLineItem* li, lines_metrics) { scene->addItem(li); itemsBB = itemsBB.united(li->boundingRect()); li->setZValue(zindex); } foreach(QGraphicsEllipseItem *ri, points) { scene->addItem(ri); itemsBB = itemsBB.united(ri->boundingRect()); ri->setZValue(zindex); } foreach(QGraphicsSimpleTextItem *ti, text_metrics) { scene->addItem(ti); ti->setZValue(zindex); } if(path) { scene->addItem(path); itemsBB = itemsBB.united(path->boundingRect()); path->setZValue(zindex); } scene->setSceneRect(itemsBB); // qDebug()<<"R"<sceneRect(); } QRectF FMFontCompareItem::boundingRect() { if(!path) return QRectF(); return path->path().boundingRect(); } void FMFontCompareItem::drawPoint(QPointF point , bool control) { double u = control ? 1.0 : 2.0; QRectF r(point.x()-u,point.y()-u,2*u,2*u); QGraphicsEllipseItem *ri = new QGraphicsEllipseItem(r); ri->setBrush(Qt::NoBrush); if(control) ri->setPen(FMFontCompareView::pens["control-point"]); else ri->setPen(FMFontCompareView::pens["point"]); QString label(toolTipModel.arg(point.x() - m_offset ).arg(-point.y())); ri->setToolTip(label.replace("-","−")); points << ri; } void FMFontCompareItem::show(FMFontCompareItem::GElements elems, QColor color, double offset) { // qDebug()<<"FMFontCompareItem::show"<fancyName(); // As it’s lightweight graphic, no need to be too much circonvoluted clear(); if(!font) return; if(!elems.testFlag(Contour)) return; m_offset = offset; double fsize(1000.0); double sf( fsize / font->getUnitPerEm() ); path = font->itemFromChar( char_code, fsize ); if(!path) { qDebug()<<"Unable to load char"<fancyName(); return; } path->moveBy(offset, 0.0); path->setPen(QPen(color)); QColor brushColor(color); QColor penColor(color); if(brushColor.alpha() > 0) { brushColor.setAlpha(255 / qMax(zindex+1,2)); } penColor.setAlpha(176); path->setBrush(brushColor); path->setPen(penColor); if(elems.testFlag(Points)) { QPointF curPos; for (int i = 0; i < path->path().elementCount(); ++i) { QPainterPath::Element cur = path->path().elementAt(i); cur.x += offset; if(cur.isMoveTo()) { curPos = cur; } else if(cur.isLineTo()) { drawPoint(curPos,false); curPos = cur; } else if(cur.isCurveTo()) { QPainterPath::Element c1 = path->path().elementAt(i + 1); QPainterPath::Element c2 = path->path().elementAt(i + 2); c1.x += offset; c2.x += offset; drawPoint(curPos,false); drawPoint(c2,false); if(elems.testFlag(Controls)) { drawPoint(cur,true); drawPoint(c1,true); QLineF l1(curPos, cur); QLineF l2(c2, c1); lines_controls << new QGraphicsLineItem(l1); lines_controls.last()->setPen(FMFontCompareView::pens["control-line"]); lines_controls << new QGraphicsLineItem(l2); lines_controls.last()->setPen(FMFontCompareView::pens["control-line"]); } i += 2; curPos = c2; } else qDebug()<<"Unknown point type"<data(GLYPH_DATA_HADVANCE).toDouble() * sf) + offset); QPointF XY(scene->views().first()->mapToScene(0,0)); QPointF WH(scene->views().first()->mapToScene(scene->views().first()->width(), scene->views().first()->height())); double minx(XY.x() + offset); double maxx(WH.x() + offset); double miny(XY.y()); double maxy(WH.y()); QLineF leftL(offset, miny, offset, maxy); QLineF rightL(xadvance,miny,xadvance,maxy); QLineF bottomL(minx,0.0,maxx,0.0); QPen mPen(penColor,1.0); // mPen.setCosmetic(true); lines_controls << new QGraphicsLineItem(leftL); lines_controls.last()->setPen(mPen); lines_controls << new QGraphicsLineItem(rightL); lines_controls.last()->setPen(mPen); lines_controls << new QGraphicsLineItem(bottomL); lines_controls.last()->setPen(mPen); QString advanceString("%1/%2"); text_metrics << new QGraphicsSimpleTextItem(advanceString.arg(path->data(GLYPH_DATA_HADVANCE).toDouble()).arg(font->getUnitPerEm())); double th(text_metrics.last()->boundingRect().height()); text_metrics.last()->setPos(xadvance, th * zindex ); text_metrics.last()->setBrush(color); } toScreen(); } /// View QMap FMFontCompareView::pens; QMap FMFontCompareView::brushes; FMFontCompareView::FMFontCompareView(QWidget * parent) :QGraphicsView(parent) { setScene(new QGraphicsScene(0,-1000,1000,1000,this)); scene()->setBackgroundBrush(Qt::white); setRenderHint(QPainter::Antialiasing,true); theRect = scene()->addRect ( QRectF(),QPen ( QColor ( 10,10,200 ) ), QColor ( 10,10,200,100 ) ); theRect->setZValue ( 1000.0 ); initPensAndBrushes(); setInteractive ( true ); isSelecting = false; isPanning = false; setAlignment ( Qt::AlignVCenter | Qt::AlignHCenter ); setTransformationAnchor ( QGraphicsView::NoAnchor ); } FMFontCompareView::~ FMFontCompareView() { } void FMFontCompareView::changeFont(int level, FontItem * font) { glyphs[level] = new FMFontCompareItem(scene(), font, level); elements[level] |= FMFontCompareItem::Contour; offsets[level] = 0.0; updateGlyphs(); } void FMFontCompareView::removeFont(int level) { if(glyphs.contains(level)) { if(glyphs[level]) delete glyphs[level]; glyphs.remove(level); } elements.remove(level); offsets.remove(level); int maxLevel(0); foreach(int l, glyphs.keys()) { maxLevel = qMax(maxLevel, l); } for(int i(level+1); i <= maxLevel; ++i) { if(glyphs.contains(i)) { glyphs[i-1] = glyphs[i]; glyphs.remove(i); glyphs[i-1]->setIndex(i-1); elements[i-1] = elements[i]; elements.remove(i); offsets[i-1] = offsets[i]; offsets.remove(i); } } updateGlyphs(); } void FMFontCompareView::changeChar(uint ccode) { thechar = ccode; foreach(int l, glyphs.keys()) { glyphs[l]->setChar(thechar); } updateGlyphs(); } void FMFontCompareView::changeChar(int level, uint ccode) { if(glyphs.contains(level)) glyphs[level]->setChar(ccode); updateGlyphs(); } void FMFontCompareView::setElements(int level, FMFontCompareItem::GElements elems) { // qDebug()<<"FMFontCompareView::setElements"<show(elements[l], colors[l], offsets[l]); } } QColor FMFontCompareView::getColor(int level) { // if(glyphs.contains(level)) // return glyphs[level]->getColor(); // return QColor(); return colors[level]; } void FMFontCompareView::mousePressEvent(QMouseEvent * e) { if ( e->button() == Qt::MidButton ) { mouseStartPoint = e->pos() ; isPanning = true; QApplication::setOverrideCursor (QCursor(Qt::ClosedHandCursor)); } else { mouseStartPoint = mapToScene ( e->pos() ); isSelecting = true; } } void FMFontCompareView::mouseReleaseEvent(QMouseEvent * e) { if ( isPanning ) { isPanning = false; QApplication::restoreOverrideCursor(); updateGlyphs(); return; } if ( !isSelecting ) return; if ( mouseStartPoint.toPoint() == mapToScene ( e->pos() ).toPoint() ) { fitGlyphsView(); isSelecting = false; theRect->setRect ( QRectF() ); return; } QRect zoomRect ( mouseStartPoint.toPoint(),mapToScene ( e->pos() ).toPoint() ); ensureVisible ( zoomRect ); isSelecting = false; fitInView ( theRect->sceneBoundingRect(), Qt::KeepAspectRatio ); theRect->setRect ( QRectF() ); } void FMFontCompareView::mouseMoveEvent(QMouseEvent * e) { if ( isPanning ) { QPointF pos ( e->pos() ); int vDelta ( qRound(mouseStartPoint.y() - pos.y()) ); int hDelta ( qRound(mouseStartPoint.x() - pos.x()) ); verticalScrollBar()->setValue ( verticalScrollBar()->value() + vDelta ); horizontalScrollBar()->setValue ( horizontalScrollBar()->value() + hDelta ); mouseStartPoint = pos; updateGlyphs(); return; } if ( !isSelecting ) return; QRectF r ( mouseStartPoint,mapToScene ( e->pos() ) ); theRect->setRect ( r ); } void FMFontCompareView::wheelEvent(QWheelEvent * e) { if ( e->modifiers().testFlag ( Qt::ControlModifier ) && e->orientation() == Qt::Vertical ) { double d( 1.0 + ( static_cast(e->delta()) / 1000.0 ) ); QTransform trans; trans.scale ( d,d ); setTransform(trans,true); } else { if ( e->orientation() == Qt::Vertical ) verticalScrollBar()->setValue ( verticalScrollBar()->value() - e->delta() ); if ( e->orientation() == Qt::Horizontal ) horizontalScrollBar()->setValue ( horizontalScrollBar()->value() - e->delta() ); } updateGlyphs(); } void FMFontCompareView::resizeEvent(QResizeEvent * event) { updateGlyphs(); } void FMFontCompareView::fitGlyphsView() { QRectF maxrect; foreach(int l, glyphs.keys()) { maxrect = maxrect.united(glyphs[l]->boundingRect()); } double hratio(static_cast(width()) / maxrect.width()); double vratio(static_cast(height()) / maxrect.height()); double shape_ratio(qMin(hratio, vratio) * 0.9); double view_ratio(qMin(hratio, vratio) * 1.5); setMatrix(QMatrix(),false); scale(shape_ratio, shape_ratio); QMatrix m; m.scale(view_ratio, view_ratio ); QRectF vr(m.mapRect(maxrect)); ensureVisible(vr); } fontmatrix-0.6.0+svn20110930/src/CMakeLists.txt0000644000175000017500000003231011513341510017650 0ustar malexmalex# Fontmatrix src/CMakeLists.txt v1 set(fontmatrix_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/aboutwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/activationwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/activationwidgetitem.cpp ${CMAKE_CURRENT_SOURCE_DIR}/browserwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/chartwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/dataexport.cpp ${CMAKE_CURRENT_SOURCE_DIR}/dataloader.cpp ${CMAKE_CURRENT_SOURCE_DIR}/dumpdialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/familywidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filterbar.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filterdata.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filtersdialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filtersdialogitem.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filteritem.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filtermeta.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filterpanose.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filtertag.cpp ${CMAKE_CURRENT_SOURCE_DIR}/floatingwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/floatingwidgetsregister.cpp ${CMAKE_CURRENT_SOURCE_DIR}/floatingwidgettoolbar.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmactivate.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmactivationreport.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmaltcontext.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmaltselector.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmbaseshaper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmdumpinfo.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmencdata.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmfloatingpreview.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmfontcompareview.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmfontdb.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmfontextract.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmfontstrings.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmfreetypelib.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmglyphhighlight.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmglyphsview.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fminfodisplay.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmkernfeat.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmlayoptwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmlayout.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmmatchraster.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmmissingfonthelper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmnamelist.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmotf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmpaths.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmplayground.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmpreviewlist.cpp # fmprintdialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmrepair.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmsampletextview.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmshaper_own.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmuniblocks.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmutils.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmvariants.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmverticalbutton.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fontbook.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fontbookdialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fontcomparewidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fontitem.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fontmatrixshaper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/glyphtosvghelper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/helpbrowser.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/helpwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/importedfontsdialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/importtags.cpp ${CMAKE_CURRENT_SOURCE_DIR}/iview.cpp ${CMAKE_CURRENT_SOURCE_DIR}/QHexView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/parallelcoor.cpp ${CMAKE_CURRENT_SOURCE_DIR}/puzzleviewimp.cpp #${CMAKE_CURRENT_SOURCE_DIR}/listdockwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mainviewwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/metawidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/modeltext.cpp ${CMAKE_CURRENT_SOURCE_DIR}/openclosearrow.cpp ${CMAKE_CURRENT_SOURCE_DIR}/panosedialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/panosematch.cpp ${CMAKE_CURRENT_SOURCE_DIR}/panosemodel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/panosewidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pangoshaper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/playwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/prefspaneldialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/progressbarduo.cpp ${CMAKE_CURRENT_SOURCE_DIR}/remotedir.cpp #${CMAKE_CURRENT_SOURCE_DIR}/savedata.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sampletoolbar.cpp ${CMAKE_CURRENT_SOURCE_DIR}/samplewidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/schelptreemodel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sctextbrowser.cpp ${CMAKE_CURRENT_SOURCE_DIR}/shortcuts.cpp ${CMAKE_CURRENT_SOURCE_DIR}/systray.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/tagseteditor.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tagswidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tagswidget_listmodel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/textprogression.cpp ${CMAKE_CURRENT_SOURCE_DIR}/treeitem.cpp ${CMAKE_CURRENT_SOURCE_DIR}/treemodel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tttableview.cpp ${CMAKE_CURRENT_SOURCE_DIR}/typotek.cpp ) IF(HARFBUZZSHAPER) SET(HARFBUZZ_SRCS harfbuzzqtshaper.cpp fmshaper.cpp) ENDIF(HARFBUZZSHAPER) IF(ICUSHAPER) SET(ICU_SRCS icushaper.cpp) ENDIF(ICUSHAPER) IF(M17NSHAPER) SET(M17N_SRCS m17nshaper.cpp ) ENDIF(M17NSHAPER) IF(PODOFO) SET(PODOFO_SRCS fmpdffontextractor.cpp ) ENDIF(PODOFO) SET(SHAPERS_SRCS ${HARFBUZZ_SRCS} ${ICU_SRCS} ${M17N_SRCS} ) SET(SHAPERS_LIBRARIES ${ICU_LIBRARIES} ${M17N_LIBRARIES} ) IF(WANT_PYTHONQT) SET(PYTHONQT_SCRIPTER_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/fmpython_w.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fmscriptconsole.cpp ) SET(PYTHONQT_SCRIPTER_MOC_HDRS fmpython_w.h fmscriptconsole.h ) SET(PYTHONQT_SCRIPTER_UIS ${CMAKE_CURRENT_SOURCE_DIR}/scriptconsole.ui ) SET(PYTHONQT_LIB PythonQt) ENDIF(WANT_PYTHONQT) SET(fontmatrix_MOC_HDRS aboutwidget.h browserwidget.h activationwidget.h activationwidgetitem.h chartwidget.h dataexport.h dumpdialog.h familywidget.h filterbar.h filterdata.h filtersdialog.h filtersdialogitem.h filteritem.h floatingwidget.h floatingwidgettoolbar.h fmactivate.h fmaltcontext.h fmaltselector.h fmfloatingpreview.h fmfontcompareview.h fmfontdb.h fmfontextract.h fmfontstrings.h fmfreetypelib.h fmglyphhighlight.h fmglyphsview.h fmlayoptwidget.h fmlayout.h fmmatchraster.h fmnamelist.h fmplayground.h fmpreviewlist.h fmrepair.h fmsampletextview.h fontbookdialog.h fontcomparewidget.h fontitem.h helpbrowser.h # helpwidget.h importtags.h iview.h QHexView.h #listdockwidget.h mainviewwidget.h metawidget.h modeltext.h openclosearrow.h panosedialog.h panosewidget.h parallelcoor.h playwidget.h prefspaneldialog.h progressbarduo.h remotedir.h sampletoolbar.h samplewidget.h sctextbrowser.h shortcuts.h systray.h # tagseteditor.h tagswidget.h tagswidget_listmodel.h #textprogression.h tttableview.h typotek.h ) QT4_WRAP_CPP(fontmatrix_MOC_SRCS ${fontmatrix_MOC_HDRS} ${PYTHONQT_SCRIPTER_MOC_HDRS}) SET(fontmatrix_UIS ${CMAKE_CURRENT_SOURCE_DIR}/about.ui ${CMAKE_CURRENT_SOURCE_DIR}/activationreportdialog.ui ${CMAKE_CURRENT_SOURCE_DIR}/activationwidget.ui ${CMAKE_CURRENT_SOURCE_DIR}/activationwidgetitem.ui ${CMAKE_CURRENT_SOURCE_DIR}/altselectorwidget.ui ${CMAKE_CURRENT_SOURCE_DIR}/bookexport.ui ${CMAKE_CURRENT_SOURCE_DIR}/browserwidget.ui ${CMAKE_CURRENT_SOURCE_DIR}/chartwidget.ui ${CMAKE_CURRENT_SOURCE_DIR}/comparewidget.ui ${CMAKE_CURRENT_SOURCE_DIR}/dataexport.ui ${CMAKE_CURRENT_SOURCE_DIR}/dumpdialog.ui ${CMAKE_CURRENT_SOURCE_DIR}/familywidget.ui ${CMAKE_CURRENT_SOURCE_DIR}/filterbar.ui ${CMAKE_CURRENT_SOURCE_DIR}/filtersdialog.ui ${CMAKE_CURRENT_SOURCE_DIR}/filtersdialogitem.ui ${CMAKE_CURRENT_SOURCE_DIR}/filteritem.ui ${CMAKE_CURRENT_SOURCE_DIR}/floatingwidgettoolbar.ui ${CMAKE_CURRENT_SOURCE_DIR}/fontextractordialog.ui ${CMAKE_CURRENT_SOURCE_DIR}/importedfonts.ui ${CMAKE_CURRENT_SOURCE_DIR}/importtags.ui # ${CMAKE_CURRENT_SOURCE_DIR}/help.ui ${CMAKE_CURRENT_SOURCE_DIR}/helpbrowser.ui ${CMAKE_CURRENT_SOURCE_DIR}/layoutoptions.ui #${CMAKE_CURRENT_SOURCE_DIR}/listsdock.ui ${CMAKE_CURRENT_SOURCE_DIR}/mainview.ui ${CMAKE_CURRENT_SOURCE_DIR}/metawidget.ui ${CMAKE_CURRENT_SOURCE_DIR}/matchraster.ui ${CMAKE_CURRENT_SOURCE_DIR}/panosedialog.ui ${CMAKE_CURRENT_SOURCE_DIR}/panosewidget.ui ${CMAKE_CURRENT_SOURCE_DIR}/playwidget.ui ${CMAKE_CURRENT_SOURCE_DIR}/prefs_panel.ui ${CMAKE_CURRENT_SOURCE_DIR}/progressbarduo.ui ${CMAKE_CURRENT_SOURCE_DIR}/repair.ui ${CMAKE_CURRENT_SOURCE_DIR}/sampletoolbar.ui ${CMAKE_CURRENT_SOURCE_DIR}/samplewidget.ui # ${CMAKE_CURRENT_SOURCE_DIR}/tagset.ui ${CMAKE_CURRENT_SOURCE_DIR}/tagswidget.ui ${CMAKE_CURRENT_SOURCE_DIR}/textprogression.ui ${CMAKE_CURRENT_SOURCE_DIR}/tttablewidget.ui ) QT4_WRAP_UI(fontmatrix_UIS_H ${fontmatrix_UIS} ${PYTHONQT_SCRIPTER_UIS} ) # extra translation files SET(FONTMATRIX_TR_EXTRA ${CMAKE_CURRENT_SOURCE_DIR}/langs/unicode/uniblocks.cxx ) SET(fontmatrix_RCCS application.qrc ) QT4_ADD_RESOURCES(fontmatrix_RCC_SRCS ${fontmatrix_RCCS}) FILE( GLOB FM_GLOB_TSS ${CMAKE_CURRENT_SOURCE_DIR}/messages/fontmatrix-*.ts ) # message(STATUS "lang files: ${FM_GLOB_TSS}") IF ( TRANSLATOR ) MESSAGE(STATUS "We are glad to see you handle the fontmatrix-${TRANSLATOR}.ts file, thank you very much") ADD_CUSTOM_TARGET(translation COMMAND ${QT_LUPDATE_EXECUTABLE} ${fontmatrix_SRCS} ${fontmatrix_UIS} ${FONTMATRIX_TR_EXTRA} -ts "fontmatrix-${TRANSLATOR}.ts" DEPENDS ${fontmatrix_SRCS} ${fontmatrix_UIS} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/messages" ) SET( fontmatrix_TSS ${FM_GLOB_TSS} "messages/fontmatrix-${TRANSLATOR}.ts" ) ELSE ( TRANSLATOR ) SET( fontmatrix_TSS ${FM_GLOB_TSS} ) ENDIF( TRANSLATOR ) QT4_ADD_TRANSLATION ( fontmatrix_QMS ${fontmatrix_TSS} ) ADD_CUSTOM_TARGET ( translation_release ALL DEPENDS ${fontmatrix_QMS} ) # ADD_SUBDIRECTORY(messages) ADD_SUBDIRECTORY(scripts) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${QT_INCLUDE_DIR} ${QT_QT_INCLUDE_DIR} ${FREETYPE_INCLUDE_DIRS} ${HARFBUZZ_INCLUDE_DIR} ${FONTCONFIG_INCLUDE_DIR} ${ICU_INCLUDE_DIR} ${M17N_INCLUDE_DIR} ${HYPHENATE_INCLUDE_DIR} ${PYTHON_INCLUDE_PATH} ${PYTHONQT_INCLUDE_DIRS} ${LIBPODOFO_INCLUDE_DIR} ) IF(UNIX AND NOT APPLE) add_executable(fontmatrix ${fontmatrix_SRCS} ${SHAPERS_SRCS} ${PYTHONQT_SCRIPTER_SRCS} ${fontmatrix_MOC_SRCS} ${fontmatrix_UIS_H} ${fontmatrix_RCC_SRCS} ${PODOFO_SRCS} ) target_link_libraries(fontmatrix harfbuzz hyphenate ${PYTHONQT_LIB} ${QT_LIBRARIES} ${FREETYPE_LIBRARIES} ${FONTCONFIG_LIBRARIES} ${SHAPERS_LIBRARIES} ${PYTHON_LIBRARIES} ${LIBPODOFO_LIBRARY} ) INSTALL(TARGETS fontmatrix RUNTIME DESTINATION ${FONTMATRIX_BIN} ) INSTALL ( FILES ${fontmatrix_QMS} DESTINATION ${FONTMATRIX_QMDIR} ) ENDIF(UNIX AND NOT APPLE) IF(APPLE) add_executable(fontmatrix MACOSX_BUNDLE ${fontmatrix_SRCS} ${SHAPERS_SRCS} ${PYTHONQT_SCRIPTER_SRCS} ${fontmatrix_MOC_SRCS} ${fontmatrix_UIS_H} ${fontmatrix_RCC_SRCS} ${PODOFO_SRCS} ) target_link_libraries(fontmatrix harfbuzz hyphenate ${PYTHONQT_LIB} ${QT_LIBRARIES} ${FREETYPE_LIBRARIES} ${SHAPERS_LIBRARIES} ${PYTHON_LIBRARIES} ${LIBPODOFO_LIBRARY} "-framework ApplicationServices" ) # here we’ll poupulate the bundle in order to make it # self containing regarding external libs (Qt4 & Freetype) # and resources such as QM files. # NOTE: Mac users are not expected to build Fontmatrix # themselves, thus paths are hard coded because it works on the Mac # where we use to build it, period. # See: # http://doc.trolltech.com/4.4/deployment-mac.html # http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFBundles/CFBundles.html SET(PROGNAME fontmatrix) SET(MACOSX_BUNDLE_BUNDLE_NAME "fontmatrix") SET(MACOSX_BUNDLE_ICON_FILE "fontmatrix.icns") SET(MACOSX_BUNDLE_GUI_IDENTIFIER "org.undertype.fontmatrix") SET(MACOSX_BUNDLE_LONG_VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") SET(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}") SET(MACOSX_BUNDLE_BUNDLE_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") SET(MACOSX_BUNDLE_COPYRIGHT "© Fontmatrix team - 2007, 2008") SET(BUNDLE_RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/${PROGNAME}.app/Contents/Resources/") SET(BUNDLE_LOCALES_DIR "${CMAKE_CURRENT_BINARY_DIR}/${PROGNAME}.app/Contents/Resources/Locales/") # bundles general resources ADD_CUSTOM_COMMAND( TARGET ${PROGNAME} POST_BUILD COMMAND mkdir ARGS -p ${BUNDLE_RESOURCES_DIR} COMMAND cp ARGS "${CMAKE_SOURCE_DIR}/src/graphic-resources/fontmatrix.icns" ${BUNDLE_RESOURCES_DIR} COMMAND cp ARGS ${FM_TEMPLATES_FILES} ${FM_STYLE_FILES} ${FM_WELCOME_FILES} ${FM_HELP_FILES} ${BUNDLE_RESOURCES_DIR} ) # bundles QM files ADD_CUSTOM_COMMAND( TARGET translation_release POST_BUILD COMMAND mkdir ARGS -p ${BUNDLE_LOCALES_DIR} COMMAND cp ARGS ${fontmatrix_QMS} ${BUNDLE_LOCALES_DIR} ) # bundles libs # ADD_CUSTOM_COMMAND(TARGET ${PROGNAME} POST_BUILD # COMMAND ${CMAKE_COMMAND} ARGS -Dinput_file=${CMAKE_CURRENT_BINARY_DIR}/${PROGNAME}.app/Contents/MacOS/${PROGNAME} -P ${CMAKE_MODULE_PATH}/OwnIngestOSXBundleLibraries.cmake # ) INSTALL(TARGETS ${PROGNAME} BUNDLE DESTINATION . COMPONENT Runtime ) SET(APPLE_LIBS ${PYTHONQT_LIB} ${QT_LIBRARIES} ${FREETYPE_LIBRARIES} ${SHAPERS_LIBRARIES} ${PYTHON_LIBRARIES} ${LIBPODOFO_LIBRARY} ) SET(APPLE_DIRS "${QT_PLUGINS_DIR}/sqldrivers") SET(APPLE_APPS "\${CMAKE_INSTALL_PREFIX}/fontmatrix.app") INSTALL(CODE " include(BundleUtilities) fixup_bundle(\"${APPLE_APPS}\" \"${APPLE_LIBS}\" \"${APPLE_DIRS}\") " COMPONENT Runtime) ENDIF(APPLE) IF(WIN32) add_executable(fontmatrix WIN32 ${fontmatrix_SRCS} ${SHAPERS_SRCS} ${PYTHONQT_SCRIPTER_SRCS} ${fontmatrix_MOC_SRCS} ${fontmatrix_UIS_H} ${fontmatrix_RCC_SRCS} ${PODOFO_SRCS} ) target_link_libraries(fontmatrix harfbuzz hyphenate ${PYTHONQT_LIB} ${QT_LIBRARIES} ${FREETYPE_LIBRARIES} ${SHAPERS_LIBRARIES} ${PYTHON_LIBRARIES} ${LIBPODOFO_LIBRARY} ) INSTALL(TARGETS fontmatrix RUNTIME DESTINATION ${FONTMATRIX_BIN} ) INSTALL ( FILES ${fontmatrix_QMS} DESTINATION ${FONTMATRIX_QMDIR} ) ENDIF(WIN32) fontmatrix-0.6.0+svn20110930/src/panosematch.cpp0000644000175000017500000002166511241276662020146 0ustar malexmalex// // C++ Implementation: panosematch // // Description: // // // Author: Riku Leino , (C) 2008 // David L. Wagner, International Business Machines Corp., 2002 // // This file 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. // http://www.gnu.org/copyleft/lesser.html // #include "fmfontdb.h" #include "fmfontstrings.h" #include "panosematch.h" #include #include /** * @param selected colon separated list of the ten panose attributes (2:2:2:2:2:2:2:2:2:2) */ PanoseMatch::PanoseMatch ( const QString &selected ) { attributes = parse ( selected ); } void PanoseMatch::setAttributes ( const QString & attrs ) { attributes = parse ( attrs ); } /** * Returns the difference between the significant fields of the current Panose * object and the given one. The contract for this method says that an exact * match will produce the lowest possible integer value, and fonts that differ * will produce larger ones. * * In fact, this implementation produces 0 for an exact match, and calculates * the sum of the squares of the differences between the significant fields. * * This implementation is completely wrong, however. Some things are * continuous (such as weight) but some are discrete (like family type), so we * really should use the sum-of-the-squares thing for continuous values, and * have sort of large penalty for discrete ones. * * @param other colon separated list of the ten panose attributes (2:2:2:2:2:2:2:2:2:2) */ int PanoseMatch::diff ( const QString &other ) const { QList attrOther = parse ( other ); if ( attrOther.isEmpty() || attributes.isEmpty() ) return -1; // // If they aren't in the same family, then it really makes no sense to // compare them at all, so throw in some big penalty. // if ( attributes[FamilyType] != 0 && attrOther[FamilyType] != 0 && attributes[FamilyType] != attrOther[FamilyType] ) return -1; int result = 0; // It's debatable whether the Serif_Style number is monotonic, but we'll // treat it as such in this implementation. // result += calcdiffm ( attributes[Weight], attrOther[Weight], 12 ); result += calcdiffm ( attributes[Contrast], attrOther[Contrast], 10 ); result += calcdiffm ( attributes[StrokeVariation], attrOther[StrokeVariation], 9 ); // // The Proportion, Arm_Style, Letterform, Midline and X_Height values aren't // monotonically increasing values, so we shouldn't give much weight to // to these values (although we could probably do some rearranging to get the // Proportion values to be approximately monotonic). // result += calcdiffss ( attributes[SerifStyle], attrOther[SerifStyle] ); result += calcdiffd ( attributes[Proportion], attrOther[Proportion] ); result += calcdiffd ( attributes[ArmStyle], attrOther[ArmStyle] ); result += calcdifflf ( attributes[Letterform], attrOther[Letterform] ); result += calcdiffd ( attributes[Midline], attrOther[Midline] ); result += calcdiffd ( attributes[XHeight], attrOther[XHeight] ); return result; } QList PanoseMatch::parse ( const QString &panoseString ) const { QStringList pl ( panoseString.split ( ":" ) ); QList l; if ( pl.count() == 10 ) { foreach ( QString s, pl ) { l << s.toInt(); } } return l; } /** * Calculate the square of the difference between two monotonic Panose values * (as integers), with a weight applied. If either value is 0 (xxx_ANY), then * value returned is zero. If one value is 1 (xxx_NO_FIT), then they can't * be classified, so we give a penalty. This method will return some * value between 0 and 1000. This method only makes sense when the values * are in a continuous range. * * @param p1 first Panose value * @param p2 second Panose value * @param weight the number of Panose values in this enumeration */ int PanoseMatch::calcdiffm ( int p1, int p2, int weight ) { // // If they can have any value, then they automatically match // // if ( p1 == 0 || p2 == 0 ) // return 0; // // If one (but not both) value is xxx_NO_FIT, then they can't match // if ( ( p1 == 1 && p2 != 1 ) || ( p2 == 1 && p1 != 1 ) ) return 1000; // As, AFAICS, lot of fonts use Any as I-do-not-care, return a penalty // if one of the font has it set to Any. if ( ( p1 == 0 && p2 != 0 ) || ( p2 == 0 && p1 != 0 ) ) return 1000; // // Now return some number between 0 and 1000 (the value "weight-3" is the // maximum difference between p1 and p2). // return 1000 * ( p1-p2 ) * ( p1-p2 ) / ( weight-3 ) * ( weight-3 ); } /** * Calculate the square of the difference between two discrete (non-monotonic) * Panose values (as integers). If either value is 0 (xxx_ANY), then value * returned is zero. If one value is 1 (xxx_NO_FIT), then they can't can't be * classified, so we give a penalty. This method will return some * value between 0 and 100. * * @param p1 first Panose value * @param p2 second Panose value */ int PanoseMatch::calcdiffd ( int p1, int p2 ) { // // If they can have any value, then they automatically match // if (p1 == p2 ) return 0; // // If one (but not both) value is xxx_NO_FIT, then they can't match // if ( ( p1 == 1 && p2 != 1 ) || ( p2 == 1 && p1 != 1 ) ) return 1000; // As, AFAICS, lot of fonts use Any as I-do-not-care, return a penalty // if one of the font has it set to Any. if ( ( p1 == 0 && p2 != 0 ) || ( p2 == 0 && p1 != 0 ) ) return 1000; // // Otherwise, we really can't compare the values sensible, so just return // some small penalty. // return 100; } /** * Calculate the difference between two serif styles; we treat differences * any two serifs or sans-serifs as small, and the difference between any * serif and any sans-serif as large. */ int PanoseMatch::calcdiffss ( int p1, int p2 ) { // // If they can have any value, then they automatically match // if ( p1 == p2 ) return 0; // // If one (but not both) value is xxx_NO_FIT, then they can't match // if ( ( p1 == 1 && p2 != 1 ) || ( p2 == 1 && p1 != 1 ) ) return 1000; // As, AFAICS, lot of fonts use Any as I-do-not-care, return a penalty // if one of the font has it set to Any. if ( ( p1 == 0 && p2 != 0 ) || ( p2 == 0 && p1 != 0 ) ) return 1000; // // Otherwise, check to see if they are serif or sans-serif // These ints are from fmfontstrings.cpp (needs something more clever) // TODO create a proper panose class if ( p1 >= 11 && p1 <= 13 && p2 >= 11 && p2 <= 13 ) return 10; if ( ( p1 < 11 || p1 > 13 ) && ( p2 < 11 || p2 > 13 ) ) return 10; else return 100; } /** * Calculate the difference between two letter forms; we treat differences * any two normals or obliques as small, and the difference between any * normal and any oblique as large. */ int PanoseMatch::calcdifflf ( int p1, int p2 ) { // // If they can have any value, then they automatically match // if ( p1 == p2 ) return 0; // // If one (but not both) value is xxx_NO_FIT, then they can't match // if ( ( p1 == 1 && p2 != 1 ) || ( p2 == 1 && p1 != 1 ) ) return 1000; // As, AFAICS, lot of fonts use Any as I-do-not-care, return a penalty // if one of the font has it set to Any. if ( ( p1 == 0 && p2 != 0 ) || ( p2 == 0 && p1 != 0 ) ) return 1000; // // Otherwise, check to see if they are normal or oblique // 9 = Oblique/Contact from fmfontstrings.cpp if ( ( p1 < 9 && p2 < 9 ) || ( p1 >= 9 && p2 >= 9 ) ) return 10; else return 100; } /// PanoseMatchFont QList< FontItem * > PanoseMatchFont::similar ( FontItem * ref, int treshold ) { if ( ( !ref ) || ( !treshold ) ) return QList< FontItem * >(); QString panose(FMFontDb::DB()->getValue(ref->path(), FMFontDb::Panose).toString()); if ( panose.isEmpty() ) return QList< FontItem * >(); PanoseMatchFont * pm ( new PanoseMatchFont ); pm->setAttributes ( panose ); QList dbresult ( FMFontDb::DB()->getValues ( FMFontDb::Panose ) ); QList fil; int dr(0); // int selectMin(999999); // int selectMax(0); // int selectMean(0); // int totalMin(999999); // int totalMax(0); // int totalMean(0); // int total(0); for ( int i ( 0 ); i < dbresult.count() ; ++i ) { dr = pm->diff ( dbresult[i].second ) ; if(dr < 0) continue; // totalMin = qMin(totalMin, dr); // totalMax = qMax(totalMax, dr); // totalMean += dr; // ++total; if ( dr < treshold ) { // selectMin = qMin(selectMin, dr); // selectMax = qMax(selectMax, dr); // selectMean += dr; fil << dbresult[i].first; } } // qDebug()<<"TOTAL min/max/mean"< FilterTagDialog 0 0 400 300 Dialog fontmatrix-0.6.0+svn20110930/src/openclosearrow.h0000644000175000017500000000075511512623623020342 0ustar malexmalex#ifndef OPENCLOSEARROW_H #define OPENCLOSEARROW_H #include class OpenCloseArrow : public QLabel { Q_OBJECT QString baseText; public: explicit OpenCloseArrow(QWidget *parent = 0, bool open = true); ~OpenCloseArrow(); bool isOpen() const {return openingState;} private: bool openingState; void setOpText(); protected: void mouseReleaseEvent( QMouseEvent * ev ); signals: void openChanged(bool); public slots: void changeOpen(bool t); }; #endif // OPENCLOSEARROW_H fontmatrix-0.6.0+svn20110930/src/filtertagdialog.h0000644000175000017500000000333411406645124020437 0ustar malexmalex/*************************************************************************** * Copyright (C) 2010 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FILTERTAGDIALOG_H #define FILTERTAGDIALOG_H #include namespace Ui { class FilterTagDialog; } class FilterTagDialog : public QDialog { Q_OBJECT public: explicit FilterTagDialog(QWidget *parent = 0); ~FilterTagDialog(); protected: void changeEvent(QEvent *e); private: Ui::FilterTagDialog *ui; }; #endif // FILTERTAGDIALOG_H fontmatrix-0.6.0+svn20110930/src/openclosearrow.cpp0000644000175000017500000000133211512623623020665 0ustar malexmalex#include "openclosearrow.h" OpenCloseArrow::OpenCloseArrow(QWidget *parent, bool open) : QLabel(parent), openingState(open) { // setOpText(); } OpenCloseArrow::~OpenCloseArrow() { } void OpenCloseArrow::mouseReleaseEvent(QMouseEvent *ev) { openingState = !openingState; setOpText(); emit openChanged(openingState); } void OpenCloseArrow::changeOpen(bool t) { openingState = t; setOpText(); emit openChanged(openingState); } void OpenCloseArrow::setOpText() { if(baseText.isEmpty()) baseText = text(); QFont f(font()); if(openingState) { f.setBold(true); setFont(f); setText(QString("%1").arg(baseText)); } else { f.setBold(false); setFont(f); setText(QString("%1").arg(baseText)); } } fontmatrix-0.6.0+svn20110930/src/typotek.cpp0000644000175000017500000020627411524253232017334 0ustar malexmalex/*************************************************************************** * Copyright (C) 2007 by Pierre Marchand * * pierre@oep-h.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "aboutwidget.h" #include "browserwidget.h" #include "dataexport.h" #include "dataloader.h" #include "dumpdialog.h" #include "floatingwidget.h" #include "floatingwidgetsregister.h" #include "fmactivate.h" #include "fmfontdb.h" #include "fmfontextract.h" #include "fmmatchraster.h" #include "fmlayout.h" #include "fmpaths.h" #include "fmrepair.h" #include "fontbook.h" #include "fontcomparewidget.h" #include "fontitem.h" // #include "helpwidget.h" #include "helpbrowser.h" #include "hyphenate/fmhyphenator.h" #include "importedfontsdialog.h" #include "importtags.h" //#include "listdockwidget.h" #include "mainviewwidget.h" #include "panosedialog.h" #include "panosewidget.h" #include "playwidget.h" #include "prefspaneldialog.h" #include "remotedir.h" //#include "savedata.h" #include "shortcuts.h" #include "systray.h" #include "tagswidget.h" #include "tttableview.h" #include "typotek.h" #include "winutils.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_FONTCONFIG #include #endif #ifdef HAVE_PYTHONQT #include "fmpython_w.h" #include "fmscriptconsole.h" #define MAX_RECENT_PYSCRIPTS 10 #endif // HAVE_PYTHONQT #ifdef Q_WS_MAC #include #endif typotek* typotek::instance = 0; bool typotek::matrix = false; QString typotek::fonteditorPath = "/usr/bin/fontforge"; extern bool __FM_SHOW_FONTLOADED; extern int fm_num_face_opened; /// LazyInit ********************************************* void LazyInit::run() { /// We keep this for further needs emit endOfRun(); } ///****************************************************** /// a bit of globalness ******************************************* namespace fontmatrix { QStringList exploreDirs ( const QDir &dir, int deep ) { static QStringList retDirList; if ( deep > 10 ) return QStringList(); if ( deep == 0 ) retDirList.clear(); retDirList << dir.absolutePath(); QStringList localEntries ( dir.entryList ( QDir::AllDirs | QDir::NoDotAndDotDot ) ); foreach ( QString dirEntry, localEntries ) { // qDebug() << "[exploreDirs] - " + dir.absolutePath() + "/" + dirEntry; QDir d ( dir.absolutePath() + "/" + dirEntry ); exploreDirs ( d, deep + 1 ); if ( !retDirList.contains ( d.absolutePath() ) ) retDirList << d.absolutePath(); } return retDirList; } QMap DockPosition; void fillDockPos() { DockPosition["Float"] = Qt::LeftDockWidgetArea; DockPosition["Left"] = Qt::LeftDockWidgetArea; DockPosition["Right"]= Qt::RightDockWidgetArea; DockPosition["Top"]= Qt::TopDockWidgetArea; DockPosition["Bottom"]= Qt::BottomDockWidgetArea; } } /// ***************************************************** typotek * typotek::getInstance() { if(!instance) { instance = new typotek; Q_ASSERT(instance); } return instance; } typotek::typotek() { setWindowTitle ( "Fontmatrix" ); setupDrop(); theMainView = 0; hyphenator = 0; theHelp = 0; dataLoader = 0; playVisible = false; m_dpiX = ( double ) QApplication::desktop()->physicalDpiX(); m_dpiY = ( double ) QApplication::desktop()->physicalDpiY(); #ifdef Q_WS_MAC CGDirectDisplayID macDId = CGMainDisplayID(); CGRect macDRect = CGDisplayBounds(macDId); CGSize macDSize = CGDisplayScreenSize(macDId); double macDisplayPxWidth(macDRect.size.width); double macDisplayPxHeight(macDRect.size.height); double macDisplayPhysicalWidth(double(macDSize.width) / 25.4); double macDisplayPhysicalHeight(double(macDSize.height) / 25.4); m_dpiX = macDisplayPxWidth / macDisplayPhysicalWidth; m_dpiY = macDisplayPxHeight / macDisplayPhysicalHeight; #endif qDebug()<< m_dpiX << m_dpiY; } void typotek::initMatrix() { qDebug()<<"Main Thread:"<addWidget(theMainView); mainStack->addWidget(theBrowser); setCentralWidget ( mainStack ); if ( QSystemTrayIcon::isSystemTrayAvailable() ) systray = new Systray(); else systray = 0; setDockOptions(QMainWindow::AnimatedDocks | QMainWindow::ForceTabbedDocks); // installDock("Main", tr ( "Browse Fonts" ), ListDockWidget::getInstance() , tr ( "Show/hide fonts browsing sidebar" )); // installDock("Tags", tr ( "Tags" ), TagsWidget::getInstance() , tr ( "Show/hide tags list sidebar" ) ); // installDock("Panose", tr ( "Panose"), PanoseWidget::getInstance(), tr ( "Browse fonts by means of Panose attributes" ) ); // force tabifyication // QStringList dl; // dl << "Tags" << "Panose" << "Main"; // for(int i(1); i < dl.count(); ++i) // { // if(dockArea[dl[i]] != "Float") // { // for(int j(i-1); j >=0 ; --j) // { // if(dockArea[dl[j]] == dockArea[dl[i]]) // tabifyDockWidget(dockWidget[dl[j]], dockWidget[dl[i]]); // } // } // } createActions(); createMenus(); createStatusBar(); doConnect(); showToltalFilteredFonts(); if(!hyphenator) { QSettings st; QString dP( st.value("Sample/HyphenationDict", "hyph.dic").toString() ); if(QFileInfo(dP).exists()) { hyphenator = new FMHyphenator(); if (!hyphenator->loadDict(dP, st.value("Sample/HyphLeft", 2).toInt(), st.value("Sample/HyphRight", 3).toInt())) { st.setValue("Sample/HyphenationDict", ""); st.setValue("Sample/HyphLeft", 2); st.setValue("Sample/HyphRight", 3); } } else { hyphenator = new FMHyphenator(); // init the hyphenator anyway for the prefs st.setValue("Sample/HyphenationDict", ""); st.setValue("Sample/HyphLeft", 2); st.setValue("Sample/HyphRight", 3); qDebug()<<"Err H"<setObjectName(id); dockWidget[id] = dw; dw->setWidget( w ); dw->setStatusTip ( tip ); addDockWidget(fontmatrix::DockPosition[dockArea[id]], dw); qDebug()<<"I"<setFloating(true); if(!dockGeometry[id].isNull()) dw->setGeometry(dockGeometry[id]); connect(dw , SIGNAL(dockLocationChanged( Qt::DockWidgetArea )), this, SLOT(slotDockAreaChanged(Qt::DockWidgetArea ))); } void typotek::postInit() { // TODO restore last filter // theMainView->slotViewAll(); QSettings st; QString cname(st.value("CurrentFont", QString()).toString()); // if(!cname.isEmpty()) // { // if(!ListDockWidget::getInstance()->fontTree->slotSetCurrent(cname)) // theMainView->displayWelcomeMessage(); // } // else // theMainView->displayWelcomeMessage(); } void typotek::doConnect() { if(getSystray()) connect ( FMActivate::getInstance() ,SIGNAL ( activationEvent ( const QStringList& ) ), getSystray(),SLOT ( updateTagMenu ( const QStringList& ) ) ); // connect(FMLayout::getLayout()->optionDialog,SIGNAL(finished( int )),this,SLOT(slotUpdateLayOptStatus())); #ifdef HAVE_PYTHONQT connect(FMScriptConsole::getInstance(),SIGNAL(finished()), this, SLOT(slotUpdateScriptConsoleStatus())); #endif connect(toggleMainViewButton, SIGNAL(toggled(bool)), this, SLOT(toggleMainView(bool))); } void typotek::closeEvent ( QCloseEvent *event ) { QSettings settings ; if ( systray ) { if ( systray->isVisible() && settings.value ( "Systray/CloseToTray", true ).toBool() ) { if ( !settings.value ( "Systray/CloseNoteShown", false ).toBool() ) { QMessageBox::information ( this, tr ( "Fontmatrix" ), tr ( "The program will keep running in the " "system tray. To terminate the program, " "choose Exit in the context menu " "of the system tray entry." ) ); settings.setValue ( "Systray/CloseNoteShown", true ); } hide(); event->ignore(); return; } } foreach(FloatingWidget *f, FloatingWidgetsRegister::AllWidgets()) { f->close(); } writeSettings(); delete PlayWidget::getInstance(); delete FontCompareWidget::getInstance(); delete theMainView; event->accept(); } /// IMPORT // if announce == true user will be shown a dialog of imported fonts // if announce == false and collect == true all fonts imported will be // collected and announced next time announce == true void typotek::open ( QString path, bool recursive, bool announce, bool collect ) { static QStringList nameList; static QStringList tali; // tali gets reseted when announce = true then the shouldAskTali is also set to true static bool shouldAskTali = true; // initial tags is only asked once if collect == true QStringList pathList; QFileInfo finfo ( path ); if ( finfo.isDir() || path.isEmpty() ) // importing a directory { static QSettings settings; static QString dir = settings.value ( "Places/LastUsedFolder", QDir::homePath() ).toString(); // first time use the home path then remember the last used dir QDir d ( dir ); if ( !d.exists() ) dir = QDir::homePath(); QString tmpdir; if ( !path.isEmpty() ) tmpdir = path; else tmpdir = QFileDialog::getExistingDirectory ( this, tr ( "Add Directory" ), dir , QFileDialog::ShowDirsOnly ); if ( tmpdir.isEmpty() ) return; // user choose to cancel the import process dir = tmpdir; // only set dir if importing wasn't cancelled settings.setValue ( "Places/LastUsedFolder", dir ); QStringList dirList; if(recursive) dirList = fontmatrix::exploreDirs ( dir,0 ) ; else dirList.append(dir); // qDebug() << dirList.join ( "\n" ); QStringList yetHereFonts; // for(int i=0;i < fontMap.count() ; ++i) // yetHereFonts << fontMap[i]->path(); yetHereFonts = FMFontDb::DB()->AllFontNames(); QStringList filters; filters << "*.otf" << "*.pfb" << "*.ttf" ; foreach ( QString dr, dirList ) { QDir d ( dr ); QFileInfoList fil= d.entryInfoList ( filters ); foreach ( QFileInfo fp, fil ) { if ( ( !yetHereFonts.contains ( fp.absoluteFilePath() ) ) ) { if ( fp.isSymLink() ) // #12232 { QFileInfo fsym ( fp.symLinkTarget() ); if ( ( !fsym.isSymLink() ) // hey, donnot try to fool us with nested symlinks :) && ( fsym.exists() ) && ( !yetHereFonts.contains ( fsym.absoluteFilePath() ) ) ) pathList << fsym.absoluteFilePath(); } else pathList << fp.absoluteFilePath(); } } } } else if ( finfo.isFile() ) pathList << finfo.absoluteFilePath(); // It can happen that you wrongly select a dir, it is time to let the user cancel the import. // I want it :) - pm if ( /*( pathList.count() > 1 ) &&*/ ( QMessageBox::question ( this, QString ( "Fontmatrix - %1" ).arg ( tr ( "confirmation" ) ) , tr ( "Do you confirm you want to import these %1 fonts?" ).arg ( pathList.count() ), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) != QMessageBox::Yes ) ) { return; } /* Everybody say it’s useless... NO IT'S NOT. I'm a keen fan of this feature. Let's make it optional */ QStringList tagsList ( FMFontDb::DB()->getTags() ); if ( useInitialTags && shouldAskTali ) { ImportTags imp ( this,tagsList ); imp.exec(); tali = imp.tags(); shouldAskTali = false; } QProgressDialog progress ( tr ( "Importing font files... " ), tr ( "cancel" ), 0, pathList.count(), this ); bool showProgress = pathList.count() > 1; if ( showProgress ) // show progress bar only if there's more than one font { progress.setWindowModality ( Qt::WindowModal ); progress.setAutoReset ( false ); progress.setValue ( 0 ); progress.show(); } FMFontDb::DB()->TransactionBegin(); QString importstring ( tr ( "Import" ) + " %1" ); FMFontDb *DB ( FMFontDb::DB() ); QList nf; for ( int i = 0 ; i < pathList.count(); ++i ) { QString pathCur ( pathList.at ( i ) ); if ( showProgress ) { progress.setLabelText ( importstring.arg ( pathCur ) ); progress.setValue ( i ); if ( progress.wasCanceled() ) break; } { QFile ff ( pathCur ); QFileInfo fi ( pathCur ); { FontItem *fitem ( DB->Font ( fi.absoluteFilePath(), true ) ); if ( fitem ) { nf << fitem; fitem->setActivated ( false ); if ( announce || collect ) nameList << fitem->fancyName(); } else { QString errorFont ( tr ( "Cannot import this font because it is broken:" ) +" "+fi.fileName() ); statusBar()->showMessage ( errorFont ); if ( announce || collect ) nameList << "__FAILEDTOLOAD__" + fi.fileName(); } } } } QStringList tl; foreach ( QString tag, tali ) { tl.clear(); foreach ( FontItem* f, nf ) { tl << f->path(); } DB->addTag ( tl, tag ); } DB->TransactionEnd(); progress.close(); if ( announce ) { if ( showFontListDialog ) { // The User needs and deserves to know what fonts hve been imported ImportedFontsDialog ifd ( this, nameList ); ifd.exec(); } else // show info in the statusbar { statusBar()->showMessage ( tr ( "Fonts imported: %1" ).arg ( nameList.count() ), 3000 ); } nameList.clear(); tali.clear(); shouldAskTali = true; } emit newFontsArrived(); } void typotek::importFiles() { QStringList flist = QFileDialog::getOpenFileNames(this, tr("Select Files to Import"), QDir::homePath(), QString("%1 (*.otf *.ttf *.pfb)").arg(tr("Font Files"))); if(!flist.isEmpty()) openList(flist); } /// Import files in a drop event. void typotek::openList ( QStringList files ) { QStringList pathList; QStringList nameList; QStringList tali; QStringList tagsList ( FMFontDb::DB()->getTags() ); if ( useInitialTags ) { ImportTags imp ( this,tagsList ); imp.exec(); tali = imp.tags(); } FMFontDb *DB ( FMFontDb::DB() ); QStringList fontMap ( DB->AllFontNames() ); foreach ( QString file, files ) { QFileInfo fp ( file ); if ( ( !fontMap.contains ( fp.absoluteFilePath() ) ) ) { if ( fp.isSymLink() ) // #12232 { QFileInfo fsym ( fp.symLinkTarget() ); if ( ( !fsym.isSymLink() ) && ( fsym.exists() ) && ( !fontMap.contains ( fsym.absoluteFilePath() ) ) ) pathList << fsym.absoluteFilePath(); } else pathList << fp.absoluteFilePath(); } } DB->TransactionBegin(); QProgressDialog progress ( tr ( "Importing font files... " ),tr ( "cancel" ), 0, pathList.count(), this ); progress.setWindowModality ( Qt::WindowModal ); progress.setAutoReset ( false ); QList nf; QString importstring ( tr ( "Import" ) +" %1" ); for ( int i = 0 ; i < pathList.count(); ++i ) { progress.setLabelText ( importstring.arg ( pathList.at ( i ) ) ); progress.setValue ( i ); if ( progress.wasCanceled() ) break; QFile ff ( pathList.at ( i ) ); QFileInfo fi ( pathList.at ( i ) ); FontItem *fitem = DB->Font ( fi.absoluteFilePath() ,true ); if ( fitem ) { nf << fitem; nameList << fitem->fancyName(); } else { QString errorFont ( tr ( "Cannot import this font because it is broken: " ) +" "+fi.fileName() ); // statusBar()->showMessage ( errorFont ); nameList << "__FAILEDTOLOAD__" + fi.fileName(); } } QStringList tl; foreach ( QString tag, tali ) { tl.clear(); foreach ( FontItem* f, nf ) { tl << f->path(); } DB->addTag ( tl, tag ); } DB->TransactionEnd(); progress.close(); // The User needs and deserves to know what fonts hve been imported if ( showFontListDialog ) { // The User needs and deserves to know what fonts hve been imported ImportedFontsDialog ifd ( this, nameList ); ifd.exec(); } else // show info in the statusbar { statusBar()->showMessage ( tr ( "Fonts imported: %1" ).arg ( nameList.count() ), 3000 ); } emit newFontsArrived(); } /// EXPORT void typotek::slotExportFontSet() { // QStringList tagsList(FMFontDb::DB()->getTags()); // QStringList items ( tagsList ); // bool ok; // QString item = QInputDialog::getItem ( this, tr ( "Fontmatrix Tags" ), // tr ( "Choose the tag for filter exported fonts" ), items, 0, false, &ok ); // if ( ok && !item.isEmpty() ) // { // QString dir( QDir::homePath() ); // dir = QFileDialog::getExistingDirectory ( this, tr ( "Choose Directory" ), dir , QFileDialog::ShowDirsOnly ); // if ( dir.isEmpty() ) // return; // DataExport dx(dir,item); // dx.doExport(); // } new DataExport(this); } void typotek::about() { AboutWidget aabout(this); aabout.exec(); } void typotek::createActions() { Shortcuts *scuts = Shortcuts::getInstance(); openAct = new QAction ( QIcon ( ":/fontmatrix_import_icon" ), tr ( "&Import Directory..." ), this ); openAct->setShortcut ( Qt::CTRL + Qt::Key_O ); openAct->setToolTip( tr ( "Import a directory" ) ); scuts->add(openAct); connect ( openAct, SIGNAL ( triggered() ), this, SLOT ( open() ) ); importFilesAction = new QAction(QIcon ( ":/fontmatrix_import_icon" ), tr ( "Import &Files..." ), this ); importFilesAction->setShortcut( Qt::CTRL + Qt::SHIFT + Qt::Key_O ); importFilesAction->setToolTip(tr("Import Files")); scuts->add(importFilesAction); connect(importFilesAction, SIGNAL(triggered()), this, SLOT(importFiles())); exportFontSetAct = new QAction(tr("Export &fonts"),this); exportFontSetAct->setStatusTip(tr("Export a fontset")); scuts->add(exportFontSetAct); connect( exportFontSetAct,SIGNAL(triggered( )),this,SLOT(slotExportFontSet())); fontBookAct = new QAction ( QIcon ( ":/fontmatrix_fontbookexport_icon.png" ), tr ( "Export font book..." ),this ); fontBookAct->setStatusTip ( tr ( "Export a PDF document that shows selected fonts" ) ); scuts->add(fontBookAct); connect ( fontBookAct, SIGNAL ( triggered() ), this, SLOT ( fontBook() ) ); dumpInfoAct = new QAction(tr("Export font info for packaging..."), this); dumpInfoAct->setStatusTip ( tr ( "Fill a template file with metadata for packaging currently selected font to a Linux distribution" ) ); connect(dumpInfoAct, SIGNAL(triggered()), this, SLOT(slotDumpInfo())); exitAct = new QAction ( tr ( "E&xit" ), this ); exitAct->setShortcut ( Qt::CTRL + Qt::Key_Q ); exitAct->setStatusTip ( tr ( "Exit the application" ) ); exitAct->setMenuRole(QAction::QuitRole); scuts->add(exitAct); connect ( exitAct, SIGNAL ( triggered() ), this, SLOT ( close() ) ); aboutAct = new QAction ( tr ( "&About" ), this ); aboutAct->setStatusTip ( tr ( "Show information about Fontmatrix" ) ); aboutAct->setMenuRole(QAction::AboutRole); scuts->add(aboutAct); connect ( aboutAct, SIGNAL ( triggered() ), this, SLOT ( about() ) ); aboutQtAct = new QAction ( tr ( "About &Qt" ), this ); aboutQtAct->setStatusTip ( tr ( "Show information about Qt" ) ); aboutQtAct->setMenuRole(QAction::AboutQtRole); scuts->add(aboutQtAct); connect (aboutQtAct,SIGNAL(triggered()), QApplication::instance(),SLOT(aboutQt())); helpAct = new QAction ( tr ( "Help" ), this ); helpAct->setShortcut ( Qt::Key_F1 ); helpAct->setStatusTip ( tr ( "Read documentation on Fontmatrix" ) ); helpAct->setCheckable(true); helpAct->setChecked(false); scuts->add(helpAct); connect ( helpAct,SIGNAL ( triggered( ) ),this,SLOT ( helpBegin() ) ); // tagsetAct = new QAction ( tr ( "&Tag Sets" ),this ); // tagsetAct->setIcon ( QIcon ( ":/fontmatrix_tagseteditor_icon.png" ) ); // scuts->add(tagsetAct); // connect ( tagsetAct,SIGNAL ( triggered( ) ),this,SLOT ( popupTagsetEditor() ) ); activCurAct = new QAction ( tr ( "Activate all current" ),this ); activCurAct->setStatusTip ( tr ( "Activate all currently visible fonts" ) ); scuts->add(activCurAct); connect ( activCurAct,SIGNAL ( triggered( ) ),this,SLOT ( slotActivateCurrents() ) ); deactivCurAct = new QAction ( tr ( "Deactivate all current" ),this ); deactivCurAct->setStatusTip ( tr ( "Deactivate all currently visible fonts" ) ); scuts->add(deactivCurAct); connect ( deactivCurAct,SIGNAL ( triggered( ) ),this,SLOT ( slotDeactivateCurrents() ) ); fonteditorAct = new QAction ( tr ( "Edit current font" ),this ); scuts->add(fonteditorAct); connect ( fonteditorAct,SIGNAL ( triggered( ) ),this,SLOT ( slotEditFont() ) ); if ( QFile::exists ( fonteditorPath ) ) { fonteditorAct->setStatusTip ( tr ( "Edit currently selected font in a font editor of your choice" ) ); } else { fonteditorAct->setEnabled ( false ); fonteditorAct->setStatusTip ( tr ( "You don't seem to have a font editor installed. Path to font editor can be set in Preferences dialog." ) ); } reloadAct = new QAction( tr ("Reload Filtered"), this ); reloadAct->setStatusTip(tr ("Reload informations for filtered fonts from the font files they belong to")); scuts->add(reloadAct); connect(reloadAct, SIGNAL(triggered()), this, SLOT(slotReloadFiltered())); reloadSingleAct = new QAction(tr("Reload Selected"), this); reloadSingleAct->setStatusTip(tr ("Reload informations for selected font from the font file")); scuts->add(reloadSingleAct); connect(reloadSingleAct, SIGNAL(triggered()), this, SLOT(slotReloadSingle())); prefsAct = new QAction ( tr ( "Preferences" ),this ); prefsAct->setStatusTip ( tr ( "Setup Fontmatrix" ) ); prefsAct->setMenuRole(QAction::PreferencesRole); scuts->add(prefsAct); connect ( prefsAct,SIGNAL ( triggered() ),this,SLOT ( slotPrefsPanelDefault() ) ); repairAct = new QAction ( tr("Check Database"), this); repairAct->setStatusTip ( tr ( "Check Fontmatrix database for dead links to font files" ) ); scuts->add(repairAct); connect( repairAct, SIGNAL ( triggered() ),this,SLOT (slotRepair())); // if ( systray ) // connect ( theMainView, SIGNAL ( newTag ( QString ) ), systray, SLOT ( newTag ( QString ) ) ); tagAll = new QAction(tr("Tag All Filtered..."), this); tagAll->setStatusTip ( tr ( "Tag all currently visible files" ) ); scuts->add(tagAll); connect(tagAll,SIGNAL(triggered()),this,SLOT(slotTagAll())); showTTTAct = new QAction(tr("Show TrueType tables"),this); showTTTAct->setStatusTip ( tr ( "View hexadecimal values of TrueType tables for currently selected font file" ) ); scuts->add(showTTTAct); connect(showTTTAct,SIGNAL(triggered( )),this,SLOT(slotShowTTTables())); editPanoseAct = new QAction(tr("Edit PANOSE metadata"), this); editPanoseAct->setStatusTip ( tr ( "Edit PANOSE metadata without saving changes to font files" ) ); scuts->add(editPanoseAct); connect(editPanoseAct, SIGNAL(triggered()), this, SLOT(slotEditPanose())); playAction = new QAction(tr("Playground"), this); playAction->setShortcut(Qt::CTRL + Qt::Key_G); playAction->setToolTip(tr("Show/Hide Playground")); playAction->setCheckable(true); playAction->setChecked(false); scuts->add(playAction); connect(playAction, SIGNAL(triggered(bool)), PlayWidget::getInstance(), SLOT(setVisible(bool))); compareAction = new QAction(tr("Compare"), this); compareAction->setShortcut(Qt::CTRL + Qt::Key_R); compareAction->setToolTip(tr("Show/Hide Compare glyphs")); compareAction->setCheckable(true); compareAction->setChecked(false); scuts->add(compareAction); connect(compareAction, SIGNAL(triggered(bool)), FontCompareWidget::getInstance(), SLOT(setVisible(bool))); closeAllFloat = new QAction(tr("Close All"), this); closeAllFloat->setToolTip(tr("Close all floating windows")); scuts->add(closeAllFloat); connect(closeAllFloat, SIGNAL(triggered()), this, SLOT(closeAllFloatings())); showAllFloat = new QAction(tr("Show All"), this); showAllFloat->setToolTip(tr("Show all floating windows")); scuts->add(showAllFloat); connect(showAllFloat, SIGNAL(triggered()), this, SLOT(showAllFloatings())); hideAllFloat = new QAction(tr("Hide All"), this); hideAllFloat->setToolTip(tr("Hide all floating windows")); scuts->add(hideAllFloat); connect(hideAllFloat, SIGNAL(triggered()), this, SLOT(hideAllFloatings())); floatSep = new QAction(this); floatSep->setSeparator(true); extractFontAction = new QAction(tr("Extract fonts..."),this); extractFontAction->setStatusTip ( tr ( "Extract fonts from documents like PDF to PFM file format" ) ); scuts->add(extractFontAction); connect(extractFontAction,SIGNAL(triggered()),this,SLOT(slotExtractFont())); matchRasterAct = new QAction(tr("Find a font using raster sample..."), this); // FIXME find a name for it matchRasterAct->setStatusTip ( tr ( "Find a font using a raster sample of a letter" ) ); scuts->add(matchRasterAct); connect(matchRasterAct,SIGNAL(triggered()),this,SLOT(slotMatchRaster())); #ifdef HAVE_PYTHONQT execScriptAct = new QAction(tr("Execute Script..."),this); execScriptAct->setStatusTip ( tr ( "Execute a Python script" ) ); scuts->add(execScriptAct); connect(execScriptAct,SIGNAL(triggered()),this,SLOT(slotExecScript())); execLastScriptAct = new QAction(tr("Execute Last Script"),this); execLastScriptAct->setStatusTip ( tr ( "Execute the last chosen Python script" ) ); scuts->add(execLastScriptAct); connect(execLastScriptAct,SIGNAL(triggered()),this,SLOT(slotExecLastScript())); scriptConsoleAct = new QAction(tr("Script Console..."), this); scriptConsoleAct->setStatusTip ( tr ( "Open Python scripting console" ) ); scriptConsoleAct->setCheckable(true); scuts->add(scriptConsoleAct); connect(scriptConsoleAct, SIGNAL(triggered()), this, SLOT(slotSwitchScriptConsole())); #endif } void typotek::createMenus() { fileMenu = menuBar()->addMenu ( tr ( "&File" ) ); fileMenu->addAction ( openAct ); fileMenu->addAction ( importFilesAction ); fileMenu->addAction ( exportFontSetAct ); fileMenu->addSeparator(); fileMenu->addAction ( fontBookAct ); fileMenu->addAction ( dumpInfoAct ); fileMenu->addSeparator(); fileMenu->addAction ( exitAct ); editMenu = menuBar()->addMenu ( tr ( "&Edit" ) ); // editMenu->addAction ( tagsetAct ); editMenu->addSeparator(); editMenu->addAction( tagAll ); editMenu->addAction ( activCurAct ); editMenu->addAction ( deactivCurAct ); editMenu->addSeparator(); editMenu->addAction ( fonteditorAct ); editMenu->addAction ( editPanoseAct ); editMenu->addSeparator(); editMenu->addAction(reloadSingleAct); editMenu->addAction(reloadAct); editMenu->addSeparator(); editMenu->addAction ( prefsAct ); viewMenu = menuBar()->addMenu(tr("&View")); viewMenu->addAction(playAction); viewMenu->addAction(compareAction); viewMenu->addSeparator(); connect(viewMenu, SIGNAL(aboutToShow()), this,SLOT(updateFloatingStatus())); #ifdef HAVE_PYTHONQT scriptMenu = menuBar()->addMenu ( tr ( "&Scripts" ) );; scriptMenu->addAction(execScriptAct); scriptMenu->addAction(scriptConsoleAct); scriptMenu->addAction(execLastScriptAct); #endif servicesMenu = menuBar()->addMenu ( tr ( "&Service" ) ); servicesMenu->addAction(extractFontAction); servicesMenu->addAction(matchRasterAct); #ifdef PLATFORM_APPLE // TODO #elif _WIN32 // TODO #else servicesMenu->addAction( repairAct ); #endif servicesMenu->addAction(showTTTAct); servicesMenu->addSeparator(); // servicesMenu->addAction(layOptAct); helpMenu = menuBar()->addMenu ( tr ( "&Help" ) ); helpMenu->addAction ( helpAct ); helpMenu->addAction ( aboutAct ); helpMenu->addAction ( aboutQtAct ); } void typotek::createStatusBar() { // statusBar()->showMessage ( tr ( "Ready" ) ); statusProgressBar = new QProgressBar(this); statusProgressBar->setMaximumSize(200,20); statusBar()->addPermanentWidget(statusProgressBar); statusProgressBar->hide(); QFont statusFontFont ( "sans-serif", 10 ); curFontPresentation = new QLabel ( "" ); curFontPresentation->setFrameShape(QFrame::StyledPanel); curFontPresentation->setAlignment ( Qt::AlignRight ); curFontPresentation->setFont ( statusFontFont ); statusBar()->insertWidget ( 0, curFontPresentation ); countFilteredFonts = new QLabel ( "" ); countFilteredFonts->setFrameShape(QFrame::StyledPanel); countFilteredFonts->setAlignment ( Qt::AlignRight ); countFilteredFonts->setFont ( statusFontFont ); statusBar()->addPermanentWidget ( countFilteredFonts ); toggleMainViewButton = new QToolButton(this); toggleMainViewButton->setText(tr("Browse Directories")); toggleMainViewButton->setCheckable(true); toggleMainViewButton->setToolTip(tr("Toggle Files/Collection view")); statusBar()->addPermanentWidget(toggleMainViewButton); } void typotek::readSettings() { relayStartingStepIn(tr("Load settings")); QSettings settings; QPoint pos = settings.value ( "WState/pos", QPoint ( 200, 200 ) ).toPoint(); QSize size = settings.value ( "WState/size", QSize ( 400, 400 ) ).toSize(); resize ( size ); move ( pos ); fonteditorPath = settings.value ( "FontEditor", "/usr/bin/fontforge" ).toString(); useInitialTags = settings.value ( "UseInitialTags", false ).toBool(); showFontListDialog = settings.value("ShowImportedFonts", true).toBool(); previewSize = settings.value("Preview/Size", 28.0).toDouble(); previewRTL = settings.value("Preview/RTL", false).toBool(); previewSubtitled = settings.value("Preview/Subtitled", false).toBool(); m_theWord = settings.value("Preview/Word", "" ).toString(); // QStringList dl; // dl << "Main" << "Tags" << "Panose"; // foreach(const QString & ds, dl) // { // dockArea[ds] = settings.value("Docks/"+ds+"Pos", "Left").toString(); // dockVisible[ds] = settings.value("Docks/"+ds+"Visible", true).toBool(); // dockGeometry[ds] = settings.value("Docks/"+ds+"Geometry", QRect()).toRect(); // qDebug()<saveSplitterState(); // QStringList dl; // dl << "Main" << "Tags" << "Panose"; // foreach(const QString & ds, dl) // { // if(dockWidget[ds]->isFloating()) // { // dockArea[ds] = "Float"; // } // settings.setValue( "Docks/"+ds+"Pos", dockArea[ds] ); // settings.setValue( "Docks/"+ds+"Visible", dockWidget[ds]->isVisible()); // settings.setValue( "Docks/"+ds+"Geometry", dockWidget[ds]->geometry()); // } settings.setValue("Info/PreviewSize", previewInfoFontSize ); settings.setValue("Info/Style", infoStyle ); settings.setValue("Preview/Word", m_theWord); settings.setValue( "Panose/MatchTreshold", panoseMatchTreshold); settings.setValue( "Database/Driver",databaseDriver); settings.setValue( "Database/Hostname",databaseHostname); settings.setValue( "Database/DbName",databaseDbName); settings.setValue( "Database/User",databaseUser); settings.setValue( "Database/Password",databasePassword); if(theMainView->selectedFont()) settings.setValue("CurrentFont", theMainView->selectedFont()->path()); } bool typotek::maybeSave() { return true; } typotek::~typotek() { } void typotek::fillTagsList() { } void typotek::checkOwnDir() { relayStartingStepIn(tr("Check for Fontmatrix own dir")); QString sep(QDir::separator()); #ifdef PLATFORM_APPLE QString rootDir(QDir::homePath() + sep + "Library" + sep + "Fontmatrix" + sep); managedDir.setPath(QDir::homePath() + sep + "Library" + sep + "Fonts"); ownDir.setPath(rootDir); if ( !managedDir.exists() ) managedDir.mkpath ( QDir::homePath() + sep + "Library" + sep + "Fonts" ); if(!ownDir.exists()) ownDir.mkpath (rootDir); ResourceFile.setFileName ( rootDir + "Resource.xml" ); #elif _WIN32 // For win we do not hide things because it does // not work yet. So if you need to debug it will be simpler. QString fontmanaged ( sep + "fontmatrix" ); managedDir.setPath ( QDir::homePath() + fontmanaged ); if ( !managedDir.exists() ) managedDir.mkpath ( QDir::homePath() + fontmanaged ); ownDir = managedDir; ResourceFile.setFileName ( QDir::homePath() + sep +"fontmatrix.data" ); #else QString rootDir(QDir::homePath() + sep + ".Fontmatrix" + sep); ownDir.setPath(rootDir); // Where activated fonts are sym-linked managedDir.setPath ( rootDir + "Activated" ); if ( !managedDir.exists() ) managedDir.mkpath ( rootDir + "Activated" ); addFcDirItem( managedDir.absolutePath() ); ResourceFile.setFileName ( rootDir + "Resource.xml" ); #endif } void typotek::addFcDirItem(const QString & dirPath) { #ifdef HAVE_FONTCONFIG QFile fcfile ( QDir::homePath() + "/.fonts.conf" ); if ( !fcfile.open ( QFile::ReadWrite ) ) { return; } else { QDomDocument fc ( "fontconfig" ); // .fonts.conf is empty, it seems that we just created it. // Wed have to populate it a bit if ( fcfile.size() == 0 ) { QString ds ( "" ); fc.setContent ( ds ); } else { fc.setContent ( &fcfile ); } bool isconfigured = false; QDomNodeList dirlist = fc.elementsByTagName ( "dir" ); for ( int i=0;i < dirlist.count();++i ) { if ( dirlist.at ( i ).toElement().text() == dirPath ) isconfigured = true; } if ( !isconfigured ) { QDomElement root = fc.documentElement(); QDomElement direlem = fc.createElement ( "dir" ); QDomText textelem = fc.createTextNode ( dirPath ); direlem.appendChild ( textelem ); root.appendChild ( direlem ); fcfile.resize ( 0 ); QTextStream ts ( &fcfile ); fc.save ( ts,4 ); } fcfile.close(); } #endif } QStringList typotek::getSystemFontDirs() { QStringList retList; #ifdef HAVE_FONTCONFIG // For Unices (OSX excluded) QStringList tmpList; FcConfig* FcInitLoadConfig(); FcStrList *sysDirList = FcConfigGetFontDirs(0); QString sysDir( (char*)FcStrListNext(sysDirList) ); while(!sysDir.isEmpty()) { if(!sysDir.contains("Fontmatrix")) { tmpList << sysDir; } sysDir = ( (char*)FcStrListNext(sysDirList) ); } // Because we will go recursivly through these directories, we just want to list the top most ones. foreach(QString path, tmpList) { // qDebug()<< "PATH"<path())) return true; } return false; } void typotek::initDir() { /// let’s load system fonts #define SYSTEM_FONTS 1 if(SYSTEM_FONTS) { relayStartingStepIn ( tr ( "Loading System Fonts") ); m_sysTagName = tr ( "System Fonts" ); QStringList tagsList(FMFontDb::DB()->getTags()); QList sysFontPtrs; QStringList sysDir ( getSystemFontDirs() ); QStringList yetHereFonts; QList fontMap(FMFontDb::DB()->AllFonts()); for ( int i=0;i < fontMap.count() ; ++i ) yetHereFonts << fontMap[i]->path(); for ( int sIdx ( 0 ); sIdx < sysDir.count(); ++sIdx ) { QDir theDir ( sysDir[sIdx] ); QStringList syspathList; QStringList nameList; QStringList dirList ( fontmatrix::exploreDirs ( theDir,0 ) ); QStringList filters; filters << "*.otf" << "*.pfb" << "*.ttf" ; foreach ( QString dr, dirList ) { QDir d ( dr ); QFileInfoList fil= d.entryInfoList ( filters ); foreach ( QFileInfo fp, fil ) { if ( !yetHereFonts.contains ( fp.absoluteFilePath() ) ) syspathList << fp.absoluteFilePath(); sysFontList << fp.absoluteFilePath(); } } int sysFontCount ( syspathList.count() ); if(sysFontCount > 0) { relayStartingStepIn ( tr ( "Adding" ) +" "+ QString::number ( sysFontCount ) +" "+tr ( "fonts from","followed by a directory name" ) +" "+sysDir[sIdx]); qDebug()<< ( tr ( "Adding" ) +" "+ QString::number ( sysFontCount ) +" "+tr ( "fonts from","followed by a directory name" ) +" "+sysDir[sIdx]); FMFontDb::DB()->TransactionBegin(); for ( int i = 0 ; i < sysFontCount; ++i ) { QFile ff ( syspathList.at ( i ) ); QFileInfo fi ( syspathList.at ( i ) ); { FontItem *fitem = FMFontDb::DB()->Font( fi.absoluteFilePath(), false ); if ( fitem ) { // qDebug()<<"\t"<path(); fitem->setActivated ( true ); // fitem->addTag ( m_sysTagName ); sysFontPtrs << fitem; } else { qDebug() << "Cannot open this font because its broken: " << fi.fileName() ; } } } FMFontDb::DB()->TransactionEnd(); } } if(sysFontPtrs.count() > 0) relayStartingStepIn ( QString::number ( sysFontPtrs.count() ) + " " + tr ( "system fonts added." ) ); // So much complicated only because otherwise, tags were added twice with SQLite ??? QStringList tl; foreach(FontItem* sfp, sysFontPtrs) { tl << sfp->path(); } FMFontDb::DB()->addTag(tl, m_sysTagName); } // qDebug()<<"TIME(fonts) : "<run(); // } } static bool slotRemoteIsReadyRunOnce = false; void typotek::slotRemoteIsReady() { if(!slotRemoteIsReadyRunOnce) slotRemoteIsReadyRunOnce = true; else return; QStringList tagsList(FMFontDb::DB()->getTags()); // qDebug()<<"typotek::slotRemoteIsReady()"; QList listInfo(remoteDir->rFonts()); // qDebug()<< "Have got "<< listInfo.count() <<"remote font descriptions"; for(int rf(0) ;rf < listInfo.count(); ++rf) { // qDebug()<< rf <<" : " <isValid()) { qDebug() << "ERROR loading : " << listInfo[rf].file; continue; } fi->fileRemote(listInfo[rf].family,listInfo[rf].variant,listInfo[rf].type, listInfo[rf].info, listInfo[rf].pix); // fontMap.append ( fi ); // realFontMap[fi->path() ] = fi; fi->setTags ( listInfo[rf].tags ); foreach(QString tag, listInfo[rf].tags) { if(!tag.isEmpty() && !tagsList.contains(tag)) { tagsList << tag; } } } // theMainView->slotReloadFontList(); showStatusMessage( QString::number(listInfo.count())+ " " + tr("font descriptions imported from network")); // qDebug()<<"END OF slotRemoteIsReady()"; } void typotek::fontBook() { FontBook fontbook; fontbook.doBook(FontBook::Full); } FontItem * typotek::getSelectedFont() { return theMainView->selectedFont(); } void typotek::keyPressEvent ( QKeyEvent * event ) { // qDebug() << "typotek::keyPressEvent(QKeyEvent * "<modifiers().testFlag(Qt::ControlModifier) &&*/ event->key() == Qt::Key_J) qDebug()<<"NUM FACES OPENED:"<slotActivateAll(); } void typotek::slotDeactivateCurrents() { if ( QMessageBox::question ( this,tr ( "Fontmatrix care" ),tr ( "You are about to deactivate a bunch of fonts,\nit is time to cancel if it was not your intent" ),QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Cancel ) == QMessageBox::Ok ) theMainView->slotDesactivateAll(); } void typotek::helpBegin() { theHelp = new HelpBrowser(this,tr("Fontmatrix Help")); helpAct->setChecked(true); connect( theHelp, SIGNAL( closed() ), this, SLOT(helpEnd()) ); disconnect ( helpAct,SIGNAL ( triggered( ) ),this,SLOT ( helpBegin() ) ); connect ( helpAct,SIGNAL ( triggered( ) ),this,SLOT ( helpEnd() ) ); theHelp->show(); } void typotek::helpEnd() { helpAct->setChecked(false); disconnect ( helpAct,SIGNAL ( triggered( ) ),this,SLOT ( helpEnd() ) ); connect ( helpAct,SIGNAL ( triggered( ) ),this,SLOT ( helpBegin() ) ); theHelp->deleteLater(); } void typotek::slotEditFont() { FontItem *item = theMainView->selectedFont(); if ( !item ) { statusBar()->showMessage ( tr ( "There is no font selected" ), 3000 ); return; } QStringList arguments; arguments << "-nosplash" << item->path() ; QProcess *myProcess = new QProcess ( this ); myProcess->start ( fonteditorPath, arguments ); } void typotek::setupDrop() { setAcceptDrops ( true ); // was pretty hard! } void typotek::dropEvent ( QDropEvent * event ) { qDebug() << "typotek::dropEvent ("<< event->mimeData()->text() <<")"; // qDebug()<<"F: "<mimeData()->formats().join(";"); // event->acceptProposedAction(); QStringList uris = event->mimeData()->text().split ( "\n" ); QStringList ret; for ( int i = 0; i < uris.count() ; ++i ) { qDebug() << "dropped uri["<< i <<"] -> "<< uris[i]; QUrl url ( uris[i].trimmed() ); qDebug() << "\tURL -> " << url.toLocalFile(); if ( url.scheme() == "file" ) { if ( url.toLocalFile().endsWith ( "ttf",Qt::CaseInsensitive ) ) { ret << url.toLocalFile(); } else if ( url.toLocalFile().endsWith ( "otf",Qt::CaseInsensitive ) ) { ret << url.toLocalFile(); } else if ( url.toLocalFile().endsWith ( "pfb",Qt::CaseInsensitive ) ) { ret << url.toLocalFile(); } else { qDebug() << url.toLocalFile () << "is not a supported font file"; } } else if ( url.scheme() == "http" ) { // TODO Get fonts over http qDebug() << "Support of DragNDrop over http is sheduled"; statusBar()->showMessage ( tr ( "Support of DragNDrop over http is sheduled but not yet effective" ), 3000 ); } else { qDebug() << "Protocol not supported"; } } // qDebug() << ret.join("||"); if ( ret.count() ) openList( ret ); } void typotek::dragEnterEvent ( QDragEnterEvent * event ) { qDebug() << event->mimeData()->formats().join ( "|" ); if ( event->mimeData()->hasFormat ( "text/uri-list" ) ) { event->acceptProposedAction(); qDebug() << "dragEnterEvent accepted " ; } else { qDebug() << "dragEnterEvent refused"; statusBar()->showMessage ( tr ( "You bring something over me I can’t handle" ), 3000 ); } } void typotek::slotPrefsPanel(PrefsPanelDialog::PAGE page) { PrefsPanelDialog pp ( this ); // FIXME if Systray is not available, systray->whatever() will segault if ( QSystemTrayIcon::isSystemTrayAvailable() ) pp.initSystrayPrefs ( QSystemTrayIcon::isSystemTrayAvailable(), systray->isVisible(), systray->hasActivateAll(), systray->allConfirmation(), systray->tagsConfirmation() ); else pp.initSystrayPrefs ( false,false,false,false,false ); pp.initSampleTextPrefs(); pp.initFilesAndFolders(); pp.initShortcuts(); pp.showPage(page); pp.exec(); } void typotek::slotPrefsPanelDefault() { slotPrefsPanel(PrefsPanelDialog::PAGE_GENERAL); } void typotek::forwardUpdateView() { // theMainView->slotView ( true ); } void typotek::setSystrayVisible ( bool isVisible ) { systray->slotSetVisible ( isVisible ); } void typotek::showActivateAllSystray ( bool isVisible ) { systray->slotSetActivateAll ( isVisible ); } void typotek::systrayAllConfirmation ( bool isEnabled ) { systray->requireAllConfirmation ( isEnabled ); } void typotek::systrayTagsConfirmation ( bool isEnabled ) { systray->requireTagsConfirmation ( isEnabled ); } void typotek::slotCloseToSystray ( bool isEnabled ) { QSettings settings ; settings.setValue ( "Systray/CloseToTray", isEnabled ); settings.setValue ( "Systray/CloseNoteShown", false ); } void typotek::slotSystrayStart( bool isEnabled ) { QSettings settings ; settings.setValue ( "Systray/StartToTray", isEnabled ); } QString typotek::namedSample ( QString name ) { QString cn(name); if(cn == QString("NEW_SAMPLE")) return tr("Edit me!"); if(cn.isEmpty()) cn = currentNamedSample; else currentNamedSample = cn; if(!dataLoader) dataLoader = new DataLoader(); const QMap& us(dataLoader->userSamples()); foreach(const QString& k, us.keys()) { QString id(QString("User::") + k); // qDebug()<<"\t"< >& ss(dataLoader->systemSamples()); foreach(const QString& pk, ss.keys()) { foreach(const QString& sk, ss[pk].keys()) { QString id(pk + QString("::") + sk); // qDebug()<<"\t"< > typotek::namedSamplesNames() { if(!dataLoader) dataLoader = new DataLoader(); QMap > ret; const QMap& us(dataLoader->userSamples()); const QMap >& ss(dataLoader->systemSamples()); foreach(const QString& key, ss.keys()) { ret[key] << ss[key].keys(); } ret[QString("User")] << us.keys(); return ret; } void typotek::addNamedSample ( QString name, QString sample ) { if(!dataLoader) dataLoader = new DataLoader(); dataLoader->update(name, sample); // theMainView->refillSampleList(); } void typotek::removeNamedSample(const QString& key) { if(!dataLoader) dataLoader = new DataLoader(); dataLoader->remove(key); // theMainView->refillSampleList(); } void typotek::changeSample ( QString name, QString text ) { if(!dataLoader) dataLoader = new DataLoader(); dataLoader->update(name, text); // theMainView->refillSampleList(); } QString typotek::defaultSampleName() { if(!dataLoader) dataLoader = new DataLoader(); const QMap& us(dataLoader->userSamples()); if(us.contains(tr("default"))) return QString("User::") + QString("default"); else if(us.count() > 0) return QString("User::") + us.keys().first(); else { const QMap >& ss(dataLoader->systemSamples()); QString l(QLocale::system().language()); if((ss.contains(l)) && (ss[l].count() > 0)) return l + QString("::") + ss[l].keys().first(); else { foreach(QString k, ss.keys()) { if(ss[k].count() > 0) return k + QString("::") +ss[k].keys().first(); } } } return QString(); } void typotek::setWord ( QString s, bool updateView ) { if(s == m_theWord) return; m_theWord = s; QList fontMap(FMFontDb::DB()->AllFonts()); for(int i(0); i < fontMap.count(); ++i) fontMap[i]->clearPreview() ; emit previewHasChanged(); } void typotek::setPreviewSize(double d) { if(previewSize == d) return; // previewSize = d; // if(previewSize != ListDockWidget::getInstance()->previewSize->value()) // ListDockWidget::getInstance()->previewSize->setValue(previewSize); QList fontMap(FMFontDb::DB()->AllFonts()); for(int i(0); i < fontMap.count(); ++i) fontMap[i]->clearPreview() ; emit previewHasChanged(); } void typotek::setPreviewRTL(bool d) { if(previewRTL == d) return; previewRTL = d; QList fontMap(FMFontDb::DB()->AllFonts()); for(int i(0); i < fontMap.count(); ++i) fontMap[i]->clearPreview() ; emit previewHasChanged(); } void typotek::setPreviewSubtitled(bool d) { if(previewSubtitled == d) return; previewSubtitled = d; QList fontMap(FMFontDb::DB()->AllFonts()); for(int i(0); i < fontMap.count(); ++i) fontMap[i]->clearPreview() ; emit previewHasChanged(); } void typotek::setFontEditorPath ( const QString &path ) { fonteditorPath = path; if ( QFile::exists ( fonteditorPath ) ) { fonteditorAct->setEnabled ( true ); fonteditorAct->setStatusTip ( tr ( "Try to run font editor with the selected font as argument" ) ); } else { fonteditorAct->setEnabled ( false ); fonteditorAct->setStatusTip ( tr ( "You don't seem to have font editor installed. Path to font editor can be set in preferences." ) ); } QSettings settings ; settings.setValue ( "FontEditor", fonteditorPath ); } void typotek::slotUseInitialTags ( bool isEnabled ) { useInitialTags = isEnabled; QSettings settings ; settings.setValue ( "UseInitialTags", isEnabled ); } void typotek::showImportedFonts(int show) // 0 == show dialog, 2 == do not show { bool doShow = true; if (show == Qt::Checked) doShow = false; showFontListDialog = doShow; QSettings settings; settings.setValue("ShowImportedFonts", doShow); } bool typotek::showImportedFonts() { return showFontListDialog; } void typotek::setTemplatesDir(const QString & dir) { templatesDir = dir; QSettings settings; settings.setValue("Places/TemplatesDir", templatesDir); } void typotek::changeFontSizeSettings(double fSize, double lSize) { QSettings settings; settings.setValue("Sample/FontSize", fSize); settings.setValue("Sample/Interline", lSize); // theMainView->reSize(fSize,lSize); } void typotek::relayStartingStepIn(QString s) { int i( Qt::AlignRight | Qt::AlignBottom ); QColor c(Qt::white); emit relayStartingStepOut( s, i , c ); } void typotek::removeFontItem(QString key) { // FontItem *fit = realFontMap.value(key); // if(!fit) // return; // fontMap.removeAll(fit); // delete fit; // realFontMap.remove(key); // qDebug()<< key << "has been removed"; FMFontDb::DB()->Remove(key); } void typotek::removeFontItem(QStringList keyList) { foreach(QString key, keyList) { removeFontItem(key); } } void typotek::showStatusMessage(const QString & message) { statusBar()->showMessage(message, 3000); } void typotek::setRemoteTmpDir(const QString & s) { if(s.isEmpty()) m_remoteTmpDir = QDir::temp().path(); else m_remoteTmpDir = s; QSettings settings; settings.setValue("Places/RemoteTmpDir", m_remoteTmpDir); } void typotek::slotRepair() { FmRepair repair(this); repair.exec(); } void typotek::slotTagAll() { QStringList tagsList(FMFontDb::DB()->getTags()); ImportTags imp(this,tagsList); imp.exec(); QStringList tali = imp.tags(); if(tali.isEmpty()) return; for(int t(0); t < tali.count(); ++t) { if(!tagsList.contains(tali[t])) { tagsList.append(tali[t]); } } FMFontDb::DB()->TransactionBegin(); QList curfonts = theMainView->curFonts(); for(int i(0) ; i < curfonts.count(); ++i) { for(int t(0); t < tali.count(); ++t) { curfonts[i]->addTag(tali[t]); } } FMFontDb::DB()->TransactionEnd(); // TagsWidget::getInstance()->newTag(); } //void typotek::printFamily() //{ // FontItem * font(theMainView->selectedFont()); // if(!font) // return; // QPrinter thePrinter ( QPrinter::HighResolution ); // QPrintDialog dialog(&thePrinter, this); // dialog.setWindowTitle("Fontmatrix - " + tr("Print Family") +" - " + font->family()); // if ( dialog.exec() != QDialog::Accepted ) // return; // thePrinter.setFullPage ( true ); // QPainter aPainter ( &thePrinter ); // QGraphicsScene tmpScene(thePrinter.paperRect()); // QGraphicsScene pScene(thePrinter.paperRect()); // qDebug()< logWidth; // QMap logAscend; // QMap logDescend; // QMap sampleString; // QMap sampleFont; // QStringList stl1(namedSample ( theMainView->sampleName() ).split ( QRegExp("\\W") )); // if(stl1.count() < 10 ) // { // QMessageBox::information(this,"Fontmatrix",tr("Not enough text to make a sample")); // return; // } // QStringList stl; // int idxS(0); // int idxE( qrand() % 9 ); // while((idxS + idxE) < stl1.count()) // { // QString t(QStringList(stl1.mid(idxS,idxE)).join( " " )); // qDebug()<<"s e T"< familyFonts(FMFontDb::DB()->Fonts(theMainView->selectedFont()->family(), FMFontDb::Family )); //// if(familyFonts.count() > stl.count()) // { // int diff ( familyFonts.count() ); // for (int i(0); i < diff; ++i) // { // sampleString[i] = stl[ i % stl.count() ]; // } // } // // first we’ll get widths for font size 1000 // for(int fidx(0); fidx < familyFonts.count(); ++fidx) // { // sampleFont[fidx] = familyFonts[fidx]; // bool rasterState(sampleFont[fidx]->rasterFreetype()); // sampleFont[fidx]->setFTRaster(false); // sampleFont[fidx]->setRenderReturnWidth(true); // logWidth[fidx] = familyFonts[fidx]->renderLine(&tmpScene, sampleString[fidx], QPointF(0.0, 1000.0) , 999999.0, 1000.0, 1) ; // sampleFont[fidx]->setRenderReturnWidth(false); // sampleFont[fidx]->setFTRaster(rasterState); // logAscend[fidx] = 1000.0 - tmpScene.itemsBoundingRect().top(); // logDescend[fidx] = tmpScene.itemsBoundingRect().bottom() - 1000.0; // qDebug()<< sampleString[fidx] << logWidth[fidx]; // QList lgit(tmpScene.items()); // foreach(QGraphicsItem* git, lgit) // { // tmpScene.removeItem(git); // delete git; // } // } // double defWidth(0.8 * pScene.width() ); // double defHeight(0.9 * pScene.height() ); // double xOff( 0.1 * pScene.width() ); // double yPos(0.1 * pScene.height() ); // QFont nameFont; // nameFont.setPointSizeF(100.0); // nameFont.setItalic(true); // for(int fidx(0); fidx < familyFonts.count(); ++fidx) // { // double scaleFactor(1000.0 / logWidth[fidx] ); // double fSize( defWidth * scaleFactor ); // double fAscend(logAscend[fidx] * fSize / 1000.0); // double fDescend(logDescend[fidx] * fSize / 1000.0 ); // if( yPos + fAscend + fDescend > defHeight) // { // pScene.render(&aPainter); // thePrinter.newPage(); // QList lgit(pScene.items()); // foreach(QGraphicsItem* git, lgit) // { // pScene.removeItem(git); // delete git; // } // yPos = 0.1 * pScene.height(); // } // yPos += fAscend; // QPointF origine(xOff, yPos ); // qDebug()<< sampleString[fidx] << fSize; // bool rasterState(sampleFont[fidx]->rasterFreetype()); // sampleFont[fidx]->setFTRaster(false); // sampleFont[fidx]->renderLine(&pScene, sampleString[fidx], origine, pScene.width(), fSize, 100); // pScene.addLine(QLineF(origine, QPointF(xOff + defWidth, yPos))); // sampleFont[fidx]->setFTRaster(rasterState); // yPos += fDescend ; // QGraphicsSimpleTextItem * nameText = pScene.addSimpleText( familyFonts[fidx]->fancyName(), nameFont) ; // nameText->setPos(xOff, yPos); //// nameText->setBrush(Qt::gray); // yPos += nameText->boundingRect().height(); // } // pScene.render(&aPainter); //} void typotek::showEvent(QShowEvent * event) { QMainWindow::showEvent(event); } void typotek::slotDockAreaChanged(Qt::DockWidgetArea area) { QDockWidget * dw(reinterpret_cast(sender())); if(dw) { QString wId(dw->objectName()); if(area == Qt::LeftDockWidgetArea) dockArea[wId] = "Left"; else if(area ==Qt::RightDockWidgetArea) dockArea[wId] ="Right"; else if(area == Qt::TopDockWidgetArea) dockArea[wId] ="Top"; else if(area == Qt::BottomDockWidgetArea) dockArea[wId] = "Bottom"; } } FMHyphenator* typotek::getHyphenator() const { return hyphenator; } //void typotek::slotSwitchLayOptVisible() //{ // if(FMLayout::getLayout()->optionDialog->isVisible()) // FMLayout::getLayout()->optionDialog->setVisible(false); // else // FMLayout::getLayout()->optionDialog->setVisible(true); // slotUpdateLayOptStatus(); //} //void typotek::slotUpdateLayOptStatus() //{ // if(FMLayout::getLayout()->optionDialog->isVisible()) // layOptAct->setChecked(true); // else // layOptAct->setChecked(false); //} #ifdef HAVE_PYTHONQT void typotek::slotSwitchScriptConsole() { if(FMScriptConsole::getInstance()->isVisible()) FMScriptConsole::getInstance()->setVisible(false); else FMScriptConsole::getInstance()->setVisible(true); slotUpdateScriptConsoleStatus(); } void typotek::slotUpdateScriptConsoleStatus() { if(FMScriptConsole::getInstance()->isVisible()) scriptConsoleAct->setChecked(true); else scriptConsoleAct->setChecked(false); } #else void typotek::slotSwitchScriptConsole(){} void typotek::slotUpdateScriptConsoleStatus(){} #endif QString typotek::getDefaultOTFScript() const { return defaultOTFScript; } void typotek::setDefaultOTFScript ( const QString& theValue ) { if(theValue != defaultOTFScript) { QSettings st; st.setValue("OTF/Script" , theValue); } defaultOTFScript = theValue; } QString typotek::getDefaultOTFLang() const { return defaultOTFLang; } void typotek::setDefaultOTFLang ( const QString& theValue ) { if(theValue != defaultOTFLang) { QSettings st; st.setValue("OTF/Lang" , theValue); } defaultOTFLang = theValue; } QStringList typotek::getDefaultOTFGPOS() const { return defaultOTFGPOS; } void typotek::setDefaultOTFGPOS ( const QStringList& theValue ) { if(theValue != defaultOTFGPOS) { QSettings st; st.setValue("OTF/GPOS" , theValue.join(";")); } defaultOTFGPOS = theValue; } QStringList typotek::getDefaultOTFGSUB() const { return defaultOTFGSUB; } void typotek::setDefaultOTFGSUB ( const QStringList& theValue ) { if(theValue != defaultOTFGSUB) { QSettings st; st.setValue("OTF/GSUB" , theValue.join(";")); } defaultOTFGSUB = theValue; } void typotek::startProgressJob(int max) { statusProgressBar->reset(); statusProgressBar->setRange(0,max); statusProgressBar->show(); } void typotek::runProgressJob(int i) { if(i) { statusProgressBar->setValue(i); } else { int v(statusProgressBar->value()); statusProgressBar->setValue( ++v ); } } void typotek::endProgressJob() { statusProgressBar->hide(); statusProgressBar->reset(); } void typotek::slotShowTTTables() { if(theMainView->selectedFont()) { QDialog dia(this); QGridLayout glayout(&dia); TTTableView tv(theMainView->selectedFont(),&dia); QPushButton pbutton(tr("Close"),&dia); glayout.addWidget(&tv,0,0,3,3); glayout.addWidget(&pbutton,3,2); pbutton.setDefault(true); QRect drect(dia.rect()); drect.setX(this->geometry().x() + 32); drect.setY(this->geometry().y() + 32); drect.setWidth(tv.rect().width() * 1.2); drect.setHeight(tv.rect().height() * 1.2); dia.setGeometry(drect); connect(&pbutton,SIGNAL(released()),&dia,SLOT(close())); dia.exec(); } } void typotek::slotEditPanose() { if(theMainView->selectedFont()) { FMPanoseDialog dia(theMainView->selectedFont(), this); dia.exec(); if(dia.getOk() && ( dia.getSourcePanose() != dia.getTargetPanose() )) { // qDebug()<< "Update Panose"<selectedFont()->path(); FMFontDb::DB()->setValue(theMainView->selectedFont()->path(), FMFontDb::Panose, dia.getTargetPanose()); // theMainView->slotInfoFont(); } } } void typotek::slotDumpInfo() { if(theMainView->selectedFont()) { FMDumpDialog dia(theMainView->selectedFont(), this); if(dia.exec() != QDialog::Accepted) { qDebug()<< "Dump not saved"; } } } void typotek::slotReloadFiltered() { FontItem * cf(theMainView->selectedFont()); QString cfName; if(cf) cf->path(); QStringList toReload; QApplication::changeOverrideCursor(Qt::WaitCursor); QMap tagsRec; FMFontDb *db(FMFontDb::DB()); foreach(FontItem* f, theMainView->curFonts()) { toReload << f->path(); tagsRec[f->path()] = f->tags(); db->Remove(f->path()); } QList renewedFonts; foreach(QString p, toReload) { FontItem * it(db->Font(p, true)); if(it) { renewedFonts << it; } } db->TransactionBegin(); foreach(FontItem* it, renewedFonts) { it->setTags(tagsRec[it->path()]); } db->TransactionEnd(); if(toReload.count() > renewedFonts.count()) { //! Number of fonts we failed to reload showStatusMessage(tr("Failed to reload %n fonts", "", toReload.count() - renewedFonts.count())); // theMainView->slotReloadFontList(); } if(!cfName.isEmpty()) { // theMainView->forceReloadSelection(); theMainView->slotFontSelectedByName(cfName); } QApplication::restoreOverrideCursor(); } void typotek::slotReloadSingle() { FontItem * cf(theMainView->selectedFont()); if(cf) { QString curName(cf->path()); QStringList t(cf->tags()); FMFontDb::DB()->Remove(curName); cf = FMFontDb::DB()->Font(curName, true); if(cf) { cf->setTags(t); // theMainView->forceReloadSelection(); theMainView->slotFontSelectedByName(curName); } } } void typotek::slotExtractFont() { FMFontExtract ex(this); ex.exec(); } void typotek::slotMatchRaster() { FMMatchRaster mr(this); mr.exec(); } #ifdef HAVE_PYTHONQT void typotek::slotExecScript() { lastScript = QFileDialog::getOpenFileName(this,"Fontmatrix",QDir::homePath(),tr("Python scripts (*.py)")); if(!lastScript.isEmpty()) { if((recentScripts.count() < MAX_RECENT_PYSCRIPTS) && (!recentScripts.values().contains(lastScript))) { QFileInfo fInfo(lastScript); QAction * sca (new QAction(fInfo.baseName(), this)); recentScripts[sca] = lastScript; connect(sca, SIGNAL(triggered()), this, SLOT(slotExecRecentScript())); scriptMenu->addAction(sca); } FMPythonW::getInstance()->runFile(lastScript); } else qDebug()<<"Error: Script path empty"; } void typotek::slotExecLastScript() { if(!lastScript.isEmpty()) { FMPythonW::getInstance()->runFile(lastScript); } else qDebug()<<"Error: Script path empty"; } void typotek::slotExecRecentScript() { if(sender()) { QAction * sca = reinterpret_cast(sender()); if(sca) { if(recentScripts.contains(sca)) { lastScript = recentScripts[sca]; FMPythonW::getInstance()->runFile(lastScript); } } } } #else void typotek::slotExecScript(){} void typotek::slotExecLastScript(){} void typotek::slotExecRecentScript(){} #endif void typotek::showToltalFilteredFonts() { countFilteredFonts->setText( tr( "Filtered Font(s): %n", "number of filtererd fonts showed in status bar", FMFontDb::DB()->countFilteredFonts() ) ); } void typotek::presentFontName(QString s) { curFontPresentation->setText(QString("%1 : %2") .arg(tr("Current Font", "followed by currently selected font name (in status bar)")) .arg(s)); } int typotek::getPanoseMatchTreshold() const { return panoseMatchTreshold; } void typotek::setPanoseMatchTreshold ( int theValue ) { panoseMatchTreshold = theValue; } QString typotek::getWebBrowser() const { return webBrowser; } void typotek::setWebBrowser ( const QString& theValue ) { webBrowser = theValue; } QString typotek::getWebBrowserOptions() const { return webBrowserOptions; } void typotek::setWebBrowserOptions ( const QString& theValue ) { webBrowserOptions = theValue; } void typotek::hide() { foreach(const QString& k, dockWidget.keys()) { dockVisible[k] = dockWidget[k]->isVisible(); dockWidget[k]->hide(); } visibleFloatingWidgets.clear(); foreach(FloatingWidget* f, FloatingWidgetsRegister::AllWidgets()) { visibleFloatingWidgets[f] = f->isVisible(); f->setVisible(false); } playVisible = PlayWidget::getInstance()->isVisible(); QMainWindow::hide(); } void typotek::show() { foreach(const QString& k, dockWidget.keys()) { dockWidget[k]->setVisible(dockVisible[k]); } foreach(FloatingWidget *f, visibleFloatingWidgets.keys()) { f->setVisible(visibleFloatingWidgets[f]); } PlayWidget::getInstance()->setVisible(playVisible); QMainWindow::show(); } void typotek::setInfoStyle ( const QString& theValue ) { infoStyle = theValue; } QString typotek::word(FontItem * item, const QString& alt) { if(item) { QString word(m_theWord); if(!alt.isEmpty()) word = alt; word.replace("", item->fancyName()); word.replace("", item->family()); word.replace("", item->variant()); return word; } return m_theWord; } void typotek::updateFloatingStatus() { playAction->setChecked( PlayWidget::getInstance()->isVisible() ); compareAction->setChecked(FontCompareWidget::getInstance()->isVisible()); viewMenu->removeAction(closeAllFloat); viewMenu->removeAction(showAllFloat); viewMenu->removeAction(hideAllFloat); viewMenu->removeAction(floatSep); QList fwl(FloatingWidgetsRegister::AllWidgets()); foreach(FloatingWidget* f, floatingWidgets.keys()) { if(!fwl.contains(f)) { viewMenu->removeAction(floatingWidgets[f]); floatingWidgets.remove(f); } } foreach(FloatingWidget* f, fwl) { if(floatingWidgets.contains(f)) { floatingWidgets[f]->setChecked(f->isVisible()); } else { QAction *wa(new QAction(f->getActionName(),this)); wa->setCheckable(true); connect(f, SIGNAL(visibilityChange()), this, SLOT(updateFloatingStatus())); connect(wa, SIGNAL(triggered(bool)), f, SLOT(activate(bool))); floatingWidgets.insert(f, wa); floatingWidgets[f]->setChecked(f->isVisible()); viewMenu->addAction(wa); } } if(floatingWidgets.count() > 0) { viewMenu->addAction(floatSep); viewMenu->addAction(closeAllFloat); } if(floatingWidgets.count() > 1) { viewMenu->addAction(showAllFloat); viewMenu->addAction(hideAllFloat); } } void typotek::closeAllFloatings() { foreach(FloatingWidget* f, floatingWidgets.keys()) { f->close(); } } void typotek::showAllFloatings() { foreach(FloatingWidget* f, floatingWidgets.keys()) { f->setVisible(true); } } void typotek::hideAllFloatings() { foreach(FloatingWidget* f, floatingWidgets.keys()) { f->setVisible(false); } } void typotek::toggleMainView(bool v) { if(v) mainStack->setCurrentWidget(theBrowser); else mainStack->setCurrentWidget(theMainView); } void typotek::pushObject(QObject *o) { o->moveToThread(sender()->thread()); } fontmatrix-0.6.0+svn20110930/src/puzzleviewimp.h0000644000175000017500000000234411167445115020232 0ustar malexmalex// // C++ Interface: puzzleviewimp // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #ifndef PUZZLEVIEWIMP_H #define PUZZLEVIEWIMP_H #include #include #include class SVect { public: SVect() :x ( 0.0 ),y ( 0.0 ) {} SVect ( double xx, double yy ) :x ( xx ),y ( yy ) {} SVect ( const SVect& other ) {this->x = other.x;this->y = other.y;} SVect& operator= ( const SVect& other ) {this->x = other.x;this->y = other.y; return *this;} inline double squareDistance ( const SVect& other ) const { double C1 ( other.x - x ); double C2 ( other.y - y ); return ( C1 * C1 ) + ( C2 * C2 ); } private: double x; double y; }; class PuzzleViewImp : public QList { PuzzleViewImp() {} public: PuzzleViewImp ( const QString& iPath, QRgb patternColor ); PuzzleViewImp ( const QImage& qimg, QRgb patternColor ); ~PuzzleViewImp(); QList CompList ( const PuzzleViewImp& other ); double CompSum ( const PuzzleViewImp& other ); double CompMean ( const PuzzleViewImp& other ); private: QRgb pc; void init ( const QImage& qimg ); }; #endif // PUZZLEVIEWIMP_H fontmatrix-0.6.0+svn20110930/src/fminfodisplay.cpp0000644000175000017500000002715011444417016020476 0ustar malexmalex// // C++ Implementation: fminfodisplay // // Description: // // // Author: Pierre Marchand , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #include "fminfodisplay.h" #include "fmencdata.h" #include "fontitem.h" #include "fmfontdb.h" #include "fmfontstrings.h" #include "fmpaths.h" #include "glyphtosvghelper.h" #include "typotek.h" #include #include #include #include #include FMInfoDisplay::FMInfoDisplay(FontItem * font) { /** Selectors are : #headline #file .infoblock .infoname .langmatch .langundefined .langnomatch .encodingcurrent .encoding */ html = "\n"; html += "\n"; html += "\n"; html += "" + xhtmlifies( font->fancyName() ) + "\n"; html += "\n"; html += "getInfoStyle()).toString() + "\" type=\"text/css\" />\n"; html += "