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.245 by root, Fri Dec 28 15:05:20 2007 UTC vs.
Revision 1.260 by root, Tue May 20 20:29:47 2008 UTC

46 46
47#include <glib/gmacros.h> 47#include <glib/gmacros.h>
48 48
49#include <pango/pango.h> 49#include <pango/pango.h>
50 50
51#ifndef PANGO_VERSION_CHECK
52# define PANGO_VERSION_CHECK(a,b,c) 0
53#endif
54
55#if !PANGO_VERSION_CHECK (1, 15, 2)
56# define pango_layout_get_line_readonly pango_layout_get_line
57# define pango_layout_get_lines_readonly pango_layout_get_lines
58# define pango_layout_iter_get_line_readonly pango_layout_iter_get_line
59# define pango_layout_iter_get_run_readonly pango_layout_iter_get_run
60#endif
61
51#ifndef _WIN32 62#ifndef _WIN32
52# include <sys/types.h> 63# include <sys/types.h>
53# include <sys/socket.h> 64# include <sys/socket.h>
54# include <netinet/in.h> 65# include <netinet/in.h>
55# include <netinet/tcp.h> 66# include <netinet/tcp.h>
63#define MAP_EXTEND_X 32 74#define MAP_EXTEND_X 32
64#define MAP_EXTEND_Y 512 75#define MAP_EXTEND_Y 512
65 76
66#define MIN_FONT_HEIGHT 10 77#define MIN_FONT_HEIGHT 10
67 78
79/* mask out modifiers we are not interested in */
80#define MOD_MASK (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_META)
81
68#if 0 82#if 0
69# define PARACHUTE SDL_INIT_NOPARACHUTE 83# define PARACHUTE SDL_INIT_NOPARACHUTE
70#else 84#else
71# define PARACHUTE 0 85# define PARACHUTE 0
72#endif 86#endif
171 185
172static void 186static void
173layout_update_font (DC__Layout self) 187layout_update_font (DC__Layout self)
174{ 188{
175 /* use a random scale factor to account for unknown descenders, 0.8 works 189 /* use a random scale factor to account for unknown descenders, 0.8 works
176 * reasonably well with bitstream vera 190 * reasonably well with dejavu/bistream fonts
177 */ 191 */
178 PangoFontDescription *font = self->font ? self->font : default_font; 192 PangoFontDescription *font = self->font ? self->font : default_font;
179 193
180 pango_font_description_set_absolute_size (font, 194 pango_font_description_set_absolute_size (font,
181 MAX (MIN_FONT_HEIGHT, self->base_height) * (PANGO_SCALE * 8 / 10)); 195 MAX (MIN_FONT_HEIGHT, self->base_height) * (PANGO_SCALE * 8 / 10));
659 CODE: 673 CODE:
660{ 674{
661 opengl_fontmap = pango_opengl_font_map_new (); 675 opengl_fontmap = pango_opengl_font_map_new ();
662 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0); 676 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0);
663 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap); 677 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap);
678 /*pango_context_set_font_description (opengl_context, default_font);*/
679#if PANGO_VERSION_CHECK (1, 15, 2)
680 pango_context_set_language (opengl_context, pango_language_from_string ("en"));
681 /*pango_context_set_base_dir (opengl_context, PANGO_DIRECTION_WEAK_LTR);*/
682#endif
664} 683}
665 684
666char * 685char *
667SDL_GetError () 686SDL_GetError ()
668 687
752SDL_GetKeyName (int sym) 771SDL_GetKeyName (int sym)
753 772
754int 773int
755SDL_GetAppState () 774SDL_GetAppState ()
756 775
776int
777SDL_GetModState ()
778
757void 779void
758poll_events () 780poll_events ()
759 PPCODE: 781 PPCODE:
760{ 782{
761 SDL_Event ev; 783 SDL_Event ev;
770 { 792 {
771 case SDL_KEYDOWN: 793 case SDL_KEYDOWN:
772 case SDL_KEYUP: 794 case SDL_KEYUP:
773 hv_store (hv, "state", 5, newSViv (ev.key.state), 0); 795 hv_store (hv, "state", 5, newSViv (ev.key.state), 0);
774 hv_store (hv, "sym", 3, newSViv (ev.key.keysym.sym), 0); 796 hv_store (hv, "sym", 3, newSViv (ev.key.keysym.sym), 0);
775 hv_store (hv, "mod", 3, newSViv (ev.key.keysym.mod), 0); 797 hv_store (hv, "mod", 3, newSViv (ev.key.keysym.mod & MOD_MASK), 0);
776 hv_store (hv, "cmod", 4, newSViv (SDL_GetModState ()), 0); /* current mode */ 798 hv_store (hv, "cmod", 4, newSViv (SDL_GetModState () & MOD_MASK), 0); /* current mode */
777 hv_store (hv, "unicode", 7, newSViv (ev.key.keysym.unicode), 0); 799 hv_store (hv, "unicode", 7, newSViv (ev.key.keysym.unicode), 0);
778 break; 800 break;
779 801
780 case SDL_ACTIVEEVENT: 802 case SDL_ACTIVEEVENT:
781 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0); 803 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0);
799 x = ev.motion.x; 821 x = ev.motion.x;
800 y = ev.motion.y; 822 y = ev.motion.y;
801 SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION)); 823 SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION));
802 } 824 }
803 825
804 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 826 hv_store (hv, "mod", 3, newSViv (SDL_GetModState () & MOD_MASK), 0);
805 hv_store (hv, "state", 5, newSViv (state), 0); 827 hv_store (hv, "state", 5, newSViv (state), 0);
806 hv_store (hv, "x", 1, newSViv (x), 0); 828 hv_store (hv, "x", 1, newSViv (x), 0);
807 hv_store (hv, "y", 1, newSViv (y), 0); 829 hv_store (hv, "y", 1, newSViv (y), 0);
808 hv_store (hv, "xrel", 4, newSViv (xrel), 0); 830 hv_store (hv, "xrel", 4, newSViv (xrel), 0);
809 hv_store (hv, "yrel", 4, newSViv (yrel), 0); 831 hv_store (hv, "yrel", 4, newSViv (yrel), 0);
810 } 832 }
811 break; 833 break;
812 834
813 case SDL_MOUSEBUTTONDOWN: 835 case SDL_MOUSEBUTTONDOWN:
814 case SDL_MOUSEBUTTONUP: 836 case SDL_MOUSEBUTTONUP:
815 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 837 hv_store (hv, "mod", 3, newSViv (SDL_GetModState () & MOD_MASK), 0);
816 838
817 hv_store (hv, "button", 6, newSViv (ev.button.button), 0); 839 hv_store (hv, "button", 6, newSViv (ev.button.button), 0);
818 hv_store (hv, "state", 5, newSViv (ev.button.state), 0); 840 hv_store (hv, "state", 5, newSViv (ev.button.state), 0);
819 hv_store (hv, "x", 1, newSViv (ev.button.x), 0); 841 hv_store (hv, "x", 1, newSViv (ev.button.x), 0);
820 hv_store (hv, "y", 1, newSViv (ev.button.y), 0); 842 hv_store (hv, "y", 1, newSViv (ev.button.y), 0);
894 } 916 }
895 } 917 }
896#endif 918#endif
897} 919}
898 920
899void 921int
900add_font (char *file) 922add_font (char *file)
901 CODE: 923 CODE:
902 FcConfigAppFontAddFile (0, (const FcChar8 *)file); 924 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file);
925 OUTPUT:
926 RETVAL
903 927
904void 928void
905load_image_inline (SV *image_) 929load_image_inline (SV *image_)
906 ALIAS: 930 ALIAS:
907 load_image_file = 1 931 load_image_file = 1
1165{ 1189{
1166 PangoLayoutIter *iter = pango_layout_get_iter (self->pl); 1190 PangoLayoutIter *iter = pango_layout_get_iter (self->pl);
1167 1191
1168 do 1192 do
1169 { 1193 {
1170 PangoLayoutRun *run = pango_layout_iter_get_run (iter); 1194 PangoLayoutRun *run = pango_layout_iter_get_run_readonly (iter);
1171 1195
1172 if (run && shape_attr_p (run)) 1196 if (run && shape_attr_p (run))
1173 { 1197 {
1174 PangoRectangle extents; 1198 PangoRectangle extents;
1175 pango_layout_iter_get_run_extents (iter, 0, &extents); 1199 pango_layout_iter_get_run_extents (iter, 0, &extents);
1279int 1303int
1280descent (DC::Layout self) 1304descent (DC::Layout self)
1281 CODE: 1305 CODE:
1282{ 1306{
1283 PangoRectangle rect; 1307 PangoRectangle rect;
1284 PangoLayoutLine *line = pango_layout_get_line (self->pl, 0); 1308 PangoLayoutLine *line = pango_layout_get_line_readonly (self->pl, 0);
1285 pango_layout_line_get_pixel_extents (line, 0, &rect); 1309 pango_layout_line_get_pixel_extents (line, 0, &rect);
1286 RETVAL = PANGO_DESCENT (rect); 1310 RETVAL = PANGO_DESCENT (rect);
1287} 1311}
1288 OUTPUT: 1312 OUTPUT:
1289 RETVAL 1313 RETVAL
1301 1325
1302void 1326void
1303cursor_pos (DC::Layout self, int index) 1327cursor_pos (DC::Layout self, int index)
1304 PPCODE: 1328 PPCODE:
1305{ 1329{
1306 PangoRectangle strong_pos; 1330 PangoRectangle pos;
1307 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0); 1331 pango_layout_get_cursor_pos (self->pl, index, &pos, 0);
1308 1332
1309 EXTEND (SP, 3); 1333 EXTEND (SP, 3);
1310 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE))); 1334 PUSHs (sv_2mortal (newSViv (pos.x / PANGO_SCALE)));
1311 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE))); 1335 PUSHs (sv_2mortal (newSViv (pos.y / PANGO_SCALE)));
1312 PUSHs (sv_2mortal (newSViv (strong_pos.height / PANGO_SCALE))); 1336 PUSHs (sv_2mortal (newSViv (pos.height / PANGO_SCALE)));
1313} 1337}
1314 1338
1315void 1339void
1316index_to_line_x (DC::Layout self, int index, int trailing = 0) 1340index_to_line_x (DC::Layout self, int index, int trailing = 0)
1317 PPCODE: 1341 PPCODE:
1318{ 1342{
1319 int line, x; 1343 int line, x;
1320 1344
1321 pango_layout_index_to_line_x (self->pl, index, trailing, &line, &x); 1345 pango_layout_index_to_line_x (self->pl, index, trailing, &line, &x);
1322
1323#if !PANGO_VERSION_CHECK (1, 17. 3) 1346#if !PANGO_VERSION_CHECK (1, 17, 3)
1324 /* pango bug: line is between 1..numlines, not 0..numlines-1 */ 1347 /* pango bug: line is between 1..numlines, not 0..numlines-1 */
1325 --line; 1348 --line;
1326#endif 1349#endif
1327
1328 EXTEND (SP, 2); 1350 EXTEND (SP, 2);
1329 PUSHs (sv_2mortal (newSViv (line))); 1351 PUSHs (sv_2mortal (newSViv (line)));
1330 PUSHs (sv_2mortal (newSViv (x / PANGO_SCALE))); 1352 PUSHs (sv_2mortal (newSViv (x / PANGO_SCALE)));
1331} 1353}
1332 1354
1338 int index, trailing; 1360 int index, trailing;
1339 1361
1340 if (line < 0) 1362 if (line < 0)
1341 XSRETURN_EMPTY; 1363 XSRETURN_EMPTY;
1342 1364
1343 if (!(lp = pango_layout_get_line (self->pl, line))) 1365 if (!(lp = pango_layout_get_line_readonly (self->pl, line)))
1344 XSRETURN_EMPTY; /* do better */ 1366 XSRETURN_EMPTY; /* do better */
1345 1367
1346 pango_layout_line_x_to_index (lp, x * PANGO_SCALE, &index, &trailing); 1368 pango_layout_line_x_to_index (lp, x * PANGO_SCALE, &index, &trailing);
1347 1369
1348 EXTEND (SP, 2); 1370 EXTEND (SP, 2);
2270 else 2292 else
2271 *data++ = 0; 2293 *data++ = 0;
2272 } 2294 }
2273 } 2295 }
2274 2296
2297 /* if size is w*h + 5 then no data has been found */
2298 if (data - (uint8_t *)SvPVX (data_sv) != w * h + 5)
2299 {
2275 SvPOK_only (data_sv); 2300 SvPOK_only (data_sv);
2276 SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv)); 2301 SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv));
2302 }
2303
2277 RETVAL = data_sv; 2304 RETVAL = data_sv;
2278} 2305}
2279 OUTPUT: 2306 OUTPUT:
2280 RETVAL 2307 RETVAL
2281 2308
2282void 2309void
2283set_rect (DC::Map self, int x0, int y0, uint8_t *data) 2310set_rect (DC::Map self, int x0, int y0, SV *data_sv)
2284 PPCODE: 2311 PPCODE:
2285{ 2312{
2286 int x, y, z; 2313 int x, y, z;
2287 int w, h; 2314 int w, h;
2288 int x1, y1; 2315 int x1, y1;
2316 STRLEN len;
2317 uint8_t *data, *end;
2318
2319 len = SvLEN (data_sv);
2320 SvGROW (data_sv, len + 8); // reserve at least 7+ bytes more
2321 data = SvPVbyte_nolen (data_sv);
2322 end = data + len + 8;
2323
2324 if (len < 5)
2325 XSRETURN_EMPTY;
2289 2326
2290 if (*data++ != 0) 2327 if (*data++ != 0)
2291 XSRETURN_EMPTY; /* version mismatch */ 2328 XSRETURN_EMPTY; /* version mismatch */
2292 2329
2293 w = *data++ << 8; w |= *data++; 2330 w = *data++ << 8; w |= *data++;
2308 { 2345 {
2309 maprow *row = map_get_row (self, y); 2346 maprow *row = map_get_row (self, y);
2310 2347
2311 for (x = x0; x < x1; x++) 2348 for (x = x0; x < x1; x++)
2312 { 2349 {
2350 uint8_t flags;
2351
2352 if (data + 7 >= end)
2353 XSRETURN_EMPTY;
2354
2313 uint8_t flags = *data++; 2355 flags = *data++;
2314 2356
2315 if (flags) 2357 if (flags)
2316 { 2358 {
2317 mapcell *cell = row_get_cell (row, x); 2359 mapcell *cell = row_get_cell (row, x);
2318 tileid tile[3] = { 0, 0, 0 }; 2360 tileid tile[3] = { 0, 0, 0 };
2321 if (flags & 2) { tile[1] = *data++ << 8; tile[1] |= *data++; } 2363 if (flags & 2) { tile[1] = *data++ << 8; tile[1] |= *data++; }
2322 if (flags & 4) { tile[2] = *data++ << 8; tile[2] |= *data++; } 2364 if (flags & 4) { tile[2] = *data++ << 8; tile[2] |= *data++; }
2323 2365
2324 if (cell->darkness == 0) 2366 if (cell->darkness == 0)
2325 { 2367 {
2326 cell->darkness = 0; 2368 /*cell->darkness = 0;*/
2369 EXTEND (SP, 3);
2327 2370
2328 for (z = 0; z <= 2; z++) 2371 for (z = 0; z <= 2; z++)
2329 { 2372 {
2330 tileid t = tile [z]; 2373 tileid t = tile [z];
2331 2374
2332 if (t >= self->texs || (t && !self->tex [t].name)) 2375 if (t >= self->texs || (t && !self->tex [t].name))
2333 { 2376 {
2334 XPUSHs (sv_2mortal (newSViv (t))); 2377 PUSHs (sv_2mortal (newSViv (t)));
2335 need_texid (self, t); 2378 need_texid (self, t);
2336 } 2379 }
2337 2380
2338 cell->tile [z] = t; 2381 cell->tile [z] = t;
2339 } 2382 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines