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.53 by root, Wed Apr 19 21:38:04 2006 UTC vs.
Revision 1.60 by root, Sun Apr 23 04:47:02 2006 UTC

33 typedef signed char int8_t; 33 typedef signed char int8_t;
34 typedef signed short int16_t; 34 typedef signed short int16_t;
35 typedef signed int int32_t; 35 typedef signed int int32_t;
36#endif 36#endif
37 37
38#include "glext.h"
39
38#define FOW_DARKNESS 32 40#define FOW_DARKNESS 32
39 41
40#define MAP_EXTEND_X 32 42#define MAP_EXTEND_X 32
41#define MAP_EXTEND_Y 512 43#define MAP_EXTEND_Y 512
44
45#define MIN_FONT_HEIGHT 8 * PANGO_SCALE
42 46
43typedef Mix_Chunk *CFClient__MixChunk; 47typedef Mix_Chunk *CFClient__MixChunk;
44typedef Mix_Music *CFClient__MixMusic; 48typedef Mix_Music *CFClient__MixMusic;
45 49
46static PangoContext *context; 50static PangoContext *context;
62layout_update (CFClient__Layout self) 66layout_update (CFClient__Layout self)
63{ 67{
64 /* use a random scale factor to account for unknown descenders, 0.8 works 68 /* use a random scale factor to account for unknown descenders, 0.8 works
65 * reasonably well with bitstream vera 69 * reasonably well with bitstream vera
66 */ 70 */
67 PangoFontDescription *font = pango_context_get_font_description (context); 71 PangoFontDescription *font = (PangoFontDescription *)
72 pango_layout_get_font_description (self->pl);
68 73
69 int height = self->base_height * (PANGO_SCALE * 8 / 10); 74 int height = self->base_height * (PANGO_SCALE * 8 / 10);
75
76 if (height < MIN_FONT_HEIGHT)
77 height = MIN_FONT_HEIGHT;
70 78
71 if (pango_font_description_get_size (font) != height) 79 if (pango_font_description_get_size (font) != height)
72 { 80 {
81 font = pango_font_description_copy (font);
73 pango_font_description_set_absolute_size (font, height); 82 pango_font_description_set_absolute_size (font, height);
74 pango_layout_context_changed (self->pl); 83 pango_layout_set_font_description (self->pl, font);
75 } 84 }
76} 85}
77 86
78static void 87static void
79layout_get_pixel_size (CFClient__Layout self, int *w, int *h) 88layout_get_pixel_size (CFClient__Layout self, int *w, int *h)
237 break; 246 break;
238 247
239 row->col[x - row->c0].darkness = -1; 248 row->col[x - row->c0].darkness = -1;
240 } 249 }
241 } 250 }
251}
252
253static void
254music_finished ()
255{
256 SDL_UserEvent ev;
257
258 ev.type = SDL_USEREVENT;
259 ev.code = 0;
260 ev.data1 = 0;
261 ev.data2 = 0;
262
263 SDL_PushEvent ((SDL_Event *)&ev);
242} 264}
243 265
244MODULE = CFClient PACKAGE = CFClient 266MODULE = CFClient PACKAGE = CFClient
245 267
246PROTOTYPES: ENABLE 268PROTOTYPES: ENABLE
414 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 436 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+");
415 OUTPUT: 437 OUTPUT:
416 RETVAL 438 RETVAL
417 439
418void 440void
441SDL_GL_SwapBuffers ()
442
443void
419SDL_PollEvent () 444SDL_PollEvent ()
420 PPCODE: 445 PPCODE:
421{ 446{
422 SDL_Event ev; 447 SDL_Event ev;
423 448
460 } 485 }
461} 486}
462 487
463int 488int
464Mix_OpenAudio (int frequency = 22050, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 512) 489Mix_OpenAudio (int frequency = 22050, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 512)
490 POSTCALL:
491 Mix_HookMusicFinished (music_finished);
465 492
466void 493void
467Mix_CloseAudio () 494Mix_CloseAudio ()
468 495
469int 496int
501{ 528{
502 int count; 529 int count;
503 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)file, 0, 0, &count); 530 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)file, 0, 0, &count);
504 PangoFontDescription *font = pango_fc_font_description_from_pattern (pattern, 0); 531 PangoFontDescription *font = pango_fc_font_description_from_pattern (pattern, 0);
505 FcPatternDestroy (pattern); 532 FcPatternDestroy (pattern);
533 pango_font_description_set_absolute_size (font, MIN_FONT_HEIGHT);
506 pango_context_set_font_description (context, font); 534 pango_context_set_font_description (context, font);
507} 535}
508 536
509void 537void
510load_image_inline (SV *image_) 538load_image_inline (SV *image_)
612 CODE: 640 CODE:
613 New (0, RETVAL, 1, struct cf_layout); 641 New (0, RETVAL, 1, struct cf_layout);
614 RETVAL->base_height = base_height; 642 RETVAL->base_height = base_height;
615 RETVAL->pl = pango_layout_new (context); 643 RETVAL->pl = pango_layout_new (context);
616 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR); 644 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR);
645 pango_layout_set_font_description (RETVAL->pl,
646 pango_font_description_copy (
647 pango_context_get_font_description (context)));
617 OUTPUT: 648 OUTPUT:
618 RETVAL 649 RETVAL
619 650
620void 651void
621DESTROY (CFClient::Layout self) 652DESTROY (CFClient::Layout self)
930 cell->darkness = -1; 961 cell->darkness = -1;
931 } 962 }
932} 963}
933 964
934SV * 965SV *
935mapmap (CFClient::Map self, int w, int h) 966mapmap (CFClient::Map self, int x0, int y0, int w, int h)
936 CODE: 967 CODE:
937{ 968{
938 int x0, x1, x; 969 int x1, x;
939 int y0, y1, y; 970 int y1, y;
940 int z; 971 int z;
941 SV *map_sv = newSV (w * h * sizeof (uint32_t)); 972 SV *map_sv = newSV (w * h * sizeof (uint32_t));
942 uint32_t *map = (uint32_t *)SvPVX (map_sv); 973 uint32_t *map = (uint32_t *)SvPVX (map_sv);
943 974
944 SvPOK_only (map_sv); 975 SvPOK_only (map_sv);
945 SvCUR_set (map_sv, w * h * sizeof (uint32_t)); 976 SvCUR_set (map_sv, w * h * sizeof (uint32_t));
946 977
947 x0 = self->x - w / 2; x1 = x0 + w; 978 x0 += self->x; x1 = x0 + w;
948 y0 = self->y - h / 2; y1 = y0 + h; 979 y0 += self->y; y1 = y0 + h;
949 980
950 for (y = y0; y < y1; y++) 981 for (y = y0; y < y1; y++)
951 { 982 {
952 maprow *row = 0 <= y && y < self->rows 983 maprow *row = 0 <= y && y < self->rows
953 ? self->row + y 984 ? self->row + y
1093 *data++ = 0; /* version 0 format */ 1124 *data++ = 0; /* version 0 format */
1094 *data++ = w >> 8; *data++ = w; 1125 *data++ = w >> 8; *data++ = w;
1095 *data++ = h >> 8; *data++ = h; 1126 *data++ = h >> 8; *data++ = h;
1096 1127
1097 // we need to do this 'cause we don't keep an absolute coord system for rows 1128 // we need to do this 'cause we don't keep an absolute coord system for rows
1098 // TODO: treat rows as we treat 1129 // TODO: treat rows as we treat columns
1099 map_get_row (self, y0 + self->y - self->oy);//D 1130 map_get_row (self, y0 + self->y - self->oy);//D
1100 map_get_row (self, y0 + self->y - self->oy + h - 1);//D 1131 map_get_row (self, y0 + self->y - self->oy + h - 1);//D
1101 1132
1102 x0 += self->x - self->ox; 1133 x0 += self->x - self->ox;
1103 y0 += self->y - self->oy; 1134 y0 += self->y - self->oy;
1167 1198
1168 w = *data++ << 8; w |= *data++; 1199 w = *data++ << 8; w |= *data++;
1169 h = *data++ << 8; h |= *data++; 1200 h = *data++ << 8; h |= *data++;
1170 1201
1171 // we need to do this 'cause we don't keep an absolute coord system for rows 1202 // we need to do this 'cause we don't keep an absolute coord system for rows
1172 // TODO: treat rows as we treat 1203 // TODO: treat rows as we treat columns
1173 map_get_row (self, y0 + self->y - self->oy);//D 1204 map_get_row (self, y0 + self->y - self->oy);//D
1174 map_get_row (self, y0 + self->y - self->oy + h - 1);//D 1205 map_get_row (self, y0 + self->y - self->oy + h - 1);//D
1175 1206
1176 x0 += self->x - self->ox; 1207 x0 += self->x - self->ox;
1177 y0 += self->y - self->oy; 1208 y0 += self->y - self->oy;
1268 CODE: 1299 CODE:
1269 RETVAL = Mix_PlayMusic (self, loops); 1300 RETVAL = Mix_PlayMusic (self, loops);
1270 OUTPUT: 1301 OUTPUT:
1271 RETVAL 1302 RETVAL
1272 1303
1304MODULE = CFClient PACKAGE = CFClient::OpenGL
1305
1306BOOT:
1307{
1308 HV *stash = gv_stashpv ("CFClient::OpenGL", 1);
1309 static const struct {
1310 const char *name;
1311 IV iv;
1312 } *civ, const_iv[] = {
1313# define const_iv(name) { # name, (IV)name }
1314 const_iv (GL_COLOR_MATERIAL),
1315 const_iv (GL_SMOOTH),
1316 const_iv (GL_FLAT),
1317 const_iv (GL_BLEND),
1318 const_iv (GL_AND),
1319 const_iv (GL_SRC_ALPHA),
1320 const_iv (GL_ONE_MINUS_SRC_ALPHA),
1321 const_iv (GL_RGB),
1322 const_iv (GL_RGBA),
1323 const_iv (GL_UNSIGNED_BYTE),
1324 const_iv (GL_ALPHA4),
1325 const_iv (GL_ALPHA),
1326 const_iv (GL_FLOAT),
1327 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
1328 const_iv (GL_COMPILE),
1329 const_iv (GL_TEXTURE_1D),
1330 const_iv (GL_TEXTURE_2D),
1331 const_iv (GL_TEXTURE_ENV),
1332 const_iv (GL_TEXTURE_MAG_FILTER),
1333 const_iv (GL_TEXTURE_MIN_FILTER),
1334 const_iv (GL_TEXTURE_ENV_MODE),
1335 const_iv (GL_TEXTURE_WRAP_S),
1336 const_iv (GL_TEXTURE_WRAP_T),
1337 const_iv (GL_CLAMP),
1338 const_iv (GL_REPEAT),
1339 const_iv (GL_NEAREST),
1340 const_iv (GL_LINEAR),
1341 const_iv (GL_NEAREST_MIPMAP_NEAREST),
1342 const_iv (GL_LINEAR_MIPMAP_NEAREST),
1343 const_iv (GL_NEAREST_MIPMAP_LINEAR),
1344 const_iv (GL_LINEAR_MIPMAP_LINEAR),
1345 const_iv (GL_GENERATE_MIPMAP),
1346 const_iv (GL_LINEAR),
1347 const_iv (GL_MODULATE),
1348 const_iv (GL_REPLACE),
1349 const_iv (GL_COLOR_BUFFER_BIT),
1350 const_iv (GL_PROJECTION),
1351 const_iv (GL_MODELVIEW),
1352 const_iv (GL_COLOR_LOGIC_OP),
1353 const_iv (GL_CONVOLUTION_2D),
1354 const_iv (GL_CONVOLUTION_BORDER_MODE),
1355 const_iv (GL_CONSTANT_BORDER),
1356 const_iv (GL_LINES),
1357 const_iv (GL_QUADS),
1358 const_iv (GL_LINE_LOOP),
1359 const_iv (GL_PERSPECTIVE_CORRECTION_HINT),
1360 const_iv (GL_FASTEST),
1361# undef const_iv
1362 };
1363
1364 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
1365 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
1366}
1367
1368int glGetError ()
1369
1370void glClear (int mask)
1371
1372void glClearColor (float r, float g, float b, float a = 1.0)
1373 PROTOTYPE: @
1374
1375void glEnable (int cap)
1376
1377void glDisable (int cap)
1378
1379void glShadeModel (int mode)
1380
1381void glHint (int target, int mode)
1382
1383void glBlendFunc (int sfactor, int dfactor)
1384
1385void glLogicOp (int opcode)
1386
1387void glMatrixMode (int mode)
1388
1389void glPushMatrix ()
1390
1391void glPopMatrix ()
1392
1393void glLoadIdentity ()
1394
1395void glOrtho (double left, double right, double bottom, double top, double near, double far)
1396
1397void glViewport (int x, int y, int width, int height)
1398
1399void glTranslate (float x, float y, float z = 0.)
1400 CODE:
1401 glTranslatef (x, y, z);
1402
1403void glScale (float x, float y, float z)
1404 CODE:
1405 glScalef (x, y, z);
1406
1407void glRotate (float angle, float x, float y, float z)
1408 CODE:
1409 glRotatef (angle, x, y, z);
1410
1411void glBegin (int mode)
1412
1413void glEnd ()
1414
1415void glColor (float r, float g, float b, float a = 1.0)
1416 PROTOTYPE: @
1417 CODE:
1418 glColor4f (r, g, b, a);
1419
1420void glVertex (float x, float y, float z = 0.)
1421 CODE:
1422 glVertex3f (x, y, z);
1423
1424void glTexCoord (float s, float t)
1425 CODE:
1426 glTexCoord2f (s, t);
1427
1428void glTexEnv (int target, int pname, float param)
1429 CODE:
1430 glTexEnvf (target, pname, param);
1431
1432void glTexParameter (int target, int pname, float param)
1433 CODE:
1434 glTexParameterf (target, pname, param);
1435
1436void glBindTexture (int target, int name)
1437
1438void glConvolutionParameter (int target, int pname, float params)
1439 CODE:
1440 glConvolutionParameterf (target, pname, params);
1441
1442void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data)
1443
1444void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data)
1445
1446void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
1447
1448int glGenTexture ()
1449 CODE:
1450{
1451 GLuint name;
1452 glGenTextures (1, &name);
1453 RETVAL = name;
1454}
1455 OUTPUT:
1456 RETVAL
1457
1458void glDeleteTexture (int name)
1459 CODE:
1460{
1461 GLuint name_ = name;
1462 glDeleteTextures (1, &name_);
1463}
1464
1465int glGenList ()
1466 CODE:
1467 RETVAL = glGenLists (1);
1468 OUTPUT:
1469 RETVAL
1470
1471void glDeleteList (int list)
1472 CODE:
1473 glDeleteLists (list, 1);
1474
1475void glNewList (int list, int mode = GL_COMPILE)
1476
1477void glEndList ()
1478
1479void glCallList (int list)
1480

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines