From 65b4aae61eb473fff935928b9818b206daaf2e57 Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Sun, 16 Sep 2007 18:46:39 +0000 Subject: [PATCH] Sudoku: Optionally display coloured numbers on colour targets. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14730 a1c6a512-1295-4272-9138-f99709370657 --- .../native/sudoku_inverse.128x128x16.bmp | Bin 2278 -> 3080 bytes .../native/sudoku_inverse.160x128x16.bmp | Bin 4376 -> 8696 bytes .../native/sudoku_inverse.220x176x16.bmp | Bin 7736 -> 15416 bytes .../native/sudoku_inverse.320x240x16.bmp | Bin 6838 -> 12600 bytes .../native/sudoku_normal.128x128x16.bmp | Bin 2278 -> 6056 bytes .../native/sudoku_normal.160x128x16.bmp | Bin 4376 -> 8696 bytes .../native/sudoku_normal.220x176x16.bmp | Bin 7736 -> 15416 bytes .../native/sudoku_normal.320x240x16.bmp | Bin 6838 -> 34616 bytes .../native/sudoku_start.128x128x16.bmp | Bin 2278 -> 6056 bytes .../native/sudoku_start.160x128x16.bmp | Bin 4376 -> 8696 bytes .../native/sudoku_start.220x176x16.bmp | Bin 7736 -> 15416 bytes .../native/sudoku_start.320x240x16.bmp | Bin 6838 -> 34616 bytes apps/plugins/sudoku/sudoku.c | 156 +++++++++++++----- 13 files changed, 117 insertions(+), 39 deletions(-) diff --git a/apps/plugins/bitmaps/native/sudoku_inverse.128x128x16.bmp b/apps/plugins/bitmaps/native/sudoku_inverse.128x128x16.bmp index 4a21aa81d8a0781e95733051fdb5f9fa41a915e7..69e6eabf3c78b2ec9fbf8ad6d14b6cd4adddbd8c 100644 GIT binary patch literal 3080 zcmds%byQSa6o)?$1q2JR#SX+SEEGjiK|wJPTNLcVR_qQ8(#FIV6%%a5#=`Ex1UmqG z?wz?Ij^JDG{q<(8d*(ZPpZ(jveeSGra4|7Q{MZ_SwT3J;kC)~#z(kD48iR$I_7MZR z#lXM-LqkK-rAvpAkrCX_5V`5^0si`R$GiJoh%nWmLb24ShMCQzy$&w`t zS+iy(TefUiSXhufdv+`>EyeZ=HqXso=)}&Ug zTG-jyQM-0+>eQ)&y}dnk>(-@Sy?Qt}I8eWSeHt`qfTN=$4I4J3QKLpQZrm6rCnubp zooUjf2~C?e#l^)1S65e>HETxm=FM?)bE8Fz7PM^Hl2)x+(YkeO+}+)2)20m`9v-x9 z+m?3i+R?s!dpdOJK*x?9>C~wcojZ4?OP4NqdV12eYgf8;>xP$?7vA39bno7s9zA-{ zvu96w_3B0M-o5G5rw@Jm_N8CHe)R9(p8*2~FmT{Ne0+QuG-wcm2M=b*kRc2mI+S6< zhB18ja7K(6!N`##88vDYzP`SU9zB{dW5zIc>{!N)8^`$ZC>4pV+J#4&SciCS@`++F?;rG=FFMH+_`g^H*X&P{{9361P~Y) zNKjA^!NI|VgoH4E{(KfJSir)C3t6;i5sMcuX33HzEM2;k(9lqpEnCL&<;z*IVg)N# zu4L7!RjgjUny|1i)~s2>+O=z0w{9Kl*RN;8h7D}oxRFhpHnDm0X2Qe6*|KE|Teogy z+qP{)L`1NC`*wEh*ul=7JK42s7rS@wX3w5IL`Fsu6&1zay?fcWZy)>j@8`gQ0~|bf zkVA(Karp3IjvP6{(W6I+j*jNov11%Rew-60PH^(%Nlu+Q#p%?_3BlwUAxBh>({w);|4cx-sIM;Tim{V zn>%;zaQE(A?%lh`{rmTM@ZbRtA3o&KqesNW#qs#@W1c*D!qcZudG_oX&!0c%#fulj z$H$Y9kig5AFM0Lq6|Y~v=FOWoynXwYckkZu{{4GCeE7h}k01H;=@W^Gi6kW@k(`{& z=g*({^5qL(zkcQ0w{Lv^{+%B`eyINj)T~MAatdkkQcz7OB3cqEQjoCM##AKq6VIs@ zJ?8|Q;t4@QBDL4lSgDXn%St(313I5=Tj~=sPFtiC)Cc@?2>StEtg?l~uIczgU$D zne@%^Cqq(Wd0v%@2LDv1o=7$+lxj;9l9PV{dhbiF(|OU;L!4JUr;zX>?O|f8>Y)^11DeEJ> KeWil`-Se)8)z!Dqc_u|9~VED zC08q)!AGbbr=?EmR}WD;e*CyK=mszW4gi;iqmzwkZelvyPIVfgr;V9_` y?>oas;JNbMPmtbuclA|D6H= diff --git a/apps/plugins/bitmaps/native/sudoku_inverse.160x128x16.bmp b/apps/plugins/bitmaps/native/sudoku_inverse.160x128x16.bmp index ce6d88d24e3f72259e5093600344c877fe0151b7..8ea9cdec441ff1ee1a2d808fdeb351a690f76fa7 100644 GIT binary patch literal 8696 zcmeH^O-{o=428o5ShHov2{-_I?!)=uQtXOVOHWTP9>*oqbke3$NB;Td#eVbg`TIJZ zfA4m_+5g4I|PrCVXTDFDsr%x}`-ON9ri`ZwLIMoT0rrBUeU9D+4bw0DL1)WxG0qi;2#b zjE&J{FE{`}Y+(U+J?3sQfMBh=jP+tnv%6F-=-r&*O>Z9az!rz|EHbjMq^>DNNt5q} zEfja5<3rjRTEWF4BZ6?l0<;itm%lZybH%T7WghosFmNa<-H@42I8LQ9@Lrh8ThtkU zqt@l|Oo7?0}+Sj1zr5X>1!t!G#&{E!#@Lv|(%q}DUJ!e(7;o%p=S$X!W& z7b!{_?t5p9uahrTVa%&sBs4s9cn~Sx8nFzFItRjxmhz~GWk}RH2pK6#>er<>Pb*l3 zG35$YVeU^#wwBZ%MT(O4W#F)X#ZK3k6Wwqafd@%t=5VzNfT?2g1ty8f2F&?DIsVCVJQ9-w*f}T1vor$5R3<-QnLIgx*?V$<;DpHu zqTZ7yaH<1w0$2>9UV8FbZbhgb`^gt%IVaEOw+Hf_z-kSc`9bzgbZ|m3zMijf@&tZA zpfZoieiCv(<3c7Y2mp;0$^mNQnXDiz4YVGl)gENbL;_(oHs56WZ!QDp6=kr4=b!1BGDJQYZwX!N9hG_7Xf4i=aJv z(waQHcxY^`D0nEe9(oHD&&^3Zc!(Dfs-;yb^dkCZ(?h|9xBt(~?*H$-KU4EB_sp@J4cU4jSRzyP)NGREw zVxkcixUP(&p$g0>1uQ8%4hn2D|DlvH(V4`EcN{mo4i>#7tTVRaCJw!mSdIuJefb)z zWqo;6d?nP0rmqZ5Enq+`v0({Is)KE{i2bmEBQ=jcZ64EF4vQMgX)G6IIc*BIC}7M^ zv!%ok>j=CPspD9{N8v~T=;|o&KY=S9MNBZ>J6^AFE#EF1_Mik>DUWq}dBh`K2- zr;p>Au*iYmF<<9-iwGHIDI;g(t95||Bab_(fwzoJqlCZ2fWM3$)npWS=+EN0zkr6n zgngo~QyS&CzV4bSY*4`l*IzrG>Q#Z>z+_D^kPXnI06ij_fq8N@u`7Cy^`>3!4}$$@ zk?;LruBL=&oxq!54%%j+qK802EKRYVTLNMU2>R@L$6&~?ff$?hEE|EzD9ct z%!H-o0=2NT$H6Z`T6?~m(`NnK-9^{Vr;K%8!M51Y3Q;%X7e4!qsS}i~N2FYq6BOwZ<)}{Zp&}CEmU!m*eeG%l323 z7vpS4wBl@M7hUgKx{W`&DVd%~SMBuXs{KWgn*VqAq|;~kTc}+jbTZvY@B$=eU2cPR R3dv-8Gnwr1y-Fv2{{RmhLu&v4 delta 452 zcmXYt&ubG=6ooTM^V%5`r%9YRbu?{kHMKvSw8bJQM1*2Cno z`xw6Nir`LgQ*05sa_7c{18yo7vE3{F17f{Reehkl=kd-x_Z@B=KAd{|^nNMPJM&V< zg+bx9U?g0ri9}NFKc~-O%P4l&G_yvVxN2f0>+B~(+NqFc(c?+q0zdmA{29gjwC>h2 zY^i7X{hHsx-hifN&hfbDCmDn`-Honf@ofeNu6T}lTd-5X7ruaRdlD!HUD$@a{(~-Pa pyuG_X!`HnpajGGkIhR+t{CR&cJ9A=)VE-3vmhP<{c=I<>{{RpPl@$O0 diff --git a/apps/plugins/bitmaps/native/sudoku_inverse.320x240x16.bmp b/apps/plugins/bitmaps/native/sudoku_inverse.320x240x16.bmp index faf0616280271943043e1db0fc97169c9b3b3e40..e6d69bc58168f877ebbe865f32c007d84e7ed295 100644 GIT binary patch delta 755 zcmXBRKWGzS9LDi$xVv2b|GC^Hib_O>C{6BtlcwzuMa0HIVjbE}7K$J^H0q$xMd?t3 zL)GE~0g;prtreu&5*l18E|nrxmnu34g(5C(Z3jUR!6!-J!}q=4@ZP;|8u`~(#Mx4> zR9e4oRZ&u03EHC$#c0i4X+??p+7x9;oK|s07r3q_NT5Q~)KI&z!EUQ3(XYCpX(?Em zKw5Kfj=fB`Xp&|%i52!UyGw38i=+A@j2mNE)NQ=f9jx*l-|08kez(AJD!3&E*)m&k zJE(EJOdse6{Ughe$QS}eBa0E^8D_jw&^-wfIO37$Vf)!@>^S>`U1HzU7T15-m{*|F zdjc0#1AX2U2Kij3d)^n^Zyt`%L6L@i0=MY_&Cv>H8|=1ELh}n8raYDCs$b$RTV-F- znm>mv|77dTHv%@w0q##VS`PGJBOtNEwH9=6DA>GH9bIfO$a4h+#)2c5qOZXWcKNJ_ z-XR%!j`h&Z)_1Rm?xPUSVkn%!Xjot(EK#Eded6=auzVbmI6zst5SeXV)vt(+od{nW z<>ynLO3_}FqYftMX*7*R&emv?{zSVFGn-fCMkjm9lo&D{luaJT%wfiyYwgK{lR0Lt-ml>k{ie;?5<0WIn_Lq}hZQ!cMg1`6pqYr^AvGfkpP7S* z#tqYr3f@MmIE!jrvrf%vY*2eH&Kcg|$hI-G1vlg>LBs3EuBzc&Rj?)tXh{smBDj#J z*wKP7+Qx`kF~4FE-^W%WhHk>fAR+jZ&~TF)FX=ET_`w|0YHFFiKHzAcz2@1A+%)$? z4X=rQx&kY+i02tWn~v!slfa@=LetUcItoLF=bXvR2dHObc%QY=&+^~18ljxVBihf^ xaG6`ivwRJ`d1jZ{IQUJ&dRCTF?xB6nVtlckdB!FpM+P2F<*z32b{ diff --git a/apps/plugins/bitmaps/native/sudoku_normal.128x128x16.bmp b/apps/plugins/bitmaps/native/sudoku_normal.128x128x16.bmp index ce2dec5b9dc736640434bd73b435ecaf13222b91..d8483eb870fa481c31c0528303d57e0560f5396a 100644 GIT binary patch literal 6056 zcmeHGyG{c^3|wgG5E6U>4J{oF1qBkK9Pi)p`E0iMoBP#O@$6%Bck3BWvnRyCtog&8wrt=0--9QzRGOm-CTw$H~*LZ}y4 z0#wK-Rt|A@U95(j*noPlQiOS~UN#Q}pQkmW4~P zRCia;SB;Mu&=n~L4XTW-3BvAZGNTo-fjn0U>VbJkri8rg)X*s*`gbRCbbt-yYBv}@On_U+r#p+g5ccI=3!rzf2{b)s|U&Ukrw(WOflx_0eKw{G3& z-n~0Ldi0=Y&z|(^)r;P}d()>+ANuy~OTT{o=-#j69?Xy- zLl`=AC_X+u3>!9#;lqbBV#EkWjvUFTQKJ|=dNjVizKj_&hOuME;^*hbxN+kcKYlzD zCQM-B#EJO(`x6ilKww}XlO|1K^5n?`1qCr>$`qzfoyxRn(+Ca@X8QE$%$PBQkdP2& z&YVeTXehI0&0_ZK+022I=Fgwcf&~j$xNsq1VPS-ahqGwWA{H-R%#tNb zSh{p6%a$!;`SRtgSh0eYD_0T`5y7fet605yHIb2#L`6lhX3ZMbu3gKzb?aEaemxsD zY+&QYjcnSqiOrigvt`Q`qNAgUiHTwB)~#&YwvFxEx3go%4tDO`No;H^adC0%+O><_ zyLYo^&mQ*f-OIjx``EvKKL-vR;NZc796EG}!-o%ZeZ`U zyLOH1*RONq#tm-XyveOwx43=#Hh1pa;qKkL+`D&=#Kc7I-@i{%QW6gyJRmtanUs_i z9zJ}?qeqW;{P;0Xo;=~{)2BRp_KeijRMOJYNKa2EBO`<7&!6++#S31(d`V_zCa+$- z;`Qs-ym|A6w{PF_?%g}yzkkn%4i|p)da&mI`{P{CqzI@^9*ROp0 z_Kok~zw_hA4}SjqDTZ>8a^a^SI&5CAbv`f zqhfJV>m~G6j!@KKVM>c-iQjd8_Y!kuNHZ$}H6*^0tK8rD>b6o{BPRm!s9i}(_L8CE zp~KM?P?)+U1uJucuC$P>ulh(FS@K_AimhB1IojQ1Dd|>Z{|if#>U+ss$@ed_lATij GAMig_a+m1< diff --git a/apps/plugins/bitmaps/native/sudoku_normal.160x128x16.bmp b/apps/plugins/bitmaps/native/sudoku_normal.160x128x16.bmp index a64efb8ac63eaf0847713f00a247ffc7c53c1cad..719c55547c73e0d077ccc670b8ec3cd03c9351e8 100644 GIT binary patch literal 8696 zcmeHFF;3(_5FCgR@ug%$goFf_5S)-My_}F3L4riU$Bs{3cJxjyrJ|-iSc?&}$d-B%>>s5I3Kc#&n*A$0!2r^9p z^wJ|OE+zF59rS9{34z6)Ei{e}Kq=#>CloY}>co+yAgfMPECt6JE!|BAA`#Kfr~^#x z6=b%j!{|sI5k7PrFlVpF@>}nAc=N07vU*DYKU{HkQFVRqZ2JljYO%wAk7J21CNzhNpTaI~RDfm!e zucfRjNOhDDcrSF!-gGZIj0MxZs6$|G&=9HxXgTQsMoR}U&aygODwWlZh;5#c({w2t zxST!3ZAD8*(6Kj_j)Yw-c6Lccg0G$^Rw?aO{DvdmPU&nOS1$!B0?c-TmO}*!=A1fJ zUq_`<5fmX3vBRO%I~?(<&;0UJ*vpvCbAMU%ZaMajECnA5?6s721*wh_0`HLyO%7mN zFzx$H+EUJh;0RLc3^A7lP-lpZGg``B6xfjE_MyFwBl|spr;c>3p4FqL-1+Rbbzt9u14R5kWiZukv7b%RvPqQ>Umys?S+lS$b>K@JDCGqQvr$R_ literal 4376 zcmeHD!EMAa40HcQasAy0ouC8sfBSU5ZgPvX>=7jdTCshJFF=3>up&_uDf{Dcel54} z9q|q48Rrw{shkl@xt>b-df~YN2;cX7e?!0j?i|TeXiHMWV>G)sC|ZMqRvZ!2Kr2a$ zAag`1C{Zi&)t#Gky=(_7xr~8U&gDRj`ik{~*aBAWzfZm479_on3GT^(^(?zVsXJf-53V%c*7bQzBBrJ7_AB&?aBWc`Av<3&Qk-N7Q{=0{Gfl__|#GgCI diff --git a/apps/plugins/bitmaps/native/sudoku_normal.220x176x16.bmp b/apps/plugins/bitmaps/native/sudoku_normal.220x176x16.bmp index 47963758e205c7b4fb744307ba5d5618f21dc0f9..a7dfe494d6b73d22fc9e5e4f77b1f7606d350ec8 100644 GIT binary patch literal 15416 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 delta 1007 zcma)4O=uHA6iznHB-^x2HtjasZo5g^#7#DxWF=Naiot*&h~mvlA;qg#p(2Gsp;sY% zJ^4eWAQZ%+CyNNhgBOM3IS2tkC=>)i=%o<9*}Vu_aN*l|GxO%X?|tv>KiFSdXy3f# zM1t=k{}m!bJSUDL5up`l{D6q0;^HCyCTqv3G|{a zmWnzqYZf*%iN5CZT;gfWM`zMTZpg&)kdODoOuUJ;hKa4XgO)CE6qmRrBzA~_pnt;0 zL4vj|@Gh3cg`|bGB;(QdTT*guVn^q_PTyhr68V&mwJKw#97X9UCGo|POzmSip(8cw z;_fKZCUqRrR-tNRvO5rXH0A}{A7e78pf_ytsf9ObNv1k-84sr=9S<`uPIVo diff --git a/apps/plugins/bitmaps/native/sudoku_normal.320x240x16.bmp b/apps/plugins/bitmaps/native/sudoku_normal.320x240x16.bmp index 8cd9e29d961cd9241c0b445582e178b97d3ce3b0..07ffa3632d606564f5590b0306a5af89844b49b4 100644 GIT binary patch literal 34616 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 literal 6838 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 Tf~UFIXPEp`|1$!adj$RkjBik# diff --git a/apps/plugins/bitmaps/native/sudoku_start.128x128x16.bmp b/apps/plugins/bitmaps/native/sudoku_start.128x128x16.bmp index 74a46304e5f0f88ccc10bc7b1ed8fbdba928ac19..c3004328ccbaea7872efd3629ac0a08d37ba8593 100644 GIT binary patch literal 6056 zcmeHGJ5EDE3|wgG5E2}LhL(D!q&)50 zj6Y+Ko#gW7{kRR!dEBS*9>x0*?_N8JyS1l?A0FTx9C3a8#`9fl`kCw1QRX9!rhz&d z$=%j0lA|cdo0$Og187t|ij|l#JyvQdGup8ZarR_YkppKpv@nVme}C7SU)wE@Y11(k zBMq#K;fZ{$W@d0TYNqy5oO`JT76c^|m0l2$mg!1Sob#9EMun9%qx(kgJf_Onf4qpJ z9>YO5kD3d)1%1~Vo75jw{<5$oy>Xm@Ws7S$OQBMq#KXP)_AW6-sDa4U0Y z#yXixx@ypTs5N3FAfLBtm`3MCdURg1M~9Z?q?vUx1VF)E4HO)}h#NF(&G(P{JSGxE z9b6N@f=99D5O>$bXwZobs0Is#nfvOnxhe8_Tfv;K35Cc=`yscGO|=B7>ObIm_I6hN z7nbGPqKqEB?C5^Lg~y2D1aTJaX(l~$l|D8v=v^-9W87)N@IYR^ReX+u-u1&-^etFx z3UN{0UAdb5S#gQIU|R)OV literal 2278 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 AC;$Ke literal 7736 zcmeI!y^0-25C!0CgTn=dW&@|*2e6D&ZEouUtOqd4jdG*hC^w5zfntGTgF?TO^sxsQ zP5<3lNe0{OFgw&#pQ<`_x_a(j|M^ybSTKC`Fw&Y5a;g$-k=cxd-6;Xn zCU94=BP^{b1hQG(>hx7Yl-y@0lSB-qvZ0!h$u&8`k#IC*% zG=~IWRFdd9)jvyJwj{As8OoUA^F5j3^_5O*RSP_>)kxzR4YNmSr`wU@QwD$%ZpKE; z!XG!H#`LSQN@AzbZnt2CjGq+nW@Zm-S2L58Z=D-E8$s9&rduK=R(CC7XOHW@nVgPH zy=vi3CCq~^YWynC#<16$`5Xf?A$DY3GR#)TI}<+QmBw~;jrdjmR2=cGCz#bSY?0I> zNU=h4`Y}mJCetueUWvpCpN0TP+f9C)(^<{QlDVbFj-F#L@s9%;ofYcxq{q%#`NtN5 z@A7A=r~FGpjZns&j`+u>)TK<8z-kNFBa?8B_|sHlQ#_HH8q?LOGtwRZEZCGV*K9V3 zT%+=BEwEH6xsEUtg;i8Ns{jJI+q$C-lPxGFdQoCT#$ySH#}Yw zB79Y)^Jm^xB|5NInYD97(!?gesT)&`p5iZRT;)+Wd*q38W<$$UFlQ+rBjGD>@W)&G zcjCL2tMO^qC1z)=^q(dmqpn47W<=7bKnzpL5imi@iSMQQhNJ z%>Vzjn`iMtP|{;QAV=^yvreMV(Gk27Lg0y$k5#A4^i}d4_T%#txsK!2RprQ+6DIeR zYB>=|gEcc+up`xwr`!mTZOpU5qpiAB zML7CsygY3c&U|nH>XKnU45F0CZ5T#|ZHYVC8O37K8Dpy8O?&ZajS-J|&KKCYI`!x- zA;D&wAOPuQo7^99I}p{wdymjcO$SbVMaF z&z@l`Hpz|jm`gHTK=U~<7`X=X$nCi3m0wknf&l--{=NkU^_t(7w|04xXrw@p7W3B)I diff --git a/apps/plugins/bitmaps/native/sudoku_start.320x240x16.bmp b/apps/plugins/bitmaps/native/sudoku_start.320x240x16.bmp index b223614341299b411a81bdc96eb6e1438fc72321..190ac520dd14a149662e9664104150cb4712e8d0 100644 GIT binary patch literal 34616 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 literal 6838 zcmeI0cT`l@6URR+B8wCSQ4~c%1hJu_2!aho6k>}lqKJ)P?-jw06-7}jh$u=d2)0!O zM4mN0v8SksC9$`dL{lxlx4V$D_wCCcznqg3f9IDuXZPLt&fI(E&6_(j_qOYD$Q1)M zF9SaEsEYi1BL6JV8t^%l!O7P6lfgg8!omWLMuVlLC1uK#!OF^tvSrI+ZEcNKtHs8~ zhH~Y~VQXuPot+)__Vze9I8eTPc`8(>fTN=$PEJl#tXL6eXJ;x^szl|=m2q)#p-Po1 zRIOSSS65f6RjWqz>eX>`bE8I$8q};=6L)uaJUl$8RjU@Bo}SdMT^lbiFTB0IsZ*y8 zK0ZFwty`CR_3BZ-etjA=Xh6e;4e|B$rBS0sG;Z9OCQX{)=jTV$rcG(qtQr3P{xomi zoPdA;0s{kS(V_)GK|uru2h*};OIo#RMeEkBY15_+ZQHgbBqW4(?b^}4eS1PfL+Q|= z17TrdbnMuXPMtat9v)6aLcnM@KVo;6Mfq8pPnigBdbp z2t$VsB_<|@x8Hu7*w|Qx4I9Sr;lmj*Vgw^cj%3uRQH&lvnlWR>Fm~)%#*G`t`0?YJ zFku1{Cr)J2q)AMkJees|rZ9EtRHjXv#`NjaiHnP4#*7)n$H$Y9kig8DGnqAO7PDv1 zX3m^B%$+-zdGqEmfBt+D6BAjmU;zskE@aW7MJ!&tm?cY=uypBCl9G~Gwrm;8moFzd zIhhqJRWl%ShZ>ut5>fkH8qtrYu2!K?ON8YTgUqK>q$#XW5b3Gq^GB|apOiZ zGBVh-X%m|_ZzeM{lPz1euyyNJva+&x=bd-hwrv~Rw{K_1jvegWxs&YdY`_bui95`@*g9i_imzT$(Lx;%E&!?cEfWpE;4j(>D zQBe^`jvS%5xEM*2IC}Ib$BrH2`0?YMIB|lLCr@(f)G6M5_g&t5?>*js|9w9A-~&GV z@IyZO=p#P<_+vi#Cz=GU%t$hD_8jHtFQR_>#w)g0;gKxh1hHt<9mYX+k za_iPDZr{GmojZ59d-pE)?%m`5{rfz4@PLO8AM)tYBOX6~%y-{?$CD>d`2PFv`Qe8j z`0>XddHVDz&z?Qwr=Nb}=bwM(mtTJ2*I$3-x8Hu__uqf#`Sa(zc=3XlFJJQN)hoRp z{u1q6ydd>}%1nPbtCR`KG?N7RhWKc)ny(ZT$v|E>R%uFsfe)v?DxRxlgQ}o8{YAVu z!Ozt#I5CoD0-oPgw$lo1aTf5tFi(VDAPD&=Okdtum!u za==*!Tl(jkf|9h~6-~5GipN`guOVpU?=DHzm?BJQU9urU2o><|CGpgnE&`s2R&QWN zS!M{h6pl^z5nZhbG!182<;ZwP+5fgf1uqz;7U!(lsZbV|d@Z=1R2Ds1V%6Sqj8Zjl z5ET@$W>m|oz);l*W3bby2@bm`b5Ds@9NOJ#6N)|Pp@vHfu-d6AXi$=cl)@A=Y8zgX z!#6~!Yv401EYej49cUroxpM8*Q;LRcQ-Pa)ml`R{6mKf`c_pOW0j6rN!?-vrajkij zODptEv}Lq1RVG;A-8)o^pST5dwnQ9}q%HQ06W(c5Nsz?gD&Q>$Gw{hEL|rAK4fsaH z!lq@a0iOrk3RRW@Lhp0}KXKXOgNR|2-aS z%s~6a<&5^oCMgo!9|@?ZsQzzmm$;VmaZb6n~{K#>|=+*&SzD*94^FN4%@N#~A6 z)t}kUsNzyaO;=-EZ}Mud+i-u{{N;PhjG9o_@UgttDh#98K2p~xaEtGBqe#dXes6?D3r7PMr zspKF#1H^AUt?@Fs;mUNuqjX8*bDG@z)U737xhfik+-P?>el$%~ZZ{5RZFy~)AMs^O zIr+tmB<2$-$=_d2P4dmGKHrG63iVs4|0_Js%1XYq7agPL)`WS<{xrvBB<@e}VmAj> S{l5j2?-2i`e?9P*J@6loJJsO; diff --git a/apps/plugins/sudoku/sudoku.c b/apps/plugins/sudoku/sudoku.c index fcf1566d65..9485f2de23 100644 --- a/apps/plugins/sudoku/sudoku.c +++ b/apps/plugins/sudoku/sudoku.c @@ -57,6 +57,7 @@ Example ".ss" file, and one with a saved state: */ #include "plugin.h" +#include "lib/configfile.h" #include "lib/oldmenuapi.h" #ifdef HAVE_LCD_BITMAP @@ -171,6 +172,28 @@ static const char default_game[9][9] = #endif /* Layout */ +#define CFGFILE_VERSION 0 /* Current config file version */ +#define CFGFILE_MINVERSION 0 /* Minimum config file version to accept */ + +#ifdef HAVE_LCD_COLOR +/* settings */ +struct sudoku_config { + int number_display; +}; +struct sudoku_config sudcfg_disk = { 0 }; +struct sudoku_config sudcfg; + +static const char cfg_filename[] = "sudoku.cfg"; +static char *number_str[2] = { "black", "coloured" }; + +struct configdata disk_config[] = { + { TYPE_ENUM, 0, 2, &sudcfg_disk.number_display, "numbers", number_str, NULL }, +}; +#define NUMBER_TYPE (sudcfg.number_display*CELL_WIDTH) +#else +#define NUMBER_TYPE 0 +#endif + /* Size dependent build-time calculations */ #ifdef SMALL_BOARD #define BOARD_WIDTH (CELL_WIDTH*9+10) @@ -767,20 +790,20 @@ void update_cell(struct sudoku_state_t* state, int r, int c) */ if ((r==state->y) && (c==state->x)) { - rb->lcd_bitmap_part(sudoku_inverse,0, + rb->lcd_bitmap_part(sudoku_inverse,NUMBER_TYPE, BITMAP_HEIGHT*(state->currentboard[r][c]-'0'), BITMAP_STRIDE, XOFS+cellxpos[c],YOFS+cellypos[r],CELL_WIDTH, CELL_HEIGHT); } else { if (state->startboard[r][c]!='0') { - rb->lcd_bitmap_part(sudoku_start,0, + rb->lcd_bitmap_part(sudoku_start,NUMBER_TYPE, BITMAP_HEIGHT*(state->startboard[r][c]-'0'), BITMAP_STRIDE, XOFS+cellxpos[c],YOFS+cellypos[r], CELL_WIDTH,CELL_HEIGHT); } else { - rb->lcd_bitmap_part(sudoku_normal,0, + rb->lcd_bitmap_part(sudoku_normal,NUMBER_TYPE, BITMAP_HEIGHT*(state->currentboard[r][c]-'0'), BITMAP_STRIDE, XOFS+cellxpos[c],YOFS+cellypos[r], @@ -862,9 +885,9 @@ void display_board(struct sudoku_state_t* state) YOFSSCRATCHPAD+CELL_HEIGHT+1); #endif if ((r>0) && state->possiblevals[state->y][state->x]&(1<<(r))) - rb->lcd_bitmap_part(sudoku_normal,0,BITMAP_HEIGHT*r,BITMAP_STRIDE, - XOFS+cellxpos[r-1],YOFSSCRATCHPAD+1, - CELL_WIDTH,CELL_HEIGHT); + rb->lcd_bitmap_part(sudoku_normal,NUMBER_TYPE,BITMAP_HEIGHT*r, + BITMAP_STRIDE,XOFS+cellxpos[r-1], + YOFSSCRATCHPAD+1,CELL_WIDTH,CELL_HEIGHT); } rb->lcd_vline(XOFS+cellxpos[8]+CELL_WIDTH,YOFSSCRATCHPAD, YOFSSCRATCHPAD+CELL_HEIGHT+1); @@ -873,8 +896,8 @@ void display_board(struct sudoku_state_t* state) YOFSSCRATCHPAD+CELL_HEIGHT+1); #endif if (state->possiblevals[state->y][state->x]&(1<<(r))) - rb->lcd_bitmap_part(sudoku_normal,0,BITMAP_HEIGHT*r,BITMAP_STRIDE, - XOFS+cellxpos[8],YOFSSCRATCHPAD+1, + rb->lcd_bitmap_part(sudoku_normal,NUMBER_TYPE,BITMAP_HEIGHT*r, + BITMAP_STRIDE,XOFS+cellxpos[8],YOFSSCRATCHPAD+1, CELL_WIDTH,CELL_HEIGHT); #else /* Horizontal layout */ rb->lcd_vline(XOFSSCRATCHPAD,YOFS,YOFS+BOARD_HEIGHT-1); @@ -901,9 +924,9 @@ void display_board(struct sudoku_state_t* state) YOFS+cellypos[r]-2); #endif if ((r>0) && state->possiblevals[state->y][state->x]&(1<<(r))) - rb->lcd_bitmap_part(sudoku_normal,0,BITMAP_HEIGHT*r,BITMAP_STRIDE, - XOFSSCRATCHPAD+1,YOFS+cellypos[r-1], - CELL_WIDTH,CELL_HEIGHT); + rb->lcd_bitmap_part(sudoku_normal,NUMBER_TYPE,BITMAP_HEIGHT*r, + BITMAP_STRIDE,XOFSSCRATCHPAD+1, + YOFS+cellypos[r-1],CELL_WIDTH,CELL_HEIGHT); } rb->lcd_hline(XOFSSCRATCHPAD,XOFSSCRATCHPAD+CELL_WIDTH+1, YOFS+cellypos[8]+CELL_HEIGHT); @@ -912,8 +935,8 @@ void display_board(struct sudoku_state_t* state) YOFS+cellypos[8]+CELL_HEIGHT+1); #endif if (state->possiblevals[state->y][state->x]&(1<<(r))) - rb->lcd_bitmap_part(sudoku_normal,0,BITMAP_HEIGHT*r,BITMAP_STRIDE, - XOFSSCRATCHPAD+1,YOFS+cellypos[8], + rb->lcd_bitmap_part(sudoku_normal,NUMBER_TYPE,BITMAP_HEIGHT*r, + BITMAP_STRIDE,XOFSSCRATCHPAD+1,YOFS+cellypos[8], CELL_WIDTH,CELL_HEIGHT); #endif /* Layout */ #endif /* SUDOKU_BUTTON_POSSIBLE */ @@ -928,7 +951,7 @@ void display_board(struct sudoku_state_t* state) */ if ((r==state->y) && (c==state->x)) { - rb->lcd_bitmap_part(sudoku_inverse,0, + rb->lcd_bitmap_part(sudoku_inverse,NUMBER_TYPE, BITMAP_HEIGHT*(state->currentboard[r][c]- '0'), BITMAP_STRIDE, @@ -936,14 +959,14 @@ void display_board(struct sudoku_state_t* state) CELL_WIDTH,CELL_HEIGHT); } else { if (state->startboard[r][c]!='0') { - rb->lcd_bitmap_part(sudoku_start,0, + rb->lcd_bitmap_part(sudoku_start,NUMBER_TYPE, BITMAP_HEIGHT*(state->startboard[r][c]- '0'), BITMAP_STRIDE, XOFS+cellxpos[c],YOFS+cellypos[r], CELL_WIDTH,CELL_HEIGHT); } else { - rb->lcd_bitmap_part(sudoku_normal,0, + rb->lcd_bitmap_part(sudoku_normal,NUMBER_TYPE, BITMAP_HEIGHT* (state->currentboard[r][c]-'0'), BITMAP_STRIDE, @@ -992,20 +1015,50 @@ bool sudoku_generate(struct sudoku_state_t* state) return res; } +#ifdef HAVE_LCD_COLOR +static bool numdisplay_setting(void) +{ + static const struct opt_items names[] = { + {"Black", -1}, + {"Coloured", -1}, + }; + + return rb->set_option("Number Display", &sudcfg.number_display, INT, names, + sizeof(names) / sizeof(names[0]), NULL); +} +#endif + +enum { + SM_AUDIO_PLAYBACK = 0, +#ifdef HAVE_LCD_COLOR + SM_NUMBER_DISPLAY, +#endif + SM_SAVE, + SM_RELOAD, + SM_CLEAR, + SM_SOLVE, + SM_GENERATE, + SM_NEW, + SM_QUIT, +}; + bool sudoku_menu(struct sudoku_state_t* state) { int m; int result; static const struct menu_item items[] = { - { "Audio Playback", NULL }, - { "Save", NULL }, - { "Reload", NULL }, - { "Clear", NULL }, - { "Solve", NULL }, - { "Generate", NULL }, - { "New", NULL }, - { "Quit", NULL }, + [SM_AUDIO_PLAYBACK] = { "Audio Playback", NULL }, +#ifdef HAVE_LCD_COLOR + [SM_NUMBER_DISPLAY] = { "Number Display", NULL }, +#endif + [SM_SAVE] = { "Save", NULL }, + [SM_RELOAD] = { "Reload", NULL }, + [SM_CLEAR] = { "Clear", NULL }, + [SM_SOLVE] = { "Solve", NULL }, + [SM_GENERATE] = { "Generate", NULL }, + [SM_NEW] = { "New", NULL }, + [SM_QUIT] = { "Quit", NULL }, }; m = menu_init(rb,items, sizeof(items) / sizeof(*items), @@ -1014,36 +1067,41 @@ bool sudoku_menu(struct sudoku_state_t* state) result=menu_show(m); switch (result) { - case 0: /* Audio playback */ + case SM_AUDIO_PLAYBACK: playback_control(rb); break; - case 1: /* Save state */ +#ifdef HAVE_LCD_COLOR + case SM_NUMBER_DISPLAY: + numdisplay_setting(); + break; +#endif + case SM_SAVE: save_sudoku(state); break; - case 2: /* Restore state */ + case SM_RELOAD: restore_state(state); break; - case 3: /* Clear all */ + case SM_CLEAR: clear_board(state); break; - case 4: /* Solve */ + case SM_SOLVE: sudoku_solve(state); break; - case 5: /* Generate Game */ + case SM_GENERATE: sudoku_generate(state); break; - case 6: /* Create a new game manually */ + case SM_NEW: clear_state(state); state->editmode=1; break; - case 7: /* Quit */ + case SM_QUIT: save_sudoku(state); menu_exit(m); return true; @@ -1126,12 +1184,21 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) int button; int lastbutton = BUTTON_NONE; int res; + int rc = PLUGIN_OK; long ticks; struct sudoku_state_t state; /* plugin init */ rb = api; /* end of plugin init */ + +#ifdef HAVE_LCD_COLOR + configfile_init(rb); + configfile_load(cfg_filename, disk_config, + sizeof(disk_config) / sizeof(disk_config[0]), + CFGFILE_MINVERSION); + rb->memcpy(&sudcfg, &sudcfg_disk, sizeof(sudcfg)); /* copy to running config */ +#endif #if LCD_DEPTH > 1 rb->lcd_set_backdrop(NULL); @@ -1173,7 +1240,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) rb->button_clear_queue(); } else { save_sudoku(&state); - exit=1; + exit=true; } break; #endif @@ -1324,13 +1391,15 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) if (state.editmode) { res = sudoku_edit_menu(&state); if (res == MENU_ATTACHED_USB) { - return PLUGIN_USB_CONNECTED; + rc = PLUGIN_USB_CONNECTED; + exit = true; } else if (res == 1) { /* Quit */ - return PLUGIN_OK; + exit = true; } } else { if (sudoku_menu(&state)) { - return PLUGIN_USB_CONNECTED; + rc = PLUGIN_USB_CONNECTED; + exit = true; } } } @@ -1347,7 +1416,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) default: if (rb->default_event_handler(button) == SYS_USB_CONNECTED) { /* Quit if USB has been connected */ - return PLUGIN_USB_CONNECTED; + rc = PLUGIN_USB_CONNECTED; + exit = true; } break; } @@ -1356,8 +1426,16 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) display_board(&state); } - - return PLUGIN_OK; +#ifdef HAVE_LCD_COLOR + if (rb->memcmp(&sudcfg, &sudcfg_disk, sizeof(sudcfg))) /* save settings if changed */ + { + rb->memcpy(&sudcfg_disk, &sudcfg, sizeof(sudcfg)); + configfile_save(cfg_filename, disk_config, + sizeof(disk_config) / sizeof(disk_config[0]), + CFGFILE_VERSION); + } +#endif + return rc; } #endif