Open Forum > What's New
ScriptBasic GFX
Support:
I have created a ScriptBasic extension module from the SDL_gfx library. Attached are the binary and examples for Ubuntu 64 bit and Windows 32 bit. This version is primary for testing the SDL_gfx interface. It only supports the main screen surface at this time. The next installment will have a surface management system which any function can act upon. This will be the lead-in to sprites. The current source to the ScriptBasic GFX extension module is on the C BASIC Bitbucket Repository and can be built using the ScriptBasic 2.1 header files. SDL 1.2 installed is a prerequisite.
--- Code: Script BASIC ---' ScriptBasic GFX - Alpha Circles IMPORT gfx.inc scrn = gfx::Window(640, 480, "ScriptBasic GFX - Alpha Circles")' Random Value ArraysRANDOMIZE(gfx::Time())FOR i = 0 TO 512 rx[i] = RND() % 640 ry[i] = 60 + RND() % 480 - 80 rz[i] = RND() % 64 rr[i] = RND() AND 255 rg[i] = RND() AND 255 rb[i] = RND() AND 255 af = rx[i] / 640 ra[i] = INT(255 * af)NEXT ts = gfx::Time()FOR i = 0 TO 512 gfx::filledCircleRGBA scrn, rx[i], ry[i], rz[i], rr[i], rg[i], rb[i], ra[i]NEXTte = gfx::Time()gfx::stringColor scrn, 20, 15, "Time: " & FORMAT("%.4f",(te-ts)/1000) & " Seconds." & CHR(0), 0xffffffffgfx::UpdateWHILE gfx::KeyName(1) <> "+escape"WENDgfx::Close
--- Code: Script BASIC ---' ScriptBasic GFX - Alpha Thick Line IMPORT gfx.inc scrn = gfx::Window(640, 480, "ScriptBasic GFX - Alpha Thick Line")' Random Value ArraysRANDOMIZE(gfx::Time())FOR i = 0 TO 512 rx[i] = RND() % 640 ry[i] = 60 + RND() % 480 - 80 lw[i] = 2 + RND() % 7 rr[i] = RND() AND 255 rg[i] = RND() AND 255 rb[i] = RND() AND 255 af = rx[i] / 640 ra[i] = INT(255 * af)NEXTts = gfx::Time()FOR i = 0 TO 512 STEP 5 gfx::thickLineRGBA scrn, rx[i], ry[i], rx[i+1], ry[i+1], lw[i], rr[i], rg[i], rb[i], ra[i]NEXTte = gfx::Time()gfx::stringColor scrn, 20, 15,"Time: " & FORMAT("%.4f",(te-ts)/1000) & " Seconds." & CHR(0), 0xffffffffgfx::UpdateWHILE gfx::KeyName(1) <> "+escape"WENDgfx::Close
--- Code: Script BASIC ---' ScriptBasic GFX - Alpha Bezier Curve IMPORT gfx.inc ' Random Value Arraysscrn = gfx::Window(640, 480, "ScriptBasic GFX - Alpha Bezier")RANDOMIZE(gfx::Time())FOR i = 0 TO 512 rx[i] = RND() % 640/2 rxx[i] = 640/2 + rx[i] ry[i] = 60 + RND() % 480 - 80 lw[i] = 2 + RND() % 7 rr[i] = RND() AND 255 rg[i] = RND() AND 255 rb[i] = RND() AND 255 af = rx[i] / 640 ra[i] = INT(255 * af)NEXTts = gfx::Time()FOR i = 0 TO 512-3 STEP 3 a1[0] = rxx[i] a1[1] = rxx[i + 1] a1[2] = rxx[i + 2] a2[0] = ry[i] a2[1] = ry[i + 1] a2[2] = ry[i + 2] gfx::bezierRGBA scrn, a1, a2, 3, 100, rr[i], rg[i], rb[i], ra[i]NEXTte = gfx::Time()gfx::stringColor scrn, 20, 15,"Time: " & FORMAT("%.4f",(te-ts)/1000) & " Seconds." & CHR(0), 0xffffffffgfx::UpdateWHILE gfx::KeyName(1) <> "+escape"WENDgfx::Close
--- Code: Script BASIC ---' ScriptBasic GFX - Alpha Polygon IMPORT gfx.inc ' Random Value Arraysscrn = gfx::Window(640, 480, "ScriptBasic GFX - Alpha Polygon")RANDOMIZE(gfx::Time())FOR i = 0 TO 512 rx[i] = RND() % 640/2 rxx[i] = 640/2 + rx[i] ry[i] = 60 + RND() % 480 - 80 lw[i] = 2 + RND() % 7 rr[i] = RND() AND 255 rg[i] = RND() AND 255 rb[i] = RND() AND 255 af = rx[i] / 640 ra[i] = INT(255 * af)NEXTts = gfx::Time()FOR i = 0 TO 128-5 STEP 5 a1[0] = rxx[i] a1[1] = rxx[i + 1] a1[2] = rxx[i + 2] a1[3] = rxx[i + 3] a1[4] = rxx[i + 4] a2[0] = ry[i] a2[1] = ry[i + 1] a2[2] = ry[i + 2] a2[3] = ry[i + 3] a2[4] = ry[i + 4] gfx::polygonRGBA scrn, a1, a2, 5, rr[i], rg[i], rb[i], 255NEXTte = gfx::Time()gfx::stringColor scrn, 20, 15,"Time: " & FORMAT("%.4f",(te-ts)/1000) & " Seconds." & CHR(0), 0xffffffffgfx::UpdateWHILE gfx::KeyName(1) <> "-escape"WENDgfx::Close
--- Code: Script BASIC ---' ScriptBasic GFX - Textured Polygon IMPORT gfx.inc scrn = gfx::Window(640, 480, "ScriptBasic GFX - Texured Polygon")a1[0] = 640/4a1[1] = 640/2a1[2] = a1[0] + a1[1]a2[0] = 480/4*3a2[1] = 480/4a2[2] = a2[0]gfx::texturedPolygon scrn, a1, a2, 3, "texture.bmp", 0, 0gfx::UpdateWHILE gfx::KeyName(1) <> "+escape"WENDgfx::Close
--- Code: Script BASIC ---' ScriptBasic GFX - Fonts & Rotation IMPORT gfx.incDECLARE SUB LoadFont ALIAS "loadstring" LIB "t" font_5x7 = LoadFont("Fonts/5x7.fnt")font_6x10 = LoadFont("Fonts/6x10.fnt")font_7x13 = LoadFont("Fonts/7x13.fnt")font_9x15 = LoadFont("Fonts/9x15.fnt")font_10x20 = LoadFont("Fonts/10x20.fnt") scrn = gfx::Window(640, 480, "ScriptBasic GFX - Font & Rotation")gfx::FontRotation 0gfx::SetFont font_5x7, 5, 7gfx::stringColor scrn, 20, 20,"Font 5x7" & CHR(0), 0xffffffffgfx::SetFont font_6x10, 6, 10gfx::stringColor scrn, 20, 30,"Font 6x10" & CHR(0), 0xffffffffgfx::SetFont font_7x13, 7, 13gfx::stringColor scrn, 20, 40,"Font 7x13" & CHR(0), 0xffffffffgfx::SetFont font_9x15, 9, 15gfx::stringColor scrn, 20, 55,"Font 9x15" & CHR(0), 0xffffffffgfx::SetFont font_10x20, 10, 20gfx::FontRotation 2gfx::stringColor scrn, 110, 70,"Font 10x20" & CHR(0), 0xffffffffgfx::UpdateWHILE gfx::KeyName(1) <> "+escape"WENDgfx::Close
--- Code: Script BASIC ---' ScriptBasic GFX - Frame rate controlled circles IMPORT gfx.inc scrn = gfx::Window(640, 480, "ScriptBasic GFX - FPS Circles")' Random Value ArraysRANDOMIZE(gfx::Time())FOR i = 0 TO 512 rx[i] = RND() % 640 ry[i] = 60 + RND() % 480 - 80 rz[i] = RND() % 64 rr[i] = RND() AND 255 rg[i] = RND() AND 255 rb[i] = RND() AND 255 af = rx[i] / 640 ra[i] = INT(255 * af)NEXTgfx::SDL_initFrameratei = 0REPEAT gfx::filledCircleRGBA scrn, rx[i], ry[i], rz[i], rr[i], rg[i], rb[i], 255 i += 1 IF i > 512 THEN i = 0 gfx::Update gfx::SDL_framerateDelay gfx::stringColor scrn, 20, 15,"FPS: " & gfx::SDL_getFramerate() & CHR(0), 0xffffffff UNTIL gfx::KeyName(0) = "+escape"gfx::Close
--- Code: Script BASIC ---' ScriptBasic GFX - Alpha Pie IMPORT gfx.inc scrn = gfx::Window(640, 480, "ScriptBasic GFX - Alpha Pie")' Random Value ArraysRANDOMIZE(gfx::Time())FOR i = 0 TO 512 rx[i] = RND() % 640 ry[i] = 60 + RND() % 480 - 80 rz[i] = RND() % 100 a1[i] = RND() % 360 a2[i] = RND() % 360 rr[i] = RND() AND 255 rg[i] = RND() AND 255 rb[i] = RND() AND 255 af = rx[i] / 640 ra[i] = INT(255 * af)NEXTts = gfx::Time()FOR i = 0 TO 512 STEP 2 gfx::filledPieRGBA scrn, rx[i], ry[i], rz[i], a1[i], a2[i], rr[i], rg[i], rb[i], ra[i]NEXT te = gfx::Time()gfx::stringColor scrn, 20, 15,"Time: " & FORMAT("%.4f",(te-ts)/1000) & " Seconds." & CHR(0), 0xffffffffgfx::Update scrnWHILE gfx::KeyName(1) <> "+escape"WENDgfx::Close
I created a gfx.inc module IMPORT file for the ScriptBasic GFX extension module.
--- Code: Script BASIC ---MODULE GFX DECLARE SUB ::Window ALIAS "gfx_Window" LIB "gfx"DECLARE SUB ::Close ALIAS "gfx_Close" LIB "gfx"DECLARE SUB ::Update ALIAS "gfx_Update" LIB "gfx"DECLARE SUB ::ClearScreen ALIAS "gfx_ClearScreen" LIB "gfx"DECLARE SUB ::SDL_SetClipRect ALIAS "gfx_SDL_SetClipRect" LIB "gfx"DECLARE SUB ::Time ALIAS "gfx_Time" LIB "gfx"DECLARE SUB ::Shift ALIAS "gfx_Shift" LIB "gfx"DECLARE SUB ::Rotate ALIAS "gfx_Rotate" LIB "gfx"DECLARE SUB ::GetKey ALIAS "gfx_GetKey" LIB "gfx"DECLARE SUB ::WaitKey ALIAS "gfx_WaitKey" LIB "gfx"DECLARE SUB ::KeyName ALIAS "gfx_KeyName" LIB "gfx"DECLARE SUB ::Mouse ALIAS "gfx_Mouse" LIB "gfx"DECLARE SUB ::pixelColor ALIAS "gfx_pixelColor" LIB "gfx"DECLARE SUB ::pixelRGBA ALIAS "gfx_pixelRGBA" LIB "gfx"DECLARE SUB ::hlineColor ALIAS "gfx_hlineColor" LIB "gfx"DECLARE SUB ::hlineRGBA ALIAS "gfx_hlineRGBA" LIB "gfx"DECLARE SUB ::vlineColor ALIAS "gfx_vlineColor" LIB "gfx"DECLARE SUB ::vlineRGBA ALIAS "gfx_vlineRGBA" LIB "gfx"DECLARE SUB ::rectangleColor ALIAS "gfx_rectangleColor" LIB "gfx"DECLARE SUB ::rectangleRGBA ALIAS "gfx_rectangleRGBA" LIB "gfx"DECLARE SUB ::roundedRectangleColor ALIAS "gfx_roundedRectangleColor" LIB "gfx"DECLARE SUB ::roundedRectangleRGBA ALIAS "gfx_roundedRectangleRGBA" LIB "gfx"DECLARE SUB ::boxColor ALIAS "gfx_boxColor" LIB "gfx"DECLARE SUB ::boxRGBA ALIAS "gfx_boxRGBA" LIB "gfx"DECLARE SUB ::roundedBoxColor ALIAS "gfx_roundedBoxColor" LIB "gfx"DECLARE SUB ::roundedBoxRGBA ALIAS "gfx_roundedBoxRGBA" LIB "gfx"DECLARE SUB ::lineColor ALIAS "gfx_lineColor" LIB "gfx"DECLARE SUB ::lineRGBA ALIAS "gfx_lineRGBA" LIB "gfx"DECLARE SUB ::aalineColor ALIAS "gfx_aalineColor" LIB "gfx"DECLARE SUB ::aalineRGBA ALIAS "gfx_aalineRGBA" LIB "gfx"DECLARE SUB ::thickLineColor ALIAS "gfx_thickLineColor" LIB "gfx"DECLARE SUB ::thickLineRGBA ALIAS "gfx_thickLineRGBA" LIB "gfx"DECLARE SUB ::circleColor ALIAS "gfx_circleColor" LIB "gfx"DECLARE SUB ::circleRGBA ALIAS "gfx_circleRGBA" LIB "gfx"DECLARE SUB ::arcColor ALIAS "gfx_arcColor" LIB "gfx"DECLARE SUB ::arcRGBA ALIAS "gfx_arcRGBA" LIB "gfx"DECLARE SUB ::aacircleColor ALIAS "gfx_aacircleColor" LIB "gfx"DECLARE SUB ::aacircleRGBA ALIAS "gfx_aacircleRGBA" LIB "gfx"DECLARE SUB ::filledCircleColor ALIAS "gfx_filledCircleColor" LIB "gfx"DECLARE SUB ::filledCircleRGBA ALIAS "gfx_filledCircleRGBA" LIB "gfx"DECLARE SUB ::ellipseColor ALIAS "gfx_ellipseColor" LIB "gfx"DECLARE SUB ::ellipseRGBA ALIAS "gfx_ellipseRGBA" LIB "gfx"DECLARE SUB ::aaellipseColor ALIAS "gfx_aaellipseColor" LIB "gfx"DECLARE SUB ::aaellipseRGBA ALIAS "gfx_aaellipseRGBA" LIB "gfx"DECLARE SUB ::filledEllipseColor ALIAS "gfx_filledEllipseColor" LIB "gfx"DECLARE SUB ::filledEllipseRGBA ALIAS "gfx_filledEllipseRGBA" LIB "gfx"DECLARE SUB ::pieColor ALIAS "gfx_pieColor" LIB "gfx"DECLARE SUB ::pieRGBA ALIAS "gfx_pieRGBA" LIB "gfx"DECLARE SUB ::filledPieColor ALIAS "gfx_filledPieColor" LIB "gfx"DECLARE SUB ::filledPieRGBA ALIAS "gfx_filledPieRGBA" LIB "gfx"DECLARE SUB ::trigonColor ALIAS "gfx_trigonColor" LIB "gfx"DECLARE SUB ::trigonRGBA ALIAS "gfx_trigonRGBA" LIB "gfx"DECLARE SUB ::aatrigonColor ALIAS "gfx_aatrigonColor" LIB "gfx"DECLARE SUB ::aatrigonRGBA ALIAS "gfx_aatrigonRGBA" LIB "gfx"DECLARE SUB ::filledTrigonColor ALIAS "gfx_filledTrigonColor" LIB "gfx"DECLARE SUB ::filledTrigonRGBA ALIAS "gfx_filledTrigonRGBA" LIB "gfx"DECLARE SUB ::polygonColor ALIAS "gfx_polygonColor" LIB "gfx"DECLARE SUB ::polygonRGBA ALIAS "gfx_polygonRGBA" LIB "gfx"DECLARE SUB ::aapolygonColor ALIAS "gfx_aapolygonColor" LIB "gfx"DECLARE SUB ::aapolygonRGBA ALIAS "gfx_aapolygonRGBA" LIB "gfx"DECLARE SUB ::filledPolygonColor ALIAS "gfx_filledPolygonColor" LIB "gfx"DECLARE SUB ::filledPolygonRGBA ALIAS "gfx_filledPolygonRGBA" LIB "gfx"DECLARE SUB ::texturedPolygon ALIAS "gfx_texturedPolygon" LIB "gfx"DECLARE SUB ::bezierColor ALIAS "gfx_bezierColor" LIB "gfx"DECLARE SUB ::bezierRGBA ALIAS "gfx_bezierRGBA" LIB "gfx"DECLARE SUB ::SetFont ALIAS "gfx_SetFont" LIB "gfx"DECLARE SUB ::FontRotation ALIAS "gfx_FontRotation" LIB "gfx"DECLARE SUB ::characterColor ALIAS "gfx_characterColor" LIB "gfx"DECLARE SUB ::characterRGBA ALIAS "gfx_characterRGBA" LIB "gfx"DECLARE SUB ::stringColor ALIAS "gfx_stringColor" LIB "gfx"DECLARE SUB ::stringRGBA ALIAS "gfx_stringRGBA" LIB "gfx"DECLARE SUB ::SDL_initFramerate ALIAS "gfx_SDL_initFramerate" LIB "gfx"DECLARE SUB ::SDL_getFramerate ALIAS "gfx_SDL_getFramerate" LIB "gfx"DECLARE SUB ::SDL_setFramerate ALIAS "gfx_SDL_setFramerate" LIB "gfx"DECLARE SUB ::SDL_framerateDelay ALIAS "gfx_SDL_framerateDelay" LIB "gfx"DECLARE SUB ::CreateSurface ALIAS "gfx_CreateSurface" LIB "gfx"DECLARE SUB ::FreeSurface ALIAS "gfx_FreeSurface" LIB "gfx"DECLARE SUB ::BlitSurface ALIAS "gfx_BlitSurface" LIB "gfx"DECLARE SUB ::LoadBMP ALIAS "gfx_LoadBMP" LIB "gfx" END MODULE
The following keyboard and mouse functions are available for polling and waiting for events.
[*] gfx_Mouse(0) - Waits for mouse movement and returns X position.
[*] gfx_Mouse(1) - Waits for mouse movement and returns Y position.
[*] gfx_Mouse(2) - Polls for a mouse button press event and returns.
[*] gfx_Mouse(3) - Waits for a mouse button to be pressed then returns.
[*] gfx_GetKey(0) - Polls for a key press event and returns a unicode value
[*] gfx_GetKey(1) - Waits for a key to be pressed then returns a unicode value
[*] gfx_GetKey(2) - Polls for a key press event and returns a keycode value
[*] gfx_GetKey(3) - Waits for a key to be pressed then returns a keycode value
[*] gfx_GetKey(4) - Polls for a key press event and returns a scancode value
[*] gfx_GetKey(5) - Waits for a key to be pressed then returns a scancode value
[*] gfx_KeyName(0) - (not new) Polls for key up/down events and returns the key name with a +=dn / -=up prefix
[*] gfx_KeyName(1) - (not new) Waits for a key up/down event and returns the key name with a +=dn / -=up prefix
[*] gfx_ClearScreen(n) - Clears the screen with the passed (n) color value in the format of 0xRRGGBB
[/list]
Here is an example of typing abc<left shift hold>ABC<ESC> for each of the gfx_GetKey(n) modes.
UNICODE
jrs@laptop:~/sb/sb22/sdl$ scriba getkey.sb
Unicode: 97 Character: a
Unicode: 98 Character: b
Unicode: 99 Character: c
Unicode: 0 Character:
Unicode: 65 Character: A
Unicode: 66 Character: B
Unicode: 67 Character: C
Unicode: 27 Character:
jrs@laptop:~/sb/sb22/sdl$
KeyCode
jrs@laptop:~/sb/sb22/sdl$ scriba getkey.sb
Keycode: 97 Character: a
Keycode: 98 Character: b
Keycode: 99 Character: c
Keycode: 304 Character: 0
Keycode: 97 Character: a
Keycode: 98 Character: b
Keycode: 99 Character: c
Keycode: 27 Character:
jrs@laptop:~/sb/sb22/sdl$
ScanCode
jrs@laptop:~/sb/sb22/sdl$ scriba getkey.sb
Scancode: 38 Character: &
Scancode: 56 Character: 8
Scancode: 54 Character: 6
Scancode: 50 Character: 2
Scancode: 38 Character: &
Scancode: 56 Character: 8
Scancode: 54 Character: 6
Scancode: 9 Character:
jrs@laptop:~/sb/sb22/sdl$
gfx_KeyName (SDL_GetKeyName +keydown | -keyup)
jrs@laptop:~/sb/sb22/sdl$ scriba getkey.sb
Key Name: +a
Key Name: -a
Key Name: +b
Key Name: -b
Key Name: +c
Key Name: -c
Key Name: +left shift
Key Name: +a
Key Name: -a
Key Name: +b
Key Name: -b
Key Name: +c
Key Name: -c
Key Name: -left shift
Key Name: +escape
Key Name: -escape
jrs@laptop:~/sb/sb22/sdl$
Support:
I have released the second build of the ScriptBasic GFX extension module. The highlights of this build is that all SDL_gfx drawing functions work with any surface and not just the main viewing screen as in the first release. You can create surfaces, blit them and load .bmp images to surfaces. A frame manager has been added and the main viewing screen is resizeable. I have enable double buffering and hardware assisted surface features. The main difference you will notice from the last version is that most functions require a surface handle. (main screen no longer assumed) I have attached the ScriptBasic GFX extension module binaries and example programs for both Windows 32 bit and Ubuntu 64 bit. Feedback and some contributed examples would be appreciated.
Support:
I have added a few more features and fixed an issue with the pixel format mask when returning a pixel color value. The Bitbucket C BASIC site has be updated with the latest source. I should mention that if you're trying to return the alpha channel of a pixel, you need to create a new surface first. I have spent a day trying to research and resolve retrieving alpha channel info from the initial surface created with the window container. Let me know if you find a solution and as always, feedback appreciated!
The following attachments contain only the updated ScriptBasic GFX extension module binary (gfx.so/dll) and the gfx.inc IMPORT file.
Support:
Here are a few examples of using the latest version of the ScriptBasic GFX extension module.
Note: The image on the right is using an alpha value of 192 instead of 255.
--- Code: ---'Peter's Pixel Test - SB GFX
IMPORT gfx.inc
vs = gfx::Window(320, 240, "Peter's Pixel Test - SB GFX")
s = gfx::CreateSurface(320, 240, 32)
RANDOMIZE(gfx::Time())
ts = gfx::Time()
FOR y = 0 TO 240
FOR x = 0 TO 320
r = RND() AND 255
g = RND() AND 255
b = RND() AND 255
gfx::pixelRGBA s, x, y, r, g, b, 255
NEXT
NEXT
gfx::filledCircleColor s, 100, 100, 80, gfx::GetPixel(s, 20, 20)
gfx::boxColor s, 100, 20, 80, 60, gfx::GetPixel(s, 10, 10)
te = gfx::Time()
gfx::stringColor s, 20, 215,"Time: " & FORMAT("%.4f",(te-ts)/1000) & " Seconds." & CHR(0), 0xffffffff
gfx::BlitSurface s, 0, vs, 0
gfx::Update
WHILE gfx::KeyName(1) <> "+escape"
WEND
gfx::Close
--- End code ---
Note: This took 8 1/2 seconds using the ScriptBasic BBC extension module.
--- Code: ---' ScriptBasic GFX - Fern
IMPORT gfx.inc
s = gfx::Window(640,500,"ScriptBasic GFX Fern")
RANDOMIZE(gfx::Time())
SPLITA STRING(3,"0") BY "" TO xy
Sub Fern
r = RND() % 100
IF r <= 10 THEN
a = 0
b = 0
c = 0
d = 0.16
e = 0
f = 0
ELSE IF r > 1 AND r <=86 THEN
a = 0.85
b = 0.04
c = -.04
d = 0.85
e = 0
f = 1.60
ELSE IF r > 86 AND r <=93 THEN
a = 0.2
b = -.26
c = 0.23
d = 0.22
e = 0
f = 0.16
ELSE
a = -.15
b = 0.28
c = 0.26
d = 0.24
e = 0
f = 0.44
END IF
newx = ((a * xy[1]) + (b * xy[2]) + e)
newy = ((c * xy[1]) + (d * xy[2]) + f)
xy[1] = newx
xy[2] = newy
gfx::pixelRGBA s, INT(xy[1]*40+300), INT(-xy[2]*40+450), 0, 210, 55, 255
END SUB
ts = gfx::Time()
FOR w=1 TO 100000
Fern
NEXT
te = gfx::Time()
gfx::stringColor s, 20, 15, "Time: " & FORMAT("%.4f",(te-ts)/1000) & " Seconds." & CHR(0), 0xffffffff
gfx::Update
WHILE gfx::KeyName(1) <> "+escape"
WEND
gfx::Close
--- End code ---
--- Code: ---' ScriptBasic GFX - Mandelbrot
IMPORT gfx.inc
s = gfx::Window(640,480,"ScriptBasic GFX Mandelbrot")
ts = gfx::Time()
im = 510
z = 120
h = 480
w = 640
FOR y = 0 TO h - 1
FOR x = 0 TO w - 1
zx = 0
zy = 0
cx = (x - w / 2) / z
cy = (y - h / 2) / z
it = im
WHILE zx * zx + zy * zy < 4 AND it > 0
tp = zx * zx - zy * zy + cx
zy = 2 * zx * zy + cy
zx = tp
it -= 1
WEND
gfx::PixelRGBA s, x, y, it * 12, it * 8, it * 4, 255
NEXT
NEXT
te = gfx::Time()
gfx::stringColor s, 20, 15, "Time: " & FORMAT("%.4f",(te-ts)/1000) & " Seconds." & CHR(0), 0x000000ff
gfx::Update
WHILE gfx::KeyName(1) <> "+escape"
WEND
gfx::Close
--- End code ---
Support:
Here is a Windows example using DLLC as the FFI and JIT virtual share object compiler. The Windows version of the GFX extension module takes about the same time as the Linux version. The Mandelbrot WHILE/WEND loop is an interpreter's nightmare.
--- Code: ---' ScriptBasic GFX & DLLC - Mandelbrot
include "dllcinc.sb"
oxy = dllfile("/sb22/modules/oxygen.dll")
o2_basic = dllproc( oxy, "o2_basic i =(c*source) " )
o2_exec = dllproc( oxy, "o2_exec i =(i call) " )
o2_error = dllproc( oxy, "o2_error c*=() " )
o2_errno = dllproc( oxy, "o2_errno i =() " )
o2_len = dllproc( oxy, "o2_len i =() " )
o2_mode = dllproc( oxy, "o2_mode (i mode) " )
dllcall(o2_mode,1)
src = """
extern
FUNCTION mandel(float cx,cy,sys it) as sys
float zx,zy,tp
WHILE zx * zx + zy * zy < 4 AND it > 0
tp = zx * zx - zy * zy + cx
zy = 2 * zx * zy + cy
zx = tp
it -= 1
WEND
return it
END FUNCTION
sub finish()
terminate
end sub
function link(sys n) as sys
select n
case 0
return @finish
case 1
return @mandel
end select
end function
end extern
addr link
"""
dllcall(o2_basic, src)
dfn = dllcall(o2_exec,0)
mandel = dllproc(dfn,"mandel i = (f zre, f zim, i maxiter)", dllcald(dfn, 1))
finish = dllproc(dfn,"finish ()", dllcald(dfn, 0))
gfx = dllfile("SDL_gfx.dll")
sdl = dllfile("sdl.dll")
SDL_INIT = dllproc(sdl, "SDL_Init i = (i flags)")
SDL_WINDOW = dllproc(sdl, "SDL_SetVideoMode i = (i width, i height, i video_bpp, i videoflags)")
SDL_SETALPHA = dllproc(sdl, "SDL_SetAlpha i = (i surface, i flag, i alpha)")
SDL_TITLE = dllproc(sdl, "SDL_WM_SetCaption (z title, z icon)")
SDL_WAIT = dllproc(sdl, "SDL_Delay (i millsecs)")
SDL_TIME = dllproc(sdl, "SDL_GetTicks i = ()")
SDL_CLIPRECT = dllproc(sdl, "SDL_SetClipRect (i surface, i* rect)")
GFX_PIXEL = dllproc(gfx, "pixelRGBA i = (i surface, i x, i y, i r, i g, i b, i a)")
SDL_FLIP = dllproc(sdl, "SDL_Flip i = (i screen)")
SDL_CLS = dllproc(sdl, "SDL_FillRect i = (i surface, i* dstrect, i color)")
GFX_PRINT = dllproc(gfx, "stringColor i = (i dst, i x, i y, c *s, i color)")
SDL_QUIT = dllproc(sdl, "SDL_Quit ()")
GLOBAL CONST SDL_INIT_VIDEO = 0x00000020
GLOBAL CONST SDL_SWSURFACE = 0x00000000
GLOBAL CONST SDL_SRCALPHA = 0x00010000
GLOBAL CONST SDL_RESIZABLE = 0x00000010
flags = SDL_SWSURFACE OR SDL_SRCALPHA OR SDL_RESIZABLE
dllcall(SDL_INIT, SDL_INIT_VIDEO)
screen = dllcall(SDL_WINDOW, 640, 480, 0, flags)
ok = dllcall(SDL_SETALPHA, screen, SDL_SRCALPHA, 0)
dllcall(SDL_TITLE, "ScriptBasic GFX & DLLC - Mandelbrot", 0)
' dllcall(SDL_CLS, screen, 0, 0xffffff)
ts = dllcall(SDL_TIME)
im = 510
z = 120
h = 480
w = 640
FOR y = 0 TO h -1
FOR x = 0 TO w -1
zx = 0
zy = 0
cx = (x - w / 2) / z
cy = (y - h / 2) / z
it = dllcall(mandel,cx,cy, im)
dllcall(GFX_PIXEL, screen, x, y, it * 12, it * 8, it * 4, 255)
NEXT
NEXT
te = dllcall(SDL_TIME)
dllcall(GFX_PRINT, screen, 20, 15, "Time: " & FORMAT("%.4f",(te-ts)/1000) & " Seconds." & CHR(0), 0x000000FF)
dllcall(SDL_FLIP, screen)
LINE INPUT WAIT
dllcall(SDL_QUIT)
--- End code ---
Navigation
[0] Message Index
[#] Next page
Go to full version