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.115 by root, Wed Jun 14 18:59:30 2006 UTC vs.
Revision 1.121 by root, Fri Jun 23 20:28:19 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{
673 PUSHs (sv_2mortal (newSViv (surface2->w))); 697 PUSHs (sv_2mortal (newSViv (surface2->w)));
674 PUSHs (sv_2mortal (newSViv (surface2->h))); 698 PUSHs (sv_2mortal (newSViv (surface2->h)));
675 SDL_LockSurface (surface2); 699 SDL_LockSurface (surface2);
676 PUSHs (sv_2mortal (newSVpvn (surface2->pixels, surface2->h * surface2->pitch))); 700 PUSHs (sv_2mortal (newSVpvn (surface2->pixels, surface2->h * surface2->pitch)));
677 SDL_UnlockSurface (surface2); 701 SDL_UnlockSurface (surface2);
678 PUSHs (sv_2mortal (newSViv (surface->flags & (SDL_SRCCOLORKEY | SDL_SRCALPHA) ? GL_RGBA8 : GL_RGB8))); 702 PUSHs (sv_2mortal (newSViv (surface->flags & (SDL_SRCCOLORKEY | SDL_SRCALPHA) ? GL_RGBA : GL_RGB)));
679 PUSHs (sv_2mortal (newSViv (GL_RGBA))); 703 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
680 PUSHs (sv_2mortal (newSViv (GL_UNSIGNED_BYTE))); 704 PUSHs (sv_2mortal (newSViv (GL_UNSIGNED_BYTE)));
681 705
682 SDL_FreeSurface (surface); 706 SDL_FreeSurface (surface);
683 SDL_FreeSurface (surface2); 707 SDL_FreeSurface (surface2);
805 STRLEN textlen; 829 STRLEN textlen;
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}
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 = 2;
843
844 while (arg < items && (pos = strstr (pos, OBJ_STR)))
845 {
846 PangoRectangle rect;
847 PangoAttribute *attr;
848
849 int w = SvIV (ST (arg - 1));
850 int h = SvIV (ST (arg));
851
852 arg += 2;
853
854 rect.x = 0;
855 rect.y = -h * PANGO_SCALE;
856 rect.width = w * PANGO_SCALE;
857 rect.height = h * PANGO_SCALE;
858
859 if (!attrs)
860 attrs = pango_layout_get_attributes (self->pl);
861
862 attr = pango_attr_shape_new (&rect, &rect);
863 attr->start_index = pos - text;
864 attr->end_index = attr->start_index + sizeof (OBJ_STR) - 1;
865 pango_attr_list_insert (attrs, attr);
866
867 pos += sizeof (OBJ_STR) - 1;
868 }
869
870 if (attrs)
871 pango_layout_set_attributes (self->pl, attrs);
872}
873
874void
875get_shapes (CFClient::Layout self)
876 PPCODE:
877{
878 PangoLayoutIter *iter = pango_layout_get_iter (self->pl);
879
880 do
881 {
882 PangoLayoutRun *run = pango_layout_iter_get_run (iter);
883
884 if (run && shape_attr_p (run))
885 {
886 PangoRectangle extents;
887 pango_layout_iter_get_run_extents (iter, 0, &extents);
888
889 PUSHs (sv_2mortal (newSViv (PANGO_PIXELS (extents.x))));
890 PUSHs (sv_2mortal (newSViv (PANGO_PIXELS (extents.y))));
891 }
892 }
893 while (pango_layout_iter_next_run (iter));
894
895 pango_layout_iter_free (iter);
896}
897
898int
899has_wrapped (CFClient::Layout self)
900 CODE:
901{
902 int lines = 1;
903 const char *text = pango_layout_get_text (self->pl);
904
905 while (*text)
906 lines += *text++ == '\n';
907
908 RETVAL = lines < pango_layout_get_line_count (self->pl);
909}
910 OUTPUT:
911 RETVAL
810 912
811SV * 913SV *
812get_text (CFClient::Layout self) 914get_text (CFClient::Layout self)
813 CODE: 915 CODE:
814 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0); 916 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0);
967 1069
968 EXTEND (SP, 5); 1070 EXTEND (SP, 5);
969 PUSHs (sv_2mortal (newSViv (w))); 1071 PUSHs (sv_2mortal (newSViv (w)));
970 PUSHs (sv_2mortal (newSViv (h))); 1072 PUSHs (sv_2mortal (newSViv (h)));
971 PUSHs (sv_2mortal (retval)); 1073 PUSHs (sv_2mortal (retval));
972 PUSHs (sv_2mortal (newSViv (GL_RGBA8))); 1074 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
973 PUSHs (sv_2mortal (newSViv (GL_RGBA))); 1075 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
974 } 1076 }
975 else 1077 else
976 { 1078 {
977 FT_Bitmap bitmap; 1079 FT_Bitmap bitmap;
1229 1331
1230 while (data < data_end) 1332 while (data < data_end)
1231 { 1333 {
1232 flags = (data [0] << 8) + data [1]; data += 2; 1334 flags = (data [0] << 8) + data [1]; data += 2;
1233 1335
1234 x = ((flags >> 10) & 63) + self->x; 1336 x = self->x + ((flags >> 10) & 63);
1235 y = ((flags >> 4) & 63) + self->y; 1337 y = self->y + ((flags >> 4) & 63);
1236 1338
1237 cell = map_get_cell (self, x, y); 1339 cell = map_get_cell (self, x, y);
1238 1340
1239 if (flags & 15) 1341 if (flags & 15)
1240 { 1342 {
1330 OUTPUT: 1432 OUTPUT:
1331 RETVAL 1433 RETVAL
1332 1434
1333void 1435void
1334draw (CFClient::Map self, int shift_x, int shift_y, int x0, int y0, int sw, int sh) 1436draw (CFClient::Map self, int shift_x, int shift_y, int x0, int y0, int sw, int sh)
1335 PPCODE: 1437 CODE:
1336{ 1438{
1337 int vx, vy; 1439 int vx, vy;
1338 int x, y, z; 1440 int x, y, z;
1339 int last_name; 1441 int last_name;
1340 mapface face; 1442 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 1443
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; 1444 vx = self->x + self->w / 2 - sw / 2 - shift_x;
1350 vy = self->y + (self->h - sh) / 2 - shift_y; 1445 vy = self->y + self->h / 2 - sh / 2 - shift_y;
1351 1446
1352 /* 1447 /*
1353 int vx = self->vx = self->w >= sw 1448 int vx = self->vx = self->w >= sw
1354 ? self->x + (self->w - sw) / 2 1449 ? self->x + (self->w - sw) / 2
1355 : MIN (self->x, MAX (self->x + self->w - sw + 1, self->vx)); 1450 : 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)); 1454 : MIN (self->y, MAX (self->y + self->h - sh + 1, self->vy));
1360 */ 1455 */
1361 1456
1362 glColor4ub (255, 255, 255, 255); 1457 glColor4ub (255, 255, 255, 255);
1363 1458
1459 glEnable (GL_BLEND);
1364 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 1460 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1365 glEnable (GL_BLEND);
1366 glEnable (GL_TEXTURE_2D); 1461 glEnable (GL_TEXTURE_2D);
1367 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1462 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1368 1463
1369 glBegin (GL_QUADS); 1464 glBegin (GL_QUADS);
1370 1465
1378 1473
1379 for (x = 0; x < sw; x++) 1474 for (x = 0; x < sw; x++)
1380 if (row->c0 <= x + vx && x + vx < row->c1) 1475 if (row->c0 <= x + vx && x + vx < row->c1)
1381 { 1476 {
1382 mapcell *cell = row->col + (x + vx - row->c0); 1477 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 1478
1388 face = cell->face [z]; 1479 face = cell->face [z];
1389 1480
1390 if (face) 1481 if (face)
1391 { 1482 {
1412 1503
1413 glEnd (); 1504 glEnd ();
1414 1505
1415 glDisable (GL_TEXTURE_2D); 1506 glDisable (GL_TEXTURE_2D);
1416 glDisable (GL_BLEND); 1507 glDisable (GL_BLEND);
1508}
1509
1510void
1511draw_magicmap (CFClient::Map self, int dx, int dy, int w, int h, unsigned char *data)
1512 CODE:
1513{
1514 static float color[16][3] = {
1515 { 0.00, 0.00, 0.00 },
1516 { 1.00, 1.00, 1.00 },
1517 { 0.00, 0.00, 0.55 },
1518 { 1.00, 0.00, 0.00 },
1519
1520 { 1.00, 0.54, 0.00 },
1521 { 0.11, 0.56, 1.00 },
1522 { 0.93, 0.46, 0.00 },
1523 { 0.18, 0.54, 0.34 },
1524
1525 { 0.56, 0.73, 0.56 },
1526 { 0.80, 0.80, 0.80 },
1527 { 0.55, 0.41, 0.13 },
1528 { 0.99, 0.77, 0.26 },
1529
1530 { 0.74, 0.65, 0.41 },
1531
1532 { 0.00, 1.00, 1.00 },
1533 { 1.00, 0.00, 1.00 },
1534 { 1.00, 1.00, 0.00 },
1535 };
1536
1537 int x, y;
1538
1539 glEnable (GL_TEXTURE_2D);
1540 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1541 glEnable (GL_BLEND);
1542 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1543 glBegin (GL_QUADS);
1544
1545 for (y = 0; y < h; y++)
1546 for (x = 0; x < w; x++)
1547 {
1548 unsigned char m = data [x + y * w];
1549
1550 if (m)
1551 {
1552 float *c = color [m & 15];
1553
1554 float tx1 = m & 0x40 ? 0.5 : 0.;
1555 float tx2 = tx1 + 0.5;
1556
1557 glColor4f (c[0], c[1], c[2], 0.75);
1558 glTexCoord2f (tx1, 0.); glVertex2i (x , y );
1559 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1);
1560 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1);
1561 glTexCoord2f (tx2, 0.); glVertex2i (x + 1, y );
1562 }
1563 }
1564
1565 glEnd ();
1566 glDisable (GL_BLEND);
1567 glDisable (GL_TEXTURE_2D);
1568}
1569
1570void
1571fow_texture (CFClient::Map self, int shift_x, int shift_y, int x0, int y0, int sw, int sh)
1572 PPCODE:
1573{
1574 int vx, vy;
1575 int x, y;
1576 int sw4 = (sw + 3) & ~3;
1577 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh));
1578 uint8_t *darkness = (uint8_t *)SvPVX (darkness_sv);
1579
1580 memset (darkness, 255, sw4 * sh);
1581 SvPOK_only (darkness_sv);
1582 SvCUR_set (darkness_sv, sw4 * sh);
1583
1584 vx = self->x + (self->w - sw + 1) / 2 - shift_x;
1585 vy = self->y + (self->h - sh + 1) / 2 - shift_y;
1586
1587 for (y = 0; y < sh; y++)
1588 if (0 <= y + vy && y + vy < self->rows)
1589 {
1590 maprow *row = self->row + (y + vy);
1591
1592 for (x = 0; x < sw; x++)
1593 if (row->c0 <= x + vx && x + vx < row->c1)
1594 {
1595 mapcell *cell = row->col + (x + vx - row->c0);
1596
1597 darkness[y * sw4 + x] = cell->darkness < 0
1598 ? 255 - FOW_DARKNESS
1599 : 255 - cell->darkness;
1600 }
1601 }
1417 1602
1418 EXTEND (SP, 3); 1603 EXTEND (SP, 3);
1419 PUSHs (sv_2mortal (newSViv (sw4))); 1604 PUSHs (sv_2mortal (newSViv (sw4)));
1420 PUSHs (sv_2mortal (newSViv (sh))); 1605 PUSHs (sv_2mortal (newSViv (sh)));
1421 PUSHs (darkness_sv); 1606 PUSHs (darkness_sv);
1628 const_iv (GL_SCISSOR_TEST), 1813 const_iv (GL_SCISSOR_TEST),
1629 const_iv (GL_DEPTH_TEST), 1814 const_iv (GL_DEPTH_TEST),
1630 const_iv (GL_ALPHA_TEST), 1815 const_iv (GL_ALPHA_TEST),
1631 const_iv (GL_NORMALIZE), 1816 const_iv (GL_NORMALIZE),
1632 const_iv (GL_RESCALE_NORMAL), 1817 const_iv (GL_RESCALE_NORMAL),
1818 const_iv (GL_FRONT),
1819 const_iv (GL_BACK),
1633 const_iv (GL_AND), 1820 const_iv (GL_AND),
1634 const_iv (GL_ONE), 1821 const_iv (GL_ONE),
1635 const_iv (GL_ZERO), 1822 const_iv (GL_ZERO),
1636 const_iv (GL_SRC_ALPHA), 1823 const_iv (GL_SRC_ALPHA),
1637 const_iv (GL_DST_ALPHA), 1824 const_iv (GL_DST_ALPHA),
1759 1946
1760void glPopMatrix () 1947void glPopMatrix ()
1761 1948
1762void glLoadIdentity () 1949void glLoadIdentity ()
1763 1950
1951void glDrawBuffer (int buffer)
1952
1953void glReadBuffer (int buffer)
1954
1764# near_ and far_ are due to microsofts buggy "c" compiler 1955# near_ and far_ are due to microsofts buggy "c" compiler
1765void glFrustum (double left, double right, double bottom, double top, double near_, double far_) 1956void glFrustum (double left, double right, double bottom, double top, double near_, double far_)
1766 1957
1767# near_ and far_ are due to microsofts buggy "c" compiler 1958# near_ and far_ are due to microsofts buggy "c" compiler
1768void glOrtho (double left, double right, double bottom, double top, double near_, double far_) 1959void glOrtho (double left, double right, double bottom, double top, double near_, double far_)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines