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.315 by root, Wed Jan 18 23:34:44 2012 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
889void SDL_QuitSubSystem (U32 flags) 889void SDL_QuitSubSystem (U32 flags)
890 890
891void SDL_Quit () 891void SDL_Quit ()
892 892
893int SDL_GL_SetAttribute (int attr, int value) 893int SDL_GL_SetAttribute (int attr, int value)
894 C_ARGS: (SDL_GLattr)attr, value
894 895
895int SDL_GL_GetAttribute (int attr) 896int SDL_GL_GetAttribute (int attr)
896 CODE: 897 CODE:
897 if (SDL_GL_GetAttribute (attr, &RETVAL)) 898 if (SDL_GL_GetAttribute ((SDL_GLattr)attr, &RETVAL))
898 XSRETURN_UNDEF; 899 XSRETURN_UNDEF;
899 OUTPUT: 900 OUTPUT:
900 RETVAL 901 RETVAL
901 902
902void 903void
975void 976void
976SDL_GL_SwapBuffers () 977SDL_GL_SwapBuffers ()
977 978
978char * 979char *
979SDL_GetKeyName (int sym) 980SDL_GetKeyName (int sym)
981 C_ARGS: (SDLKey)sym
980 982
981int 983int
982SDL_GetAppState () 984SDL_GetAppState ()
983 985
984int 986int
1212 1214
1213 SDL_LockSurface (surface2); 1215 SDL_LockSurface (surface2);
1214 EXTEND (SP, 6); 1216 EXTEND (SP, 6);
1215 PUSHs (sv_2mortal (newSViv (surface2->w))); 1217 PUSHs (sv_2mortal (newSViv (surface2->w)));
1216 PUSHs (sv_2mortal (newSViv (surface2->h))); 1218 PUSHs (sv_2mortal (newSViv (surface2->h)));
1217 PUSHs (sv_2mortal (newSVpvn (surface2->pixels, surface2->h * surface2->pitch))); 1219 PUSHs (sv_2mortal (newSVpvn ((const char *)surface2->pixels, surface2->h * surface2->pitch)));
1218 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)));
1219 PUSHs (sv_2mortal (newSViv (GL_RGBA))); 1221 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
1220 PUSHs (sv_2mortal (newSViv (GL_UNSIGNED_BYTE))); 1222 PUSHs (sv_2mortal (newSViv (GL_UNSIGNED_BYTE)));
1221 SDL_UnlockSurface (surface2); 1223 SDL_UnlockSurface (surface2);
1222 1224
1294MODULE = Deliantra::Client PACKAGE = DC::Font 1296MODULE = Deliantra::Client PACKAGE = DC::Font
1295 1297
1296PROTOTYPES: DISABLE 1298PROTOTYPES: DISABLE
1297 1299
1298DC::Font 1300DC::Font
1299new_from_file (SV *class, char *path, int id = 0) 1301new_from_file (SV *klass, char *path, int id = 0)
1300 CODE: 1302 CODE:
1301{ 1303{
1302 int count; 1304 int count;
1303 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count); 1305 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count);
1304 RETVAL = pango_fc_font_description_from_pattern (pattern, 0); 1306 RETVAL = pango_fc_font_description_from_pattern (pattern, 0);
1333 PROTOTYPE: 1335 PROTOTYPE:
1334 CODE: 1336 CODE:
1335 tc_restore (); 1337 tc_restore ();
1336 1338
1337DC::Layout 1339DC::Layout
1338new (SV *class) 1340new (SV *klass)
1339 CODE: 1341 CODE:
1340 New (0, RETVAL, 1, struct cf_layout); 1342 New (0, RETVAL, 1, struct cf_layout);
1341 1343
1342 RETVAL->pl = pango_layout_new (opengl_context); 1344 RETVAL->pl = pango_layout_new (opengl_context);
1343 RETVAL->r = 1.; 1345 RETVAL->r = 1.;
1492 1494
1493void 1495void
1494set_height (DC::Layout self, int base_height) 1496set_height (DC::Layout self, int base_height)
1495 CODE: 1497 CODE:
1496 if (self->base_height != base_height) 1498 if (self->base_height != base_height)
1497 { 1499 {
1498 self->base_height = base_height; 1500 self->base_height = base_height;
1499 layout_update_font (self); 1501 layout_update_font (self);
1500 } 1502 }
1501 1503
1502void 1504void
1866MODULE = Deliantra::Client PACKAGE = DC::Map 1868MODULE = Deliantra::Client PACKAGE = DC::Map
1867 1869
1868PROTOTYPES: DISABLE 1870PROTOTYPES: DISABLE
1869 1871
1870DC::Map 1872DC::Map
1871new (SV *class) 1873new (SV *klass)
1872 CODE: 1874 CODE:
1873 New (0, RETVAL, 1, struct map); 1875 New (0, RETVAL, 1, struct map);
1874 RETVAL->x = 0; 1876 RETVAL->x = 0;
1875 RETVAL->y = 0; 1877 RETVAL->y = 0;
1876 RETVAL->w = 0; 1878 RETVAL->w = 0;
2032 self->y += MAP_EXTEND_Y; 2034 self->y += MAP_EXTEND_Y;
2033 } 2035 }
2034} 2036}
2035 2037
2036SV * 2038SV *
2037map1a_update (DC::Map self, SV *data_, int extmap) 2039map1a_update (DC::Map self, SV *data_)
2038 CODE: 2040 CODE:
2039{ 2041{
2040 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 2042 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
2041 uint8_t *data_end = (uint8_t *)SvEND (data_); 2043 uint8_t *data_end = (uint8_t *)SvEND (data_);
2042 mapcell *cell; 2044 mapcell *cell;
2063 2065
2064 //TODO: don't trust server data to be in-range(!) 2066 //TODO: don't trust server data to be in-range(!)
2065 2067
2066 if (flags & 8) 2068 if (flags & 8)
2067 { 2069 {
2070 uint8_t ext, cmd;
2071
2068 if (extmap) 2072 do
2069 { 2073 {
2070 uint8_t ext, cmd; 2074 ext = *data++;
2075 cmd = ext & 0x7f;
2071 2076
2072 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
2073 { 2080 {
2074 ext = *data++;
2075 cmd = ext & 0x7f;
2076
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
2080 {
2081 cell->stat_width = 1; 2081 cell->stat_width = 1;
2082 cell->stat_hp = *data++; 2082 cell->stat_hp = *data++;
2083 }
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++;
2101 } 2083 }
2102 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++;
2103 } 2101 }
2104 else 2102 while (ext & 0x80);
2105 cell->darkness = *data++ + 1;
2106 } 2103 }
2107 2104
2108 for (z = 0; z <= 2; ++z) 2105 for (z = 0; z <= 2; ++z)
2109 if (flags & (4 >> z)) 2106 if (flags & (4 >> z))
2110 { 2107 {
2747 STRLEN len; 2744 STRLEN len;
2748 uint8_t *data, *end; 2745 uint8_t *data, *end;
2749 2746
2750 len = SvLEN (data_sv); 2747 len = SvLEN (data_sv);
2751 SvGROW (data_sv, len + 8); // reserve at least 7+ bytes more 2748 SvGROW (data_sv, len + 8); // reserve at least 7+ bytes more
2752 data = SvPVbyte_nolen (data_sv); 2749 data = (uint8_t *)SvPVbyte_nolen (data_sv);
2753 end = data + len + 8; 2750 end = data + len + 8;
2754 2751
2755 if (len < 5) 2752 if (len < 5)
2756 XSRETURN_EMPTY; 2753 XSRETURN_EMPTY;
2757 2754
2818} 2815}
2819 2816
2820MODULE = Deliantra::Client PACKAGE = DC::RW 2817MODULE = Deliantra::Client PACKAGE = DC::RW
2821 2818
2822DC::RW 2819DC::RW
2823new (SV *class, SV *data_sv) 2820new (SV *klass, SV *data_sv)
2824 CODE: 2821 CODE:
2825{ 2822{
2826 STRLEN datalen; 2823 STRLEN datalen;
2827 char *data = SvPVbyte (data_sv, datalen); 2824 char *data = SvPVbyte (data_sv, datalen);
2828 2825
2830} 2827}
2831 OUTPUT: 2828 OUTPUT:
2832 RETVAL 2829 RETVAL
2833 2830
2834DC::RW 2831DC::RW
2835new_from_file (SV *class, const char *path, const char *mode = "rb") 2832new_from_file (SV *klass, const char *path, const char *mode = "rb")
2836 CODE: 2833 CODE:
2837 RETVAL = SDL_RWFromFile (path, mode); 2834 RETVAL = SDL_RWFromFile (path, mode);
2838 OUTPUT: 2835 OUTPUT:
2839 RETVAL 2836 RETVAL
2840 2837
2949#else 2946#else
2950 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0))); 2947 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2951#endif 2948#endif
2952 2949
2953DC::MixChunk 2950DC::MixChunk
2954new (SV *class, DC::RW rwops) 2951new (SV *klass, DC::RW rwops)
2955 CODE: 2952 CODE:
2956 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2953 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2957 OUTPUT: 2954 OUTPUT:
2958 RETVAL 2955 RETVAL
2959 2956
3029 RETVAL = Mix_PlayingMusic (); 3026 RETVAL = Mix_PlayingMusic ();
3030 OUTPUT: 3027 OUTPUT:
3031 RETVAL 3028 RETVAL
3032 3029
3033DC::MixMusic 3030DC::MixMusic
3034new (SV *class, DC::RW rwops) 3031new (SV *klass, DC::RW rwops)
3035 CODE: 3032 CODE:
3036 RETVAL = Mix_LoadMUS_RW (rwops); 3033 RETVAL = Mix_LoadMUS_RW (rwops);
3037 OUTPUT: 3034 OUTPUT:
3038 RETVAL 3035 RETVAL
3039 3036
3192 gl.BlendFuncSeparateEXT = 0; 3189 gl.BlendFuncSeparateEXT = 0;
3193 3190
3194void 3191void
3195apple_nvidia_bug (int enable) 3192apple_nvidia_bug (int enable)
3196 3193
3197char * 3194const char *
3198gl_vendor () 3195gl_vendor ()
3199 CODE: 3196 CODE:
3200 RETVAL = (char *)glGetString (GL_VENDOR); 3197 RETVAL = (const char *)glGetString (GL_VENDOR);
3201 OUTPUT: 3198 OUTPUT:
3202 RETVAL 3199 RETVAL
3203 3200
3204char * 3201const char *
3205gl_version () 3202gl_version ()
3206 CODE: 3203 CODE:
3207 RETVAL = (char *)glGetString (GL_VERSION); 3204 RETVAL = (const char *)glGetString (GL_VERSION);
3208 OUTPUT: 3205 OUTPUT:
3209 RETVAL 3206 RETVAL
3210 3207
3211char * 3208const char *
3212gl_extensions () 3209gl_extensions ()
3213 CODE: 3210 CODE:
3214 RETVAL = (char *)glGetString (GL_EXTENSIONS); 3211 RETVAL = (const char *)glGetString (GL_EXTENSIONS);
3215 OUTPUT: 3212 OUTPUT:
3216 RETVAL 3213 RETVAL
3217 3214
3218const char *glGetString (GLenum pname) 3215const char *glGetString (GLenum pname)
3216 CODE:
3217 RETVAL = (const char *)glGetString (pname);
3218 OUTPUT:
3219 RETVAL
3219 3220
3220GLint glGetInteger (GLenum pname) 3221GLint glGetInteger (GLenum pname)
3221 CODE: 3222 CODE:
3222 glGetIntegerv (pname, &RETVAL); 3223 glGetIntegerv (pname, &RETVAL);
3223 OUTPUT: 3224 OUTPUT:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines