QuadDraw revisited - drawing program work in progress
#11
(05-31-2022, 11:54 AM)Dav Wrote: @James D Jarvis:  Cool.  I like it.  May I add those in the next version? I was going to add D for selecting a draw color.  The Eraser idea actually makes a neat effect - press and hold E while drawing and it draws a dotted line.  Thanks for your testing.

Of course please do. That's why we all share. I hadn't noticed that feature with the use of erase, good catch.
Reply
#12
Well I got Text modified to take different Fonts but not perfectly clean nor fast enough to update Menu on every loop.

Skinny Arial (loaded @128):
   

And Arial Round Bold = "ARLRDBD.ttf" loaded @128
   
b = b + ...
Reply
#13
Aha! Revised Text Sub kicks butt with clean graphics fonts at a range of sizes!

Code: (Select All)
Sub Text (x, y, textHeight, K As _Unsigned Long, txt$)
    Static beenHere, fontHandle&(6 To 64)
    If beenHere = 0 Then
        For i = 6 To 64
            'fontHandle&(i) = _LoadFont("arial.ttf", i )
            fontHandle&(i) = _LoadFont("ARLRDBD.ttf", i)
        Next
        beenHere = -1
    End If
    th = textHeight - 4 ' <<< this is needed to fix Dav's menu
    _Font fontHandle&(th)
    Dim As _Unsigned Long fg, bg
    fg = _DefaultColor
    bg = _BackgroundColor
    Color K, _RGB32(0, 0, 0, 0)
    _PrintString (x, y), txt$
    Color fg, bg
End Sub


You will have to adjust the sizes and x, y 's for better fitting screening of data but this sub is fast enough to update with each drawing loop! You will also have to include font(s) files for non Windows users.

    Clean and fast!
b = b + ...
Reply
#14
Great solution, @bplus.  I only have the Arial font on my Win7, but it works very well indeed!

Last night I stayed up late and came up with this.  Not very fast, but a way to include and use fonts inside a program, which has been a longtime goal of mine.  This code decodes a font sheet image and uses that.  Can change font size and color.  Trick is use a monospaced font and a 256 color font sheet image so _PALETTECOLOR can be used to change the font color.  

- Dav

EDIT: New Font data - all characters included now.

Code: (Select All)
'============
'MONOFONT.BAS
'============
'Clean looking monospaced font, in code, to use.
'Coded by Dav, JUN/2022

SCREEN _NEWIMAGE(800, 600, 32)

CLS , _RGB(64, 64, 64)

FOR y = 40 TO 540 STEP 40
    'random text size
    size = INT(RND * 22) + 14
    'black shadow
    mFont 12, y + 2, size, _RGB(0, 0, 0), "The Quick Brown Fox Was Too Lazy To Jump."
    'color of font
    mFont 10, y, size, _RGB(RND * 255, RND * 255, RND * 255), "The Quick Brown Fox Was Too Lazy To Jump."
NEXT

SUB mFont (x, y, size, clr&, txt$)
    STATIC initfont, fontsheet&
    origdest = _DEST
    IF initfont = 0 THEN
        fontsheet& = _NEWIMAGE(3040, 64, 256)
        DIM m AS _MEM: m = _MEMIMAGE(fontsheet&)
        A$ = ""
        A$ = A$ + "haIkLUVTdSK[lk6Xko]eQSHjZ89b=B9E;MCl3?U`BR49YDSaQO_om_]]]]]]"
        A$ = A$ + "]]]]]]]MWfASaM522na]a\_6E2#b_2N_]]]]]]]]]]]m>]gcbNGanmD0X9?3"
        A$ = A$ + "i2cmKdnFV_:;oB8nffffffffffffKdNCoGim5\O_00JfC#^\Do:]_Ui[`c_5"
        A$ = A$ + "R_]]]]]]]]]]]m6]gd:C_lmkWI#o]_6iGblE><WhbaffffffffffffOEkM]a"
        A$ = A$ + "dig_G20=oLb5U9WF;Fn;a^G2NIcO5X?3YMZo]#_anoVJoKg>klo^[OKKKKoI"
        A$ = A$ + "]h]L8a]UoYom9g0lYco_93XT_4iml[QSIi7cnmO^g>IOOiJhMlG_BQ20nUP;"
        A$ = A$ + "kZcQN2hIH[_V#GFT`b^87;Z3oDn?#6elMaQ8BmE944`#UQBTCF?=UBi3YIVO"
        A$ = A$ + "LGOhT#Z6gP<JMY7Ic0PEBRb4UlMShmboTdhWU1LhbUb]mIHi_IA2j:?4NH6c"
        A$ = A$ + "lbO9<^HCCFVoK;bVFnG4elDRK<9ANmiSdY^JMnkVG30UO>#_Q8lCmZ?1mB^m"
        A$ = A$ + "4>NX\<Ef5VU[L>7=JaB54G>\1C^OO#8_3m8FC=3O9Nfm?3g_O2Y1bUk[NDi]"
        A$ = A$ + "IQP\a7\U=>a<210hl67N`WQoFKZT_G4_Gn7UG=Y4lGQgKkkabOe27cFN8lh4"
        A$ = A$ + "Z\S2A=<^hA8<XW[?K;aVDnG4eIB9^]T4ieW?#WkReY_IN=0DnI;dU3HnQ>ac"
        A$ = A$ + "Jog^#KFACakNoNkgOVHkIL2C]OOBom>X<TdX<lUh=cnmS:RD2Mb[H\BZgE^C"
        A$ = A$ + "LOV42adh9kgG5hN7b9F?0o;bV;kK4a57PhTCB4Tc<UMiBifn4\hG^8QLU?7l"
        A$ = A$ + "Uh8jinklVR7#`0OJkgFX=Wl?5ZOLkgW_fn9_GMfKVWnVmcRS?OiWi4?#n5Ni"
        A$ = A$ + "9Jl`#X;5<B2BJ8?8;I2fj=9#2OHn6J9Xg1SP\953WkI_\gkRZ8J5<ENG\NGi"
        A$ = A$ + "aogOU2#RnL?kg3VHc0l_8K^\_A4GL0BC>2E#BCEfE;UKk3`BOkR5aFN6l\mk"
        A$ = A$ + "adk:g_gPONogFT=Wl_:\CUBLC99:ZO>X3bCb\ggnm=57Onnc?;M^b4aES`k>"
        A$ = A$ + "AS7>9MYMAIYbX7DM>lOo1n_R4ZNCLFm^<6SFjWQ02U\;3GoTh9FOo7?d42i?"
        A$ = A$ + ">JnOo`F^^NFko950NakgCEg>_<6=B#[nS7#W=Ijg6R[>1Y9WP:Ze9h_Vb_]_"
        A$ = A$ + "3;ke[T8hjc`_??;llUdBJNGB[5NoF`bfPnMEZK#QV[>[g4Amc1M#NJZ]<4Wm"
        A$ = A$ + "NMCa1W_?oSkP:VKon6gbA8JlD]8Z6i54#<\jhe_oXkgkK73ARW:UVSohXW_N"
        A$ = A$ + "Cighnm]^#U[g_WB#4lAjWfV<mK3aEWPdTC#5ej4lGCioEIoRWm^ASM:c?nM_"
        A$ = A$ + "OjR31bS_H#2ZN2n5co]UI3bgU9_1eI^j\NCDeWRmY_EM^;VWmNMCa9_ol8F]"
        A$ = A$ + "2mjm\?0=lCf06<4CNnNckg3T\JoRZOV`X60HcOPmk3WOj0NIe3Njlkg3BX]N"
        A$ = A$ + "Dij=6<l?NoN`I9dV=oK2aU7QdTS#5TdDUMeBigSmkMfI__1c181mn[YiRkj1"
        A$ = A$ + "h57l1a<ESh7VP^WokJ7?n?V\^Ne;ljadh>E:amTTXZnD\?mUZcMadE=hEWJl"
        A$ = A$ + "b?YOOia3e:#:aoi2en:jZ1P=NjLTef5DN1Q=HLiJimS^lmk94^<ED7hncTCl"
        A$ = A$ + "nmeZ=hEjhXS:WH24la9ng?JbjI38MLP8<FMaG=QfjAUCY06_5Woo5JcVo=Qh"
        A$ = A$ + "2<Ob^UT70\9Hee;UO?f_gIOLb4gAPB0kmi9`_f4Jc5_513AZ6`W`_7Wm_8m_"
        A$ = A$ + "OkhaOoHQ:1oiTQ7G#N3:SVBL;99:[?4kcOYjDG<UjNhKOUO:NoiWOG;1X4oD"
        A$ = A$ + "2ZkegF5CHkSdi<gO=Xl228HaiHJd4PQ[MQOTU4n2f_?]A9cG5T`a[P`Ak=?D"
        A$ = A$ + "6;>oU3PiZWFNlOodk5?o``3J54d3N10?e4Plm[MonK[KAiECJ2NMmBigSmkM"
        A$ = A$ + "f7W<`TNdIjbI_?cRKkaTgo3O3#\?YQooR_:TK?4PiE2YJSL\8`CUBL;99:[O"
        A$ = A$ + "V;`1D`b^e0AXk703VCiWRgOniWTB0407C_OoHSKOP>Y<obMBd8#U>Zn#g727"
        A$ = A$ + "_f9J3<mW#lIko\=:1O06QSGE?3g__<o4lZML]jIl]<BJICi5?oj`og3`BJO6"
        A$ = A$ + "d_^d77?b#To9\Y;hN#LIJ<AQ9IEPJ>l_HYlkanm>kSCVj=DP4`cV1W47:LYS"
        A$ = A$ + "Ad6NPaUl1DNhBSnUNo0H=col_F<D#heSi1NZDRK99AImQPO1gOFEjJZE_JJS"
        A$ = A$ + "QbZlcEf_70ohm=B#hnmmDQg3QKITXmki:7EO2onI9nHK8WGlnkR7foIKD2n0"
        A$ = A$ + "<27_OBYL>L`l\jlo?8J;OnA[G;K:_j68X?ITJ[0d_>0?09`b=bV^Pk1aUYae"
        A$ = A$ + "coUao^YbW\mkMfI_]2B191l\I`1aY_5WIon9CcdA4ZT>Mgg?nD^oe9QQbnHe"
        A$ = A$ + "5dZ`S[L2TW9UhI#a=c>BA#7#QKbHjn1c0YEnibkg3X#LDfUYn^=gaXj8\;FP"
        A$ = A$ + "82S`l#iJHmGonmVh\2L0AB\m944QSg84?:YNbhT?ki34olj]h[WD_GM3`bco"
        A$ = A$ + "mP[RSaHSi3CXTi4O6Ln:^54GV6G?oG6okV:Obf_gIWmf:85T4`c>]Qe>\`nm"
        A$ = A$ + "<jIK^YS:bRPf#cCHO8G07>TXg;deG`[f0BScANVDRW0BR9ghSP>P2gTIdmZE"
        A$ = A$ + "cZlC1\?2Z;_1Sj_kj``?79oc^AV0<hn8c_O_iS9mNTjG#mkmk?##lXTj1SCn"
        A$ = A$ + "\W?#lc[gR_NBmNe=#4U=B?e?89JTg3H2X<C]i[hF#LIJLmlOIl_KZl9KoNWM"
        A$ = A$ + "mkg?M5_QYCZ#a5OO8[[QOIXVVYS2bN9kgO8<LVcfQ;eZdSCH129]8eo#21dO"
        A$ = A$ + "]JKc<dKJh9Bjn<e]JimCM2bS]716_#1X#gCThUFeaV7o7SC0YC0IP>5kmkM5"
        A$ = A$ + "h0RTHcC#427_o;Wja#mTa9ODn1CHnj]hW8K:_h6P7hAQ1RiC8PTXY3S=3CfI"
        A$ = A$ + "n:HN9YIbbCFn2<oT5NmhO_Di^7dVVXJoEOnmaKSC6HBkO_NF03Ro`5?FF?Wo"
        A$ = A$ + "O=0C7AhBjeBg?>4fBChMJHbAY<7RTV`jm9Pnm^OOdMc4:L?6FO17^dWQGPUW"
        A$ = A$ + "K?lO0ne07`?ed2`W:hD3b9eaT86#=PI0KKeG_7UlUDoNonFM_N<D?ILb7UO`"
        A$ = A$ + "4V_NLl5oc^8_3nT?>:<J:ChjCgjYA6U4LTP^Z9IDAQlWOIRYY1Dl1lGm=HaO"
        A$ = A$ + "m2WcX;_6PofJc7[kn6M0o7Y8]Yl9DLnPj?mS?lnc4#STZ`T5fLK[cS1Oj0Dd"
        A$ = A$ + "Wb5P>lZ`b=b<YRo`S:FB?W?=C7AhBjETh#I4o0JZ9l6=:ej251B#GXMOMX5Y"
        A$ = A$ + "T;]h4=UW;=9DhN<\n2?HkMY_o:?gjcjIj0:`Onak[X6A97o?2YT7O8HNR>Gm"
        A$ = A$ + "QEG<[leW^0L>nVh\2L0ABliCH027_1<NFBmTa9O<nQCHnjaa3obJRl<hSd_J"
        A$ = A$ + "`112#I2E73[O735VGnCG:l=4X;PX9Pb[cV4n2nHn3?_`SVIj6M503`7OWe0n"
        A$ = A$ + ";_OP[W?PlmkibDRn`B#BIkkGSL5Pi82m?K`W>0l3L4R3:Yd#R8<1T7^JN^Nb"
        A$ = A$ + "cSkR#foXkgC9F9\7UTf4787kggnmAho>?Mo7kF]dKO:Tk_Z;6?ln8>]IlWmo"
        A$ = A$ + "1#<aHi=M\^#`l44XhJ`A6WgkgK03IX4ng`UkgnnmYOImZg_74L#P4K9ahVNB"
        A$ = A$ + "b;g^O=i_MRC`2Q:hR]oHD_SiWBh45SO423`GcIc#G0nIP0SBZ?FoZ<\00_F:"
        A$ = A$ + "hBAYeUZO0e7Pi80m?K`W[>gnnmC4WZ7QM]>D^4El1Znjo=2Njg#01eiW#b^n"
        A$ = A$ + "J<:]PYh`9X?C495KE:iB[PM[dh9`hV]Y^eejdLoEM_hQcO23B[FJa3X[d1T6"
        A$ = A$ + "fTQ8FG8QLYnOnQkmk99nh9BmQS7b#9ld35O2o89<Om3N:<>BfDN9=0G`X^X7"
        A$ = A$ + "I2=?><9dWUYJ4oXaYYH2kB84L;n\XdE#E2787BgDjO2iOTgdlO8jJUgTa??="
        A$ = A$ + "G7<X;5U>Glh8eGMVPkW6O^l#700P#LI6_NFl6?bYaA\UF__hDoXXK9<PC9eA"
        A$ = A$ + "4Q8_<SC:FJbDB#P7K2NC`HV0h<3m>C2ghnmdQ^VeHR<A_a[kn[h:MIoNjmNF"
        A$ = A$ + "c7XYB03^oXBh<GnNfj:76XEI#Ld^6O>0V7OLlR=;#T4Ol4Yn`aSb`ZCWlAhG"
        A$ = A$ + "]UW\Nh8T:K:_\6H2n`?0cA=TA>eD`RN0=MdFDF<nE]O_QPd`\n[D>AkA?APa"
        A$ = A$ + ";n=iiio:A?b?OF[N3jBAYcUYR^XTCQQLjacbXdaG<#8N`<P4i2ghAXV8^ScH"
        A$ = A$ + "B^ekM<WB=df48>WaRDoK\a9=gUJjiShSHadNZnWS=>AKi1=hV>NYW99[b;_["
        A$ = A$ + "?n=Wb?;40]mAKATD\n2^QVL9F5o<GoNfi::74[F[3KR7=lGFoiM848BRW4fO"
        A$ = A$ + "Rf1AK9Elk1\R?VO05I]jY><j7>>bkX?9O7e5c7:8D<I48Q?8V9lYg?d]1Z<J"
        A$ = A$ + "0oO7kg;`P4UC_Genm^4RS3N:hl[j1;YTGP7O0QIkSDdXOPHf10<#mAZ1091c"
        A$ = A$ + "2fOhGKa51;7UQVJfbAbAmmA8lVaf`#Y]JMWcVTcjdUhhjd5<o[A\P4]e7dPk"
        A$ = A$ + "ilUN_K\I#]7nf`oZSch;8A<X07BTPZbXCoEdf>HbIYXBk9kP7383D[3KRW#l"
        A$ = A$ + "I9dm<81FmOIkgG?S2egBl3ClYg_?L1OLHTgAO]?;XCEY0HB8H`4`RN#<BS59"
        A$ = A$ + "Pk3YJFmZnSV#6k#g_Qlm2g_G01;lCOXOU`OV00h^>Q\c7j14I8?PVDD`mK<<"
        A$ = A$ + "8jh#0Z8P0WL00346HX1J088E]4aIl7W`<L;COPY#3fRA:on4]iI\X29#_2aQ"
        A$ = A$ + "2OLOGIbV9S0:<Ua^jEK6Dl7LnhaaDKN\>5lkn3nGE12^hlOQ3^1ZKb2\KUmk"
        A$ = A$ + "Aej`Vhad0Lh?fmk3VODhlmk7oo=<Ea7c_ZL\Dm`kb3JPNoH_GF;Qi?:;\o7:"
        A$ = A$ + "UQNilgLaQY_hm1Ah6V^MQ#195SUUo<Q#:NlLJMIP05^DmPC?oe?J?oV=ob7Z"
        A$ = A$ + "9Y7<k\0H2jS>8O8:JkfojEO2IEeCWD5`:i#gnND5l[gV91Ika8HQ7l7lXP4B"
        A$ = A$ + "_?BK5nB[A2e[#K<G=BAH50lMh>VMimcYg_WFoH>6FP3l\d9_6`VXB:6X3QHJ"
        A$ = A$ + "[QLENj>JbV\mnmJ`jol2HT>mnm<18]nA`P3YJHaa#N;nJNV5KRmkAT3McIRj"
        A$ = A$ + "A4R\o7ml1S6OP3?oD>W1OG3^PmkM8PRghJlG3GI9hDRKWOSn?F0<1cDU=k\0"
        A$ = A$ + "j1PCo1i[ZH`E\IjGjDTGOP#=>\TXIO]KXVN;?1EgY#XSn83Fck`8RMOXfJ\E"
        A$ = A$ + "M28;iVU6J32k<WQN^Kk`M<lbkWc^O?_nVWPC1[#8WVmV0OT6BY9ICFc7=QP`"
        A$ = A$ + "n3T0X4U0>dS6n_]mkW5f7AKA0<Be5I3eGgl_HmTYD<]h#8_5O=>haZoPA#0i"
        A$ = A$ + "jB#776UCoJMhhIXE14D_Jnmhki76[4mA2V50D2=^6oe1[X3MLllOMkgWloOS"
        A$ = A$ + "8JfSV?fSPT7T?aO4#a0al0[Od7_N_#Q98L<`Pj7M60dhFbI;GT0UM>6:4a?:"
        A$ = A$ + "K=fR[BRe;AIXM8Xejc>oA[]5gad;_YRhWhK;20JNR<5T:KMmO1h<D<R0:ECY"
        A$ = A$ + "lK8BjnT`8637o=Pne9a95eh40HjT^momf_W<OYlkRZWZ:da571i]h[a1U]6:"
        A$ = A$ + "Zifojeoi3cYO]\NT<`2J[3o<=mRaoGonmeh7U7PET>EIoemT0H2T]Oo1V#7M"
        A$ = A$ + "VT1RY1FoXC^Lhe9SF262]FEQ\8238BEYIg_g]P_\fN4<XoAK[`Gi1PYVkEHX"
        A$ = A$ + "]8XgVc>kA[]5gahO0OE2BDXgFWR;a=?YEHBY?o\7jK4fA4D2\5PWZ8YkC2SH"
        A$ = A$ + "<LlgUPmC3<^4L7R2mWV#gcHQfd1:ASV87^6HO6mXlCB2hi;VO3i_Fm:MQT1>"
        A$ = A$ + "0bKagC7PdI3hTkgKn2_YH>m5<>1GCi`?G4YYCRom_O__NaLmlW3>G#okM5F?"
        A$ = A$ + "WV^ajhYa7m[KonalOnLoo4Om1A2=n8#T3070[:58TS3Q]i<jEnk;>BhT_bO2"
        A$ = A$ + "ST5D]Q6]f:inH]iI<]29<_6MQfSPVKIX;1G?^SiWOI?Ko[FW?o9l2^M8<_0l"
        A$ = A$ + "ON?JoWAChoEA7`]ES8;4kcMliI8\kD7Gmnmae7`N5l<0M=RThSW8eW=Nm926"
        A$ = A$ + "Yo=NolTkg;hW_NS`Pc170iUBYeg_?PojQ;Mf;09H\_[oQf_?XLaLmlW3>GAo"
        A$ = A$ + "?>Gm3^\cEddCC8V0TiiicmoCanUB:8V4L8>Q8e3#6>YVL:gD`=WiPon1Q4<b"
        A$ = A$ + "=jG>4ZP^9okd4gkV<M98CdRCHjc^OSkgWg78mKLf6N8eaG7Y\Ye8\jA\#eh1"
        A$ = A$ + "JMhffRan]hUPU_P28f2ko5Q>bS1PYag1?3#GS89nhY3<0ISGORP3To=LklTk"
        A$ = A$ + "g[hW[n0Y1UF^l8X48Ml0:F?IUmkc:5e51S]MeG^l[R9CW3omnmCGoP;kL5=o"
        A$ = A$ + "d`N20W7#bmocC^OOn88I;:C0d3LTVA9;^JTfUJ5HJ`T_ZK17TCXOdE82\Iaj"
        A$ = A$ + "V\9HT<E92_VAfL`6D;=]0A:9\T2gZ9O[iOm\OdKl]GJlN0oaC<[QL]S]3U`a"
        A$ = A$ + "Bg9?SHDTlmZZLd[#BiDF?=1CmVh>hI0jJ49aW?Q18KlNnc1WX;#6i3c?#Y;F"
        A$ = A$ + "OThL_kgSkXPV1SPLlRZ4f4#Q]^LRZYlhon<[?>lOekg?Ieo6f_?B2X1m4``g"
        A$ = A$ + "7N6nW\m#=DP>4\jE\5VI=P]B:?>DFBK#i2[g=neo05GXoK]OOl6njddeoJ6i"
        A$ = A$ + "59GC:jCO=:9QUDhF=iK=oKPm3Nc_lbBhQ[^O4cjNbFjA?D<PC^QjI4SRakgk"
        A$ = A$ + "o077MPW`3THlM`c0de8BR?OZLZ>ahmlW3>_nmk]S=InX8Pa;XA<_L:YbNPTb"
        A$ = A$ + "oM0D4OZQ21>Ao`MbYYVboe]OObN`0O?oiPc_QmkCd0J8?1jn`D=maVcH1WM>"
        A$ = A$ + "mD?1<fBAX6`A#NNdQGPCGHD^`jMbZ[n><nS]OOd6n^DdSTOT_2mPfT#1WcbX"
        A$ = A$ + "S\09`BQKcT_el_19J`k4GNaIldCg?RIm0dU>dg<9Fj>iI4QQ\m51ZAW[Dm<^"
        A$ = A$ + "Qfj=aM`c0de8BR=?1A8KlNnc1Wl;#DlYl;HJDe?fI3PGinmS_j0kG77_YmkE"
        A$ = A$ + "a`=A<<^^6Dn__mk5e;V[WoL`iGanm1G#W9#aES3Nf6:8hVmKPMek60KKZ1d="
        A$ = A$ + "#U8KhCJ4U]:OWIoN3cR6N>VfiO9l_<cL^H?fT7Yi4h40X`85L=0;GM>4_H[i"
        A$ = A$ + "<]Sl3NmGN[#FOSki?oi7YlK4je^[4LlLRmk9TSZ6kmk7O2N`V=N?n=diXF[U"
        A$ = A$ + "?:o2V6EmUF[1l3JonSR594PjEa`m##7CGC:ogcnm1e;V[WoL`iGbnmfof0EM"
        A$ = A$ + "B>ONj#TmXaYWR3dY=N0X9nkHon0Fcj_QHA3?5Ckl7Z^gW9>Il7JGenmWKnY#"
        A$ = A$ + "4S=9a\j3DX0:l:]VCe>boc3YGN9HfiJhWAZA?DY<#2fJA]DT9#<eh7G^YY6g"
        A$ = A$ + "g0MmVh>hI06O\dWHkC88b6_7o6jLD[eb7WOnYAFoH[SADh>DbjVl3827_Pmk"
        A$ = A$ + "3R=f31M<M=YlhK]\lLhojg_W30:QRD>hl[IoNcOMP:>9W??1E=^36WL2>HCi"
        A$ = A$ + "ff_Wg0EVTIGRDGHUPRji9f_gA\\YW2ZKnSegkc8LcOTMM[goE_O_>]gmY;bJ"
        A$ = A$ + "Dm>^oc3YGN9H>PfSOoc?Big8d[YTjj>7ZD12#g>G^aQYVoVg_?hSe3QOlKXc"
        A$ = A$ + "BcTb7WOnYAFOYgY8:LSl:DA54nmkSFRW7A6S1TT>kmkc>KhMX8U3>oRf_GnW"
        A$ = A$ + "7XRCdic3?8D>`V87>9VQVT8f<[1dUabl[MoN5_dSn9<GgO=Fmd9h0kIJG#W?"
        A$ = A$ + "14GanmTCi`bOSgOFcJDM`YNk3UOVPI5POMkgO`\QhPBHaQhCmH0HJlM`c0<m"
        A$ = A$ + "LI#PLRAfhmc3EW`V9U?1o4SCBmSm^`?E7a^ANEn4#dCA`0MPW0=]9H:ZbZo>"
        A$ = A$ + "9M5l9UKW^cbOO7RkVC:^emkaGGb[WCc0IYfjKJoN8:S1mi`9a4\T5RWZB9iL"
        A$ = A$ + "CV:IfU#e56U;`GPd9MeAE5_TCnI\94hKe6>Ol7G=UM1mm<#lng_GVgW`YkXe"
        A$ = A$ + "Lf2N[[=Yb?kA0SI[SA`RD3<D;:T1_No:f__?3NLBmn60iWSo<7^ha=:1oaI;"
        A$ = A$ + "NlniQZCLgDbWAo9SCi__Zf_G>OT>RMSlZl9Phng__6jlk7;`NEl3aQ=KcaOK"
        A$ = A$ + "7bW6U>cj#S[aO5]On:_odjb;?1b2XhHe=jliH`8]<>5:9VPU\#lDE:i4jCkD"
        A$ = A$ + "PWmfBheG0;XU[_O_0Rf<H1?]IKo;cjHB8]>?e_TYWRA>hRKAWQ0CPa[d07eo"
        A$ = A$ + "Kl5Tag6i8Pm0NjWOTb_2f[YSfCW5PmPJma1E0NZF1=l5_O?k_?HXGNSRX?G]"
        A$ = A$ + "d`mO?0LRk6`3QPfaJ6m[d\;KoNjm[jPc0VmmNGL=]=oUE#8[n3UD0fVia#k9"
        A$ = A$ + "W>F7]3X]3jLJLYdIF7JL=n[Gjnmlko1b2J8_dmk7n:?YS7dkj?LjH19>UmPH"
        A$ = A$ + "lL30Inkg>RJZ7PVbU#i<4D0AK6\PWf\]g3`EcUQOj[hRjiI1IV0h<3m>GO^g"
        A$ = A$ + "k?[I]Gj>:FC>UOR#0k1ld?oH:nm_TGB3#KnH9<DZN7X?ohB07^X065a:H<9V"
        A$ = A$ + "E?3`\CVb98NJm][?<g9IjhjWKnYC4N2jN\fMnii__mk;APEIdCo=VnoD8_1I"
        A$ = A$ + "eW>M5jojg_g]31:JYj1Wakgc^oFiTCO6l48;fYLZKW8ElXch#PcY6Wb2MdTi"
        A$ = A$ + "UW;74A3:QVR<nonA#5ca?\0`5gGUIk_QMG:mO0E6V9]fTaU`Nc5hH82m>GSN"
        A$ = A$ + "[g^nQ00GM7eMFC>UO>RPIOYnl9\1CiQfORkiZ:G4eZXQD_W8GW0cc6hY9<6f"
        A$ = A$ + "?1JjDbg81F523GLimd5>BX4Z4LfiWZO7eW:eGjNnOOVhg=?EJZn6PMQK68Y["
        A$ = A$ + "^dJJj7^O8=16]6cW=`ICWheEJQH\XM#WCW[ZFhj#S[aOU]OOjk?akgC08FCd"
        A$ = A$ + "Z[OiIHR7M671L>=nLT#6m4cOC4168F`TW9g_?l?g9o4YLoNiiWi=SGQijOHl"
        A$ = A$ + "[J0>NlZNFbV4]TkB8?5TLda9>GiOVkg[^fgm``k2hOFP#nmmQdoi7YLNLgY5"
        A$ = A$ + "5BEU;R:P?4mPX^SOPR76Gne]OObnY:7hn?9oB7_KHon`iG8Pni[6gMnceM<R"
        A$ = A$ + "P><bB9`Ln1Odb_dmk[O2R<?dWWLOc`j=CWmmK#QS^h57XaM^dUS2fhJlGc^O"
        A$ = A$ + "_nm7fiGJnH11##\4<Z_d_8DCXD?S17T30Tn#a04\bM8oQ?2`Q60gPN7LEX<Z"
        A$ = A$ + "#n9POl_aShWXUbc?3]O9VYm>2Ni3`aSo3OZf6KIgU#NcUPH82mVGoLHL;6l4"
        A$ = A$ + "PlZAGZS9#`5Gl9g_g_Nl<VZ`515#WNGNnWXO;GnbkWnVf_?JiWV4PCG[C:M2"
        A$ = A$ + "iO9m#mSDOJki;B6eMZV8#PdV3Lliogo0C#7o7mDk_^nn20am_Q9V>e0#;<Q0"
        A$ = A$ + "en41V\ND\Rf<h<PoZY?hl37]0?F#j:AY0I44V0L<Hj::78oXCQ9F=YXi_94="
        A$ = A$ + "0^1Ab3LDUekRW^NO4o<\nC`\<l=>0n>keg;QmD#bA7WhTec_8V0amHb;nSYd"
        A$ = A$ + "hM<>5Gh[GUFnhi<ePPnR:Yi`i4kgSX\N0Zi33_HiOjkgCQSeO22`Y[e9U>CZ"
        A$ = A$ + "oLmC_O6MLB587Adj38=6bhf<F756KOa<d4NigObgOcQ_Dmgkg_hg_RC#:8nn"
        A$ = A$ + "CcbD_hOo0U^2bYg5141n>nU=ooS[TV64S?IjLeKagdD3m3#hC`L<lM>0n>Ke"
        A$ = A$ + "g[QlDDRQWTH>mhInN_OY_hgoLgDd4GY=Tg^:]\[3c#KJ;V`<7>[_NolkgS:P"
        A$ = A$ + ";PRb=94XFB0:eCM#8H8mI>8Sg5^OoDkW7:PliSg120FRXT7DJ\8QlUQ3f=VL"
        A$ = A$ + "X6>IhL1`RP]1dY;0O1OE00jC4H:0#QJL=n[dmkcNoQ?PV<T22_NKF60heCI0"
        A$ = A$ + "F^8cSH;nXik;OoNKkQ9XK:UO>0n4<75OSC##S]2le#N::a`CBL2jYi#44gQY"
        A$ = A$ + "_ik:\lC<dUVXNGKV3T^JFoZ>_^5Ad;Z8aI\CZhfb==8#\T0#9D:33Y?CB9Sg"
        A$ = A$ + "bkg[FH1A##jN5LRi3?RRNhk^9;BTQlXUa`1k6a]n<[^eQ1]A7gSP3OjdQ:O8"
        A$ = A$ + "E#QS^2J?W53^D8PRdhJlGakg7mncbI854:0n\d08:W2=V^SUAPQfKSl4?oDU"
        A$ = A$ + "dfPDlI3W[L3na==X144n0\`QlUbY^F7TR8[[QmDDRQWTh4dCcQ88^53N44L_"
        A$ = A$ + "oILSj2Nk2E1m]#7_ODbj_\b[KA4URjAg3ZiFTP]LH3VJonQoM^j;XD?e1QSQ"
        A$ = A$ + "dWiQ<NGjnmC]O^G1e_Q1bB[#NR`47LBT83iEP^f\0nEIFUT5gMQeeBkC09VB"
        A$ = A$ + "0In;Uc^o:`:Hnh\P2FDeGcnmC^k<Q3TDT223PP\T0XZV5[nk^j:Nb`W8>CNm"
        A$ = A$ + "]==]\P`83nTI;T2A:cE2`7PIhhKL2BJ\CQ_6fCA96NBRc#?97bPh><mEOMM="
        A$ = A$ + "9;aN4<4fdG3M4oI5;oj:]^C2X#D?:V2WJ6fj[9dUEVFeFGO1UjY>8\<Tn4ik"
        A$ = A$ + "jg_7F2WR4JG=20^iceo8RPeVdjkmSNbbO6nS43cb1WMQOjG>Pbi_?D0AWAmj"
        A$ = A$ + "RGC5DhX;YfhHAaUGSTlN`IfnmR3WW>iSGOTQLT2200A^RTl082fjO<WJE>28"
        A$ = A$ + "7=LJZHU\HcEN3``cW=Ybk`OZnZW#NmO0VQS__A8Za>jM=TgLoIM4VALIin^_"
        A$ = A$ + "R9OiAGEiWDd1OFPVIZHDOcMi;kbcVgkko_i_2m1X0_Gk:ToCPaI?nWn]Z?:;"
        A$ = A$ + "SkjTTH4PoEYOghi`WlA<QK]^5\_VeT3iY_oo^OoiTmofOoo\`k:oR`oclUS4"
        A$ = A$ + ";BNNQlY_cAI]LhcBUHaQTh<R;;ggnU?Do_`g:bQIj>NIg]UW=O]OIHKO8fgn"
        A$ = A$ + "ORIKGPMSG2n2_O=?Uo27b[`nS>fK;cn`G_?2XkS;_bmkUH42a;cN;kgon<f`"
        A$ = A$ + "^odjf^2Ko7YgfNonFK_OOXm7M\gFVmm_Oo5HkmkWeN\Oo5m_Le5#YKe`cjWd"
        A$ = A$ + "Mh]m5Kko8mO?KjoWlhIJeGge[mnmQfOdaNKAfkkbaWdUb?Smk9BbWT#mdN^P"
        A$ = A$ + "oIifWil=Hkmkgf=JgibMKkSd6?]O1[go=MkJ_OOVm=Nf^]GVmNG_oCiBiWdn"
        A$ = A$ + "mhU8CQhUI72K1T^7BNM6NbnX^4_]_HKoGYoSI37h[nacP>\l7VO[fNon<k_i"
        A$ = A$ + "D_]#K_Ooogfkg?_mgJoNhIc7eMh]m=Kko<mO<kJnfiLMhj`nn]iilghDNNk_"
        A$ = A$ + "iD_]#kMMihcjB9U=ad4oFf\_ka196RGVan3DOTTmlfNon]]]]MAf;hKWOgOG"
        A$ = A$ + "N_OOTmENf^]GVm^^KlIMYlbf__9kEn^:<m?:UZaXo9Z?AbNN[>JoVWf]]]]M"
        A$ = A$ + "Of;hCWOgOFNNBoE>VWenC>dKK6k?ooGGKoW2i^2QPi865_?fOMhenfnK^m_H"
        A$ = A$ + "[>JoR7f]]]]MWfmoUc_k?;??Yo:7ccJo97j]mYKOHG:1O5Lf?<:0HJR0laik"
        A$ = A$ + "MoW9ldmkn?TTJUIkgl`^]]]]ke^k?LnMoEiiImgiLN>k;m`MKob]?\kTP?3>"
        A$ = A$ + "mG6Y0<?CbL9\YJiI\gLkOYFIdn5?[KKKKk^]kmcVOgODNNJoU>XWbn;>cKKK"
        A$ = A$ + "CJP_3>oW690LglmM_PmK^m_>3<H[>[o?TSDj%%%0"
        btemp$ = ""
        FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4)
            IF INSTR(1, B$, "%") THEN
                FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1)
                    IF F$ <> "%" THEN C$ = C$ + F$
                NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
                IF MID$(B$, j, 1) = "#" THEN
            MID$(B$, j) = "@": END IF: NEXT
            FOR t% = LEN(B$) TO 1 STEP -1
                B& = B& * 64 + ASC(MID$(B$, t%)) - 48
                NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
                X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
        NEXT: btemp$ = btemp$ + X$: NEXT
        btemp$ = _INFLATE$(btemp$, m.SIZE)
        _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
        _DEST fontsheet&: _CLEARCOLOR 0
        _DEST origdest
        initfont = 1
    END IF

    'change color to original fontsheet
    _DEST fontsheet&
    _PALETTECOLOR 15, clr&, fontsheet&
    monofont& = _COPYIMAGE(fontsheet&)

    xw = INT(size / 2)
    FOR i = 1 TO LEN(txt$)
        A$ = MID$(txt$, i, 1)
        tmp& = _NEWIMAGE(32, 64, 32)
        _DEST tmp&
        IF A$ = "A" THEN _PUTIMAGE (0, 0), monofont&
        IF A$ = "B" THEN _PUTIMAGE (0 - 32, 0), monofont&
        IF A$ = "C" THEN _PUTIMAGE (0 - (32 * 2), 0), monofont&
        IF A$ = "D" THEN _PUTIMAGE (0 - (32 * 3), 0), monofont&
        IF A$ = "E" THEN _PUTIMAGE (0 - (32 * 4), 0), monofont&
        IF A$ = "F" THEN _PUTIMAGE (0 - (32 * 5), 0), monofont&
        IF A$ = "G" THEN _PUTIMAGE (0 - (32 * 6), 0), monofont&
        IF A$ = "H" THEN _PUTIMAGE (0 - (32 * 7), 0), monofont&
        IF A$ = "I" THEN _PUTIMAGE (0 - (32 * 8), 0), monofont&
        IF A$ = "J" THEN _PUTIMAGE (0 - (32 * 9), 0), monofont&
        IF A$ = "K" THEN _PUTIMAGE (0 - (32 * 10), 0), monofont&
        IF A$ = "L" THEN _PUTIMAGE (0 - (32 * 11), 0), monofont&
        IF A$ = "M" THEN _PUTIMAGE (0 - (32 * 12), 0), monofont&
        IF A$ = "N" THEN _PUTIMAGE (0 - (32 * 13), 0), monofont&
        IF A$ = "O" THEN _PUTIMAGE (0 - (32 * 14), 0), monofont&
        IF A$ = "P" THEN _PUTIMAGE (0 - (32 * 15), 0), monofont&
        IF A$ = "Q" THEN _PUTIMAGE (0 - (32 * 16), 0), monofont&
        IF A$ = "R" THEN _PUTIMAGE (0 - (32 * 17), 0), monofont&
        IF A$ = "S" THEN _PUTIMAGE (0 - (32 * 18), 0), monofont&
        IF A$ = "T" THEN _PUTIMAGE (0 - (32 * 19), 0), monofont&
        IF A$ = "U" THEN _PUTIMAGE (0 - (32 * 20), 0), monofont&
        IF A$ = "V" THEN _PUTIMAGE (0 - (32 * 21), 0), monofont&
        IF A$ = "W" THEN _PUTIMAGE (0 - (32 * 22), 0), monofont&
        IF A$ = "X" THEN _PUTIMAGE (0 - (32 * 23), 0), monofont&
        IF A$ = "Y" THEN _PUTIMAGE (0 - (32 * 24), 0), monofont&
        IF A$ = "Z" THEN _PUTIMAGE (0 - (32 * 25), 0), monofont&
        IF A$ = "a" THEN _PUTIMAGE (0 - (32 * 26), 0), monofont&
        IF A$ = "b" THEN _PUTIMAGE (0 - (32 * 27), 0), monofont&
        IF A$ = "c" THEN _PUTIMAGE (0 - (32 * 28), 0), monofont&
        IF A$ = "d" THEN _PUTIMAGE (0 - (32 * 29), 0), monofont&
        IF A$ = "e" THEN _PUTIMAGE (0 - (32 * 30), 0), monofont&
        IF A$ = "f" THEN _PUTIMAGE (0 - (32 * 31), 0), monofont&
        IF A$ = "g" THEN _PUTIMAGE (0 - (32 * 32), 0), monofont&
        IF A$ = "h" THEN _PUTIMAGE (0 - (32 * 33), 0), monofont&
        IF A$ = "i" THEN _PUTIMAGE (0 - (32 * 34), 0), monofont&
        IF A$ = "j" THEN _PUTIMAGE (0 - (32 * 35), 0), monofont&
        IF A$ = "k" THEN _PUTIMAGE (0 - (32 * 36), 0), monofont&
        IF A$ = "l" THEN _PUTIMAGE (0 - (32 * 37), 0), monofont&
        IF A$ = "m" THEN _PUTIMAGE (0 - (32 * 38), 0), monofont&
        IF A$ = "n" THEN _PUTIMAGE (0 - (32 * 39), 0), monofont&
        IF A$ = "o" THEN _PUTIMAGE (0 - (32 * 40), 0), monofont&
        IF A$ = "p" THEN _PUTIMAGE (0 - (32 * 41), 0), monofont&
        IF A$ = "q" THEN _PUTIMAGE (0 - (32 * 42), 0), monofont&
        IF A$ = "r" THEN _PUTIMAGE (0 - (32 * 43), 0), monofont&
        IF A$ = "s" THEN _PUTIMAGE (0 - (32 * 44), 0), monofont&
        IF A$ = "t" THEN _PUTIMAGE (0 - (32 * 45), 0), monofont&
        IF A$ = "u" THEN _PUTIMAGE (0 - (32 * 46), 0), monofont&
        IF A$ = "v" THEN _PUTIMAGE (0 - (32 * 47), 0), monofont&
        IF A$ = "w" THEN _PUTIMAGE (0 - (32 * 48), 0), monofont&
        IF A$ = "x" THEN _PUTIMAGE (0 - (32 * 49), 0), monofont&
        IF A$ = "y" THEN _PUTIMAGE (0 - (32 * 50), 0), monofont&
        IF A$ = "z" THEN _PUTIMAGE (0 - (32 * 51), 0), monofont&
        IF A$ = "0" THEN _PUTIMAGE (0 - (32 * 52), 0), monofont&
        IF A$ = "1" THEN _PUTIMAGE (0 - (32 * 53), 0), monofont&
        IF A$ = "2" THEN _PUTIMAGE (0 - (32 * 54), 0), monofont&
        IF A$ = "3" THEN _PUTIMAGE (0 - (32 * 55), 0), monofont&
        IF A$ = "4" THEN _PUTIMAGE (0 - (32 * 56), 0), monofont&
        IF A$ = "5" THEN _PUTIMAGE (0 - (32 * 57), 0), monofont&
        IF A$ = "6" THEN _PUTIMAGE (0 - (32 * 58), 0), monofont&
        IF A$ = "7" THEN _PUTIMAGE (0 - (32 * 59), 0), monofont&
        IF A$ = "8" THEN _PUTIMAGE (0 - (32 * 60), 0), monofont&
        IF A$ = "9" THEN _PUTIMAGE (0 - (32 * 61), 0), monofont&
        IF A$ = "+" THEN _PUTIMAGE (0 - (32 * 62), 0), monofont&
        IF A$ = "-" THEN _PUTIMAGE (0 - (32 * 63), 0), monofont&
        IF A$ = "=" THEN _PUTIMAGE (0 - (32 * 64), 0), monofont&
        IF A$ = ":" THEN _PUTIMAGE (0 - (32 * 65), 0), monofont&
        IF A$ = "." THEN _PUTIMAGE (0 - (32 * 66), 0), monofont&
        IF A$ = "," THEN _PUTIMAGE (0 - (32 * 67), 0), monofont&
        IF A$ = " " THEN _PUTIMAGE (0 - (32 * 68), 0), monofont&
        IF A$ = "<" THEN _PUTIMAGE (0 - (32 * 69), 0), monofont&
        IF A$ = ">" THEN _PUTIMAGE (0 - (32 * 70), 0), monofont&
        IF A$ = "/" THEN _PUTIMAGE (0 - (32 * 71), 0), monofont&
        IF A$ = "?" THEN _PUTIMAGE (0 - (32 * 72), 0), monofont&
        IF A$ = ";" THEN _PUTIMAGE (0 - (32 * 73), 0), monofont&
        IF A$ = "'" THEN _PUTIMAGE (0 - (32 * 74), 0), monofont&
        IF A$ = "[" THEN _PUTIMAGE (0 - (32 * 75), 0), monofont&
        IF A$ = "]" THEN _PUTIMAGE (0 - (32 * 76), 0), monofont&
        IF A$ = "{" THEN _PUTIMAGE (0 - (32 * 77), 0), monofont&
        IF A$ = "}" THEN _PUTIMAGE (0 - (32 * 78), 0), monofont&
        IF A$ = "\" THEN _PUTIMAGE (0 - (32 * 79), 0), monofont&
        IF A$ = "|" THEN _PUTIMAGE (0 - (32 * 80), 0), monofont&
        IF A$ = "_" THEN _PUTIMAGE (0 - (32 * 81), 0), monofont&
        IF A$ = "`" THEN _PUTIMAGE (0 - (32 * 82), 0), monofont&
        IF A$ = "~" THEN _PUTIMAGE (0 - (32 * 83), 0), monofont&
        IF A$ = "!" THEN _PUTIMAGE (0 - (32 * 84), 0), monofont&
        IF A$ = "@" THEN _PUTIMAGE (0 - (32 * 85), 0), monofont&
        IF A$ = "#" THEN _PUTIMAGE (0 - (32 * 86), 0), monofont&
        IF A$ = "$" THEN _PUTIMAGE (0 - (32 * 87), 0), monofont&
        IF A$ = "%" THEN _PUTIMAGE (0 - (32 * 88), 0), monofont&
        IF A$ = "^" THEN _PUTIMAGE (0 - (32 * 89), 0), monofont&
        IF A$ = "&" THEN _PUTIMAGE (0 - (32 * 90), 0), monofont&
        IF A$ = "*" THEN _PUTIMAGE (0 - (32 * 91), 0), monofont&
        IF A$ = "(" THEN _PUTIMAGE (0 - (32 * 92), 0), monofont&
        IF A$ = ")" THEN _PUTIMAGE (0 - (32 * 93), 0), monofont&
        IF A$ = CHR$(34) THEN _PUTIMAGE (0 - (32 * 94), 0), monofont&

        _DEST origdest
        _PUTIMAGE (x + (i * xw), y)-(x + (i * xw) + INT(size / 2), y + size), tmp&
        _FREEIMAGE tmp&
    NEXT
    _FREEIMAGE monofont&
END SUB

   

Find my programs here in Dav's QB64 Corner
Reply
#15
Just reading the code and wondering why you never free fontsheet& , is that because you passed it to _Memimage ?
Reply
#16
(06-01-2022, 07:22 PM)James D Jarvis Wrote: Just reading the code and wondering why you never free fontsheet&  , is that because you passed it to _Memimage ?

No, to increase speed when calling the SUB more than once.  I decided it better to make fontsheet& only once and just leave it open for the whole program run, so the image doesn't have to be decoded/created every time the SUB is called.  I plan to use this for things that need fast drawing.  In my testing this increased speed over 10x.  I could call the SUB 1500 times in one second this way, but only 135 times a second when freeing the image and having to make it over every time.   I usually don't like to leave images hanging open, but in this case thought it worth it for the speed gain.

- Dav

Find my programs here in Dav's QB64 Corner
Reply
#17
(06-01-2022, 10:36 PM)Dav Wrote:
(06-01-2022, 07:22 PM)James D Jarvis Wrote: Just reading the code and wondering why you never free fontsheet&  , is that because you passed it to _Memimage ?

No, to increase speed when calling the SUB more than once.  I decided it better to make fontsheet& only once and just leave it open for the whole program run, so the image doesn't have to be decoded/created every time the SUB is called.  I plan to use this for things that need fast drawing.  In my testing this increased speed over 10x.  I could call the SUB 1500 times in one second this way, but only 135 times a second when freeing the image and having to make it over every time.   I usually don't like to leave images hanging open, but in this case thought it worth it for the speed gain.

- Dav

Is there something gained by doing this in the sub and keeping track of the memory location as opposed to doing it outside the sub but with a shared handle created before calling the sub?  (sorry about the questions, just getting into really paying attention to memory usage as a feature to speed execution as opposed to just being able to hold onto data and make use of it).
Reply
#18
Probably not.  I'm not really sure which is best to be honest.  I guess the only gain of doing it this way (and something I was interested in) is having a totally portable SUB that's easily pasted to the end of other programs, without having to stick stuff in the main code area too.  I think I will do a test to see if there's a speed increase with sharing it outside the sub. 

(EDIT: Speed wise there doesn't seem to be a difference between DIM SHARED handle and all SUB method)

- Dav

Find my programs here in Dav's QB64 Corner
Reply
#19
New version 1.6 below.  I added James Jarvis suggestions.  Press D to pick a draw color, and press E for eraser.  You can now load any image file QB64 supports by pressing L, and you can pick a filename when saving a BMP image, so you're not limited to just one now.  Gave it an updated menu with the new options, and current colors are shown.

- Dav

EDIT: Fixed a typo. Now pressing F works.

Code: (Select All)
'============
'QuadDraw.bas v1.6
'============
'An odd little drawing program.
'Draws/paints in several areas of the screen at same time.
'Coded by Dav for QB64 JUN/2022

'NEW FOR v1.6:
'              New menu to show the new options available.
'              PRESS D to choose a draw color
'              PRESS E toggles Eraser On/Off (Hold & draw for neat effect)
'              PRESS L to Load a previously saved image file.
'              Can load any image file format that QB64 supports.
'              The current Draw & Fill colors now shown in menu.
'              Can now choose the filename when saving .BMP file.

'CREDITS: SPAINT SUB was made by Petr.  Thanks Petr!
'         text SUB was made by bplus.  thanks bplus!
'         (bplus helped me out how to draw lines without gaps too)
'         Thanks to James Jarvis for draw color and eraser idea/code!

'----------
'HOW TO USE:
'----------

'Left click on mouse and hold to draw on the screen.

'Press 1,2,3 or 4 to set how many areas to draw in, default is 4.

'Use the +/- keys to change brush size (1 to 50 allowed)

'Right click to fill/paint the areas with color.
'Default fill color is picked randomly, but you can select one.

'Press D to select a new draw color for brush.

'Press F to select a fill color (doing so turns random fill color off)

'Press R to toggle random fill color on/off (default is a random color)

'Press E to toggle Erase on/off.  Hold it while drawing for dotted lines.

'Press A to smooth the screen using AntiAliasing.

'Press S to save current image as QUADDRAW.BMP in current dir.

'Press L to Load a previously saved image on the screen.

'Press U to undo last change made to image.

'Space = clears screen and starts over.

'ESC = Ends program

'================================================================

DIM SHARED quads, brushsize, randfill, eraser, menu&, blk&, fill&

menu& = BASIMAGE1&

SCREEN _NEWIMAGE(1000, 600, 32) '_DESKTOPWIDTH * .75, _DESKTOPHEIGHT * .85, 32)

centerx = (_WIDTH - 200) / 2
centery = _HEIGHT / 2

wht& = _RGB(255, 255, 255) 'used often, so variable it
blk& = _RGB(0, 0, 0)
fill& = _RGB(RND * 255, RND * 255, RND * 255)
brushsize = 3 'size of drawing circle (brush)
quads = 4 'start with 4 drawing sections
randfill = 1 'default is use random fill color turned on

CLS , wht& 'start with white screen

_DELAY .25

undo& = _COPYIMAGE(_DISPLAY)

'====
main:
'====

_TITLE "QuadDraw - Quads:" + STR$(quads) + "  BrushSize:" + STR$(brushsize)

DrawMenu

DO

    WHILE _MOUSEINPUT: WEND

    mx = _MOUSEX: my = _MOUSEY

    IF mx <= (_WIDTH - 200 - brushsize / 2) THEN

        IF _MOUSEBUTTON(1) THEN

            IF stilldown = 0 THEN
                _FREEIMAGE undo&
                undo& = _COPYIMAGE(_DISPLAY)
            END IF

            IF stilldown = 1 THEN
                stepx = lastmx - mx
                stepy = lastmy - my
                length = INT((stepx ^ 2 + stepy ^ 2) ^ .5)
                dx = stepx / length
                dy = stepy / length
                FOR i = 0 TO length
                    FOR d = 1 TO brushsize
                        newx = mx + dx * i: newy = my + dy * i
                        CIRCLE (newx, newy), d, blk&
                        IF brushsize > 1 THEN PAINT (newx, newy), blk&, blk&
                        IF quads > 1 THEN
                            CIRCLE (centerx - newx + centerx, centery - newy + centery), d, blk&
                            IF brushsize > 1 THEN PAINT (centerx - newx + centerx, centery - newy + centery), blk&, blk&
                        END IF
                        IF quads > 2 THEN
                            CIRCLE (newx, centery - newy + centery), d, blk&
                            IF brushsize > 1 THEN PAINT (newx, centery - newy + centery), blk&, blk&
                        END IF
                        IF quads > 3 THEN
                            CIRCLE (centerx - newx + centerx, newy), d, blk&
                            IF brushsize > 1 THEN PAINT (centerx - newx + centerx, newy), blk&, blk&
                        END IF
                    NEXT
                NEXT
            ELSE
                FOR d = 0 TO brushsize STEP .2
                    CIRCLE (mx, my), d, blk&
                    IF quads > 1 THEN
                        CIRCLE (centerx - mx + centerx, centery - my + centery), d, blk&
                    END IF
                    IF quads > 2 THEN
                        CIRCLE (mx, centery - my + centery), d, blk&
                    END IF
                    IF quads > 3 THEN
                        CIRCLE (centerx - mx + centerx, my), d, blk&
                    END IF
                NEXT
            END IF
            lastmx = mx: lastmy = my
            stilldown = 1
            DrawMenu: _DISPLAY
        ELSE
            stilldown = 0
        END IF

        'if right click, fill sections with random color
        IF _MOUSEBUTTON(2) THEN

            _FREEIMAGE undo&
            undo& = _COPYIMAGE(_DISPLAY)

            IF randfill = 1 THEN
                r = RND * 255: g = RND * 255: b = RND * 255
                fill& = _RGB(r, g, b)
            END IF

            _DISPLAY

            SPAINT mx, my, fill& ', blk&
            IF quads > 1 THEN
                SPAINT centerx - mx + centerx, centery - my + centery, fill& ', blk&
            END IF
            IF quads > 2 THEN
                SPAINT mx, centery - my + centery, fill& ', blk&
            END IF
            IF quads > 3 THEN
                SPAINT centerx - mx + centerx, my, fill& ', blk&
            END IF

            DrawMenu

            _AUTODISPLAY

            WHILE _MOUSEBUTTON(2) <> 0: N = _MOUSEINPUT: WEND
        END IF

    END IF

    'get keyboard input
    key$ = UCASE$(INKEY$)
    IF key$ <> "" THEN
        SELECT CASE key$
            CASE CHR$(32): CLS , wht&: DrawMenu 'scpace clears screen again
            CASE "1": quads = 1
            CASE "2": quads = 2
            CASE "3": quads = 3
            CASE "4": quads = 4
            CASE "+"
                brushsize = brushsize + 1: IF brushsize > 50 THEN brushsize = 50
            CASE "-"
                brushsize = brushsize - 1: IF brushsize < 1 THEN brushsize = 1
            CASE "U": _PUTIMAGE (0, 0), undo&
            CASE "A": Smooth
            CASE "S"
                saveimg$ = IBOX$("NAME OF BMP TO SAVE-> ", 40, _RGB(255, 255, 255), _RGB(96, 96, 96), 0)
                IF saveimg$ <> "" THEN
                    IF LCASE$(RIGHT$(saveimg$, 4)) <> ".bmp" THEN saveimg$ = saveimg$ + ".bmp"
                    SaveAsBMP saveimg$
                    a$ = IBOX$(UCASE$(saveimg$) + " SAVED!", 0, _RGB(255, 255, 255), _RGB(96, 96, 96), 2)
                END IF
            CASE "F"
                new& = ColorPicker&(200, 150)
                IF new& <> 0 THEN
                    randfill = 0
                    fill& = new&
                END IF
            CASE "D"
                new& = ColorPicker&(200, 150)
                IF new& <> 0 THEN
                    blk& = new&
                ELSE
                    blk& = _RGB(0, 0, 0)
                END IF
            CASE "E"
                SELECT CASE eraser
                    CASE IS = 1: eraser = 0
                    CASE IS = 0: eraser = 1
                END SELECT
                IF blk& = _RGB(0, 0, 0) THEN
                    blk& = wht&
                ELSE
                    blk& = _RGB(0, 0, 0)
                END IF
            CASE "R"
                DO UNTIL INKEY$ = "": LOOP
                SELECT CASE randfill
                    CASE IS = 1: randfill = 0
                    CASE IS = 0: randfill = 1
                END SELECT
            CASE "L"
                openimg$ = IBOX$("IMAGE TO LOAD-> ", 40, _RGB(255, 255, 255), _RGB(96, 96, 96), 0)
                'if filename given
                IF openimg$ <> "" THEN
                    'if file exists..
                    IF _FILEEXISTS(openimg$) THEN
                        'test loading image
                        o& = _LOADIMAGE(openimg$)
                        IF o& = -1 THEN
                            a$ = IBOX$(UCASE$(openimg$) + " NOT VALID!", 0, _RGB(255, 255, 255), _RGB(96, 96, 96), 2)
                        ELSE
                            _PUTIMAGE (0, 0)-(_WIDTH - 200, _HEIGHT), o&
                            _FREEIMAGE o&
                        END IF
                    ELSE
                        a$ = IBOX$(UCASE$(openimg$) + " NOT FOUND!", 0, _RGB(255, 255, 255), _RGB(96, 96, 96), 2)
                    END IF
                END IF
            CASE CHR$(27): END
        END SELECT
        DO UNTIL INKEY$ = "": LOOP
        _DISPLAY
        GOTO main
    END IF

    _AUTODISPLAY

LOOP

END

SUB SPAINT (x AS INTEGER, y AS INTEGER, clr~&) 'Color everything in the X, Y position regardless of the border color.
    'SUB by Petr
    DIM m AS _MEM, m2 AS _MEM

    m = _MEMIMAGE(_DEST)
    W = _WIDTH(_DEST)
    H = _HEIGHT(_DEST)
    P = _PIXELSIZE(_DEST)

    SELECT CASE P
        CASE 4 '                             image is 32 bit image
            Virtual = _NEWIMAGE(W, H, 32)
            m2 = _MEMIMAGE(Virtual)
            Back~& = POINT(x, y)
            Back2~& = _RGB32(1, 1, 1)
            Empty~& = _RGBA32(0, 0, 0, 0)
            DO UNTIL a& = m.SIZE - 4
                a& = a& + 4
                IF _MEMGET(m, m.OFFSET + a&, _UNSIGNED LONG) = Back~& THEN _MEMPUT m2, m2.OFFSET + a&, Back~& ELSE _MEMPUT m2, m2.OFFSET + a&, Back2~&
            LOOP
            d = _DEST
            _DEST Virtual
            PAINT (x, y), clr~&, Back2~&
            _DEST d
            a& = 0
            DO UNTIL a& = m.SIZE - 4
                a& = a& + 4
                IF _MEMGET(m2, m2.OFFSET + a&, _UNSIGNED LONG) <> clr~& THEN _MEMPUT m2, m2.OFFSET + a&, Empty~&
            LOOP
            _CLEARCOLOR Back2~&, Virtual
            _PUTIMAGE (0, 0), Virtual
            _MEMFREE m
            _MEMFREE m2
            _FREEIMAGE Virtual
        CASE 1 '                             image is 8 bit image (256 colors)
            Virtual = _NEWIMAGE(W, H, 32)
            m2 = _MEMIMAGE(Virtual)
            Back~& = POINT(x, y)
            Back2~& = _RGB(1, 1, 1)
            Empty~& = _RGBA(0, 0, 0, 0)
            DO UNTIL a& = m.SIZE - 1
                a& = a& + 1
                IF _MEMGET(m, m.OFFSET + a&, _UNSIGNED _BYTE) = Back~& THEN _MEMPUT m2, m2.OFFSET + a&, Back~& ELSE _MEMPUT m2, m2.OFFSET + a&, Back2~&
            LOOP
            d = _DEST
            _DEST Virtual
            PAINT (x, y), clr~&, Back2~&
            _DEST d
            a& = 0
            DO UNTIL a& = m.SIZE - 1
                a& = a& + 1
                IF _MEMGET(m2, m2.OFFSET + a&, _UNSIGNED _BYTE) <> clr~& THEN _MEMPUT m2, m2.OFFSET + a&, Empty~&
            LOOP
            _CLEARCOLOR Back2~&, Virtual
            _PUTIMAGE (0, 0), Virtual
            _MEMFREE m
            _MEMFREE m2
            _FREEIMAGE Virtual
    END SELECT
END SUB


SUB Text (x, y, textHeight, K AS _UNSIGNED LONG, txt$)
    'Text SUB by bplus.
    DIM fg AS _UNSIGNED LONG, cur&, I&, multi, xlen
    fg = _DEFAULTCOLOR
    cur& = _DEST
    I& = _NEWIMAGE(8 * LEN(txt$), 16, 32)
    _DEST I&
    COLOR K, _RGBA32(0, 0, 0, 0)
    _PRINTSTRING (0, 0), txt$
    multi = textHeight / 16
    xlen = LEN(txt$) * 8 * multi
    _PUTIMAGE (x, y)-STEP(xlen, textHeight), I&, cur&
    COLOR fg
    _FREEIMAGE I&
END SUB

FUNCTION ColorPicker& (xpos, ypos)
    'ColorPicker& Function by Dav, SEP/2020. FREE TO USE FOR ALL
    'Function Returns color picked by user if one selected.
    'If no color selected before Closing, function returns 0
    'Click CLOSE to close the ColorPicker image.
    'ESC key cancels selection and closes picker too.
    'The xpos/ypos is x/y point on the screen to place colorpicker

    '=== Save users display status
    DisplayStatus% = _AUTODISPLAY

    '=== copy background screen using _mem (thanks Steve!)
    '=== Used this method because_COPYIMAGE(_DISPLAY) didnt always work
    DIM scr1 AS _MEM, scr2 AS _MEM
    scr1 = _MEMIMAGE(0): scr2 = _MEMNEW(scr1.SIZE)
    _MEMCOPY scr1, scr1.OFFSET, scr1.SIZE TO scr2, scr2.OFFSET

    'Create Colorpicker image
    v& = _NEWIMAGE(463, 239, 32)
    DIM m AS _MEM: m = _MEMIMAGE(v&)
    A$ = "" '...COLORPICKER.PNG encoded by BASIMAGE...
    A$ = A$ + "haIkMo7KDGOh77_oaBfFFfOhBL9c5gGWaX9BRK62K46AkHnS9I=`09EP<4V="
    A$ = A$ + "e25F]0eB;]jK;#YFXUEJQJGM573`644fjGM:62H66L42I^89^HF<co`T]oHo"
    A$ = A$ + "anW]TUUk;O2BnLONnmjek3L7m>li;cS4;]LohSGjC_[gM=C6WciL>WciL>Wc"
    A$ = A$ + "iL>WciL>WciL>WciLOFMgBE9=CX6XN80S0C0W7n48C2O2LNH2H480e3e0c4^"
    A$ = A$ + "5XZHUa7hn4hl`4`8#0Z7Z1V9L;#boQOFngVWjlLWGjhUNN]SGkiAW:SK^U[]"
    A$ = A$ + "lUDW:cUmbnoNZbCf>]MJkdfYVnIk\bR]CKWf>o\CkdEn=KWEVBc:SC0I:[oV"
    A$ = A$ + "IUa7h\MJkd=m>KWEVBc:SC0I:[oVIUa7h\MJkd=m>KWEVBc:SC0I:[oVIUa7"
    A$ = A$ + "h\MJkd=m>KWEVBc:SC0I:[oVIUa7h\MJkd=m>KWEVBc^e?go9QI1;0NB80_0"
    A$ = A$ + "LLhL`73oW4nHhL`aQG02`C2;0V5L[`W;f]2c2F0lT#0N1hh`iP?6n?anHhL`"
    A$ = A$ + "aQG02`C2;0V5L[`W;QK5V5\0h9Q0l2`aQc1O<lORma`iPS3_04PW4F0<;hFQ"
    A$ = A$ + "?G\2mk?k:?V]c:CYIf>]MJkdfY[h>KWEVBc\MJkdfY]CGaMf>[<UVIkdfY]C"
    A$ = A$ + "KW^Rk\MFI:=cfY]CKWf>M5gIk\bDJV]CKWf>]Mj:^cfIUYd<KWf>]MJkdELW"
    A$ = A$ + "]c:CYIf>]MJkdfY[h>KWEVBc^]_ho:QI3;4J02```aPc2O4l_BhSPc273662"
    A$ = A$ + "#3`2QI3g6l5SMK`\Q52=01HHhH`IQ?2nGan8h\`aPQQ0d0\#Hf`]1Oa4^=Hf"
    A$ = A$ + "`2Q6P0<<L<h\`71o[HO4LFhH``#0J0F8<KhfP_H\2mk?k:?V]c:CYIf>]MJk"
    A$ = A$ + "dfY[h>KWEVBc\MJkdfY]CGaM5[fiMOgIbl\?KV<o_o_IbLZC5[gNcTiaOl<I"
    A$ = A$ + "^iK>oom_okObmoloDhG>R>OR>oR>O_J^LT[C[X[GIOJ59j?Knc?oWNAG^cge"
    A$ = A$ + "[LY#_lUVIkdfY]CKW^Rk^FKWcJFIbl7n35fie#3=i]Ql]X>EQdifgn:\;7AO"
    A$ = A$ + "Mi[A5miR>?oKo]Ynd:j[Ib>mR>=BkRjWf>]MJkdfId\MFn^[UfiBFBj?onX?"
    A$ = A$ + "jbg7eRIk<jngmn_Oj^L4meW[NGdOFJ?]V\[Gf>]MJkdfY]cK<gEKk<ja[lZM"
    A$ = A$ + "AM6f]bgVZfiEC[;JAomhYEQNOGceR^ogf>]MJkdfY]cKlgEKk<ZoM]<f3CcG"
    A$ = A$ + "KfRniAN]\XonIOO>_FGfo\I]MJkdfY]CKWgH^[VfiDMO>GcJ^L38jiDcT=NO"
    A$ = A$ + "nbgbGk<OgWcX?GdUSXWoB5bUSX_f9KAoL=Sj\AGgcgoO3AOnb]fiMlUoW9<7"
    A$ = A$ + "HA#3#066>:l>`72oc4n#hMPS2331X1HA`LPk0nba^3H>`RP6P0<<LDhMP?4n"
    A$ = A$ + "Wan#hMPS2331X1HA`LPk0nb9L7`LP51=01HHhX`k0O8l?SmQ`k075662#3`R"
    A$ = A$ + "Pi0g1lUSU[Ik\lMG=]cle4Rj:5JS]Hd>cg^B7[#_L\a=>iO=A??M;T[oIOIM"
    A$ = A$ + "ZJWAONZ#O>5WVIkdfY]CKW^Rk^JJWikna5MO=;Tk7Gdb^CT_=I]cYjaHm:g7"
    A$ = A$ + "^2mbAaX9VVfIQd8]MJkdfY]CGig^JJWikaR==]c\Ol9cgV\fIQNjGXOMi[e5"
    A$ = A$ + "mL8bfY]CKWf>]MjRV]c2[M6][lJ#9j[?G?N[AbnjT]CKWf>]MJkl6cIk<n[["
    A$ = A$ + "#NMg4mlPZ#kKf>]MJkdfY]cK<W]ch_^XO^W5bRNMLV[gO7\MJkdfY]CKWOfH"
    A$ = A$ + "f>CNiX#Oo5<JCem1MZJWlm8g\?fE<KWge=m?BhnP53[62`NQS0_=l1`o8Q?0"
    A$ = A$ + "NKh8`NQ0\JHa`m1g5LCa^;hnP53[62`NQS0_=l1`o8f70_=L4H_#0F=\HhnP"
    A$ = A$ + "k2^Y4^;hnP53[62`NQS0_=l1`o8f70_=L4H_#0F=\HhnPk2^YHiJf>;OGY\M"
    A$ = A$ + "6mlP]#OO??OkjIk<jnNF8_?fNU5eJW\gKL_JNmMJkdfY]CKWGIf>;OGY\MF\"
    A$ = A$ + "N<8_Nf>S4mhaVVniTmNd[]CKWf>]MJkl6cIk<g_GnTfgOiSJ]5Sg;h]MJkdf"
    A$ = A$ + "Y]c[<KWU_cfInOO`;jgKJ5jRjWIohgJkdfY]CKWf>_aLf>Wjg3ISnMDJQnNO"
    A$ = A$ + "OJN_A`W[#f>]MJkdfIUiliIKQmn_NdmWl`7>oW>A;kgKi;GN=ZHkdfY]CKW^"
    A$ = A$ + "Rk\MVlegiTmn5dEnMEFd___WZW7Af>]MJkdfY]cK\W]c2k[;k[GA?6^iKGii"
    A$ = A$ + "<DiBkL6glO?QZQU0[12`NP33W2^8lgChR`YP33k12`JPU0E3c0^iHc0Z6F2\"
    A$ = A$ + "680k1><L:hR`O?f5QC176f34Pe0;1Z6V1Lc9<3XJH9`JP0\7h``YP;2omHG4"
    A$ = A$ + ">5LHH?#0F3\4XJH6`=7;GcfIik\MVnfITlMO?;dgOL]MJkdfY]CKWEVKjlg1"
    A$ = A$ + "IIoJj8O[L\MV_oo7\MJkdfY]CKWgH_Rm_k[CCk\#K1UjOoMF8GN]MJkdfY]C"
    A$ = A$ + "KW^[\[Vfi6ghTOj5mHIVf_^YZ54mj3Q_F>^bmI=Ok:?oNbgUSXE8G>R^<TMc"
    A$ = A$ + ">O?V]5j?_cLmJD9jeCZ]CKWf>]M6=KWU_kZYM6e6bgRN<MSj6i[_4meLef2R"
    A$ = A$ + "fE^_Mika?>je;BJ_LT_G7WGijeDmn=DQLocW\EX_6?Cc\MJkdfY]CGaMG=]c"
    A$ = A$ + "YZaD8;jiZJaXM>E?WGCkUS[VNGf;kF\]CKWf>]MJkl6cMef>_FJFijaU<];k"
    A$ = A$ + "WS^5bkI1iJAombe?3edln0?Gf]HKWf>]MJkdfi=VkZ]M6Y#NO2PKbNNoTfag"
    A$ = A$ + ";PBKo<GMc\O<YCck3lA;jh`lWoenmQ]Dd>_WKiCBHN#]#S#06267>9lN`WT`"
    A$ = A$ + "k1W467622#S#]`lPk1^UHg3<?XFXA8031S3W4N?hCRmN`9QaQQP0d8D;<?hN"
    A$ = A$ + "PK9Qk1V7D;d84PQPaQC2_7l9aN?hT`h`##0J4Z5V7L?`]4;GcfIik^FJWARN"
    A$ = A$ + "_hIOkKZKXAoN^T?nX5cfITXWK#CEc;jcOUW3ACUXWSACeS=MdekNk=go>ldf"
    A$ = A$ + "Y]CKWf>]MNSi^FKWI;ZW5eKbnmb^Xk;fTmk6jBUXNNdi;_L4mWG\>mRj_ijg"
    A$ = A$ + "IWG_TVIkdfY]CKW^Rk:V]CIkdfY]CKWf>o\`\MFI:=cfY]CKWf>M5gIk\bDJ"
    A$ = A$ + "V]CKWf>]Mj:^cfIUYd<KWf>]MJkdELW]c:CYIgkgh_V`32?6\F8032_<L2h2"
    A$ = A$ + "`O=Q;0W0NIH#80[5N<h1Qk5n6a^Gh1Q73F;4P1QG6>1L1h_6k2`9PG6642`J"
    A$ = A$ + "Q73N#hNQ_A2g;lP`S1[52`P`;3W0^0lGSM1h4`;3321H]`S1?8L_`g8FQnmW"
    A$ = A$ + "MU7cfIUYd<KWf>]MJkdELW]c:CYIf>]MJkdfY[h>KWEVBc\MJkdfY]CGaMf>"
    A$ = A$ + "[<UVIkdfY]CKW^Rk\MFI:=cfY]CKWf>M5gIk\bDJV]CKWf>]Mj:^cfIUYd<K"
    A$ = A$ + "Wf>]MJkdELW]c:CYIcjfo;9l``bPe21H#hP`K0W3n;9L>h=P32321H]`bP76"
    A$ = A$ + "V5LkaV5l``bPe21H#hP`K0W3n;a>7l6`1Q1Q0\FHI`33c2^m4V5l``bPe21H"
    A$ = A$ + "#hP`K0W3n;a>7l6`1Q1Q0\FHI`33c2^mH5jgOfEN<KWEVBc\MJkdfY]CGaMf"
    A$ = A$ + ">[<UVIkdfY]CKW^Rk\MFI:=cfY]CKWf>M5gIk\bDJV]CKWf>[\KWZlU]c:;f"
    A$ = A$ + ">]MJkdfYVnIk\bR]CKWf>_a_MjL^Y_IkdfY]CKW>W;MKfgiO>Qi3;7F74PM3"
    A$ = A$ + "70N=h\`O>Qc2_6L0Hg#0F7\LHn`\Qk<f\Qi3;7F74PM370N=h\`O>fIQG3>0"
    A$ = A$ + "\K80[3F><OHf`MV`\Qi3;7F74PM370N=h\`O>fIQG3>0\K80[3F><OHf`M6c"
    A$ = A$ + "iLUGcfY]CKWf>M>GjV]CKWf>]MjL^d=KWf>]MFif>o_ogoKVgomOo9eOj?mW"
    A$ = A$ + "bLQ;LQ<WolWOBm^_kkVigokomCZCNbCVi]N[gJBMRCLR<ofOk_MBmKn=oV<_"
    A$ = A$ + "j[nZI>lQ?L>=nhSWiGo[oeInEoZOeTJ\a6;c_hGl;b<b8S<Y6L`1clcoiolL"
    A$ = A$ + "JGkJGIjYWNb[]^e]ViIOfW=_J_mfcdJ[]VC]dB;IJZYVblcnIo\LJM[KMIFc"
    A$ = A$ + "JFCVj[_n9EMeEGVE^bEViWlCn9idBGjBc\TU\TlJ1;H1InAoXODNm0?`3TCo"
    A$ = A$ + "PO`?8cgokomclmnNO_9eLVcLblMn>OW<cLVcLBm]ofOk<cH6c8cMOggM>MWG"
    A$ = A$ + "jkQNkgn]?YnVOc_IV_nGo[Wi[menJCZ_jGm[Vi[lEn:I^YKjVbY_dGj;Ui;l"
    A$ = A$ + "5n2CZ?oWocWYZZZ:QomonOKkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWf>]"
    A$ = A$ + "MJkdfY]c:`fiLWa5CX6H5#C#060f?<1L6hR9L6H2Ho`0#0J2F1D3<GH6aV;D"
    A$ = A$ + "3\2X98030k7V0>3LaHW1V0f?<04PVPE0e0c5VA2c5Z1F1d44P1Pm3C0W1^H\"
    A$ = A$ + "c0C0k7602#C`:PJPi2c8V]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY"
    A$ = A$ + "]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWf>]M"
    A$ = A$ + "JkdfY]CKWf>]MJkl6[fimo]nS9\0HU`C11HG`nPS3W6nS9LJhh`nPM11hYPE"
    A$ = A$ + "2;0^OhK5knQ50[4N:80k2f7LLhd`O<fYQS3k3f54PW2F9\0hnQ_E2g?\0HU`"
    A$ = A$ + "C11HG`nPS3W6nSa>=LLHO`^P0lD`:Q50g?l]RIkdfY]CKWf>]MJkdfY]CKWf"
    A$ = A$ + ">]MJkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY"
    A$ = A$ + "]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWf>_aZM>_INn4F4\:XI80m3S175>9Ln"
    A$ = A$ + "4>9LDH<XO80=3[2F4<?HVaV7\8HE#c#0j763>:LBhla>9LDH<XO80=3[2F4<"
    A$ = A$ + "?HV9<?HA`ZPVQ0d?<6LDhT`iSMBhX`H#o#0J6F5\8HN`<SIkdfY]CKWf>]MJ"
    A$ = A$ + "kdfY]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY]CKW"
    A$ = A$ + "f>]MJkdfY]CKWf>]MJkdfY]CKWUk]c7jkn^9lX`C0=31XOh5QG1NChMCh=QG"
    A$ = A$ + "1NAXO80=3?1lX`31OgH?4lX`C0=31XOh5QG1NChMSmV`[0_8d?4PVQW0NDhQ"
    A$ = A$ + "P_K2?4lX`C0=31XOh5QG1NChMSmV`[0_8d?4PVQW0NDhQP_K<KWf>]MJkdfY"
    A$ = A$ + "]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWf>]MFng>M>gdc\MJkdfY]CWcU^Ikdf"
    A$ = A$ + "Y]CKW>W;McfY]CKWf>M>GjV]CKWf>[#KWQB\\fY3UF9_NEEYedd1a#VZ:YBN"
    A$ = A$ + "NEJoWYYK6V94:]BcNTiNV4Z5Z3F?4PnPAQaQG7>C2_><><:d74Pe3e1e2?2<"
    A$ = A$ + "gH?2D;D7\N80m1S2S3_>LVH_><><:d74Pe3e1e2?2<g4N4XFX>Hm#0j36567"
    A$ = A$ + "NMh<aNMHLHDX?80[7Z3Z5N4H^abi^>n=]\MN]O#dfY]CKWf>]MJkdfIj>8Jk"
    A$ = A$ + "dfY]CKWf>]MJk<M74]MJkdfY]CKWf>]MV^3Rf>]MJkdfY]CKWf>Cg1AKWf>]"
    A$ = A$ + "MJkdfY]CKWYkPX]CKWf>]MJkdfY]cdM#dfY]CKWf>]MJkdfIj>8Jkl6[fI=E"
    A$ = A$ + "OZ4F:D?\180k461>4<1LZ4V0>4<2\C80K0Z7F:D3DM\JPU2e3K02`>QAP31C"
    A$ = A$ + "0W:f4`QPAPM21H3#m`BQJPZCX6HY#m`6P0\CH4h#`4`YR=1L8H4HW#0f0D?\"
    A$ = A$ + "DX6XjHiLG7oVFf>_f?8JkdfY]CKWf>]MJk<M74]MJkdfY]CKWf>]MV^3Rf>]"
    A$ = A$ + "MJkdfY]CKWf>Cg1AKWf>]MJkdfY]CKWYkPX]CKWf>]MJkdfY]cdM#dfY]CKW"
    A$ = A$ + "f>]MJkdfIj>8Jkl6[fi2OPg:QU3=0K42`>PQQ3073N[4>6L0HHH7#0f8d0\L"
    A$ = A$ + "HQ`34KQ`bQ6P=21H7```1PS1_E\S17066f14P=2=0;7F8l09\#Hi#3`6Q0\3"
    A$ = A$ + "HHh0`aPg:faP3033k02`6Q6PU3;4NPHiLG7oVFf>_f?8JkdfY]CKWf>]MJk<"
    A$ = A$ + "M74]MJkdfY]CKWU1]CWc=]=KWf>]MJkdiLYKf>]MJkdfYciBg\MJkdfI5Jk\"
    A$ = A$ + "ZB\\fY3QBZTWGEEB=MM#\j;maUB9_FEJoY[>=Mc`<EEEYEJV]CKWf>]MJkdf"
    A$ = A$ + "Y]c<YJf>]MJkdfY]CKWf>cTZ]hOh_;Q77F=d24PNQm2_4L4hgU`APG2f;d;4"
    A$ = A$ + "PFPE3?>\Hh76Ka`S3[6J12#_`NQG2>2lkRM4hUPm2m21X5He`S3;6nQ9\Hha"
    A$ = A$ + "QE3]01XGH_`;171nMa>2lB`NQNQ0d2\JhaQ53o`HiLf>]MJkdfY]CKWf>]MV"
    A$ = A$ + "afY]CKWf>]MJkdfY]c;?KWf>]MJkdfY]CKWf>_>Oc#KWf>]MJkdfY]CKWYkV"
    A$ = A$ + "Qf>]MJkdfY]CKWf>Cg=3]MJkdfY]CKWf>]MV^K6JkdfY]CKWf>]MJk<Mg<\\"
    A$ = A$ + "ZMFK=CT`ZP6QFP0d;<4<6<><A2S3S131m21X5XAHE#]#=aZ5F5d8d24PNQQP"
    A$ = A$ + "aPaQ9R=><6<4d;4PFP6QE1e2eT#]`ZP6QFP0d;<4<6<><A\aQaPQPNQ0d2d8"
    A$ = A$ + "\:XFXVHiLf>]MJkdfY]CKWf>]MVafY]CKWf>]MJkdfY]c;?KWf>]MJkdfY]C"
    A$ = A$ + "KWf>_>Oc#KWf>]MJkdfY]CKWYkVQf>]MJkdfY]CKWf>Cg=3]MJkdfY]CKWf>"
    A$ = A$ + "]MV^K6FFe>Gf?nECX>H]`C31hiQ1QAQ32_J2746564NN80?=\FX>HI`?>fbP"
    A$ = A$ + "jPe2?=4PW76465>8lZa>8<:<8ll#0NJH]#M`bPOL2;3Z3F;ld#0NNH#HDhP`"
    A$ = A$ + "[6kP`X`P`c31hYQe2e1;3naaL>Gie\MJkdfY]CWcU^IkdfY]CKW>W;McfY]C"
    A$ = A$ + "KWEV]cXOdMUBI_Z[:DBUl:FXd:kcZZ[ZT:iE[Z:YbNEERoW4gf8DJUhljBo1"
    A$ = A$ + "UBYIf>]MJkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWLf>]MJkdfY]CKWf>]"
    A$ = A$ + "MnYA6KWf>;kKW[H97>QjQVPFQ0d3<0<2\Oh`9\OH4H0X780]2=1e3[0FB\E0"
    A$ = A$ + "e3=1]21X7H0H4Ho`QS]OH4H0X780]2=1e3[0FB2[0Z7J2J52#?`0`8`nQ37K"
    A$ = A$ + "o`8`0#?#0J5J2Z7F1\THiJf>]MJkdfY]CKWf>]MnYA6KWf>]MJkdfY]CKWf>"
    A$ = A$ + "]MJkdfY]CKWf>]MJklbgf`fY]CKWf>]MJkdfY]c2Hf>]MJkdfY]CKWf>]MJk"
    A$ = A$ + "dfY]CKWf>]MJkdfY]CKWLf>]MJkLj[M^ZUNX4J0J6f44P]3m333S17:QaPQQ"
    A$ = A$ + "nQ]31HC#c#3`ZPU6KE#3#c`VP0\MXOHHH<h#a6366j7f>4P=1=3=0[2FJ2[2"
    A$ = A$ + "J0J6f44P]3m333S17:fH``#o`fQ0\9XIX1HE`BSU[IkdfY]CKWf>]MJkdfiW"
    A$ = A$ + "6I\MJkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY]c;OK3KWf>]MJkdfY]CKWf>;P"
    A$ = A$ + "IkdfY]c:cfYciVnV]CKWf>]MjL^d]jFanCXAHm#K#0j6j36265fO2S231m1M"
    A$ = A$ + "31X=Hm#S#M`:RE7d8\NX=80M3m131S2k?fX`##O#g#0J3F?d8D7\R4Z3J4F?"
    A$ = A$ + "d64P^QnPQPAQm7KDH8X?XK80]1[7J4Z3FA<WcEN=KWf>]MFQf>Sni4F:Ue2G"
    A$ = A$ + "jS;UbN_DEEEBUlHHEUFI]Z3EEBUlV6EEB==Mc`;M8=DBUVIkdfY]CKWf>]MJ"
    A$ = A$ + "kdfY]CKWf>]MJkdfY]CKWf>]MnoKf>]MJkdfY]CKWf>]MVafY]CKWf>]MJkd"
    A$ = A$ + "fY]c;?KWf>]MJkdfY]CKWf>_>Oc`bZfI3odOI2[3f8d64P^QM0k666nU9<<\"
    A$ = A$ + "KH7#g#0J3f8\>X1hW6[1HM`6QfP0d=\3Hg```_<f``^QM0M31X=HS`jP6POJ"
    A$ = A$ + "2=0[3f8d64P^QM0k666nUa66f=\3XK80]1K4F7d0lCSUcIkdfY]CKWf>]MJk"
    A$ = A$ + "dfI6KWf>]MJkdfY]CKWf>_l\MJkdfY]CKWf>]MJkljl=3]MJkdfY]CKWf>]M"
    A$ = A$ + "JkdfY]CKWf>]MJkdfY]CKWf>]MnYcfY]CKW9W]CKWf>]MJkdfY]cde>K\nAB"
    A$ = A$ + "XIX5XM80K3j5j76269QQPnQNQ]11XMX5XIXAXnH=2=3]0]31HK#_#o`#`8a6"
    A$ = A$ + "2j7j5f64PfQFPVQ6QjCXAXIX5XM80K3j5j76269f##o#_`fP0d>d2d<d8DO\"
    A$ = A$ + "L>KWf>]MJkdfY]CKWf>cHkdfY]CKWf>]MJkdfiUW]CKWf>]MJk\<XMjL^Y]I"
    A$ = A$ + "kdfY]CKW>W;McfY]CKWf>M>GjV]CKWf>[<KWQZZ^T:kEmUnhBYTWGEEBUlHH"
    A$ = A$ + "EUD9^NEMEUDI_Z^d7G:Ull:DBUhljBgFYD:=[Ye\W4f0d:\I80K5j1f9<0\W"
    A$ = A$ + "460f9d3\E80K6J5f0d4\VH=1K0J5f<4P]2m0k460fC\1PM2m0K52`VQFQ=0="
    A$ = A$ + "1[9QVP=0]2K62`FQNPM230k9f0`>QNP]21Hc#[`6PVPe4;GcfY]CKWf>]MJk"
    A$ = A$ + "dfY]c;ONIkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWGilbfY]CKWf>]MJkd"
    A$ = A$ + "fY]cYNf>]MJkdfY]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWLf>]MJkLj[M^nV6"
    A$ = A$ + "8QFPfP>P0\5XKXGX?HP4j3j5j6f24P>PfPFPe3=5Km#;#K#7#0f2d=d;d7<#"
    A$ = A$ + "\nPNQ^Q]01X3X=X5Hm#C9\NX5X=X380K1j6j5j368FO#_#g`FP0d1d6d2\NX"
    A$ = A$ + "YHiJf>]MJkdfY]CKWf>]MNic;KWf>]MJkdfY]CKWf>]MJkdfY]CKWf>]MJkl"
    A$ = A$ + ":WGf>]MJkdfY]CKWf>]M>ecfY]CKWf>]MJkdfY]CKWf>]MJkdfY]CKWf>]MJ"
    A$ = A$ + "kTcfY]CKWCO]cFf`>CHC#k#W#0j2f6\MXGHW9d;\MHK#G#0j4J7f4d2\QH]0"
    A$ = A$ + "K2J7j42#G`fP]3m2k<F_`fQ]1M11XCXMHC#;`6BX5HC#k#W#0j2f6\MXGHWa"
    A$ = A$ + "j5f>\=X;80M2]3K2J1f#\L=KWf>]MJkdfY]CKWY[MjL^Y_IkdfY]CKW>W;Mc"
    A$ = A$ + "fY]CKWf>M>GjV]CKWf>[<KWEEEEUDI_[Wol>?mY?M9Ef;4Z^T:iiEXT:aomj"
    A$ = A$ + "BOLYDRK7NY?^DJjjflCe\MJkdfIUKk\D=KWf>]MVoIkdfY]CKWCeY]]CKWf>"
    A$ = A$ + "C^fJ]W4J7j0j42#G`FP]1M3mT#g`fP]0M11XCX3XMX=XeH]1]3M0M21X;H;`"
    A$ = A$ + "fP^QNRe=\=H;#G#0j4j0J7J3J=QfPfQ>P>Q0d5\5HK#g#?aj6f6\5X;80M2M"
    A$ = A$ + "0]3]1]6;GcfY]CKWf>]MJkdfY]cXIkdfY]CKWf>]MJkdfiU?_\MJkdfY]CKW"
    A$ = A$ + "f>]MJkdfY]CKWf>]M>IWff>]MJk<i\MJkdfY]cYjdffY]CKW9W]cdf>cjOgf"
    A$ = A$ + "Y]CKWf>]MJkdfY]CKWf>caY]]CKWf>C^>flFCXcY`c01hiP^V2K1fJ2K1jJ:"
    A$ = A$ + "lL#0N6XcY#7`Vc\e>nDMVeonEnhliIP0lL#GCQ]0K=fFP^V2?74PW1jL:d1\"
    A$ = A$ + "i4j0jL:l<#0N>X[Y`FP]6K;#GCQW32`c0M>5j0fL\L=KWf>]MJkdfY]CKWf>"
    A$ = A$ + "SV]CKWf>]MJkdfY]CKWGnlbfY]c?3g>_R>f\]CKWf>]MJkdfY]CKWf>]MVcC"
    A$ = A$ + "KKWf>]MVLf>]MJkdfiDMJKkdfY]cTcf9KUiX?>E]c9kcIkdfI9^MNmjkSHkd"
    A$ = A$ + "fY]cTcfY]CKWEV]CWciL>WciL>WciL>WciL>WciL>W;OkoC[%%L2"
    btemp$ = "" 'decode string data to image data
    FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4)
        IF INSTR(1, B$, "%") THEN
            FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1)
                IF F$ <> "%" THEN C$ = C$ + F$
            NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
            IF MID$(B$, j, 1) = "#" THEN
        MID$(B$, j) = "@": END IF: NEXT
        FOR t% = LEN(B$) TO 1 STEP -1
            B& = B& * 64 + ASC(MID$(B$, t%)) - 48
            NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
            X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
    NEXT: btemp$ = btemp$ + X$: NEXT
    btemp$ = _INFLATE$(btemp$, m.SIZE)
    _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m

    'Put colorpicker image on screen at xpos/ypos
    _PUTIMAGE (xpos, ypos), v&: _DISPLAY: _FREEIMAGE v&

    '====================================

    '=== Now get users color selection...

    '=== no selection made yet
    selected = 0

    '=== main loop
    DO
        '=== Get mouse input
        WHILE _MOUSEINPUT
            '=== Get mouse x/y
            mx = _MOUSEX: my = _MOUSEY
            '=== Only poll this area
            IF mx < (xpos + 473) AND my < (ypos + 243) THEN
                '=== if click button in area
                IF _MOUSEBUTTON(1) THEN
                    '=== if clicked in CLOSE box area
                    IF mx > (xpos + 352) AND mx < (xpos + 457) AND my > (ypos + 5) AND my < (ypos + 72) THEN
                        GOTO donepicking
                    END IF
                    '=== made a color selection
                    selected = 1
                    '=== Get color where mouse pointer is
                    clr& = POINT(mx, my)
                    '=== Make Red Green Blue color values
                    red = _RED32(clr&): grn = _GREEN32(clr&): blu = _BLUE32(clr&)
                    '=== show color selected in box
                    LINE ((xpos + 246), (ypos + 7))-((xpos + 347), (ypos + 70)), _RGB(red, grn, blu), BF
                    '=== Update gradient strip with color...
                    '=== ...only if mouse not in gradient strip area
                    IF mx <= (xpos + 246) OR mx >= (xpos + 457) OR my <= (ypos + 77) OR my >= (ypos + 107) THEN
                        c = 0
                        FOR x = (xpos + 453) TO (xpos + 242) STEP -4
                            LINE (x, (ypos + 77))-(x + 4, (ypos + 107)), _RGB(red + c, grn + c, blu + c), BF
                            c = c + 4
                        NEXT
                    END IF
                END IF
                '=== update screen
                _DISPLAY
            END IF
        WEND

        '=== ESC key cancels picking and closes
        IF INKEY$ = CHR$(27) THEN
            selected = 0: GOTO donepicking
        END IF

        '=== don't be a cpu pig
        _LIMIT 60

    LOOP 'UNTIL INKEY$ <> ""

    donepicking:

    '=== wait for mouse button UP to continue
    DO: mi = _MOUSEINPUT: LOOP UNTIL _MOUSEBUTTON(1) = 0

    '=== if user selected color, say so
    IF selected = 1 THEN
        ColorPicker& = clr&
    ELSE
        ColorPicker& = 0
    END IF

    '====================================

    'Restore background as it was
    _MEMCOPY scr2, scr2.OFFSET, scr2.SIZE TO scr1, scr1.OFFSET
    _MEMFREE scr1: _MEMFREE scr2

    'Restore display status as it was
    IF DisplayStatus% = -1 THEN _AUTODISPLAY

END FUNCTION

FUNCTION BASIMAGE1& 'quadmenu3.png
    v& = _NEWIMAGE(185, 593, 32)
    DIM m AS _MEM: m = _MEMIMAGE(v&)
    A$ = ""
    A$ = A$ + "haIkM5L\TL[SD7eAI2b5T98G#7eeoAI0b1T1Ye^D4[;<KPO\i^hWC2#`ZZ^["
    A$ = A$ + "^kGb8bHV7KFTPPIaR4T4lOm_nGo`ob````````````````hFaOnWoigbh^U7"
    A$ = A$ + "3ScRoh?nS_mGoeOm]o[okokFlgomOo]8]g]ln\#XCFQMBK6XoS_Bjck\ML5g"
    A$ = A$ + "Fae_KinIP9jRMBK7b__HLMh8lKEkkW:VX3nUOiGngh\LL0g_neQ#GN5mmlko"
    A$ = A$ + "n_oafV<A7l3o`?l_aEaa3l9[COV86_aEdN4mQmYfVLGLl#WnKof_mAZCOeJo"
    A$ = A$ + "VPX]hWnYOjYgN4cG[J^LklmN<Ok<`cOGLlX>lSoh?^MO7ijb>eg\^k^iUG9o"
    A$ = A$ + "Hbh#2^kTfSX=>hjC6O?hVCBWZmIW_o\Z]n:hSk`aWFVQL7iIdOn4MU:=LmMW"
    A$ = A$ + "iNYdKCCoTd]B?L5coNBm=d_CKkfYmhXLl9_GZPb6#G5oNG>NdWaTn=#n6YmX"
    A$ = A$ + "fm2c5n<ee757OEKi[:7OJkAT^9fQ8B7nn`IiTlk;GeLA#MO7>nS#WZZ_XOWc"
    A$ = A$ + "Dg2m46_dTb;J[VT^E]W#?5bo[47?6ohSRSO5La\nj:b_LMoAaa3L6>nEDGQ="
    A$ = A$ + "5jjG8n]9]EH<H_[LlY]7g977j\[8ohjnTdn\ihGag[2meT_W4UGl^`TjeTl2"
    A$ = A$ + "]mO5hh[hTAkhTahRjcTgI#oBCh8_ZLlhkZCTW9ieTfQXlVXKWXGoZaaG=o4d"
    A$ = A$ + "6<]n<Y\AN>IN^_ZLl9lgMd_[dKAi=AO]B^#iQg[<7O>7OWiQQd>YnlYcaAjF"
    A$ = A$ + "YgROOBN]:O<7G[CVlMIcaeUadjhZlKZ=LFeN2NgIGGa?=>nTa12Nk>S1mMRS"
    A$ = A$ + "3KR3K`?M>:k8;WQk2\ZnlETS3i=\g4\=2f?7CT]_2LlPO7O;3?3\UKHWSX^T"
    A$ = A$ + "eK1feN;CZSGeJ>L5f=lMSSSiFc_O_[^kCVS3M3hfX?0PLl7Q;NVa=I>nL>nZ"
    A$ = A$ + "eQ`LlO#^?^#OiWQgm<ihhkAWMOGn^aa_2MkW<7_Z__[NOWMfgEfY\nZaa_2M"
    A$ = A$ + "gGA>nEckNdLL\Fo1>kIBhMRS?Y]J7k1n9cainnV`YfIM^^bgKjdkWefh_KLl"
    A$ = A$ + "Y]1CeOOEhhCGcaG9>>VOlELVKnThhk^>WVSoOF6?B>n^f8hZ\=ndj_ih?6>n"
    A$ = A$ + "TeTmCQS_khgckYXW57OWe8gLlILlMGKaG=>n>fhJGKRMEf6OWiS\cLifaF^C"
    A$ = A$ + "\EbD>>FS_[TSSigOek]fM`cPS?mL]LD>ndmYEFNNVLlMZ7PkLdcGKGkfdcGm"
    A$ = A$ + "Zd\37?`DK;o8hh7iKS7QS?]]8cagQc^kN^hZ\=n>ckLR>2bediX?5XMkZF7S"
    A$ = A$ + "Mihkf^LUiIdn4ii>WO#VKl8>GfkbagI\IhLYLULl0WI]aSW?_?P>kI0_[Mk:"
    A$ = A$ + "b_<7o^>cbkFggiLPO4kS_KMLglMWnD^BKSOfnc3m8_7gbfjiZgoI?2>nMik9"
    A$ = A$ + "VP#fbmKL6>nE]oBNVLlPKMeLl0k<g0<GdlI0VGge9ia^]K[BoZg]bLl9]oa_"
    A$ = A$ + "o<Wc9f3\in>VJGR:>nTnLfM>WCihinUWTn[dfhMllLI\CkS:oPn>k[nQm83T"
    A$ = A$ + "g;o:XfoIhM:EN^:obOo?;Shmklm9#FG<9?al6Pl<iihj93DGAn2O^gDM5gf6"
    A$ = A$ + "oF^NR_7?AgaLlYeEd_<l?OCd3?B>>JcgIN2ig1Ikm4m]We?<P^]jgEcoHBNF"
    A$ = A$ + "aIDS[2]oM?C7?<3TOCZC[T?U]chnhGY[fmiW8gLN>iIbjk9eo[b^Q[`^SG]B"
    A$ = A$ + "70M;on>_7nkPJoWEUWAJWTWLn5?W:oPnNWlLJmJRLamoL4M5W7WY]h8bdAd="
    A$ = A$ + "?3>NPYnU`ELL3SGIPm1fDLgb[QaA0nfVih66666666666666666666666666"
    A$ = A$ + "6666666666666666666666666666m8lU0`_oT1^K?_KiSQBF1PONahNAd>l?"
    A$ = A$ + "ocol=>l\USPo6lREQG5^C87:m67Rd4Ym^KSW4RgG_KmjESX>Ee>m\UU9lU<_"
    A$ = A$ + "i>iiCNGT3g9?OZln9aaWdWicl<jO4>C`c_;Mg>_?V3?CoZC6CUGh3^^;il:0"
    A$ = A$ + "6khTjlcRSO6>3lWF?KMhA3`g2n<UgYSC92_kLlMiA?;>N7W1n]a:I7g_:WmN"
    A$ = A$ + ">M7dm=Whg2i]kgOfLXMn6Yih?of0h3>kBccdoA^BNQo8KUNmI:_kd^K>ncWc"
    A$ = A$ + "0IXCfEn`fGM>ncBNgIL:AhMWS3Kf>e6M_:LlX_lG1il:ih_ZcUoMWS3T_[2N"
    A$ = A$ + "5J;FaakTclm[dcBoQi]7o;k;RQ?#_:4O?jI:_kn]k?5>>l7g_:LLhkX179SP"
    A$ = A$ + "_de>5?oMi7BEnjNLo]E5bgON?3m:7FaioDhh0[\1fcVkXh<[N?DM_Yl\#nMb"
    A$ = A$ + "9S98hGikMT7]lYTYES?gLl7?WQ_;5jjg9?>UW]=WI<I<1igQO6_CZTY#6<7o"
    A$ = A$ + "nhh<FegHfGZOg]9Cgg:h>9jA;_EmG_JnkVSoj8Kin`_SaY`HjLk2inIl=7Eo"
    A$ = A$ + "3#We5<7oePc4oFnnIkEXm0cKNU\7QWAohEkSDcaO=hh[6SBn^=j>j37lI5`L"
    A$ = A$ + "#k2hNHkA:OMlGca_G>nZmWEN<:?Sn3EHenEIU]P0?jI;OCNo;KGikVOnYbaG"
    A$ = A$ + "mMnll<_;KYLELl75?j8kCI>H>nm8?gmHDV`QV\Fn_3Ll?UnbOehhC7SbM?Na"
    A$ = A$ + "_2Llkf^aORLlM\5nM_N?VSonPG5>nZeG6WiGPh_1^Sc8IWN;Z;MWAR\NmAba"
    A$ = A$ + "IMF6M1T6ca_nfTS6^3>nTg9kTgWeh]DkoWYOSaLlG7>NH[aXOcWmhG>cIFnI"
    A$ = A$ + "YGaM7?S^0hh?JKhK>nnLVGic1<2h\WNgf5ZC6mJ0I>N6EnN9E8deimO`M>_i"
    A$ = A$ + ">ilCSS3O^Fl_lIC8?^\W1GYj<B\2PgLGL68caoZlMMAlI^=j3oIj71H`kk0U"
    A$ = A$ + "nlCQSWKWDc=iEh<B<5gIoR:NL5^KnM6MbiW677nQW:l<i:W1g]N4m5ZVWg[h"
    A$ = A$ + "j6fY;OEN?d```````````````````````````````````````````````hC7"
    A$ = A$ + "aIT<Of2AllI><R3gCIicQ8olEYMEnSOCUOib[CfEY]kgScWj:mCn>E7nKWXL"
    A$ = A$ + "cYYZ<DY50g;TilUm1<Ejf:MJWnH7M63fW<eUfGA`WiNUoO?noX^V3X^V3EY="
    A$ = A$ + "oKAk[:XT7EN0^IGJAkjZlZR3bj0>TKSWV^<?[jIjZO#oa?CEK9oLCe_IMb:o"
    A$ = A$ + "LdMcO?277gA7ij6RCmn0kOQ[B;2h<3GmK[lGaIMkZkn_En#KTGZcTh4^`4N#"
    A$ = A$ + "nlh?9m#fkJKh`Tk<>TVEe;D>hMaEQgQccYZ_RhlFWeG`_TamoRf?FoXB;2hl"
    A$ = A$ + "V[2hLcci777^CXhfPlgl[^;4hgOamY2O>QInRjMC`KH>KnkoikaGeg`Po2JB"
    A$ = A$ + "m3jF>Pc8OFVII2W9jY_g4bd>jPkV7_377bmSRSge?N57_ZMEm=TEn\?V;PhH"
    A$ = A$ + "oA5cADOS1nB2EJ[lA3:>f^e?EJ3`OkE9CkDnlkH:M0bgGincELL<_4F?L6>>"
    A$ = A$ + "do`7jTS;[GgQSGUfPgEicnZhhlMmjD>^:oHO1HPS`agAG`LL^LP\^cg6D_S5"
    A$ = A$ + "eUX]=OOXoZkWEDLLl=OF?L6>>b_Xl#KQR[=I\:X<ZBK0<_=^^Y6[Rb78MF>N"
    A$ = A$ + "F6jdgG97WU]LM8hfE];EiYZ?2<WDnKE_KLLDGHm`IhhXoS<OP;KEkZBoRahf"
    A$ = A$ + "UF<_]b4loVOEnb^c`acQW57WiSi_GVOfc<n7niNGlU#CWWmIih:kU`cmL5_="
    A$ = A$ + "2ikBn^dR_WfU?IoWiE>F5>=inhNDLL>]lLZ`g[fUS7bLEmkMefQZgK_2>^bf"
    A$ = A$ + "8\nNWaZ4aeIG5lN07Df5=hg\]1>37?KG5nK4?:>^J^PLIQjidl<;g:k75QkV"
    A$ = A$ + "oN4>^bVX?2>>nF7[GWf64]GEcOJGkZ4U9o]f[H>WIlXihANcbPb^8kTWQ>V_"
    A$ = A$ + "gLElUg=K7ZnnoE`aIK07jVc`a_JkZLDK7>e^:?J>NghUbbeInf#8klh;ccoo"
    A$ = A$ + "^ibk`aEOkm\LLelnODLl<WBmL:>nEKGU:K=\S]k^J>NGkU:?ij[J>>_[LlZj"
    A$ = A$ + "QjmJ>^:KDa]3ZbAe^Ri6ZJ3FI3Vc`aid4bZBG];7WU9ULVoN4WFUnAaASbFm"
    A$ = A$ + "ndId_ZgAH>`[hl#E]KMfSNjMhmEaaEQ:kSW3WUS?i>I3?g^Ll^nLcf=ZcfM8"
    A$ = A$ + "PeJEE?W<oME8o>fZbWK7OGhh\^=?6P^m<GN^F<7QWG4fS8LJVHk#D>MYMW_["
    A$ = A$ + "[hh#gXZ[<?LG>N5?7fh1i;FCa:mM8OEjQZhgaf\1Zd1A8T=nkkgim^D5hkj7"
    A$ = A$ + "XSa_5aQj<6WK<_3ln;_V^0AJbgM?iiYWoklj2WCSj^7:[kQl\:]`F08nlcUS"
    A$ = A$ + "Caa1hjJF6PmMbigdegVoVIffWln4;;31bj2TFHSS>M9\OhDmKDfim>YZm6[]"
    A$ = A$ + "0nVb[6770_o10m;g_B>mEg]=ij7c9hh`k;LJHiQAfVfMY5b<7O47gVfa5EeE"
    A$ = A$ + "V7bigTegF=7o8`fb<nK>oIm]B?D5o4m;o>fZfkLkh[87W_[OP>NeMY3N_6PC"
    A$ = A$ + "SjiknK4g>gm#CBkdhjd?LoN:MaAFOKnml\]?gAO[d3EaOdkf9F7TCk>jCS_N"
    A$ = A$ + "XZOjkF^<<<<<<<<<<<<>;jli6Io#`>nVS:o[2WW8^En^3UO>YK=eZl=9LlH?"
    A$ = A$ + "eeE_DeCEnTS7b9Te9nb5>OGUV>OnbIeOI<YmnE7[>W4En21eJTUe;[b_Yn^S"
    A$ = A$ + "^b=GVMeY:on2JkkTEN=OEiO`aFigDFa3cbadj5;[kn<EU3#eI?oEL=k?37?2"
    A$ = A$ + "ZmTDWN^SgXfcQZ0\_lZm<adc=9_OK`n2X[N5bI^^PlQiSE[UC>PmVJF>cm9W"
    A$ = A$ + "38?Ik`cb?og:M1o>:GFk^W3#MA]N8_Z#a7H>h?oco\Loam[oj_nMem`>_\^Q"
    A$ = A$ + "?S>LnSfB^<id5YA]Ohhe;AEWDkQMNoFXTENmfimX2bWEUWJ=jk>_TlJ;[f3#"
    A$ = A$ + "\\7oMdVTe5iOGYCSo6]_M_O`?c[jjI>US7eIFg`aYfgC8^:OO#N]TGYkEU9J"
    A$ = A$ + "?DiM^]EEWhfK\fRlnnWUEV[bk7?T?Ce=INANn8ZdfMn:ZhhlkAiO_RSG]g3#"
    A$ = A$ + "JDmmoEWScmi0M2FWJU?#8kk>Rb:B;GVQ^6]CAJAjHm]Z>Eic9F9[1H>M>PlQ"
    A$ = A$ + "3H\6Q\4b9_gfbHbim#aaEkcmZgSbloE?3GNEmImEPScSEYj<B4a3^IDVZmWM"
    A$ = A$ + "U_k#mmB\W6[f;H[>;f#>EOcQUE`Cbeklo7iCenU5k1EeNKCeWI>O[fc:hgh#"
    A$ = A$ + "NoFb?7ZC:OQWjI#mAMnbOgihlLIRPRScQlN?^JnhA0UkDOgAW?PYJO0]Jnai"
    A$ = A$ + "mOJgL5AnEMV9hm<Oen=7LcZm[Deil\SS[l;1Mkk_:onGecTmeCOJLLEKDDOj"
    A$ = A$ + "hhP_EmmOFoPfi:n5KKZ^c[`4kZ`Q8=X>=a6#E_CRn01G\SWgIk`MhhE_cUi["
    A$ = A$ + "ZgSDSk7?GD?bfl9;?:kPm9aaahTELLeHE`Hnj\[2_WjZ>3MZn_DlAU=iFaaQ"
    A$ = A$ + "L4boDIUCGngc]eQ\D=F\:K]];7GI[alLTil60W9VL#io8beEUM`Ngihif>Nl"
    A$ = A$ + "^ZdaaY\E\bF5IM_J<9#gcYCI[?hcWkZC<_0WcREb:hhLN6aUkgTiBZgMcngc"
    A$ = A$ + "SbagM<7idYlANiggigQ`LligIQ?ikCRS?eOH_bfQEfEYbgMXnfQZoLlMV^jT"
    A$ = A$ + "BVDfbGIG5ENVWk7cK2^1>_Oi0\3dIhhEfIDe7>;GQN_b_NVeOOK#0mWMglgc"
    A$ = A$ + "`aW\^:ELLU_H9g73c[ZlM7ELL^MVKOW\^Fh<o>anKMLLejGQaU`iMDODSGnX"
    A$ = A$ + "]1A8Of:DL>^l[\1LWOYA5#kck`JMn<hhLJDl:eJVb[o2F3iEnGi9[cI4`HVj"
    A$ = A$ + "TeYLLFVDcWU_G9FYKaH\PLdI3DdNQW1fc9o<Q<aSi<B3GFIKZ[NG5mQg=WQG"
    A$ = A$ + "9L7Ll^m_42#7^JOPTKWG9[:oOEW=PfQS_B>c_;>USWOf9g??\mWHiBIGHfoW"
    A$ = A$ + "VgWFIiEEg=7G7Pn96_j:Og1h#MfBGiOU[TEeLWjfOHINl:>NW_#QmK9kbaAo"
    A$ = A$ + "V[2<7?:cX_k9jiLIQiCVG[FEMoMINWIO\BgJ>GU>ejESh`jbWANMeRO_cgMT"
    A$ = A$ + "i#H\O0lIl=?WYEbJl_8n\o1YCFil\Jm1IOQ263Ngl2[TG`]P=IagMHi<;_hM"
    A$ = A$ + "1ffWIiBM6YAomlLY30O8CNOFl>Ik#0fVIEO3Z:MZhheUGaMSaQ?aG]XheibC"
    A$ = A$ + "i[7ZTEF^`hDG9[ZlTKWkl5:Zk#^>iUiZ`fSEbINLeig]F9GZg;ZfG=MemGMD"
    A$ = A$ + "iO>VV^9aeUo1G_cG]Ti1CBg>bj4\[NJ7i\:_I^El_[l=:XOj#OZhZEb5F7fL"
    A$ = A$ + "IYZCCZk66kRSdW9\]o^gE?_Sm?KlnSSdOiA_7ZLOc6666666666666666666"
    A$ = A$ + "666666666666666666666666666666666666666666666666666666666666"
    A$ = A$ + "666666666666666666666666666666666666666666666666666666666666"
    A$ = A$ + "666666666666666666666666666666666666666666666666666666666666"
    A$ = A$ + "666666666666666666666666666666666666666666666666666666666666"
    A$ = A$ + "666666666666666666666666666666666666666666666666666666666666"
    A$ = A$ + "666666666666666666666666666666666666666666666666666666666666"
    A$ = A$ + "666666666666666666666666666666666666666666666666666666666666"
    A$ = A$ + "66_kh?ocolKomOogBlGoeOm]SVfh_iOGml8moaOl7okonOnWoio3aO7?CGi7"
    A$ = A$ + "aGUWEeE^<Rb^C^EUA6MjU>iahiPX=\;4l0`1VTFT_AKK>0nR:mAn7ooZl4l\"
    A$ = A$ + "ZWWOV:nMGIPgUDb]Z<bQ#^Zbk:iaheQSWKWWTfLoNLlof_mKOGnn;ob_lMLO"
    A$ = A$ + ">4lWhIidQWW3AL1bec>>8T_Oogom_YTKEIT3Q\a?g:iahnhh:NC`?nYOjWng"
    A$ = A$ + "me]:]An5YUKc3N0Wf8=o`?l3OGJoaOl7Ua5mg[NN>4a58G?iW;b?EL:i6b86"
    A$ = A$ + "K37RjUZoO0UlHL_Ll:NSZOH>]8>>OgQSG5Gec[TeELl:iVO?6LLd?<[3RPjM"
    A$ = A$ + "S8m#><7omQS?QSeaEVbaag2Rl0OWo:ihP360UADNac`O[Pih:IEE7P<7i;#F"
    A$ = A$ + "Nbck]2iiKKL]Ll:^T:N>^XMYR[DU_:>8\G1hNZb_J\3:>^Jlh`V:inJkhhlk"
    A$ = A$ + "]A0LI57_K<hOG692\]Z<^6>>cQbl\Ecm2SKOG>N4_R32KZ4?K0>?[2:>NUME"
    A$ = A$ + "P]I#ID=NLeH^S#<>557WcO6IKGF1lmU#6^KNbk<VHCS9LLHk3`_fI\:An3kS"
    A$ = A$ + "[2Ef>\:D=ng>NNU]3cLLnIahDjhhAlhm7UnW7c^2VSO]LlZaZXnF]:]AkAUm"
    A$ = A$ + "9jhhQ\4f^;BWR7Z\M8N_R3Mca;:3eH>#Neaai#NNU\<SnRaHQhaSoMIV8hna"
    A$ = A$ + "OLLLelh2N[RS[VcYjkj[6[B87H]#E??6Kk4IEaaAn78hMZnU[\iYJ\G#W0n;"
    A$ = A$ + "WG\ME>27gS7oibage^:WafQ:N#gc[Te>kZ4laXoLF6E_7U]?N>T7WRjm5f^:"
    A$ = A$ + "ll?AolHL<:PgQLoh_VLlMVcYZ_cMNNU\^RS[6GBTolHO0GS3inYSgGZhh[hW"
    A$ = A$ + "Nlh?O>>\UQRg\37Wi:Zeb7fIDeOj>O7#9[Mf><noZa3Qan^ZLi`Zm[BgH>P="
    A$ = A$ + "6kPihG;7G5j\?N57_bNPi`DKB6QX_dc`akf?9A8TEekVHL3MQc`a=^O>>jcK"
    A$ = A$ + "G>>FWbZfnlgj[\mlA:o8Xhh[fKShm]S`akToLMem7O?8JkcfJ8SlJ<2NK>]i"
    A$ = A$ + "nQanc3aU]78nN;n^?V;5?NClkEY5ffY[lc_kXZ_il7UQZ>V;o0idc8nMHSoZ"
    A$ = A$ + "OgLlk7ie_A1<F1EJ1O^bFIIK4`P]gPJ_<MTb_cnhlk^ib0l#F>hgOZVKHENK"
    A$ = A$ + ">nm3\n;EHEJ1g[jI`_?I^DX_o<Rh>Ki_S\dY;Z`:MH^>HHHHHHHHHHHHHHHL"
    A$ = A$ + "Oh8nJ44GNoic[1GgNfo:Uo\L<MM0kT=Pli33n:U:oeB5Zle;WAogi3FZBCEm"
    A$ = A$ + "F97M]Y\?SYBOmZQMme8M[eLF_EUVZccbAAFNVZWG]g0R0JO?jJ[_b?\Di[IF"
    A$ = A$ + "Yo[F?i\NUCSZ^dUnZl]K=HOUgW1kh[AF]FdA0f^]jgAngM65WRlN:4[SnTc2"
    A$ = A$ + "`4>nTeN_kmeEU1j?HGOmbZejG]?d#NVU94gTfdZcfD>TGKikVC?QSG]g=HmQ"
    A$ = A$ + "JOBocol?;KSFMNFbHjhJbb>fkQCF7#l=I^=;O^8En16Em=RkGoeOmkn^?GgE"
    A$ = A$ + "nQ5\NoCeoln7FMf<Di9fWHiW]JOM6b?gn5a5][[dG_Z[1kIhhAmF5GGKTJ=j"
    A$ = A$ + "[j3LehJbjLNo]<1Ek=;5OZZnRmG#N]7_JO=CFoam5[dmZaN`O3XKoi7iSBVD"
    A$ = A$ + "kCigQmI`IK?`N82j6\OBZJSZ>?;:>nZaeTOGXJO[dQ:n5fKDCihLiNeWGT\n"
    A$ = A$ + ";ca[hLZcI:VC9G>G177j[Gec<j>]7AMP3h\Xckc8>4j]0CVGHVSGegL^M<ON"
    A$ = A$ + "afA7GEgAiaS5hA`aInd:Om2GflL^ElFEnfaaaN:;n]#nZl38Ai1MbMcS_:>>"
    A$ = A$ + "g?2oLim=DE#=6kYn2RlLgc]GahQAo9GAMoAaaal1akk:>NE#e73O>kZ6S=2l"
    A$ = A$ + "hLjj7O27?7^KNlEbaIn5o\8O[d5ig5>37?gNQa7Qi5aXb^F?K>^J_k^37WC;"
    A$ = A$ + "??`ZcPT:daai#eiFUO^Genc?27?#eI#[RS3nFn\hPdVGcRlgOQ^58O61bjol"
    A$ = A$ + "HaEQ:kcLGmS7l:<76VSei[GDc_W;;eIi[boeMF>Nf^:<ohE2k`a3mGfoR4eK"
    A$ = A$ + "niaHdD??OF1HI1l5X;IkL0T;c`N68nho[2h\m`mcLgS7OGm?gg1VO377caEc"
    A$ = A$ + "1m8ci\b7>VaMcW?;7WKOQoTOjc_b^:HM4H>>jK28cmHK6Rgo`HNcfjQ;ckVS"
    A$ = A$ + "[j7_Coe=F142iPiXE[GaEaacfEi^icG=77O_Mjc?mmlEfEIR=3EmooZaaESa"
    A$ = A$ + "n\LL57E]n=G97o:Fcj79h_SQc_>7WJl^AM<\YA>0khe5V:KZee9cOj\IHei4"
    A$ = A$ + "K7>>c;DS=C=oR0[dYX\fQScQ#ND[YZRSGeGTZm[jK;MfEIeJBOgHeN[8o=YE"
    A$ = A$ + "Y5]iMQc`acl>DFkJc`YLLehHcQ^_S<E?=US[laFE?_RSGE>AlCfK=_kLl>O6"
    A$ = A$ + "B^_B<WcZdVmclMQc<oT:K6n8hh8=EnQilIWWgc:MjdlLeV^>WEcSG5_RS7YE"
    A$ = A$ + "IOl:oGCFg<QSo^<^5fWQ`noP\?KHU_>1lSlLob[maAihlNkBa_fiMKl]ilJM"
    A$ = A$ + "XVk4GOcee^_S`jDU?QA93lj55?7\SBF?RnM`cSd6??R3U9ZcEee#?V[Oa_YT"
    A$ = A$ + "9<Vm9c[oE3Mn<4^_b#O<aGWXnm[`>CIil\nR1f6H:>NEm=k;EfEWVeCEb0o<"
    A$ = A$ + "Ef[[JoAaoMTfLmHUo[9on<BKWoQiEWSW[[ClO9X]oXnGTc8Sibl\eg:o\R:M"
    A$ = A$ + "ibMW_O\BW>eG_DU>ElLLX_P^jJ^>Rjg:Ij:KG=<<<<<<<<<<<<<<<<<<<<<<"
    A$ = A$ + "<<<<<<<<<<<<<<<<<<<<<<<<<<<<nJQ^k>Y7eMkb>gIBkNo:]:]k6?GnMjTh"
    A$ = A$ + "gike:LOoLTdbbDGkgWhMDeEbgj2`_ROUUi:olddkG9h?4biMW_c#UOEgYE8O"
    A$ = A$ + "EnE:^ndiO9Hmg>YUomMJk>S>lC3Cl7bG]>HR_<[RSY2inoZB3lWW:>^bgkF5"
    A$ = A$ + "OfOK\ck\hL2_CJiO;Of\kNG11XGfE7nY1UocQm;HAHU_Eh<LlX_;ULX^WBDY"
    A$ = A$ + "5l>Uo=61h3TZ^W?h0^;6hbGio#H^FT6ni`m7b>YU3IO<1o<AL:oD[b77fY3_"
    A$ = A$ + "KnhcRSGiWm^:oAZbo1^cM?3WF`CEnl?>oVjkAAl<WTmA91Dj:^>2o[cddZ^?"
    A$ = A$ + "JjhhMj`9Y5j`?AO6aAm]n#?WWgT2Zai\Ckc4oYJ57W[KEnL=5gCY7bne`S`a"
    A$ = A$ + "[d[kTfS`aImBW>lC\_lc`aWL7^NeLLegIQoJBeWO>0oSM>4e1U_2<RGMGJZd"
    A$ = A$ + "3lcnZaagA7J>^^Ol:kB50n;a\^k<]?L0m3GaEhoF=nSLjbo6olH<m\O=DY[`"
    A$ = A$ + "M0;lemMgUS?K>>7bj#caenV`:ohGUo_kZJOPol6U1?nkZ_7cLllhGbiAeccc"
    A$ = A$ + ";YCGaj6EJ_C>>[3=7OoaZ4jg[\OLegIamc1olLLAI[hDio>?n6Vo^377mS7b"
    A$ = A$ + ";^W=Z\Eb[`HEP>l\n5eGAl^=NLEJSlTi?ZkL[:KeDegM5g[k^R82:N;F[Y9Y"
    A$ = A$ + "mAca[dQ7egFoZSc>NL\6dEn^D5_hAHGU9g_U`^8Zk56EMGIgjSbaEgIBEYm>"
    A$ = A$ + "hhffQ_>S7_ZmYj>iDE?j^o>ESGWe1<?#U^GIkZlEgfQAk[JmmkhhIoYM5jFk"
    A$ = A$ + "KlmPcdnXFK7ej:Z^CL#8T=5WSe1<7G=7fZe>JBJ[\1C^^a]AhNM#EO<7OfnE"
    A$ = A$ + "YSS_;V\o9P>OJkSJM>Dle^kR[:k\_B7\ZnPm5#ENGUfZ0VScZi3QgE<7Omn>"
    A$ = A$ + "<?FTW17?K_fY]?Z_M[hhEk?U8Pa8\;7_[>U[;EScX:]EQlHW[^7^bf3LWm3a"
    A$ = A$ + "W87W__WbP7WmE]OEP][P^FMW914ce?Wfhgan3;OG>QmaD>MP7XF;V`6IlMaE"
    A$ = A$ + "N\8\lQW[C7Pk::0FoU_;UhiV[B[j^RFM_B]jN73]a[dQOZLl\>_K>SGin>4X"
    A$ = A$ + "k>C2l9H_F>]XMUS[j>X[:NEiRjYBnFmNNEMBIkiYY]BoT_OmZ^7^bf3LZ>l^"
    A$ = A$ + "iR?:X^[TNdgOAMU7GVZOOU<WcWMS_CnVD_VNGQ=9]CeAlm>6o>eDMhMc5=<<"
    A$ = A$ + "<<<<<<<<<<<<<<NM#WO4B]gH?:jlU=Hm>hhRWSCKf7TXTmEbA\^7h<<eM^CW"
    A$ = A$ + "VfYb0ZOilQmM=MjW_2nkW75Vj;J>;jF3oZmUElL:OOBU\_BN3NBW?l9kWAVV"
    A$ = A$ + "f9b#gN;9GOF]7DNDn^\?Mdaa3NFfgelXhhXOL>^Ena7eN3^CNGaQbm1?U_]B"
    A$ = A$ + "6V\WPVFVa_keYilLlli#>j[jZf[:<7?G>PcV3Ek[:\gBZhhEb[bo[X>kmacb"
    A$ = A$ + "k5<EJanEKU<XfkSAlLLajDbLl8>eIehCm<kl\hhimHgE^O\Zf3Pim9Rjg_:>"
    A$ = A$ + "n>W74enAOgd2I#]7fEeehMX9Y5kQZkVgl>QZfN\OnDWih[bg1U;7enXm^hh:"
    A$ = A$ + "O=d^YMG>NEMEaackM<SSaa3mHdfYV;oEMFUai:6kacYk1lW17_jLS]CJ_2>^"
    A$ = A$ + "J\:im=lMcMNG`ZiLZhZGQ_3:7PMeVd^OeLl#6ckCkG9>>7`lS<7oJihEkibc"
    A$ = A$ + "NFUif^kRSSdVUkGA>>V?\ihWWScfkPiZGU_3:G>:oAlc^Ol#VQ?R#IGUGQaZ"
    A$ = A$ + "0o`hWlIIhI`aEfEIG>n>cilEc^:kTf7=7GUFLVj^KNck4>RMEP]c[>O:CmM#"
    A$ = A$ + "_RfEiEZOl>K7n9jgfNfLlEf4o:lM#idHkZHK7nZaa?[_3jXLL4ZlgA8XfK7l"
    A$ = A$ + "cGIKKeJJFUf>o#GUmRZlogVSoJaag5_2LlEcUXbG?gUfELLN?4XZ7EUYihO]"
    A$ = A$ + "ihH]ZZ2:^#gmQFN>`Hn1EY=KWj>O]8TQZm`8kSV<7oa0f?21MnEcaIO74kgJ"
    A$ = A$ + "ZnMl]Mh7Pbnh8H7=U?#ZKm0cnM7\GAZV7aZd2iKR<`nkWLn4Y5jP\??:0VOo"
    A$ = A$ + "ZjUA?HKiMeLl<WYR?emkEca5fF_JN_:^#HCRZlSUWYYMR<4fm[bOoTUC^lD_"
    A$ = A$ + "CH>nnhIi?IDfJLb_GIWb0MnCX>K\1^cEh_OV:3ao?W?Zm9kTjW]MXQQQQQQQ"
    A$ = A$ + "QQQQQQQQQaS4Mn?X7U_lX[lDW]^ZdGU6T7\?9jXegSj7QbYAmKZjj[ROFjC2"
    A$ = A$ + "khk?^:\SObYkN`>k_ObaSf#NMaWFOInaAlS#\<Zb3ekD[>7#l_SjjEjWUnd`"
    A$ = A$ + "Tke][^olMlC>Mb7FC6VSSm88c7Dn`5E8g?gAmS#\<fmKMk=C^\N6nIY?=DEo"
    A$ = A$ + "ImhE^^nZkXB^]5W;3EO#ifaH=]SekS3acckg?enWBEOS0lO9LJ[lS#Ek]`#6"
    A$ = A$ + "SOG5`Jcgaa?ZOF:Wg?[mLg[:VL^1#LGekm:>>gfQkW<egVifGEOcX\baEaa["
    A$ = A$ + ">k3kTfZ_?4b#EohChhlNPaLl7;7We9[lS#lHKgUSc]MX?=F^DL8<NWLhAbai"
    A$ = A$ + "dRjHl<#>DekYLlM??PVSgcaif;LgobjT_[aF4VL>5DSE1k=_LJQM4#0W]PZn"
    A$ = A$ + "9W>FU7177eWlihXS7FaaSj0j3H7oca>Ll\>nCd_h^cm\LEohEfj2__PmnJ57"
    A$ = A$ + "W3icO0caEm=G=NGeMFocRSWOo2l_S`acQMlcBVS?SSS_gG]_Z1ZfcdEkei>>"
    A$ = A$ + "NXockMJ^mTihhLB<9l<ihZaWcOGIG>ncXOLU<m^S9SE1Wm5^NGfH#jjEmScS"
    A$ = A$ + "E1n97el[Z6gN>Dm>dcTS[6oDU\?e^:khWUfQSW?kAORWaXYciDe7nge8:2C7"
    A$ = A$ + "?^ZmGe_Wjm?FN[\SgMcaEYiEb^:OZnI^cHk#doBgicAe_`D>^b^gL0c7VKgE"
    A$ = A$ + "OcoIcaceCU_[hEc^:OZWaXcHk#Pc>Nl:>nT_EXTGDFLJOfLLf>WWQS_[_;`f"
    A$ = A$ + ">lJihicVH5>27GI7=eLiDLLeH5Z\S]JNgX_C>]ElN5o=oN6dCLJNDLlEe?4R"
    A$ = A$ + "Ok[VME>27OG<USG]V9LPiRZaX7Q>KY[Z_ML7FVDlgLMBmNWihVScQ:>Nel#i"
    A$ = A$ + "fm9LLfWnLDo84?oHelUO6LlZmSCF6b?kWX]3cn?8HW?XCQmT^JO:DfFE`NEI"
    A$ = A$ + "oT3R;nG8GIkJ1I>7?\3C>Mij0JkRO;GOcPmY9ij;N?TW;MVSWcG^>Qo6[GIU"
    A$ = A$ + "MjbnA9^^\jgceeLMBY;cj><Gf?EK72`fXBMg:LecAIZObYJn[ZhINWZLDeG6"
    A$ = A$ + "lj1LDo84GW`k:Ec7?o>EEIdmkWa?;mYJk`LK8Kg?dVaaMU_Gaf[JJLCOnZj#"
    A$ = A$ + "WonY[N2>[J^dZl=nkLLlOGIW^EbDe_gEWFiSSnD]MXQQQQQQQQQQQQQQQQaa"
    A$ = A$ + "acb?2=YLjnm\oDIEnaU=R?OfUhjFgiIJU\Y>gZ6_>HeM9nc\L:C`gnNokCEn"
    A$ = A$ + "an8WEWk8T^^bMEn4Q?amjaW2F]WMD[eaSZLF52>9FOR^m;5FSVEgYJA0iGGI"
    A$ = A$ + "Zf7TL8kkS<N]Pb?mT?caZeBnAE>:^:OF3`j\cW?^L0g?dZmE=cWSkA:ekG#f"
    A$ = A$ + "`N_Rc;n^\7U[j^?aheRSWgKYEkGR7Ei`QZm?H`Uhc\?cKE?KgM1XZ\cHJN1O"
    A$ = A$ + "\Ua[3ZhNH?Y1ob6BON^KE#=>n9UcD>Nl<lnN>7ZfcYh\oZ^;0[hhEOC`gMV_"
    A$ = A$ + "?#am`g_IKI0>nZPbgX>YLhlA=F5EOn1W:W>L>?Ei9Vk:_gmh0^S=alLia3Y6"
    A$ = A$ + "[RjmUk^meHmL1ELlEn>8h7#cmo?YL:C`gno?[IX_eLP7ONn<XEI?4nlFG5`g"
    A$ = A$ + "Tfag7U3gMk[A?g3OCG]G;in1[fgbkD>E1LV]bW9PL8j_UW3JT^8NlNY:<afQ"
    A$ = A$ + "hMQSjkSbkKMSG3>>kgJhaG>I\:hIkj7GE>LPk7>B;>;?i#`Uih`hlc_CZhYE"
    A$ = A$ + "LLfV?[\[2\i3>C>1`hc=7oeRS[\ga^LlYS7o8fEQkc6aaf2?R;hhP_Qc86;7"
    A$ = A$ + "ac5YEEfkJGUPgWeEli?bheRSW]gA^M3nFB`ID8?^iM:W9LLELZPj\#7b0kKR"
    A$ = A$ + "DWCKD>7a^:AmAMFU^kfi_bhXnHVc>NLEiXhI7US[V;YJLo[hh#fhaiHK7nnP"
    A$ = A$ + "En^fZWS?KSEHWbAacDLL>4b2?F5UOG8BG<NRL8T;ENV3kbaiWehmTSo8:7>N"
    A$ = A$ + "57Gi;VQ=Db1<odEfl[JO4T3VSoNSEk7`9SKiZ:7>D=G?EjZR?jgNRO0Z;LVm"
    A$ = A$ + "5PWcimS\O42[]7`EjoPVD>`^K8NDfHO9Rid1kXTCGfo0a??6GEN>a\O02_7b"
    A$ = A$ + "bFWLTmC#im50Z[ffQ_FXc7cLUn?X9U37O4WbW3YBGElAoi<_68?_Q^i#G97:"
    A$ = A$ + "OO4WGgMk[aam[>?RbIBLEn<XZh12^NWO0JGIKZO>j^KO=<<<<<<<<<<<<<<<"
    A$ = A$ + "<<<<<n?a>nKZ[0H_iFi[\DY1acY_:_FU^LIEmLIoEDg_YdOkDG3Pk9LnLO?Y"
    A$ = A$ + "LVZ[D]1EUeW6Vj_Y^:<iLWaYAMVVAkgZP:MibZJ_\Ti5LJhg7[dKCZ[Mg[Fh"
    A$ = A$ + "<neE>CeE[Z_LmjC2Ml4NoaN5Xk<4SeMDe^akCFdolZP:MIooEgcQd`bLNo_X"
    A$ = A$ + "fGl#_MTj:7PogZZLhh[dEZdZ:[kV?nXihEnKZ757GiG9DnM=eNl6l\ZnccW7"
    A$ = A$ + "CV;Smd2c5HOf2BCeM5J5g3kmV9eE>_SmDSJo4cgShXLhh[dEZm>Yb_Qm8jGk"
    A$ = A$ + "^AWoV2]UGIia]Ci0h6:>KeM=;JCh0_7YD?[j<1UooWUS?Y^biMei2Q[SELl8"
    A$ = A$ + "DY[D]_:M3O_fm^S9nK:^nbc?JZ_bR?[>LiQmlZRS[>C?Chh`_HYNFEOPLNXh"
    A$ = A$ + "QChhZa;XZ[Zaj7U9lcAIO>YZLDLl:MeD>>_G<Og1GoDnK:VS_j\ePf0^\D]c"
    A$ = A$ + "lOGMN=ig?hf2>mimd:WOhIE_CW3hlDO5LlMZ[`>7imak>Ll:MURS[^oOoThh"
    A$ = A$ + ":MAeg[EmSgIc^8_Dn:a^fmZfR8XVggIih[T7`3?27WUYZjZJ>]XnVmm1C7?>"
    A$ = A$ + "NfYeGh;nnDihZnEiiPfEO[^GO[>o1ZaIV3HnBC\GbEcaalCEYk8LLVkEEG17"
    A$ = A$ + "[bn:Ef>\SScQ:>^b^BXoY?UaS[N_NUoV:`TaZ4jN^OLel[hilZhhZbk:hhi#"
    A$ = A$ + "T6NNRacND>^jmIEM5b?>[5EeeYLl>MUihOCNg;P_O];7G=NL^=FIW`X]PU1e"
    A$ = A$ + "m1aIih\]7`Llhj#eghgQSgEGcn>>83C\aG57_CGmEL>WChZXm<kG?aH^ahhD"
    A$ = A$ + "8K?0lL;;\_m]o_gWHIXZMkXLLENb1<F]S`aW4Df#BY[DbK57_CGI>^>DIo`0"
    A$ = A$ + "k<Nl9SK\B_[lY:?3>>bWMih:iE5DmI[VOi>Ll>MeGA>^BGXlgDEeIUOaR1Ng"
    A$ = A$ + "#=6KeJIS_3T3ESUl<LLejoX6?\R7V[3E[andjZJ\Q:KJ>USgY[Dik:mjk>hf"
    A$ = A$ + "\>k`Nfj\JOAQn2cQ8]:>nZnKDeU>>n>f#n\Ll^jjT_W0On\:?ELlY[[[:lET"
    A$ = A$ + "SSh?knFYRScb1j?EEnM]5:I^SS?eViMkKZ:n\jK4Eee>KUV_k<fQSgY[DUE>"
    A$ = A$ + "^?=>>V?ON=ScnKZLlWUS7mK2Km6i9kK\`gSShanU8?gE`5ZF[2EM1l:DfiW5"
    A$ = A$ + "n?;EnUc7Tf\n00b:\a=7gTj:R7aYT9d^4eSLiXbc9jZ\?Q9W?OR[140??a8>"
    A$ = A$ + "ln<7oIA^M8o^S:N>>ULa]5Mb<WOI^2WOZh[VS=NOIUlgEGEaWig#^DUSjIGY"
    A$ = A$ + "[DUE>^?=>>Kg_8^EnKZ[Z\#nFI3BEig9GklKMUcdd2\boO]:_Q<6i3omR\MK"
    A$ = A$ + "[JG>Z^R]=`EgNKHHHHHHHHHHHHHHHHHHHlZ2\?IcWeHfGbDMNfDnFYZdFEfl"
    A$ = A$ + "iL6n0WEiGENN5jSMUYl_eik^PnJR_9[;=:Omc4O]EGkOGKKg_eiW`N5#gN[="
    A$ = A$ + ";[U9jKoWnMV^m?KVW\bg#UeQC:g[0WAVH>CEXjL[YZCkh_OVj[]fQ3L5n9\k"
    A$ = A$ + "6Zc;27`j[]:MXm_[M1[Yf:N0dC[:K\OX^ZeLn<bDF>jb7X3jB3b[Yn0\YbNe"
    A$ = A$ + "jFfUgHm??ZO2k^ihC>?EaM_WJO8ba5ee8]MW3C\g92Nb4O35f38L8O6T^Rm:"
    A$ = A$ + "FEOEk8CMkaa\o;0kgULJZl=I:^Sj>RFiK<ZleFacW[cMW5DLVZEg_Yik<mSN"
    A$ = A$ + "GdO7LlYgYZAPS[JOYVok^m`\jIamMY:]ZmTdIaE8C:mZJ_]eiKbP>ObIX3aa"
    A$ = A$ + "iAEL\^BE6LN7mWmY`aAo<ZkDE><QSSn_Dj<EnEeF[B;dQlin?6cd:ogEeh5_"
    A$ = A$ + "2IZSSSmX;g_KU_9[jlHYRS;CdoNn>cE]?<E?7G_DOWhMQS[6?>VK5__;i`4>"
    A$ = A$ + ">VoO>__2>>^kSEf;HbHHS`cTSSk3jlhQco>?NGhKbDn<8N\:8]:i7foPg?`M"
    A$ = A$ + "LLnK\En9\g5>NP>O7LN?FZnMFgXn6<o\X^c14?OGM[hCilGmNKf^IE#i?N?S"
    A$ = A$ + "<eaac1EO;Q>Bmm>UN?7Rj8h_Q\=aGKackDaMioVKGcao>`akJCVJk`80MM>X"
    A$ = A$ + "No0WA6>Ti8Lo>EQlkQLMB=6H5FaaW:CCihQLam?7l5N<N[hh`>9XLSlHR_fZ"
    A$ = A$ + "[?^hII>^Z_;8c_CLl0ZiE4QELLHW8XWIm3g>QdbQLOVhlLem=TLiV7?ndaZ\"
    A$ = A$ + "Koh[TYYfEAaMEfSZj<:cSE9b[\ODNU_fRKgilOZO2kMQSSch8PBNaH9iPZ?A"
    A$ = A$ + "^=9J?D]9ELLelOjjO=G^kbaEjS[#VDLLnK:lcSiF`aEM6UihRda]U:K`7aU]"
    A$ = A$ + "MXboJa]eEcYmMQS[JoRn1FYGS0ccDfcE5`LTDi7;?XOcZb^b^:X?c^cKfdaZ"
    A$ = A$ + "\[<eaaalgF]N=A0So?7fa^:ZjDff]Ck?Xb?Qm^baE]O[hhMiW:dUO7a66EhZ"
    A$ = A$ + "6?nEJk#l^hDOCfIhhZamcbad_im9aa3iE]>JCiILKGdWjdekA=OPEci<2MLl"
    A$ = A$ + ":ofE6MboAT9l=T^OW3Q\Z\5n>LLU?f^b^kEki0l]?eH_[ZC:OXD>LggCL`>K"
    A$ = A$ + "MQ^i8^RSGeWWbWMb1<VVSba_Rgi?R<M4>^JnjkbainVD1f_YDmm6Eo?_[Ll0"
    A$ = A$ + "Q<Dacan1I:7WCCgJhXdU84aWmM>MQ9SKi:hiCUY:k^Tc7EM#=_nMhhMSc?k["
    A$ = A$ + "]j6cD57W]O?Gn:I?G7bc1h^#N?TQoO^m4LXhm1\6S:^EN>mie;9NG9o\8nHn"
    A$ = A$ + "]Ao?ii2bfQ6fE;olILeLl0WAVRjFf7OaoNTGH=?ceQ\_9;WG`oKQW5LDDf8>"
    A$ = A$ + "<fg9]UP_UmMHif5<6kLkHf?Qae7F>Ima[077][\^PO_?#gLfZB3ZOEaGiKX2"
    A$ = A$ + "mGfgi<M^SG1>[<anS>EnXZ3Zi:ca1n\:^>IG]_33lXlCHZfjG14jPlLbDnEY"
    A$ = A$ + "EnA9>=PCD5O^oWZbEml[TScRc:CkR8oDn0[Mm;F8ObbNd^Veg[Z37Y^eiW`Z"
    A$ = A$ + ":K33333333333333333333333333333333333333333333333333330h_4j^"
    A$ = A$ + "c[^Sb[bWcFmkik=4>n9g3EC;O>m`gL]jNbZ2kLgFEUf>I6bk^eo?5<m>_jIG"
    A$ = A$ + "NC^k\Dn07EI\bWW<aW^FUn>OD3O?IEQ9g]EX>GUFlk:IYb7=bUaMc5O4HWkl"
    A$ = A$ + "ZWMi=i^cBaaEn_OUo:CUOlin]:mMg5DZd^B7>aW\QgO[B;Z3knKi`WHoi:oQ"
    A$ = A$ + "4gfn8_gdj:_9gMFC^;AR0lg9LnQngQoD8caWLG#Yl[\\_E7aeik0Z^Gdhb?T"
    A$ = A$ + "cZn9POPA5ZleIZk]\GQkR]7=7Wi2#oL5mW_CiYjS>gF0oA2W6EK9h_LkIW?0"
    A$ = A$ + "IjM1eZb?WfMhhC[784iCEOeMnc_L0jTG9OQbEci#OJ`oeVmaBij=?o:5DSUO"
    A$ = A$ + "Wb;WfYgMFX_>^<jhhikQ:^>V3Eg5DL0O72gYB\O\j\LLEM6?3ZS:OCj>Ll?Y"
    A$ = A$ + "nbgi>_Z[mG5DcQIWbS_3?Z^k\D]Wi#577UIEOF:OnG>DMG#Qb<k[8?27_ZNX"
    A$ = A$ + "R7j4T?Z_GnEUS7HjMNEN\:XOl:KA1>9kokgYlVNgI]RS7UYJL=LJFYGhl5lV"
    A$ = A$ + ":kZPgaWh;_jVc9j38k[3cQLo6PK?US[N?nCTS[jc:[3jN^>oiGGoGC:?FgcL"
    A$ = A$ + "Lh;9GeO;Jgj\5YR3b_SYVO6nn#7?oZ\MH57G=nLnkUELL>T;SkVCn8`ZklZ9"
    A$ = A$ + "LdL0Se^BOeEN:O3oAVKJ>MLk>O?Dan5DEMQUclHhR_cE=F\EcQKjHE`hlij7"
    A$ = A$ + "7ZdEE1Tg\?mlC0Zk99eMN5GW?chaWDNZfXZnAEf?DenFMW:`n=f0Zk2ZZa77"
    A$ = A$ + "LKDOP_;VOgUW?k4>NU=#W`a[6G57N7la\W5:K7DMWGUiiHMaikfd<PN=?FUY"
    A$ = A$ + "UGUmab1LW>`YU;3d^E=fc\MEZhLZ0Vg;77hli0\GdIihZaZ`_C1oY?WV9Ll^"
    A$ = A$ + "_kn^2^M_k>_BEggMlhC;_8]OG325Z\c#Ekh>c_JWk2ZL0S;YjK9Em?NF>>KG"
    A$ = A$ + "eMihg=?lIbaE[i;FC?eL7AjGQM;?>MMgMFES[7]gELL>MMj5l]UEg9FX?Dni"
    A$ = A$ + "ieAUiTZedEmNF57?gW0jkQCcGE>n>giEGam#gdbKjJHdISj8Pg??;77mi[jO"
    A$ = A$ + "^cN=A0SYI7>NU<Faac_o[jgh[<7?`dklZ[j^FLBiaQ^mKA7o5LcEgk[lhFfi"
    A$ = A$ + "^PBIoB4bfl[RS?IoBU_cZDlgLLZiWoEWS78__kheDoAH?YEU7:;dNagMF[RW"
    A$ = A$ + "oM\GV`LT[B7:G>]iOGEnh_Eci68?WcLnW_S\PMIbP_oM`mI=B;NN<g6EnEYW"
    A$ = A$ + "n:aa1OJbMNec\lZ\YEElEc1>;oMcCV[WkLG#5fCYjnPZJO7bfTFI?C>OP<`Y"
    A$ = A$ + "UO_BUOEj_kVkM7Lm<Ndf:][lZ^gTV6_JMdkB3GG[nmEioDmWZN<Efhd6oM>>"
    A$ = A$ + "n_kdCg=Wc`````````````hM6:OfaSXLVD6\_:1[38W^:oUB>]7aWZd9_:iF"
    A$ = A$ + "UWLi>9_kl1:Ei;GOgY^Rl:[WideM6H^K>k^#]O9N4U3_>K[TS>IJbi\HeN0^"
    A$ = A$ + "[N>ao^`e9DfLiZbON]Dkl1:IOSDGmMRoPY;MLJkBgMcI?;77kM][N]OHmD^<"
    A$ = A$ + "2NcZmbBVKe]?\PMYWNF>VXCb1H3L^>E]W\DjBen5XJ=maJCFiOPhm\BGJVlN"
    A$ = A$ + "OWo8Z[>m:SZmfiE]7EZhhieICeg7gV7O;mWoiOnkdolo7[cWJo;ZZ[Zji4ok"
    A$ = A$ + "2_ggS0F[mZjI57?ZGZmDB4`N;CaibkeV:i5?o_n[oZlm?^]9R;BKUo6;_O>_"
    A$ = A$ + "K^kk<7?JkRfMUL=iLAXf7FMi9gWTJoeVc7UL41EMm\LlX\IOCd:IQgKSX>Z:"
    A$ = A$ + "GnIanNYB6O7g70k`aanSM5NTLLeN>WK;Z>?cEi9GGc?kDok2B;cI>:7?W68g"
    A$ = A$ + "Ek9BNn3En3VYLlO#\?;Q<Rc=eEg7h[27OjITiIbaS_[V3EkifMhhCm_;Z0OV"
    A$ = A$ + ";?:7?;o8?[hhZc[J>D]GkAo1HO;RoFYo2m<6[hk6>JohMfFBmN>c5>:7Wc;>"
    A$ = A$ + "MMkgkSbaEm=GiO1INdAihClM:MmiZbOei?9n]9LlLmk^i\?B>>`Zm1ZZMUeE"
    A$ = A$ + "7UScOGVi6H>FZnfVbaiWSih`o^<9LD>^Jlnlg8DLlhoGmN_jk0L0_C?aO?Mg"
    A$ = A$ + "Lg717OjHENTmS[VS9g_kIhhkhOGbQ:>aIhh[hTPkbeY:o1cIhhhKdhlJiaSo"
    A$ = A$ + "mU3WV[PSSn\DlNEON7QS7S3U7c_RKEigT?37OeH#P=#HiHJo37I>W0OZLllj"
    A$ = A$ + "ng]OnOTSEIB0W]\YiIW?b#5PoMQcOecN6>>oN3cWEe9E0cCn:hhhKdOj[1dM"
    A$ = A$ + "=NlYS1^Z]kZhhZgg`hCidN6>^J^^LJFMVWc?kE`aOW67N57?7Z^[Lhcde:O["
    A$ = A$ + "RZ]71ffLXLIMOT7<7]b_mXh7hk?LL<7WiOMng5^<EmYN6>NVoFmNUZNZ6?=\"
    A$ = A$ + "O2olC]EC>l8_CdNEhh71EU1fc8[f_:h<kb?;jK97`kQ[2Xm\SSG]6TZa=XBg"
    A$ = A$ + "IhhigIZhhC\eB4`ilOEh[67o:ond:MJUmZbnG4EOF:KV[\Y=7`HOH>NU>#5_"
    A$ = A$ + "ZNXVokAihigSRWKbL0jFO0eLaS#V3<QSo^=^5hg=Ro=Tm<DgE:WiMY0EUAf_"
    A$ = A$ + "ZP_1cnX2hkFSd5?KfWISagPhQ?O0aY:CPlhZbnEgLJQN:W7aoRh#j2K`TCWR"
    A$ = A$ + "SSm7FGITemAl\ON1Y1n5GN=LRoFE6QlU?cn#7ZJcc?oSRGl<Agl8_bjBEITm"
    A$ = A$ + "M8:O_B4GdnPg3DfaB5OW?E1YAMWNEY3Da[Z7\oFAY;hdX:3hoFhlWCc>n3V8"
    A$ = A$ + "n#GZJ3Fml?:Nac0MngS[lNj\cVSid5]1ii_VUQZW];_WDVMbIWoMIR\LVbPS"
    A$ = A$ + "KJM]CGQOSm5<kD>G9_``````````````````````````````````````````"
    A$ = A$ + "````8So7XoSA%%%0"
    btemp$ = ""
    FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4)
        IF INSTR(1, B$, "%") THEN
            FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1)
                IF F$ <> "%" THEN C$ = C$ + F$
            NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
            IF MID$(B$, j, 1) = "#" THEN
        MID$(B$, j) = "@": END IF: NEXT
        FOR t% = LEN(B$) TO 1 STEP -1
            B& = B& * 64 + ASC(MID$(B$, t%)) - 48
            NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
            X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
    NEXT: btemp$ = btemp$ + X$: NEXT
    btemp$ = _INFLATE$(btemp$, m.SIZE)
    _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
    BASIMAGE1& = _COPYIMAGE(v&): _FREEIMAGE v&
END FUNCTION

SUB SaveAsBMP (filename AS STRING)

    'This SUB adapted from SAVEIMAGE SUB from the QB64 wiki

    image& = _NEWIMAGE(_WIDTH - 200, _HEIGHT, 32)
    _PUTIMAGE (0, 0), _DISPLAY, image&

    bytesperpixel& = _PIXELSIZE(image&)
    'IF bytesperpixel& = 0 THEN PRINT "Text modes unsupported!": END
    IF bytesperpixel& = 1 THEN bpp& = 8 ELSE bpp& = 24
    x& = _WIDTH(image&)
    y& = _HEIGHT(image&)
    b$ = "BM????QB64????" + MKL$(40) + MKL$(x&) + MKL$(y&) + MKI$(1) + MKI$(bpp&) + MKL$(0) + "????" + STRING$(16, 0) 'partial BMP header info(???? to be filled later)
    IF bytesperpixel& = 1 THEN
        FOR c& = 0 TO 255 ' read BGR color settings from JPG image + 1 byte spacer(CHR$(0))
            cv& = _PALETTECOLOR(c&, image&) ' color attribute to read.
            b$ = b$ + CHR$(_BLUE32(cv&)) + CHR$(_GREEN32(cv&)) + CHR$(_RED32(cv&)) + CHR$(0) 'spacer byte
        NEXT
    END IF
    MID$(b$, 11, 4) = MKL$(LEN(b$)) ' image pixel data offset(BMP header)
    lastsource& = _SOURCE
    _SOURCE image&
    IF ((x& * 3) MOD 4) THEN padder$ = STRING$(4 - ((x& * 3) MOD 4), 0)
    FOR py& = y& - 1 TO 0 STEP -1 ' read JPG image pixel color data
        r$ = ""
        FOR px& = 0 TO x& - 1
            c& = POINT(px&, py&) 'POINT 32 bit values are large LONG values
            IF bytesperpixel& = 1 THEN r$ = r$ + CHR$(c&) ELSE r$ = r$ + LEFT$(MKL$(c&), 3)
        NEXT px&
        d$ = d$ + r$ + padder$
    NEXT py&
    _SOURCE lastsource&
    MID$(b$, 35, 4) = MKL$(LEN(d$)) ' image size(BMP header)
    b$ = b$ + d$ ' total file data bytes to create file
    MID$(b$, 3, 4) = MKL$(LEN(b$)) ' size of data file(BMP header)
    IF LCASE$(RIGHT$(filename$, 4)) <> ".bmp" THEN ext$ = ".bmp"
    f& = FREEFILE
    OPEN filename$ + ext$ FOR OUTPUT AS #f&: CLOSE #f& ' erases an existing file
    OPEN filename$ + ext$ FOR BINARY AS #f&
    PUT #f&, , b$
    CLOSE #f&

    _FREEIMAGE image&

END SUB

SUB Smooth
    FOR x = 0 TO _WIDTH - 201
        FOR y = 0 TO _HEIGHT - 1
            p1~& = POINT(x, y)
            p2~& = POINT(x + 1, y)
            p3~& = POINT(x, y + 1)
            p4~& = POINT(x + 1, y + 1)
            p5~& = POINT(x - 1, y)
            p6~& = POINT(x, y - 1)
            p7~& = POINT(x - 1, y - 1)
            p8~& = POINT(x - 1, y + 1)
            p9~& = POINT(x + 1, y - 1)
            r = _RED32(p1~&) + _RED32(p2~&) + _RED32(p3~&) + _RED32(p4~&) + _RED32(p5~&) + _RED32(p6~&) + _RED32(p7~&) + _RED32(p8~&) + _RED32(p9~&)
            g = _GREEN32(p1~&) + _GREEN32(p2~&) + _GREEN32(p3~&) + _GREEN32(p4~&) + _GREEN32(p5~&) + _GREEN32(p6~&) + _GREEN32(p7~&) + _GREEN32(p8~&) + _GREEN32(p9~&)
            b = _BLUE32(p1~&) + _BLUE32(p2~&) + _BLUE32(p3~&) + _BLUE32(p4~&) + _BLUE32(p5~&) + _BLUE32(p6~&) + _BLUE32(p7~&) + _BLUE32(p8~&) + _BLUE32(p9~&)
            PSET (x, y), _RGB(r / 9, g / 9, b / 9)
        NEXT
    NEXT
END SUB

SUB DrawMenu
    LINE (_WIDTH - 200, 0)-(_WIDTH, _HEIGHT), _RGB(96, 96, 96), BF
    LINE (_WIDTH - 200, 0)-(_WIDTH - 195, _HEIGHT), _RGB(164, 164, 164), BF
    _PUTIMAGE (_WIDTH - 190, 10), menu&

    IF quads = 1 THEN
        LINE (_WIDTH - 178, 64)-(_WIDTH - 143, 110), _RGBA(255, 255, 0, 100), BF
        LINE (_WIDTH - 178, 64)-(_WIDTH - 143, 110), _RGB(255, 255, 0), B
    END IF
    IF quads = 2 THEN
        LINE (_WIDTH - 142, 64)-(_WIDTH - 102, 110), _RGBA(255, 255, 0, 100), BF
        LINE (_WIDTH - 142, 64)-(_WIDTH - 102, 110), _RGB(255, 255, 0), B
    END IF
    IF quads = 3 THEN
        LINE (_WIDTH - 97, 64)-(_WIDTH - 58, 110), _RGBA(255, 255, 0, 100), BF
        LINE (_WIDTH - 97, 64)-(_WIDTH - 58, 110), _RGB(255, 255, 0), B
    END IF
    IF quads = 4 THEN
        LINE (_WIDTH - 56, 64)-(_WIDTH - 18, 110), _RGBA(255, 255, 0, 100), BF
        LINE (_WIDTH - 56, 64)-(_WIDTH - 18, 110), _RGB(255, 255, 0), B
    END IF

    Text _WIDTH - 55, 319, 22, _RGB(0, 0, 0), STR$(brushsize)
    Text _WIDTH - 57, 317, 22, _RGB(255, 255, 0), STR$(brushsize)

    LINE (_WIDTH - 160, 180)-(_WIDTH - 40, 300), _RGB(164, 164, 164), BF
    LINE (_WIDTH - 160, 180)-(_WIDTH - 40, 300), _RGB(255, 255, 255), B
    CIRCLE (_WIDTH - 100, 240), brushsize, _RGB(0, 0, 0)
    IF brushsize > 1 THEN PAINT (_WIDTH - 100, 240), _RGB(0, 0, 0)

    LINE (_WIDTH - 35, 380)-(_WIDTH - 10, 397), blk&, BF
    LINE (_WIDTH - 35, 405)-(_WIDTH - 10, 421), fill&, BF

    IF randfill = 1 THEN ran$ = "ON" ELSE ran$ = "OFF"
    Text _WIDTH - 36, 431, 22, _RGB(0, 0, 0), ran$
    Text _WIDTH - 38, 429, 22, _RGB(255, 255, 0), ran$

    IF eraser = 1 THEN er$ = "ON" ELSE er$ = "OFF"
    Text _WIDTH - 76, 456, 22, _RGB(0, 0, 0), er$
    Text _WIDTH - 78, 454, 22, _RGB(255, 255, 0), er$

END SUB


FUNCTION IBOX$ (txt$, limitnum, fg&, bg&, delay)
    'This function either gets user input or shows info.

    'If limitnum is 0, it just shows info (message box)

    'text$: Your text to show
    'limitnum: how many letters of input to get
    'fg&: The Text color
    'bg&: Background color of box
    'delay: optional delay period for message box only
    '       (and If set at -1 then wait for a keypress)

    '=== save original place of cursor
    origy = CSRLIN: origx = POS(1)

    '=== Save whole screen
    DIM scr1 AS _MEM, scr2 AS _MEM
    scr1 = _MEMIMAGE(0): scr2 = _MEMNEW(scr1.SIZE)
    _MEMCOPY scr1, scr1.OFFSET, scr1.SIZE TO scr2, scr2.OFFSET

    '=== find center x/y of screen
    y = INT(_HEIGHT / _FONTHEIGHT / 2)
    x = INT((_WIDTH - 200) / _FONTWIDTH / 2)

    tl = LEN(txt$) + limitnum 'total length of letter spacing used
    x = x - INT(tl / 2) 'recompute x based on text length

    LINE (x * 8 - 24, y * 16 - 32)-((x * 8) + (tl * 8) + 8, y * 16 + 16), bg&, BF
    LINE (x * 8 - 24, y * 16 - 32)-((x * 8) + (tl * 8) + 8, y * 16 + 16), fg&, B
    COLOR fg&, bg&

    LOCATE y, x: PRINT txt$;
    y = CSRLIN: x = POS(1)

    IF limitnum = 0 THEN
        IF delay = -1 THEN
            a$ = INPUT$(1)
        ELSE
            _DELAY delay
        END IF
        IBOX$ = ""
    ELSE

        entry$ = ""

        DO
            a$ = INPUT$(1)

            '=== Return exits with data
            IF a$ = CHR$(13) THEN IBOX$ = entry$: EXIT DO
            '=== Handle the backspace
            IF a$ = CHR$(27) THEN IBOX$ = "": EXIT DO
            '=== ESC cancels
            IF a$ = CHR$(8) THEN 'Backspace goes back a space
                IF LEN(entry$) > 0 THEN
                    entry$ = MID$(entry$, 1, LEN(entry$) - 1)
                END IF
            ELSE
                'add letter entered, if not over limitnum
                IF LEN(entry$) < limitnum THEN
                    entry$ = entry$ + a$
                END IF
            END IF

            LOCATE y, x: PRINT SPACE$(limitnum);
            LOCATE y, x: PRINT entry$;

        LOOP

    END IF

    '=== Restore the whole screen
    _MEMCOPY scr2, scr2.OFFSET, scr2.SIZE TO scr1, scr1.OFFSET
    _MEMFREE scr1: _MEMFREE scr2

    '=== restore original y,x
    LOCATE origy, origx

END FUNCTION

Find my programs here in Dav's QB64 Corner
Reply
#20
Well the next obvious thing is to allow user to pick background color.
b = b + ...
Reply




Users browsing this thread: 10 Guest(s)