4 * Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following
14 * disclaimer in the documentation and/or other materials
15 * provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY THE JIM TCL PROJECT ``AS IS'' AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
19 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21 * JIM TCL PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 * The views and conclusions contained in the software and documentation
31 * are those of the authors and should not be interpreted as representing
32 * official policies, either expressed or implied, of the Jim Tcl Project.
40 #include <SDL/SDL_gfxPrimitives.h>
43 #include "jimautoconf.h"
45 #define AIO_CMD_LEN 128
47 typedef struct JimSdlSurface
52 static void JimSdlSetError(Jim_Interp
*interp
)
54 Jim_SetResultString(interp
, SDL_GetError(), -1);
57 static void JimSdlDelProc(Jim_Interp
*interp
, void *privData
)
59 JimSdlSurface
*jss
= privData
;
63 SDL_FreeSurface(jss
->screen
);
67 /* Calls to commands created via [sdl.surface] are implemented by this
69 static int JimSdlHandlerCommand(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
71 JimSdlSurface
*jss
= Jim_CmdPrivData(interp
);
73 static const char * const options
[] = {
74 "free", "flip", "pixel", "rectangle", "box", "line", "aaline",
75 "circle", "aacircle", "fcircle", NULL
78 { OPT_FREE
, OPT_FLIP
, OPT_PIXEL
, OPT_RECTANGLE
, OPT_BOX
, OPT_LINE
,
79 OPT_AALINE
, OPT_CIRCLE
, OPT_AACIRCLE
, OPT_FCIRCLE
83 Jim_WrongNumArgs(interp
, 1, argv
, "method ?args ...?");
86 if (Jim_GetEnum(interp
, argv
[1], options
, &option
, "SDL surface method", JIM_ERRMSG
) != JIM_OK
)
88 if (option
== OPT_PIXEL
) {
90 long x
, y
, red
, green
, blue
, alpha
= 255;
92 if (argc
!= 7 && argc
!= 8) {
93 Jim_WrongNumArgs(interp
, 2, argv
, "x y red green blue ?alpha?");
96 if (Jim_GetLong(interp
, argv
[2], &x
) != JIM_OK
||
97 Jim_GetLong(interp
, argv
[3], &y
) != JIM_OK
||
98 Jim_GetLong(interp
, argv
[4], &red
) != JIM_OK
||
99 Jim_GetLong(interp
, argv
[5], &green
) != JIM_OK
||
100 Jim_GetLong(interp
, argv
[6], &blue
) != JIM_OK
) {
103 if (argc
== 8 && Jim_GetLong(interp
, argv
[7], &alpha
) != JIM_OK
)
105 pixelRGBA(jss
->screen
, x
, y
, red
, green
, blue
, alpha
);
108 else if (option
== OPT_RECTANGLE
|| option
== OPT_BOX
||
109 option
== OPT_LINE
|| option
== OPT_AALINE
) {
110 /* RECTANGLE, BOX, LINE, AALINE */
111 long x1
, y1
, x2
, y2
, red
, green
, blue
, alpha
= 255;
113 if (argc
!= 9 && argc
!= 10) {
114 Jim_WrongNumArgs(interp
, 2, argv
, "x y red green blue ?alpha?");
117 if (Jim_GetLong(interp
, argv
[2], &x1
) != JIM_OK
||
118 Jim_GetLong(interp
, argv
[3], &y1
) != JIM_OK
||
119 Jim_GetLong(interp
, argv
[4], &x2
) != JIM_OK
||
120 Jim_GetLong(interp
, argv
[5], &y2
) != JIM_OK
||
121 Jim_GetLong(interp
, argv
[6], &red
) != JIM_OK
||
122 Jim_GetLong(interp
, argv
[7], &green
) != JIM_OK
||
123 Jim_GetLong(interp
, argv
[8], &blue
) != JIM_OK
) {
126 if (argc
== 10 && Jim_GetLong(interp
, argv
[9], &alpha
) != JIM_OK
)
130 rectangleRGBA(jss
->screen
, x1
, y1
, x2
, y2
, red
, green
, blue
, alpha
);
133 boxRGBA(jss
->screen
, x1
, y1
, x2
, y2
, red
, green
, blue
, alpha
);
136 lineRGBA(jss
->screen
, x1
, y1
, x2
, y2
, red
, green
, blue
, alpha
);
139 aalineRGBA(jss
->screen
, x1
, y1
, x2
, y2
, red
, green
, blue
, alpha
);
144 else if (option
== OPT_CIRCLE
|| option
== OPT_AACIRCLE
|| option
== OPT_FCIRCLE
) {
145 /* CIRCLE, AACIRCLE, FCIRCLE */
146 long x
, y
, radius
, red
, green
, blue
, alpha
= 255;
148 if (argc
!= 8 && argc
!= 9) {
149 Jim_WrongNumArgs(interp
, 2, argv
, "x y radius red green blue ?alpha?");
152 if (Jim_GetLong(interp
, argv
[2], &x
) != JIM_OK
||
153 Jim_GetLong(interp
, argv
[3], &y
) != JIM_OK
||
154 Jim_GetLong(interp
, argv
[4], &radius
) != JIM_OK
||
155 Jim_GetLong(interp
, argv
[5], &red
) != JIM_OK
||
156 Jim_GetLong(interp
, argv
[6], &green
) != JIM_OK
||
157 Jim_GetLong(interp
, argv
[7], &blue
) != JIM_OK
) {
160 if (argc
== 9 && Jim_GetLong(interp
, argv
[8], &alpha
) != JIM_OK
)
164 circleRGBA(jss
->screen
, x
, y
, radius
, red
, green
, blue
, alpha
);
167 aacircleRGBA(jss
->screen
, x
, y
, radius
, red
, green
, blue
, alpha
);
170 filledCircleRGBA(jss
->screen
, x
, y
, radius
, red
, green
, blue
, alpha
);
175 else if (option
== OPT_FREE
) {
178 Jim_WrongNumArgs(interp
, 2, argv
, "");
181 Jim_DeleteCommand(interp
, Jim_String(argv
[0]));
184 else if (option
== OPT_FLIP
) {
187 Jim_WrongNumArgs(interp
, 2, argv
, "");
190 SDL_Flip(jss
->screen
);
196 static int JimSdlSurfaceCommand(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
199 char buf
[AIO_CMD_LEN
];
201 long screenId
, xres
, yres
;
205 Jim_WrongNumArgs(interp
, 1, argv
, "xres yres");
208 if (Jim_GetLong(interp
, argv
[1], &xres
) != JIM_OK
||
209 Jim_GetLong(interp
, argv
[2], &yres
) != JIM_OK
)
212 /* Try to create the surface */
213 screen
= SDL_SetVideoMode(xres
, yres
, 32, SDL_SWSURFACE
| SDL_ANYFORMAT
);
214 if (screen
== NULL
) {
215 JimSdlSetError(interp
);
218 /* Get the next file id */
219 if (Jim_EvalGlobal(interp
, "if {[catch {incr sdl.surfaceId}]} {set sdl.surfaceId 0}") != JIM_OK
)
221 objPtr
= Jim_GetVariableStr(interp
, "sdl.surfaceId", JIM_ERRMSG
);
224 if (Jim_GetLong(interp
, objPtr
, &screenId
) != JIM_OK
)
227 /* Create the SDL screen command */
228 jss
= Jim_Alloc(sizeof(*jss
));
229 jss
->screen
= screen
;
230 sprintf(buf
, "sdl.surface%ld", screenId
);
231 Jim_CreateCommand(interp
, buf
, JimSdlHandlerCommand
, jss
, JimSdlDelProc
);
232 Jim_SetResultString(interp
, buf
, -1);
236 int Jim_sdlInit(Jim_Interp
*interp
)
238 if (Jim_PackageProvide(interp
, "sdl", "1.0", JIM_ERRMSG
))
241 if (SDL_Init(SDL_INIT_VIDEO
) < 0) {
242 JimSdlSetError(interp
);
246 Jim_CreateCommand(interp
, "sdl.screen", JimSdlSurfaceCommand
, NULL
, NULL
);