Hi all,

Thanks to Leo for fixing up the struct PMCs, I've code that can create a
new SDL window and blit a blue rectangle onto it.  Animation's not far
off now!

There are a couple of bugs, however.  First, I had to add some C-type
conversion code to classes/unmanagedstruct.pmc.  It's almost certainly
wrong, but without it, I wouldn't have gone as far.  This may be related
to why it requires r 255, g 0, b 255 to draw a blue rectangle.

I'm not sure UnManagedStruct understands UINT8.

Second, my PIR is undoubtedly funky.  Still, the results speak for
themselves.

I've attached my patch to classes/unmanagedstruct.pmc and
src/call_list.txt as well as the library files and my demo PIR. 
Enhancements and bug fixes welcome.

Be sure to run this in a directory containing "datatypes.pasm" or else
fix it to find the copy with Parrot (I tried).

-- c


Index: classes/unmanagedstruct.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/unmanagedstruct.pmc,v
retrieving revision 1.24
diff -u -u -r1.24 unmanagedstruct.pmc
--- classes/unmanagedstruct.pmc	27 Jan 2004 11:32:48 -0000	1.24
+++ classes/unmanagedstruct.pmc	31 Jan 2004 08:22:13 -0000
@@ -87,6 +87,7 @@
 	case enum_type_INTVAL:
 	case enum_type_int:
 	    return *(INTVAL*) p;
+	case enum_type_uint8:
 	case enum_type_int16:
 	case enum_type_uint16:
 	case enum_type_short:
@@ -95,7 +96,7 @@
 	case enum_type_uchar:
 	    return *p;
 	default:
-	    internal_exception(1, "unhandled type in struct");
+	    internal_exception(1, "returning unhandled int type in struct");
     }
     return -1;
 }
@@ -111,7 +112,7 @@
 	case enum_type_double:
 	    return (FLOATVAL) *(double*) p;
 	default:
-	    internal_exception(1, "unhandled type in struct");
+	    internal_exception(1, "returning unhandled float type in struct");
     }
     return -1.0;
 }
@@ -130,13 +131,14 @@
 	case enum_type_int:
 	    *(int*) p = value;
 	    break;
+	case enum_type_uint8:
 	case enum_type_int16:
 	case enum_type_uint16:
 	case enum_type_short:
 	    *(short*)p = (short)value;
 	    break;
 	default:
-	    internal_exception(1, "unhandled type in struct");
+	    internal_exception(1, "setting unhandled int type in struct");
 	    break;
     }
 }
Index: src/call_list.txt
===================================================================
RCS file: /cvs/public/parrot/src/call_list.txt,v
retrieving revision 1.27
diff -u -u -r1.27 call_list.txt
--- src/call_list.txt	2 Jan 2004 21:20:43 -0000	1.27
+++ src/call_list.txt	31 Jan 2004 08:22:14 -0000
@@ -205,3 +205,6 @@
 i	pPtiiipi
 i	tpiibi
 
+# Used by library/sdl.imc
+p	iiil
+i	ppl
--- /dev/null	1969-12-31 16:00:00.000000000 -0800
+++ library/sdl.pasm	2004-01-31 00:08:45.000000000 -0800
@@ -0,0 +1,13 @@
+savetop
+loadlib P1, 'libSDL.so'
+dlfunc P2, P1, 'SDL_Init', 'ii'
+store_global 'SDL::SDL_Init', P2
+dlfunc P2, P1, 'SDL_SetVideoMode', 'piiil'
+store_global 'SDL::SDL_SetVideoMode', P2
+dlfunc P2, P1, 'SDL_Quit', 'v'
+store_global 'SDL::SDL_Quit', P2
+dlfunc P2, P1, 'SDL_FillRect', 'ippl'
+store_global 'SDL::SDL_FillRect', P2
+dlfunc P2, P1, 'SDL_UpdateRect', 'vpiiii'
+store_global 'SDL::SDL_UpdateRect', P2
+restoreall
--- /dev/null	1969-12-31 16:00:00.000000000 -0800
+++ library/sdl_types.imc	2004-01-31 00:14:16.000000000 -0800
@@ -0,0 +1,95 @@
+.include "datatypes.pasm"
+
+.pcc_sub _init_SDL_types prototyped
+	newsub $P0, .Sub, new_SDL_Rect
+	store_global 'new_SDL_Rect', $P0
+	print "Init types\n"
+	.pcc_begin_return
+	.pcc_end_return
+.end
+
+.pcc_sub _new_SDL_Rect prototyped
+	new $P2, .OrderedHash
+	set $P2['x'], .DATATYPE_INT16
+	push $P2, 0
+	push $P2, 0
+	set $P2['y'], .DATATYPE_INT16
+	push $P2, 0
+	push $P2, 0
+	set $P2['w'], .DATATYPE_UINT16
+	push $P2, 0
+	push $P2, 0
+	set $P2['h'], .DATATYPE_UINT16
+	push $P2, 0
+	push $P2, 0
+
+	new $P5, .ManagedStruct, $P2
+	set $I6, 0
+	sizeof $I7, .DATATYPE_INT16
+	add $I6, $I7
+	add $I6, $I7
+	sizeof $I7, .DATATYPE_UINT16
+	add $I6, $I7
+	add $I6, $I7
+
+	set $P5, I6
+
+	.pcc_begin_return
+	.return $P5
+	.pcc_end_return
+.end
+
+.pcc_sub _new_SDL_Color prototyped
+	.param int red
+	.param int green
+	.param int blue
+
+	new $P2, .OrderedHash
+	set $P2['r'], .DATATYPE_UINT8
+	push $P2, 0
+	push $P2, 0
+	set $P2['g'], .DATATYPE_UINT8
+	push $P2, 0
+	push $P2, 0
+	set $P2['b'], .DATATYPE_UINT8
+	push $P2, 0
+	push $P2, 0
+	set $P2['a'], .DATATYPE_UINT8
+	push $P2, 0
+	push $P2, 0
+
+	new $P5, .ManagedStruct, $P2
+	set $I6, 0
+	sizeof $I7, .DATATYPE_UINT8
+	add $I6, $I7
+	add $I6, $I7
+	add $I6, $I7
+	add $I6, $I7
+
+	set $P5, $I6
+
+	print red
+	print "\n"
+	print green
+	print "\n"
+	print blue
+	print "\n"
+
+	set $P5['r'], red
+	set $P5['g'], green
+	set $P5['b'], blue
+
+	set $I0, $P5['r']
+	print $I0
+	print "\n"
+	set $I0, $P5['g']
+	print $I0
+	print "\n"
+	set $I0, $P5['b']
+	print $I0
+	print "\n"
+
+	.pcc_begin_return
+	.return $P5
+	.pcc_end_return
+.end
.sub _main
        _init()
        _MAIN()
        end
.end

.include "library/sdl_types.imc"
.include "datatypes.pasm"

.pcc_sub _init prototyped
        .include "library/sdl.pasm"
        _init_SDL_types()
.end

.sub _MAIN
        .local pmc SDL_Init
        .local pmc SetVideoMode
        .local pmc SDL_Quit
        .local pmc SDL_UpdateRect
        .local pmc SDL_FillRect
        .local pmc new_SDL_Rect
        .local object screen

        SDL_Init       = global "SDL::SDL_Init"
        SetVideoMode   = global "SDL::SDL_SetVideoMode"
        SDL_Quit       = global "SDL::SDL_Quit"
        SDL_UpdateRect = global "SDL::SDL_UpdateRect"
        SDL_FillRect   = global "SDL::SDL_FillRect"
        new_SDL_Rect   = global "new_SDL_Rect"

        .pcc_begin prototyped
                .arg 255
                .arg 65535
                .nci_call SDL_Init
        .pcc_end

        .pcc_begin prototyped
                .arg 640
                .arg 480
                .arg  16
                .arg   0
                .nci_call SetVideoMode
                .result screen
        .pcc_end

        .local object blue_rect
        .local object blue_color
        .local Sub new_rect
        .local Sub new_color
        .local Sub update_rect

        blue_rect = _new_SDL_Rect()
        blue_color = _new_SDL_Color( 255, 0, 255 )

        set blue_rect['w'], 100
        set blue_rect['h'], 100
        set blue_rect['x'], 270
        set blue_rect['y'], 190

        .pcc_begin prototyped
                .arg screen
                .arg blue_rect
                .arg blue_color
                .nci_call SDL_FillRect
        .pcc_end

        .pcc_begin prototyped
                .arg screen
                .arg 0
                .arg 0
                .arg 0
                .arg 0
                .nci_call SDL_UpdateRect
        .pcc_end

        set $I0, 2
        sleep $I0

        .pcc_begin prototyped
                .nci_call SDL_Quit
        .pcc_end

        .pcc_begin_return
        .pcc_end_return
.end

Reply via email to