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.243 by root, Thu Dec 27 06:54:36 2007 UTC vs.
Revision 1.259 by root, Tue May 20 02:47:21 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);
1346#if !PANGO_VERSION_CHECK (1, 17, 3)
1322 /* pango bug: line is between 1..numlines, not 0..numlines-1 */ 1347 /* pango bug: line is between 1..numlines, not 0..numlines-1 */
1323 1348 --line;
1349#endif
1324 EXTEND (SP, 2); 1350 EXTEND (SP, 2);
1325 PUSHs (sv_2mortal (newSViv (line - 1))); 1351 PUSHs (sv_2mortal (newSViv (line)));
1326 PUSHs (sv_2mortal (newSViv (x / PANGO_SCALE))); 1352 PUSHs (sv_2mortal (newSViv (x / PANGO_SCALE)));
1327} 1353}
1328 1354
1329void 1355void
1330line_x_to_index (DC::Layout self, int line, int x) 1356line_x_to_index (DC::Layout self, int line, int x)
1334 int index, trailing; 1360 int index, trailing;
1335 1361
1336 if (line < 0) 1362 if (line < 0)
1337 XSRETURN_EMPTY; 1363 XSRETURN_EMPTY;
1338 1364
1339 if (!(lp = pango_layout_get_line (self->pl, line))) 1365 if (!(lp = pango_layout_get_line_readonly (self->pl, line)))
1340 XSRETURN_EMPTY; /* do better */ 1366 XSRETURN_EMPTY; /* do better */
1341 1367
1342 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);
1343 1369
1344 EXTEND (SP, 2); 1370 EXTEND (SP, 2);
2266 else 2292 else
2267 *data++ = 0; 2293 *data++ = 0;
2268 } 2294 }
2269 } 2295 }
2270 2296
2297 if (data - (uint8_t *)SvPVX (data_sv) == w * h + 5)
2298 {
2299 SvREFCNT_dec (data_sv);
2300 RETVAL = &PL_sv_undef;
2301 }
2302 else
2303 {
2271 SvPOK_only (data_sv); 2304 SvPOK_only (data_sv);
2272 SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv)); 2305 SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv));
2273 RETVAL = data_sv; 2306 RETVAL = data_sv;
2307 }
2274} 2308}
2275 OUTPUT: 2309 OUTPUT:
2276 RETVAL 2310 RETVAL
2277 2311
2278void 2312void
2279set_rect (DC::Map self, int x0, int y0, uint8_t *data) 2313set_rect (DC::Map self, int x0, int y0, SV *data_sv)
2280 PPCODE: 2314 PPCODE:
2281{ 2315{
2282 int x, y, z; 2316 int x, y, z;
2283 int w, h; 2317 int w, h;
2284 int x1, y1; 2318 int x1, y1;
2319 STRLEN len;
2320 uint8_t *data, *end;
2321
2322 len = SvLEN (data_sv);
2323 SvGROW (data_sv, len + 7); // reserve at least 7+ bytes more
2324 data = SvPVbyte_nolen (data_sv);
2325 end = data + len + 7;
2326
2327 if (len < 5)
2328 XSRETURN_EMPTY;
2285 2329
2286 if (*data++ != 0) 2330 if (*data++ != 0)
2287 XSRETURN_EMPTY; /* version mismatch */ 2331 XSRETURN_EMPTY; /* version mismatch */
2288 2332
2289 w = *data++ << 8; w |= *data++; 2333 w = *data++ << 8; w |= *data++;
2304 { 2348 {
2305 maprow *row = map_get_row (self, y); 2349 maprow *row = map_get_row (self, y);
2306 2350
2307 for (x = x0; x < x1; x++) 2351 for (x = x0; x < x1; x++)
2308 { 2352 {
2353 uint8_t flags;
2354
2355 if (data + 7 >= end)
2356 XSRETURN_EMPTY;
2357
2309 uint8_t flags = *data++; 2358 flags = *data++;
2310 2359
2311 if (flags) 2360 if (flags)
2312 { 2361 {
2313 mapcell *cell = row_get_cell (row, x); 2362 mapcell *cell = row_get_cell (row, x);
2314 tileid tile[3] = { 0, 0, 0 }; 2363 tileid tile[3] = { 0, 0, 0 };
2846void glSeparableFilter2D (int target, int internalformat, int width, int height, int format, int type, char *row, char *column) 2895void glSeparableFilter2D (int target, int internalformat, int width, int height, int format, int type, char *row, char *column)
2847 CODE: 2896 CODE:
2848 if (gl.SeparableFilter2D) 2897 if (gl.SeparableFilter2D)
2849 gl.SeparableFilter2D (target, internalformat, width, height, format, type, row, column); 2898 gl.SeparableFilter2D (target, internalformat, width, height, format, type, row, column);
2850 2899
2851void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data) 2900void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data = 0)
2852 2901
2853void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 2902void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
2854 2903
2855void glDrawPixels (int width, int height, int format, int type, char *pixels) 2904void glDrawPixels (int width, int height, int format, int type, char *pixels)
2856 2905

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines