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.199 by root, Tue Jul 17 13:53:02 2007 UTC vs.
Revision 1.206 by root, Thu Jul 19 23:29:16 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
587 opengl_fontmap = pango_opengl_font_map_new (); 588 opengl_fontmap = pango_opengl_font_map_new ();
588 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0); 589 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0);
589 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap); 590 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap);
590} 591}
591 592
593char *
594SDL_GetError ()
595
592int 596int
593SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE) 597SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE)
594 598
595void 599void
596SDL_Quit () 600SDL_Quit ()
597 601
598void 602void
599SDL_ListModes () 603SDL_ListModes (int rgb, int alpha)
600 PPCODE: 604 PPCODE:
601{ 605{
602 SDL_Rect **m; 606 SDL_Rect **m;
603 607
604 SDL_GL_SetAttribute (SDL_GL_RED_SIZE, 5); 608 SDL_GL_SetAttribute (SDL_GL_RED_SIZE , rgb);
605 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 5); 609 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb);
606 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5); 610 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE , rgb);
607 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, 1); 611 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, alpha);
608 612
609 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15); 613 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
610 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0); 614 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE , 0);
611 615
612 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE, 0); 616 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE , 0);
613 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0); 617 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0);
614 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE, 0); 618 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE , 0);
615 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0); 619 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0);
616 620
617 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 621 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
618#if SDL_VERSION_ATLEAST(1,2,10) 622#if SDL_VERSION_ATLEAST(1,2,10)
619 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1); 623 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1);
620 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1); 624 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1);
621#endif 625#endif
622 626
623 SDL_EnableUNICODE (1);
624 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
625
626 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 627 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
627 628
628 if (m && m != (SDL_Rect **)-1) 629 if (m && m != (SDL_Rect **)-1)
629 while (*m) 630 while (*m)
630 { 631 {
632 if ((*m)->w >= 640 && (*m)->h >= 480)
633 {
631 AV *av = newAV (); 634 AV *av = newAV ();
632 av_push (av, newSViv ((*m)->w)); 635 av_push (av, newSViv ((*m)->w));
633 av_push (av, newSViv ((*m)->h)); 636 av_push (av, newSViv ((*m)->h));
637 av_push (av, newSViv (rgb));
638 av_push (av, newSViv (alpha));
634 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 639 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
640 }
635 641
636 ++m; 642 ++m;
637 } 643 }
638} 644}
639 645
640char *
641SDL_GetError ()
642
643int 646int
644SDL_SetVideoMode (int w, int h, int fullscreen) 647SDL_SetVideoMode (int w, int h, int rgb, int alpha, int fullscreen)
645 CODE: 648 CODE:
649{
650 SDL_EnableUNICODE (1);
651 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
652
653 SDL_GL_SetAttribute (SDL_GL_RED_SIZE , rgb);
654 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb);
655 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE , rgb);
656 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, alpha);
657
646 RETVAL = !!SDL_SetVideoMode ( 658 RETVAL = !!SDL_SetVideoMode (
647 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0) 659 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0)
648 ); 660 );
661
649 if (RETVAL) 662 if (RETVAL)
650 { 663 {
651 av_clear (texture_av); 664 av_clear (texture_av);
652 665
653 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 666 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+");
654# define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 667#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
655# include "glfunc.h" 668#include "glfunc.h"
656# undef GL_FUNC 669#undef GL_FUNC
657
658 } 670 }
671}
659 OUTPUT: 672 OUTPUT:
660 RETVAL 673 RETVAL
661 674
662void 675void
663SDL_GL_SwapBuffers () 676SDL_GL_SwapBuffers ()
920#endif 933#endif
921} 934}
922 935
923MODULE = CFPlus PACKAGE = CFPlus::Font 936MODULE = CFPlus PACKAGE = CFPlus::Font
924 937
938PROTOTYPES: DISABLE
939
925CFPlus::Font 940CFPlus::Font
926new_from_file (SV *class, char *path, int id = 0) 941new_from_file (SV *class, char *path, int id = 0)
927 CODE: 942 CODE:
928{ 943{
929 int count; 944 int count;
939 CODE: 954 CODE:
940 pango_font_description_free (self); 955 pango_font_description_free (self);
941 956
942void 957void
943make_default (CFPlus::Font self) 958make_default (CFPlus::Font self)
959 PROTOTYPE: $
944 CODE: 960 CODE:
945 default_font = self; 961 default_font = self;
946 962
947MODULE = CFPlus PACKAGE = CFPlus::Layout 963MODULE = CFPlus PACKAGE = CFPlus::Layout
948 964
965PROTOTYPES: DISABLE
966
949void 967void
950reset_glyph_cache () 968reset_glyph_cache ()
969 PROTOTYPE:
951 CODE: 970 CODE:
952 tc_clear (); 971 tc_clear ();
953 972
954CFPlus::Layout 973CFPlus::Layout
955new (SV *class) 974new (SV *class)
1242 flags 1261 flags
1243 ); 1262 );
1244 1263
1245MODULE = CFPlus PACKAGE = CFPlus::Texture 1264MODULE = CFPlus PACKAGE = CFPlus::Texture
1246 1265
1266PROTOTYPES: ENABLE
1267
1247int minpot (int n) 1268int minpot (int n)
1248 1269
1249void 1270void
1250pad2pot (SV *data_, SV *w_, SV *h_) 1271pad (SV *data_, int ow, int oh, int nw, int nh)
1251 CODE: 1272 CODE:
1252{ 1273{
1253 int ow = SvIV (w_); 1274 if ((nw != ow || nh != oh) && SvOK (data_))
1254 int oh = SvIV (h_);
1255
1256 if (ow && oh)
1257 { 1275 {
1258 int nw = minpot (ow);
1259 int nh = minpot (oh);
1260
1261 if (nw != ow || nh != oh)
1262 {
1263 if (SvOK (data_))
1264 {
1265 STRLEN datalen; 1276 STRLEN datalen;
1266 char *data = SvPVbyte (data_, datalen); 1277 char *data = SvPVbyte (data_, datalen);
1267 int bpp = datalen / (ow * oh); 1278 int bpp = datalen / (ow * oh);
1268 SV *result_ = sv_2mortal (newSV (nw * nh * bpp)); 1279 SV *result_ = sv_2mortal (newSV (nw * nh * bpp));
1269 1280
1270 SvPOK_only (result_); 1281 SvPOK_only (result_);
1271 SvCUR_set (result_, nw * nh * bpp); 1282 SvCUR_set (result_, nw * nh * bpp);
1272 1283
1273 memset (SvPVX (result_), 0, nw * nh * bpp); 1284 memset (SvPVX (result_), 0, nw * nh * bpp);
1274 while (oh--) 1285 while (oh--)
1275 memcpy (SvPVX (result_) + oh * nw * bpp, data + oh * ow * bpp, ow * bpp); 1286 memcpy (SvPVX (result_) + oh * nw * bpp, data + oh * ow * bpp, ow * bpp);
1276 1287
1277 sv_setsv (data_, result_); 1288 sv_setsv (data_, result_);
1278 }
1279
1280 sv_setiv (w_, nw);
1281 sv_setiv (h_, nh);
1282 }
1283 } 1289 }
1284} 1290}
1285 1291
1286void 1292void
1287draw_quad (SV *self, float x, float y, float w = 0., float h = 0.) 1293draw_quad (SV *self, float x, float y, float w = 0., float h = 0.)
1342} 1348}
1343 OUTPUT: 1349 OUTPUT:
1344 RETVAL 1350 RETVAL
1345 1351
1346MODULE = CFPlus PACKAGE = CFPlus::Map 1352MODULE = CFPlus PACKAGE = CFPlus::Map
1353
1354PROTOTYPES: DISABLE
1347 1355
1348CFPlus::Map 1356CFPlus::Map
1349new (SV *class) 1357new (SV *class)
1350 CODE: 1358 CODE:
1351 New (0, RETVAL, 1, struct map); 1359 New (0, RETVAL, 1, struct map);
1966void 1974void
1967fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh) 1975fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh)
1968 PPCODE: 1976 PPCODE:
1969{ 1977{
1970 int x, y; 1978 int x, y;
1979 int sw1 = sw + 2;
1980 int sh1 = sh + 2;
1981 int sh3 = sh * 3;
1971 int sw4 = (sw + 3) & ~3; 1982 int sw34 = (sw * 3 + 3) & ~3;
1983 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
1972 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh)); 1984 SV *darkness3_sv = sv_2mortal (newSV (sw34 * sh3));
1973 uint8_t *darkness = (uint8_t *)SvPVX (darkness_sv); 1985 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
1974 1986
1975 memset (darkness, 255, sw4 * sh);
1976 SvPOK_only (darkness_sv); 1987 SvPOK_only (darkness3_sv);
1977 SvCUR_set (darkness_sv, sw4 * sh); 1988 SvCUR_set (darkness3_sv, sw34 * sh3);
1978 1989
1979 mx += self->x; 1990 mx += self->x - 1;
1980 my += self->y; 1991 my += self->y - 1;
1981 1992
1993 memset (darkness1, 255, sw1 * sh1);
1994
1982 for (y = 0; y < sh; y++) 1995 for (y = 0; y < sh1; y++)
1983 if (0 <= y + my && y + my < self->rows) 1996 if (0 <= y + my && y + my < self->rows)
1984 { 1997 {
1985 maprow *row = self->row + (y + my); 1998 maprow *row = self->row + (y + my);
1986 1999
1987 for (x = 0; x < sw; x++) 2000 for (x = 0; x < sw1; x++)
1988 if (row->c0 <= x + mx && x + mx < row->c1) 2001 if (row->c0 <= x + mx && x + mx < row->c1)
1989 { 2002 {
1990 mapcell *cell = row->col + (x + mx - row->c0); 2003 mapcell *cell = row->col + (x + mx - row->c0);
1991 2004
1992 darkness[y * sw4 + x] = cell->darkness 2005 darkness1 [y * sw1 + x] = cell->darkness
1993 ? 255 - (cell->darkness - 1) 2006 ? 255 - (cell->darkness - 1)
1994 : 255 - FOW_DARKNESS; 2007 : 255 - FOW_DARKNESS;
1995 } 2008 }
1996 } 2009 }
1997 2010
2011 for (y = 0; y < sh; ++y)
2012 for (x = 0; x < sw; ++x)
2013 {
2014 uint8_t d11 = darkness1 [(y ) * sw1 + x ];
2015 uint8_t d21 = darkness1 [(y ) * sw1 + x + 1];
2016 uint8_t d31 = darkness1 [(y ) * sw1 + x + 2];
2017 uint8_t d12 = darkness1 [(y + 1) * sw1 + x ];
2018 uint8_t d22 = darkness1 [(y + 1) * sw1 + x + 1];
2019 uint8_t d32 = darkness1 [(y + 1) * sw1 + x + 2];
2020 uint8_t d13 = darkness1 [(y + 2) * sw1 + x ];
2021 uint8_t d23 = darkness1 [(y + 2) * sw1 + x + 1];
2022 uint8_t d33 = darkness1 [(y + 2) * sw1 + x + 2];
2023
2024 uint8_t r11 = (d11 + d21 + d12) / 3;
2025 uint8_t r21 = d21;
2026 uint8_t r31 = (d21 + d31 + d32) / 3;
2027
2028 uint8_t r12 = d12;
2029 uint8_t r22 = d22;
2030 uint8_t r32 = d32;
2031
2032 uint8_t r13 = (d13 + d23 + d12) / 3;
2033 uint8_t r23 = d23;
2034 uint8_t r33 = (d23 + d33 + d32) / 3;
2035
2036 darkness3 [(y * 3 ) * sw34 + (x * 3 )] = MAX (d22, r11);
2037 darkness3 [(y * 3 ) * sw34 + (x * 3 + 1)] = MAX (d22, r21);
2038 darkness3 [(y * 3 ) * sw34 + (x * 3 + 2)] = MAX (d22, r31);
2039 darkness3 [(y * 3 + 1) * sw34 + (x * 3 )] = MAX (d22, r12);
2040 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 1)] = MAX (d22, r22);
2041 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 2)] = MAX (d22, r32);
2042 darkness3 [(y * 3 + 2) * sw34 + (x * 3 )] = MAX (d22, r13);
2043 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 1)] = MAX (d22, r23);
2044 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 2)] = MAX (d22, r33);
2045 }
2046
2047 free (darkness1);
2048
1998 EXTEND (SP, 3); 2049 EXTEND (SP, 3);
1999 PUSHs (sv_2mortal (newSViv (sw4))); 2050 PUSHs (sv_2mortal (newSViv (sw34)));
2000 PUSHs (sv_2mortal (newSViv (sh))); 2051 PUSHs (sv_2mortal (newSViv (sh3)));
2001 PUSHs (darkness_sv); 2052 PUSHs (darkness3_sv);
2002} 2053}
2003 2054
2004SV * 2055SV *
2005get_rect (CFPlus::Map self, int x0, int y0, int w, int h) 2056get_rect (CFPlus::Map self, int x0, int y0, int w, int h)
2006 CODE: 2057 CODE:
2140 } 2191 }
2141} 2192}
2142 2193
2143MODULE = CFPlus PACKAGE = CFPlus::MixChunk 2194MODULE = CFPlus PACKAGE = CFPlus::MixChunk
2144 2195
2196PROTOTYPES: DISABLE
2197
2145CFPlus::MixChunk 2198CFPlus::MixChunk
2146new_from_file (SV *class, char *path) 2199new_from_file (SV *class, char *path)
2147 CODE: 2200 CODE:
2148 RETVAL = Mix_LoadWAV (path); 2201 RETVAL = Mix_LoadWAV (path);
2149 OUTPUT: 2202 OUTPUT:
2170 2223
2171MODULE = CFPlus PACKAGE = CFPlus::MixMusic 2224MODULE = CFPlus PACKAGE = CFPlus::MixMusic
2172 2225
2173int 2226int
2174volume (int volume = -1) 2227volume (int volume = -1)
2228 PROTOTYPE: ;$
2175 CODE: 2229 CODE:
2176 RETVAL = Mix_VolumeMusic (volume); 2230 RETVAL = Mix_VolumeMusic (volume);
2177 OUTPUT: 2231 OUTPUT:
2178 RETVAL 2232 RETVAL
2179 2233
2209 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position); 2263 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position);
2210 OUTPUT: 2264 OUTPUT:
2211 RETVAL 2265 RETVAL
2212 2266
2213MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2267MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2268
2269PROTOTYPES: ENABLE
2214 2270
2215BOOT: 2271BOOT:
2216{ 2272{
2217 HV *stash = gv_stashpv ("CFPlus::OpenGL", 1); 2273 HV *stash = gv_stashpv ("CFPlus::OpenGL", 1);
2218 static const struct { 2274 static const struct {
2234 const_iv (GL_ALPHA_TEST), 2290 const_iv (GL_ALPHA_TEST),
2235 const_iv (GL_NORMALIZE), 2291 const_iv (GL_NORMALIZE),
2236 const_iv (GL_RESCALE_NORMAL), 2292 const_iv (GL_RESCALE_NORMAL),
2237 const_iv (GL_FRONT), 2293 const_iv (GL_FRONT),
2238 const_iv (GL_BACK), 2294 const_iv (GL_BACK),
2295 const_iv (GL_AUX0),
2239 const_iv (GL_AND), 2296 const_iv (GL_AND),
2240 const_iv (GL_ONE), 2297 const_iv (GL_ONE),
2241 const_iv (GL_ZERO), 2298 const_iv (GL_ZERO),
2242 const_iv (GL_SRC_ALPHA), 2299 const_iv (GL_SRC_ALPHA),
2243 const_iv (GL_DST_ALPHA), 2300 const_iv (GL_DST_ALPHA),
2298 const_iv (GL_QUAD_STRIP), 2355 const_iv (GL_QUAD_STRIP),
2299 const_iv (GL_TRIANGLES), 2356 const_iv (GL_TRIANGLES),
2300 const_iv (GL_TRIANGLE_STRIP), 2357 const_iv (GL_TRIANGLE_STRIP),
2301 const_iv (GL_TRIANGLE_FAN), 2358 const_iv (GL_TRIANGLE_FAN),
2302 const_iv (GL_PERSPECTIVE_CORRECTION_HINT), 2359 const_iv (GL_PERSPECTIVE_CORRECTION_HINT),
2360 const_iv (GL_POINT_SMOOTH_HINT),
2361 const_iv (GL_LINE_SMOOTH_HINT),
2362 const_iv (GL_POLYGON_SMOOTH_HINT),
2363 const_iv (GL_GENERATE_MIPMAP_HINT),
2303 const_iv (GL_FASTEST), 2364 const_iv (GL_FASTEST),
2365 const_iv (GL_DONT_CARE),
2366 const_iv (GL_NICEST),
2304 const_iv (GL_V2F), 2367 const_iv (GL_V2F),
2305 const_iv (GL_V3F), 2368 const_iv (GL_V3F),
2306 const_iv (GL_T2F_V3F), 2369 const_iv (GL_T2F_V3F),
2307 const_iv (GL_T2F_N3F_V3F), 2370 const_iv (GL_T2F_N3F_V3F),
2308# undef const_iv 2371# undef const_iv
2334 CODE: 2397 CODE:
2335 RETVAL = (char *)glGetString (GL_EXTENSIONS); 2398 RETVAL = (char *)glGetString (GL_EXTENSIONS);
2336 OUTPUT: 2399 OUTPUT:
2337 RETVAL 2400 RETVAL
2338 2401
2339char *glGetString (GLenum pname) 2402const char *glGetString (GLenum pname)
2340 2403
2341GLint glGetInteger (GLenum pname) 2404GLint glGetInteger (GLenum pname)
2342 CODE: 2405 CODE:
2343 glGetIntegerv (pname, &RETVAL); 2406 glGetIntegerv (pname, &RETVAL);
2344 OUTPUT: 2407 OUTPUT:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines