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.307 by root, Thu Oct 14 03:44:18 2010 UTC vs.
Revision 1.320 by root, Sun Nov 18 01:00:10 2018 UTC

48#endif 48#endif
49 49
50#define PANGO_ENABLE_BACKEND 50#define PANGO_ENABLE_BACKEND
51#define G_DISABLE_CAST_CHECKS 51#define G_DISABLE_CAST_CHECKS
52 52
53#include <glib/gmacros.h> 53#include <glib.h>
54 54
55#include <pango/pango.h> 55#include <pango/pango.h>
56 56
57#ifndef PANGO_VERSION_CHECK 57#ifndef PANGO_VERSION_CHECK
58# define PANGO_VERSION_CHECK(a,b,c) 0 58# define PANGO_VERSION_CHECK(a,b,c) 0
184{ 184{
185 GSList *attrs = run->item->analysis.extra_attrs; 185 GSList *attrs = run->item->analysis.extra_attrs;
186 186
187 while (attrs) 187 while (attrs)
188 { 188 {
189 PangoAttribute *attr = attrs->data; 189 PangoAttribute *attr = (PangoAttribute *)attrs->data;
190 190
191 if (attr->klass->type == PANGO_ATTR_SHAPE) 191 if (attr->klass->type == PANGO_ATTR_SHAPE)
192 return 1; 192 return 1;
193 193
194 attrs = attrs->next; 194 attrs = attrs->next;
212static void 212static void
213substitute_func (FcPattern *pattern, gpointer data) 213substitute_func (FcPattern *pattern, gpointer data)
214{ 214{
215 FcPatternAddBool (pattern, FC_HINTING, 1); 215 FcPatternAddBool (pattern, FC_HINTING, 1);
216#ifdef FC_HINT_STYLE 216#ifdef FC_HINT_STYLE
217 FcPatternAddBool (pattern, FC_HINT_STYLE, FC_HINT_FULL); 217 FcPatternAddInteger (pattern, FC_HINT_STYLE, FC_HINT_FULL);
218#endif 218#endif
219 FcPatternAddBool (pattern, FC_AUTOHINT, 0); 219 FcPatternAddBool (pattern, FC_AUTOHINT, 0);
220} 220}
221 221
222static void 222static void
577 577
578 return mod; 578 return mod;
579} 579}
580 580
581static void 581static void
582deliantra_main () 582deliantra_main (SV *real_main)
583{ 583{
584 char *argv[] = { 0 }; 584 dSP;
585 call_argv ("::main", G_DISCARD | G_VOID, argv); 585
586 PUSHMARK (SP);
587 call_sv (real_main, G_DISCARD | G_VOID);
586} 588}
587 589
588#ifdef __MACOSX__ 590#ifdef __MACOSX__
591 static SV *real_main;
592
589 /* to due surprising braindamage on the side of SDL design, we 593 /* to due surprising braindamage on the side of SDL design, we
590 * do some mind-boggling hack here: SDL requires a custom main() 594 * do some mind-boggling hack here: SDL requires a custom main()
591 * on OS X, so... we provide one and call the original main(), which, 595 * on OS X, so... we provide one and call the original main(), which,
592 * due to share dlibrary magic, calls -lSDLmain's main, not perl's main, 596 * due to shared library magic, calls -lSDLmain's main, not perl's main,
593 * and which calls our main (== SDL_main) back. 597 * and which calls our main (== SDL_main) back.
594 */ 598 */
595 extern C_LINKAGE int 599 extern C_LINKAGE int
596 main (int argc, char *argv[]) 600 main (int argc, char *argv[])
597 { 601 {
598 deliantra_main (); 602 deliantra_main (real_main);
599 } 603 }
600 604
601 #undef main 605 #undef main
602 606
603 extern C_LINKAGE int main (int argc, char *argv[]); 607 extern C_LINKAGE int main (int argc, char *argv[]);
604 608
605 static void 609 static void
606 SDL_braino (void) 610 SDL_main_hack (SV *real_main_)
607 { 611 {
612 real_main = real_main_;
613
608 char *argv[] = { "deliantra client", 0 }; 614 char *argv[] = { "deliantra client", 0 };
609 (main) (1, argv); 615 (main) (1, argv);
610 } 616 }
611#else 617#else
612 static void 618 static void
613 SDL_braino (void) 619 SDL_main_hack (SV *real_main)
614 { 620 {
615 deliantra_main (); 621 deliantra_main (real_main);
616 } 622 }
617#endif 623#endif
618 624
619MODULE = Deliantra::Client PACKAGE = DC 625MODULE = Deliantra::Client PACKAGE = DC
620 626
821 827
822 const_iv (FOW_DARKNESS) 828 const_iv (FOW_DARKNESS)
823# undef const_iv 829# undef const_iv
824 }; 830 };
825 831
826 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 832 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
827 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 833 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
828 834
829 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK); 835 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK);
830 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE); 836 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE);
831} 837}
832 838
871#endif 877#endif
872} 878}
873 879
874char *SDL_GetError () 880char *SDL_GetError ()
875 881
876void SDL_braino () 882void SDL_main_hack (SV *real_main)
883 PROTOTYPE: &
877 884
878int SDL_Init (U32 flags) 885int SDL_Init (U32 flags)
879 886
880int SDL_InitSubSystem (U32 flags) 887int SDL_InitSubSystem (U32 flags)
881 888
882void SDL_QuitSubSystem (U32 flags) 889void SDL_QuitSubSystem (U32 flags)
883 890
884void SDL_Quit () 891void SDL_Quit ()
885 892
886int SDL_GL_SetAttribute (int attr, int value) 893int SDL_GL_SetAttribute (int attr, int value)
894 C_ARGS: (SDL_GLattr)attr, value
887 895
888int SDL_GL_GetAttribute (int attr) 896int SDL_GL_GetAttribute (int attr)
889 CODE: 897 CODE:
890 if (SDL_GL_GetAttribute (attr, &RETVAL)) 898 if (SDL_GL_GetAttribute ((SDL_GLattr)attr, &RETVAL))
891 XSRETURN_UNDEF; 899 XSRETURN_UNDEF;
892 OUTPUT: 900 OUTPUT:
893 RETVAL 901 RETVAL
894 902
895void 903void
950 ); 958 );
951 959
952 if (RETVAL) 960 if (RETVAL)
953 { 961 {
954 av_clear (texture_av); 962 av_clear (texture_av);
955
956 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
957#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 963#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
958#include "glfunc.h" 964#include "glfunc.h"
959#undef GL_FUNC 965#undef GL_FUNC
960
961 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB; 966 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB;
962 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB; 967 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB;
963 } 968 }
964} 969}
965 OUTPUT: 970 OUTPUT:
966 RETVAL 971 RETVAL
967 972
968void 973void
974SDL_WM_SetCaption (const char *title, const char *icon)
975
976void
969SDL_GL_SwapBuffers () 977SDL_GL_SwapBuffers ()
970 978
971char * 979char *
972SDL_GetKeyName (int sym) 980SDL_GetKeyName (int sym)
981 C_ARGS: (SDLKey)sym
973 982
974int 983int
975SDL_GetAppState () 984SDL_GetAppState ()
976 985
977int 986int
978SDL_GetModState () 987SDL_GetModState ()
979 988
989int
990SDL_WaitEvent ()
991 C_ARGS: 0
992
980void 993void
994SDL_PumpEvents ()
995
996void
981poll_events () 997peep_events ()
982 PPCODE: 998 PPCODE:
983{ 999{
984 SDL_Event ev; 1000 SDL_Event ev;
985 1001
986 SDL_PumpEvents (); 1002 SDL_PumpEvents ();
1139 OUTPUT: 1155 OUTPUT:
1140 RETVAL 1156 RETVAL
1141 1157
1142void 1158void
1143IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG) 1159IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG)
1160
1161# MIX_INIT_MP3 gives smpeg + libstdc++ + libgcc_s
1162void
1163Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_OGG)
1144 1164
1145void 1165void
1146load_image_inline (SV *image_) 1166load_image_inline (SV *image_)
1147 ALIAS: 1167 ALIAS:
1148 load_image_file = 1 1168 load_image_file = 1
1194 1214
1195 SDL_LockSurface (surface2); 1215 SDL_LockSurface (surface2);
1196 EXTEND (SP, 6); 1216 EXTEND (SP, 6);
1197 PUSHs (sv_2mortal (newSViv (surface2->w))); 1217 PUSHs (sv_2mortal (newSViv (surface2->w)));
1198 PUSHs (sv_2mortal (newSViv (surface2->h))); 1218 PUSHs (sv_2mortal (newSViv (surface2->h)));
1199 PUSHs (sv_2mortal (newSVpvn (surface2->pixels, surface2->h * surface2->pitch))); 1219 PUSHs (sv_2mortal (newSVpvn ((const char *)surface2->pixels, surface2->h * surface2->pitch)));
1200 PUSHs (sv_2mortal (newSViv (surface->flags & (SDL_SRCCOLORKEY | SDL_SRCALPHA) ? GL_RGBA : GL_RGB))); 1220 PUSHs (sv_2mortal (newSViv (surface->flags & (SDL_SRCCOLORKEY | SDL_SRCALPHA) ? GL_RGBA : GL_RGB)));
1201 PUSHs (sv_2mortal (newSViv (GL_RGBA))); 1221 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
1202 PUSHs (sv_2mortal (newSViv (GL_UNSIGNED_BYTE))); 1222 PUSHs (sv_2mortal (newSViv (GL_UNSIGNED_BYTE)));
1203 SDL_UnlockSurface (surface2); 1223 SDL_UnlockSurface (surface2);
1204 1224
1276MODULE = Deliantra::Client PACKAGE = DC::Font 1296MODULE = Deliantra::Client PACKAGE = DC::Font
1277 1297
1278PROTOTYPES: DISABLE 1298PROTOTYPES: DISABLE
1279 1299
1280DC::Font 1300DC::Font
1281new_from_file (SV *class, char *path, int id = 0) 1301new_from_file (SV *klass, char *path, int id = 0)
1282 CODE: 1302 CODE:
1283{ 1303{
1284 int count; 1304 int count;
1285 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count); 1305 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count);
1286 RETVAL = pango_fc_font_description_from_pattern (pattern, 0); 1306 RETVAL = pango_fc_font_description_from_pattern (pattern, 0);
1315 PROTOTYPE: 1335 PROTOTYPE:
1316 CODE: 1336 CODE:
1317 tc_restore (); 1337 tc_restore ();
1318 1338
1319DC::Layout 1339DC::Layout
1320new (SV *class) 1340new (SV *klass)
1321 CODE: 1341 CODE:
1322 New (0, RETVAL, 1, struct cf_layout); 1342 New (0, RETVAL, 1, struct cf_layout);
1323 1343
1324 RETVAL->pl = pango_layout_new (opengl_context); 1344 RETVAL->pl = pango_layout_new (opengl_context);
1325 RETVAL->r = 1.; 1345 RETVAL->r = 1.;
1474 1494
1475void 1495void
1476set_height (DC::Layout self, int base_height) 1496set_height (DC::Layout self, int base_height)
1477 CODE: 1497 CODE:
1478 if (self->base_height != base_height) 1498 if (self->base_height != base_height)
1479 { 1499 {
1480 self->base_height = base_height; 1500 self->base_height = base_height;
1481 layout_update_font (self); 1501 layout_update_font (self);
1482 } 1502 }
1483 1503
1484void 1504void
1848MODULE = Deliantra::Client PACKAGE = DC::Map 1868MODULE = Deliantra::Client PACKAGE = DC::Map
1849 1869
1850PROTOTYPES: DISABLE 1870PROTOTYPES: DISABLE
1851 1871
1852DC::Map 1872DC::Map
1853new (SV *class) 1873new (SV *klass)
1854 CODE: 1874 CODE:
1855 New (0, RETVAL, 1, struct map); 1875 New (0, RETVAL, 1, struct map);
1856 RETVAL->x = 0; 1876 RETVAL->x = 0;
1857 RETVAL->y = 0; 1877 RETVAL->y = 0;
1858 RETVAL->w = 0; 1878 RETVAL->w = 0;
2014 self->y += MAP_EXTEND_Y; 2034 self->y += MAP_EXTEND_Y;
2015 } 2035 }
2016} 2036}
2017 2037
2018SV * 2038SV *
2019map1a_update (DC::Map self, SV *data_, int extmap) 2039map1a_update (DC::Map self, SV *data_)
2020 CODE: 2040 CODE:
2021{ 2041{
2022 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 2042 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
2023 uint8_t *data_end = (uint8_t *)SvEND (data_); 2043 uint8_t *data_end = (uint8_t *)SvEND (data_);
2024 mapcell *cell; 2044 mapcell *cell;
2045 2065
2046 //TODO: don't trust server data to be in-range(!) 2066 //TODO: don't trust server data to be in-range(!)
2047 2067
2048 if (flags & 8) 2068 if (flags & 8)
2049 { 2069 {
2070 uint8_t ext, cmd;
2071
2050 if (extmap) 2072 do
2051 { 2073 {
2052 uint8_t ext, cmd; 2074 ext = *data++;
2075 cmd = ext & 0x7f;
2053 2076
2054 do 2077 if (cmd < 4)
2078 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
2079 else if (cmd == 5) // health
2055 { 2080 {
2056 ext = *data++;
2057 cmd = ext & 0x7f;
2058
2059 if (cmd < 4)
2060 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
2061 else if (cmd == 5) // health
2062 {
2063 cell->stat_width = 1; 2081 cell->stat_width = 1;
2064 cell->stat_hp = *data++; 2082 cell->stat_hp = *data++;
2065 }
2066 else if (cmd == 6) // monster width
2067 cell->stat_width = *data++ + 1;
2068 else if (cmd == 0x47)
2069 {
2070 if (*data == 1) cell->player = data [1];
2071 else if (*data == 2) cell->player = data [2] + (data [1] << 8);
2072 else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16);
2073 else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24);
2074
2075 data += *data + 1;
2076 }
2077 else if (cmd == 8) // cell flags
2078 cell->flags = *data++;
2079 else if (ext & 0x40) // unknown, multibyte => skip
2080 data += *data + 1;
2081 else
2082 data++;
2083 } 2083 }
2084 while (ext & 0x80); 2084 else if (cmd == 6) // monster width
2085 cell->stat_width = *data++ + 1;
2086 else if (cmd == 0x47)
2087 {
2088 if (*data == 1) cell->player = data [1];
2089 else if (*data == 2) cell->player = data [2] + (data [1] << 8);
2090 else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16);
2091 else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24);
2092
2093 data += *data + 1;
2094 }
2095 else if (cmd == 8) // cell flags
2096 cell->flags = *data++;
2097 else if (ext & 0x40) // unknown, multibyte => skip
2098 data += *data + 1;
2099 else
2100 data++;
2085 } 2101 }
2086 else 2102 while (ext & 0x80);
2087 cell->darkness = *data++ + 1;
2088 } 2103 }
2089 2104
2090 for (z = 0; z <= 2; ++z) 2105 for (z = 0; z <= 2; ++z)
2091 if (flags & (4 >> z)) 2106 if (flags & (4 >> z))
2092 { 2107 {
2729 STRLEN len; 2744 STRLEN len;
2730 uint8_t *data, *end; 2745 uint8_t *data, *end;
2731 2746
2732 len = SvLEN (data_sv); 2747 len = SvLEN (data_sv);
2733 SvGROW (data_sv, len + 8); // reserve at least 7+ bytes more 2748 SvGROW (data_sv, len + 8); // reserve at least 7+ bytes more
2734 data = SvPVbyte_nolen (data_sv); 2749 data = (uint8_t *)SvPVbyte_nolen (data_sv);
2735 end = data + len + 8; 2750 end = data + len + 8;
2736 2751
2737 if (len < 5) 2752 if (len < 5)
2738 XSRETURN_EMPTY; 2753 XSRETURN_EMPTY;
2739 2754
2800} 2815}
2801 2816
2802MODULE = Deliantra::Client PACKAGE = DC::RW 2817MODULE = Deliantra::Client PACKAGE = DC::RW
2803 2818
2804DC::RW 2819DC::RW
2805new (SV *class, SV *data_sv) 2820new (SV *klass, SV *data_sv)
2806 CODE: 2821 CODE:
2807{ 2822{
2808 STRLEN datalen; 2823 STRLEN datalen;
2809 char *data = SvPVbyte (data_sv, datalen); 2824 char *data = SvPVbyte (data_sv, datalen);
2810 2825
2812} 2827}
2813 OUTPUT: 2828 OUTPUT:
2814 RETVAL 2829 RETVAL
2815 2830
2816DC::RW 2831DC::RW
2817new_from_file (SV *class, const char *path, const char *mode = "rb") 2832new_from_file (SV *klass, const char *path, const char *mode = "rb")
2818 CODE: 2833 CODE:
2819 RETVAL = SDL_RWFromFile (path, mode); 2834 RETVAL = SDL_RWFromFile (path, mode);
2820 OUTPUT: 2835 OUTPUT:
2821 RETVAL 2836 RETVAL
2822 2837
2931#else 2946#else
2932 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0))); 2947 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2933#endif 2948#endif
2934 2949
2935DC::MixChunk 2950DC::MixChunk
2936new (SV *class, DC::RW rwops) 2951new (SV *klass, DC::RW rwops)
2937 CODE: 2952 CODE:
2938 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2953 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2939 OUTPUT: 2954 OUTPUT:
2940 RETVAL 2955 RETVAL
2941 2956
3011 RETVAL = Mix_PlayingMusic (); 3026 RETVAL = Mix_PlayingMusic ();
3012 OUTPUT: 3027 OUTPUT:
3013 RETVAL 3028 RETVAL
3014 3029
3015DC::MixMusic 3030DC::MixMusic
3016new (SV *class, DC::RW rwops) 3031new (SV *klass, DC::RW rwops)
3017 CODE: 3032 CODE:
3018 RETVAL = Mix_LoadMUS_RW (rwops); 3033 RETVAL = Mix_LoadMUS_RW (rwops);
3019 OUTPUT: 3034 OUTPUT:
3020 RETVAL 3035 RETVAL
3021 3036
3158 const_iv (GL_FUNC_SUBTRACT), 3173 const_iv (GL_FUNC_SUBTRACT),
3159 const_iv (GL_FUNC_REVERSE_SUBTRACT), 3174 const_iv (GL_FUNC_REVERSE_SUBTRACT),
3160# undef const_iv 3175# undef const_iv
3161 }; 3176 };
3162 3177
3163 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 3178 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
3164 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 3179 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
3165 3180
3166 texture_av = newAV (); 3181 texture_av = newAV ();
3167 AvREAL_off (texture_av); 3182 AvREAL_off (texture_av);
3168} 3183}
3169 3184
3174 gl.BlendFuncSeparateEXT = 0; 3189 gl.BlendFuncSeparateEXT = 0;
3175 3190
3176void 3191void
3177apple_nvidia_bug (int enable) 3192apple_nvidia_bug (int enable)
3178 3193
3179char * 3194const char *
3180gl_vendor () 3195gl_vendor ()
3181 CODE: 3196 CODE:
3182 RETVAL = (char *)glGetString (GL_VENDOR); 3197 RETVAL = (const char *)glGetString (GL_VENDOR);
3183 OUTPUT: 3198 OUTPUT:
3184 RETVAL 3199 RETVAL
3185 3200
3186char * 3201const char *
3187gl_version () 3202gl_version ()
3188 CODE: 3203 CODE:
3189 RETVAL = (char *)glGetString (GL_VERSION); 3204 RETVAL = (const char *)glGetString (GL_VERSION);
3190 OUTPUT: 3205 OUTPUT:
3191 RETVAL 3206 RETVAL
3192 3207
3193char * 3208const char *
3194gl_extensions () 3209gl_extensions ()
3195 CODE: 3210 CODE:
3196 RETVAL = (char *)glGetString (GL_EXTENSIONS); 3211 RETVAL = (const char *)glGetString (GL_EXTENSIONS);
3197 OUTPUT: 3212 OUTPUT:
3198 RETVAL 3213 RETVAL
3199 3214
3200const char *glGetString (GLenum pname) 3215const char *glGetString (GLenum pname)
3216 CODE:
3217 RETVAL = (const char *)glGetString (pname);
3218 OUTPUT:
3219 RETVAL
3201 3220
3202GLint glGetInteger (GLenum pname) 3221GLint glGetInteger (GLenum pname)
3203 CODE: 3222 CODE:
3204 glGetIntegerv (pname, &RETVAL); 3223 glGetIntegerv (pname, &RETVAL);
3205 OUTPUT: 3224 OUTPUT:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines