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.56 by root, Thu Apr 20 09:13:31 2006 UTC vs.
Revision 1.76 by root, Thu May 11 23:41:45 2006 UTC

1#ifdef _WIN32 1#ifdef _WIN32
2# include <malloc.h> 2# include <malloc.h>
3# pragma warning(disable:4244)
3#endif 4#endif
4 5
5#include "EXTERN.h" 6#include "EXTERN.h"
6#include "perl.h" 7#include "perl.h"
7#include "XSUB.h" 8#include "XSUB.h"
8 9
9#include <string.h> 10#include <string.h>
10#include <stdio.h> 11#include <stdio.h>
11 12
12#include <SDL.h> 13#include <SDL.h>
14#include <SDL_endian.h>
13#include <SDL_image.h> 15#include <SDL_image.h>
14#include <SDL_mixer.h> 16#include <SDL_mixer.h>
15#include <SDL_opengl.h> 17#include <SDL_opengl.h>
16 18
17#include <glib/gmacros.h> 19#include <glib/gmacros.h>
18 20
19#include <pango/pango.h> 21#include <pango/pango.h>
20#include <pango/pangofc-fontmap.h> 22#include <pango/pangofc-fontmap.h>
21#include <pango/pangoft2.h> 23#include <pango/pangoft2.h>
24#include <pango/pangocairo.h>
22 25
23#ifndef _WIN32 26#ifndef _WIN32
24# include <sys/types.h> 27# include <sys/types.h>
25# include <sys/socket.h> 28# include <sys/socket.h>
26# include <netinet/in.h> 29# include <netinet/in.h>
33 typedef signed char int8_t; 36 typedef signed char int8_t;
34 typedef signed short int16_t; 37 typedef signed short int16_t;
35 typedef signed int int32_t; 38 typedef signed int int32_t;
36#endif 39#endif
37 40
41#include "glext.h"
42
38#define FOW_DARKNESS 32 43#define FOW_DARKNESS 32
39 44
40#define MAP_EXTEND_X 32 45#define MAP_EXTEND_X 32
41#define MAP_EXTEND_Y 512 46#define MAP_EXTEND_Y 512
42 47
48#define MIN_FONT_HEIGHT 10
49
50#define GL_CALL(type,func,args) \
51 { \
52 static int init_; \
53 static type fptr_; \
54 \
55 if (!init_) \
56 { \
57 init_ = 1; \
58 fptr_ = (type)SDL_GL_GetProcAddress (# func); \
59 } \
60 \
61 if (fptr_) \
62 fptr_ args; \
63 }
64
43typedef Mix_Chunk *CFClient__MixChunk; 65typedef Mix_Chunk *CFClient__MixChunk;
44typedef Mix_Music *CFClient__MixMusic; 66typedef Mix_Music *CFClient__MixMusic;
45 67
46static PangoContext *context; 68typedef PangoFontDescription *CFClient__Font;
47static PangoFontMap *fontmap;
48 69
49typedef struct cf_layout { 70typedef struct cf_layout {
50 PangoLayout *pl; 71 PangoLayout *pl; // either derived from a cairo or ft2 context
72 int rgba; // wether we use rgba (cairo) or grayscale (ft2)
73 float r, g, b, a; // default color for rgba mode
51 int base_height; 74 int base_height;
75 CFClient__Font font;
52} *CFClient__Layout; 76} *CFClient__Layout;
77
78static CFClient__Font default_font;
79static PangoContext *ft2_context, *cairo_context;
80static PangoFontMap *ft2_fontmap, *cairo_fontmap;
53 81
54static void 82static void
55substitute_func (FcPattern *pattern, gpointer data) 83substitute_func (FcPattern *pattern, gpointer data)
56{ 84{
57 FcPatternAddBool (pattern, FC_HINTING , 1); 85 FcPatternAddBool (pattern, FC_HINTING , 1);
58 FcPatternAddBool (pattern, FC_AUTOHINT, 0); 86 FcPatternAddBool (pattern, FC_AUTOHINT, 0);
59} 87}
60 88
61static void 89static void
62layout_update (CFClient__Layout self) 90layout_update_font (CFClient__Layout self)
63{ 91{
64 /* use a random scale factor to account for unknown descenders, 0.8 works 92 /* use a random scale factor to account for unknown descenders, 0.8 works
65 * reasonably well with bitstream vera 93 * reasonably well with bitstream vera
66 */ 94 */
67 PangoFontDescription *font = pango_context_get_font_description (context); 95 PangoFontDescription *font = self->font ? self->font : default_font;
68 96
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); 97 pango_font_description_set_absolute_size (font,
74 pango_layout_context_changed (self->pl); 98 MAX (MIN_FONT_HEIGHT, self->base_height) * (PANGO_SCALE * 8 / 10));
75 } 99
100 pango_layout_set_font_description (self->pl, font);
76} 101}
77 102
78static void 103static void
79layout_get_pixel_size (CFClient__Layout self, int *w, int *h) 104layout_get_pixel_size (CFClient__Layout self, int *w, int *h)
80{ 105{
81 layout_update (self);
82
83 pango_layout_get_pixel_size (self->pl, w, h); 106 pango_layout_get_pixel_size (self->pl, w, h);
84 107
85 *w = (*w + 3) & ~3;
86 if (!*w) *w = 1; 108 if (!*w) *w = 1;
87 if (!*h) *h = 1; 109 if (!*h) *h = 1;
110
111 *w = (*w + 3) & ~3;
88} 112}
89 113
90typedef uint16_t mapface; 114typedef uint16_t mapface;
91 115
92typedef struct { 116typedef struct {
240 } 264 }
241 } 265 }
242} 266}
243 267
244static void 268static void
245music_finished () 269music_finished (void)
246{ 270{
247 SDL_UserEvent ev; 271 SDL_UserEvent ev;
248 272
249 ev.type = SDL_USEREVENT; 273 ev.type = SDL_USEREVENT;
250 ev.code = 0; 274 ev.code = 0;
251 ev.data1 = 0; 275 ev.data1 = 0;
252 ev.data2 = 0; 276 ev.data2 = 0;
253 277
278 SDL_PushEvent ((SDL_Event *)&ev);
279}
280
281static void
282channel_finished (int channel)
283{
254 SDL_PushEvent (&ev); 284 SDL_UserEvent ev;
285
286 ev.type = SDL_USEREVENT;
287 ev.code = 1;
288 ev.data1 = (void *)(long)channel;
289 ev.data2 = 0;
290
291 SDL_PushEvent ((SDL_Event *)&ev);
255} 292}
256 293
257MODULE = CFClient PACKAGE = CFClient 294MODULE = CFClient PACKAGE = CFClient
258 295
259PROTOTYPES: ENABLE 296PROTOTYPES: ENABLE
368 }; 405 };
369 406
370 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 407 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
371 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 408 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
372 409
373 fontmap = pango_ft2_font_map_new (); 410 ft2_fontmap = pango_ft2_font_map_new ();
374 pango_ft2_font_map_set_default_substitute ((PangoFT2FontMap *)fontmap, substitute_func, 0, 0); 411 pango_ft2_font_map_set_default_substitute ((PangoFT2FontMap *)ft2_fontmap, substitute_func, 0, 0);
375 context = pango_ft2_font_map_create_context ((PangoFT2FontMap *)fontmap); 412 ft2_context = pango_ft2_font_map_create_context ((PangoFT2FontMap *)ft2_fontmap);
413
414 cairo_fontmap = pango_cairo_font_map_get_default ();
415 cairo_context = pango_cairo_font_map_create_context ((PangoCairoFontMap *)cairo_fontmap);
376} 416}
377 417
378int 418int
379SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO) 419SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO)
380 420
439 479
440 while (SDL_PollEvent (&ev)) 480 while (SDL_PollEvent (&ev))
441 { 481 {
442 HV *hv = newHV (); 482 HV *hv = newHV ();
443 hv_store (hv, "type", 4, newSViv (ev.type), 0); 483 hv_store (hv, "type", 4, newSViv (ev.type), 0);
484
444 switch (ev.type) 485 switch (ev.type)
445 { 486 {
446 case SDL_KEYDOWN: 487 case SDL_KEYDOWN:
447 case SDL_KEYUP: 488 case SDL_KEYUP:
448 hv_store (hv, "state", 5, newSViv (ev.key.state), 0); 489 hv_store (hv, "state", 5, newSViv (ev.key.state), 0);
468 case SDL_MOUSEBUTTONUP: 509 case SDL_MOUSEBUTTONUP:
469 hv_store (hv, "button", 6, newSViv (ev.button.button), 0); 510 hv_store (hv, "button", 6, newSViv (ev.button.button), 0);
470 hv_store (hv, "state", 5, newSViv (ev.button.state), 0); 511 hv_store (hv, "state", 5, newSViv (ev.button.state), 0);
471 hv_store (hv, "x", 1, newSViv (ev.button.x), 0); 512 hv_store (hv, "x", 1, newSViv (ev.button.x), 0);
472 hv_store (hv, "y", 1, newSViv (ev.button.y), 0); 513 hv_store (hv, "y", 1, newSViv (ev.button.y), 0);
514 break;
515
516 case SDL_USEREVENT:
517 hv_store (hv, "code", 4, newSViv (ev.user.code), 0);
518 hv_store (hv, "data1", 5, newSViv ((IV)ev.user.data1), 0);
519 hv_store (hv, "data2", 5, newSViv ((IV)ev.user.data2), 0);
520 break;
473 } 521 }
474 522
475 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv))); 523 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv)));
476 } 524 }
477} 525}
478 526
479int 527int
480Mix_OpenAudio (int frequency = 22050, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 512) 528Mix_OpenAudio (int frequency = 48000, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 2048)
481 POSTCALL: 529 POSTCALL:
482 Mix_HookMusicFinished (music_finished); 530 Mix_HookMusicFinished (music_finished);
531 Mix_ChannelFinished (channel_finished);
483 532
484void 533void
485Mix_CloseAudio () 534Mix_CloseAudio ()
486 535
487int 536int
510 559
511void 560void
512add_font (char *file) 561add_font (char *file)
513 CODE: 562 CODE:
514 FcConfigAppFontAddFile (0, (const FcChar8 *)file); /* no idea wether this is required */ 563 FcConfigAppFontAddFile (0, (const FcChar8 *)file); /* no idea wether this is required */
515
516void
517set_font (char *file)
518 CODE:
519{
520 int count;
521 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)file, 0, 0, &count);
522 PangoFontDescription *font = pango_fc_font_description_from_pattern (pattern, 0);
523 FcPatternDestroy (pattern);
524 pango_context_set_font_description (context, font);
525}
526 564
527void 565void
528load_image_inline (SV *image_) 566load_image_inline (SV *image_)
529 ALIAS: 567 ALIAS:
530 load_image_file = 1 568 load_image_file = 1
612 PUSHs (sv_2mortal (newSViv (b / y))); 650 PUSHs (sv_2mortal (newSViv (b / y)));
613 PUSHs (sv_2mortal (newSViv (a / y))); 651 PUSHs (sv_2mortal (newSViv (a / y)));
614} 652}
615 653
616void 654void
655error (char *message)
656 CODE:
657#ifdef _WIN32
658 MessageBox (0, message, "Crossfire+ Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
659#else
660 fprintf (stderr, "ERROR: %s\n", message);
661#endif
662
663void
617fatal (char *message) 664fatal (char *message)
618 CODE: 665 CODE:
619#ifdef _WIN32 666#ifdef _WIN32
620 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND); 667 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
621#else 668#else
622 fprintf (stderr, "FATAL: %s\n", message); 669 fprintf (stderr, "FATAL: %s\n", message);
623#endif 670#endif
624 exit (1); 671 exit (1);
625 672
673MODULE = CFClient PACKAGE = CFClient::Font
674
675CFClient::Font
676new_from_file (SV *class, char *path, int id = 0)
677 CODE:
678{
679 int count;
680 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count);
681 RETVAL = pango_fc_font_description_from_pattern (pattern, 0);
682 FcPatternDestroy (pattern);
683}
684 OUTPUT:
685 RETVAL
686
687void
688DESTROY (CFClient::Font self)
689 CODE:
690 pango_font_description_free (self);
691
692void
693make_default (CFClient::Font self)
694 CODE:
695 default_font = self;
696
626MODULE = CFClient PACKAGE = CFClient::Layout 697MODULE = CFClient PACKAGE = CFClient::Layout
627 698
628CFClient::Layout 699CFClient::Layout
629new (SV *class, int base_height = 10) 700new (SV *class, int rgba = 0)
630 CODE: 701 CODE:
631 New (0, RETVAL, 1, struct cf_layout); 702 New (0, RETVAL, 1, struct cf_layout);
632 RETVAL->base_height = base_height; 703
633 RETVAL->pl = pango_layout_new (context); 704 RETVAL->pl = pango_layout_new (rgba ? cairo_context : ft2_context);
705 RETVAL->rgba = rgba;
706 RETVAL->r = 1.;
707 RETVAL->g = 1.;
708 RETVAL->b = 1.;
709 RETVAL->a = 1.;
710 RETVAL->base_height = MIN_FONT_HEIGHT;
711 RETVAL->font = 0;
712
634 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR); 713 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR);
714 layout_update_font (RETVAL);
635 OUTPUT: 715 OUTPUT:
636 RETVAL 716 RETVAL
637 717
638void 718void
639DESTROY (CFClient::Layout self) 719DESTROY (CFClient::Layout self)
640 CODE: 720 CODE:
641 g_object_unref (self->pl); 721 g_object_unref (self->pl);
642 Safefree (self); 722 Safefree (self);
643 723
724int
725is_rgba (CFClient::Layout self)
726 CODE:
727 RETVAL = self->rgba;
728 OUTPUT:
729 RETVAL
730
644void 731void
645set_text (CFClient::Layout self, SV *text_) 732set_text (CFClient::Layout self, SV *text_)
646 CODE: 733 CODE:
647{ 734{
648 STRLEN textlen; 735 STRLEN textlen;
668 SvUTF8_on (RETVAL); 755 SvUTF8_on (RETVAL);
669 OUTPUT: 756 OUTPUT:
670 RETVAL 757 RETVAL
671 758
672void 759void
760set_foreground (CFClient::Layout self, float r, float g, float b, float a = 1.)
761 CODE:
762 self->r = r;
763 self->g = g;
764 self->b = b;
765 self->a = a;
766
767void
768set_font (CFClient::Layout self, CFClient::Font font = 0)
769 CODE:
770 if (self->font != font)
771 {
772 self->font = font;
773 layout_update_font (self);
774 }
775
776void
673set_height (CFClient::Layout self, int base_height) 777set_height (CFClient::Layout self, int base_height)
674 CODE: 778 CODE:
779 if (self->base_height != base_height)
780 {
675 self->base_height = base_height; 781 self->base_height = base_height;
782 layout_update_font (self);
783 }
676 784
677void 785void
678set_width (CFClient::Layout self, int max_width = -1) 786set_width (CFClient::Layout self, int max_width = -1)
679 CODE: 787 CODE:
680 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE); 788 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE);
683size (CFClient::Layout self) 791size (CFClient::Layout self)
684 PPCODE: 792 PPCODE:
685{ 793{
686 int w, h; 794 int w, h;
687 795
688 layout_update (self);
689 layout_get_pixel_size (self, &w, &h); 796 layout_get_pixel_size (self, &w, &h);
690 797
691 EXTEND (SP, 2); 798 EXTEND (SP, 2);
692 PUSHs (sv_2mortal (newSViv (w))); 799 PUSHs (sv_2mortal (newSViv (w)));
693 PUSHs (sv_2mortal (newSViv (h))); 800 PUSHs (sv_2mortal (newSViv (h)));
696int 803int
697xy_to_index (CFClient::Layout self, int x, int y) 804xy_to_index (CFClient::Layout self, int x, int y)
698 CODE: 805 CODE:
699{ 806{
700 int index, trailing; 807 int index, trailing;
701
702 layout_update (self);
703 pango_layout_xy_to_index (self->pl, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing); 808 pango_layout_xy_to_index (self->pl, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing);
704
705 RETVAL = index; 809 RETVAL = index;
706} 810}
707 OUTPUT: 811 OUTPUT:
708 RETVAL 812 RETVAL
709 813
710void 814void
711cursor_pos (CFClient::Layout self, int index) 815cursor_pos (CFClient::Layout self, int index)
712 PPCODE: 816 PPCODE:
713{ 817{
714 PangoRectangle strong_pos; 818 PangoRectangle strong_pos;
715 layout_update (self);
716 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0); 819 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0);
717 820
718 EXTEND (SP, 3); 821 EXTEND (SP, 3);
719 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE))); 822 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE)));
720 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE))); 823 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE)));
725render (CFClient::Layout self) 828render (CFClient::Layout self)
726 PPCODE: 829 PPCODE:
727{ 830{
728 SV *retval; 831 SV *retval;
729 int w, h; 832 int w, h;
730 FT_Bitmap bitmap;
731 833
732 layout_update (self);
733 layout_get_pixel_size (self, &w, &h); 834 layout_get_pixel_size (self, &w, &h);
734 835
836 if (self->rgba)
837 {
838 cairo_surface_t *surface;
839 cairo_t *cairo;
840
841 retval = newSV (w * h * 4);
842 SvPOK_only (retval);
843 SvCUR_set (retval, w * h * 4);
844
845 memset (SvPVX (retval), 0, w * h * 4);
846
847 surface = cairo_image_surface_create_for_data (
848 (void*)SvPVX (retval), CAIRO_FORMAT_ARGB32, w, h, w * 4);
849 cairo = cairo_create (surface);
850 cairo_set_source_rgba (cairo, self->r, self->g, self->b, self->a);
851
852 pango_cairo_show_layout (cairo, self->pl);
853
854 cairo_destroy (cairo);
855 cairo_surface_destroy (surface);
856
857 // what a mess, and its premultiplied, too :(
858 {
859 uint32_t *p = (uint32_t *)SvPVX (retval);
860 uint32_t *e = p + w * h;
861
862 while (p < e)
863 {
864 uint32_t rgba = *p;
865 rgba = (rgba >> 24) | (rgba << 8);
866 rgba = SDL_SwapBE32 (rgba);
867 *p++ = rgba;
868 }
869 }
870
871 EXTEND (SP, 5);
872 PUSHs (sv_2mortal (newSViv (w)));
873 PUSHs (sv_2mortal (newSViv (h)));
874 PUSHs (sv_2mortal (retval));
875 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
876 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
877 }
878 else
879 {
880 FT_Bitmap bitmap;
881
735 retval = newSV (w * h); 882 retval = newSV (w * h);
736 SvPOK_only (retval); 883 SvPOK_only (retval);
737 SvCUR_set (retval, w * h); 884 SvCUR_set (retval, w * h);
738 885
739 bitmap.rows = h; 886 bitmap.rows = h;
740 bitmap.width = w; 887 bitmap.width = w;
741 bitmap.pitch = w; 888 bitmap.pitch = w;
742 bitmap.buffer = (unsigned char*)SvPVX (retval); 889 bitmap.buffer = (unsigned char*)SvPVX (retval);
743 bitmap.num_grays = 256; 890 bitmap.num_grays = 256;
744 bitmap.pixel_mode = FT_PIXEL_MODE_GRAY; 891 bitmap.pixel_mode = FT_PIXEL_MODE_GRAY;
745 892
746 memset (bitmap.buffer, 0, w * h); 893 memset (bitmap.buffer, 0, w * h);
747 894
748 pango_ft2_render_layout (&bitmap, self->pl, 0 * PANGO_SCALE, 0 * PANGO_SCALE); 895 pango_ft2_render_layout (&bitmap, self->pl, 0 * PANGO_SCALE, 0 * PANGO_SCALE);
749 896
750 EXTEND (SP, 3); 897 EXTEND (SP, 5);
751 PUSHs (sv_2mortal (newSViv (w))); 898 PUSHs (sv_2mortal (newSViv (w)));
752 PUSHs (sv_2mortal (newSViv (h))); 899 PUSHs (sv_2mortal (newSViv (h)));
753 PUSHs (sv_2mortal (retval)); 900 PUSHs (sv_2mortal (retval));
901 PUSHs (sv_2mortal (newSViv (GL_ALPHA)));
902 PUSHs (sv_2mortal (newSViv (GL_ALPHA)));
903 }
754} 904}
755 905
756MODULE = CFClient PACKAGE = CFClient::Texture 906MODULE = CFClient PACKAGE = CFClient::Texture
757 907
758void 908void
759draw_quad (SV *self, float x, float y, float w = 0, float h = 0) 909draw_quad (SV *self, float x, float y, float w = 0, float h = 0)
760 PROTOTYPE: $$$;$$ 910 PROTOTYPE: $$$;$$
911 ALIAS:
912 draw_quad_alpha = 1
913 draw_quad_alpha_premultiplied = 2
761 CODE: 914 CODE:
762{ 915{
763 HV *hv = (HV *)SvRV (self); 916 HV *hv = (HV *)SvRV (self);
764 float s = SvNV (*hv_fetch (hv, "s", 1, 1)); 917 float s = SvNV (*hv_fetch (hv, "s", 1, 1));
765 float t = SvNV (*hv_fetch (hv, "t", 1, 1)); 918 float t = SvNV (*hv_fetch (hv, "t", 1, 1));
770 { 923 {
771 w = SvNV (*hv_fetch (hv, "w", 1, 1)); 924 w = SvNV (*hv_fetch (hv, "w", 1, 1));
772 h = SvNV (*hv_fetch (hv, "h", 1, 1)); 925 h = SvNV (*hv_fetch (hv, "h", 1, 1));
773 } 926 }
774 927
928 if (ix)
929 {
930 glEnable (GL_BLEND);
931 glBlendFunc (ix == 1 ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
932 }
933
775 glBindTexture (GL_TEXTURE_2D, name); 934 glBindTexture (GL_TEXTURE_2D, name);
935
776 if (wrap_mode) { 936 if (wrap_mode)
937 {
777 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 938 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
778 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 939 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
779 } 940 }
941
780 glBegin (GL_QUADS); 942 glBegin (GL_QUADS);
781 glTexCoord2f (0, 0); glVertex2f (x , y ); 943 glTexCoord2f (0, 0); glVertex2f (x , y );
782 glTexCoord2f (0, t); glVertex2f (x , y + h); 944 glTexCoord2f (0, t); glVertex2f (x , y + h);
783 glTexCoord2f (s, t); glVertex2f (x + w, y + h); 945 glTexCoord2f (s, t); glVertex2f (x + w, y + h);
784 glTexCoord2f (s, 0); glVertex2f (x + w, y ); 946 glTexCoord2f (s, 0); glVertex2f (x + w, y );
785 glEnd (); 947 glEnd ();
948
949 if (ix)
950 glDisable (GL_BLEND);
786} 951}
787 952
788MODULE = CFClient PACKAGE = CFClient::Map 953MODULE = CFClient PACKAGE = CFClient::Map
789 954
790CFClient::Map 955CFClient::Map
1299 } *civ, const_iv[] = { 1464 } *civ, const_iv[] = {
1300# define const_iv(name) { # name, (IV)name } 1465# define const_iv(name) { # name, (IV)name }
1301 const_iv (GL_COLOR_MATERIAL), 1466 const_iv (GL_COLOR_MATERIAL),
1302 const_iv (GL_SMOOTH), 1467 const_iv (GL_SMOOTH),
1303 const_iv (GL_FLAT), 1468 const_iv (GL_FLAT),
1469 const_iv (GL_DITHER),
1304 const_iv (GL_BLEND), 1470 const_iv (GL_BLEND),
1471 const_iv (GL_SCISSOR_TEST),
1305 const_iv (GL_AND), 1472 const_iv (GL_AND),
1473 const_iv (GL_ONE),
1474 const_iv (GL_ZERO),
1306 const_iv (GL_SRC_ALPHA), 1475 const_iv (GL_SRC_ALPHA),
1476 const_iv (GL_SRC_ALPHA_SATURATE),
1307 const_iv (GL_ONE_MINUS_SRC_ALPHA), 1477 const_iv (GL_ONE_MINUS_SRC_ALPHA),
1478 const_iv (GL_ONE_MINUS_DST_ALPHA),
1308 const_iv (GL_RGB), 1479 const_iv (GL_RGB),
1309 const_iv (GL_RGBA), 1480 const_iv (GL_RGBA),
1310 const_iv (GL_UNSIGNED_BYTE), 1481 const_iv (GL_UNSIGNED_BYTE),
1311 const_iv (GL_ALPHA4),
1312 const_iv (GL_ALPHA), 1482 const_iv (GL_ALPHA),
1483 const_iv (GL_LUMINANCE),
1313 const_iv (GL_FLOAT), 1484 const_iv (GL_FLOAT),
1314 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 1485 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
1315 const_iv (GL_COMPILE), 1486 const_iv (GL_COMPILE),
1316 const_iv (GL_TEXTURE_1D), 1487 const_iv (GL_TEXTURE_1D),
1317 const_iv (GL_TEXTURE_2D), 1488 const_iv (GL_TEXTURE_2D),
1323 const_iv (GL_TEXTURE_WRAP_T), 1494 const_iv (GL_TEXTURE_WRAP_T),
1324 const_iv (GL_CLAMP), 1495 const_iv (GL_CLAMP),
1325 const_iv (GL_REPEAT), 1496 const_iv (GL_REPEAT),
1326 const_iv (GL_NEAREST), 1497 const_iv (GL_NEAREST),
1327 const_iv (GL_LINEAR), 1498 const_iv (GL_LINEAR),
1499 const_iv (GL_NEAREST_MIPMAP_NEAREST),
1500 const_iv (GL_LINEAR_MIPMAP_NEAREST),
1501 const_iv (GL_NEAREST_MIPMAP_LINEAR),
1502 const_iv (GL_LINEAR_MIPMAP_LINEAR),
1503 const_iv (GL_GENERATE_MIPMAP),
1328 const_iv (GL_MODULATE), 1504 const_iv (GL_MODULATE),
1505 const_iv (GL_DECAL),
1329 const_iv (GL_REPLACE), 1506 const_iv (GL_REPLACE),
1330 const_iv (GL_COLOR_BUFFER_BIT), 1507 const_iv (GL_COLOR_BUFFER_BIT),
1331 const_iv (GL_PROJECTION), 1508 const_iv (GL_PROJECTION),
1332 const_iv (GL_MODELVIEW), 1509 const_iv (GL_MODELVIEW),
1333 const_iv (GL_COLOR_LOGIC_OP), 1510 const_iv (GL_COLOR_LOGIC_OP),
1511 const_iv (GL_SEPARABLE_2D),
1334 const_iv (GL_CONVOLUTION_2D), 1512 const_iv (GL_CONVOLUTION_2D),
1335 const_iv (GL_CONVOLUTION_BORDER_MODE), 1513 const_iv (GL_CONVOLUTION_BORDER_MODE),
1336 const_iv (GL_CONSTANT_BORDER), 1514 const_iv (GL_CONSTANT_BORDER),
1337 const_iv (GL_LINES), 1515 const_iv (GL_LINES),
1338 const_iv (GL_QUADS), 1516 const_iv (GL_QUADS),
1363 1541
1364void glBlendFunc (int sfactor, int dfactor) 1542void glBlendFunc (int sfactor, int dfactor)
1365 1543
1366void glLogicOp (int opcode) 1544void glLogicOp (int opcode)
1367 1545
1546void glColorMask (int red, int green, int blue, int alpha)
1547
1368void glMatrixMode (int mode) 1548void glMatrixMode (int mode)
1369 1549
1370void glPushMatrix () 1550void glPushMatrix ()
1371 1551
1372void glPopMatrix () 1552void glPopMatrix ()
1373 1553
1374void glLoadIdentity () 1554void glLoadIdentity ()
1375 1555
1556# near and far are due to microsofts buggy c compiler
1376void glOrtho (double left, double right, double bottom, double top, double near, double far) 1557void glOrtho (double left, double right, double bottom, double top, double near_, double far_)
1377 1558
1378void glViewport (int x, int y, int width, int height) 1559void glViewport (int x, int y, int width, int height)
1560
1561void glScissor (int x, int y, int width, int height)
1379 1562
1380void glTranslate (float x, float y, float z = 0.) 1563void glTranslate (float x, float y, float z = 0.)
1381 CODE: 1564 CODE:
1382 glTranslatef (x, y, z); 1565 glTranslatef (x, y, z);
1383 1566
1384void glScale (float x, float y, float z) 1567void glScale (float x, float y, float z = 1.)
1385 CODE: 1568 CODE:
1386 glScalef (x, y, z); 1569 glScalef (x, y, z);
1387 1570
1388void glRotate (float angle, float x, float y, float z) 1571void glRotate (float angle, float x, float y, float z)
1389 CODE: 1572 CODE:
1394void glEnd () 1577void glEnd ()
1395 1578
1396void glColor (float r, float g, float b, float a = 1.0) 1579void glColor (float r, float g, float b, float a = 1.0)
1397 PROTOTYPE: @ 1580 PROTOTYPE: @
1398 CODE: 1581 CODE:
1399 glColor4f (r, g, b, a); 1582 glColor4ub (r * 255., g * 255., b * 255., a * 255.);
1400 1583
1401void glVertex (float x, float y, float z = 0.) 1584void glVertex (float x, float y, float z = 0.)
1402 CODE: 1585 CODE:
1403 glVertex3f (x, y, z); 1586 glVertex3f (x, y, z);
1404 1587
1416 1599
1417void glBindTexture (int target, int name) 1600void glBindTexture (int target, int name)
1418 1601
1419void glConvolutionParameter (int target, int pname, float params) 1602void glConvolutionParameter (int target, int pname, float params)
1420 CODE: 1603 CODE:
1421 glConvolutionParameterf (target, pname, params); 1604 GL_CALL (PFNGLCONVOLUTIONPARAMETERFEXTPROC, glConvolutionParameterf, (target, pname, params));
1422 1605
1423void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data) 1606void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data)
1607 CODE:
1608 GL_CALL (PFNGLCONVOLUTIONFILTER2DEXTPROC, glConvolutionFilter2D,
1609 (target, internalformat, width, height, format, type, data));
1610
1611void glSeparableFilter2D (int target, int internalformat, int width, int height, int format, int type, char *row, char *column)
1612 CODE:
1613 GL_CALL (PFNGLSEPARABLEFILTER2DEXTPROC, glSeparableFilter2D,
1614 (target, internalformat, width, height, format, type, row, column));
1424 1615
1425void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data) 1616void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data)
1426 1617
1427void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 1618void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
1619
1620void glRasterPos (int x, int y)
1621 CODE:
1622 glRasterPos2i (x, y);
1623
1624void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR)
1428 1625
1429int glGenTexture () 1626int glGenTexture ()
1430 CODE: 1627 CODE:
1431{ 1628{
1432 GLuint name; 1629 GLuint name;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines