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.117 by root, Thu Jun 15 15:33:57 2006 UTC vs.
Revision 1.123 by root, Wed Jun 28 23:41:11 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
810 char *text = SvPVutf8 (text_, textlen); 830 char *text = SvPVutf8 (text_, textlen);
811 831
812 pango_layout_set_markup (self->pl, text, textlen); 832 pango_layout_set_markup (self->pl, text, textlen);
813} 833}
814 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
815SV * 919SV *
816get_text (CFClient::Layout self) 920get_text (CFClient::Layout self)
817 CODE: 921 CODE:
818 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0); 922 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0);
819 sv_utf8_decode (RETVAL); 923 sv_utf8_decode (RETVAL);
886 990
887 EXTEND (SP, 2); 991 EXTEND (SP, 2);
888 PUSHs (sv_2mortal (newSViv (w))); 992 PUSHs (sv_2mortal (newSViv (w)));
889 PUSHs (sv_2mortal (newSViv (h))); 993 PUSHs (sv_2mortal (newSViv (h)));
890} 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
891 1007
892int 1008int
893xy_to_index (CFClient::Layout self, int x, int y) 1009xy_to_index (CFClient::Layout self, int x, int y)
894 CODE: 1010 CODE:
895{ 1011{
1233 1349
1234 while (data < data_end) 1350 while (data < data_end)
1235 { 1351 {
1236 flags = (data [0] << 8) + data [1]; data += 2; 1352 flags = (data [0] << 8) + data [1]; data += 2;
1237 1353
1238 x = ((flags >> 10) & 63) + self->x; 1354 x = self->x + ((flags >> 10) & 63);
1239 y = ((flags >> 4) & 63) + self->y; 1355 y = self->y + ((flags >> 4) & 63);
1240 1356
1241 cell = map_get_cell (self, x, y); 1357 cell = map_get_cell (self, x, y);
1242 1358
1243 if (flags & 15) 1359 if (flags & 15)
1244 { 1360 {
1341 int vx, vy; 1457 int vx, vy;
1342 int x, y, z; 1458 int x, y, z;
1343 int last_name; 1459 int last_name;
1344 mapface face; 1460 mapface face;
1345 1461
1346 vx = self->x + (self->w - sw + 1) / 2 - shift_x; 1462 vx = self->x + self->w / 2 - sw / 2 - shift_x;
1347 vy = self->y + (self->h - sh + 1) / 2 - shift_y; 1463 vy = self->y + self->h / 2 - sh / 2 - shift_y;
1348 1464
1349 /* 1465 /*
1350 int vx = self->vx = self->w >= sw 1466 int vx = self->vx = self->w >= sw
1351 ? self->x + (self->w - sw) / 2 1467 ? self->x + (self->w - sw) / 2
1352 : 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));
1412void 1528void
1413draw_magicmap (CFClient::Map self, int dx, int dy, int w, int h, unsigned char *data) 1529draw_magicmap (CFClient::Map self, int dx, int dy, int w, int h, unsigned char *data)
1414 CODE: 1530 CODE:
1415{ 1531{
1416 static float color[16][3] = { 1532 static float color[16][3] = {
1417 { 0.00, 0.00, 0.00 }, 1533 { 0.00F, 0.00F, 0.00F },
1418 { 1.00, 1.00, 1.00 }, 1534 { 1.00F, 1.00F, 1.00F },
1419 { 0.00, 0.00, 0.55 }, 1535 { 0.00F, 0.00F, 0.55F },
1420 { 1.00, 0.00, 0.00 }, 1536 { 1.00F, 0.00F, 0.00F },
1421 1537
1422 { 1.00, 0.54, 0.00 }, 1538 { 1.00F, 0.54F, 0.00F },
1423 { 0.11, 0.56, 1.00 }, 1539 { 0.11F, 0.56F, 1.00F },
1424 { 0.93, 0.46, 0.00 }, 1540 { 0.93F, 0.46F, 0.00F },
1425 { 0.18, 0.54, 0.34 }, 1541 { 0.18F, 0.54F, 0.34F },
1426 1542
1427 { 0.56, 0.73, 0.56 }, 1543 { 0.56F, 0.73F, 0.56F },
1428 { 0.80, 0.80, 0.80 }, 1544 { 0.80F, 0.80F, 0.80F },
1429 { 0.55, 0.41, 0.13 }, 1545 { 0.55F, 0.41F, 0.13F },
1430 { 0.99, 0.77, 0.26 }, 1546 { 0.99F, 0.77F, 0.26F },
1431 1547
1432 { 0.74, 0.65, 0.41 }, 1548 { 0.74F, 0.65F, 0.41F },
1433 1549
1434 { 0.00, 1.00, 1.00 }, 1550 { 0.00F, 1.00F, 1.00F },
1435 { 1.00, 0.00, 1.00 }, 1551 { 1.00F, 0.00F, 1.00F },
1436 { 1.00, 1.00, 0.00 }, 1552 { 1.00F, 1.00F, 0.00F },
1437 }; 1553 };
1438 1554
1439 int x, y; 1555 int x, y;
1440 1556
1441 glEnable (GL_TEXTURE_2D); 1557 glEnable (GL_TEXTURE_2D);
1447 for (y = 0; y < h; y++) 1563 for (y = 0; y < h; y++)
1448 for (x = 0; x < w; x++) 1564 for (x = 0; x < w; x++)
1449 { 1565 {
1450 unsigned char m = data [x + y * w]; 1566 unsigned char m = data [x + y * w];
1451 1567
1568 if (m)
1569 {
1452 float *c = color [m & 15]; 1570 float *c = color [m & 15];
1453 1571
1454 float tx1 = m & 0x40 ? 0.5 : m & 0x80 ? 0.25 : 0.; 1572 float tx1 = m & 0x40 ? 0.5 : 0.;
1455 float tx2 = tx1 + 0.25; 1573 float tx2 = tx1 + 0.5;
1456 1574
1457 glColor4f (c[0], c[1], c[2], 0.75); 1575 glColor4f (c[0], c[1], c[2], 0.75);
1458 glTexCoord2f (tx1, 0.); glVertex2i (x , y ); 1576 glTexCoord2f (tx1, 0.); glVertex2i (x , y );
1459 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1); 1577 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1);
1460 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1); 1578 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1);
1461 glTexCoord2f (tx2, 0.); glVertex2i (x + 1, y ); 1579 glTexCoord2f (tx2, 0.); glVertex2i (x + 1, y );
1580 }
1462 } 1581 }
1463 1582
1464 glEnd (); 1583 glEnd ();
1465 glDisable (GL_BLEND); 1584 glDisable (GL_BLEND);
1466 glDisable (GL_TEXTURE_2D); 1585 glDisable (GL_TEXTURE_2D);
1712 const_iv (GL_SCISSOR_TEST), 1831 const_iv (GL_SCISSOR_TEST),
1713 const_iv (GL_DEPTH_TEST), 1832 const_iv (GL_DEPTH_TEST),
1714 const_iv (GL_ALPHA_TEST), 1833 const_iv (GL_ALPHA_TEST),
1715 const_iv (GL_NORMALIZE), 1834 const_iv (GL_NORMALIZE),
1716 const_iv (GL_RESCALE_NORMAL), 1835 const_iv (GL_RESCALE_NORMAL),
1836 const_iv (GL_FRONT),
1837 const_iv (GL_BACK),
1717 const_iv (GL_AND), 1838 const_iv (GL_AND),
1718 const_iv (GL_ONE), 1839 const_iv (GL_ONE),
1719 const_iv (GL_ZERO), 1840 const_iv (GL_ZERO),
1720 const_iv (GL_SRC_ALPHA), 1841 const_iv (GL_SRC_ALPHA),
1721 const_iv (GL_DST_ALPHA), 1842 const_iv (GL_DST_ALPHA),
1843 1964
1844void glPopMatrix () 1965void glPopMatrix ()
1845 1966
1846void glLoadIdentity () 1967void glLoadIdentity ()
1847 1968
1969void glDrawBuffer (int buffer)
1970
1971void glReadBuffer (int buffer)
1972
1848# near_ and far_ are due to microsofts buggy "c" compiler 1973# near_ and far_ are due to microsofts buggy "c" compiler
1849void 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_)
1850 1975
1851# near_ and far_ are due to microsofts buggy "c" compiler 1976# near_ and far_ are due to microsofts buggy "c" compiler
1852void glOrtho (double left, double right, double bottom, double top, double near_, double far_) 1977void glOrtho (double left, double right, double bottom, double top, double near_, double far_)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines