ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/Client.xs
(Generate patch)

Comparing deliantra/Deliantra-Client/Client.xs (file contents):
Revision 1.200 by root, Tue Jul 17 16:02:13 2007 UTC vs.
Revision 1.207 by root, Fri Jul 20 18:19:45 2007 UTC

26#include <string.h> 26#include <string.h>
27#include <stdio.h> 27#include <stdio.h>
28#include <stdlib.h> 28#include <stdlib.h>
29 29
30#include <SDL.h> 30#include <SDL.h>
31#include <SDL_thread.h>
31#include <SDL_endian.h> 32#include <SDL_endian.h>
32#include <SDL_image.h> 33#include <SDL_image.h>
33#include <SDL_mixer.h> 34#include <SDL_mixer.h>
34#include <SDL_opengl.h> 35#include <SDL_opengl.h>
35 36
431} 432}
432 433
433/* SDL should provide this, really. */ 434/* SDL should provide this, really. */
434#define SDLK_MODIFIER_MIN 300 435#define SDLK_MODIFIER_MIN 300
435#define SDLK_MODIFIER_MAX 314 436#define SDLK_MODIFIER_MAX 314
437
438/******************************************************************************/
439
440static int
441within_widget (SV *widget, NV x, NV y)
442{
443 HV *self;
444 SV **svp;
445 NV wx, ww, wy, wh;
446
447 if (!SvROK (widget))
448 return 0;
449
450 self = (HV *)SvRV (widget);
451
452 if (SvTYPE (self) != SVt_PVHV)
453 return 0;
454
455 svp = hv_fetch (self, "y", 1, 0); wy = svp ? SvNV (*svp) : 0.;
456 if (y < wy)
457 return 0;
458
459 svp = hv_fetch (self, "h", 1, 0); wh = svp ? SvNV (*svp) : 0.;
460 if (y >= wy + wh)
461 return 0;
462
463 svp = hv_fetch (self, "x", 1, 0); wx = svp ? SvNV (*svp) : 0.;
464 if (x < wx)
465 return 0;
466
467 svp = hv_fetch (self, "w", 1, 0); ww = svp ? SvNV (*svp) : 0.;
468 if (x >= wx + ww)
469 return 0;
470
471 svp = hv_fetch (self, "can_events", sizeof ("can_events") - 1, 0);
472 if (!svp || !SvTRUE (*svp))
473 return 0;
474
475 return 1;
476}
436 477
437MODULE = CFPlus PACKAGE = CFPlus 478MODULE = CFPlus PACKAGE = CFPlus
438 479
439PROTOTYPES: ENABLE 480PROTOTYPES: ENABLE
440 481
932#endif 973#endif
933} 974}
934 975
935MODULE = CFPlus PACKAGE = CFPlus::Font 976MODULE = CFPlus PACKAGE = CFPlus::Font
936 977
978PROTOTYPES: DISABLE
979
937CFPlus::Font 980CFPlus::Font
938new_from_file (SV *class, char *path, int id = 0) 981new_from_file (SV *class, char *path, int id = 0)
939 CODE: 982 CODE:
940{ 983{
941 int count; 984 int count;
951 CODE: 994 CODE:
952 pango_font_description_free (self); 995 pango_font_description_free (self);
953 996
954void 997void
955make_default (CFPlus::Font self) 998make_default (CFPlus::Font self)
999 PROTOTYPE: $
956 CODE: 1000 CODE:
957 default_font = self; 1001 default_font = self;
958 1002
959MODULE = CFPlus PACKAGE = CFPlus::Layout 1003MODULE = CFPlus PACKAGE = CFPlus::Layout
960 1004
1005PROTOTYPES: DISABLE
1006
961void 1007void
962reset_glyph_cache () 1008reset_glyph_cache ()
1009 PROTOTYPE:
963 CODE: 1010 CODE:
964 tc_clear (); 1011 tc_clear ();
965 1012
966CFPlus::Layout 1013CFPlus::Layout
967new (SV *class) 1014new (SV *class)
1254 flags 1301 flags
1255 ); 1302 );
1256 1303
1257MODULE = CFPlus PACKAGE = CFPlus::Texture 1304MODULE = CFPlus PACKAGE = CFPlus::Texture
1258 1305
1306PROTOTYPES: ENABLE
1307
1259int minpot (int n) 1308int minpot (int n)
1260 1309
1261void 1310void
1262pad2pot (SV *data_, SV *w_, SV *h_) 1311pad (SV *data_, int ow, int oh, int nw, int nh)
1263 CODE: 1312 CODE:
1264{ 1313{
1265 int ow = SvIV (w_); 1314 if ((nw != ow || nh != oh) && SvOK (data_))
1266 int oh = SvIV (h_);
1267
1268 if (ow && oh)
1269 { 1315 {
1270 int nw = minpot (ow);
1271 int nh = minpot (oh);
1272
1273 if (nw != ow || nh != oh)
1274 {
1275 if (SvOK (data_))
1276 {
1277 STRLEN datalen; 1316 STRLEN datalen;
1278 char *data = SvPVbyte (data_, datalen); 1317 char *data = SvPVbyte (data_, datalen);
1279 int bpp = datalen / (ow * oh); 1318 int bpp = datalen / (ow * oh);
1280 SV *result_ = sv_2mortal (newSV (nw * nh * bpp)); 1319 SV *result_ = sv_2mortal (newSV (nw * nh * bpp));
1281 1320
1282 SvPOK_only (result_); 1321 SvPOK_only (result_);
1283 SvCUR_set (result_, nw * nh * bpp); 1322 SvCUR_set (result_, nw * nh * bpp);
1284 1323
1285 memset (SvPVX (result_), 0, nw * nh * bpp); 1324 memset (SvPVX (result_), 0, nw * nh * bpp);
1286 while (oh--) 1325 while (oh--)
1287 memcpy (SvPVX (result_) + oh * nw * bpp, data + oh * ow * bpp, ow * bpp); 1326 memcpy (SvPVX (result_) + oh * nw * bpp, data + oh * ow * bpp, ow * bpp);
1288 1327
1289 sv_setsv (data_, result_); 1328 sv_setsv (data_, result_);
1290 }
1291
1292 sv_setiv (w_, nw);
1293 sv_setiv (h_, nh);
1294 }
1295 } 1329 }
1296} 1330}
1297 1331
1298void 1332void
1299draw_quad (SV *self, float x, float y, float w = 0., float h = 0.) 1333draw_quad (SV *self, float x, float y, float w = 0., float h = 0.)
1354} 1388}
1355 OUTPUT: 1389 OUTPUT:
1356 RETVAL 1390 RETVAL
1357 1391
1358MODULE = CFPlus PACKAGE = CFPlus::Map 1392MODULE = CFPlus PACKAGE = CFPlus::Map
1393
1394PROTOTYPES: DISABLE
1359 1395
1360CFPlus::Map 1396CFPlus::Map
1361new (SV *class) 1397new (SV *class)
1362 CODE: 1398 CODE:
1363 New (0, RETVAL, 1, struct map); 1399 New (0, RETVAL, 1, struct map);
1978void 2014void
1979fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh) 2015fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh)
1980 PPCODE: 2016 PPCODE:
1981{ 2017{
1982 int x, y; 2018 int x, y;
2019 int sw1 = sw + 2;
2020 int sh1 = sh + 2;
2021 int sh3 = sh * 3;
1983 int sw4 = (sw + 3) & ~3; 2022 int sw34 = (sw * 3 + 3) & ~3;
2023 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
1984 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh)); 2024 SV *darkness3_sv = sv_2mortal (newSV (sw34 * sh3));
1985 uint8_t *darkness = (uint8_t *)SvPVX (darkness_sv); 2025 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
1986 2026
1987 memset (darkness, 255, sw4 * sh);
1988 SvPOK_only (darkness_sv); 2027 SvPOK_only (darkness3_sv);
1989 SvCUR_set (darkness_sv, sw4 * sh); 2028 SvCUR_set (darkness3_sv, sw34 * sh3);
1990 2029
1991 mx += self->x; 2030 mx += self->x - 1;
1992 my += self->y; 2031 my += self->y - 1;
1993 2032
2033 memset (darkness1, 255, sw1 * sh1);
2034
1994 for (y = 0; y < sh; y++) 2035 for (y = 0; y < sh1; y++)
1995 if (0 <= y + my && y + my < self->rows) 2036 if (0 <= y + my && y + my < self->rows)
1996 { 2037 {
1997 maprow *row = self->row + (y + my); 2038 maprow *row = self->row + (y + my);
1998 2039
1999 for (x = 0; x < sw; x++) 2040 for (x = 0; x < sw1; x++)
2000 if (row->c0 <= x + mx && x + mx < row->c1) 2041 if (row->c0 <= x + mx && x + mx < row->c1)
2001 { 2042 {
2002 mapcell *cell = row->col + (x + mx - row->c0); 2043 mapcell *cell = row->col + (x + mx - row->c0);
2003 2044
2004 darkness[y * sw4 + x] = cell->darkness 2045 darkness1 [y * sw1 + x] = cell->darkness
2005 ? 255 - (cell->darkness - 1) 2046 ? 255 - (cell->darkness - 1)
2006 : 255 - FOW_DARKNESS; 2047 : 255 - FOW_DARKNESS;
2007 } 2048 }
2008 } 2049 }
2009 2050
2051 for (y = 0; y < sh; ++y)
2052 for (x = 0; x < sw; ++x)
2053 {
2054 uint8_t d11 = darkness1 [(y ) * sw1 + x ];
2055 uint8_t d21 = darkness1 [(y ) * sw1 + x + 1];
2056 uint8_t d31 = darkness1 [(y ) * sw1 + x + 2];
2057 uint8_t d12 = darkness1 [(y + 1) * sw1 + x ];
2058 uint8_t d22 = darkness1 [(y + 1) * sw1 + x + 1];
2059 uint8_t d32 = darkness1 [(y + 1) * sw1 + x + 2];
2060 uint8_t d13 = darkness1 [(y + 2) * sw1 + x ];
2061 uint8_t d23 = darkness1 [(y + 2) * sw1 + x + 1];
2062 uint8_t d33 = darkness1 [(y + 2) * sw1 + x + 2];
2063
2064 uint8_t r11 = (d11 + d21 + d12) / 3;
2065 uint8_t r21 = d21;
2066 uint8_t r31 = (d21 + d31 + d32) / 3;
2067
2068 uint8_t r12 = d12;
2069 uint8_t r22 = d22;
2070 uint8_t r32 = d32;
2071
2072 uint8_t r13 = (d13 + d23 + d12) / 3;
2073 uint8_t r23 = d23;
2074 uint8_t r33 = (d23 + d33 + d32) / 3;
2075
2076 darkness3 [(y * 3 ) * sw34 + (x * 3 )] = MAX (d22, r11);
2077 darkness3 [(y * 3 ) * sw34 + (x * 3 + 1)] = MAX (d22, r21);
2078 darkness3 [(y * 3 ) * sw34 + (x * 3 + 2)] = MAX (d22, r31);
2079 darkness3 [(y * 3 + 1) * sw34 + (x * 3 )] = MAX (d22, r12);
2080 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 1)] = MAX (d22, r22);
2081 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 2)] = MAX (d22, r32);
2082 darkness3 [(y * 3 + 2) * sw34 + (x * 3 )] = MAX (d22, r13);
2083 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 1)] = MAX (d22, r23);
2084 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 2)] = MAX (d22, r33);
2085 }
2086
2087 free (darkness1);
2088
2010 EXTEND (SP, 3); 2089 EXTEND (SP, 3);
2011 PUSHs (sv_2mortal (newSViv (sw4))); 2090 PUSHs (sv_2mortal (newSViv (sw34)));
2012 PUSHs (sv_2mortal (newSViv (sh))); 2091 PUSHs (sv_2mortal (newSViv (sh3)));
2013 PUSHs (darkness_sv); 2092 PUSHs (darkness3_sv);
2014} 2093}
2015 2094
2016SV * 2095SV *
2017get_rect (CFPlus::Map self, int x0, int y0, int w, int h) 2096get_rect (CFPlus::Map self, int x0, int y0, int w, int h)
2018 CODE: 2097 CODE:
2152 } 2231 }
2153} 2232}
2154 2233
2155MODULE = CFPlus PACKAGE = CFPlus::MixChunk 2234MODULE = CFPlus PACKAGE = CFPlus::MixChunk
2156 2235
2236PROTOTYPES: DISABLE
2237
2157CFPlus::MixChunk 2238CFPlus::MixChunk
2158new_from_file (SV *class, char *path) 2239new_from_file (SV *class, char *path)
2159 CODE: 2240 CODE:
2160 RETVAL = Mix_LoadWAV (path); 2241 RETVAL = Mix_LoadWAV (path);
2161 OUTPUT: 2242 OUTPUT:
2182 2263
2183MODULE = CFPlus PACKAGE = CFPlus::MixMusic 2264MODULE = CFPlus PACKAGE = CFPlus::MixMusic
2184 2265
2185int 2266int
2186volume (int volume = -1) 2267volume (int volume = -1)
2268 PROTOTYPE: ;$
2187 CODE: 2269 CODE:
2188 RETVAL = Mix_VolumeMusic (volume); 2270 RETVAL = Mix_VolumeMusic (volume);
2189 OUTPUT: 2271 OUTPUT:
2190 RETVAL 2272 RETVAL
2191 2273
2221 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position); 2303 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position);
2222 OUTPUT: 2304 OUTPUT:
2223 RETVAL 2305 RETVAL
2224 2306
2225MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2307MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2308
2309PROTOTYPES: ENABLE
2226 2310
2227BOOT: 2311BOOT:
2228{ 2312{
2229 HV *stash = gv_stashpv ("CFPlus::OpenGL", 1); 2313 HV *stash = gv_stashpv ("CFPlus::OpenGL", 1);
2230 static const struct { 2314 static const struct {
2246 const_iv (GL_ALPHA_TEST), 2330 const_iv (GL_ALPHA_TEST),
2247 const_iv (GL_NORMALIZE), 2331 const_iv (GL_NORMALIZE),
2248 const_iv (GL_RESCALE_NORMAL), 2332 const_iv (GL_RESCALE_NORMAL),
2249 const_iv (GL_FRONT), 2333 const_iv (GL_FRONT),
2250 const_iv (GL_BACK), 2334 const_iv (GL_BACK),
2335 const_iv (GL_AUX0),
2251 const_iv (GL_AND), 2336 const_iv (GL_AND),
2252 const_iv (GL_ONE), 2337 const_iv (GL_ONE),
2253 const_iv (GL_ZERO), 2338 const_iv (GL_ZERO),
2254 const_iv (GL_SRC_ALPHA), 2339 const_iv (GL_SRC_ALPHA),
2255 const_iv (GL_DST_ALPHA), 2340 const_iv (GL_DST_ALPHA),
2310 const_iv (GL_QUAD_STRIP), 2395 const_iv (GL_QUAD_STRIP),
2311 const_iv (GL_TRIANGLES), 2396 const_iv (GL_TRIANGLES),
2312 const_iv (GL_TRIANGLE_STRIP), 2397 const_iv (GL_TRIANGLE_STRIP),
2313 const_iv (GL_TRIANGLE_FAN), 2398 const_iv (GL_TRIANGLE_FAN),
2314 const_iv (GL_PERSPECTIVE_CORRECTION_HINT), 2399 const_iv (GL_PERSPECTIVE_CORRECTION_HINT),
2400 const_iv (GL_POINT_SMOOTH_HINT),
2401 const_iv (GL_LINE_SMOOTH_HINT),
2402 const_iv (GL_POLYGON_SMOOTH_HINT),
2403 const_iv (GL_GENERATE_MIPMAP_HINT),
2315 const_iv (GL_FASTEST), 2404 const_iv (GL_FASTEST),
2405 const_iv (GL_DONT_CARE),
2406 const_iv (GL_NICEST),
2316 const_iv (GL_V2F), 2407 const_iv (GL_V2F),
2317 const_iv (GL_V3F), 2408 const_iv (GL_V3F),
2318 const_iv (GL_T2F_V3F), 2409 const_iv (GL_T2F_V3F),
2319 const_iv (GL_T2F_N3F_V3F), 2410 const_iv (GL_T2F_N3F_V3F),
2320# undef const_iv 2411# undef const_iv
2346 CODE: 2437 CODE:
2347 RETVAL = (char *)glGetString (GL_EXTENSIONS); 2438 RETVAL = (char *)glGetString (GL_EXTENSIONS);
2348 OUTPUT: 2439 OUTPUT:
2349 RETVAL 2440 RETVAL
2350 2441
2351char *glGetString (GLenum pname) 2442const char *glGetString (GLenum pname)
2352 2443
2353GLint glGetInteger (GLenum pname) 2444GLint glGetInteger (GLenum pname)
2354 CODE: 2445 CODE:
2355 glGetIntegerv (pname, &RETVAL); 2446 glGetIntegerv (pname, &RETVAL);
2356 OUTPUT: 2447 OUTPUT:
2521 2612
2522void glEndList () 2613void glEndList ()
2523 2614
2524void glCallList (int list) 2615void glCallList (int list)
2525 2616
2617MODULE = CFPlus PACKAGE = CFPlus::UI::Base
2618
2619PROTOTYPES: DISABLE
2620
2621void
2622find_widget (SV *widget, NV x, NV y)
2623 PPCODE:
2624{
2625 if (within_widget (widget, x, y))
2626 XPUSHs (widget);
2627}
2628

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines