2 * Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * A copy of the license is also included in the source distribution
11 * of Jim, as a TXT file name called LICENSE.
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
25 #include <SDL_gfxPrimitives.h>
30 #define AIO_CMD_LEN 128
32 typedef struct JimSdlSurface
{
36 static void JimSdlSetError(Jim_Interp
*interp
)
38 Jim_SetResultString(interp
, SDL_GetError(), -1);
41 static void JimSdlDelProc(Jim_Interp
*interp
, void *privData
)
43 JimSdlSurface
*jss
= privData
;
46 SDL_FreeSurface(jss
->screen
);
50 /* Calls to commands created via [sdl.surface] are implemented by this
52 static int JimSdlHandlerCommand(Jim_Interp
*interp
, int argc
,
55 JimSdlSurface
*jss
= Jim_CmdPrivData(interp
);
57 const char *options
[] = {
58 "free", "flip", "pixel", "rectangle", "box", "line", "aaline",
59 "circle", "aacircle", "fcircle", NULL
61 enum {OPT_FREE
, OPT_FLIP
, OPT_PIXEL
, OPT_RECTANGLE
, OPT_BOX
, OPT_LINE
,
62 OPT_AALINE
, OPT_CIRCLE
, OPT_AACIRCLE
, OPT_FCIRCLE
};
65 Jim_WrongNumArgs(interp
, 1, argv
, "method ?args ...?");
68 if (Jim_GetEnum(interp
, argv
[1], options
, &option
, "SDL surface method",
69 JIM_ERRMSG
) != JIM_OK
)
71 if (option
== OPT_PIXEL
) {
73 long x
, y
, red
, green
, blue
, alpha
= 255;
75 if (argc
!= 7 && argc
!= 8) {
76 Jim_WrongNumArgs(interp
, 2, argv
, "x y red green blue ?alpha?");
79 if (Jim_GetLong(interp
, argv
[2], &x
) != JIM_OK
||
80 Jim_GetLong(interp
, argv
[3], &y
) != JIM_OK
||
81 Jim_GetLong(interp
, argv
[4], &red
) != JIM_OK
||
82 Jim_GetLong(interp
, argv
[5], &green
) != JIM_OK
||
83 Jim_GetLong(interp
, argv
[6], &blue
) != JIM_OK
)
87 if (argc
== 8 && Jim_GetLong(interp
, argv
[7], &alpha
) != JIM_OK
)
89 pixelRGBA(jss
->screen
, x
, y
, red
, green
, blue
, alpha
);
91 } else if (option
== OPT_RECTANGLE
|| option
== OPT_BOX
||
92 option
== OPT_LINE
|| option
== OPT_AALINE
)
94 /* RECTANGLE, BOX, LINE, AALINE */
95 long x1
, y1
, x2
, y2
, red
, green
, blue
, alpha
= 255;
97 if (argc
!= 9 && argc
!= 10) {
98 Jim_WrongNumArgs(interp
, 2, argv
, "x y red green blue ?alpha?");
101 if (Jim_GetLong(interp
, argv
[2], &x1
) != JIM_OK
||
102 Jim_GetLong(interp
, argv
[3], &y1
) != JIM_OK
||
103 Jim_GetLong(interp
, argv
[4], &x2
) != JIM_OK
||
104 Jim_GetLong(interp
, argv
[5], &y2
) != JIM_OK
||
105 Jim_GetLong(interp
, argv
[6], &red
) != JIM_OK
||
106 Jim_GetLong(interp
, argv
[7], &green
) != JIM_OK
||
107 Jim_GetLong(interp
, argv
[8], &blue
) != JIM_OK
)
111 if (argc
== 10 && Jim_GetLong(interp
, argv
[9], &alpha
) != JIM_OK
)
115 rectangleRGBA(jss
->screen
, x1
, y1
, x2
, y2
, red
, green
, blue
, alpha
);
118 boxRGBA(jss
->screen
, x1
, y1
, x2
, y2
, red
, green
, blue
, alpha
);
121 lineRGBA(jss
->screen
, x1
, y1
, x2
, y2
, red
, green
, blue
, alpha
);
124 aalineRGBA(jss
->screen
, x1
, y1
, x2
, y2
, red
, green
, blue
, alpha
);
128 } else if (option
== OPT_CIRCLE
|| option
== OPT_AACIRCLE
||
129 option
== OPT_FCIRCLE
)
131 /* CIRCLE, AACIRCLE, FCIRCLE */
132 long x
, y
, radius
, red
, green
, blue
, alpha
= 255;
134 if (argc
!= 8 && argc
!= 9) {
135 Jim_WrongNumArgs(interp
, 2, argv
,
136 "x y radius red green blue ?alpha?");
139 if (Jim_GetLong(interp
, argv
[2], &x
) != JIM_OK
||
140 Jim_GetLong(interp
, argv
[3], &y
) != JIM_OK
||
141 Jim_GetLong(interp
, argv
[4], &radius
) != JIM_OK
||
142 Jim_GetLong(interp
, argv
[5], &red
) != JIM_OK
||
143 Jim_GetLong(interp
, argv
[6], &green
) != JIM_OK
||
144 Jim_GetLong(interp
, argv
[7], &blue
) != JIM_OK
)
148 if (argc
== 9 && Jim_GetLong(interp
, argv
[8], &alpha
) != JIM_OK
)
152 circleRGBA(jss
->screen
, x
, y
, radius
, red
, green
, blue
, alpha
);
155 aacircleRGBA(jss
->screen
, x
, y
, radius
, red
, green
, blue
, alpha
);
158 filledCircleRGBA(jss
->screen
, x
, y
, radius
, red
, green
, blue
,
163 } else if (option
== OPT_FREE
) {
166 Jim_WrongNumArgs(interp
, 2, argv
, "");
169 Jim_DeleteCommand(interp
, Jim_GetString(argv
[0], NULL
));
171 } else if (option
== OPT_FLIP
) {
174 Jim_WrongNumArgs(interp
, 2, argv
, "");
177 SDL_Flip(jss
->screen
);
183 static int JimSdlSurfaceCommand(Jim_Interp
*interp
, int argc
,
184 Jim_Obj
*const *argv
)
187 char buf
[AIO_CMD_LEN
];
189 long screenId
, xres
, yres
;
193 Jim_WrongNumArgs(interp
, 1, argv
, "xres yres");
196 if (Jim_GetLong(interp
, argv
[1], &xres
) != JIM_OK
||
197 Jim_GetLong(interp
, argv
[2], &yres
) != JIM_OK
)
200 /* Try to create the surface */
201 screen
= SDL_SetVideoMode(xres
, yres
, 32, SDL_SWSURFACE
|SDL_ANYFORMAT
);
202 if (screen
== NULL
) {
203 JimSdlSetError(interp
);
206 /* Get the next file id */
207 if (Jim_EvalGlobal(interp
,
208 "if {[catch {incr sdl.surfaceId}]} {set sdl.surfaceId 0}") != JIM_OK
)
210 objPtr
= Jim_GetVariableStr(interp
, "sdl.surfaceId", JIM_ERRMSG
);
211 if (objPtr
== NULL
) return JIM_ERR
;
212 if (Jim_GetLong(interp
, objPtr
, &screenId
) != JIM_OK
) return JIM_ERR
;
214 /* Create the SDL screen command */
215 jss
= Jim_Alloc(sizeof(*jss
));
216 jss
->screen
= screen
;
217 sprintf(buf
, "sdl.surface%ld", screenId
);
218 Jim_CreateCommand(interp
, buf
, JimSdlHandlerCommand
, jss
, JimSdlDelProc
);
219 Jim_SetResultString(interp
, buf
, -1);
223 int Jim_OnLoad(Jim_Interp
*interp
)
225 Jim_InitExtension(interp
);
226 if (Jim_PackageProvide(interp
, "sdl", "1.0", JIM_ERRMSG
) != JIM_OK
)
228 if (SDL_Init(SDL_INIT_VIDEO
) < 0) {
229 JimSdlSetError(interp
);
233 Jim_CreateCommand(interp
, "sdl.screen", JimSdlSurfaceCommand
, NULL
, NULL
);