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.105 by root, Mon Jun 5 03:33:09 2006 UTC vs.
Revision 1.115 by root, Wed Jun 14 18:59:30 2006 UTC

10#include "XSUB.h" 10#include "XSUB.h"
11 11
12#include <math.h> 12#include <math.h>
13#include <string.h> 13#include <string.h>
14#include <stdio.h> 14#include <stdio.h>
15#include <stdlib.h>
15 16
16#include <SDL.h> 17#include <SDL.h>
17#include <SDL_endian.h> 18#include <SDL_endian.h>
18#include <SDL_image.h> 19#include <SDL_image.h>
19#include <SDL_mixer.h> 20#include <SDL_mixer.h>
85static PangoFontMap *ft2_fontmap, *cairo_fontmap; 86static PangoFontMap *ft2_fontmap, *cairo_fontmap;
86 87
87static void 88static void
88substitute_func (FcPattern *pattern, gpointer data) 89substitute_func (FcPattern *pattern, gpointer data)
89{ 90{
90 FcPatternAddBool (pattern, FC_HINTING , 1); 91 FcPatternAddBool (pattern, FC_HINTING, 1);
92#ifdef FC_HINT_STYLE
93 FcPatternAddBool (pattern, FC_HINT_STYLE, FC_HINT_FULL);
94#endif
95#ifdef _WIN32
91 //FcPatternAddBool (pattern, FC_AUTOHINT, 1); 96 FcPatternAddBool (pattern, FC_AUTOHINT, 1);
97#else
92 FcPatternAddBool (pattern, FC_AUTOHINT, 0); 98 FcPatternAddBool (pattern, FC_AUTOHINT, 0);
99#endif
93} 100}
94 101
95static void 102static void
96layout_update_font (CFClient__Layout self) 103layout_update_font (CFClient__Layout self)
97{ 104{
293 ev.code = 1; 300 ev.code = 1;
294 ev.data1 = (void *)(long)channel; 301 ev.data1 = (void *)(long)channel;
295 ev.data2 = 0; 302 ev.data2 = 0;
296 303
297 SDL_PushEvent ((SDL_Event *)&ev); 304 SDL_PushEvent ((SDL_Event *)&ev);
305}
306
307static unsigned int
308minpot (unsigned int n)
309{
310 if (!n)
311 return 0;
312
313 --n;
314
315 n |= n >> 1;
316 n |= n >> 2;
317 n |= n >> 4;
318 n |= n >> 8;
319 n |= n >> 16;
320
321 return n + 1;
298} 322}
299 323
300MODULE = CFClient PACKAGE = CFClient 324MODULE = CFClient PACKAGE = CFClient
301 325
302PROTOTYPES: ENABLE 326PROTOTYPES: ENABLE
422 { 446 {
423 ft2_fontmap = pango_ft2_font_map_new (); 447 ft2_fontmap = pango_ft2_font_map_new ();
424 pango_ft2_font_map_set_default_substitute ((PangoFT2FontMap *)ft2_fontmap, substitute_func, 0, 0); 448 pango_ft2_font_map_set_default_substitute ((PangoFT2FontMap *)ft2_fontmap, substitute_func, 0, 0);
425 ft2_context = pango_ft2_font_map_create_context ((PangoFT2FontMap *)ft2_fontmap); 449 ft2_context = pango_ft2_font_map_create_context ((PangoFT2FontMap *)ft2_fontmap);
426 } 450 }
427
428 { 451 {
429 cairo_font_options_t *fopt = cairo_font_options_create (); 452 cairo_font_options_t *fopt = cairo_font_options_create ();
430 cairo_fontmap = pango_cairo_font_map_get_default (); 453 cairo_fontmap = pango_cairo_font_map_get_default ();
431 cairo_context = pango_cairo_font_map_create_context ((PangoCairoFontMap *)cairo_fontmap); 454 cairo_context = pango_cairo_font_map_create_context ((PangoCairoFontMap *)cairo_fontmap);
455#ifdef _WIN32
456 // cairo looks like shit eaten twice on windows
457 cairo_font_options_set_antialias (fopt, CAIRO_ANTIALIAS_NONE);
458#else
432 cairo_font_options_set_antialias (fopt, CAIRO_ANTIALIAS_GRAY); 459 cairo_font_options_set_antialias (fopt, CAIRO_ANTIALIAS_GRAY);
460#endif
433 cairo_font_options_set_hint_style (fopt, CAIRO_HINT_STYLE_FULL); 461 cairo_font_options_set_hint_style (fopt, CAIRO_HINT_STYLE_FULL);
434 cairo_font_options_set_hint_metrics (fopt, CAIRO_HINT_METRICS_ON); 462 cairo_font_options_set_hint_metrics (fopt, CAIRO_HINT_METRICS_ON);
435 pango_cairo_context_set_font_options (cairo_context, fopt); 463 pango_cairo_context_set_font_options (cairo_context, fopt);
436 cairo_font_options_destroy (fopt); 464 cairo_font_options_destroy (fopt);
437 } 465 }
453 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 5); 481 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 5);
454 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5); 482 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5);
455 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, 1); 483 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, 1);
456 484
457 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15); 485 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
458 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 16); 486 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0);
459 487
460 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE, 0); 488 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE, 0);
461 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0); 489 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0);
462 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE, 0); 490 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE, 0);
463 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0); 491 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0);
645 PUSHs (sv_2mortal (newSViv (surface2->w))); 673 PUSHs (sv_2mortal (newSViv (surface2->w)));
646 PUSHs (sv_2mortal (newSViv (surface2->h))); 674 PUSHs (sv_2mortal (newSViv (surface2->h)));
647 SDL_LockSurface (surface2); 675 SDL_LockSurface (surface2);
648 PUSHs (sv_2mortal (newSVpvn (surface2->pixels, surface2->h * surface2->pitch))); 676 PUSHs (sv_2mortal (newSVpvn (surface2->pixels, surface2->h * surface2->pitch)));
649 SDL_UnlockSurface (surface2); 677 SDL_UnlockSurface (surface2);
650 PUSHs (sv_2mortal (newSViv (surface->flags & (SDL_SRCCOLORKEY | SDL_SRCALPHA) ? GL_RGBA : GL_RGB))); 678 PUSHs (sv_2mortal (newSViv (surface->flags & (SDL_SRCCOLORKEY | SDL_SRCALPHA) ? GL_RGBA8 : GL_RGB8)));
651 PUSHs (sv_2mortal (newSViv (GL_RGBA))); 679 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
652 PUSHs (sv_2mortal (newSViv (GL_UNSIGNED_BYTE))); 680 PUSHs (sv_2mortal (newSViv (GL_UNSIGNED_BYTE)));
653 681
654 SDL_FreeSurface (surface); 682 SDL_FreeSurface (surface);
655 SDL_FreeSurface (surface2); 683 SDL_FreeSurface (surface2);
693 CODE: 721 CODE:
694 fprintf (stderr, "FATAL: %s\n", message); 722 fprintf (stderr, "FATAL: %s\n", message);
695#ifdef _WIN32 723#ifdef _WIN32
696 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR); 724 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR);
697#endif 725#endif
698 exit (1); 726 _exit (1);
727
728void
729_exit (int retval)
730 CODE:
731 _exit (retval);
699 732
700MODULE = CFClient PACKAGE = CFClient::Font 733MODULE = CFClient PACKAGE = CFClient::Font
701 734
702CFClient::Font 735CFClient::Font
703new_from_file (SV *class, char *path, int id = 0) 736new_from_file (SV *class, char *path, int id = 0)
724MODULE = CFClient PACKAGE = CFClient::Layout 757MODULE = CFClient PACKAGE = CFClient::Layout
725 758
726CFClient::Layout 759CFClient::Layout
727new (SV *class, int rgba = 0) 760new (SV *class, int rgba = 0)
728 CODE: 761 CODE:
729#if _WIN32
730 //rgba = 0;//D makes text nicer, breaks TextView
731#endif
732 rgba=1;//D
733 New (0, RETVAL, 1, struct cf_layout); 762 New (0, RETVAL, 1, struct cf_layout);
734 763
735 RETVAL->pl = pango_layout_new (rgba ? cairo_context : ft2_context); 764 RETVAL->pl = pango_layout_new (rgba ? cairo_context : ft2_context);
736 RETVAL->rgba = rgba; 765 RETVAL->rgba = rgba;
737 RETVAL->r = 1.; 766 RETVAL->r = 1.;
781 810
782SV * 811SV *
783get_text (CFClient::Layout self) 812get_text (CFClient::Layout self)
784 CODE: 813 CODE:
785 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0); 814 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0);
786 SvUTF8_on (RETVAL); 815 sv_utf8_decode (RETVAL);
787 OUTPUT: 816 OUTPUT:
788 RETVAL 817 RETVAL
789 818
790void 819void
791set_foreground (CFClient::Layout self, float r, float g, float b, float a = 1.) 820set_foreground (CFClient::Layout self, float r, float g, float b, float a = 1.)
938 967
939 EXTEND (SP, 5); 968 EXTEND (SP, 5);
940 PUSHs (sv_2mortal (newSViv (w))); 969 PUSHs (sv_2mortal (newSViv (w)));
941 PUSHs (sv_2mortal (newSViv (h))); 970 PUSHs (sv_2mortal (newSViv (h)));
942 PUSHs (sv_2mortal (retval)); 971 PUSHs (sv_2mortal (retval));
943 PUSHs (sv_2mortal (newSViv (GL_RGBA))); 972 PUSHs (sv_2mortal (newSViv (GL_RGBA8)));
944 PUSHs (sv_2mortal (newSViv (GL_RGBA))); 973 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
945 } 974 }
946 else 975 else
947 { 976 {
948 FT_Bitmap bitmap; 977 FT_Bitmap bitmap;
972} 1001}
973 1002
974MODULE = CFClient PACKAGE = CFClient::Texture 1003MODULE = CFClient PACKAGE = CFClient::Texture
975 1004
976void 1005void
1006pad2pot (SV *data_, SV *w_, SV *h_)
1007 CODE:
1008{
1009 int ow = SvIV (w_);
1010 int oh = SvIV (h_);
1011
1012 if (ow && oh)
1013 {
1014 int nw = minpot (ow);
1015 int nh = minpot (oh);
1016
1017 if (nw != ow || nh != oh)
1018 {
1019 if (SvOK (data_))
1020 {
1021 STRLEN datalen;
1022 char *data = SvPVbyte (data_, datalen);
1023 int bpp = datalen / (ow * oh);
1024 SV *result_ = sv_2mortal (newSV (nw * nh * bpp));
1025
1026 SvPOK_only (result_);
1027 SvCUR_set (result_, nw * nh * bpp);
1028
1029 memset (SvPVX (result_), 0, nw * nh * bpp);
1030 while (oh--)
1031 memcpy (SvPVX (result_) + oh * nw * bpp, data + oh * ow * bpp, ow * bpp);
1032
1033 sv_setsv (data_, result_);
1034 }
1035
1036 sv_setiv (w_, nw);
1037 sv_setiv (h_, nh);
1038 }
1039 }
1040}
1041
1042void
977draw_quad (SV *self, float x, float y, float w = 0, float h = 0) 1043draw_quad (SV *self, float x, float y, float w = 0., float h = 0.)
978 PROTOTYPE: $$$;$$ 1044 PROTOTYPE: $$$;$$
979 ALIAS: 1045 ALIAS:
980 draw_quad_alpha = 1 1046 draw_quad_alpha = 1
981 draw_quad_alpha_premultiplied = 2 1047 draw_quad_alpha_premultiplied = 2
982 CODE: 1048 CODE:
1047DESTROY (CFClient::Map self) 1113DESTROY (CFClient::Map self)
1048 CODE: 1114 CODE:
1049{ 1115{
1050 map_clear (self); 1116 map_clear (self);
1051 Safefree (self->face); 1117 Safefree (self->face);
1118 Safefree (self->tex);
1052 Safefree (self); 1119 Safefree (self);
1053} 1120}
1054 1121
1055void 1122void
1056clear (CFClient::Map self) 1123clear (CFClient::Map self)
1571 const_iv (GL_ONE_MINUS_SRC_ALPHA), 1638 const_iv (GL_ONE_MINUS_SRC_ALPHA),
1572 const_iv (GL_ONE_MINUS_DST_ALPHA), 1639 const_iv (GL_ONE_MINUS_DST_ALPHA),
1573 const_iv (GL_SRC_ALPHA_SATURATE), 1640 const_iv (GL_SRC_ALPHA_SATURATE),
1574 const_iv (GL_RGB), 1641 const_iv (GL_RGB),
1575 const_iv (GL_RGBA), 1642 const_iv (GL_RGBA),
1643 const_iv (GL_RGBA4),
1644 const_iv (GL_RGBA8),
1645 const_iv (GL_RGB5_A1),
1576 const_iv (GL_UNSIGNED_BYTE), 1646 const_iv (GL_UNSIGNED_BYTE),
1577 const_iv (GL_UNSIGNED_SHORT), 1647 const_iv (GL_UNSIGNED_SHORT),
1578 const_iv (GL_UNSIGNED_INT), 1648 const_iv (GL_UNSIGNED_INT),
1579 const_iv (GL_ALPHA), 1649 const_iv (GL_ALPHA),
1580 const_iv (GL_INTENSITY), 1650 const_iv (GL_INTENSITY),
1654 OUTPUT: 1724 OUTPUT:
1655 RETVAL 1725 RETVAL
1656 1726
1657int glGetError () 1727int glGetError ()
1658 1728
1729void glFinish ()
1730
1659void glClear (int mask) 1731void glClear (int mask)
1660 1732
1661void glClearColor (float r, float g, float b, float a = 1.0) 1733void glClearColor (float r, float g, float b, float a = 1.0)
1662 PROTOTYPE: @ 1734 PROTOTYPE: @
1663 1735

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines