From b51bdab8ecf159f8def4733e42cbc673e7527e93 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 24 Aug 2009 22:50:45 +0000 Subject: [PATCH 01/16] Change the manual tabe colours so that we have a darker blue for the header, then white and light blue alternating for the rows. As decided upon after a lengthy IRC discussion :) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22508 a1c6a512-1295-4272-9138-f99709370657 --- manual/preamble.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manual/preamble.tex b/manual/preamble.tex index 2180dc3f8..bbd73f8ec 100644 --- a/manual/preamble.tex +++ b/manual/preamble.tex @@ -61,9 +61,9 @@ \newcommand{\fixme}[1]{\textbf{\textcolor{red}{#1}}} % Colors used to typeset table headers and alternating table rows -\colorlet{tblhdrbgcolor}{white} % Background color for headers -\colorlet{tbloddrowbgcolor}{white} % Background color for odd rows (headers not included) -\colorlet{tblevenrowbgcolor}{blue!15} % Background color for even rows (headers not included) +\colorlet{tblhdrbgcolor}{blue!30} % Background color for headers +\colorlet{tbloddrowbgcolor}{blue!10} % Background color for odd rows (headers not included) +\colorlet{tblevenrowbgcolor}{white} % Background color for even rows (headers not included) \usepackage{fancyhdr} \usepackage{graphicx} -- 2.11.4.GIT From 5fbc10cbc6eea2c67c4811fcd6ffa916cc27f09b Mon Sep 17 00:00:00 2001 From: alle Date: Mon, 24 Aug 2009 22:54:09 +0000 Subject: [PATCH 02/16] Fully fill the table headers with color git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22509 a1c6a512-1295-4272-9138-f99709370657 --- manual/preamble.tex | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/manual/preamble.tex b/manual/preamble.tex index bbd73f8ec..fa2ef73ae 100644 --- a/manual/preamble.tex +++ b/manual/preamble.tex @@ -102,6 +102,9 @@ \setlength{\headheight}{18.5pt} \newcounter{example}[chapter] +\setlength{\belowrulesep}{0pt} +\setlength{\aboverulesep}{0pt} + %% \newenvironment{example} %% {\stepcounter{example}\paragraph{Example \theexample:}} %% {\hfill$\Box$ @@ -233,7 +236,7 @@ } \center \tabularx{#1}{#2}\toprule\rowcolor{tblhdrbgcolor} - #3\\\midrule + \rule{0pt}{2.9ex}#3\\\midrule }{% \endtabularx } @@ -242,7 +245,7 @@ % command to set the default table heading for button lists -\newcommand{\taghead}{\textbf{Tag} & \textbf{Description} \\\midrule} +\newcommand{\taghead}{\rule{0pt}{2.9ex}\textbf{Tag} & \textbf{Description} \\\midrule} % environment intended to be used with tag maps (for wps) % usage: \begin{tagmap}{caption}{label} Tag & Description \\ \end{tagmap} @@ -379,7 +382,7 @@ % here is the table width defined for 2 columns \tabularx{.75\textwidth}{>{\raggedright\arraybackslash}p{.22\textwidth}X}\toprule\rowcolor{tblhdrbgcolor} } - \btnhead + \rule{0pt}{2.9ex}\btnhead }{% \endtabularx } -- 2.11.4.GIT From 743a9f6e4f70f13140fbef0e9ea613e2cd10772f Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 25 Aug 2009 12:59:07 +0000 Subject: [PATCH 03/16] Add clix screenshots to the manual. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22510 a1c6a512-1295-4272-9138-f99709370657 --- manual/plugins/images/ss-clix-128x128x16.png | Bin 0 -> 774 bytes manual/plugins/images/ss-clix-132x80x16.png | Bin 0 -> 722 bytes manual/plugins/images/ss-clix-160x128x16.png | Bin 0 -> 825 bytes manual/plugins/images/ss-clix-176x132x16.png | Bin 0 -> 864 bytes manual/plugins/images/ss-clix-176x220x16.png | Bin 0 -> 1023 bytes manual/plugins/images/ss-clix-220x176x16.png | Bin 0 -> 1008 bytes manual/plugins/images/ss-clix-240x320x16.png | Bin 0 -> 1349 bytes manual/plugins/images/ss-clix-320x240x16.png | Bin 0 -> 1328 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 manual/plugins/images/ss-clix-128x128x16.png create mode 100644 manual/plugins/images/ss-clix-132x80x16.png create mode 100644 manual/plugins/images/ss-clix-160x128x16.png create mode 100644 manual/plugins/images/ss-clix-176x132x16.png create mode 100644 manual/plugins/images/ss-clix-176x220x16.png create mode 100644 manual/plugins/images/ss-clix-220x176x16.png create mode 100644 manual/plugins/images/ss-clix-240x320x16.png create mode 100644 manual/plugins/images/ss-clix-320x240x16.png diff --git a/manual/plugins/images/ss-clix-128x128x16.png b/manual/plugins/images/ss-clix-128x128x16.png new file mode 100644 index 0000000000000000000000000000000000000000..5f71a8c375db695fe02096da94f049fa664bdbc4 GIT binary patch literal 774 zcwXxa@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRdwroCO|{#S9F5he4R}c>anMkYHJX zV>(PVgTX_?SquzJj-D=#Ar-gY-VH2jRuE}@=&jyu@H;-{j_a=nCXW?vba$~I`fvNC zQKd=7`+dfiGzNwRitp|3Uwqs;TUYAI!Mf}6s|}TJ=ia-Yy!YdJY1_Yc-{SccbACri z+3UXk-XbvV+nwrnb2QWA=Pz`#E=u@w@rvyIxfzZHa+?F6{d-(hS^D>L)Vz`vrWBvKVd%2m9u1hgMK*N%Rw96v#-)BCbkXPeh zm^_2qE^e`*rAqzck`HO$k|!uJ7%~Yc1BnASKBcbMpRs%Gv&&^6i5|y`8g;26H6uCQ**PG7<#L|4vIrN2{W!3U?Yxm$ z#lrbUTa@7zNJKx>^?G|ZN3Sm7^3Hp`svdm^$FBYsKPAt4?#%}~BTilD6M$GE!I+Q} zK8N@3zTLMf6E0go)B*_v2>HUj@lCc{m4(hTQy=%(P0}8iKOkZvk28>FVdQ&MBb@0NgDz AJ^%m! literal 0 HcwPel00001 diff --git a/manual/plugins/images/ss-clix-132x80x16.png b/manual/plugins/images/ss-clix-132x80x16.png new file mode 100644 index 0000000000000000000000000000000000000000..53aef46918bfdcf72aec5f3af624063551fe9855 GIT binary patch literal 722 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 BtVsX> literal 0 HcwPel00001 diff --git a/manual/plugins/images/ss-clix-240x320x16.png b/manual/plugins/images/ss-clix-240x320x16.png new file mode 100644 index 0000000000000000000000000000000000000000..db5416fee4ba7bbcbdf5fc5ade30510f1d0ce7b5 GIT binary patch literal 1349 zcwXxa@N?(olHy`uVBq!ia0vp^9~c-I9XOakB3)@LK#H@#BeIx*f$uN~Gak=hkpdDd zD{xGQsb={2yHSaOfu+II#WAGf*4w*|MYkeE90IRQb+z~%AG3%1d&4V}gA$3-FYE8l zF)mp8fnVswv^58{UzPx^X|Uh(clpMn>iga41u1%Nkbq~h{r|MP z>E8YR-}~dHJ^j;vI=Q&+<9F@p+0#-j_y4;%>v!3|*#%z<*V&yA|MvgYYT++B>+~4p zY?jB(oh)bneqMd`&(AOA(@X!$S3aG1zNmh8&f9O2zy9ugQ`*sfIE&u-&Uw(VI;PbB^|Nj?%m-_YZ_Z&Nm zKlgV=#eV&l^5?<6yFcZ^>@Rx0V88|bWPVW2jf=ZBfA+UuyF{k#-MdCVI&S`-JY}<8 zyV8RH_uRFynZCeN&_uII&Go_(j#(m(la(@pSbV!cf(O<_9ripw_o(Ei{NwWzqhdE} zPM1MfgV4x)=9R)>Phw53{bmZ{-U zeDScSb6R0qoZ06UlOL+wn2E=|d`5FjKI=|QlPmocVQyi9-Jw9ihDg~Ii<5IM6i!>a z?&cJ4J{*<<1sT&!t1L2496qPE@9l*vzn`7+++d8y*j_omPYT=C>q;A~CBj>vz&h6H zR-?E&+wAG2W*h+vGkDeyK8Hq2#lxNjIoNy;*1)h?$`%*|b0??GOPuwiI+{S7O*X2S z_E`Vpw{3Phh1+!cPHg`pvHRyr_J(=eFJ6B6<@1-~(zEL?uQ&YOVKj%OSO|Nl0|k$2 zoRQ;Ef1CED;L@4xE>-v3ra#rMns(>aEZ?0^6mYn735Qfd*xKW}Sm$jh`_sPxm>Tsg zJ#a**;TW64z`&C2>EaktaqI2fK)=TxA`TZTu5>5-U!5%e#XW6?hJ|8Vz`E>n zKQp#+$=p5|ZWgrv%S#rZZU)c%|CYz(=Kt6f+_a~Erk~FKxaY^dqMx>>H_f@8Uwgi``TfuE<;A5+@fQD9Z}&U!=JBh> zZwITNUA2Aw@%O8rtEbo7{VlPx{pTJgXF2`%@7Cv0`Y3l%E#L0U zxt~&cSJ{Lp1AxK|8``Cr|872K(m#`_zWVmI>8Ud-uGO4*E-8~aIdc7ztEK%Hi1H0k znE8NQ9?uv5-}8_2-%PpS@PEy0pXy)jzZS4E|82nI0u%m9p{TallY-=^O4 zP22k;{JO0Z-k?DiW~i>X=kWjiymR)K1pX{2p7~8`_SXYpq?xe8@Phs8H9xmJe(5gN zH2-_dv7TG!cbz0L!p}>;m|tr5oBQ$0WV4xN1%EuA8@)~a*}8Yly6P4}aSaz{_*Rg- zp#Iv-XO-;7`AdH7|MQt=+26o*~JA%-SarlwW~X4(cuRt5&I gw`{wCq9HdwB{QuOw}x3S`BK1Tl&hc1I;Vst0G Date: Tue, 25 Aug 2009 14:05:04 +0000 Subject: [PATCH 04/16] Add jackpot screenshots to the manual. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22511 a1c6a512-1295-4272-9138-f99709370657 --- manual/plugins/images/ss-jackpot-112x64x1.png | Bin 0 -> 332 bytes manual/plugins/images/ss-jackpot-128x128x16.png | Bin 0 -> 5853 bytes manual/plugins/images/ss-jackpot-128x96x2.png | Bin 0 -> 372 bytes manual/plugins/images/ss-jackpot-132x80x16.png | Bin 0 -> 3660 bytes manual/plugins/images/ss-jackpot-138x110x2.png | Bin 0 -> 588 bytes manual/plugins/images/ss-jackpot-160x128x16.png | Bin 0 -> 7008 bytes manual/plugins/images/ss-jackpot-160x128x2.png | Bin 0 -> 613 bytes manual/plugins/images/ss-jackpot-176x132x16.png | Bin 0 -> 8407 bytes manual/plugins/images/ss-jackpot-176x220x16.png | Bin 0 -> 10518 bytes manual/plugins/images/ss-jackpot-220x176x16.png | Bin 0 -> 11714 bytes manual/plugins/images/ss-jackpot-240x320x16.png | Bin 0 -> 22075 bytes manual/plugins/images/ss-jackpot-320x240x16.png | Bin 0 -> 20999 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 manual/plugins/images/ss-jackpot-112x64x1.png create mode 100644 manual/plugins/images/ss-jackpot-128x128x16.png create mode 100644 manual/plugins/images/ss-jackpot-128x96x2.png create mode 100644 manual/plugins/images/ss-jackpot-132x80x16.png create mode 100644 manual/plugins/images/ss-jackpot-138x110x2.png create mode 100644 manual/plugins/images/ss-jackpot-160x128x16.png create mode 100644 manual/plugins/images/ss-jackpot-160x128x2.png create mode 100644 manual/plugins/images/ss-jackpot-176x132x16.png create mode 100644 manual/plugins/images/ss-jackpot-176x220x16.png create mode 100644 manual/plugins/images/ss-jackpot-220x176x16.png create mode 100644 manual/plugins/images/ss-jackpot-240x320x16.png create mode 100644 manual/plugins/images/ss-jackpot-320x240x16.png diff --git a/manual/plugins/images/ss-jackpot-112x64x1.png b/manual/plugins/images/ss-jackpot-112x64x1.png new file mode 100644 index 0000000000000000000000000000000000000000..d56748e89da15955cd7bd251e8a8c64e22757039 GIT binary patch literal 332 zcwXxa@N?(olHy`uVBq!ia0vp^1wib;$P6TZgd{EnQfvV}A+AkZegT=knnSpO6lZ}) zWHAE+-(e7DJf6QI1teHj;Fu26&+xAE|5+fT)YHW=MB{vN0t1uVJQg;U12vgUJu?f> zotQW^letHF)yt;`?i4c~Tw9dDGo#^wm0ZGnhUaZ_wiKjHaW^RA?)FK#IZ0z`#=1z(Uu^G{n%<%GAKh&`{gJ$jZRrCfh7d6b-rg aDVb@NxHYVZR@w^Gz~JfX=d#Wzp$PzTS8iJX literal 0 HcwPel00001 diff --git a/manual/plugins/images/ss-jackpot-128x128x16.png b/manual/plugins/images/ss-jackpot-128x128x16.png new file mode 100644 index 0000000000000000000000000000000000000000..25f1e24128d80a323612e7ddcb770bca8140512f GIT binary patch literal 5853 zcwTjuRa6vSw8n=910<9b1nCCp1_cD9mG17wAqE(vLqKYf4(S+a(V<~zkgky$5UHVK z1_mzwhx>3J?pkM`Z|(Tb!`UytI2|q3#}DWp004l;YH#1@-7EONAjZAF- zTVr1UfVB6&z!~tYu=}t0(M!?sf2RS0>q6N8z%v@PH;V5AmJZCdlNkp5!=`y3%#PL| zYWLyOgq0PPb!*nV>>3J0{fZr6!l?N>r1lQQ(@J%J+y?`m5x|1JNhB$zI z#6ox0o_O6MVqvkZ{-w~y_Bs7LeUmab_Sqwnkn6pMu#VfG=o3h*fPUDd}2x#UrGi-hQA~FU1@v+ZBo3j~MT;mq=d5_J= z$^*5(vPAHyP6yW}k*AO|5VwKkh0c+l9!2=>lu7^>4rx4oA)TX;#R?lRh(^Q#c`qeV4Y6;Ps@dwBCk~qiW4hrMTJf!M%TeECXVQ;xHUx~)i^jK+tt4`fR zi{quI%$~wq(`2CJ34C7M@za`(kJbF0}^_FC`)rA6B}JXS=JvtPyi^Q zAN*^L=?0tjFwgS>W%$=4xegaIAYiV<%)ZL(M1ecFDc>ehn9xb;F-*gvWMH;Vs-u`E zMk7zz(-10K5d**%UC)1*sk##cOteq)F#z}On z@1hh=Gcrt(C1W+5+~w60>^dLC7085D*_nD(KDHuew6x*xAL8~(D9^RPjOP&OeHk89 zJ~5UM?Cvd_a9S7o)kh{t^uVy4A^9^mJLiDec-1lRqX+fIQ0f`)IHjlL@e$rv4XxZP z1+Vec0LX3gJG&5bBclk7oG>Qq@RH_dgu|4dj4`c1yIQ($>^SuK^BeTdq#k2+x1Us# z|DI?&UOO%WUMxN7O_NU^Df3@mGrthYX#HbpMrc%ZgkYwIi5WV*pJ$p*f!2A*OY`}l z*1AhN5o@w%=|FH`-L1UtGS;Pv35h3T2|0co$le@y>Vq!BY`3WH&5ulZ_5)kOT51Py z2^MW4RUrv8?!Q26?hkpV0&964X`u?x{Vg76Q^)J_*|09I=kk&^ihbnr&Mb~ynZ@Pd zxf8ZznM~x;!prWl;#kDu?T%QIxs?kyaI)d7lUEutE5K7^ltLco#tqCEnYwG(H#6w0 zvA=(8IiTg!L{Y~Q*ihqLn|tl+g0XqzF(%q|j0j5JHkUN|@eet{b^K@Pi^4r%tvz}T zhvvIN!u#|uMlT)ooV|x;X<}En7mnWaFJsK|o{DA`FW6?}=+afV8@`s>aP_}fHmN)% zi#7T^u&j~1%}ephI|Hg@>b}6Rwwjq0%|(P~3zyP4d&=O=nh;u2C-!j>DfxrXV)+@= zeMFvra~Dc0;B)l^DQ(K+xzqSmt*lR(W~XF~=&+%CwJHb{^6PX~bW62aZ!EHUHi-6@ zpbuxRj8MQvc;!GuOnzAlbKBP;q^03RMa53Sx@m3g_?)Wg?2h0|jx6G;{W$0(9$c46 zmcOHtQD2L0NuSB`q>0JltM>-_8%S(w?$A+}3T|v{d|r5^4Lxe8bG6_;^AcxlO*pR( z={>ONIpE%;A+mFunhpg$we7S%ls=~ke7gJGOMO7gg?Es*yZbs_&Oc|EdU7>d_Tk>4 zTS!yCS4TWga%sNmsgWg2v$NXGAz4Zs-Z))$!AqHp?d6e6!S-2v->jcGbzRF&!#g4C?=1<&!{>rk!xMtg3Va0|K3Lu zw@GRA%_~1=Wa{@z56#P7LeA-kGl^jfF|Pp2*&%^-Gw7TT`~$-7C_~xPs)<1ws8QU~ zY|_$!VxwlGIe{n3^9!d_({{_kJ?|aE&0QlKOj{$mn_cAF>dLMAG3!})9KTHf5aH8iX?910 z@*gP?Cu~PGM{YmKf1I$b93U3Ctuv%umb}ygJImM^YK%6VoGb*h$k3Z;NSN+KHR=p4 zpH41{h0IiKP0eR>)H66(DAVA=Lzs7Gj^spE8zaka(dnj#0R36en40C@ZJ*Egt5*P9 z4!ru-w9V>QGHI=<2T2sLEolJyF(g~Q8v7}LT!{u8%z+1cg}=hH8HuSdA5lD~H+(4`8?bnR(;?p8%nz-F_)Tr76SvD|_{@ob!}@002vyN2n?m?1nQ?z+`Lg`CXm zD@_O<0cm(gJUbHEC|amKPLr7{A!XxlFEoWM!%#w-KloU^plIA};EwHXl~T`LXib0G zIi|kjy)Qd9!6`n&Awc1I>c4#ob3?; zdwS0DqKhVC>T;p+O3gB(K<_#8-Mg~1(3#E?RK}T2&?OMaF~JUaGH@JxcVp3z$tj5k z*c_}8*$X!1_>yGJ&U^Ec#X0@AL{h8V5*_L>SE*X|8xigT1GOj)zl*;{89YKcB&M4; z_;=bZQZWO!U*B=CTBjC+)f&ie41B z+k&JG;SWnHW{9TSmsn!=pbflfp`=|HM3r1MwAute!?JwwtRHjDvvG+`zS%3 zLq9Ns?7^$M>^&S#Qtsmqyl?BLKIErHG)dqRJlOIjjc0*`I(G4Ztm=?fD`o`JZKvRt zAtTkI#Kxi4{sRGzRrJQVQ+oInk+P=%4xn$KI@Ev^6uvogbebV}3x8E=o zvrmOK3)JLrNU2^}6wx2Lzxl%%Uwo@#`KE|VL2isKpYs&(Y0ggsy%TTLzBMQx(fuNX zCrS{XSfJMOXH#h9sNgmLpIupKSY>L$i4l+l%mZM1n_w(+{LS)YoY>xVR2U*^dzKnG zT;qe=-`f9Y_0QO;SrEk--tVQ)CtFxbz=ceNf8)SfTFlvuwC zx}_Jh@3Q_OkHB~(e01(ku$UPMVDE5Y96YRwUj<--@eKk^{cKimIak?PbdFe(hHKK? za_e(R(5wZqS&^VQ>g_}@2pC751zAPR1pxl#9e!O^0cOx3dysNxe;2!!!GLN1M<}xjufWN4QH14;;~Dya0SF?D9pFCb%}C5 zG=FW^Ci~b8j0|TG>6DnT)-qQ8gWQSL~@J6A#bqwpHhfjXiVwsLe%S z1)u^yW_)x=hI)NY@b~~LFdu9^2Yr)6qd)!y@jF5z0r6e6JAygJBu5jApeOrzTS1N8 z>@6@e>0}+pIZ)9RFHRpfU~sJ0V3{BEGTz-e3zC&6ZR51~+$z6h18^HwLFxtxWyJK& zqBe-g2+1xP9}Lkdk&qDMm4zU_;yeMsX-Rk^65<55h@nS}S5cdq=kpt5CI+DG@6%X| zrVGpim`bWR1!*oW!)D+GC%wZp(Vg#;{D&{;gx09Qcsk(RMn_BeWhPWYiYOoefdgBg zUI#v6g2H#AM2tTdTd=?@_MPEA&y+X5pE%boPLofl_^?G5c>=G8sk^U^_+>TSk0w|92m!VQBHpjRIp4*E zc!RE-0>ZpHRUA1?KBvoSnP1~zK!!6+JITPsmLGll&abPdES6UP#k|QgJYivF{#-HY zG=9pkX@(!45_w52zt^ndM!#5c3w;5L^Nhy>v{o`v+K-qP6SEk(&%F^Ut%;|y& z?K;so&EZ2qe=xMNiP}TpBH#WP&&dP4291+eyto>{c6GU3vC6i()%ta0GbnF?3K&b% zBNhKu%{G0gaG20B9h{r!d#h+Kr)Ppwz-eH#^mPTydUs)O21Q9~xYC}Qe~1%FAkcty zyPEyIWH6DIVo$t{{AI4!Ye@$Icf7osvtP3x}5b(;n}*#-bOGCUus(-?xa;Y7<@(dW)B( zmr+lj*>GP6MC%QcNdmf|-#&HXQ;UyrM2 zc8SmK^w_p_pT0&VSoVd+Fe<5?VDU+0XBX}GWywOxub&4QjrSZz9q$Ptd5tyaIyy6N{HH?Nf1O~|-}W{; z@qu2#z6Y(3b%yvN^FE7Di|@FmdtV%gudbk5rEgLouhuK**W04eot9&(vA5c$FS}1L zCH^NTJ*I9?t?#)(O_I1L<1^0=nu=Hlx8`Qx*`lJbcIY7#ctS4veOOmr6uM_O&wZdF9Yc&|eTiJ!n18;={;4SR216l|`h zQs1m;OERQ_q@McX-Z~DR?p$>a1oyVfgU~VSCCoVew$GPpF9vX_N}eS5W+OiQ6ci0| zpiVhmrsNMc!|d^$9YP$#YJ;30@IN$8=d5F3AvilSu9^?m#Q~c8c*D`Xpu^Z9)hJnf zWr`&fh?pZXFMl0@HD$~%Eu#GWYkvsMsyWSBY%Sh0{_LT_W?;VTP{Y92vNjmr(K#_; z-mv+Jo#;;Iw05657-5@1-8IrK!C7kEYBHbujw7PmN;v~r$|5d5GH$v781v+4SGlhnAW_B!EPC$+9Kl z8PVi54*XZQ`_LE7>^J@T37}|0mREBht@(qKdXU?HIkn!bO#U0HFhkDTn7t)Kx}CYb zw|5$A%43e48E~=4&z)ZjvC(%Q6j}`_xsGUNqJk0Maf2?-Xs=&YC+L$01Y-}Hood&V zLsR6@P!3$*Xgo_Tiyj_c;4#~}=sG*594%szfb@8T^UYcPSCj9;dM@RQn-qPez%FJ0 z-S6{G(@vN-x@R|P<2wMndUt(TT@%Y)Y^SH+mXKLm&c#=4=@B@SFx5JBrewl49JkGM zOr#Jl^lb8N9ZT{6GNv~Mt;p}6yWW)-NTRu=x+VK#gS#UriJQ9lj{c^WP;M~a zA=mrjQ{1tP95r5ehA%$2Z+nBQzz2SL=Nop|y|U8V?$N3-p?kq$0RL1a-Ssn61ZYqi zc)*~IaPYp)8J3Lo>-$b0-)ckS*xxitYo91I4h}bpSL0{Z6{kay#gIi8qhx~Nd6^#~ zzjVQq#Zn)}1!R+vypzBqG|se7ZUklPE0u7nho!TtMOoKi7+qtE`|*urF8|JM>yjor znnS|CU4MykmNbA*QyW3)(^)Ei9(2)+H1J+?j~H9PKb-x$p zB${CJHVbpww=K0B*3oR<=6;>~u8dOh!DGh9;BbvF)rkY$PWl`3^a({VaJL`wcKYmkzm=10WHb?&Bhj9 zs)T&n&Kns&l|T1Du$ZoSLc(^x?CMzO41uyt3Dm#TUxJ$FSLvF^BMk$c_t+ZLZgFQL zAHs8R9@L}}T;0Aavv^h!{N;xY>Qpy`VYS?Y{(WcYnr$4OHkW3QTK9u`rZgj3QfFfP zd&+1t@nT&M{7M0ZxL3mn4y#-TnHa}$}KRatbdnsEV`+ETh3kpi|2}(_yACm`+&#dx^t(r>xly-nUB`X13oqazwPA!^d-pHsa z&zjbAM~>~MK`h6SrCiUBW-~g)d8te+=6AW)aOf6u(o5e$AG^Prrwv`+sfR`@*>8fyKG`Ga0w&O13(Fp56*{qH2k2 zL`h0wNvc(HQ7VvPFfuT()HSfsH8Kq`G_^7{vNAT-HZZa>FyQcvNkGw%o1c=IR*73f TrO1;zKn)C@u6{1-oD!Mu=6sZC#O$Z4h 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 literal 0 HcwPel00001 diff --git a/manual/plugins/images/ss-jackpot-138x110x2.png b/manual/plugins/images/ss-jackpot-138x110x2.png new file mode 100644 index 0000000000000000000000000000000000000000..31d2ca14dafd2b149c62053e59783d257891774d GIT binary patch literal 588 zcwXxa@N?(olHy`uVBq!ia0vp^T|k`2#0(@`ZIY9L6i7VR#>@xqnN=-xmqkBGITCcsy=jamC z$HmK%jJi91-m?%c*!SefN{*tZZ}yyHfBOCMf%LPpuAb7;pQNe%^sDoQfAO=n*Pjb% zHox9#c;%gm#{LkK?ZHdWrG>e1%>2q^Jh4~O`q#Zozvbn-B9h&f`<*{;A?$mY=kJE9 zCtLg$UFw*xc=`0t@Y1$#gRsZZcaW!F% zZJJM^KBuOgjq@>|IKf9Jnj4BcT^2cAeNpjE_hFo(<%;QikKgdzI4vUGJLjpGk<%K1 zq&$^3OCSHt|Lj?E?jiF!;X|JvpHQCn*YKXA^}Dx%Q&(1ba_oGh>NfA~i(LNMcWv$} zwyfjr@LA=rYx42SgIQ`Ez&KDXag8WRNi0dVN-jzTQVd2029~-87P>~JA%><_rY2T~ pmf8kJRt5%-nMy=ZH00)|WTsW()-Wml%nG0e22WQ%mvv4FO#q=u@gD#H literal 0 HcwPel00001 diff --git a/manual/plugins/images/ss-jackpot-160x128x16.png b/manual/plugins/images/ss-jackpot-160x128x16.png new file mode 100644 index 0000000000000000000000000000000000000000..fb8f2cd77f7097e3f857c3ec0920fb7e81dbbb19 GIT binary patch literal 7008 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 literal 0 HcwPel00001 diff --git a/manual/plugins/images/ss-jackpot-160x128x2.png b/manual/plugins/images/ss-jackpot-160x128x2.png new file mode 100644 index 0000000000000000000000000000000000000000..26ddbbe5e8a275bb7e927b38987c73364b1a0c61 GIT binary patch literal 613 zcwXxa@N?(olHy`uVBq!ia0vp^3xK$Ri5WzuQb$3>agGgIH z4;vG6nDh-hSFeL*2UT6Oy5}~;auv^0?%&XuW0-H8AbnyrM<%QBBE4M|KNa;DAFpq< zxWDt9jOwmMHRqoQ%=q0X5q-{S=Gz)&SBJ$3T4$&G)H)xU&tjh{IAx!!73VA=o+UF_ zg8MyK{;^1S?VPNl$-nvKw-cNC12!-8TOYMG>#BWd$KQT2)~-XRrue&t&Hfs#$GPU- z?c3VCTAPm*?NqqhzKCt#dLFlLO$VBpn@+hpUS)Dkd~=sS?}{9AtgCT#OYt93kLQ6K zB8<6eEx$F*ZR>BGt2>9a#d-Vcb!~rbxTdCVzOk-KBb`JOM`5!E84p|-w)z3>`aA66bp2V+?vpkzG1@zr|$l~?! zYvg>T6UtWCG8`hNMqA?kelyZM=ie`SyT-CD;Wd&T9*^!8LYVC1NlxJHzuB$lLF zB^RXvDF!1014~^43tc1A5JOWdQ&TGgGi?JSD+2>FrTkbF4Y~O#nQ4`{HMrMbe+bmT N;OXk;vd$@?2>{O_?vVfh literal 0 HcwPel00001 diff --git a/manual/plugins/images/ss-jackpot-176x132x16.png b/manual/plugins/images/ss-jackpot-176x132x16.png new file mode 100644 index 0000000000000000000000000000000000000000..884929940c584100122145113aaab0bf3bdd8a2e GIT binary patch literal 8407 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 btCu_Y{|)#RBXRE-z-Iiw{Qi%7FW&qgelnEV literal 0 HcwPel00001 diff --git a/manual/plugins/images/ss-jackpot-240x320x16.png b/manual/plugins/images/ss-jackpot-240x320x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c28c3ba73edf727147c9ad0f679736349e70594d GIT binary patch literal 22075 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 gpM*&G^{|`B|9?V?_i_@% literal 0 HcwPel00001 diff --git a/manual/plugins/images/ss-jackpot-320x240x16.png b/manual/plugins/images/ss-jackpot-320x240x16.png new file mode 100644 index 0000000000000000000000000000000000000000..0f40ed4ae70165c3338a21b6cfa2f5d7dca1dc64 GIT binary patch literal 20999 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

o0d&+Lf(X%?-H;?OtG&)w%K6W;x4q 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 TXIvyVP;jule7@%F^#}h0L9zCg literal 0 HcwPel00001 -- 2.11.4.GIT From 46977a21d58fdca966693d266b3d7d9e09ff6cfa Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 25 Aug 2009 15:08:47 +0000 Subject: [PATCH 05/16] Add button mapping for jackpot to the manual. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22512 a1c6a512-1295-4272-9138-f99709370657 --- manual/plugins/jackpot.tex | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/manual/plugins/jackpot.tex b/manual/plugins/jackpot.tex index 6e2e3c78e..6e3f3f2a7 100644 --- a/manual/plugins/jackpot.tex +++ b/manual/plugins/jackpot.tex @@ -4,19 +4,32 @@ This is a jackpot slot machine game. At the beginning of the game you have 20\$. Payouts are given when three matching symbols come up. -% fill out for every other target... \begin{table} \begin{btnmap}{}{} - \opt{PLAYER_PAD}{\ButtonPlay} - \opt{HAVEREMOTEKEYMAP}{& + \opt{PLAYER_PAD,RECORDER_PAD}{\ButtonPlay} + \opt{IRIVER_H100_PAD,IAUDIO_X5_PAD,GIGABEAT_PAD,GIGABEAT_S_PAD,% + MROBE100_PAD,SANSA_CLIP_PAD,M200,IPOD_3G_PAD,IPOD_4G_PAD,% + SANSA_C200_PAD,SANSA_E200_PAD,SANSA_FUZE_PAD}{\ButtonSelect} + \opt{ONDIO_PAD}{\ButtonUp} + \opt{IRIVER_H10_PAD}{\ButtonRew} + \opt{IAUDIO_M3_PAD}{} + \opt{HAVEREMOTEKEYMAP}{& \opt{IRIVER_RC_H100_PAD}{\ButtonRCSelect} + \opt{IAUDIO_RC_PAD}{\ButtonRCMode} } & Play \\ \opt{PLAYER_PAD}{\ButtonStop} - \opt{HAVEREMOTEKEYMAP}{& + \opt{IRIVER_H100_PAD,RECORDER_PAD,ONDIO_PAD}{\ButtonOff} + \opt{IPOD_3G_PAD,IPOD_4G_PAD}{\ButtonMenu} + \opt{IAUDIO_X5_PAD,GIGABEAT_PAD,SANSA_E200_PAD,SANSA_C200_PAD,% + SANSA_CLIP_PAD,IRIVER_H10_PAD,MROBE100_PAD}{\ButtonPower} + \opt{GIGABEAT_S_PAD}{\ButtonBack} + \opt{SANSA_FUZE_PAD}{\ButtonHome} + \opt{IAUDIO_M3_PAD}{} + \opt{HAVEREMOTEKEYMAP}{& \opt{IRIVER_RC_H100_PAD}{\ButtonRCStop} + \opt{IAUDIO_RC_PAD}{\ButtonRCRec} } & Exit the game \\ \end{btnmap} \end{table} - -- 2.11.4.GIT From 71dfaef71b8732d613a2a4b49e66a3a82a73e56e Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 25 Aug 2009 21:51:55 +0000 Subject: [PATCH 06/16] Add gigabeat F/S volume limits to the manual, and a few minor formatting changes. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22513 a1c6a512-1295-4272-9138-f99709370657 --- manual/advanced_topics/main.tex | 12 ++++++----- manual/configure_rockbox/playback_options.tex | 20 ++++++++++-------- manual/configure_rockbox/sound_settings.tex | 25 +++++++++++------------ manual/plugins/goban.tex | 15 ++++++-------- manual/plugins/main.tex | 2 +- manual/plugins/pngviewer.tex | 4 ++-- manual/plugins/ppmviewer.tex | 13 +++++------- manual/rockbox_interface/browsing_and_playing.tex | 4 ++-- manual/working_with_playlists/main.tex | 10 ++++----- 9 files changed, 52 insertions(+), 53 deletions(-) diff --git a/manual/advanced_topics/main.tex b/manual/advanced_topics/main.tex index f6ba4ae52..f95692267 100644 --- a/manual/advanced_topics/main.tex +++ b/manual/advanced_topics/main.tex @@ -16,7 +16,8 @@ in the font package at \url{http://www.rockbox.org/daily.shtml}.} \fname{/.rockbox/fonts} directory and the filename must be at most 24 characters long. You can browse the fonts in \fname{/.rockbox/fonts} under \setting{Settings $\rightarrow$ Theme Settings $\rightarrow$ Font} - in the \setting{Main Menu}. + in the \setting{Main Menu}.\\ + \note{Advanced Users Only: Any BDF font file up to 16 pixels high should be usable with Rockbox. To convert from \fname{.bdf} to \fname{.fnt}, use the \fname{convbdf} tool. This tool can be found in the \fname{tools} @@ -28,11 +29,11 @@ in the font package at \url{http://www.rockbox.org/daily.shtml}.} Rockbox can load language files at runtime. Simply copy the \fname{.lng} file \emph{(do not use the .lang file)} to the \dap\ and ``play'' it in the Rockbox directory browser or select \setting{Settings $\rightarrow$ -General Settings $\rightarrow$ Language }from the \setting{Main Menu}. +General Settings $\rightarrow$ Language }from the \setting{Main Menu}.\\ \note{If you want a language to be loaded automatically every time you start up, it must be located in the \fname{/.rockbox/langs} directory and the filename -must be a maximum of 24 characters long.} +must be a maximum of 24 characters long.\\} If your language is not yet supported and you want to write your own language file find the instructions on the Rockbox website: @@ -220,7 +221,7 @@ plan). If you use the upper-case versions of the three tags: \config{F}, \config{I} and \config{D}, they will instead refer to the next song instead of the current one. Example: \config{\%Ig} is the genre -name used in the next song and \config{\%Ff} is the mp3 frequency. +name used in the next song and \config{\%Ff} is the mp3 frequency.\\ \note{The next song information \emph{will not} be available at all times, but will most likely be available at the end of a song. We @@ -396,7 +397,7 @@ Example of a configuration file: settings. Create a few different files with different settings, give each file a different name (such as \fname{car.cfg}, \fname{headphones.cfg}, etc.), and you can then use the \setting{Browse .cfg - files} option to quickly change settings.} + files} option to quickly change settings.\\} A special case configuration file can be used to force a particular setting or settings every time Rockbox starts up (e.g. to set the volume to a safe @@ -482,6 +483,7 @@ You just ``play'' a file with the extension % \opt{iaudio}{\fname{.iaudio}.} % \opt{sansa,h10,h10_5gb}{\fname{.mi4}.} % \opt{sansaAMS}{\fname{.sansa}.} % +\opt{gigabeatf,gigabeats}{\fname{.gigabeat}.} % This can be used to test new firmware versions without deleting your current version. diff --git a/manual/configure_rockbox/playback_options.tex b/manual/configure_rockbox/playback_options.tex index fef0af2c4..e34fc8734 100644 --- a/manual/configure_rockbox/playback_options.tex +++ b/manual/configure_rockbox/playback_options.tex @@ -71,12 +71,12 @@ you to configure settings related to audio playback. \opt{masd,masf}{ The anti-skip buffer can be set to a value between 0 and 7 - seconds. + seconds.\\ } \opt{swcodec}{ The anti-skip buffer can be set to various values between - 5 seconds and 10 minutes. + 5 seconds and 10 minutes.\\ } \note{Having a large anti-skip buffer tends to use more power, and may @@ -139,7 +139,7 @@ you to configure settings related to audio playback. \note{The rules above apply except in the instance where \setting{Fade Out Delay} plus \setting{Fade Out Duration} is less then \setting{Fade In Delay} (which would create a gap in the audio). In this case, - the \setting{Fade In Delay} is reduced to eliminate the gap.} + the \setting{Fade In Delay} is reduced to eliminate the gap.\\} The graphic below illustrates how the different settings work in practice. @@ -152,8 +152,9 @@ you to configure settings related to audio playback. same apparent volume. This prevents sudden changes in volume when changing between songs recorded at different volume levels. For replaygain to work, the songs must have been processed by a program - that adds replaygain information to the ID3 tags (or Vorbis tags). - \note{APEv2 tags are not currently supported.} + that adds replaygain information to the ID3 tags (or Vorbis tags).\\ + + \note{APEv2 tags are not currently supported.\\} Options for replaygain are: \begin{description} @@ -208,9 +209,11 @@ you to configure settings related to audio playback. \setting{Auto-Change Directory} is set to \setting{No}, playback will stop at the end of the current playlist. Using the \setting{Random} feature requires you to first generate a folder list via the Random Folder Advance Configuration - plugin (see \reference{ref:random_folder_advance_config}). + plugin (see \reference{ref:random_folder_advance_config}).\\ + \note{You must have the \setting{Repeat} option set to \setting{No} for - \setting{Auto-Change Directory} to function properly.} + \setting{Auto-Change Directory} to function properly.\\} + \note{This feature only works when songs have been played from the file browser. Using it with the database may cause unexpected behavior.} @@ -249,7 +252,8 @@ you to configure settings related to audio playback. start the logging. The log-file is called \opt{rtc}{\fname{.scrobbler.log},}% \nopt{rtc}{\fname{.scrobbler-timeless.log},}% - and is to be found in the root directory of your \dap{}. + and is to be found in the root directory of your \dap{}.\\ + \note{See \wikilink{LastFMLog} for a further description, and for tools you can use to submit your Last.fm log.} diff --git a/manual/configure_rockbox/sound_settings.tex b/manual/configure_rockbox/sound_settings.tex index e8e4f8aee..6a7d42311 100644 --- a/manual/configure_rockbox/sound_settings.tex +++ b/manual/configure_rockbox/sound_settings.tex @@ -11,7 +11,7 @@ change to customise your listening experience. can produce without possible distortion (clipping). All values lower than this reference will be negative and yield a progressively softer volume. \opt{player,recorder,recorderv2fm,ondio,x5,m5,ipodnano,ipodvideo, - ipodcolor,ipod1g2g,h10,h10_5gb,sansa,sansaAMS}{ + ipodcolor,ipod1g2g,h10,h10_5gb,sansa,sansaAMS,gigabeats,gigabeatf}{ Values higher than 0 dB are available and can be used to raise the volume more than would otherwise be possible. These volume levels will ordinarily lead to distorted sound, but might work nicely for music that has @@ -25,6 +25,8 @@ change to customise your listening experience. \opt{ipodvideo}{minimum of -57 dB to a maximum of +6 dB.}% \opt{ipodcolor,ipod1g2g,h10,h10_5gb,sansa,sansaAMS}{minimum of -74 dB to a maximum of +6 db.}% + \opt{gigabeats}{minimum of -90 dB to a maximum of +6 dB.}% + \opt{gigabeatf}{minimum of -74 dB to a maximum of +6 dB.}% \section{Bass} This setting emphasises @@ -211,7 +213,7 @@ change to customise your listening experience. headphones more similar to listening to music with stereo speakers. When you listen to music through speakers, each ear will hear sound originating from both speakers. However, the sound from the left speaker reaches your right - ear slightly later than it does your left ear, and vice versa. + ear slightly later than it does your left ear, and vice versa.\\ The human ear and brain together are very good at interpreting the time differences between direct sounds and reflected sounds and using that @@ -220,7 +222,7 @@ change to customise your listening experience. channel corresponding to it. The left ear hears only the left channel and the right ear hears only the right channel. The result is that sound from headphones does not provide the same spatial cues to your ear and brain as - speakers, and might for that reason sound unnatural to some listeners. + speakers, and might for that reason sound unnatural to some listeners.\\ The crossfeed function uses an algorithm to feed a delayed and filtered portion of the signal from the right channel into the left channel and vice @@ -229,7 +231,7 @@ change to customise your listening experience. result is a more natural stereo image that can be especially appreciated in older rock and jazz records, where one instrument is often hard-panned to just one of the speakers. Many people will find such records tiring to listen - to using earphones and no crossfeed effect. + to using earphones and no crossfeed effect.\\ Crossfeed has the following settings: \begin{description} @@ -256,7 +258,6 @@ change to customise your listening experience. virtual speaker placement suited to ones preference. % TODO: adapt the guidelines for crossfeed settings found here? % http://www.ohl.to/interests-in-audio/crossfeed-and-eq-for-headphones/ - Beware that the crossfeed function is capable of making the audio distort if you choose settings which result in a too high output level. } @@ -268,7 +269,7 @@ change to customise your listening experience. parametric EQ lets you control several different parameters for each band of the EQ. In some ways the EQ is similar to the \setting{Bass} and \setting{Treble} settings described earlier, but the EQ allows you to - control the sound much more carefully. + control the sound much more carefully.\\ Rockbox's parametric EQ is composed of five different bands: \begin{description} @@ -436,10 +437,8 @@ source, and a third order noise shaper. \opt{swcodec}{ \section{Timestretch} -Enabling \setting{Timestretch} allows you to change the playback speed without it -affecting the pitch of the recording. - -After enabling this feature and rebooting, you can access this via the \setting{Pitch Screen}. -This function is intended for speech playback and may significantly dilute your listening -experience with more complex audio. -} +Enabling \setting{Timestretch} allows you to change the playback speed without +it affecting the pitch of the recording. After enabling this feature and +rebooting, you can access this via the \setting{Pitch Screen}. This function is +intended for speech playback and may significantly dilute your listening +experience with more complex audio.} diff --git a/manual/plugins/goban.tex b/manual/plugins/goban.tex index 815eec559..385ee28ac 100644 --- a/manual/plugins/goban.tex +++ b/manual/plugins/goban.tex @@ -2,13 +2,10 @@ \screenshot{plugins/images/ss-goban}{Goban}{The Rockbox Goban plugin} Goban is a a plugin for playing, viewing and recording games of Go (also known as Weiqi, Baduk, Igo and Goe). It uses standard Smart Game Format (SGF) files -for saving and loading games. - -You can find a short introduction to Go at +for saving and loading games. You can find a short introduction to Go at \url{http://senseis.xmp.net/?WhatIsGo} and more information about SGF files can be read at \url{http://senseis.xmp.net/?SmartGameFormat} or the SGF -specification at -\url{http://www.red-bean.com/sgf/}. +specification at \url{http://www.red-bean.com/sgf/}.\\ This plugin can load all modern SGF files (file format 3 or 4) with few problems. It attempts to preserve SGF properties which it doesn't understand, and most common @@ -17,18 +14,18 @@ Kogo's Joseki Dictionary (\url{http://waterfire.us/joseki.htm}) with this plugin although the load and save times can be on the order of a minute or two on particularly slow devices. Large SGF files may stop audio playback for the duration of the plugin's run in order to free up more memory and some very large SGF files will -not even load on devices with little available memory. +not even load on devices with little available memory.\\ -\emph{Note: } The plugin does \emph{NOT} support SGF files with multiple games in +\note{The plugin does \emph{NOT} support SGF files with multiple games in one file. These are rare, but if you have one don't even try it (the file will most -likely be corrupted if you save over it). You have been warned. +likely be corrupted if you save over it). You have been warned.\\} The file \fname {"/sgf/gbn\_def.sgf"} is used by the plugin to store any unsaved changes in the most recently loaded game. This means that if you forget to save your changes, you should load \fname {"/sgf/gbn\_def.sgf"} immediately to offload the changes to another file. If you load another file first then your changes will be lost permanently. The \fname {"/sgf/gbn\_def.sgf"} file is also the file loaded if another -is not selected. +is not selected.\\ The information panel which displays the current move number may also contain these markers: \\ diff --git a/manual/plugins/main.tex b/manual/plugins/main.tex index 1a57fc96e..a73759805 100644 --- a/manual/plugins/main.tex +++ b/manual/plugins/main.tex @@ -6,7 +6,7 @@ This means you cannot switch back and forth between a plugin and Rockbox. When a plugin is loaded, you need to exit it to return to the Rockbox interface. Most plugins will not interfere with music playback but some of them will stop playback while running. Plugins have the file extension \fname{.rock}. Most of -them can be started from \setting{Browse Plugins} in the \setting{Main Menu}. +them can be started from \setting{Browse Plugins} in the \setting{Main Menu}.\\ Viewer plugins get started automatically by opening an associated file (i.e. text files% diff --git a/manual/plugins/pngviewer.tex b/manual/plugins/pngviewer.tex index c205ac066..40e91977d 100644 --- a/manual/plugins/pngviewer.tex +++ b/manual/plugins/pngviewer.tex @@ -1,10 +1,10 @@ % $Id: $id$ % \subsection{PNG viewer} -Open a PNG file in the \setting{File Browser} to view it% +Open a PNG file in the \setting{File Browser} to view it.\\% \opt{swcodec}{ \note{When an audio file is playing the size of the image is limited as the decoding process needs to share memory with audio tracks. To be able to - view a bigger file you may need to stop playback.} + view a bigger file you may need to stop playback.\\} } \nopt{large_plugin_buffer}{% \note{This plugin will cause playback to stop.}% diff --git a/manual/plugins/ppmviewer.tex b/manual/plugins/ppmviewer.tex index 7de2b8ca0..7594fafe6 100644 --- a/manual/plugins/ppmviewer.tex +++ b/manual/plugins/ppmviewer.tex @@ -1,11 +1,8 @@ % $Id$ % \subsection{PPM viewer} -Open a PPM file in the \setting{File Browser} to view it. +Open a PPM file in the \setting{File Browser} to view it. PPM viewer exits +when any button is pressed.\\ -ppmviewer exits when any button is pressed. - -\note{ -Both ASCII PPM (P3) and raw PPM (P6) files are supported. - -For more information about PPM files, see \url{http://netpbm.sourceforge.net/doc/ppm.html} -} +\note{Both ASCII PPM (P3) and raw PPM (P6) files are supported. +For more information about PPM files, see +\url{http://netpbm.sourceforge.net/doc/ppm.html}} diff --git a/manual/rockbox_interface/browsing_and_playing.tex b/manual/rockbox_interface/browsing_and_playing.tex index f6054524b..bdbb97ef5 100644 --- a/manual/rockbox_interface/browsing_and_playing.tex +++ b/manual/rockbox_interface/browsing_and_playing.tex @@ -121,12 +121,12 @@ the \setting{Show Files} setting to all. The \setting{Context Menu} allows you to perform certain operations on files or directories. To access the \setting{Context Menu}, position the selector over a file -or directory and access the context menu with \ActionStdContext{}. +or directory and access the context menu with \ActionStdContext{}.\\ \note{The \setting{Context Menu} is a context sensitive menu. If the \setting{Context Menu} is invoked on a file, it will display options available for files. If the \setting{Context Menu} is invoked on a directory, -it will display options for directories.} +it will display options for directories.\\} The \setting{Context Menu} contains the following options (unless otherwise noted, each option pertains both to files and directories): diff --git a/manual/working_with_playlists/main.tex b/manual/working_with_playlists/main.tex index bdc82c02c..96781e032 100644 --- a/manual/working_with_playlists/main.tex +++ b/manual/working_with_playlists/main.tex @@ -40,7 +40,7 @@ Rockbox can create playlists in four different ways. Whenever a song is selected from the \setting{File Browser} with \ActionTreeEnter, Rockbox will automatically create a playlist containing all of the songs in that directory and start playback with the selected -song. +song.\\ \note{If you already have created a dynamic playlist, playing a new song will \emph{erase} the current dynamic playlist and create a new one. @@ -60,7 +60,7 @@ that are not currently playing. To do this select \setting{Playlist catalog} in the \setting{Context Menu}. There you will have two choices, \setting{Add to playlist} adds the selected track or directory to an existing playlist and \setting{Add to a new playlist} creates a new playlist containing -the selected track or directory. +the selected track or directory.\\ \note{All playlists in the \setting{Playlist catalog} are stored by default in the \fname{/Playlists} directory in the root of your \daps{} disk and @@ -121,17 +121,17 @@ entire directories to a playlist. If the \setting{Playlist Submenu} is invoked on a single track, it will put only that track into the playlist. On the other hand, if the \setting{Playlist Submenu} is invoked on a directory, Rockbox adds all of the tracks in that directory to the -playlist. +playlist.\\ \note{You can control whether or not Rockbox includes the contents of subdirectories when adding an entire directory to a playlists. Set the \setting{Settings $\rightarrow$ General Settings $\rightarrow$ Playlist $\rightarrow$ Recursively Insert Directories} setting to \setting{Yes} if you would like Rockbox to include tracks in subdirectories as well as tracks - in the currently-selected directory.} + in the currently-selected directory.\\} Dynamic playlists are saved so resume will restore them exactly as they -were before shutdown. +were before shutdown.\\ \note{To view, save or reshuffle the current dynamic playlist use the \setting{Playlist} sub menu in the WPS context menu or in the -- 2.11.4.GIT From 0a41e3ebe115c4b4f81bca5c6d07c901f44ae397 Mon Sep 17 00:00:00 2001 From: kugel Date: Wed, 26 Aug 2009 00:06:27 +0000 Subject: [PATCH 07/16] Fix skin engine calling wps code to draw the statusbars (add a pointer to viewportmanager-suitable statusbar values, which are the same for all screens), and re-arrange statusbar related code slightly. No functional change. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22514 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/skin_engine/skin_display.c | 31 +++++++++++++++++- apps/gui/skin_engine/skin_engine.h | 3 ++ apps/gui/skin_engine/wps_internals.h | 10 +++--- apps/gui/wps.c | 63 +++++++++++++----------------------- 4 files changed, 61 insertions(+), 46 deletions(-) diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index 85cc65d41..e674c9bec 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c @@ -129,6 +129,35 @@ bool skin_update(struct gui_wps *gwps, unsigned int update_type) return retval; } +void skin_statusbar_changed(struct gui_wps *skin) +{ + if (!skin) + return; + struct wps_data *data = skin->data; + const struct screen *display = skin->display; + + struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, data)->vp; + viewport_set_fullscreen(vp, display->screen_type); + + if (data->wps_sb_tag) + { /* fix up the default viewport */ + if (data->show_sb_on_wps) + { + bool bar_at_top = + statusbar_position(display->screen_type) != STATUSBAR_BOTTOM; + + vp->y = bar_at_top?STATUSBAR_HEIGHT:0; + vp->height = display->lcdheight - STATUSBAR_HEIGHT; + } + else + { + vp->y = 0; + vp->height = display->lcdheight; + } + } + + +} #ifdef HAVE_LCD_BITMAP @@ -1141,7 +1170,7 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode) if (refresh_mode & WPS_REFRESH_STATUSBAR) { - gwps_draw_statusbars(); + viewportmanager_set_statusbar(*gwps->statusbars); } /* Restore the default viewport */ display->set_viewport(NULL); diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h index 3ec7b93a9..c52f720d0 100644 --- a/apps/gui/skin_engine/skin_engine.h +++ b/apps/gui/skin_engine/skin_engine.h @@ -51,4 +51,7 @@ bool skin_data_load(struct wps_data *wps_data, /* initial setup of wps_data */ void skin_data_init(struct wps_data *wps_data); + +/* call this in statusbar toggle handlers if needed */ +void skin_statusbar_changed(struct gui_wps*); #endif diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h index 20a9dde9f..fbd18b9f7 100644 --- a/apps/gui/skin_engine/wps_internals.h +++ b/apps/gui/skin_engine/wps_internals.h @@ -286,10 +286,6 @@ struct wps_data unsigned int button_time_volume; }; - -/* Redraw statusbars if necessary */ -void gwps_draw_statusbars(void); - /* Returns the index of the last subline's token in the token array. line - 0-based line number subline - 0-based subline number within the line @@ -332,6 +328,12 @@ struct gui_wps struct screen *display; struct wps_data *data; struct wps_state *state; + + /* suitable for the viewportmanager, possibly only temporary here + * needs to be same for all screens! can't be split up for screens + * due to what viewportmanager_set_statusbar() accepts + * (FIXME?) */ + int *statusbars; }; /* gui_wps end */ diff --git a/apps/gui/wps.c b/apps/gui/wps.c index ed3bf5f6b..cfa857099 100644 --- a/apps/gui/wps.c +++ b/apps/gui/wps.c @@ -78,6 +78,7 @@ /* 3% of 30min file == 54s step size */ #define MIN_FF_REWIND_STEP 500 +/* this is for the viewportmanager */ static int wpsbars; /* currently only one wps_state is needed */ static struct wps_state wps_state; @@ -88,6 +89,7 @@ static struct wps_data wps_datas[NB_SCREENS]; static void wps_state_init(void); static void track_changed_callback(void *param); static void nextid3available_callback(void* param); +static void statusbar_toggle_handler(void *data); #define WPS_DEFAULTCFG WPS_DIR "/rockbox_default.wps" @@ -543,25 +545,6 @@ static void play_hop(int direction) #endif } -static void gwps_fix_statusbars(void) -{ -#ifdef HAVE_LCD_BITMAP - int i; - wpsbars = VP_SB_HIDE_ALL; - FOR_NB_SCREENS(i) - { - bool draw = false; - if (gui_wps[i].data->wps_sb_tag) - draw = gui_wps[i].data->show_sb_on_wps; - else if (statusbar_position(i) != STATUSBAR_OFF) - draw = true; - if (draw) - wpsbars |= (VP_SB_ONSCREEN(i) | VP_SB_IGNORE_SETTING(i)); - } -#else - wpsbars = VP_SB_ALLSCREENS; -#endif -} #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) /* @@ -585,9 +568,9 @@ static void gwps_leave_wps(void) { gui_wps[i].display->stop_scroll(); gui_wps[i].display->backdrop_show(BACKDROP_MAIN); + if (statusbar_position(i) != STATUSBAR_OFF) + oldbars |= VP_SB_ONSCREEN(i); } - if (global_settings.statusbar) - oldbars = VP_SB_ALLSCREENS; viewportmanager_set_statusbar(oldbars); #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) @@ -597,10 +580,6 @@ static void gwps_leave_wps(void) send_event(GUI_EVENT_REFRESH, NULL); } -void gwps_draw_statusbars(void) -{ - viewportmanager_set_statusbar(wpsbars); -} #ifdef HAVE_TOUCHSCREEN int wps_get_touchaction(struct wps_data *data) { @@ -721,6 +700,7 @@ long gui_wps_show(void) ab_reset_markers(); #endif wps_state_init(); + statusbar_toggle_handler(NULL); while ( 1 ) { @@ -1181,7 +1161,6 @@ long gui_wps_show(void) { restore = false; restoretimer = RESTORE_WPS_INSTANTLY; - gwps_fix_statusbars(); #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) lcd_activation_set_hook(wps_lcd_activation_hook); #endif @@ -1269,23 +1248,22 @@ static void statusbar_toggle_handler(void *data) { (void)data; int i; - gwps_fix_statusbars(); + wpsbars = VP_SB_HIDE_ALL; FOR_NB_SCREENS(i) - { - struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, &wps_datas[i])->vp; - bool draw = wpsbars & (VP_SB_ONSCREEN(i) | VP_SB_IGNORE_SETTING(i)); - if (!draw) - { - vp->y = 0; - vp->height = screens[i].lcdheight; - } - else - { - bool bar_at_top = statusbar_position(i) != STATUSBAR_BOTTOM; - vp->y = bar_at_top?STATUSBAR_HEIGHT:0; - vp->height = screens[i].lcdheight - STATUSBAR_HEIGHT; - } + { /* fix viewports if needed */ + skin_statusbar_changed(&gui_wps[i]); + + bool draw = false; + + /* fix up gui_wps::statusbars, so that the viewportmanager accepts it*/ + if (gui_wps[i].data->wps_sb_tag) + draw = gui_wps[i].data->show_sb_on_wps; + else if (statusbar_position(i) != STATUSBAR_OFF) + draw = true; + if (draw) + wpsbars |= + (VP_SB_ONSCREEN(i) | VP_SB_IGNORE_SETTING(i)); } } #endif @@ -1308,7 +1286,10 @@ void gui_sync_wps_init(void) so use the only available ( "global" ) one */ gui_wps[i].state = &wps_state; gui_wps[i].display->backdrop_unload(BACKDROP_SKIN_WPS); + /* only one wpsbars needed/wanted */ + gui_wps[i].statusbars = &wpsbars; } + *(gui_wps[SCREEN_MAIN].statusbars) =VP_SB_ALLSCREENS; #ifdef HAVE_LCD_BITMAP add_event(GUI_EVENT_STATUSBAR_TOGGLE, false, statusbar_toggle_handler); #endif -- 2.11.4.GIT From c0b419e7885da37c06e8b33d5cf6f13779e82d13 Mon Sep 17 00:00:00 2001 From: blue_dude Date: Wed, 26 Aug 2009 02:23:46 +0000 Subject: [PATCH 08/16] Adds manual section for limiter preamp git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22515 a1c6a512-1295-4272-9138-f99709370657 --- manual/configure_rockbox/sound_settings.tex | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/manual/configure_rockbox/sound_settings.tex b/manual/configure_rockbox/sound_settings.tex index 6a7d42311..c24b38a89 100644 --- a/manual/configure_rockbox/sound_settings.tex +++ b/manual/configure_rockbox/sound_settings.tex @@ -441,4 +441,22 @@ Enabling \setting{Timestretch} allows you to change the playback speed without it affecting the pitch of the recording. After enabling this feature and rebooting, you can access this via the \setting{Pitch Screen}. This function is intended for speech playback and may significantly dilute your listening -experience with more complex audio.} +experience with more complex audio. +} + +\opt{swcodec}{ +\section{Limiter Preamp} +The limiter preamp raises the gain of the audio by the selected amount. The associated +limiter function works on the resulting louder signal to reduce any peaks to below the +maximum level. The default selection of 0dB turns all limiter processing off. + +The limiter has the effect of reducing dynamic range by amplifying quiet sections while +loud sections are kept just under maximum gain. This allows listening to the quiet sections +of dynamic material in noisy environments while preventing sudden loud sections from being +overbearing. + +Think of this as a smart volume control. The preamp in effect turns up the volume by the +amount you select so that you can hear quiet passages. But it senses when a loud section is +about to play and quickly and smoothly lowers the volume as necessary to keep the audio +under the maximum limit. As the loud section fades, the volume is turned back up. +} \ No newline at end of file -- 2.11.4.GIT From e7fb8501e2c6e1f53e4d48904de1a9928cd804ea Mon Sep 17 00:00:00 2001 From: alle Date: Wed, 26 Aug 2009 20:58:49 +0000 Subject: [PATCH 09/16] Manual: do filling the table headers with colors in a more official way, so that the spaces defined in booktabs are retained git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22516 a1c6a512-1295-4272-9138-f99709370657 --- manual/preamble.tex | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/manual/preamble.tex b/manual/preamble.tex index fa2ef73ae..a9ace76d1 100644 --- a/manual/preamble.tex +++ b/manual/preamble.tex @@ -65,6 +65,20 @@ \colorlet{tbloddrowbgcolor}{blue!10} % Background color for odd rows (headers not included) \colorlet{tblevenrowbgcolor}{white} % Background color for even rows (headers not included) +% We use or own rules to typeset tables since we want the headers to +% be fully filled with colors +\newcommand{\rbtoprule}{\specialrule{\heavyrulewidth}{\abovetopsep}{0pt}% + \arrayrulecolor{tblhdrbgcolor}\specialrule{\belowrulesep}{0pt}{0pt}% + \arrayrulecolor{black}} +\newcommand{\rbmidrule}{\arrayrulecolor{tblhdrbgcolor}\specialrule{\aboverulesep}{0pt}{0pt}% + \arrayrulecolor{black}\specialrule{\lightrulewidth}{0pt}{0pt}% + \arrayrulecolor{tblevenrowbgcolor}\specialrule{\belowrulesep}{0pt}{0pt}% + \arrayrulecolor{black}} +\newcommand{\rbbottomrule}{\specialrule{\heavyrulewidth}{\aboverulesep}{0pt}% + \arrayrulecolor{white}\specialrule{\belowbottomsep}{0pt}{0pt}% + \arrayrulecolor{black}} + + \usepackage{fancyhdr} \usepackage{graphicx} \usepackage{verbatim} @@ -102,9 +116,6 @@ \setlength{\headheight}{18.5pt} \newcounter{example}[chapter] -\setlength{\belowrulesep}{0pt} -\setlength{\aboverulesep}{0pt} - %% \newenvironment{example} %% {\stepcounter{example}\paragraph{Example \theexample:}} %% {\hfill$\Box$ @@ -228,15 +239,15 @@ \rowcolors{2}{tbloddrowbgcolor}{tblevenrowbgcolor} \expandafter\let\expandafter\SavedEndTab\csname endtabular*\endcsname \expandafter\renewcommand\expandafter*\csname endtabular*\endcsname{% - \bottomrule + \rbbottomrule% \SavedEndTab% \if\given{#4}\caption{#4}\fi% \if\given{#5}\label{#5}\fi% \endcenter% } \center - \tabularx{#1}{#2}\toprule\rowcolor{tblhdrbgcolor} - \rule{0pt}{2.9ex}#3\\\midrule + \tabularx{#1}{#2}\rbtoprule\rowcolor{tblhdrbgcolor} + #3\\\rbmidrule }{% \endtabularx } @@ -245,7 +256,7 @@ % command to set the default table heading for button lists -\newcommand{\taghead}{\rule{0pt}{2.9ex}\textbf{Tag} & \textbf{Description} \\\midrule} +\newcommand{\taghead}{\textbf{Tag} & \textbf{Description} \\\rbmidrule} % environment intended to be used with tag maps (for wps) % usage: \begin{tagmap}{caption}{label} Tag & Description \\ \end{tagmap} @@ -257,14 +268,14 @@ \rowcolors{2}{tbloddrowbgcolor}{tblevenrowbgcolor} \expandafter\let\expandafter\SavedEndTab\csname endtabular*\endcsname \expandafter\renewcommand\expandafter*\csname endtabular*\endcsname{% - \bottomrule + \rbbottomrule% \SavedEndTab% \if\given{#1}\caption{#1}\fi% \if\given{#2}\label{#2}\fi% \endcenter% } \center -\tabularx{\textwidth}{lX}\toprule\rowcolor{tblhdrbgcolor} % here is the table width defined +\tabularx{\textwidth}{lX}\rbtoprule\rowcolor{tblhdrbgcolor} % here is the table width defined \taghead }{% \endtabularx @@ -347,10 +358,9 @@ \usepackage{makeidx} \makeindex - % command to set the default table heading for button lists \newcommand{\btnhead}{\textbf{Key} \opt{HAVEREMOTEKEYMAP}{% - & \textbf{Remote Key}} & \textbf{Action} \\\midrule} + & \textbf{Remote Key}} & \textbf{Action} \\\rbmidrule} % environment intended to be used with button maps % usage: \begin{btnmap}{caption}{label} Button & ButtonAction \\ \end{btnmap} % Note: this automatically sets the table lines. @@ -367,7 +377,7 @@ \rowcolors{2}{tbloddrowbgcolor}{tblevenrowbgcolor} \expandafter\let\expandafter\SavedEndTab\csname endtabular*\endcsname \expandafter\renewcommand\expandafter*\csname endtabular*\endcsname{% - \bottomrule + \rbbottomrule% \SavedEndTab% \if\given{#1}\caption{#1}\fi% \if\given{#2}\label{#2}\fi% @@ -376,13 +386,13 @@ \center \opt{HAVEREMOTEKEYMAP}{ % here is the table width defined for 3 columns - \tabularx{.95\textwidth}{>{\raggedright\arraybackslash}p{.2\textwidth}>{\raggedright\arraybackslash}p{.2\textwidth}X}\toprule\rowcolor{tblhdrbgcolor} + \tabularx{.95\textwidth}{>{\raggedright\arraybackslash}p{.2\textwidth}>{\raggedright\arraybackslash}p{.2\textwidth}X}\rbtoprule\rowcolor{tblhdrbgcolor} } \nopt{HAVEREMOTEKEYMAP}{ % here is the table width defined for 2 columns - \tabularx{.75\textwidth}{>{\raggedright\arraybackslash}p{.22\textwidth}X}\toprule\rowcolor{tblhdrbgcolor} + \tabularx{.75\textwidth}{>{\raggedright\arraybackslash}p{.22\textwidth}X}\rbtoprule\rowcolor{tblhdrbgcolor} } - \rule{0pt}{2.9ex}\btnhead + \btnhead }{% \endtabularx } -- 2.11.4.GIT From 759d4da81e5c362b9f9b1b8c75c68f821899fa83 Mon Sep 17 00:00:00 2001 From: teru Date: Thu, 27 Aug 2009 13:30:26 +0000 Subject: [PATCH 10/16] fix FS#10550. Start autostart.rock after gui_syncstatusbar_init(). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22517 a1c6a512-1295-4272-9138-f99709370657 --- apps/main.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/main.c b/apps/main.c index 49542e8b0..6aa16e5cb 100644 --- a/apps/main.c +++ b/apps/main.c @@ -121,7 +121,7 @@ const char appsversion[]=APPSVERSION; static void init(void); - + #ifdef SIMULATOR void app_main(void) #else @@ -142,6 +142,18 @@ static void app_main(void) /* All threads should be created and public queues registered by now */ usb_start_monitoring(); #endif + +#ifdef AUTOROCK + { + static const char filename[] = PLUGIN_APPS_DIR "/autostart.rock"; + + if(file_exists(filename)) /* no complaint if it doesn't exist */ + { + plugin_load((char*)filename, NULL); /* start if it does */ + } + } +#endif /* #ifdef AUTOROCK */ + root_menu(); } @@ -202,7 +214,6 @@ static int init_dircache(bool preinit) splashf(0, "Dircache failed, disabled. Result: %d", result); global_settings.dircache = false; } - } if (clear) @@ -579,17 +590,6 @@ static void init(void) /* runtime database has to be initialized after audio_init() */ cpu_boost(false); -#ifdef AUTOROCK - { - static const char filename[] = PLUGIN_APPS_DIR "/autostart.rock"; - - if(file_exists(filename)) /* no complaint if it doesn't exist */ - { - plugin_load((char*)filename, NULL); /* start if it does */ - } - } -#endif /* #ifdef AUTOROCK */ - #if CONFIG_CHARGING car_adapter_mode_init(); #endif -- 2.11.4.GIT From 31b6ab75b8604edcb239d126dd94ddb9dcf01fd8 Mon Sep 17 00:00:00 2001 From: teru Date: Thu, 27 Aug 2009 14:24:58 +0000 Subject: [PATCH 11/16] Rearange menu of mpegplayer. Add new menu with "settings" and "quit", and remove quit item from settings menu. The setting menu was bit wierd as it had "quit" item at it's buttom. Also, there are 2 almost same menu definitions in mpeg_menu and it doesn't looks good, imo. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22518 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/mpegplayer/mpeg_settings.c | 80 ++++++++++++++++++++------------- apps/plugins/mpegplayer/mpeg_settings.h | 21 ++++----- apps/plugins/mpegplayer/mpegplayer.c | 26 ++++------- 3 files changed, 70 insertions(+), 57 deletions(-) diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c index 3868d759f..d361cc818 100644 --- a/apps/plugins/mpegplayer/mpeg_settings.c +++ b/apps/plugins/mpegplayer/mpeg_settings.c @@ -259,6 +259,7 @@ static const struct opt_items globaloff[2] = { #define BACKLIGHT_OPTION_DEFAULT "Use setting" #endif +static void mpeg_settings(void); static long mpeg_menu_sysevent_id; void mpeg_menu_sysevent_clear(void) @@ -831,9 +832,8 @@ static int show_start_menu(uint32_t duration) struct hms hms; MENUITEM_STRINGLIST(menu, "Mpegplayer Menu", mpeg_menu_sysevent_callback, - "Play from beginning", resume_str, - "Set start time", "Settings", - "Quit mpegplayer"); + "Play from beginning", resume_str, "Set start time", + "Settings", "Quit mpegplayer"); ts_to_hms(settings.resume_time, &hms); hms_format(hms_str, sizeof(hms_str), &hms); @@ -872,9 +872,9 @@ static int show_start_menu(uint32_t duration) break; case MPEG_START_SETTINGS: - if (mpeg_menu(MPEG_MENU_HIDE_QUIT_ITEM) != MPEG_MENU_QUIT) - break; - /* Fall-through */ + mpeg_settings(); + break; + default: result = MPEG_START_QUIT; menu_quit = true; @@ -916,6 +916,44 @@ int mpeg_start_menu(uint32_t duration) } } +int mpeg_menu(void) +{ + int result; + + MENUITEM_STRINGLIST(menu, "Mpegplayer Menu", mpeg_menu_sysevent_callback, + "Settings", "Resume playback", "Quit mpegplayer"); + + rb->button_clear_queue(); + + mpeg_menu_sysevent_clear(); + + result = rb->do_menu(&menu, NULL, NULL, false); + + switch (result) + { + case MPEG_MENU_SETTINGS: + mpeg_settings(); + break; + + case MPEG_MENU_RESUME: + break; + + case MPEG_MENU_QUIT: + break; + + default: + break; + } + + if (mpeg_menu_sysevent() != 0) + result = MPEG_MENU_QUIT; + + rb->lcd_clear_display(); + rb->lcd_update(); + + return result; +} + /** MPEG Menu **/ static void display_options(void) { @@ -1078,25 +1116,16 @@ static void clear_resume_count(void) configfile_update_entry(SETTINGS_FILENAME, "Resume count", 0); } -int mpeg_menu(unsigned flags) +static void mpeg_settings(void) { int selected = 0; int result; bool menu_quit = false; static char clear_str[32]; - MENUITEM_STRINGLIST(menu_with_quit, "Mpegplayer Menu", - mpeg_menu_sysevent_callback, - "Display Options", "Audio Options", - "Resume Options", clear_str, "Quit mpegplayer"); - MENUITEM_STRINGLIST(menu_without_quit, "Settings", - mpeg_menu_sysevent_callback, + MENUITEM_STRINGLIST(menu, "Settings", mpeg_menu_sysevent_callback, "Display Options", "Audio Options", "Resume Options", clear_str); - const struct menu_item_ex *menu = &menu_with_quit; - - if (flags & MPEG_MENU_HIDE_QUIT_ITEM) - menu = &menu_without_quit; rb->button_clear_queue(); @@ -1112,39 +1141,30 @@ int mpeg_menu(unsigned flags) switch (result) { - case MPEG_MENU_DISPLAY_SETTINGS: + case MPEG_SETTING_DISPLAY_SETTINGS: display_options(); break; - case MPEG_MENU_AUDIO_SETTINGS: + case MPEG_SETTING_AUDIO_SETTINGS: audio_options(); break; - case MPEG_MENU_ENABLE_START_MENU: + case MPEG_SETTING_ENABLE_START_MENU: resume_options(); break; - case MPEG_MENU_CLEAR_RESUMES: + case MPEG_SETTING_CLEAR_RESUMES: clear_resume_count(); break; - case MPEG_MENU_QUIT: default: menu_quit = true; break; } if (mpeg_menu_sysevent() != 0) - { - result = MPEG_MENU_QUIT; menu_quit = true; - } } - - rb->lcd_clear_display(); - rb->lcd_update(); - - return result; } void init_settings(const char* filename) diff --git a/apps/plugins/mpegplayer/mpeg_settings.h b/apps/plugins/mpegplayer/mpeg_settings.h index fa5017616..95ecc2954 100644 --- a/apps/plugins/mpegplayer/mpeg_settings.h +++ b/apps/plugins/mpegplayer/mpeg_settings.h @@ -56,12 +56,18 @@ enum mpeg_start_id MPEG_START_EXIT, }; +enum mpeg_setting_id +{ + MPEG_SETTING_DISPLAY_SETTINGS, + MPEG_SETTING_AUDIO_SETTINGS, + MPEG_SETTING_ENABLE_START_MENU, + MPEG_SETTING_CLEAR_RESUMES, +}; + enum mpeg_menu_id { - MPEG_MENU_DISPLAY_SETTINGS, - MPEG_MENU_AUDIO_SETTINGS, - MPEG_MENU_ENABLE_START_MENU, - MPEG_MENU_CLEAR_RESUMES, + MPEG_MENU_SETTINGS, + MPEG_MENU_RESUME, MPEG_MENU_QUIT, }; @@ -91,13 +97,8 @@ struct mpeg_settings { extern struct mpeg_settings settings; int mpeg_start_menu(uint32_t duration); +int mpeg_menu(void); -enum -{ - MPEG_MENU_HIDE_QUIT_ITEM = 0x1, /* Don't show the quit item */ -}; - -int mpeg_menu(unsigned flags); void mpeg_menu_sysevent_clear(void); long mpeg_menu_sysevent(void); int mpeg_menu_sysevent_callback(int btn, const struct menu_item_ex *menu); diff --git a/apps/plugins/mpegplayer/mpegplayer.c b/apps/plugins/mpegplayer/mpegplayer.c index 47407cca8..a66a588ac 100644 --- a/apps/plugins/mpegplayer/mpegplayer.c +++ b/apps/plugins/mpegplayer/mpegplayer.c @@ -1485,10 +1485,8 @@ static void button_loop(void) rb->lcd_clear_display(); rb->lcd_update(); -#if defined(HAVE_LCD_MODES) -#if (HAVE_LCD_MODES & LCD_MODE_YUV) - rb->lcd_set_mode(LCD_MODE_YUV); -#endif +#if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_YUV) + rb->lcd_set_mode(LCD_MODE_YUV); #endif wvs_init(); @@ -1569,13 +1567,11 @@ static void button_loop(void) stream_show_vo(false); wvs_backlight_brightness_video_mode(false); -#if defined(HAVE_LCD_MODES) -#if (HAVE_LCD_MODES & LCD_MODE_YUV) - rb->lcd_set_mode(LCD_MODE_RGB565); -#endif +#if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_YUV) + rb->lcd_set_mode(LCD_MODE_RGB565); #endif - result = mpeg_menu(0); + result = mpeg_menu(); /* The menu can change the font, so restore */ rb->lcd_setfont(FONT_SYSFIXED); @@ -1587,10 +1583,8 @@ static void button_loop(void) break; default: -#if defined(HAVE_LCD_MODES) -#if (HAVE_LCD_MODES & LCD_MODE_YUV) - rb->lcd_set_mode(LCD_MODE_YUV); -#endif +#if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_YUV) + rb->lcd_set_mode(LCD_MODE_YUV); #endif /* If not stopped, show video again */ if (state != STREAM_STOPPED) { @@ -1751,10 +1745,8 @@ enum plugin_status plugin_start(const void* parameter) } } -#if defined(HAVE_LCD_MODES) -#if (HAVE_LCD_MODES & LCD_MODE_YUV) - rb->lcd_set_mode(LCD_MODE_RGB565); -#endif +#if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_YUV) + rb->lcd_set_mode(LCD_MODE_RGB565); #endif stream_exit(); -- 2.11.4.GIT From d5cb44603708f928e42cd4ef9d7f7510e771a67c Mon Sep 17 00:00:00 2001 From: teru Date: Thu, 27 Aug 2009 14:41:20 +0000 Subject: [PATCH 12/16] fix red. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22519 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/mpegplayer/mpeg_settings.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c index d361cc818..7ca000553 100644 --- a/apps/plugins/mpegplayer/mpeg_settings.c +++ b/apps/plugins/mpegplayer/mpeg_settings.c @@ -1137,7 +1137,7 @@ static void mpeg_settings(void) rb->snprintf(clear_str, sizeof(clear_str), "Clear all resumes: %u", settings.resume_count); - result = rb->do_menu(menu, &selected, NULL, false); + result = rb->do_menu(&menu, &selected, NULL, false); switch (result) { -- 2.11.4.GIT From 5d5912229e7642aab1022e0a11ff2cc1a7d41f66 Mon Sep 17 00:00:00 2001 From: kugel Date: Thu, 27 Aug 2009 17:55:05 +0000 Subject: [PATCH 13/16] Do some #ifdef'ing to make the Player happy. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22520 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/skin_engine/skin_display.c | 4 ++-- apps/gui/wps.c | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index e674c9bec..a6cab6382 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c @@ -129,6 +129,8 @@ bool skin_update(struct gui_wps *gwps, unsigned int update_type) return retval; } +#ifdef HAVE_LCD_BITMAP + void skin_statusbar_changed(struct gui_wps *skin) { if (!skin) @@ -159,8 +161,6 @@ void skin_statusbar_changed(struct gui_wps *skin) } -#ifdef HAVE_LCD_BITMAP - static void draw_progressbar(struct gui_wps *gwps, struct skin_viewport *wps_vp) { diff --git a/apps/gui/wps.c b/apps/gui/wps.c index cfa857099..1d97501bc 100644 --- a/apps/gui/wps.c +++ b/apps/gui/wps.c @@ -89,8 +89,9 @@ static struct wps_data wps_datas[NB_SCREENS]; static void wps_state_init(void); static void track_changed_callback(void *param); static void nextid3available_callback(void* param); +#ifdef HAVE_LCD_BITMAP static void statusbar_toggle_handler(void *data); - +#endif #define WPS_DEFAULTCFG WPS_DIR "/rockbox_default.wps" #ifdef HAVE_REMOTE_LCD @@ -693,6 +694,8 @@ long gui_wps_show(void) #ifdef HAVE_LCD_CHARCELLS status_set_audio(true); status_set_param(false); +#else + statusbar_toggle_handler(NULL); #endif #ifdef AB_REPEAT_ENABLE @@ -700,7 +703,6 @@ long gui_wps_show(void) ab_reset_markers(); #endif wps_state_init(); - statusbar_toggle_handler(NULL); while ( 1 ) { -- 2.11.4.GIT From 499eb09f090740effb98c37b8f6ceb91adc4f7c1 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 28 Aug 2009 09:06:32 +0000 Subject: [PATCH 14/16] Fix Gigabeat F manual. Thanks to Marianne Arnold for pointing out it was broken. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22521 a1c6a512-1295-4272-9138-f99709370657 --- manual/platform/remote-keymap-gigabeat.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manual/platform/remote-keymap-gigabeat.tex b/manual/platform/remote-keymap-gigabeat.tex index 73e44e6d5..5acae3a9f 100644 --- a/manual/platform/remote-keymap-gigabeat.tex +++ b/manual/platform/remote-keymap-gigabeat.tex @@ -66,7 +66,7 @@ \newcommand{\ActionRCKbdDown}{} %Button actions, Pitch Screen context -\newcommand{\ActionRCPsToggleMode}{Long \ButtonPlay} +\newcommand{\ActionRCPsToggleMode}{Long \ButtonRCPlay} \newcommand{\ActionRCPsIncSmall}{\ButtonRCVolUp} \newcommand{\ActionRCPsIncBig}{Long \ButtonRCVolUp} \newcommand{\ActionRCPsDecSmall}{\ButtonRCVolDown} -- 2.11.4.GIT From 76f70114f9c73e0ba3571276d7b5121449f418f9 Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Sat, 29 Aug 2009 13:00:01 +0200 Subject: [PATCH 15/16] Integrate convttf into tools/. --- tools/Makefile | 9 +- tools/convbdf.c | 1 + tools/convttf.c | 1131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tools/root.make | 3 +- tools/tools.make | 13 +- 5 files changed, 1150 insertions(+), 7 deletions(-) create mode 100644 tools/convttf.c diff --git a/tools/Makefile b/tools/Makefile index 43f53e256..564293b1f 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -13,10 +13,11 @@ LDFLAGS := -g CLEANALL := scramble descramble iriver sh2d bmp2rb rdf2binary convbdf \ generate_rocklatin mkboot ipod_fw codepages uclpack mi4 gigabeat \ - lngdump telechips gigabeats creative hmac-sha1 mktccboot mknkboot rbspeexenc mkzenboot + lngdump telechips gigabeats creative hmac-sha1 mktccboot mknkboot rbspeexenc \ + mkzenboot convttf all: scramble descramble sh2d rdf2binary mkboot mktccboot mknkboot mkzenboot \ - convbdf codepages uclpack rbspeexenc voicefont + convbdf codepages uclpack rbspeexenc voicefont convttf scramble: scramble.o iriver.o mi4.o gigabeat.o gigabeats.o telechips.o iaudio_bl_flash.o creative.o hmac-sha1.o descramble: descramble.o iriver.o gigabeat.o @@ -95,6 +96,10 @@ voicefont: voicefont.c usb_benchmark: usb_benchmark.c $(SILENT)$(CC) $(CFLAGS) -lusb $+ -o $@ +convttf: convttf.c + $(call PRINTS,CC $(@F)) + $(SILENT)$(CC) $(CFLAGS) -std=gnu89 -O -Wall -g $+ -o $@ \ + `freetype-config --libs` `freetype-config --cflags` clean: @echo "Cleaning tools" $(SILENT)rm -f $(CLEANALL) $(shell for f in $(CLEANALL) ; do echo $$f.exe $$f.o $$f.obj ; done) *.ajf *~ diff --git a/tools/convbdf.c b/tools/convbdf.c index fd82fb5a7..e23aa08e5 100644 --- a/tools/convbdf.c +++ b/tools/convbdf.c @@ -1389,6 +1389,7 @@ int gen_c_source(struct font* pf, char *path) " %d, /* ascent */\n" " %d, /* firstchar */\n" " %d, /* size */\n" + " 0, /* depth */\n" " _font_bits, /* bits */\n" " %s /* offset */\n" " %s\n" diff --git a/tools/convttf.c b/tools/convttf.c new file mode 100644 index 000000000..fdc45ed39 --- /dev/null +++ b/tools/convttf.c @@ -0,0 +1,1131 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2007 Jonas Hurrelmann + * + * A command-line tool to convert ttf file to bitmap fonts + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#define BITMAP_WORDS(x) (((x)+15)/16) /* image size in words*/ + +#include +#include +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include +#ifdef WIN32 +#include +#else +#include +#include +#endif +#include FT_SFNT_NAMES_H +#include FT_TRUETYPE_TABLES_H + +#include +/* + * Set the default values used to generate a BDF font. + */ +#ifndef DEFAULT_PLATFORM_ID +#define DEFAULT_PLATFORM_ID 3 +#endif + +#ifndef DEFAULT_ENCODING_ID +#define DEFAULT_ENCODING_ID 1 +#endif + +#define log_level_nolog 0 +#define log_level_warnning 1 +#define log_level_header 2 +#define log_level_description1 3 +#define log_level_description2 4 + +#ifndef log_level +#define log_level log_level_nolog +#endif + +#define MIN(a,b) ((a)<(b) ? (a) : (b)) +#define MAX(a,b) ((a)>(b) ? (a) : (b)) + +/* + * nameID macros for getting strings from the OT font. + */ +enum { + BDFOTF_COPYRIGHT_STRING = 0, + BDFOTF_FAMILY_STRING, + BDFOTF_SUBFAMILY_STRING, + BDFOTF_UNIQUEID_STRING, + BDFOTF_FULLNAME_STRING, + BDFOTF_VENDOR_STRING, + BDFOTF_POSTSCRIPT_STRING, + BDFOTF_TRADEMARK_STRING, +}; +/* + * String names for the string indexes. Used for error messages. + */ +static char *string_names[] = { + "\"Copyright\"", + "\"Family\"", + "\"SubFamily\"", + "\"Unique ID\"", + "\"Full Name\"", + "\"Vendor\"", + "\"Postscript Name\"", + "\"Trademark\"" +}; + + +/* + * The default platform and encoding ID's. + */ +static int pid = DEFAULT_PLATFORM_ID; +static int eid = DEFAULT_ENCODING_ID; + + +/* + * A flag indicating if a CMap was found or not. + */ +static FT_UShort nocmap; + +#define MAX_CHAR 65535 +int pct = 0; /* display ttc table if it is not zero. */ +int pixel_size = 15; +unsigned long start_char = 0; +unsigned long limit_char; +unsigned long firstchar = 0; +unsigned long lastchar; +FT_Long ttc_index = -1; +int flg_all_ttc = 0; +const int depth = 1; +short antialias = 1; /* smooth fonts with gray levels */ +int oflag = 0; +char outfile[1024]; +int between_chr = 0; +int between_row = 1; + +struct font_header_struct { + char header[4]; /* magic number and version bytes */ + unsigned short maxwidth; /* max width in pixels */ + unsigned short height; /* height in pixels */ + unsigned short ascent; /* ascent (baseline) height */ + unsigned short depth; /* depth 0=1-bit, 1=4-bit */ + unsigned long firstchar; /* first character in font */ + unsigned long defaultchar; /* default character in font */ + unsigned long size; /* # characters in font */ + unsigned long nbits; /* # bytes imagebits data in file */ + + FT_Long noffset; /* # longs offset data in file */ + FT_Long nwidth; /* # bytes width data in file */ +}; + +struct ttc_table { + FT_Long ttc_count; + char **ttf_name; +}; + +/* exit the program with given message */ +static void +panic( const char* message ) +{ + fprintf( stderr, "%s\n", message ); + exit( 1 ); +} + +/* print usage information */ +void usage(void) +{ + char help[] = { + "Usage: convttf [options] [input-files]\n" + " convttf [options] [-o output-file] [single-input-file]\n\n" + " Default output-filename : \n" + " 'input-files name removed extension'_'font-size'.fnt.\n" + " but default output-filename become \n " + " 'internal postscript-name of input-file'_'font-size'.fnt.\n" + " if '-ta' or '-tc' options are described.\n" + "Options:\n" + " -s N Start output at character encodings >= N\n" + " -l N Limit output to character encodings <= N\n" + " -p N Character height N in pixel (default N=15)\n" + " -c N Character separation in pixel.Insert space between lines. (default N=1)\n" + " -r N Row separation in pixel.Insert space between characters\n" + " -tt Display the True Type Collection tables available in the font\n" + " -t N Index of true type collection. It must be start from 0.(default N=0).\n" + " -ta Convert all fonts in ttc\n" + " \"-o output-file\" specified is ignored when \"-ta\" is specified.\n" + }; + fprintf(stderr, help); + exit( 1 ); +} + +/* remove directory prefix and file suffix from full path*/ +char *basename(char *path) +{ + char *p, *b; + static char base[256]; + + /* remove prepended path and extension*/ + b = path; + for (p=path; *p; ++p) { + if (*p == '/') + b = p + 1; + } + strcpy(base, b); + for (p=base; *p; ++p) { + if (*p == '.') { + *p = 0; + break; + } + } + return base; +} + + +void setcharmap(FT_Face face) +{ + FT_Long i; + + /* + * Get the requested cmap. + */ + for (i = 0; i < face->num_charmaps; i++) { + if (face->charmaps[i]->platform_id == pid && + face->charmaps[i]->encoding_id == eid) + break; + } + + if (i == face->num_charmaps && pid == 3 && eid == 1) { + /* + * Make a special case when this fails with pid == 3 and eid == 1. + * Change to eid == 0 and try again. This captures the two possible + * cases for MS fonts. Some other method should be used to cycle + * through all the alternatives later. + */ + for (i = 0; i < face->num_charmaps; i++) { + if (face->charmaps[i]->platform_id == pid && + face->charmaps[i]->encoding_id == 0) + break; + } + if (i < face->num_charmaps) { + pid = 3; + eid = 1; + FT_Set_Charmap(face, face->charmaps[i]); + } else { + /* + * No CMAP was found. + */ + nocmap = 1; + pid = eid = -1; + } + } else { + FT_Set_Charmap(face, face->charmaps[i]); + nocmap = 0; + } + +} + +/* + * quote in otf2bdf. + * A generic routine to get a name from the OT name table. This routine + * always looks for English language names and checks three possibilities: + * 1. English names with the MS Unicode encoding ID. + * 2. English names with the MS unknown encoding ID. + * 3. English names with the Apple Unicode encoding ID. + * + * The particular name ID mut be provided (e.g. nameID = 0 for copyright + * string, nameID = 6 for Postscript name, nameID = 1 for typeface name. + * + * If the `dash_to_space' flag is non-zero, all dashes (-) in the name will be + * replaced with the character passed. + * + * Returns the number of bytes added. + */ +static int +otf_get_english_string(FT_Face face, int nameID, int dash_to_space, + char *name, int name_size) +{ + + int j, encid; + FT_UInt i, nrec; + FT_SfntName sfntName; + unsigned char *s; + unsigned short slen; + + nrec = FT_Get_Sfnt_Name_Count(face); + + for (encid = 1, j = 0; j < 2; j++, encid--) { + /* + * Locate one of the MS English font names. + */ + for (i = 0; i < nrec; i++) { + FT_Get_Sfnt_Name(face, i, &sfntName); + if (sfntName.platform_id == 3 && + sfntName.encoding_id == encid && + sfntName.name_id == nameID && + (sfntName.language_id == 0x0409 || + sfntName.language_id == 0x0809 || + sfntName.language_id == 0x0c09 || + sfntName.language_id == 0x1009 || + sfntName.language_id == 0x1409 || + sfntName.language_id == 0x1809)) { + s = sfntName.string; + slen = sfntName.string_len; + break; + } + } + + if (i < nrec) { + if (slen >> 1 >= name_size) { + fprintf(stderr, "warning: %s string longer than buffer. " + "Truncating to %d bytes.\n", string_names[nameID], + name_size); + slen = name_size << 1; + } + + /* + * Found one of the MS English font names. The name is by + * definition encoded in Unicode, so copy every second byte into + * the `name' parameter, assuming there is enough space. + */ + for (i = 1; i < slen; i += 2) { + if (dash_to_space) + *name++ = (s[i] != '-') ? s[i] : ' '; + else if (s[i] == '\r' || s[i] == '\n') { + if (s[i] == '\r' && i + 2 < slen && s[i + 2] == '\n') + i += 2; + *name++ = ' '; + *name++ = ' '; + } else + *name++ = s[i]; + } + *name = 0; + return (slen >> 1); + } + } + + /* + * No MS English name found, attempt to find an Apple Unicode English + * name. + */ + for (i = 0; i < nrec; i++) { + FT_Get_Sfnt_Name(face, i, &sfntName); + if (sfntName.platform_id == 0 && sfntName.language_id == 0 && + sfntName.name_id == nameID) { + s = sfntName.string; + slen = sfntName.string_len; + break; + } + } + + if (i < nrec) { + if (slen >> 1 >= name_size) { + fprintf(stderr, "warning: %s string longer than buffer. " + "Truncating to %d bytes.\n", string_names[nameID], name_size); + slen = name_size << 1; + } + + /* + * Found the Apple Unicode English name. The name is by definition + * encoded in Unicode, so copy every second byte into the `name' + * parameter, assuming there is enough space. + */ + for (i = 1; i < slen; i += 2) { + if (dash_to_space) + *name++ = (s[i] != '-') ? s[i] : ' '; + else if (s[i] == '\r' || s[i] == '\n') { + if (s[i] == '\r' && i + 2 < slen && s[i + 2] == '\n') + i += 2; + *name++ = ' '; + *name++ = ' '; + } else + *name++ = s[i]; + } + *name = 0; + return (slen >> 1); + } + + return 0; +} + + +int get_ttc_table(char *path, struct ttc_table *ttcname ) +{ + + + FT_Error error; + FT_Library library; + FT_Face face; + FT_Long i; + char xlfd[BUFSIZ]; + + /* init number of ttf in ttc */ + ttcname->ttc_count = 0; + + /* Initialize engine */ + if ( ( error = FT_Init_FreeType( &library ) ) != 0 ) + { + panic( "Error while initializing engine" ); + return error; + } + + + /* Load face */ + error = FT_New_Face( library, path, (FT_Long) 0, &face ); + if ( error == FT_Err_Cannot_Open_Stream ) + { + panic( "Could not find/open font resource" ); + return error; + } + + ttcname->ttc_count = face->num_faces; + ttcname->ttf_name = malloc( sizeof(char*) * ttcname->ttc_count); + + for(i = 0; i < ttcname->ttc_count; i++) + { + error = FT_New_Face( library, path, i, &face ); + if ( error == FT_Err_Cannot_Open_Stream ) + panic( "Could not find/open font resource\n" ); + otf_get_english_string(face, BDFOTF_POSTSCRIPT_STRING, 0, xlfd, + sizeof(xlfd)); + ttcname->ttf_name[i] = malloc(sizeof(char) * (strlen(xlfd) + 1 )); + strcpy(ttcname->ttf_name[i], xlfd); + } + return 0; +} + +void print_ttc_table(char* path) +{ + struct ttc_table ttcname; + FT_Long i; + + get_ttc_table(path, &ttcname); + printf("ttc header count = %ld \n\n", ttcname.ttc_count); + printf("Encoding tables available in the true type collection\n\n"); + printf("INDEX\tPOSTSCRIPT NAME\n"); + printf("-----------------------------------------------------\n"); + for(i = 0; i < ttcname.ttc_count; i++) + { + printf("%ld\t%s\n", i, ttcname.ttf_name[i]); + } + for(i = 0; i < ttcname.ttc_count; i++) + { + free(ttcname.ttf_name[i]); + } + printf("\n\n"); + free(ttcname.ttf_name); + + return; +} + +FT_Long getcharindex(FT_Face face, FT_Long code) +{ + FT_Long idx; + if (nocmap) { + if (code >= face->num_glyphs) + idx = 0; + else + idx = code; + } else + idx = FT_Get_Char_Index( face, code); + + if ( idx <= 0 || idx > face->num_glyphs) + return 0; + else + return idx; +} + +int calculate_output_glyph_data(FT_GlyphSlot glyph, int *start_x) +{ + int ow, ow1, osx; + ow = glyph->bitmap.pitch; + if (ow == 0) + ow = glyph->metrics.horiAdvance >> 6; + ow1 = glyph->metrics.width >> 6; + ow = MAX(ow, ow1); + if (!ow) + return 0; + osx = glyph->metrics.horiBearingX >> 6; + osx = MAX(osx, 0); + ow += osx + between_chr; + if (!start_x) + return ow; + osx += between_chr >> 1; + *start_x = osx; + return ow; +} + +void convttf(char* path, FT_Long face_index) +{ + FT_Error error; + FT_Library library; + FT_Face face; + int w, h; + int row,col; + FT_Long charindex; + FT_Long index = 0; + FT_Long code; + FT_Long min_start_y; + FT_Long max_end_y; + FT_Long glyph_index[MAX_CHAR] = {0}; + FT_Size_RequestRec req = { + FT_SIZE_REQUEST_TYPE_REAL_DIM, + 0, + ((pixel_size - between_row) << 10), + 0, + 0 + }; + char char_name[16]; + int empty_glyphs[256] = {0}; + int glyph_buffer_size = 0; + unsigned char *glyph_buffer = NULL; + int got_default = 0; + int default_char; + +#if log_level > log_level_nolog + FILE *pTmplog; + char logfile[256]; + strcpy(logfile, basename(path)); + char log_suf[20]; + sprintf(log_suf, "_%d.log", pixel_size); + strcat(logfile, log_suf); + if ((pTmplog = fopen(logfile, "w")) == 0) { + fprintf(stderr, "unable to open temporary file '%s'.\n", + logfile); + return; + } + else + { + printf("log_file is %s\n\n", logfile); + } + +#endif + /* Initialize engine */ + if ( ( error = FT_Init_FreeType( &library ) ) != 0 ) + panic( "Error while initializing engine" ); + + /* Load face */ + error = FT_New_Face( library, path, (FT_Long) face_index, &face ); + if ( error == FT_Err_Cannot_Open_Stream ) + panic( "Could not find/open font resource" ); + else if ( error ) + panic( "Error while opening font resource" ); + + + setcharmap( face ); + /* create size */ + error = FT_Request_Size( face, &req ); + if ( error ) + panic( "Could not reset instance" ); + + printf("Please wait, converting %s to %s:\n",path,outfile); + + if ( limit_char == 0 ) limit_char = MAX_CHAR; + if ( limit_char > MAX_CHAR ) limit_char = MAX_CHAR; + + FT_Long char_count = 0; + + /* Set font header data */ + struct font_header_struct export_font; + export_font.header[0] = 'R'; + export_font.header[1] = 'B'; + export_font.header[2] = '1'; + export_font.header[3] = '2'; + + export_font.maxwidth = 0; + h = min_start_y = ((face->size->metrics.ascender + - face->size->metrics.descender + 63) >> 6); + max_end_y = 0; + /* + between_row; */ + export_font.ascent = (face->size->metrics.ascender + 63) >> 6; + export_font.depth = depth; + firstchar = limit_char; + lastchar = limit_char; + default_char = limit_char; +#if log_level >= log_level_header + fprintf(pTmplog, "limit_char=%ld\n", limit_char); + fprintf(pTmplog, "face->size->metrics.ascender>>6=%ld\n", + face->size->metrics.ascender>>6); + fprintf(pTmplog, "face->size->metrics.descender>>6=%ld\n", + face->size->metrics.descender>>6); + +#endif + + + /* decide common height, first_char and last_char, char_count */ + FT_Long tmp_count = 0; + printf("calculating height...\n"); fflush(stdout); + + error = FT_Load_Glyph( face, 0, (FT_LOAD_NO_BITMAP) ); + if (!error) + { + FT_Long glyph_height = face->glyph->metrics.height >> 6; + FT_Long start_y = export_font.ascent - face->glyph->bitmap_top; + FT_Long end_y = start_y + glyph_height; + if (glyph_height) + { + if (end_y > max_end_y) max_end_y = end_y; + if (start_y < min_start_y) min_start_y = start_y; + } + got_default = 1; + } + + for(code = start_char; code <= limit_char ; code++ ) + { + switch(code) + { + /* combining diacritical marks */ + case 0x0300: + code = 0x36f; + continue; + /* combining diacritical marks supplement */ + case 0x1dc0: + code = 0x1dff; + continue; + /* combining diacritical marks for symbols */ + case 0x20d0: + code = 0x20ff; + continue; + /* high surrogates */ + case 0xd800: + code = 0xdbff; + continue; + /* low surrogates */ + case 0xdc00: + code = 0xdfff; + continue; + /* combining half marks */ + case 0xfe20: + code = 0xfe2f; + continue; + } + /* Is there glyph of this code in this ttf? */ + charindex = getcharindex( face, code); + if ( !(charindex) ) goto check_default; + + printf("\t%3d%% \e[K\r", (int) (tmp_count++ + * 100 / face->num_glyphs) ); + fflush(stdout); + + error = FT_Load_Glyph( face, charindex, (FT_LOAD_RENDER | + FT_LOAD_NO_BITMAP) ); + if ( error ) goto check_default; + + /* Is this glyph available? */ + if (!(w = calculate_output_glyph_data(face->glyph, NULL))) + goto check_default; + + /* count this font */ + glyph_index[code] = charindex; + char_count++; + + /* decide height */ + FT_Long glyph_height = face->glyph->metrics.height >> 6; + FT_Long start_y = export_font.ascent - face->glyph->bitmap_top; + FT_Long end_y = start_y + glyph_height; + +#if log_level >= log_level_description1 + fprintf(pTmplog, "code=%ld\n", code); + fflush(pTmplog); +#endif + +#if log_level >= log_level_description2 + fprintf(pTmplog, "\t glyph_height =%ld \n", + (face->glyph->metrics.height) >> 6); + fprintf(pTmplog, "\t horiBearingY =%ld \n", + (face->glyph->metrics.horiBearingY >>6) ); + fprintf(pTmplog, "\t vertBearingY =%ld \n", + (face->glyph->metrics.vertBearingY >>6)); + fprintf(pTmplog, "\t vertAdvance =%ld \n", + (face->glyph->metrics.vertAdvance >>6)); + fprintf(pTmplog, "\t start_y =%ld \n", start_y); + fprintf(pTmplog, "\t height =%ld \n", + (face->glyph->metrics.height >> 6)); + fprintf(pTmplog, "\t end_y =%ld \n", end_y); + + if (face->glyph->bitmap_top != (face->glyph->metrics.horiBearingY >>6)) + fprintf(pTmplog, "\t bitmap_top =%d \n", + face->glyph->bitmap_top); + if (face->glyph->bitmap.rows != glyph_height) + fprintf(pTmplog, "\t bitmap.rows =%d \n", + face->glyph->bitmap.rows); + + fflush(pTmplog); +#endif + if (code < firstchar) firstchar = code; + lastchar = code; + if (end_y > max_end_y) max_end_y = end_y; + if (start_y < min_start_y) min_start_y = start_y; + continue; + check_default: + if (firstchar < limit_char && default_char == limit_char) + default_char = code; + } + min_start_y = MAX(min_start_y, 0); + max_end_y = MIN(max_end_y, h); + h = (max_end_y - min_start_y); + req.type = FT_SIZE_REQUEST_TYPE_SCALES; + req.height = req.width = face->size->metrics.x_scale + * (pixel_size - between_row) / h; + min_start_y = min_start_y * (pixel_size - between_row) / h; + h = export_font.height = pixel_size; + if (default_char == limit_char) + default_char = --firstchar; + error = FT_Request_Size( face, &req ); + if ( error ) + panic( "Could not reset instance" ); + export_font.ascent = face->size->metrics.ascender >> 6; + + export_font.height = h; + int extra_top = between_row >> 1; /* about half of between_row */ + printf("\t done.\t\n"); + printf("\t%ld glyphs are encoded in this source file according to a source" + " font property.\n", face->num_glyphs); + printf("\t%ld characters can be converted.\n", char_count); + printf("\tfirst character = %ld\n", firstchar); + printf("\tlast character = %ld\n", lastchar); + printf("\tdefault character = %d\n", default_char); + printf("\tline height = %d\n\n", h); + fflush(stdout); + +#if log_level >= log_level_header + fprintf(pTmplog, "requested size=%.2f\n", req.height / 64.0); + fprintf(pTmplog, "max_end_y=%ld\n", max_end_y); + fprintf(pTmplog, "min_start_y=%ld\n", min_start_y); + fprintf(pTmplog, "ascender - descender = %ld \n", + (face->size->metrics.ascender - face->size->metrics.descender)>>6); + fprintf(pTmplog, "h = %ld \n", (FT_Long) h); + fflush(pTmplog); +#endif + export_font.size = lastchar - firstchar + 1; + export_font.noffset = export_font.size; + export_font.nwidth = export_font.size; + export_font.defaultchar = default_char; + export_font.firstchar = firstchar; + uint32_t offsets[export_font.size]; + uint8_t widths[export_font.size]; + memset(offsets, 0, sizeof(offsets)); + memset(widths, 0, sizeof(widths)); + index = 0; + + fprintf(stderr,"converting font...\n"); fflush(stdout); + for( code = firstchar; code <= lastchar; code++) + { + printf("\t%3d%% \e[K\r", (int)((code - firstchar + 1) + * 100 / export_font.size)); + fflush(stdout); + offsets[code - firstchar] = offsets[default_char]; + widths[code - firstchar] = widths[default_char]; + if (!(charindex = glyph_index[code]) + && (!got_default || code != default_char)) + continue; + error = FT_Load_Glyph( face, charindex, + FT_LOAD_RENDER|FT_LOAD_NO_BITMAP ); + if (error) + continue; + if FT_HAS_GLYPH_NAMES(face) + FT_Get_Glyph_Name(face, charindex, char_name, 16); + else + char_name[0] = '\0'; + + FT_Bitmap *source = &face->glyph->bitmap; + int start_x; + if (!(w = calculate_output_glyph_data(face->glyph, &start_x))) + continue; + + export_font.maxwidth = MAX(w, export_font.maxwidth); + unsigned char* src = source->buffer; + unsigned char tmpbuf[w * h]; + memset(tmpbuf, 0xff, w * h); + FT_Long start_y = export_font.ascent - face->glyph->bitmap_top; + FT_Long glyph_height = face->glyph->metrics.height >> 6; + FT_Long glyph_width = face->glyph->metrics.width >> 6; + unsigned char *buf = tmpbuf; + int offset = extra_top + (start_y - min_start_y); + row = 0; + if (offset > 0) + buf += w * offset; + else + src += -offset * glyph_width; + int max_col = MIN(glyph_width, w - start_x); + int max_row = MIN(h - MAX(offset, 0), glyph_height + MIN(offset, 0)); + unsigned char *endbuf = buf + w * max_row; + if (glyph_height) + { + for(; buf < endbuf ; buf += w, src += glyph_width) + for(col=0; col < max_col; col++) + buf[col + start_x]= 0xff - src[col]; + } + else { + + if (!empty_glyphs[w]) + { + int glyph_size = (w * h + 1) / 2; + empty_glyphs[w] = index; + if (glyph_buffer_size < index + glyph_size) + if (!(glyph_buffer = realloc(glyph_buffer, + glyph_buffer_size += (glyph_size * 2 + 1023) & ~1023))) + panic("Failed to allocate memory for glyphs"); + memset(&glyph_buffer[index], 0xff, glyph_size); + index += glyph_size; + } + offsets[code - firstchar] = empty_glyphs[w]; + widths[code - firstchar] = w; + continue; + } + offsets[code - firstchar] = index; + widths[code - firstchar] = w; + int i; + int field = 0; + buf = tmpbuf; + int glyph_size = (w * h + 1) / 2; + if (glyph_buffer_size < index + glyph_size) + if (!(glyph_buffer = realloc(glyph_buffer, glyph_buffer_size + += (glyph_size * 2 + 1023) & ~1023))) + panic("Failed to allocate memory for glyphs"); + for (i = 0; i < w * h; i++) + { + int subcol = i % 2; + unsigned char pixel = ((unsigned)(*buf++) + 8) / 17; + field |= pixel << (subcol << 2); + if (i % 2) + { + glyph_buffer[index++] = field; + field = 0; + } + } + + if (i % 2) + glyph_buffer[index++] = field; + } + printf("\t done.\t\n"); + export_font.nbits = index; + int n; + FILE *file = fopen(outfile, "w"); + n = fwrite(&export_font, 1, sizeof(struct font_header_struct), file); + /* This prevents valgrind from triggering on the write from uninitialized + * memory. + */ + memset(glyph_buffer + index, 0, glyph_buffer_size - index); + n = fwrite(glyph_buffer, 1, (index + 3) & ~3, file); + int offsets_size = export_font.noffset * 4; + if ( index < 0xFFDB ) + { + uint16_t * short_offsets = (uint16_t *)offsets; + int i; + for (i = 0; i < export_font.noffset; i++) + short_offsets[i] = offsets[i]; + offsets_size /= 2; + } + n = fwrite(offsets, 1, offsets_size, file); + n = fwrite(widths, 1, export_font.nwidth, file); + fclose(file); +#if log_level > log_level_nolog + fclose(pTmplog); +#endif +} + +void convttc(char* path) +{ + struct ttc_table ttcname; + FT_Long i; + + get_ttc_table(path, &ttcname); + + if (ttcname.ttc_count == 0) + { + printf("This file is a not true type font.\n"); + return; + } + + /* defalut */ + if (!flg_all_ttc && + ttc_index == -1) + { + if (!oflag) + { + printf("path: %s\n", path); + sprintf(outfile, "%d-%s.fnt", pixel_size, basename(path)); + } + convttf(path, (FT_Long) 0); + } + + /* set face_index of ttc */ + else if (!flg_all_ttc) + { + print_ttc_table(path); + if ( !oflag ) + { + if (ttc_index >= 0 && + ttc_index < ttcname.ttc_count) + { + if (strcmp(ttcname.ttf_name[ttc_index], "") != 0) + { + sprintf(outfile, "%d-%s.fnt", pixel_size, + ttcname.ttf_name[ttc_index]); + } + else + { + sprintf(outfile, "%d-%s-%ld.fnt", + pixel_size,basename(path),ttc_index); + } + } + else + { + printf("illegal face index of ttc.\n"); + } + } + convttf(path, ttc_index); + } + else { /* convert all fonts */ + print_ttc_table(path); + for(i = 0; i < ttcname.ttc_count; i++) + { + convttf(path, i); + sprintf(outfile, "%d-%s.fnt", pixel_size, ttcname.ttf_name[i]); + } + } + + for(i = 0; i < ttcname.ttc_count; i++) + { + free(ttcname.ttf_name[i]); + } + free(ttcname.ttf_name); +} + + + +/* parse command line options*/ +void getopts(int *pac, char ***pav) +{ + char *p; + char **av; + int ac; + ac = *pac; + av = *pav; + + limit_char = MAX_CHAR; + start_char = 0; + + while (ac > 0 && av[0][0] == '-') { + p = &av[0][1]; + while( *p) + switch(*p++) { + case 'h':case 'H': + usage(); + break; + case ' ': /* multiple -args on av[]*/ + while( *p && *p == ' ') + p++; + if( *p++ != '-') /* next option must have dash*/ + p = ""; + break; /* proceed to next option*/ + case 'o':case 'O': /* set output file*/ + oflag = 1; + if (*p) { + strcpy(outfile, p); + while (*p && *p != ' ') + p++; + } + else { + av++; ac--; + if (ac > 0) + strcpy(outfile, av[0]); + } + break; + case 'l':case 'L': /* set encoding limit*/ + if (*p) { + limit_char = atoi(p); + while (*p && *p != ' ') + p++; + } + else { + av++; ac--; + if (ac > 0) + limit_char = atoi(av[0]); + } + break; + case 's':case 'S': /* set encoding start*/ + if (*p) { + start_char = atol(p); + while (*p && *p != ' ') + p++; + } + else { + av++; ac--; + if (ac > 0) + start_char = atol(av[0]); + } + break; + case 'p':case 'P': /* set pixel size*/ + if (*p) { + pixel_size = atoi(p); + while (*p && *p != ' ') + p++; + } + else { + av++; ac--; + if (ac > 0) + pixel_size = atoi(av[0]); + } + break; + case 'c':case 'C': /* set spaece between characters */ + if (*p) { + between_chr = atoi(p); + while (*p && *p != ' ') + p++; + } + else { + av++; ac--; + if (ac > 0) + between_chr = atoi(av[0]); + } + break; + case 'r':case 'R': /* set spaece between rows */ + if (*p) { + between_row = atoi(p); + while (*p && *p != ' ') + p++; + } + else { + av++; ac--; + if (ac > 0) + between_row = atoi(av[0]); + } + break; + case 't':case 'T': /* display ttc table */ + if (*p == 't' || *p == 'T') { + pct = 1; + while (*p && *p != ' ') + p++; + } + + else if (*p == 'a' || *p == 'A') { + flg_all_ttc = 1; + while (*p && *p != ' ') + p++; + } + + else if (*p) { + ttc_index = atoi(p); + while (*p && *p != ' ') + p++; + } + else { + av++; ac--; + if (ac > 0) + ttc_index = atoi(av[0]); + } + break; + + default: + fprintf(stderr, "Unknown option ignored: %c\r\n", *(p-1)); + } + ++av; --ac; + } + *pac = ac; + *pav = av; +} + + +int main(int ac, char **av) +{ + int ret = 0; + + ++av; --ac; /* skip av[0]*/ + + getopts(&ac, &av); /* read command line options*/ + + if (ac < 1) + { + usage(); + } + if (oflag) + { + if (ac > 1) + { + usage(); + } + } + + if (limit_char < start_char) + { + usage(); + exit(0); + } + + while (pct && ac > 0) + { + print_ttc_table(av[0]); + ++av; --ac; + exit(0); + } + + while (ac > 0) + { + convttc(av[0]); + ++av; --ac; + } + + exit(ret); +} + + + +/* + * Trie node structure. + */ +typedef struct { + unsigned short key; /* Key value. */ + unsigned short val; /* Data for the key. */ + unsigned long sibs; /* Offset of siblings from trie beginning. */ + unsigned long kids; /* Offset of children from trie beginning. */ +} node_t; + +/* + * The trie used for remapping codes. + */ +static node_t *nodes; +static unsigned long nodes_used = 0; + +int +otf2bdf_remap(unsigned short *code) +{ + unsigned long i, n, t; + unsigned short c, codes[2]; + + /* + * If no mapping table was loaded, then simply return the code. + */ + if (nodes_used == 0) + return 1; + + c = *code; + codes[0] = (c >> 8) & 0xff; + codes[1] = c & 0xff; + + for (i = n = 0; i < 2; i++) { + t = nodes[n].kids; + if (t == 0) + return 0; + for (; nodes[t].sibs && nodes[t].key != codes[i]; t = nodes[t].sibs); + if (nodes[t].key != codes[i]) + return 0; + n = t; + } + + *code = nodes[n].val; + return 1; +} diff --git a/tools/root.make b/tools/root.make index 5ba321c95..0d2dcd2fc 100644 --- a/tools/root.make +++ b/tools/root.make @@ -20,7 +20,8 @@ PPCFLAGS = $(filter-out -Dmain=SDL_main,$(CFLAGS)) # cygwin sdl-config fix TOOLS = $(TOOLSDIR)/rdf2binary $(TOOLSDIR)/convbdf \ $(TOOLSDIR)/codepages $(TOOLSDIR)/scramble $(TOOLSDIR)/bmp2rb \ - $(TOOLSDIR)/uclpack $(TOOLSDIR)/mktccboot $(TOOLSDIR)/mkboot + $(TOOLSDIR)/uclpack $(TOOLSDIR)/mktccboot $(TOOLSDIR)/mkboot \ + $(TOOLSDIR)/convttf ifeq (,$(PREFIX)) diff --git a/tools/tools.make b/tools/tools.make index e0337748c..d17212756 100644 --- a/tools/tools.make +++ b/tools/tools.make @@ -1,9 +1,9 @@ -# __________ __ ___. +# __________ __ ___. # Open \______ \ ____ ____ | | _\_ |__ _______ ___ -# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / -# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < # Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ -# \/ \/ \/ \/ \/ +# \/ \/ \/ \/ \/ # $Id$ # @@ -34,6 +34,11 @@ $(TOOLSDIR)/uclpack: $(TOOLSDIR)/ucl/uclpack.c $(wildcard $(TOOLSDIR)/ucl/src/*. $(call PRINTS,CC $(@F))$(HOSTCC) $(TOOLSCFLAGS) -I$(TOOLSDIR)/ucl \ -I$(TOOLSDIR)/ucl/include -o $@ $^ +$(TOOLSDIR)/convttf: $(TOOLSDIR)/convttf.c + $(call PRINTS,CC $(@F)) + $(SILENT)$(HOSTCC) $(TOOLSFLAGS) -std=gnu89 -O -Wall -g $+ -o $@ \ + `freetype-config --libs` `freetype-config --cflags` + # implicit rule for simple tools $(TOOLSDIR)/%: $(TOOLSDIR)/%.c $(call PRINTS,CC $(subst $(ROOTDIR)/,,$@)) -- 2.11.4.GIT From 208e29d4d60bd3c843eba61d417fbe539d0cf023 Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Sat, 29 Aug 2009 13:00:24 +0200 Subject: [PATCH 16/16] FS#8961 - Anti-Aliased Fonts. --- firmware/drivers/lcd-16bit.c | 252 +++++++++++++++++++++++++++++++++++ firmware/drivers/lcd-bitmap-common.c | 10 +- firmware/export/font.h | 3 +- firmware/font.c | 20 ++- 4 files changed, 275 insertions(+), 10 deletions(-) diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c index 7238d7a92..c04d04325 100644 --- a/firmware/drivers/lcd-16bit.c +++ b/firmware/drivers/lcd-16bit.c @@ -804,6 +804,258 @@ void lcd_mono_bitmap(const unsigned char *src, int x, int y, int width, int heig lcd_mono_bitmap_part(src, 0, 0, width, x, y, width, height); } +/* draw alpha bitmap for anti-alias font */ +#define ALPHA_COLOR_FONT_DEPTH 2 +#define ALPHA_COLOR_LOOKUP_SHIFT (1 << ALPHA_COLOR_FONT_DEPTH) +#define ALPHA_COLOR_LOOKUP_SIZE ((1 << ALPHA_COLOR_LOOKUP_SHIFT) - 1) +#define ALPHA_COLOR_PIXEL_PER_BYTE (8 >> ALPHA_COLOR_FONT_DEPTH) +#define ALPHA_COLOR_PIXEL_PER_WORD (32 >> ALPHA_COLOR_FONT_DEPTH) +#ifdef CPU_ARM +#define BLEND_INIT do {} while (0) +#define BLEND_START(acc, color, alpha) \ + asm volatile("mul %0, %1, %2" : "=&r" (acc) : "r" (color), "r" (alpha)) +#define BLEND_CONT(acc, color, alpha) \ + asm volatile("mla %0, %1, %2, %0" : "+&r" (acc) : "r" (color), "r" (alpha)) +#define BLEND_OUT(acc) do {} while (0) +#elif defined(CPU_COLDFIRE) +#define ALPHA_BITMAP_READ_WORDS +#define BLEND_INIT coldfire_set_macsr(EMAC_UNSIGNED) +#define BLEND_START(acc, color, alpha) \ + asm volatile("mac.l %0, %1, %%acc0" :: "%d" (color), "d" (alpha)) +#define BLEND_CONT BLEND_START +#define BLEND_OUT(acc) asm volatile("movclr.l %%acc0, %0" : "=d" (acc)) +#else +#define BLEND_INIT do {} while (0) +#define BLEND_START(acc, color, alpha) ((acc) = (color) * (alpha)) +#define BLEND_CONT(acc, color, alpha) ((acc) += (color) * (alpha)) +#define BLEND_OUT(acc) do {} while (0) +#endif + +/* Blend the given two colors */ +static inline unsigned blend_two_colors(unsigned c1, unsigned c2, unsigned a) +{ + a += a >> (ALPHA_COLOR_LOOKUP_SHIFT - 1); +#if (LCD_PIXELFORMAT == RGB565SWAPPED) + c1 = swap16(c1); + c2 = swap16(c2); +#endif + unsigned c1l = (c1 | (c1 << 16)) & 0x07e0f81f; + unsigned c2l = (c2 | (c2 << 16)) & 0x07e0f81f; + unsigned p; + BLEND_START(p, c1l, a); + BLEND_CONT(p, c2l, ALPHA_COLOR_LOOKUP_SIZE + 1 - a); + BLEND_OUT(p); + p = (p >> ALPHA_COLOR_LOOKUP_SHIFT) & 0x07e0f81f; + p |= (p >> 16); +#if (LCD_PIXELFORMAT == RGB565SWAPPED) + return swap16(p); +#else + return p; +#endif +} + +/* Blend the given color with the value from the alpha_color_lookup table */ +static inline unsigned blend_color(unsigned c, unsigned a) +{ + return blend_two_colors(c, current_vp->fg_pattern, a); +} + +void ICODE_ATTR lcd_alpha_bitmap_part(const unsigned char *src, int src_x, + int src_y, int stride, int x, int y, + int width, int height) +{ + fb_data *dst, *backdrop; + unsigned dmask = 0x00000000; + int drmode = current_vp->drawmode; + /* nothing to draw? */ + if ((width <= 0) || (height <= 0) || (x >= current_vp->width) || + (y >= current_vp->height) || (x + width <= 0) || (y + height <= 0)) + return; + + /* initialize blending */ + BLEND_INIT; + + /* clipping */ + if (x < 0) + { + width += x; + src_x -= x; + x = 0; + } + if (y < 0) + { + height += y; + src_y -= y; + y = 0; + } + if (x + width > current_vp->width) + width = current_vp->width - x; + if (y + height > current_vp->height) + height = current_vp->height - y; + + if (drmode & DRMODE_INVERSEVID) + { + dmask = 0xffffffff; + drmode &= DRMODE_SOLID; /* mask out inversevid */ + } + if (drmode == DRMODE_BG) + { + dmask = ~dmask; + } + + dst = LCDADDR(current_vp->x + x, current_vp->y + y); + + int col, row = height; + unsigned data, pixels; + unsigned skip_end = (stride - width); + unsigned skip_start = src_y * stride + src_x; + +#ifdef ALPHA_BITMAP_READ_WORDS + uint32_t *src_w = (uint32_t *)((uintptr_t)src & ~3); + skip_start += ALPHA_COLOR_PIXEL_PER_BYTE * ((uintptr_t)src & 3); + src_w += skip_start / ALPHA_COLOR_PIXEL_PER_WORD; + data = letoh32(*src_w++) ^ dmask; +#else + src += skip_start / ALPHA_COLOR_PIXEL_PER_BYTE; + data = *src ^ dmask; +#endif + pixels = skip_start % ALPHA_COLOR_PIXEL_PER_WORD; + data >>= pixels * ALPHA_COLOR_LOOKUP_SHIFT; +#ifdef ALPHA_BITMAP_READ_WORDS + pixels = 8 - pixels; +#endif + + do + { + col = width; +#ifdef ALPHA_BITMAP_READ_WORDS +#define UPDATE_SRC_ALPHA do { \ + if (--pixels) \ + data >>= ALPHA_COLOR_LOOKUP_SHIFT; \ + else \ + { \ + data = letoh32(*src_w++) ^ dmask; \ + pixels = ALPHA_COLOR_PIXEL_PER_WORD; \ + } \ + } while (0) +#elif ALPHA_COLOR_PIXEL_PER_BYTE == 2 +#define UPDATE_SRC_ALPHA do { \ + if (pixels ^= 1) \ + data >>= ALPHA_COLOR_LOOKUP_SHIFT; \ + else \ + data = *(++src) ^ dmask; \ + } while (0) +#else +#define UPDATE_SRC_ALPHA do { \ + if (pixels = (++pixels % ALPHA_COLOR_PIXEL_PER_BYTE)) \ + data >>= ALPHA_COLOR_LOOKUP_SHIFT; \ + else \ + data = *(++src) ^ dmask; \ + } while (0) +#endif + /* we don't want to have this in our inner + * loop and the codesize increase is minimal */ + switch (drmode) + { + case DRMODE_COMPLEMENT: + do + { + *dst=blend_two_colors(*dst, ~(*dst), + data & ALPHA_COLOR_LOOKUP_SIZE ); + dst++; + UPDATE_SRC_ALPHA; + } + while (--col); + break; + case DRMODE_BG: + if(lcd_backdrop) + { + backdrop = (fb_data *)((long)dst+lcd_backdrop_offset); + do + { + *dst=blend_two_colors(*dst, *(backdrop++), + data & ALPHA_COLOR_LOOKUP_SIZE ); + dst++; + UPDATE_SRC_ALPHA; + } + while (--col); + } + else + { + do + { + *dst=blend_two_colors(*dst, current_vp->bg_pattern, + data & ALPHA_COLOR_LOOKUP_SIZE ); + dst++; + UPDATE_SRC_ALPHA; + } + while (--col); + } + break; + case DRMODE_FG: + do + { + *dst=blend_color(*dst, data & ALPHA_COLOR_LOOKUP_SIZE ); + dst++; + UPDATE_SRC_ALPHA; + } + while (--col); + break; + case DRMODE_SOLID: + if(lcd_backdrop) + { + backdrop = (fb_data *)((long)dst+lcd_backdrop_offset); + do + { + *(dst++)=blend_color(*(backdrop++), + data & ALPHA_COLOR_LOOKUP_SIZE ); + UPDATE_SRC_ALPHA; + } + while (--col); + } + else + { + do + { + *(dst++)=blend_color(current_vp->bg_pattern, + data & ALPHA_COLOR_LOOKUP_SIZE ); + UPDATE_SRC_ALPHA; + } + while (--col); + } + break; + } +#ifdef ALPHA_BITMAP_READ_WORDS + if (skip_end < pixels) + { + pixels -= skip_end; + data >>= skip_end * ALPHA_COLOR_LOOKUP_SHIFT; + } else { + pixels = skip_end - pixels; + src_w += pixels / ALPHA_COLOR_PIXEL_PER_WORD; + pixels %= ALPHA_COLOR_PIXEL_PER_WORD; + data = letoh32(*src_w++) ^ dmask; + data >>= pixels * ALPHA_COLOR_LOOKUP_SHIFT; + pixels = 8 - pixels; + } +#else + if (skip_end) + { + pixels += skip_end; + if (pixels >= ALPHA_COLOR_PIXEL_PER_BYTE) + { + src += pixels / ALPHA_COLOR_PIXEL_PER_BYTE; + pixels %= ALPHA_COLOR_PIXEL_PER_BYTE; + data = *src ^ dmask; + data >>= pixels * ALPHA_COLOR_LOOKUP_SHIFT; + } else + data >>= skip_end * ALPHA_COLOR_LOOKUP_SHIFT; + } +#endif + dst += LCD_WIDTH - width; + } while (--row); +} + /* Draw a partial native bitmap */ void ICODE_ATTR lcd_bitmap_part(const fb_data *src, int src_x, int src_y, int stride, int x, int y, int width, diff --git a/firmware/drivers/lcd-bitmap-common.c b/firmware/drivers/lcd-bitmap-common.c index c1efd9097..775b56bb3 100644 --- a/firmware/drivers/lcd-bitmap-common.c +++ b/firmware/drivers/lcd-bitmap-common.c @@ -102,8 +102,14 @@ static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str) bits = font_get_bits(pf, ch); - LCDFN(mono_bitmap_part)(bits, ofs, 0, width, x, y, width - ofs, - pf->height); +#if defined(MAIN_LCD) && defined(HAVE_LCD_COLOR) + if (pf->depth) + lcd_alpha_bitmap_part(bits, ofs, 0, width, x, y, width - ofs, + pf->height); + else +#endif + LCDFN(mono_bitmap_part)(bits, ofs, 0, width, x, y, width - ofs, + pf->height); x += width - ofs; ofs = 0; diff --git a/firmware/export/font.h b/firmware/export/font.h index d17fa18b8..f8a4589c3 100644 --- a/firmware/export/font.h +++ b/firmware/export/font.h @@ -79,7 +79,7 @@ enum { * USHORT maxwidth 2 font max width in pixels * USHORT height 2 font height in pixels * USHORT ascent 2 font ascent (baseline) in pixels - * USHORT pad 2 unused, pad to 32-bit boundary + * USHORT depth 2 depth of the font, 0=1-bit and 1=4-bit * ULONG firstchar 4 first character code in font * ULONG defaultchar 4 default character code in font * ULONG size 4 # characters in font @@ -103,6 +103,7 @@ struct font { int ascent; /* ascent (baseline) height*/ int firstchar; /* first character in bitmap*/ int size; /* font size in glyphs*/ + int depth; /* depth of the font, 0=1-bit and 1=4-bit */ const unsigned char *bits; /* 8-bit column bitmap data*/ const unsigned short *offset; /* offsets into bitmap data*/ const unsigned char *width; /* character widths or NULL if fixed*/ diff --git a/firmware/font.c b/firmware/font.c index e02f276ef..46502328e 100644 --- a/firmware/font.c +++ b/firmware/font.c @@ -68,7 +68,7 @@ static struct font_cache font_cache_ui; static int fnt_file = -1; /* >=0 if font is cached */ static uint32_t file_width_offset; /* offset to file width data */ static uint32_t file_offset_offset; /* offset to file offset data */ -static void cache_create(int maxwidth, int height); +static void cache_create(int maxwidth, int height, int depth); static int long_offset = 0; static int glyph_file; /* End Font cache structures */ @@ -139,7 +139,7 @@ static struct font* font_load_header(struct font *pf) pf->maxwidth = readshort(); pf->height = readshort(); pf->ascent = readshort(); - fileptr += 2; /* Skip padding */ + pf->depth = readshort(); pf->firstchar = readlong(); pf->defaultchar = readlong(); pf->size = readlong(); @@ -279,7 +279,7 @@ static struct font* font_load_cached(struct font* pf) fileptr = oldfileptr; /* Create the cache */ - cache_create(pf->maxwidth, pf->height); + cache_create(pf->maxwidth, pf->height, pf->depth); return pf; } @@ -418,23 +418,29 @@ load_cache_entry(struct font_cache_entry* p, void* callback_data) } else { - bitmap_offset = ((pf->height + 7) / 8) * p->width * char_code; + bitmap_offset = pf->depth + ? (pf->height * p->width + 1) / 2 * char_code + : ((pf->height + 7) / 8) * p->width * char_code; } int32_t file_offset = FONT_HEADER_SIZE + bitmap_offset; lseek(fnt_file, file_offset, SEEK_SET); - int src_bytes = p->width * ((pf->height + 7) / 8); + int src_bytes = pf->depth + ? (pf->height * p->width + 1) / 2 + : p->width * ((pf->height + 7) / 8); read(fnt_file, p->bitmap, src_bytes); } /* * Converts cbuf into a font cache */ -static void cache_create(int maxwidth, int height) +static void cache_create(int maxwidth, int height, int depth) { /* maximum size of rotated bitmap */ - int bitmap_size = maxwidth * ((height + 7) / 8); + int bitmap_size = depth + ? (maxwidth * height + 1) / 2 + : maxwidth * ((height + 7) / 8); /* Initialise cache */ font_cache_create(&font_cache_ui, mbuf, MAX_FONT_SIZE, bitmap_size); -- 2.11.4.GIT