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.113 by root, Wed Jun 14 16:20:21 2006 UTC vs.
Revision 1.122 by root, Fri Jun 23 22:35:15 2006 UTC

42 typedef signed int int32_t; 42 typedef signed int int32_t;
43#endif 43#endif
44 44
45#include "glext.h" 45#include "glext.h"
46 46
47#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, objetc replacement character */
48
47#define FOW_DARKNESS 32 49#define FOW_DARKNESS 32
48 50
49#define MAP_EXTEND_X 32 51#define MAP_EXTEND_X 32
50#define MAP_EXTEND_Y 512 52#define MAP_EXTEND_Y 512
51 53
70 72
71typedef Mix_Chunk *CFClient__MixChunk; 73typedef Mix_Chunk *CFClient__MixChunk;
72typedef Mix_Music *CFClient__MixMusic; 74typedef Mix_Music *CFClient__MixMusic;
73 75
74typedef PangoFontDescription *CFClient__Font; 76typedef PangoFontDescription *CFClient__Font;
77
78static int
79shape_attr_p (PangoLayoutRun *run)
80{
81 GSList *attrs = run->item->analysis.extra_attrs;
82
83 while (attrs)
84 {
85 PangoAttribute *attr = attrs->data;
86
87 if (attr->klass->type == PANGO_ATTR_SHAPE)
88 return 1;
89
90 attrs = attrs->next;
91 }
92
93 return 0;
94}
75 95
76typedef struct cf_layout { 96typedef struct cf_layout {
77 PangoLayout *pl; // either derived from a cairo or ft2 context 97 PangoLayout *pl; // either derived from a cairo or ft2 context
78 int rgba; // wether we use rgba (cairo) or grayscale (ft2) 98 int rgba; // wether we use rgba (cairo) or grayscale (ft2)
79 float r, g, b, a; // default color for rgba mode 99 float r, g, b, a; // default color for rgba mode
436 456
437 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 457 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
438 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 458 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
439} 459}
440 460
461NV floor (NV x)
462
463NV ceil (NV x)
464
441void 465void
442pango_init () 466pango_init ()
443 CODE: 467 CODE:
444 // delayed, so it can pick up new fonts added by AddFontResourceEx 468 // delayed, so it can pick up new fonts added by AddFontResourceEx
445{ 469{
481 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 5); 505 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 5);
482 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5); 506 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5);
483 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, 1); 507 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, 1);
484 508
485 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15); 509 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
486 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 16); 510 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0);
487 511
488 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE, 0); 512 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE, 0);
489 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0); 513 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0);
490 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE, 0); 514 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE, 0);
491 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0); 515 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0);
806 char *text = SvPVutf8 (text_, textlen); 830 char *text = SvPVutf8 (text_, textlen);
807 831
808 pango_layout_set_markup (self->pl, text, textlen); 832 pango_layout_set_markup (self->pl, text, textlen);
809} 833}
810 834
835void
836set_shapes (CFClient::Layout self, ...)
837 CODE:
838{
839 PangoAttrList *attrs = 0;
840 const char *text = pango_layout_get_text (self->pl);
841 const char *pos = text;
842 int arg = 4;
843
844 while (arg < items && (pos = strstr (pos, OBJ_STR)))
845 {
846 PangoRectangle inkrect, rect;
847 PangoAttribute *attr;
848
849 int x = SvIV (ST (arg - 3));
850 int y = SvIV (ST (arg - 2));
851 int w = SvIV (ST (arg - 1));
852 int h = SvIV (ST (arg ));
853
854 inkrect.x = 0;
855 inkrect.y = 0;
856 inkrect.width = 0;
857 inkrect.height = 0;
858
859 rect.x = x * PANGO_SCALE;
860 rect.y = y * PANGO_SCALE;
861 rect.width = w * PANGO_SCALE;
862 rect.height = h * PANGO_SCALE;
863
864 if (!attrs)
865 attrs = pango_layout_get_attributes (self->pl);
866
867 attr = pango_attr_shape_new (&inkrect, &rect);
868 attr->start_index = pos - text;
869 attr->end_index = attr->start_index + sizeof (OBJ_STR) - 1;
870 pango_attr_list_insert (attrs, attr);
871
872 arg += 4;
873 pos += sizeof (OBJ_STR) - 1;
874 }
875
876 if (attrs)
877 pango_layout_set_attributes (self->pl, attrs);
878}
879
880void
881get_shapes (CFClient::Layout self)
882 PPCODE:
883{
884 PangoLayoutIter *iter = pango_layout_get_iter (self->pl);
885
886 do
887 {
888 PangoLayoutRun *run = pango_layout_iter_get_run (iter);
889
890 if (run && shape_attr_p (run))
891 {
892 PangoRectangle extents;
893 pango_layout_iter_get_run_extents (iter, 0, &extents);
894
895 PUSHs (sv_2mortal (newSViv (PANGO_PIXELS (extents.x))));
896 PUSHs (sv_2mortal (newSViv (PANGO_PIXELS (extents.y))));
897 }
898 }
899 while (pango_layout_iter_next_run (iter));
900
901 pango_layout_iter_free (iter);
902}
903
904int
905has_wrapped (CFClient::Layout self)
906 CODE:
907{
908 int lines = 1;
909 const char *text = pango_layout_get_text (self->pl);
910
911 while (*text)
912 lines += *text++ == '\n';
913
914 RETVAL = lines < pango_layout_get_line_count (self->pl);
915}
916 OUTPUT:
917 RETVAL
918
811SV * 919SV *
812get_text (CFClient::Layout self) 920get_text (CFClient::Layout self)
813 CODE: 921 CODE:
814 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0); 922 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0);
815 sv_utf8_decode (RETVAL); 923 sv_utf8_decode (RETVAL);
882 990
883 EXTEND (SP, 2); 991 EXTEND (SP, 2);
884 PUSHs (sv_2mortal (newSViv (w))); 992 PUSHs (sv_2mortal (newSViv (w)));
885 PUSHs (sv_2mortal (newSViv (h))); 993 PUSHs (sv_2mortal (newSViv (h)));
886} 994}
995
996int
997descent (CFClient::Layout self)
998 CODE:
999{
1000 PangoRectangle rect;
1001 PangoLayoutLine *line = pango_layout_get_line (self->pl, 0);
1002 pango_layout_line_get_pixel_extents (line, 0, &rect);
1003 RETVAL = PANGO_DESCENT (rect);
1004}
1005 OUTPUT:
1006 RETVAL
887 1007
888int 1008int
889xy_to_index (CFClient::Layout self, int x, int y) 1009xy_to_index (CFClient::Layout self, int x, int y)
890 CODE: 1010 CODE:
891{ 1011{
1038 } 1158 }
1039 } 1159 }
1040} 1160}
1041 1161
1042void 1162void
1043draw_quad (SV *self, float x, float y, float w = 0, float h = 0) 1163draw_quad (SV *self, float x, float y, float w = 0., float h = 0.)
1044 PROTOTYPE: $$$;$$ 1164 PROTOTYPE: $$$;$$
1045 ALIAS: 1165 ALIAS:
1046 draw_quad_alpha = 1 1166 draw_quad_alpha = 1
1047 draw_quad_alpha_premultiplied = 2 1167 draw_quad_alpha_premultiplied = 2
1048 CODE: 1168 CODE:
1229 1349
1230 while (data < data_end) 1350 while (data < data_end)
1231 { 1351 {
1232 flags = (data [0] << 8) + data [1]; data += 2; 1352 flags = (data [0] << 8) + data [1]; data += 2;
1233 1353
1234 x = ((flags >> 10) & 63) + self->x; 1354 x = self->x + ((flags >> 10) & 63);
1235 y = ((flags >> 4) & 63) + self->y; 1355 y = self->y + ((flags >> 4) & 63);
1236 1356
1237 cell = map_get_cell (self, x, y); 1357 cell = map_get_cell (self, x, y);
1238 1358
1239 if (flags & 15) 1359 if (flags & 15)
1240 { 1360 {
1330 OUTPUT: 1450 OUTPUT:
1331 RETVAL 1451 RETVAL
1332 1452
1333void 1453void
1334draw (CFClient::Map self, int shift_x, int shift_y, int x0, int y0, int sw, int sh) 1454draw (CFClient::Map self, int shift_x, int shift_y, int x0, int y0, int sw, int sh)
1335 PPCODE: 1455 CODE:
1336{ 1456{
1337 int vx, vy; 1457 int vx, vy;
1338 int x, y, z; 1458 int x, y, z;
1339 int last_name; 1459 int last_name;
1340 mapface face; 1460 mapface face;
1341 int sw4 = (sw + 3) & ~3;
1342 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh));
1343 uint8_t *darkness = (uint8_t *)SvPVX (darkness_sv);
1344 1461
1345 memset (darkness, 255, sw4 * sh);
1346 SvPOK_only (darkness_sv);
1347 SvCUR_set (darkness_sv, sw4 * sh);
1348
1349 vx = self->x + (self->w - sw) / 2 - shift_x; 1462 vx = self->x + self->w / 2 - sw / 2 - shift_x;
1350 vy = self->y + (self->h - sh) / 2 - shift_y; 1463 vy = self->y + self->h / 2 - sh / 2 - shift_y;
1351 1464
1352 /* 1465 /*
1353 int vx = self->vx = self->w >= sw 1466 int vx = self->vx = self->w >= sw
1354 ? self->x + (self->w - sw) / 2 1467 ? self->x + (self->w - sw) / 2
1355 : MIN (self->x, MAX (self->x + self->w - sw + 1, self->vx)); 1468 : MIN (self->x, MAX (self->x + self->w - sw + 1, self->vx));
1359 : MIN (self->y, MAX (self->y + self->h - sh + 1, self->vy)); 1472 : MIN (self->y, MAX (self->y + self->h - sh + 1, self->vy));
1360 */ 1473 */
1361 1474
1362 glColor4ub (255, 255, 255, 255); 1475 glColor4ub (255, 255, 255, 255);
1363 1476
1477 glEnable (GL_BLEND);
1364 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 1478 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1365 glEnable (GL_BLEND);
1366 glEnable (GL_TEXTURE_2D); 1479 glEnable (GL_TEXTURE_2D);
1367 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1480 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1368 1481
1369 glBegin (GL_QUADS); 1482 glBegin (GL_QUADS);
1370 1483
1378 1491
1379 for (x = 0; x < sw; x++) 1492 for (x = 0; x < sw; x++)
1380 if (row->c0 <= x + vx && x + vx < row->c1) 1493 if (row->c0 <= x + vx && x + vx < row->c1)
1381 { 1494 {
1382 mapcell *cell = row->col + (x + vx - row->c0); 1495 mapcell *cell = row->col + (x + vx - row->c0);
1383
1384 darkness[y * sw4 + x] = cell->darkness < 0
1385 ? 255 - FOW_DARKNESS
1386 : 255 - cell->darkness;
1387 1496
1388 face = cell->face [z]; 1497 face = cell->face [z];
1389 1498
1390 if (face) 1499 if (face)
1391 { 1500 {
1412 1521
1413 glEnd (); 1522 glEnd ();
1414 1523
1415 glDisable (GL_TEXTURE_2D); 1524 glDisable (GL_TEXTURE_2D);
1416 glDisable (GL_BLEND); 1525 glDisable (GL_BLEND);
1526}
1527
1528void
1529draw_magicmap (CFClient::Map self, int dx, int dy, int w, int h, unsigned char *data)
1530 CODE:
1531{
1532 static float color[16][3] = {
1533 { 0.00, 0.00, 0.00 },
1534 { 1.00, 1.00, 1.00 },
1535 { 0.00, 0.00, 0.55 },
1536 { 1.00, 0.00, 0.00 },
1537
1538 { 1.00, 0.54, 0.00 },
1539 { 0.11, 0.56, 1.00 },
1540 { 0.93, 0.46, 0.00 },
1541 { 0.18, 0.54, 0.34 },
1542
1543 { 0.56, 0.73, 0.56 },
1544 { 0.80, 0.80, 0.80 },
1545 { 0.55, 0.41, 0.13 },
1546 { 0.99, 0.77, 0.26 },
1547
1548 { 0.74, 0.65, 0.41 },
1549
1550 { 0.00, 1.00, 1.00 },
1551 { 1.00, 0.00, 1.00 },
1552 { 1.00, 1.00, 0.00 },
1553 };
1554
1555 int x, y;
1556
1557 glEnable (GL_TEXTURE_2D);
1558 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1559 glEnable (GL_BLEND);
1560 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1561 glBegin (GL_QUADS);
1562
1563 for (y = 0; y < h; y++)
1564 for (x = 0; x < w; x++)
1565 {
1566 unsigned char m = data [x + y * w];
1567
1568 if (m)
1569 {
1570 float *c = color [m & 15];
1571
1572 float tx1 = m & 0x40 ? 0.5 : 0.;
1573 float tx2 = tx1 + 0.5;
1574
1575 glColor4f (c[0], c[1], c[2], 0.75);
1576 glTexCoord2f (tx1, 0.); glVertex2i (x , y );
1577 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1);
1578 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1);
1579 glTexCoord2f (tx2, 0.); glVertex2i (x + 1, y );
1580 }
1581 }
1582
1583 glEnd ();
1584 glDisable (GL_BLEND);
1585 glDisable (GL_TEXTURE_2D);
1586}
1587
1588void
1589fow_texture (CFClient::Map self, int shift_x, int shift_y, int x0, int y0, int sw, int sh)
1590 PPCODE:
1591{
1592 int vx, vy;
1593 int x, y;
1594 int sw4 = (sw + 3) & ~3;
1595 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh));
1596 uint8_t *darkness = (uint8_t *)SvPVX (darkness_sv);
1597
1598 memset (darkness, 255, sw4 * sh);
1599 SvPOK_only (darkness_sv);
1600 SvCUR_set (darkness_sv, sw4 * sh);
1601
1602 vx = self->x + (self->w - sw + 1) / 2 - shift_x;
1603 vy = self->y + (self->h - sh + 1) / 2 - shift_y;
1604
1605 for (y = 0; y < sh; y++)
1606 if (0 <= y + vy && y + vy < self->rows)
1607 {
1608 maprow *row = self->row + (y + vy);
1609
1610 for (x = 0; x < sw; x++)
1611 if (row->c0 <= x + vx && x + vx < row->c1)
1612 {
1613 mapcell *cell = row->col + (x + vx - row->c0);
1614
1615 darkness[y * sw4 + x] = cell->darkness < 0
1616 ? 255 - FOW_DARKNESS
1617 : 255 - cell->darkness;
1618 }
1619 }
1417 1620
1418 EXTEND (SP, 3); 1621 EXTEND (SP, 3);
1419 PUSHs (sv_2mortal (newSViv (sw4))); 1622 PUSHs (sv_2mortal (newSViv (sw4)));
1420 PUSHs (sv_2mortal (newSViv (sh))); 1623 PUSHs (sv_2mortal (newSViv (sh)));
1421 PUSHs (darkness_sv); 1624 PUSHs (darkness_sv);
1628 const_iv (GL_SCISSOR_TEST), 1831 const_iv (GL_SCISSOR_TEST),
1629 const_iv (GL_DEPTH_TEST), 1832 const_iv (GL_DEPTH_TEST),
1630 const_iv (GL_ALPHA_TEST), 1833 const_iv (GL_ALPHA_TEST),
1631 const_iv (GL_NORMALIZE), 1834 const_iv (GL_NORMALIZE),
1632 const_iv (GL_RESCALE_NORMAL), 1835 const_iv (GL_RESCALE_NORMAL),
1836 const_iv (GL_FRONT),
1837 const_iv (GL_BACK),
1633 const_iv (GL_AND), 1838 const_iv (GL_AND),
1634 const_iv (GL_ONE), 1839 const_iv (GL_ONE),
1635 const_iv (GL_ZERO), 1840 const_iv (GL_ZERO),
1636 const_iv (GL_SRC_ALPHA), 1841 const_iv (GL_SRC_ALPHA),
1637 const_iv (GL_DST_ALPHA), 1842 const_iv (GL_DST_ALPHA),
1638 const_iv (GL_ONE_MINUS_SRC_ALPHA), 1843 const_iv (GL_ONE_MINUS_SRC_ALPHA),
1639 const_iv (GL_ONE_MINUS_DST_ALPHA), 1844 const_iv (GL_ONE_MINUS_DST_ALPHA),
1640 const_iv (GL_SRC_ALPHA_SATURATE), 1845 const_iv (GL_SRC_ALPHA_SATURATE),
1641 const_iv (GL_RGB), 1846 const_iv (GL_RGB),
1642 const_iv (GL_RGBA), 1847 const_iv (GL_RGBA),
1848 const_iv (GL_RGBA4),
1849 const_iv (GL_RGBA8),
1850 const_iv (GL_RGB5_A1),
1643 const_iv (GL_UNSIGNED_BYTE), 1851 const_iv (GL_UNSIGNED_BYTE),
1644 const_iv (GL_UNSIGNED_SHORT), 1852 const_iv (GL_UNSIGNED_SHORT),
1645 const_iv (GL_UNSIGNED_INT), 1853 const_iv (GL_UNSIGNED_INT),
1646 const_iv (GL_ALPHA), 1854 const_iv (GL_ALPHA),
1647 const_iv (GL_INTENSITY), 1855 const_iv (GL_INTENSITY),
1721 OUTPUT: 1929 OUTPUT:
1722 RETVAL 1930 RETVAL
1723 1931
1724int glGetError () 1932int glGetError ()
1725 1933
1934void glFinish ()
1935
1726void glClear (int mask) 1936void glClear (int mask)
1727 1937
1728void glClearColor (float r, float g, float b, float a = 1.0) 1938void glClearColor (float r, float g, float b, float a = 1.0)
1729 PROTOTYPE: @ 1939 PROTOTYPE: @
1730 1940
1753void glPushMatrix () 1963void glPushMatrix ()
1754 1964
1755void glPopMatrix () 1965void glPopMatrix ()
1756 1966
1757void glLoadIdentity () 1967void glLoadIdentity ()
1968
1969void glDrawBuffer (int buffer)
1970
1971void glReadBuffer (int buffer)
1758 1972
1759# near_ and far_ are due to microsofts buggy "c" compiler 1973# near_ and far_ are due to microsofts buggy "c" compiler
1760void glFrustum (double left, double right, double bottom, double top, double near_, double far_) 1974void glFrustum (double left, double right, double bottom, double top, double near_, double far_)
1761 1975
1762# near_ and far_ are due to microsofts buggy "c" compiler 1976# near_ and far_ are due to microsofts buggy "c" compiler

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines