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.55 by root, Thu Apr 20 08:11:56 2006 UTC vs.
Revision 1.81 by root, Sun May 14 23:19:14 2006 UTC

1#ifdef _WIN32 1#ifdef _WIN32
2# define _WIN32_WINNT 0x0500 // needed to get win2000 api calls
2# include <malloc.h> 3# include <malloc.h>
4# include <windows.h>
5# pragma warning(disable:4244)
3#endif 6#endif
4 7
5#include "EXTERN.h" 8#include "EXTERN.h"
6#include "perl.h" 9#include "perl.h"
7#include "XSUB.h" 10#include "XSUB.h"
8 11
12#include <math.h>
9#include <string.h> 13#include <string.h>
10#include <stdio.h> 14#include <stdio.h>
11 15
12#include <SDL.h> 16#include <SDL.h>
17#include <SDL_endian.h>
13#include <SDL_image.h> 18#include <SDL_image.h>
14#include <SDL_mixer.h> 19#include <SDL_mixer.h>
15#include <SDL_opengl.h> 20#include <SDL_opengl.h>
16 21
17#include <glib/gmacros.h> 22#include <glib/gmacros.h>
18 23
19#include <pango/pango.h> 24#include <pango/pango.h>
20#include <pango/pangofc-fontmap.h> 25#include <pango/pangofc-fontmap.h>
21#include <pango/pangoft2.h> 26#include <pango/pangoft2.h>
27#include <pango/pangocairo.h>
22 28
23#ifndef _WIN32 29#ifndef _WIN32
24# include <sys/types.h> 30# include <sys/types.h>
25# include <sys/socket.h> 31# include <sys/socket.h>
26# include <netinet/in.h> 32# include <netinet/in.h>
33 typedef signed char int8_t; 39 typedef signed char int8_t;
34 typedef signed short int16_t; 40 typedef signed short int16_t;
35 typedef signed int int32_t; 41 typedef signed int int32_t;
36#endif 42#endif
37 43
44#include "glext.h"
45
38#define FOW_DARKNESS 32 46#define FOW_DARKNESS 32
39 47
40#define MAP_EXTEND_X 32 48#define MAP_EXTEND_X 32
41#define MAP_EXTEND_Y 512 49#define MAP_EXTEND_Y 512
42 50
51#define MIN_FONT_HEIGHT 10
52
53#define GL_CALL(type,func,args) \
54 { \
55 static int init_; \
56 static type fptr_; \
57 \
58 if (!init_) \
59 { \
60 init_ = 1; \
61 fptr_ = (type)SDL_GL_GetProcAddress (# func); \
62 } \
63 \
64 if (fptr_) \
65 fptr_ args; \
66 }
67
43typedef Mix_Chunk *CFClient__MixChunk; 68typedef Mix_Chunk *CFClient__MixChunk;
44typedef Mix_Music *CFClient__MixMusic; 69typedef Mix_Music *CFClient__MixMusic;
45 70
46static PangoContext *context; 71typedef PangoFontDescription *CFClient__Font;
47static PangoFontMap *fontmap;
48 72
49typedef struct cf_layout { 73typedef struct cf_layout {
50 PangoLayout *pl; 74 PangoLayout *pl; // either derived from a cairo or ft2 context
75 int rgba; // wether we use rgba (cairo) or grayscale (ft2)
76 float r, g, b, a; // default color for rgba mode
51 int base_height; 77 int base_height;
78 CFClient__Font font;
52} *CFClient__Layout; 79} *CFClient__Layout;
80
81static CFClient__Font default_font;
82static PangoContext *ft2_context, *cairo_context;
83static PangoFontMap *ft2_fontmap, *cairo_fontmap;
53 84
54static void 85static void
55substitute_func (FcPattern *pattern, gpointer data) 86substitute_func (FcPattern *pattern, gpointer data)
56{ 87{
57 FcPatternAddBool (pattern, FC_HINTING , 1); 88 FcPatternAddBool (pattern, FC_HINTING , 1);
58 FcPatternAddBool (pattern, FC_AUTOHINT, 0); 89 FcPatternAddBool (pattern, FC_AUTOHINT, 1);
59} 90}
60 91
61static void 92static void
62layout_update (CFClient__Layout self) 93layout_update_font (CFClient__Layout self)
63{ 94{
64 /* use a random scale factor to account for unknown descenders, 0.8 works 95 /* use a random scale factor to account for unknown descenders, 0.8 works
65 * reasonably well with bitstream vera 96 * reasonably well with bitstream vera
66 */ 97 */
67 PangoFontDescription *font = pango_context_get_font_description (context); 98 PangoFontDescription *font = self->font ? self->font : default_font;
68 99
69 int height = self->base_height * (PANGO_SCALE * 8 / 10);
70
71 if (pango_font_description_get_size (font) != height)
72 {
73 pango_font_description_set_absolute_size (font, height); 100 pango_font_description_set_absolute_size (font,
74 pango_layout_context_changed (self->pl); 101 MAX (MIN_FONT_HEIGHT, self->base_height) * (PANGO_SCALE * 8 / 10));
75 } 102
103 pango_layout_set_font_description (self->pl, font);
76} 104}
77 105
78static void 106static void
79layout_get_pixel_size (CFClient__Layout self, int *w, int *h) 107layout_get_pixel_size (CFClient__Layout self, int *w, int *h)
80{ 108{
81 layout_update (self);
82
83 pango_layout_get_pixel_size (self->pl, w, h); 109 pango_layout_get_pixel_size (self->pl, w, h);
84 110
85 *w = (*w + 3) & ~3;
86 if (!*w) *w = 1; 111 if (!*w) *w = 1;
87 if (!*h) *h = 1; 112 if (!*h) *h = 1;
113
114 *w = (*w + 3) & ~3;
88} 115}
89 116
90typedef uint16_t mapface; 117typedef uint16_t mapface;
91 118
92typedef struct { 119typedef struct {
237 break; 264 break;
238 265
239 row->col[x - row->c0].darkness = -1; 266 row->col[x - row->c0].darkness = -1;
240 } 267 }
241 } 268 }
269}
270
271static void
272music_finished (void)
273{
274 SDL_UserEvent ev;
275
276 ev.type = SDL_USEREVENT;
277 ev.code = 0;
278 ev.data1 = 0;
279 ev.data2 = 0;
280
281 SDL_PushEvent ((SDL_Event *)&ev);
282}
283
284static void
285channel_finished (int channel)
286{
287 SDL_UserEvent ev;
288
289 ev.type = SDL_USEREVENT;
290 ev.code = 1;
291 ev.data1 = (void *)(long)channel;
292 ev.data2 = 0;
293
294 SDL_PushEvent ((SDL_Event *)&ev);
242} 295}
243 296
244MODULE = CFClient PACKAGE = CFClient 297MODULE = CFClient PACKAGE = CFClient
245 298
246PROTOTYPES: ENABLE 299PROTOTYPES: ENABLE
354# undef const_iv 407# undef const_iv
355 }; 408 };
356 409
357 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 410 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
358 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 411 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
412}
359 413
414void
415pango_init ()
416 CODE:
417{
418 // delayed, so it can pick up new fonts added by AddFontResourceEx
360 fontmap = pango_ft2_font_map_new (); 419 ft2_fontmap = pango_ft2_font_map_new ();
361 pango_ft2_font_map_set_default_substitute ((PangoFT2FontMap *)fontmap, substitute_func, 0, 0); 420 pango_ft2_font_map_set_default_substitute ((PangoFT2FontMap *)ft2_fontmap, substitute_func, 0, 0);
362 context = pango_ft2_font_map_create_context ((PangoFT2FontMap *)fontmap); 421 ft2_context = pango_ft2_font_map_create_context ((PangoFT2FontMap *)ft2_fontmap);
422
423 cairo_fontmap = pango_cairo_font_map_get_default ();
424 cairo_context = pango_cairo_font_map_create_context ((PangoCairoFontMap *)cairo_fontmap);
363} 425}
364 426
365int 427int
366SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO) 428SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO)
367 429
426 488
427 while (SDL_PollEvent (&ev)) 489 while (SDL_PollEvent (&ev))
428 { 490 {
429 HV *hv = newHV (); 491 HV *hv = newHV ();
430 hv_store (hv, "type", 4, newSViv (ev.type), 0); 492 hv_store (hv, "type", 4, newSViv (ev.type), 0);
493
431 switch (ev.type) 494 switch (ev.type)
432 { 495 {
433 case SDL_KEYDOWN: 496 case SDL_KEYDOWN:
434 case SDL_KEYUP: 497 case SDL_KEYUP:
435 hv_store (hv, "state", 5, newSViv (ev.key.state), 0); 498 hv_store (hv, "state", 5, newSViv (ev.key.state), 0);
455 case SDL_MOUSEBUTTONUP: 518 case SDL_MOUSEBUTTONUP:
456 hv_store (hv, "button", 6, newSViv (ev.button.button), 0); 519 hv_store (hv, "button", 6, newSViv (ev.button.button), 0);
457 hv_store (hv, "state", 5, newSViv (ev.button.state), 0); 520 hv_store (hv, "state", 5, newSViv (ev.button.state), 0);
458 hv_store (hv, "x", 1, newSViv (ev.button.x), 0); 521 hv_store (hv, "x", 1, newSViv (ev.button.x), 0);
459 hv_store (hv, "y", 1, newSViv (ev.button.y), 0); 522 hv_store (hv, "y", 1, newSViv (ev.button.y), 0);
523 break;
524
525 case SDL_USEREVENT:
526 hv_store (hv, "code", 4, newSViv (ev.user.code), 0);
527 hv_store (hv, "data1", 5, newSViv ((IV)ev.user.data1), 0);
528 hv_store (hv, "data2", 5, newSViv ((IV)ev.user.data2), 0);
529 break;
460 } 530 }
461 531
462 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv))); 532 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv)));
463 } 533 }
464} 534}
465 535
466int 536int
467Mix_OpenAudio (int frequency = 22050, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 512) 537Mix_OpenAudio (int frequency = 48000, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 2048)
538 POSTCALL:
539 Mix_HookMusicFinished (music_finished);
540 Mix_ChannelFinished (channel_finished);
468 541
469void 542void
470Mix_CloseAudio () 543Mix_CloseAudio ()
471 544
472int 545int
495 568
496void 569void
497add_font (char *file) 570add_font (char *file)
498 CODE: 571 CODE:
499 FcConfigAppFontAddFile (0, (const FcChar8 *)file); /* no idea wether this is required */ 572 FcConfigAppFontAddFile (0, (const FcChar8 *)file); /* no idea wether this is required */
500 573#ifdef _WIN32
501void 574 // cairo... sigh... requires win2000
502set_font (char *file) 575 AddFontResourceEx (file, FR_PRIVATE, 0);
503 CODE: 576#endif
504{
505 int count;
506 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)file, 0, 0, &count);
507 PangoFontDescription *font = pango_fc_font_description_from_pattern (pattern, 0);
508 FcPatternDestroy (pattern);
509 pango_context_set_font_description (context, font);
510}
511 577
512void 578void
513load_image_inline (SV *image_) 579load_image_inline (SV *image_)
514 ALIAS: 580 ALIAS:
515 load_image_file = 1 581 load_image_file = 1
597 PUSHs (sv_2mortal (newSViv (b / y))); 663 PUSHs (sv_2mortal (newSViv (b / y)));
598 PUSHs (sv_2mortal (newSViv (a / y))); 664 PUSHs (sv_2mortal (newSViv (a / y)));
599} 665}
600 666
601void 667void
668error (char *message)
669 CODE:
670#ifdef _WIN32
671 MessageBox (0, message, "Crossfire+ Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
672#else
673 fprintf (stderr, "ERROR: %s\n", message);
674#endif
675
676void
602fatal (char *message) 677fatal (char *message)
603 CODE: 678 CODE:
604#ifdef _WIN32 679#ifdef _WIN32
605 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND); 680 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
606#else 681#else
607 fprintf (stderr, "FATAL: %s\n", message); 682 fprintf (stderr, "FATAL: %s\n", message);
608#endif 683#endif
609 exit (1); 684 exit (1);
610 685
686MODULE = CFClient PACKAGE = CFClient::Font
687
688CFClient::Font
689new_from_file (SV *class, char *path, int id = 0)
690 CODE:
691{
692 int count;
693 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count);
694 RETVAL = pango_fc_font_description_from_pattern (pattern, 0);
695 FcPatternDestroy (pattern);
696}
697 OUTPUT:
698 RETVAL
699
700void
701DESTROY (CFClient::Font self)
702 CODE:
703 pango_font_description_free (self);
704
705void
706make_default (CFClient::Font self)
707 CODE:
708 default_font = self;
709
611MODULE = CFClient PACKAGE = CFClient::Layout 710MODULE = CFClient PACKAGE = CFClient::Layout
612 711
613CFClient::Layout 712CFClient::Layout
614new (SV *class, int base_height = 10) 713new (SV *class, int rgba = 0)
615 CODE: 714 CODE:
616 New (0, RETVAL, 1, struct cf_layout); 715 New (0, RETVAL, 1, struct cf_layout);
617 RETVAL->base_height = base_height; 716
618 RETVAL->pl = pango_layout_new (context); 717 RETVAL->pl = pango_layout_new (rgba ? cairo_context : ft2_context);
718 RETVAL->rgba = rgba;
719 RETVAL->r = 1.;
720 RETVAL->g = 1.;
721 RETVAL->b = 1.;
722 RETVAL->a = 1.;
723 RETVAL->base_height = MIN_FONT_HEIGHT;
724 RETVAL->font = 0;
725
619 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR); 726 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR);
727 layout_update_font (RETVAL);
620 OUTPUT: 728 OUTPUT:
621 RETVAL 729 RETVAL
622 730
623void 731void
624DESTROY (CFClient::Layout self) 732DESTROY (CFClient::Layout self)
625 CODE: 733 CODE:
626 g_object_unref (self->pl); 734 g_object_unref (self->pl);
627 Safefree (self); 735 Safefree (self);
628 736
737int
738is_rgba (CFClient::Layout self)
739 CODE:
740 RETVAL = self->rgba;
741 OUTPUT:
742 RETVAL
743
629void 744void
630set_text (CFClient::Layout self, SV *text_) 745set_text (CFClient::Layout self, SV *text_)
631 CODE: 746 CODE:
632{ 747{
633 STRLEN textlen; 748 STRLEN textlen;
653 SvUTF8_on (RETVAL); 768 SvUTF8_on (RETVAL);
654 OUTPUT: 769 OUTPUT:
655 RETVAL 770 RETVAL
656 771
657void 772void
773set_foreground (CFClient::Layout self, float r, float g, float b, float a = 1.)
774 CODE:
775 self->r = r;
776 self->g = g;
777 self->b = b;
778 self->a = a;
779
780void
781set_font (CFClient::Layout self, CFClient::Font font = 0)
782 CODE:
783 if (self->font != font)
784 {
785 self->font = font;
786 layout_update_font (self);
787 }
788
789void
658set_height (CFClient::Layout self, int base_height) 790set_height (CFClient::Layout self, int base_height)
659 CODE: 791 CODE:
792 if (self->base_height != base_height)
793 {
660 self->base_height = base_height; 794 self->base_height = base_height;
795 layout_update_font (self);
796 }
661 797
662void 798void
663set_width (CFClient::Layout self, int max_width = -1) 799set_width (CFClient::Layout self, int max_width = -1)
664 CODE: 800 CODE:
665 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE); 801 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE);
668size (CFClient::Layout self) 804size (CFClient::Layout self)
669 PPCODE: 805 PPCODE:
670{ 806{
671 int w, h; 807 int w, h;
672 808
673 layout_update (self);
674 layout_get_pixel_size (self, &w, &h); 809 layout_get_pixel_size (self, &w, &h);
675 810
676 EXTEND (SP, 2); 811 EXTEND (SP, 2);
677 PUSHs (sv_2mortal (newSViv (w))); 812 PUSHs (sv_2mortal (newSViv (w)));
678 PUSHs (sv_2mortal (newSViv (h))); 813 PUSHs (sv_2mortal (newSViv (h)));
681int 816int
682xy_to_index (CFClient::Layout self, int x, int y) 817xy_to_index (CFClient::Layout self, int x, int y)
683 CODE: 818 CODE:
684{ 819{
685 int index, trailing; 820 int index, trailing;
686
687 layout_update (self);
688 pango_layout_xy_to_index (self->pl, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing); 821 pango_layout_xy_to_index (self->pl, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing);
689
690 RETVAL = index; 822 RETVAL = index;
691} 823}
692 OUTPUT: 824 OUTPUT:
693 RETVAL 825 RETVAL
694 826
695void 827void
696cursor_pos (CFClient::Layout self, int index) 828cursor_pos (CFClient::Layout self, int index)
697 PPCODE: 829 PPCODE:
698{ 830{
699 PangoRectangle strong_pos; 831 PangoRectangle strong_pos;
700 layout_update (self);
701 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0); 832 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0);
702 833
703 EXTEND (SP, 3); 834 EXTEND (SP, 3);
704 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE))); 835 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE)));
705 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE))); 836 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE)));
710render (CFClient::Layout self) 841render (CFClient::Layout self)
711 PPCODE: 842 PPCODE:
712{ 843{
713 SV *retval; 844 SV *retval;
714 int w, h; 845 int w, h;
715 FT_Bitmap bitmap;
716 846
717 layout_update (self);
718 layout_get_pixel_size (self, &w, &h); 847 layout_get_pixel_size (self, &w, &h);
719 848
849 if (self->rgba)
850 {
851 cairo_surface_t *surface;
852 cairo_t *cairo;
853
854 retval = newSV (w * h * 4);
855 SvPOK_only (retval);
856 SvCUR_set (retval, w * h * 4);
857
858 memset (SvPVX (retval), 0, w * h * 4);
859
860 surface = cairo_image_surface_create_for_data (
861 (void*)SvPVX (retval), CAIRO_FORMAT_ARGB32, w, h, w * 4);
862 cairo = cairo_create (surface);
863 cairo_set_source_rgba (cairo, self->r, self->g, self->b, self->a);
864
865 pango_cairo_show_layout (cairo, self->pl);
866
867 cairo_destroy (cairo);
868 cairo_surface_destroy (surface);
869
870 // what a mess, and its premultiplied, too :(
871 {
872 uint32_t *p = (uint32_t *)SvPVX (retval);
873 uint32_t *e = p + w * h;
874
875 while (p < e)
876 {
877 uint32_t rgba = *p;
878 rgba = (rgba >> 24) | (rgba << 8);
879 rgba = SDL_SwapBE32 (rgba);
880 *p++ = rgba;
881 }
882 }
883
884 EXTEND (SP, 5);
885 PUSHs (sv_2mortal (newSViv (w)));
886 PUSHs (sv_2mortal (newSViv (h)));
887 PUSHs (sv_2mortal (retval));
888 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
889 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
890 }
891 else
892 {
893 FT_Bitmap bitmap;
894
720 retval = newSV (w * h); 895 retval = newSV (w * h);
721 SvPOK_only (retval); 896 SvPOK_only (retval);
722 SvCUR_set (retval, w * h); 897 SvCUR_set (retval, w * h);
723 898
724 bitmap.rows = h; 899 bitmap.rows = h;
725 bitmap.width = w; 900 bitmap.width = w;
726 bitmap.pitch = w; 901 bitmap.pitch = w;
727 bitmap.buffer = (unsigned char*)SvPVX (retval); 902 bitmap.buffer = (unsigned char*)SvPVX (retval);
728 bitmap.num_grays = 256; 903 bitmap.num_grays = 256;
729 bitmap.pixel_mode = FT_PIXEL_MODE_GRAY; 904 bitmap.pixel_mode = FT_PIXEL_MODE_GRAY;
730 905
731 memset (bitmap.buffer, 0, w * h); 906 memset (bitmap.buffer, 0, w * h);
732 907
733 pango_ft2_render_layout (&bitmap, self->pl, 0 * PANGO_SCALE, 0 * PANGO_SCALE); 908 pango_ft2_render_layout (&bitmap, self->pl, 0 * PANGO_SCALE, 0 * PANGO_SCALE);
734 909
735 EXTEND (SP, 3); 910 EXTEND (SP, 5);
736 PUSHs (sv_2mortal (newSViv (w))); 911 PUSHs (sv_2mortal (newSViv (w)));
737 PUSHs (sv_2mortal (newSViv (h))); 912 PUSHs (sv_2mortal (newSViv (h)));
738 PUSHs (sv_2mortal (retval)); 913 PUSHs (sv_2mortal (retval));
914 PUSHs (sv_2mortal (newSViv (GL_ALPHA)));
915 PUSHs (sv_2mortal (newSViv (GL_ALPHA)));
916 }
739} 917}
740 918
741MODULE = CFClient PACKAGE = CFClient::Texture 919MODULE = CFClient PACKAGE = CFClient::Texture
742 920
743void 921void
744draw_quad (SV *self, float x, float y, float w = 0, float h = 0) 922draw_quad (SV *self, float x, float y, float w = 0, float h = 0)
745 PROTOTYPE: $$$;$$ 923 PROTOTYPE: $$$;$$
924 ALIAS:
925 draw_quad_alpha = 1
926 draw_quad_alpha_premultiplied = 2
746 CODE: 927 CODE:
747{ 928{
748 HV *hv = (HV *)SvRV (self); 929 HV *hv = (HV *)SvRV (self);
749 float s = SvNV (*hv_fetch (hv, "s", 1, 1)); 930 float s = SvNV (*hv_fetch (hv, "s", 1, 1));
750 float t = SvNV (*hv_fetch (hv, "t", 1, 1)); 931 float t = SvNV (*hv_fetch (hv, "t", 1, 1));
755 { 936 {
756 w = SvNV (*hv_fetch (hv, "w", 1, 1)); 937 w = SvNV (*hv_fetch (hv, "w", 1, 1));
757 h = SvNV (*hv_fetch (hv, "h", 1, 1)); 938 h = SvNV (*hv_fetch (hv, "h", 1, 1));
758 } 939 }
759 940
941 if (ix)
942 {
943 glEnable (GL_BLEND);
944 glBlendFunc (ix == 1 ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
945 }
946
760 glBindTexture (GL_TEXTURE_2D, name); 947 glBindTexture (GL_TEXTURE_2D, name);
948
761 if (wrap_mode) { 949 if (wrap_mode)
950 {
762 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 951 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
763 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 952 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
764 } 953 }
954
765 glBegin (GL_QUADS); 955 glBegin (GL_QUADS);
766 glTexCoord2f (0, 0); glVertex2f (x , y ); 956 glTexCoord2f (0, 0); glVertex2f (x , y );
767 glTexCoord2f (0, t); glVertex2f (x , y + h); 957 glTexCoord2f (0, t); glVertex2f (x , y + h);
768 glTexCoord2f (s, t); glVertex2f (x + w, y + h); 958 glTexCoord2f (s, t); glVertex2f (x + w, y + h);
769 glTexCoord2f (s, 0); glVertex2f (x + w, y ); 959 glTexCoord2f (s, 0); glVertex2f (x + w, y );
770 glEnd (); 960 glEnd ();
961
962 if (ix)
963 glDisable (GL_BLEND);
771} 964}
772 965
773MODULE = CFClient PACKAGE = CFClient::Map 966MODULE = CFClient PACKAGE = CFClient::Map
774 967
775CFClient::Map 968CFClient::Map
1284 } *civ, const_iv[] = { 1477 } *civ, const_iv[] = {
1285# define const_iv(name) { # name, (IV)name } 1478# define const_iv(name) { # name, (IV)name }
1286 const_iv (GL_COLOR_MATERIAL), 1479 const_iv (GL_COLOR_MATERIAL),
1287 const_iv (GL_SMOOTH), 1480 const_iv (GL_SMOOTH),
1288 const_iv (GL_FLAT), 1481 const_iv (GL_FLAT),
1482 const_iv (GL_DITHER),
1289 const_iv (GL_BLEND), 1483 const_iv (GL_BLEND),
1484 const_iv (GL_SCISSOR_TEST),
1290 const_iv (GL_AND), 1485 const_iv (GL_AND),
1486 const_iv (GL_ONE),
1487 const_iv (GL_ZERO),
1291 const_iv (GL_SRC_ALPHA), 1488 const_iv (GL_SRC_ALPHA),
1489 const_iv (GL_SRC_ALPHA_SATURATE),
1292 const_iv (GL_ONE_MINUS_SRC_ALPHA), 1490 const_iv (GL_ONE_MINUS_SRC_ALPHA),
1491 const_iv (GL_ONE_MINUS_DST_ALPHA),
1293 const_iv (GL_RGB), 1492 const_iv (GL_RGB),
1294 const_iv (GL_RGBA), 1493 const_iv (GL_RGBA),
1295 const_iv (GL_UNSIGNED_BYTE), 1494 const_iv (GL_UNSIGNED_BYTE),
1296 const_iv (GL_ALPHA4),
1297 const_iv (GL_ALPHA), 1495 const_iv (GL_ALPHA),
1496 const_iv (GL_LUMINANCE),
1298 const_iv (GL_FLOAT), 1497 const_iv (GL_FLOAT),
1299 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 1498 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
1300 const_iv (GL_COMPILE), 1499 const_iv (GL_COMPILE),
1301 const_iv (GL_TEXTURE_1D), 1500 const_iv (GL_TEXTURE_1D),
1302 const_iv (GL_TEXTURE_2D), 1501 const_iv (GL_TEXTURE_2D),
1308 const_iv (GL_TEXTURE_WRAP_T), 1507 const_iv (GL_TEXTURE_WRAP_T),
1309 const_iv (GL_CLAMP), 1508 const_iv (GL_CLAMP),
1310 const_iv (GL_REPEAT), 1509 const_iv (GL_REPEAT),
1311 const_iv (GL_NEAREST), 1510 const_iv (GL_NEAREST),
1312 const_iv (GL_LINEAR), 1511 const_iv (GL_LINEAR),
1512 const_iv (GL_NEAREST_MIPMAP_NEAREST),
1513 const_iv (GL_LINEAR_MIPMAP_NEAREST),
1514 const_iv (GL_NEAREST_MIPMAP_LINEAR),
1515 const_iv (GL_LINEAR_MIPMAP_LINEAR),
1516 const_iv (GL_GENERATE_MIPMAP),
1313 const_iv (GL_MODULATE), 1517 const_iv (GL_MODULATE),
1518 const_iv (GL_DECAL),
1314 const_iv (GL_REPLACE), 1519 const_iv (GL_REPLACE),
1315 const_iv (GL_COLOR_BUFFER_BIT), 1520 const_iv (GL_COLOR_BUFFER_BIT),
1316 const_iv (GL_PROJECTION), 1521 const_iv (GL_PROJECTION),
1317 const_iv (GL_MODELVIEW), 1522 const_iv (GL_MODELVIEW),
1318 const_iv (GL_COLOR_LOGIC_OP), 1523 const_iv (GL_COLOR_LOGIC_OP),
1524 const_iv (GL_SEPARABLE_2D),
1319 const_iv (GL_CONVOLUTION_2D), 1525 const_iv (GL_CONVOLUTION_2D),
1320 const_iv (GL_CONVOLUTION_BORDER_MODE), 1526 const_iv (GL_CONVOLUTION_BORDER_MODE),
1321 const_iv (GL_CONSTANT_BORDER), 1527 const_iv (GL_CONSTANT_BORDER),
1322 const_iv (GL_LINES), 1528 const_iv (GL_LINES),
1323 const_iv (GL_QUADS), 1529 const_iv (GL_QUADS),
1348 1554
1349void glBlendFunc (int sfactor, int dfactor) 1555void glBlendFunc (int sfactor, int dfactor)
1350 1556
1351void glLogicOp (int opcode) 1557void glLogicOp (int opcode)
1352 1558
1559void glColorMask (int red, int green, int blue, int alpha)
1560
1353void glMatrixMode (int mode) 1561void glMatrixMode (int mode)
1354 1562
1355void glPushMatrix () 1563void glPushMatrix ()
1356 1564
1357void glPopMatrix () 1565void glPopMatrix ()
1358 1566
1359void glLoadIdentity () 1567void glLoadIdentity ()
1360 1568
1569# near and far are due to microsofts buggy c compiler
1361void glOrtho (double left, double right, double bottom, double top, double near, double far) 1570void glOrtho (double left, double right, double bottom, double top, double near_, double far_)
1362 1571
1363void glViewport (int x, int y, int width, int height) 1572void glViewport (int x, int y, int width, int height)
1573
1574void glScissor (int x, int y, int width, int height)
1364 1575
1365void glTranslate (float x, float y, float z = 0.) 1576void glTranslate (float x, float y, float z = 0.)
1366 CODE: 1577 CODE:
1367 glTranslatef (x, y, z); 1578 glTranslatef (x, y, z);
1368 1579
1369void glScale (float x, float y, float z) 1580void glScale (float x, float y, float z = 1.)
1370 CODE: 1581 CODE:
1371 glScalef (x, y, z); 1582 glScalef (x, y, z);
1372 1583
1373void glRotate (float angle, float x, float y, float z) 1584void glRotate (float angle, float x, float y, float z)
1374 CODE: 1585 CODE:
1379void glEnd () 1590void glEnd ()
1380 1591
1381void glColor (float r, float g, float b, float a = 1.0) 1592void glColor (float r, float g, float b, float a = 1.0)
1382 PROTOTYPE: @ 1593 PROTOTYPE: @
1383 CODE: 1594 CODE:
1384 glColor4f (r, g, b, a); 1595 glColor4ub (MIN ((int)(r * 255.f), 255),
1596 MIN ((int)(g * 255.f), 255),
1597 MIN ((int)(b * 255.f), 255),
1598 MIN ((int)(a * 255.f), 255));
1385 1599
1386void glVertex (float x, float y, float z = 0.) 1600void glVertex (float x, float y, float z = 0.)
1387 CODE: 1601 CODE:
1388 glVertex3f (x, y, z); 1602 glVertex3f (x, y, z);
1389 1603
1401 1615
1402void glBindTexture (int target, int name) 1616void glBindTexture (int target, int name)
1403 1617
1404void glConvolutionParameter (int target, int pname, float params) 1618void glConvolutionParameter (int target, int pname, float params)
1405 CODE: 1619 CODE:
1406 glConvolutionParameterf (target, pname, params); 1620 GL_CALL (PFNGLCONVOLUTIONPARAMETERFEXTPROC, glConvolutionParameterf, (target, pname, params));
1407 1621
1408void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data) 1622void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data)
1623 CODE:
1624 GL_CALL (PFNGLCONVOLUTIONFILTER2DEXTPROC, glConvolutionFilter2D,
1625 (target, internalformat, width, height, format, type, data));
1626
1627void glSeparableFilter2D (int target, int internalformat, int width, int height, int format, int type, char *row, char *column)
1628 CODE:
1629 GL_CALL (PFNGLSEPARABLEFILTER2DEXTPROC, glSeparableFilter2D,
1630 (target, internalformat, width, height, format, type, row, column));
1409 1631
1410void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data) 1632void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data)
1411 1633
1412void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 1634void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
1635
1636void glRasterPos (int x, int y)
1637 CODE:
1638 glRasterPos2i (x, y);
1639
1640void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR)
1413 1641
1414int glGenTexture () 1642int glGenTexture ()
1415 CODE: 1643 CODE:
1416{ 1644{
1417 GLuint name; 1645 GLuint name;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines