Posts: 730
Threads: 120
Joined: Apr 2022
Reputation:
106
Browsing through the old forum @luke put up temporarily I found a drawing program I forgot about, QuadDraw, and decided to reawaken it. It would not work in our current QB64 version so I had to rewrite how it draws (it was using a recursive function that worked in QB64 v1.5 but not v2). Used a drawing method @bplus helped me with with another drawing project (doodle dandy).
I'm going to start working on this again and add more features. Here's where it's at so far. Draw on the screen by left clicking the mouse. Right clicking will fill spaces with a random color. U will undo last change. Brush size can be changed with -/+ keys. You can change how many section to draw at once by pressing numbers 1 to 4. Current drawing settings are visible in the title bar. I probably add a menu system and drawing color selector to it next.
Testers and suggestions are welcomed. Example drawing is attached.
- Dav
Code: (Select All) '============
'QuadDraw.bas v1.3
'============
'An odd little drawing program.
'Draws/paints in 4 sections of the screen at same time.
'Coded by Dav for QB64 APR/2022
'NEW FOR v1.3: Fixed it to run in QB64 v2 and higher.
' (had to remove recursive drawing function)
' Screen size now adjusts to users desktop resolution.
' (size not hard coded - should look good on most desktops)
'CREDITS: SPAINT SUB was made by Petr. Thanks Petr!
' And bplus helped me figure out a way to draw lines without gaps
' in another program (doodle dandy). I used that new method here.
'----------
'HOW TO USE:
'----------
'Use the mouse to draw/color on screen.
'Left click = draws on screen.
'Right click = fills areas with color.
'Use the +/- keys to change brush size (1 to 50 allowed)
'Press 1,2,3 or 4 to set how many areas to draw in, default is 4.
'Press U to undo last change.
'Space = clears screen and starts over.
'ESC = Ends program
'Current drawing settings are shown in title bar
DIM SHARED quads, brushsize
SCREEN _NEWIMAGE(_DESKTOPWIDTH * .75, _DESKTOPHEIGHT * .85, 32)
_DELAY .25
centerx = _WIDTH / 2: centery = _HEIGHT / 2 'center point of screen
wht& = _RGB(255, 255, 255) 'used often, so variable it
blk& = _RGB(0, 0, 0)
brushsize = 5 'size of drawing circle (brush)
quads = 4 'start with 4 drawing sections
CLS , wht& 'start with white screen
undo& = _COPYIMAGE(_DISPLAY)
'====
main:
'====
_TITLE "QuadDraw - Quads:" + STR$(quads) + " BrushSize:" + STR$(brushsize)
DO
WHILE _MOUSEINPUT: WEND
mx = _MOUSEX: my = _MOUSEY
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&: PAINT (newx, newy), blk&, blk&
IF quads > 1 THEN
CIRCLE (centerx - newx + centerx, centery - newy + centery), d, blk&
PAINT (centerx - newx + centerx, centery - newy + centery), blk&, blk&
END IF
IF quads > 2 THEN
CIRCLE (newx, centery - newy + centery), d, blk&
PAINT (newx, centery - newy + centery), blk&, blk&
END IF
IF quads > 3 THEN
CIRCLE (centerx - newx + centerx, newy), d, blk&
PAINT (centerx - newx + centerx, newy), blk&, blk&
END IF
NEXT
NEXT
ELSE
FOR d = 1 TO brushsize STEP .2
CIRCLE (mx, my), d, blk&&
NEXT
END IF
lastmx = mx: lastmy = my
stilldown = 1
ELSE
stilldown = 0
END IF
'if right click, fill sections with random color
IF _MOUSEBUTTON(2) THEN
_FREEIMAGE undo&
undo& = _COPYIMAGE(_DISPLAY)
r = RND * 255: g = RND * 255: b = RND * 255
SPAINT mx, my, _RGB(r, g, b) ', blk&
IF quads > 1 THEN
SPAINT centerx - mx + centerx, centery - my + centery, _RGB(r, g, b) ', blk&
END IF
IF quads > 2 THEN
SPAINT mx, centery - my + centery, _RGB(r, g, b) ', blk&
END IF
IF quads > 3 THEN
SPAINT centerx - mx + centerx, my, _RGB(r, g, b) ', blk&
END IF
WHILE _MOUSEBUTTON(2) <> 0: n = _MOUSEINPUT: WEND
END IF
'get keyboard input
key$ = UCASE$(INKEY$)
IF key$ <> "" THEN
SELECT CASE key$
CASE CHR$(32): CLS , wht& '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 CHR$(27): END
END SELECT
DO UNTIL INKEY$ = "": LOOP
GOTO main
END IF
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
Posts: 730
Threads: 120
Joined: Apr 2022
Reputation:
106
Still working on this. Added a couple things, fixed a few things. Used the Text SUB by @bplus to make a menu. Nice SUB bplus - it's faster than my PPRINT SUB. I need to work out the _DISPLAY stuff more, and redo the smooth SUB, it was a quick throw-in.
- Dav
Code: (Select All) '============
'QuadDraw.bas v1.4
'============
'An odd little drawing program.
'Draws/paints in several areas of the screen at same time.
'Coded by Dav for QB64 MAY/2022
'NEW FOR v1.4: Now shows menu of settings on right side.
' (Uses Text SUB by bplus for the menu text)
' Added 'Smooth' SUB (Press S to smooth screen)
' Fixed serious PAINT bug when brushsize is 1.
'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)
'----------
'HOW TO USE:
'----------
'Use the mouse to draw/color on screen.
'Left click = draws on screen.
'Right click = fills areas with color.
'Use the +/- keys to change brush size (1 to 50 allowed)
'Press 1,2,3 or 4 to set how many areas to draw in, default is 4.
'Press S to smooth the image.
'Press U to undo last change.
'Space = clears screen and starts over.
'ESC = Ends program
'Current drawing settings are shown in title bar
DIM SHARED quads, brushsize
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)
brushsize = 3 'size of drawing circle (brush)
quads = 4 'start with 4 drawing sections
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 = 1 TO brushsize STEP .2
CIRCLE (mx, my), d, blk&&
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)
r = RND * 255: g = RND * 255: b = RND * 255
_DISPLAY
SPAINT mx, my, _RGB(r, g, b) ', blk&
IF quads > 1 THEN
SPAINT centerx - mx + centerx, centery - my + centery, _RGB(r, g, b) ', blk&
END IF
IF quads > 2 THEN
SPAINT mx, centery - my + centery, _RGB(r, g, b) ', blk&
END IF
IF quads > 3 THEN
SPAINT centerx - mx + centerx, my, _RGB(r, g, b) ', 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 "S": Smooth
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
SUB Smooth
FOR x = 1 TO _WIDTH - 202
FOR y = 1 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&
Text _WIDTH - 177, 12, 38, _RGB(0, 0, 0), "QuadDraw"
Text _WIDTH - 175, 10, 38, _RGB(255, 255, 100), "QuadDraw"
Text _WIDTH - 152, 47, 16, _RGB(0, 0, 0), "By Dav - v1.4"
Text _WIDTH - 150, 45, 16, _RGB(255, 255, 100), "By Dav - v1.4"
Text _WIDTH - 177, 102, 22, _RGB(0, 0, 0), "NUMBER OF QUADS"
Text _WIDTH - 175, 100, 22, _RGB(255, 255, 255), "NUMBER OF QUADS"
Text _WIDTH - 177, 132, 42, _RGB(0, 0, 0), "1 2 3 4"
Text _WIDTH - 175, 130, 42, _RGB(255, 255, 255), "1 2 3 4"
IF quads = 1 THEN
LINE (_WIDTH - 183, 125)-(_WIDTH - 148, 170), _RGBA(255, 255, 255, 100), BF
LINE (_WIDTH - 183, 125)-(_WIDTH - 148, 170), _RGB(255, 255, 255), B
END IF
IF quads = 2 THEN
LINE (_WIDTH - 145, 125)-(_WIDTH - 105, 170), _RGBA(255, 255, 255, 100), BF
LINE (_WIDTH - 145, 125)-(_WIDTH - 105, 170), _RGB(255, 255, 255), B
END IF
IF quads = 3 THEN
LINE (_WIDTH - 103, 125)-(_WIDTH - 62, 170), _RGBA(255, 255, 255, 100), BF
LINE (_WIDTH - 103, 125)-(_WIDTH - 62, 170), _RGB(255, 255, 255), B
END IF
IF quads = 4 THEN
LINE (_WIDTH - 60, 125)-(_WIDTH - 15, 170), _RGBA(255, 255, 255, 100), BF
LINE (_WIDTH - 60, 125)-(_WIDTH - 15, 170), _RGB(255, 255, 255), B
END IF
Text _WIDTH - 179, 202, 22, _RGB(0, 0, 0), "BRUSH SIZE =" + STR$(brushsize)
Text _WIDTH - 177, 200, 22, _RGB(255, 255, 255), "BRUSH SIZE =" + STR$(brushsize)
Text _WIDTH - 179, 228, 22, _RGB(0, 0, 0), "(+/- to change)"
Text _WIDTH - 177, 226, 22, _RGB(255, 255, 255), "(+/- to change)"
LINE (_WIDTH - 160, 260)-(_WIDTH - 40, 380), _RGB(164, 164, 164), BF
LINE (_WIDTH - 160, 260)-(_WIDTH - 40, 380), _RGB(255, 255, 255), B
CIRCLE (_WIDTH - 100, 320), brushsize, _RGB(0, 0, 0)
IF brushsize > 1 THEN PAINT (_WIDTH - 100, 320), _RGB(0, 0, 0)
Text _WIDTH - 179, 412, 22, _RGB(0, 0, 0), "PRESS SPACE TO"
Text _WIDTH - 177, 410, 22, _RGB(255, 255, 255), "PRESS SPACE TO"
Text _WIDTH - 179, 434, 22, _RGB(0, 0, 0), "CLEAR SCREEN."
Text _WIDTH - 177, 432, 22, _RGB(255, 255, 255), "CLEAR SCREEN."
Text _WIDTH - 179, 482, 22, _RGB(0, 0, 0), "S = SMOOTH IT"
Text _WIDTH - 177, 480, 22, _RGB(255, 255, 255), "S = SMOOTH IT"
Text _WIDTH - 179, 522, 22, _RGB(0, 0, 0), "U = WILL UNDO"
Text _WIDTH - 177, 520, 22, _RGB(255, 255, 255), "U = WILL UNDO"
Text _WIDTH - 179, 544, 22, _RGB(0, 0, 0), " LAST CHANGE"
Text _WIDTH - 177, 542, 22, _RGB(255, 255, 255), " LAST CHANGE"
END SUB
Posts: 55
Threads: 4
Joined: Apr 2022
Reputation:
5
Nice ! Just missing the screen recording option (jpeg or bmp...)
Why not yes ?
Posts: 730
Threads: 120
Joined: Apr 2022
Reputation:
106
05-31-2022, 12:44 AM
(This post was last modified: 07-15-2023, 02:07 AM by Dav.)
(05-30-2022, 11:09 AM)euklides Wrote: Nice ! Just missing the screen recording option (jpeg or bmp...)
Thanks. Okay, I adapted a quick BMP saving SUB that was in the wiki. Press S to save screen as QUADDRAW.BMP in current directory. I fixed some paint/drawing issues, added a color picker, and a better looking menu. I will add later a better file saving method so you can specify the name of a saved file. When you select a color, then random fill color is turned off. You can turn that back on again by pressing R.
I'm just out of coding time for a while - so here's the latest version as it is...
- Dav
Code: (Select All) '============
'QuadDraw.bas v1.5
'============
'An odd little drawing program.
'Draws/paints in several areas of the screen at same time.
'Coded by Dav for QB64 MAY/2022
'NEW FOR v1.5:
' Added ColorPicker for Fill color choice.
' Added R for random fill color toggle on/off.
' (when picking a color, random is turned off)
' (turn random color on again by pressing R)
' New menu now using built-in image one.
' Fixed a pesky drawing/fill bug, finally.
' Smooth SUB tweaked, change it to PRESS A
' Now can save image as QUADDRAW.BMP file.
' PRESS S to save image in current directory.
'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)
'----------
'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 C 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 A to smooth the screen using AntiAliasing.
'Press S to save current image as QUADDRAW.BMP in current dir.
'Press U to undo last change made to image.
'Space = clears screen and starts over.
'ESC = Ends program
'================================================================
DIM SHARED quads, brushsize, randfill, menu&
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": SaveAsBMP "quaddraw.bmp"
back& = _COPYIMAGE(_DISPLAY)
LINE (275, 200)-(550, 250), _RGB(96, 96, 96), BF
LINE (275, 200)-(550, 250), _RGB(255, 255, 255), B
Text 312, 217, 22, _RGB(0, 0, 0), "QUADDRAW.BMP SAVED!"
Text 310, 215, 22, _RGB(255, 255, 255), "QUADDRAW.BMP SAVED!"
_DISPLAY
_DELAY 2
_PUTIMAGE (0, 0), back&: _DISPLAY
_FREEIMAGE back&
CASE "C"
new& = ColorPicker&(200, 150)
IF new& <> 0 THEN
randfill = 0
fill& = new&
END IF
CASE "R"
DO UNTIL INKEY$ = "": LOOP
SELECT CASE randfill
CASE IS = 1: randfill = 0
CASE IS = 0: randfill = 1
END SELECT
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$ + "haIkm5T]\LZ[\^YKjVN:h1QW4^YkNKj1PknKhQSWIN#Ln;MO_hIi`Q4R<cZb"
A$ = A$ + "ZZM`J5[cIW59841TP04oWocoikn?66666666666666666g:nmOogoF6g]lHH"
A$ = A$ + "LFlKof_m]oh?nS_mokKO[5oiOnWO;RkM;_?;4jTEHWhV1joh[Tnl>[7Ga]EL"
A$ = A$ + "mkF^O6HR^HWhfQLk5S[37QO[ZOoDa4M`?mCodo5WUS3hne_>4jb[X_WOmGoe"
A$ = A$ + "?fjT9jP_kkn^o;^:>NP?IMjc4ah=^RjSX?\?ejTkRSocol?o]OiGnU?BMj[F"
A$ = A$ + "mg44e5oh?nS?mjSHnJEcUKW_gSiKW1NokRS7UQ_okon]kk8GFfYlVeMg=_l:"
A$ = A$ + "i7C67b?l3o`XjSX>>hjC6O?hVCRWZnIW_o\Z^n:hSk`aWVWQL7YIl=b9j:EL"
A$ = A$ + "hbk>cmBYgV6o9aKUNh:VomTbKlmbYeMkDOLD>nTfU:X\1dEa_gUS7O_KBo68"
A$ = A$ + "MShODkN5e7AMhI:[?:>nZjbGE>ndjS8NAJ?9Nhk3WUCb]G^ZiRPbn>LlMdYA"
A$ = A$ + "kQS`aagF?[mN2m46_dTl;Z[V4_EeW#?5bo[47?6ohSRSO5La\nj:B_LIoAaa"
A$ = A$ + "3L6>nEDFSjZPWge_#lKCZ[`H`FaaSff_RLlYe7g977j\[8mhbnThn\ihGag["
A$ = A$ + "2meT_W4iGdFHBiJBJQjn_2LlELbXNLbHLAiIBK6d_d4>b[:7?n^jZh]S=5FE"
A$ = A$ + "?4ig4Mk4mjG=>nZiWPjPYUW9i=Bc9ccmEUS7ieTlHZnMUN;b_9j[Eb5b?d^b"
A$ = A$ + "LliLlMV76RkTbcW>77aKUN;ZCWTF[B7caejT9OGfLLMN<]<^:mVDW2IK2_k\"
A$ = A$ + "[[hW67Obh01_MBMok87?6SKXGQ=hWD>WJKa9UaY[OaZbcGA>>Tg`NCak1\[m"
A$ = A$ + "FnTih1o>nF6N7H;g`>7AI9[g2\[mFVD6_ZeLh:\=nk677c]>:cHMA>RmonTi"
A$ = A$ + "hX^2Lk#G5j=0llS`_gEF<7ohLlE[3aGI>>Jo[f7GX_lc`kNVLLlmXc^_;Ogh"
A$ = A$ + "hGQ^mCVSGeggE__c>KKUMb[_JLl[#gmEPS7jeLmlEckNdLL\Fo1>kIBhMRS?"
A$ = A$ + "Y^JWeeiCVScmm=QC]cjLMU]KjdkWefh_KLlYe1CeOOEhhCGcaG9>>VO<\[Pi"
A$ = A$ + "hoCnhDN[ihoclhAbage61GU]aWFn=7oa`aW\V\O:LlM7o>\?dI]Kh>LlMFSL"
A$ = A$ + "caWaaW^Vg_ZLlM\ae^f4kZ\=n>c7IWib]S]LWH[TYLL\6OG977c_oZgK]kPW"
A$ = A$ + "17OjiJiXLlYkC[\lX\?dSRS?5hk;C?[KCeAk<WcYW?dYLl0C]]lSPSOT_=N4"
A$ = A$ + ">ndjR<7O7>kdnchliZlk6GajZT]WidiX?5XNkZF7SMihkF_LUYIDo4Yi>WO#"
A$ = A$ + "VKl8>GfkbagI\IhLYLULl0WI]aSg?_?P>kI0_[Nk:B_<7o^>cbC1>?SkL>`?"
A$ = A$ + "Rmag]<^Kj^CO:GY]a?KoiQNTgSKIkINeko\717o^lm4C#8K8=Wj??ZhhGen;"
A$ = A$ + "i<LlYnJ3Do4L[[VS78dUk\oOckCchmieMMBJ\KmfZh_Z]EVS?Yn?nmWiL>3i"
A$ = A$ + "3c]9o=kc`aWdWc^ciL:7?g_lThOUf6_SWWkCNWj7Ej1mMfGm3kA68:;M#]oc"
A$ = A$ + "P=UDY9>G0E8omo\<RinW_?1bjREb9Z7SnO1?MekX:W<#I5Y;liNCeEIPmKO^"
A$ = A$ + "LR_7?Y^PihC:[#O7Y?l?OCd3?B>>ZcgIN20Ioj0#dg>:W:0NIe_[VoaTd\Rc"
A$ = A$ + "TWK<Gogm>An]:=ceoI>aA0doEm1=EG]kk?Y^PCc9Ue\nNBioZ\=n:\khE[d1"
A$ = A$ + "P3a]gim`O7Dko\Zd<RkTdTC_hmDY7hJkTVC;GCT;^oWSX[hdh<e57AV>R^iI"
A$ = A$ + "`a3<e_4^RSKHl:3\?`VRkFN=<>2`ImfLL333333333333333333333333333"
A$ = A$ + "33333333333333333333333333SN4nB0hgOb0g]Wg]la#9[0`?_HL_8Z7n[o"
A$ = A$ + "j_n67NfbA`O3NaZ`[2g9T3UNS3ALRhNgeaC2AkekF_Ne8:CEeC?KII2O9cK^"
A$ = A$ + "CNnTfRLh>iiCUg?9>nTn<OVWAoS`I2NnMYkfYmH>l<m[>I<ENQ?hj^Tc[0H\"
A$ = A$ + "SC:c?;>nIh<`OJm\eQ7=0O;hcDNW>>U8l^cagU7m\hhMLV#G7n__:I7g_:Wm"
A$ = A$ + "N>M7dm=Whg2OHCg_o\i#kl=BcaOne1`7Lf5WWYoSLUl2oAf:mjcDNgYNgLlW"
A$ = A$ + "?W1b#W\3Oejk47oI9_k<>U8l^caQ=KWJS^G5>NdGn[PLNULlGeibo^ca1bgE"
A$ = A$ + "1_2e5[hhMbInnEjIYo`lfSoUm5a17Y[=IlmXWYl^kg^oDhh`WOoZ`aQ_S6LT"
A$ = A$ + "<2nBGmDlngUO8Ei[kamgFE8Ooim<d[LH5WoCQS3\b6H?K^SRc\ZM8^c4NVS7"
A$ = A$ + "78gVLbH22nEnN7iA;O:IJehc=7oacIhkBQ^nMbSCiIKcI6C6C#^=lSn^bYBV"
A$ = A$ + "R_QK>nmaaI\Z_a\_Do^[CV^_E`MBdSFN[j_Nelg=7oeAfbmQO7SCQadif5bm"
A$ = A$ + "EM7bg1Eo3#We5<7oePc4oFnnIkEXn0cKNU\7QWAohEkSDcaO=hh[6SBn^=j>"
A$ = A$ + "j37lI5`L#k2Q<o8UkZaY0n[ihg;7Oenc:?6UWAoQ:\JoZ\bF#P7m\U_9]obf"
A$ = A$ + "En^iWOZLlEOW?OoZNGfBiZhh?:NdAfWbL`LlkAN^kaX<Q3=I]lO7hhh>;o^i"
A$ = A$ + "XOJLlYSAi^7_hG1>nMKgh?A>nZjUGQaXH>nk7NEhh[FOILVO1Ro6h>>STMj]"
A$ = A$ + "X\4]7WXGOTLLFWUAG0aaLl[_>iXQkPS?Y=IWln\6_UJoo<mK<VSoj`a3K=6["
A$ = A$ + "YocH]3ch<WIiWUN5gMl<j2PS7O;jI\WJ<7O>WiEnL0S0>kYg]MQjTA_6#VSW"
A$ = A$ + "AU_GB52MMNo7LWcK^C>odhh`W[5o;Of4bS;kI`EZ>S4[0h=g5W1bLl_:OGGl"
A$ = A$ + "l<g6mQo<mS0<hmMPBOnY`aceCZiVl:L69VRk\OA5?^2aHL_CnM6MbiW677nQ"
A$ = A$ + "W:l<i:W1g]N4ke3ellN5g38MjbGUfQ666666666666666666666666666666"
A$ = A$ + "666666666666666666Oj8>STicF8N>OV3SWQkY\li#TOoZh^:ma_YB_Lne9k"
A$ = A$ + "ZhfmkaiCMUn9OWZ3o]CT_ihDU7Zh2Pk5bLjbn0V:MKU>]CO\S>S1kCVjRk[8"
A$ = A$ + "hcL_bo_7oODFc1DFcQZhVo]XnE5DbS:=0g\;^XNMEJEa1IM07beaCSGVWEm>"
A$ = A$ + "MU?XohgYZ^TO_Yjg\>IUO>j^i_7QS7bMLV2cU=l<Ek1fo2G5G4`I6^jgFi_R"
A$ = A$ + "cjfEgmO[lQf8]DW9a9LQ9lPliaOBlQ\gEg`Q9gILa_7WSdEU;T?X]hZ`k`ii"
A$ = A$ + "DeGALN[cj;hGbhnOAm7[ODa51h?5D1L^iidS_Sa`M25G7ToVOl>:oI6gn5gW"
A$ = A$ + ":li4Vi;ZfVAN4Pi\i_o3O<:BOF_0o5dTb7d]L0WAn\<cb4^C:D]KDgQKQ<=A"
A$ = A$ + "7PfGg=?N7>>Tk757_[Ol:>NEmZjK8[lIO<G0?SmWI<7Am=6h;9Da]b7=XhHk"
A$ = A$ + "FnDa=0o]GU<]Cnc]aDj0T^_bmW[hhHN9\Nh<LLXoQ?d9o\\NM7>NEL3NGU?k"
A$ = A$ + "[RScge[CihZdSm5P1>27O7M1cail1bj>OK#e6;:;AMKnn#oEg?[XhhhKn\Nh"
A$ = A$ + "<LLTNAnQj25GCUNEiAELS_mRi]aU=eHEDn0Yc`aQoCAIgV797WU]LI8hfEe;"
A$ = A$ + "EYYbgASiTbO[jMSSSb2[7>377mOTi3LN[ZGEjG<6g^hRi]E6Qogd[bGfM6>N"
A$ = A$ + ">l\hh<O<omblkNVao`_gkR_4Jjl\?;7GI_4N^W[h]A8OGbg5Glmd^d9ko<_b"
A$ = A$ + "aZ`a9g7gSRScaUWC5nNe^Ll#V[:O_[f>De^m:hh:KS`jkYfE1S9Yc^:XM07D"
A$ = A$ + "f5=hg\O9o<Ll\MEh_AlXhhZi2bi5:WCCc\L[\OD4^KnkAhh:KRN5LLElVbaE"
A$ = A$ + "e1AmEelWfe^:ANbO[m:VcI6?J>NTf\<X\;b>YIXScgK^:k[SaVOglhMhhZ_o"
A$ = A$ + "O5LLf6`Q^i<Ll[f^:\_\oZ][bSVSg=N94`LQWVVLi=TMNlUhmOfg?7WUS[nf"
A$ = A$ + "kIihZimoXhhI>UjmDLl[L>WMnOnM\MgEcakZ_DY9GNEca9KS[kV;_37_ZLXJ"
A$ = A$ + "Gc?[b6ELmP:ODe[H^QZjPEfPi<LL>>Q\ZdEkbaIIB9Wi_7aaEYODLd8_E]Wf"
A$ = A$ + "AobSM?BCnI<7hELNXZj]>kA_J_F4mQNULLEXbnhi`IihC^Cf`k];7_[?g8MQ"
A$ = A$ + ">\cfM8PeJEE>W\F3Z#^=fZl7gcbigm^idChh\^=?6P^m<GN^F<7QWG4fS8LL"
A$ = A$ + "VHk#T?MaMW_[[hh#gX:[IkGN4>N5?7fh1YKT7AO5Ejk#nZd3E?O7Kc6XB74Q"
A$ = A$ + "#fh__OWgkBEP_[OP>6oFl<DVahLSiMPnQag_hk0T8>ik^WlldanU:nklj2WS"
A$ = A$ + "Sj^7:[kQl\:^`F0hiPk0iXJ=Pb0mEUUC0HOWLj=Mm]aJbViG`VSln4;[_3Te"
A$ = A$ + "58^`67MjbhIH=HWXOSl>_g9EegH]5`gDNehh0Xm70d_ibBN^Lib3SlL\I>1o"
A$ = A$ + "<dNQS3;?<bfd^;^#ViW7?;?VPELLEIUiQLj=Im]Eca?2\]<SoViP0P?Yd3E?"
A$ = A$ + "ORn=;oEjPLnW[7O5ihlMm3da[^;M#KLdW477ekgmghIkLg3=9^COFWn1mCSb"
A$ = A$ + "ZBGLTeg6YMVOafLDY_AO[MjQZWOdkf9F7TSk>jCS_NXZOjkF^<<<<<<<<<<<"
A$ = A$ + "<NdPmE:acboMecbn`0UO:QGC<nmidWAELDbAEjZl3<MY?kGDZli:E0_Ogj1Z"
A$ = A$ + "lm:[lW9X<bbe>n#6EiUeMC;W_CPGS[>Ol17g:OXP:mD_?Wn<DaA]7=Fi7FDn"
A$ = A$ + "B6eI2[K=7annH5G:onElk^lXRO?aO]<]>>WG:MgkTo3J5Dl5\nHL#]F6`F^["
A$ = A$ + "fc3X>X;N`V\MLLei2Pg?5L0[38W>Lj7YcTm`2KGhLo[C:CIM8O^JSPZOd9_C"
A$ = A$ + "U]j[:CH_]4U7FnaNoo^iWG1Zf;;Cg78ZmgET^lc`JCgiWBDf;F93ZcS\J_fQ"
A$ = A$ + "d5[OG>`n06U?W92:O#2OVRjfoEZbDFnEj?\_4ZN7\^ai#83X<eenPOWlj4[f"
A$ = A$ + "oB_bkIlcbaWNf3DeAZm`lZmQMeJR`bPZmTRSWKc0`L[LoK8MDkU;ecbWgRll"
A$ = A$ + "#h`ZbDgN0=c_bYMgN4G]njhMEm_\RS[F7fg=DaaEOkO:77kK`8=hm1F57GMN"
A$ = A$ + "JDLLnk^EW]ilN75YK^\R_?cb1;Oak0oIEN_#YFObZm6h:>>o<\G3cj2l=Yln"
A$ = A$ + "\Jek48?6=^\I>nL>>g7IF_ck;8nmaNSXBnhd\b_YX>c7HoFPi2TKO`S_5YCe"
A$ = A$ + "IM=NnZmgEU>[JmjAK#Fg1MVROU7oL>0ISOWLlDj8caogeGELlZiePiX1\[m4"
A$ = A$ + "TAno=0NBGn7QEnOFd78:gEfP0]Ikf?Blk]RSGi72khGLlaibBm>iaYDm]>ca"
A$ = A$ + "oWeGMWEP^cK`:kZPiacL7ITYj1\7Z[2Ho[7c7C=o[lNM?bCHkJEHU=ehh_JO"
A$ = A$ + "GajS<OEmm=H3AnmbWU14glhDDnhGcagWS7YWjkX#77L\:kZPjXES7W3hl0Xl"
A$ = A$ + "Q<8]cnEFEK1eNn7k;EEKb>KZYdIELLUN:_o]ci3>S6h>?#i[9k\AIgiegLlo"
A$ = A$ + "ImURSScj3Z3#oaLMPbfQ\MEFaaEf6_bO4cfE1c1^:N`nhI^TJ=1PoJn<LLej"
A$ = A$ + "0ee7^bfeZl:oN\MTZlCCVSo?eQC\[2Z3VH7>f^:[F38F^`HY[lg3IkZPn5Ea"
A$ = A$ + ";Pjk<:i0c9DeO^BWYhh\N8bgZn`gQSWmgM[FG>4<7oOZ3gQScjh9SeI5WQm["
A$ = A$ + "U`V8ELGEMT:N`Ng:KLXli<\m[gQS[j3?KoY>KLWSkZlJ:7?:kLmeG5>^JL5l"
A$ = A$ + "cRn=he#4c_AIW_^e4D=O>>>:kDZn>L>`f\9oKLMYZ=HUOnFa5Eb;hd#>DmQ3"
A$ = A$ + "nIX;aLSak`n:n8oIM>:7il:?GWhMDn>bLK[?E>^ZL3MB7O<[7Z\?N>PaJN5L"
A$ = A$ + "LFVahV[2k`aWhSOk>Gj:i=GVWdo:hV8PeA=GNDkK8EN50f>_J>WAohZmobW2"
A$ = A$ + "7Ge_BNohd]G7bSO\K_dUSK77G=^5>>Zj:U]Oil?GOemKMUi\OOiXLLeNT#9_"
A$ = A$ + "\=ARgKBM1WG1P=EZF38UnTm59O:8k3>P=iRW3k80kU`f29_g=bnX3\?\ba5n"
A$ = A$ + "2UlIo6#icBP=>b[S>\7Nnl[3oX#W?59gG=BcZjb8]hb<kG6DcQ#9_P3UiDih"
A$ = A$ + "Xd3QlPaLTc?nLgce5XMVJ?^anIWlnP8K7YLje]6d_SXc>NZm>5hgimjVRG[R"
A$ = A$ + ";_^h[h>LL#K_lc0?_:MINLg_eEVEnbl>i5S]Vg[;EbINn#ib8d;Me5XMAgnZ"
A$ = A$ + "QeAIo8TBONglb[6\?iPe=inOk:oMn84lkE#]o#EneScjCAVh[#DnLU9nD5EJ"
A$ = A$ + "3nJVCeY3`o7l]9jG\NbLNeE7GY?_K^Xak72nFeNl^2iaQmXc;3ScRS`g>JoY"
A$ = A$ + "VKKHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"
A$ = A$ + "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"
A$ = A$ + "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"
A$ = A$ + "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"
A$ = A$ + "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"
A$ = A$ + "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"
A$ = A$ + "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"
A$ = A$ + "HHHHHHHHHHHHHHHHHHHHHHHlYSOogom_mWoiO:aOl7oag>JLSoVoMekShoKo"
A$ = A$ + "f_mOokoj_n[o?4oMl>MiOllZd\Z\biATgMb]:?bXC_d9?6?74eQMQP70>`Th"
A$ = A$ + "Rd=ZKc1`GDa?BohoGUVPWEmnlkDa_kb3dFB9gZl872iZ:][T7SG7>N^NNBLc"
A$ = A$ + "mka?oGnUOiOU^od?mCo;^?72nCl^Ll`kcQhI1bUc>>8T_OmGoe_YTKENT3Q\"
A$ = A$ + "a_g:iahnhhAMe?ocolohI1oh7nQOhofGgZh6YG4G^>?h1<G9RcgmMOgo:^Oo"
A$ = A$ + "gombW5mg[NO>4?;#^Lb_GTNZWYTK8SH\=L8:GZno1DbSamba[h=ZnQihRWaY"
A$ = A$ + "k>LlZWEmn:IM57_B^ifaPSSnQIM#4D]=Rh3i`Llg7>n4>F7GI:77O;8B3lMn"
A$ = A$ + "[TS3>H0T7An5_3o]2VS[TEEI0bLT^oh?nSoGTUWllN[#Nnf6G;7_R;YN>?FU"
A$ = A$ + "XNYR[DU^:>8\GA`=0WUOoZa>XhhZaS3KZTk[]SSc]KS#DnELlhiMS1oOU#R0"
A$ = A$ + "K[:S[QScLXXN5ma]J^GHLkkbaSW[hP`V:ak6PCcZPRSGIG5HK6T7ES7G=Vk8"
A$ = A$ + "4SCAaaidWAffUE8bcX=N83g=?iM6C\Ya4>>\m1hGk<FUXN4f7G5Z\MHEXJl_"
A$ = A$ + "Mll:K7VihlkRaYdaaSWSf?:m??VM5<7oJihZaOPnDVHGUXnXbn4MLl#F2Kg5"
A$ = A$ + "aCa3Ef>4][h#gLlRl#=V3TFELL^L61<>U0\<SnRaHQhaSo_B<A8BOg?nSQS["
A$ = A$ + "V7G`KELLeL>EOGOeHE2i0[5ZjmSjKVK\cL>Aj78hMZnU[\iYJ\G#W0n;WF\M"
A$ = A$ + "E>27gS7oibage^:WafQ:N#gk[Te>kZ4laXoLF6aL4il]bf?8ORfOELLHG5Nn"
A$ = A$ + "WXON<>65#K8g?n[97OWiLZjkLWgG9[[hhZaU4Y??f7`eh#NL:AkU:>n:nY7?"
A$ = A$ + "ncWS3KIXh=k`aI^RJ]lQM6EmW^cg1DbJW]3So_Jl#AO^:>^J\hLI[K_2d=V3"
A$ = A$ + "HWn>H>nebaEQ>kSGaa[\7H>0KO_R35QX_dc`akf?9A8TEEKC<^Q^`Ihh6g?7"
A$ = A$ + "7mi];7?h_Mke_lLbZ\mlAbo8Xhh[fKS`nX7QSg9oibZk?nN#DgW]e#6XN?KK"
A$ = A$ + "PLLa_7m3SmW7NFfNPhk]hknH^Dlh=a_Sh6_G>^`f>MiO^]SZlVCOT7ZbH>o3"
A$ = A$ + "TS?Shg3I9T;\nVl_K>nmSljgX#D?1kgaa5li:KUU]A03TV0ZmbdAbo>kSWgO"
A$ = A$ + "0LN0N8;7LkWZi6FUfVSOo0[oB5F5G`mZN7lkP[PnC[TULoQao?NfIco:IA=_"
A$ = A$ + "^>MA5FY3cU13333333333333333333333333333333333333333333333333"
A$ = A$ + "33333333333333333333S07i>f6?;O_d`nNb^kZ6F6jRk:IROFnN;IJnO6Te"
A$ = A$ + "3kho=[T9EiYZL`gMiMYCl\9gijIXBOU<`LY>NaMPM_S]klaZIMLELDgSC]>m"
A$ = A$ + "bDn[NVjNfIglo<8WokLO1Z:;ZkJS>oV:hCLICMOk>m>GWK7^:PjlEgoI_BLL"
A$ = A$ + "LOU`1hGeF5P?;[CWPdJ7>NU<=iNEIEnODTiBAm8^;=WhK2EU5^^0nl^Z0lAZ"
A$ = A$ + "Lj`YOT>ZkaXL0gM0kba3I#MGH`Q#>OUhhEn\HFO[dW`70b1l]=emhDnKWi#n"
A$ = A$ + "ni[BVDgW3ZhfUoZn_V<^V\^3nloYnOCEIQkCFiCYcj4h7OcQ`7h6mc`Y3[WZ"
A$ = A$ + "^cec]mag9DLm\<`mm5_;;gh^JjMTS[NFWOmFiKJ1Dn_klkXBcYLl9iO^=G4F"
A$ = A$ + "m=fLN3OmLl_Cdk\laLR8>Mn=m<b]=hk#?T>\NZjI:iGeW5kCMcQ^k]Sk`okN"
A$ = A$ + "fklNLoHbnlk:M2nN^Z=MemDLTVakXBcMihMi?caG=^VLKQ\OHn8LLN\4Eg[Y"
A$ = A$ + "Xn1j4hcccj\\>1j3F?EMW[[l;eZaXVeWkNW1o:ca3M27`M`:kO]i0dSMc;C="
A$ = A$ + "fj\NQCCN>G8O>Jn[hhEmiWiTikY]YmCYdSioOEOTifMH<^II9[3cYSJlh`V:"
A$ = A$ + "\O?ORlVSkTi4eY;OUhhlg5ig;k_\[2MSaMG>^:DaakboYg1cIK?TUEL?]5m]"
A$ = A$ + ">E_gU?a_ga=EbSZNQKk=i>G_Z=:oNObLLEI:o^[Z3c]5^;>>Wo7QSWi;HlI`"
A$ = A$ + ">?Mf#N27??NT>I3SA<VSYZ>QKk=i>GOJKb?M>NP:k5EYCbc3_JLIkbaEm=]b"
A$ = A$ + "^:Zl?_>;id4fC38OglP#Nl0EfFEm]3I4C1LGdYFo28[ikJ;EKQLK?T_[^ceo"
A$ = A$ + "ZcaAo:0hnR:7`Hc[d9Mc=KG>nI\[R:oAnQdDI3S0ibL`I`ccf\;7`MZEV3YR"
A$ = A$ + "C>4jfP3GEo`fe#]^?ifNAmbTkLmZiGGY?odhhlh\SgU[GGmM0H;0U^lI`akb"
A$ = A$ + "ODg`LLdW:#^?#fVQP7Y^Kfb][HiCYKES7GIG5dfA5?dfSkgF97#O[j?_BOnY"
A$ = A$ + "caah1WnnEcIoIbaWXCFIGU9f<DeoO77W]I5Bk:^[R[XR7JkaLLEOo#O[JogY"
A$ = A$ + "?OeihLo4hNKEY_iaK6U5nIXoW^`M`aWTo<P=ebe;in4j\IhZkh>EIA=gR^m?"
A$ = A$ + "1_6EiOSiD:mTj>G_JLL:i5LL>MDgmkXMoM`aE]ai#N]HF5G<W^^`k<7G]n:k"
A$ = A$ + "Hc`>>3gOCeLK#H7>n4K7Y6Ce4>n4>4BkkRSg]WdbmEQiLF5G\G#FaaZ6g`cR"
A$ = A$ + "S_chFjj?XSCL4>^jkW[fOIINCg_Yd_Lnd=OlEj`Zknm9Ymc4H^o0lm1>T?<N"
A$ = A$ + ";4?eMl=jk#MoIGaa`Loim50bGNnLHlV`6?ig1gcikToC#N_JU]Ka^YSZ\Pn#"
A$ = A$ + "bga]hnK^knJ?gGMemb>0Z_#MGFWE=^[:iEY3Ga;^Sm[B6al_INMEk?Ul[R[j"
A$ = A$ + "gGaahm5`Zic5?SG?JX;?Bn?1ImdI^3TEb46_GnkWlnC;3V7gmK:mK>OFeNMU"
A$ = A$ + "><_>2kVf?C\j^bVij8NZkhk^k7k^l_;^ZO[j^gn8io4T;cWEGcbTjN5OWk[m"
A$ = A$ + "9UcEgijk8_Ch5n^#g````````````h[0bk=]kFFj0\o=>Kjg]llX:KGIm`kB"
A$ = A$ + "MkS2Zc=6kg=feG\D]naiePF]gLSW[lK8XnG]NMh<gU;?E1ei1XcgSPccoAR["
A$ = A$ + "BgDiCHZF_I^N#mnLi=_We[dGMa1oV\PVbg^e`o^id<oNEIi8Ll^e>^RS3MK5"
A$ = A$ + "7_CW6o6hGG57OGIPS;oKMLlEY[Zm?No:>jZjfZhmYaaInTJof[>?4[f7]MjG"
A$ = A$ + "\oW[Bc\<QWak1?doF>PmkKGNSei;_66LMUjmaJa<9^ANX>c4Eka6f?YPc8G>"
A$ = A$ + "DM6N`jdab:[7Em9QjfZm:DG#M>;bQ[HmT_2<QgRmFKeI=YZ\alDFoDMN5IoK"
A$ = A$ + "3bW9nhP8mDn7W\?F8OVeZhhZm16f3?CRKl\MlG6Li#EfDlFlnELlL#EOQWE]"
A$ = A$ + "?KaiXSCo84j2eI9j:fG#?K>N4DmSN6>>fC6ZcM>g?l>LlEeIEk?XSfgHELk>"
A$ = A$ + "[6Chh`oWT?kc#WYNo9Ll#^AkO0\GAij1N?OZ>W1EbbE^_PNfLL5OZk\KV3Zn"
A$ = A$ + "4ElFT^CihP7TW_gZj<N?]\;7GE_Zj7O7>>?FU8PmC9gnDeOAEiE=^:8_id\j"
A$ = A$ + "<1QhZ>[LMLllNKlEUSWi=hIMkUiL0kc<FWYh]<g8okLLkZ7HN07gLIAY7DL1"
A$ = A$ + "N\\H<>ZiWaiUZM>d=ElR:KZ0ol3`ZiAVe=Eff:BSLJfeWP:=`n^DY;jdc_BL"
A$ = A$ + "L\W<clVMhhLLiiePlA=>?>daaQn4LhXlXZcbQ9LL>ockGd>>67G>daaEcW4Q"
A$ = A$ + "En;8>TiXMnm9TVMW?U^f`C\MfMSELlLKm9nVi8X6k^BGYRW:daa[d]Ml#DNF"
A$ = A$ + "e?>W^1gEMNohhRc>UJl7[hhQ\Den\bfQZPj\IZN_:K7fe69ggGGkWEnEbkVS"
A$ = A$ + "Sn61jR;7Dm?SclHnIagkDSaGY_Zhh:OcPZOlEn^b9S7?RGU]khbVjmS`4>N<"
A$ = A$ + "?15g2ckLWi>TiHEfjCmLlnZnP`hDD]gQMEZ>7B_BLL>\;7G5GEMSJ<=Lh8fE"
A$ = A$ + "YJ\kEcgO:_AE_FIGUZiS[hh`VT0H^QLN][MEbmEEI;lhm[6?^JMobSM]b?U1"
A$ = A$ + "l>aaESEYSS?MNA<?XZo[[RSW][bAhhCiHWefQH<4WUSW3ESSK7kTV7WBegdN"
A$ = A$ + "e\[BUOHRe=Ef>\ZNLbH6EnF1EO:EfPI7>NlL\N6CF;OUm4NVLl#nSnE^B>>6"
A$ = A$ + "77G^ZNOU_h>ZKbcKPU?lkANm:]g_F=7:L?P\37Gm\9fG7Wo?En`a5O3F5GUM"
A$ = A$ + "gcaIU>#5>27oXfI4S]#EffM\:MiO4`IRVOoEflJenEIU_`m>7_B>T];lD>Ne"
A$ = A$ + "h#ELD57G]g=`HkZ\Q<7g>>^b7K>QSGIOl>>nZd>?neES_[ZMC77O5?5[IfAh"
A$ = A$ + "h[fG#hk\_2SG1ll\lRmkDfF_H>mlJ:b[G4_fSPgUWGEELc[]00O?EUWo:nn;"
A$ = A$ + "7G<FaLj0Xl?c\lb[UAfgFX:_#gTO6T3hgHhfRIn=\k46;E^N0UA4G<6Q^l?G"
A$ = A$ + "6[bo\?^#mnHnYE8bG\OP[nm\mRN50kG?b0O?;R7KS2ej5QbVbF6lcEn?4d?B"
A$ = A$ + "eLdEk;RLkA4GElbf5Pe1\OJA1X7Dnd5>obj\:oA3hHMU=ELWToX<ZZ;DaCmn"
A$ = A$ + "[TW8]kdK_BLLX;bb;l;aimf1R3OoAUO6lI`lcD__:^#_Pm_WJm4`hJ`g8bY1"
A$ = A$ + "RK`7hlZco<Wc?6lgMih6o6WOih3>8gFD978Mbe3Lj=9ocYmTlGmnMj#T_Mj]"
A$ = A$ + "G=>^QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ"
A$ = A$ + "QQQQQQQQQQQaW6`mG<k3\OTiIhSbHoS=k78Q?Z30g5f:oef>Yk^a]BoTm=[:"
A$ = A$ + "i:;gWA?LFMV:]DU7nNI_[ll>M7^[la^Io]gSX\\b?RVeai0d_EaOJj^CL[^S"
A$ = A$ + "_AlZ^7ZIin<jQcZchf[MUWLkfb<D4gGI\bW]NemWgYSA0l6^nBMOX2oSYjN4"
A$ = A$ + "Q3Xmj4IHbmBN4Rd1nfl^b3k;ifA?L6iUck9U7hkoJShgnOdmIo4h[8DncNU_"
A$ = A$ + "A>lWPGEIQeaacHOd<N67g>oZ_jnkQS;l[oCT14GVKY^7WSWeMO9Fi[L?ZNHW"
A$ = A$ + "bfZkJCEi1n?B>`j3hk^OUmYQkN7dn8hhMlFeMi`>g?:EaM7IHbMi0d?Zg_bG"
A$ = A$ + "inXd3[hhOS2Zg1gAACR;kCQOe`>LlX<cLelLFD#=>WMZKEg5CG17OWdEm]o#"
A$ = A$ + "G`gELE_?li\\?RmAY7FM_Po=:Daa[h1:>>lOj_RH7>>lOh0C^k5>;7_jkoCR"
A$ = A$ + "kEeN#a;P=Ebn?iZk2VPG[VgnId37mnnj\LLeHEDLSG9DaaSj5<GU\?FGe?Ng"
A$ = A$ + "M=0l9h[jo2SY;ZO`g9EeGZ`SVS[6C>ZOaLPQ\G5Df_k<jQkRScUo:^a[4fi^"
A$ = A$ + "4_ZL<i^GHeh#ALhkkPG1>NDnPmaEQ9f><No8?bcKo<jQkVScgU>_SSE1mS7j"
A$ = A$ + ";Do\j>]D5`M`gdnaS_oS_[[^CU`H4DblSTS7bC`?Eg9UhmEf]7O?CMghL6m`"
A$ = A$ + "[bHEPMhDg56_:HWkII6?baSGMOYn87cJgHE`MAEUmi#M\jm[^KLNVjQ7iL>i"
A$ = A$ + "kBWG=<US[j77mAUkWWAfV3kFgN5mOm8\c8:7COo\ME>27oEZOl:kZ`fLkE2W"
A$ = A$ + "a^:0GahaOflfcJ;mS<FWSlm\G=kZDaaOUWc9GVEg;\i_iZNohkd`n;E8go5g"
A$ = A$ + "^B]nlXNIWjFnnIFU^An_KLEgmfCFCVLPgk9kZ7fANkVWN47emV^J]?oThh[6"
A$ = A$ + "GMnNklIUW#7_KoUCCgMR;c_ZRk^LlMd3k8_[hhEf721Lgao9aakf_?IKHMU["
A$ = A$ + "GKeNMT]ij>[QM8OCCgho_CL[h5ihfaa[6gbS#NIk>U38>EU7HWT?=>>06C10"
A$ = A$ + "O_0o8\?D>?SdWcc8>hkbALSO_JMBhkQi^dU_;GW4GlkiiCWSKloQ=ohaZYTa"
A$ = A$ + "Md3k8_\>;SLLHk30I<g^2fC:onAlRWQaXn>aa3ko`UCeL6_BXJ;1nBgm[]JM"
A$ = A$ + "BblWYYk^aUU3ELIiZB6?Z<LDM6g>X;>ln<Emn\]6^Knk^l^Zi;nX#NN[aoW]"
A$ = A$ + "gZb^TH=IbHgdm8a=NNGLEbEW<nXTgYb`TjKek_Cib```````````````````"
A$ = A$ + "hE37eg>M6dUO:OBCEl[R3B3fOAMdbk4O8FEjfE6DUEFVIi[b7HeUf[l[HOjX"
A$ = A$ + "klIQm2aEWWCmK>POE5bW3HN?GPjmLHJiUi7ClQHEY;nMEJ<i<NbU;ngAIUCo"
A$ = A$ + "LJgiGan:PEeiEe5?B>>>G0[T?\nL<77kA9eNRVg?ZZ#^O^Y]7[Tc^mL;n]^c"
A$ = A$ + "=1WGZmS[J_aVCKeI40[=jMco^3>NDnEkEi[lLN`e7Anae]AnQcDJ>TOG\_#R"
A$ = A$ + "e`V3`oWT3Zm6XZl61L6Lihbn#\#NDiEF6EnRW8Pm:B77WmeFEk_lZch#57oZ"
A$ = A$ + "g7Y_bHbi0:O^6O4LLEo[H?mYnf<GoZjK6iEnIELlZm#:cmkRKeg72IXZOl9L"
A$ = A$ + "LNoMI>nSUScjTEn8[:oJjD>>Ggan?XLK?>PakT3kba?CLAI<N787ZbmD>>>C"
A$ = A$ + "XEWS=cagSScmOQc52[CnGEfRPJ\lC6[2fkX\O>8;_`7=Ee?idaZl8hhXl0o#"
A$ = A$ + "BnI8<QS3o00f_lE]1>37?[SODfBkERSc1<Nc^na[\e5VK3ONdWhSQagVI>^Z"
A$ = A$ + "_i8m[TM>^?;>N^m5hO7QSW3`^QiPihWSSS_g_jLBD]?liaA>QS7jolidP[?I"
A$ = A$ + ">N4GNNPEQW97G=nLnk:kbaO6mS[TYgM<I\:hLW`Ukb:SD8B[EmScSE9kC[Ii"
A$ = A$ + "XJLki#EKXW97GI[V:IOZMEDn4l[PS7]m`IG3SAlCWS[VcYZ?loEUX8<IlhZi"
A$ = A$ + "L6jK^O_hIZfO\lFI7_W97G=71ELNU\[Bn\[mETS[6[2jOYk<EYjGHZMEDfmV"
A$ = A$ + "3Hn`Lm^jKn?K>>k3S?37oIHG5nL4NgLckPSGI[Yc>Nl:>nT_EXTGTGLLOfLL"
A$ = A$ + "f>WWQS3maSHlhOjh:hh\o=#QS`aEfAC=G>57G=FQ:kH[Vg=jkTSK5_GaOc]c"
A$ = A$ + "PNRScSRS_ZlQ#lKOe\[bAhhkRYLlZe<Q3<GD=6m8dI;MEi]SkP#n^\RUeLIB"
A$ = A$ + "e^cLLcai#57GIg>Emn4>NNm02di3abfaGaOc?SokLiiAbaESARUQlkn9Jk`X"
A$ = A$ + "N2nBoXlQjglMUb:Old^8K[:\_D`Mo7j_3n?`\?W:k?obn^94G\VPIoD8kSWR"
A$ = A$ + "O;GNcPmOBibKfoHUW;=#n>9#EVDng;elaQ^9[7bLlZO7i?kOEaj7PkT8^<7o"
A$ = A$ + "F4WhgnD]M80KS:eMUbE?75f?;Qj=nIEcOEmllO3NQbO>YBg<he3HZ?4CI[_\"
A$ = A$ + "?A5]EZV?>0[7HKJEmkEn9K\65Mf4hCefQij#f^OX>SOfEf^R]GedW=mm[:37"
A$ = A$ + "eGFQfQZiB[Bgh_c?Sok:kd]BVZnm^bDGINR<IHHHHHHHHHHHHHHHHHHHHHHH"
A$ = A$ + "HHlZQ>o0hS8oZl[O\?<C97LlklAPMa;WGE_GfgIdmKMnD`9Ue0EnEa9icDMU"
A$ = A$ + "Z>X:_nd#en_lAiKljfWLEa1n>#>n[fo[Ea;WGEk]`<_hXnD`9Ue^mg8fO\Mi"
A$ = A$ + "cDMeZb;G^nT#7?9fG6G]_a[B7Sm2J\W9DeK:oDgDOfHU_2DM^;DaiXnD`SDF"
A$ = A$ + "i0lA2Ei3ol:MU:^Zlj^iS?J>>GW4kg^[dO7bLLnoSmA7G_7e=Zcl3>Go:N2N"
A$ = A$ + "NW_2Ti2lI60aYc?GeMNbVDFEgGmLi1kEGEn`?_BGEM^hRj4nIOJnlCfGmXZ;"
A$ = A$ + "_blS[Wb1`=DLfZclSj<8Pd:_OAE_;oLnLHFa3WbaWDFEnkX9WaS:>N4ZdEZj"
A$ = A$ + "GU^Ai_ANW1ggUBg`UGNnA:XVc:kK8hl3kMO57_bgCPnMh#NoCGMVfEm1bYQR"
A$ = A$ + "7>QScLbZbZJ\n`OhV?S7k`a[dECihhkGg=glAd_:?fChO7H>n:Oj6Z3hlR[W"
A$ = A$ + "ij2LV2DLL^mAVScUS8T?G4EWC<EKjL0nmQS`aEU]YUEHWSlIGH7>NU^BaaEW"
A$ = A$ + "3;eIchM5:MAeg[EmSgIc>LnBbm7XdaCZ;RPJNOWUS_BN0Gn8LLFVZ:[ZidRb"
A$ = A$ + ";>KK1V>NLl^C;_hL5nYbaEOoTW3JGi]jlEEMF]DSc<7`lUVH_T[VS3kDXRgA"
A$ = A$ + "hh<g[Z\RcKIUmEZ\MH77W3ELLUMU#oCO:S7Ge^VeUhkeigKbHE2M?g?^JnEl"
A$ = A$ + "LNELLEnM5LlL8R3O_?4_kAihZfcZb:TOLVcZ:[CihMj:caofogILWO6^o#fQ"
A$ = A$ + "S[6?>G7[\CHDG`bPb?6NF>>Kk1<7?^<Dm=nMhhMUEd_B083Ll#o4ZlQihMjZ"
A$ = A$ + "MVciWbHEV`EaLSbWUE<VK<>>5bf30_gb<kKjkS7U]1?;7OUoF92H\J7QS?9X"
A$ = A$ + "\QTBGYTg:>NW^bLLMXbnQ1fIlhC6gHUNGiWaO6LLT>kbaWjGdEmI[VOi>Ll>"
A$ = A$ + "MeGA>^BG`O[;K;<nmIoFS2X]QJ<fZeb6O787Z6;iIhhZeoA=NH5?<G6ZFSmY"
A$ = A$ + "UEeH3EfdL:7_CGYBgEjegM`eIMfQm\UIenR2m5V3ALELlEmgX:;MLlM\Ql^L"
A$ = A$ + "lZk5>EIMbgCPo0CUV:>ndeeE5n:baac?[_bZRScb1j?UcOfV7WUS?eViMkK:"
A$ = A$ + "EOf:i_[\fI[Dh_LgI=PFY[DiEnIOJLL<OnlJ6[l;P#_MVl2n[_ho7Y9l_J#_"
A$ = A$ + "S_73od7?gE`5ZF[2EI1l:U_24go8Ljan?#f_0V77VbW2VOfTb:NNl\\_E<;C"
A$ = A$ + "XN9:7\oYTCc9jZ\_a:W>OR[140??ahIXm<olcRLm#nk3ZWc?C9GLMAW<cYGl"
A$ = A$ + "gllVAjYNn>nD#UlgEFE??c_AK6EnXNgEjZ\_H<okEjegM`fm;NFU?4lZc;T^"
A$ = A$ + "EfPDUoMbe>oFGn<=^0[lSR[BK8SAjToNAlocf]MGoCi:m1KKP[^nf```````"
A$ = A$ + "```````````````hn0f?hicDoSdW9==oZ>[XEo>B3ecklKLEn1]Ya7nY=f_4"
A$ = A$ + "0OFe:di?nHmBELkTI8_kFnoD#gN8GMFNNFiGgn=7L7enlBU7X^\:DeNNROR;"
A$ = A$ + "h7Mnb]9lW9n_:DV[R;nMU\0iMENLgLa71DW;:>LUgUMkTOMekH=XELlZc1cT"
A$ = A$ + "dSGojZhgiWhDaMU>LbId6]O[R;:3knKi`WHoiZm:=GgRmc`c>oj>gbH_6EMN"
A$ = A$ + ">h0f7SLjQngaN_;cak>;`icD?Woli`1?[KoO<I?XSkjlZn9`N8D5`N]BmL>="
A$ = A$ + "ndf;FC>kC#oL5mW_CnYjS>GGd]O\i#gi68S<?DakhlYJ?M[NF7gIjI2]kL>4"
A$ = A$ + "YCEOeELLnI#Wl9]O\Dl8hkdhmNL^Lcc_JZ_PKWl;7GTN:NC>PnjhlXSS3O[1"
A$ = A$ + "fO\EbJUORS3hk#h<fS_AdM6CfQS[:chM#I\bGIXB?U>iCZ_Legm`lThmSLGm"
A$ = A$ + "_:XV3c>i7kW:blP>onJEO[<77iIEOFZc3D>DiWh#N6]KEkckYLl^cL8oLXC#"
A$ = A$ + "jXnNiGE>NP>OT=_oXceo[l5LQn6WCPSTO<7WiHPg\RS7iYJL=LLFYGhd5lV:"
A$ = A$ + "kZPfhCf?fMci4m1T?_>i#^O3`]Wba[>_OOJLLEOFIM#gkEM^EFeoeTlSem<7"
A$ = A$ + "7WY\EmgRj]>KAZhP:oMT:MSo]SWOEf>\RS[6O^j\n[hhL8W7g=WlAPZkmPMJ"
A$ = A$ + "CT3H\fEj[^lCiS4>bLCcaS[gcO7BM^hhd\b?aQf6agiZ6;fZi`=m\mSaiW3:"
A$ = A$ + "oBMU^Z:PdnClL^Qcb;0>_^i06gj^LlZaS?9ohjX8NEnDKUm3Ee_EnFMeIoDi"
A$ = A$ + "OeZ6OL`]Ai1WWHemaa^f>\b6XZnXi#ehZh#egNoT][2F_2Un>k3Q`jRWmM`<"
A$ = A$ + "`IR=?FUYiGUmabQ\_AWOOEmHeH?cfEYRcY2HN_lc0W?7PmR>;7G=F5^=5lG5"
A$ = A$ + "LLV`aSfROBnFO5W3f`CY_EOoJgaS?=oRhn_Z#X#UM6ZZ7gInEChh8]cQ:oQ5"
A$ = A$ + "dCEm?NF>>KGeMihg=?lIbaAo_i0FC?eL7cW[k:diSm[b?>NZa_T[ck\EC57W"
A$ = A$ + "SGWN1OKAI[5EOXlkc[S:c9E[Y[ZMF57?gW0jkQScGE>Ngn921eH>Ndigde`X"
A$ = A$ + "c6eA0]??;77mi[jONU_:5SYI7>NU<Faac]oEk=U_bLl0Qn]RSTG7S[PS?=oh"
A$ = A$ + "#gn]XSo2^IeM577?dWhdkJThiEgAGA8Kc_:>nTm;EW?Q3O_\j_acn:ca3Tgg"
A$ = A$ + "MHl3Io#6?Wc7Mn1^6Z_`_5]1bnk=ni\_J3oN`aIo1W:N8OEn>>X3Ho47NNf?"
A$ = A$ + "^Qg;[obci<WnacaNf:kom0b]A#I9K37lnH^=Zd[BomERS7#a[OTf;MBnEIC["
A$ = A$ + "ZWG=7h\lg=?I^L^SOR;\WBU_R[JO7bfTFI?C>MZl9LIKIQfMZhXdOg=gk>hj"
A$ = A$ + "ii;nX]EJGnafS4kWPY?G]>jMaQ;[EonZd?g?LWnCE>V:KLLSo>o<n_kdCg=W"
A$ = A$ + "c````````````````````````````````````````````````````````hm5"
A$ = A$ + "MgINIO:l>g]NC_S0acFMo5Rd;7_En<jYYo4iLEL[bkEgSQMn^mMZWDj\^hOd"
A$ = A$ + "dlM5[l?CX\>aoHW[kFUNC_o2Giki[:GCCoYUY9gSR8NC_73gYL]cMKHGlcYm"
A$ = A$ + ">eY_cHR?8;l=1CRGnnO];]Dn;K>0OT`:o6Wj>NMWk7aEa3Lb9gkQ[:kA0nef"
A$ = A$ + "^l6nTCf?1_:TKkf978]gY>mM6:oUZbo\ce9:O0OTFQ?MRe_lM4hTdWmQOA8R"
A$ = A$ + "Sj>D8BcLIBiC2EYo4of=h_C^753^;gVDiWhDjP80M4l7NMn:JUn7nM^#>biY"
A$ = A$ + "bGX7HBJRjdkVWNeLlEnC?4?foiQW]bGf[hhZWEagDYMW_a]:m[loOZdGi7Ki"
A$ = A$ + "hDiGMEb3O7NRhbnl]^jY:iWmU^En9j9YIWOinM1?2>>?F1fGfcS]=N?emG8W"
A$ = A$ + "W`_FZlSOij05O\jnAT3ChhC_75AjEaaDa5LKn>VI7>NDfhk;GEIJbmg;NfEi"
A$ = A$ + "?GOghhlge`mj#em<2liH7mn;<GWaOK8c7f9mi`4>>k;UcgSRZdK:77jIU=Mf"
A$ = A$ + "i^=DE6bjaZjY^jd?9>>\eUBgg5bnPh>K#PlMjmGHWm1jlIOCCOe_W3PS?mND"
A$ = A$ + "T3acaHOIOMKE#Ik`M^K3ikV[#FEOgAEnidMbmWk[>VHoXZnXba9g_JWM=bla"
A$ = A$ + "ZinceaEn[LfNI<VTn]5n_mggo3Zb07_^aH7i5kCK[2ifQkD?EMg6bg[5X>]S"
A$ = A$ + "SceYOBS7WeeEj=egeP__^c^:\_0NjmU8gG42h>cZZl]:mk:kEndN57_K<fXO"
A$ = A$ + "lX]?VC#WMEPoENeha[^K3ES=ROOhSWGUVX>mMfgfF=G6UOiF5_9jHN\cQ>Kj"
A$ = A$ + "mUH>N:^AfNIX<]cma87VDfk^75EY7[?P=WGUg7I>WZnH`HliW]CMjMcCOdLL"
A$ = A$ + "L7<<AOdIk`:kZDMo5ZZ3DmW_b^:Mg7SLP;k:k8[2H^IZdSU7eMIG>_QMEjF3"
A$ = A$ + "X>iOej#51<gPEYiWZ]3EcaH7KYbLH`a[F;`Zk_`:>>?f3dnYRSgMO<b1N\DZ"
A$ = A$ + "dC5fQcMTkVW[VS[F[Q_Bf>lZihLLDSUA]nJlLh`mH3OG1bLSYYoDN6gVZkND"
A$ = A$ + "DaWE]9kVcI4FE?eMg6bQ#FEO7fLl777OWk;aEm9Qa8TiUkTnLH27_ZOHl]TY"
A$ = A$ + "bKGHEmT:4jZ:KkXhcVSoHhhMk]34bgGRZn1ci7\e<O?M?mnHT3:>>7W^e`Y["
A$ = A$ + "MIFNGaaIiHR]3[F7S:KonEQSSkb>\fhEfl_:N`V5iW1kQ`gmClJ_SO7f;Ykn"
A$ = A$ + "B<7?\?\Z\11`Td7lW^kb?HO6^<DM?:6]Oika#UlbYK6\L`jo<bY=f34`^A8]"
A$ = A$ + "P]\b_?RkTjdgI>NV?`fBIWhYN6_^i:>idk;A5?9KkS:KT?=miOCUFLLP=S[N"
A$ = A$ + "NEi?d?Ii]B7YT3Foc0fmF5_ZgOWjdgIX^clf9NCNFGj?mnBTof`deVHEj?Y\"
A$ = A$ + "caIemXhDiMZ>ZBo[ROEmTjikDWJHHHHHHHHHHHHHHL>TgGOklN`6_HOVNgUS"
A$ = A$ + "WU>hCY<o^Rf5?ko=T[[he>4k=l^l8hfZenSmg8ZcQi4I=k7#ZFKc<G\coW4i"
A$ = A$ + "Igi^XJmCE_Gl<Un:;;MWc9>^Mk[1d>Z:0MYjILjNgLbkRS_J]TkhiMkMT<?o"
A$ = A$ + "AbacYeZmbBU_cI7M`ZmIcDOcD4Zd?Lj];77UCcaoOf_3\nSm7DHoB`Y?_OgD"
A$ = A$ + "kG>\gG[>K58MkZo`JaE5Rg7[Y7caELW8?ie>E]WMEj0N_hPcT7WWZc^Qjld6"
A$ = A$ + "j`8^MLlEWifZc`1FSoLXK]NO7AN\R\N=_O7hPJ_7Qhga;DkKI\?JgUSckG3e"
A$ = A$ + "N<:ooALDkS#>mSWa[O]J?bZ>_6Cf[jH?1[hnlN74_?WGij8U_j0k]`^c9Mdf"
A$ = A$ + "Q[kodhh0Lm2_76h#57WgoOChh[>o#ELLNOGX>OR8T?ke:>Neic<gG^bOCQiJ"
A$ = A$ + "T?_ZCf?O#nEb<7Gl\:oFCNogXN_^jA\giHijCTSge7j>W7PlNBJG>NEMh:>>"
A$ = A$ + "f?5ZaB`a?jKNJoh[:;iaWU?cmk`aEa]ZOl^cGEloEOC0kI=XSD1ca[iG7US3"
A$ = A$ + "ORHf>6[Z3Eb#^oCENal7lMVES7?OfRbUUZidQa4T?7Vl_3m5kS2HID=NLX7H"
A$ = A$ + "m3kWZES]7o>VgJUlW3VSogjQSbacmmTo>j^LlLMDlkZioYT_En]ilNaUg_MM"
A$ = A$ + "fj3f>Lei>YKl5LJVeA[l=CMfEYbG0X2VSogjQ[PSSnnDWmoYLlX^W73Rj\LQ"
A$ = A$ + "dKEohh\Nbc]8S:OJD<nmELlLIFikIifZH>eMLHEJU3a_eIgYL`LloF?L5SE9"
A$ = A$ + "_6B7e^::K64]GDWii:iVCoEk=MehOakEiW>bUIHKJEk1ehaSd]c^:ES]_C7E"
A$ = A$ + "I;BcaoKm`E=WcZeRH7kZ`nh?fgbRjd:iFIG5UM#cLDD>GEnZVcI57Ga5k\]j"
A$ = A$ + "A][RJ]2RPiho]Nh:][bA6[BN<cMSEMRLGIk`LIQi3acDblD>NglCE?[CoL4k"
A$ = A$ + "Z4oMUo[h[87ObjOPa=^;7_cG1Sj157?Kc`E[M>2En:]S`aELd8nEfn;7ZlEZ"
A$ = A$ + "MLl>mSJ]lagJP=lEOcA=6n_ZLLegmEeI<_#]Fn<G1njTEf=Xl75b3TO5OnXL"
A$ = A$ + "LU>Xbg[\JN]XMmIhhLLFioVELlEnJg?9\RS_b_lT?3jlLeFI[>lNMndi>K\Q"
A$ = A$ + "dA9oZWOD>NgMf6GFjJC6YAf7LXB3ecjhhZe[TCSYfIjCVSWGc0Uo16kIJf6M"
A$ = A$ + "ieh[bNKaka[]NllllQ#kXlJkTG_4F6cPGCM8o#Nc?7LEl\H<F`7>WOVZm:f3"
A$ = A$ + "l\>8\IHf^jHoFaUI\gLba;KO9\NHZe83cADEnSdQGK=Fo`Y;dA\NoCUS3`n4"
A$ = A$ + "4ff2hkKlleceICCKf^8CR7g^P1k7kE[e>N>o<<G1nILiPicMU5`SD8kG_IKT"
A$ = A$ + "L6oF3WF[BGXSDnGY?APe:#iOPcll\=GQ^KR?h0mgT[WifA\<T1h[E8_VjIiG"
A$ = A$ + "mLnIH>HlcDUSPWcjPXLYfC^H]^hb<k7Fhb1GFacjd?`gadYOhd5j8>M_K^XQ"
A$ = A$ + "QQQQQQQQQQQQQQQQQQQQQQQQQQQQQa[5noC#%%L2"
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)
IF randfill = 1 THEN ran$ = "ON" ELSE ran$ = "OFF"
Text _WIDTH - 32, 456, 22, _RGB(0, 0, 0), ran$
Text _WIDTH - 34, 454, 22, _RGB(255, 255, 0), ran$
END SUB
Posts: 3,978
Threads: 177
Joined: Apr 2022
Reputation:
220
05-31-2022, 01:04 AM
(This post was last modified: 05-31-2022, 01:09 AM by bplus.)
This morning I was messing around with Text to see if I could get font's going with it but ran into anti-alias problems when I tried to scale letters. Looking at your update, I thought you figured it out, but no, looks like that menu was drawn somewhere else and then copied like an image. Looks very good though! Thumbs up!
b = b + ...
Posts: 730
Threads: 120
Joined: Apr 2022
Reputation:
106
Hey, happy looking fish! Yep, I Couldn't get a sharp enough small text to my liking so I went with an image for the menu, made it in Paintshop pro. I also played around trying to get a better looking 'Text' font, using the Antialiasing SUB and layering several color 'Text' but it didn't work out well enough. I am still using 'Text' for the brush size number and random fill On/Off.
- Dav
Posts: 660
Threads: 142
Joined: Apr 2022
Reputation:
58
This was too much fun to fiddle with.
I added 2 button commands (with no menu support) to see how they'd work.
Changing the brush color is useful. The eraser...not so much.
Code: (Select All) Case "B"
'change brush color
If blk& = _RGB(0, 0, 0) Then
blk& = ColorPicker&(200, 150)
Else
blk& = _RGB(0, 0, 0)
End If
Case "E"
'turn eraser on and off
If blk& = _RGB(0, 0, 0) Then
blk& = wht&
Else
blk& = _RGB(0, 0, 0)
End If
Posts: 652
Threads: 96
Joined: Apr 2022
Reputation:
22
Looking good!
Multiple undo's would be good, and I was also a bit lost looking for an Exit... finally used the old "three-finger salute".
Posts: 55
Threads: 4
Joined: Apr 2022
Reputation:
5
Thank's for the save option ! 'Smooth' disappeared ?
Why not yes ?
Posts: 730
Threads: 120
Joined: Apr 2022
Reputation:
106
@PhilOfPerth: Thanks for the suggestion. I'll work on a multi-livel undo. You can also press ESC to end the program.
@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.
@euklides: Smooth is still there, it was renamed to Antialiasing. PRESS A to do that now. I needed S to do the SAVE. I'm planning on adding L for LOAD an image.
I may change the menu to buttons (keeping the keyboard shortcuts too), also show the current Brush & Fill colors somehow.
Thanks everybody for your feedback.
- Dav
|