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.80 by root, Sun May 14 22:58:24 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 {
240 } 267 }
241 } 268 }
242} 269}
243 270
244static void 271static void
245music_finished () 272music_finished (void)
246{ 273{
247 SDL_UserEvent ev; 274 SDL_UserEvent ev;
248 275
249 ev.type = SDL_USEREVENT; 276 ev.type = SDL_USEREVENT;
250 ev.code = 0; 277 ev.code = 0;
251 ev.data1 = 0; 278 ev.data1 = 0;
252 ev.data2 = 0; 279 ev.data2 = 0;
253 280
281 SDL_PushEvent ((SDL_Event *)&ev);
282}
283
284static void
285channel_finished (int channel)
286{
254 SDL_PushEvent (&ev); 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);
255} 295}
256 296
257MODULE = CFClient PACKAGE = CFClient 297MODULE = CFClient PACKAGE = CFClient
258 298
259PROTOTYPES: ENABLE 299PROTOTYPES: ENABLE
367# undef const_iv 407# undef const_iv
368 }; 408 };
369 409
370 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; )
371 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 411 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
412}
372 413
414void
415pango_init ()
416 CODE:
417{
418 // delayed, so it can pick up new fonts added by AddFontResourceEx
373 fontmap = pango_ft2_font_map_new (); 419 ft2_fontmap = pango_ft2_font_map_new ();
374 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);
375 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);
376} 425}
377 426
378int 427int
379SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO) 428SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO)
380 429
439 488
440 while (SDL_PollEvent (&ev)) 489 while (SDL_PollEvent (&ev))
441 { 490 {
442 HV *hv = newHV (); 491 HV *hv = newHV ();
443 hv_store (hv, "type", 4, newSViv (ev.type), 0); 492 hv_store (hv, "type", 4, newSViv (ev.type), 0);
493
444 switch (ev.type) 494 switch (ev.type)
445 { 495 {
446 case SDL_KEYDOWN: 496 case SDL_KEYDOWN:
447 case SDL_KEYUP: 497 case SDL_KEYUP:
448 hv_store (hv, "state", 5, newSViv (ev.key.state), 0); 498 hv_store (hv, "state", 5, newSViv (ev.key.state), 0);
468 case SDL_MOUSEBUTTONUP: 518 case SDL_MOUSEBUTTONUP:
469 hv_store (hv, "button", 6, newSViv (ev.button.button), 0); 519 hv_store (hv, "button", 6, newSViv (ev.button.button), 0);
470 hv_store (hv, "state", 5, newSViv (ev.button.state), 0); 520 hv_store (hv, "state", 5, newSViv (ev.button.state), 0);
471 hv_store (hv, "x", 1, newSViv (ev.button.x), 0); 521 hv_store (hv, "x", 1, newSViv (ev.button.x), 0);
472 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;
473 } 530 }
474 531
475 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv))); 532 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv)));
476 } 533 }
477} 534}
478 535
479int 536int
480Mix_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)
481 POSTCALL: 538 POSTCALL:
482 Mix_HookMusicFinished (music_finished); 539 Mix_HookMusicFinished (music_finished);
540 Mix_ChannelFinished (channel_finished);
483 541
484void 542void
485Mix_CloseAudio () 543Mix_CloseAudio ()
486 544
487int 545int
510 568
511void 569void
512add_font (char *file) 570add_font (char *file)
513 CODE: 571 CODE:
514 FcConfigAppFontAddFile (0, (const FcChar8 *)file); /* no idea wether this is required */ 572 FcConfigAppFontAddFile (0, (const FcChar8 *)file); /* no idea wether this is required */
515 573#ifdef _WIN32
516void 574 // cairo... sigh... requires win2000
517set_font (char *file) 575 AddFontResourceEx (file, FR_PRIVATE, 0);
518 CODE: 576#endif
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 577
527void 578void
528load_image_inline (SV *image_) 579load_image_inline (SV *image_)
529 ALIAS: 580 ALIAS:
530 load_image_file = 1 581 load_image_file = 1
612 PUSHs (sv_2mortal (newSViv (b / y))); 663 PUSHs (sv_2mortal (newSViv (b / y)));
613 PUSHs (sv_2mortal (newSViv (a / y))); 664 PUSHs (sv_2mortal (newSViv (a / y)));
614} 665}
615 666
616void 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
617fatal (char *message) 677fatal (char *message)
618 CODE: 678 CODE:
619#ifdef _WIN32 679#ifdef _WIN32
620 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);
621#else 681#else
622 fprintf (stderr, "FATAL: %s\n", message); 682 fprintf (stderr, "FATAL: %s\n", message);
623#endif 683#endif
624 exit (1); 684 exit (1);
625 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
626MODULE = CFClient PACKAGE = CFClient::Layout 710MODULE = CFClient PACKAGE = CFClient::Layout
627 711
628CFClient::Layout 712CFClient::Layout
629new (SV *class, int base_height = 10) 713new (SV *class, int rgba = 0)
630 CODE: 714 CODE:
631 New (0, RETVAL, 1, struct cf_layout); 715 New (0, RETVAL, 1, struct cf_layout);
632 RETVAL->base_height = base_height; 716
633 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
634 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);
635 OUTPUT: 728 OUTPUT:
636 RETVAL 729 RETVAL
637 730
638void 731void
639DESTROY (CFClient::Layout self) 732DESTROY (CFClient::Layout self)
640 CODE: 733 CODE:
641 g_object_unref (self->pl); 734 g_object_unref (self->pl);
642 Safefree (self); 735 Safefree (self);
643 736
737int
738is_rgba (CFClient::Layout self)
739 CODE:
740 RETVAL = self->rgba;
741 OUTPUT:
742 RETVAL
743
644void 744void
645set_text (CFClient::Layout self, SV *text_) 745set_text (CFClient::Layout self, SV *text_)
646 CODE: 746 CODE:
647{ 747{
648 STRLEN textlen; 748 STRLEN textlen;
668 SvUTF8_on (RETVAL); 768 SvUTF8_on (RETVAL);
669 OUTPUT: 769 OUTPUT:
670 RETVAL 770 RETVAL
671 771
672void 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
673set_height (CFClient::Layout self, int base_height) 790set_height (CFClient::Layout self, int base_height)
674 CODE: 791 CODE:
792 if (self->base_height != base_height)
793 {
675 self->base_height = base_height; 794 self->base_height = base_height;
795 layout_update_font (self);
796 }
676 797
677void 798void
678set_width (CFClient::Layout self, int max_width = -1) 799set_width (CFClient::Layout self, int max_width = -1)
679 CODE: 800 CODE:
680 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);
683size (CFClient::Layout self) 804size (CFClient::Layout self)
684 PPCODE: 805 PPCODE:
685{ 806{
686 int w, h; 807 int w, h;
687 808
688 layout_update (self);
689 layout_get_pixel_size (self, &w, &h); 809 layout_get_pixel_size (self, &w, &h);
690 810
691 EXTEND (SP, 2); 811 EXTEND (SP, 2);
692 PUSHs (sv_2mortal (newSViv (w))); 812 PUSHs (sv_2mortal (newSViv (w)));
693 PUSHs (sv_2mortal (newSViv (h))); 813 PUSHs (sv_2mortal (newSViv (h)));
696int 816int
697xy_to_index (CFClient::Layout self, int x, int y) 817xy_to_index (CFClient::Layout self, int x, int y)
698 CODE: 818 CODE:
699{ 819{
700 int index, trailing; 820 int index, trailing;
701
702 layout_update (self);
703 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);
704
705 RETVAL = index; 822 RETVAL = index;
706} 823}
707 OUTPUT: 824 OUTPUT:
708 RETVAL 825 RETVAL
709 826
710void 827void
711cursor_pos (CFClient::Layout self, int index) 828cursor_pos (CFClient::Layout self, int index)
712 PPCODE: 829 PPCODE:
713{ 830{
714 PangoRectangle strong_pos; 831 PangoRectangle strong_pos;
715 layout_update (self);
716 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0); 832 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0);
717 833
718 EXTEND (SP, 3); 834 EXTEND (SP, 3);
719 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE))); 835 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE)));
720 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE))); 836 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE)));
725render (CFClient::Layout self) 841render (CFClient::Layout self)
726 PPCODE: 842 PPCODE:
727{ 843{
728 SV *retval; 844 SV *retval;
729 int w, h; 845 int w, h;
730 FT_Bitmap bitmap;
731 846
732 layout_update (self);
733 layout_get_pixel_size (self, &w, &h); 847 layout_get_pixel_size (self, &w, &h);
734 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
735 retval = newSV (w * h); 895 retval = newSV (w * h);
736 SvPOK_only (retval); 896 SvPOK_only (retval);
737 SvCUR_set (retval, w * h); 897 SvCUR_set (retval, w * h);
738 898
739 bitmap.rows = h; 899 bitmap.rows = h;
740 bitmap.width = w; 900 bitmap.width = w;
741 bitmap.pitch = w; 901 bitmap.pitch = w;
742 bitmap.buffer = (unsigned char*)SvPVX (retval); 902 bitmap.buffer = (unsigned char*)SvPVX (retval);
743 bitmap.num_grays = 256; 903 bitmap.num_grays = 256;
744 bitmap.pixel_mode = FT_PIXEL_MODE_GRAY; 904 bitmap.pixel_mode = FT_PIXEL_MODE_GRAY;
745 905
746 memset (bitmap.buffer, 0, w * h); 906 memset (bitmap.buffer, 0, w * h);
747 907
748 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);
749 909
750 EXTEND (SP, 3); 910 EXTEND (SP, 5);
751 PUSHs (sv_2mortal (newSViv (w))); 911 PUSHs (sv_2mortal (newSViv (w)));
752 PUSHs (sv_2mortal (newSViv (h))); 912 PUSHs (sv_2mortal (newSViv (h)));
753 PUSHs (sv_2mortal (retval)); 913 PUSHs (sv_2mortal (retval));
914 PUSHs (sv_2mortal (newSViv (GL_ALPHA)));
915 PUSHs (sv_2mortal (newSViv (GL_ALPHA)));
916 }
754} 917}
755 918
756MODULE = CFClient PACKAGE = CFClient::Texture 919MODULE = CFClient PACKAGE = CFClient::Texture
757 920
758void 921void
759draw_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)
760 PROTOTYPE: $$$;$$ 923 PROTOTYPE: $$$;$$
924 ALIAS:
925 draw_quad_alpha = 1
926 draw_quad_alpha_premultiplied = 2
761 CODE: 927 CODE:
762{ 928{
763 HV *hv = (HV *)SvRV (self); 929 HV *hv = (HV *)SvRV (self);
764 float s = SvNV (*hv_fetch (hv, "s", 1, 1)); 930 float s = SvNV (*hv_fetch (hv, "s", 1, 1));
765 float t = SvNV (*hv_fetch (hv, "t", 1, 1)); 931 float t = SvNV (*hv_fetch (hv, "t", 1, 1));
770 { 936 {
771 w = SvNV (*hv_fetch (hv, "w", 1, 1)); 937 w = SvNV (*hv_fetch (hv, "w", 1, 1));
772 h = SvNV (*hv_fetch (hv, "h", 1, 1)); 938 h = SvNV (*hv_fetch (hv, "h", 1, 1));
773 } 939 }
774 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
775 glBindTexture (GL_TEXTURE_2D, name); 947 glBindTexture (GL_TEXTURE_2D, name);
948
776 if (wrap_mode) { 949 if (wrap_mode)
950 {
777 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 951 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
778 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 952 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
779 } 953 }
954
780 glBegin (GL_QUADS); 955 glBegin (GL_QUADS);
781 glTexCoord2f (0, 0); glVertex2f (x , y ); 956 glTexCoord2f (0, 0); glVertex2f (x , y );
782 glTexCoord2f (0, t); glVertex2f (x , y + h); 957 glTexCoord2f (0, t); glVertex2f (x , y + h);
783 glTexCoord2f (s, t); glVertex2f (x + w, y + h); 958 glTexCoord2f (s, t); glVertex2f (x + w, y + h);
784 glTexCoord2f (s, 0); glVertex2f (x + w, y ); 959 glTexCoord2f (s, 0); glVertex2f (x + w, y );
785 glEnd (); 960 glEnd ();
961
962 if (ix)
963 glDisable (GL_BLEND);
786} 964}
787 965
788MODULE = CFClient PACKAGE = CFClient::Map 966MODULE = CFClient PACKAGE = CFClient::Map
789 967
790CFClient::Map 968CFClient::Map
1299 } *civ, const_iv[] = { 1477 } *civ, const_iv[] = {
1300# define const_iv(name) { # name, (IV)name } 1478# define const_iv(name) { # name, (IV)name }
1301 const_iv (GL_COLOR_MATERIAL), 1479 const_iv (GL_COLOR_MATERIAL),
1302 const_iv (GL_SMOOTH), 1480 const_iv (GL_SMOOTH),
1303 const_iv (GL_FLAT), 1481 const_iv (GL_FLAT),
1482 const_iv (GL_DITHER),
1304 const_iv (GL_BLEND), 1483 const_iv (GL_BLEND),
1484 const_iv (GL_SCISSOR_TEST),
1305 const_iv (GL_AND), 1485 const_iv (GL_AND),
1486 const_iv (GL_ONE),
1487 const_iv (GL_ZERO),
1306 const_iv (GL_SRC_ALPHA), 1488 const_iv (GL_SRC_ALPHA),
1489 const_iv (GL_SRC_ALPHA_SATURATE),
1307 const_iv (GL_ONE_MINUS_SRC_ALPHA), 1490 const_iv (GL_ONE_MINUS_SRC_ALPHA),
1491 const_iv (GL_ONE_MINUS_DST_ALPHA),
1308 const_iv (GL_RGB), 1492 const_iv (GL_RGB),
1309 const_iv (GL_RGBA), 1493 const_iv (GL_RGBA),
1310 const_iv (GL_UNSIGNED_BYTE), 1494 const_iv (GL_UNSIGNED_BYTE),
1311 const_iv (GL_ALPHA4),
1312 const_iv (GL_ALPHA), 1495 const_iv (GL_ALPHA),
1496 const_iv (GL_LUMINANCE),
1313 const_iv (GL_FLOAT), 1497 const_iv (GL_FLOAT),
1314 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 1498 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
1315 const_iv (GL_COMPILE), 1499 const_iv (GL_COMPILE),
1316 const_iv (GL_TEXTURE_1D), 1500 const_iv (GL_TEXTURE_1D),
1317 const_iv (GL_TEXTURE_2D), 1501 const_iv (GL_TEXTURE_2D),
1323 const_iv (GL_TEXTURE_WRAP_T), 1507 const_iv (GL_TEXTURE_WRAP_T),
1324 const_iv (GL_CLAMP), 1508 const_iv (GL_CLAMP),
1325 const_iv (GL_REPEAT), 1509 const_iv (GL_REPEAT),
1326 const_iv (GL_NEAREST), 1510 const_iv (GL_NEAREST),
1327 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),
1328 const_iv (GL_MODULATE), 1517 const_iv (GL_MODULATE),
1518 const_iv (GL_DECAL),
1329 const_iv (GL_REPLACE), 1519 const_iv (GL_REPLACE),
1330 const_iv (GL_COLOR_BUFFER_BIT), 1520 const_iv (GL_COLOR_BUFFER_BIT),
1331 const_iv (GL_PROJECTION), 1521 const_iv (GL_PROJECTION),
1332 const_iv (GL_MODELVIEW), 1522 const_iv (GL_MODELVIEW),
1333 const_iv (GL_COLOR_LOGIC_OP), 1523 const_iv (GL_COLOR_LOGIC_OP),
1524 const_iv (GL_SEPARABLE_2D),
1334 const_iv (GL_CONVOLUTION_2D), 1525 const_iv (GL_CONVOLUTION_2D),
1335 const_iv (GL_CONVOLUTION_BORDER_MODE), 1526 const_iv (GL_CONVOLUTION_BORDER_MODE),
1336 const_iv (GL_CONSTANT_BORDER), 1527 const_iv (GL_CONSTANT_BORDER),
1337 const_iv (GL_LINES), 1528 const_iv (GL_LINES),
1338 const_iv (GL_QUADS), 1529 const_iv (GL_QUADS),
1363 1554
1364void glBlendFunc (int sfactor, int dfactor) 1555void glBlendFunc (int sfactor, int dfactor)
1365 1556
1366void glLogicOp (int opcode) 1557void glLogicOp (int opcode)
1367 1558
1559void glColorMask (int red, int green, int blue, int alpha)
1560
1368void glMatrixMode (int mode) 1561void glMatrixMode (int mode)
1369 1562
1370void glPushMatrix () 1563void glPushMatrix ()
1371 1564
1372void glPopMatrix () 1565void glPopMatrix ()
1373 1566
1374void glLoadIdentity () 1567void glLoadIdentity ()
1375 1568
1569# near and far are due to microsofts buggy c compiler
1376void 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_)
1377 1571
1378void 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)
1379 1575
1380void glTranslate (float x, float y, float z = 0.) 1576void glTranslate (float x, float y, float z = 0.)
1381 CODE: 1577 CODE:
1382 glTranslatef (x, y, z); 1578 glTranslatef (x, y, z);
1383 1579
1384void glScale (float x, float y, float z) 1580void glScale (float x, float y, float z = 1.)
1385 CODE: 1581 CODE:
1386 glScalef (x, y, z); 1582 glScalef (x, y, z);
1387 1583
1388void glRotate (float angle, float x, float y, float z) 1584void glRotate (float angle, float x, float y, float z)
1389 CODE: 1585 CODE:
1394void glEnd () 1590void glEnd ()
1395 1591
1396void glColor (float r, float g, float b, float a = 1.0) 1592void glColor (float r, float g, float b, float a = 1.0)
1397 PROTOTYPE: @ 1593 PROTOTYPE: @
1398 CODE: 1594 CODE:
1399 glColor4f (r, g, b, a); 1595 glColor4ub (MIN ((int)r * 256., 255),
1596 MIN ((int)g * 256., 255),
1597 MIN ((int)b * 256., 255),
1598 MIN ((int)a * 256., 255));
1400 1599
1401void glVertex (float x, float y, float z = 0.) 1600void glVertex (float x, float y, float z = 0.)
1402 CODE: 1601 CODE:
1403 glVertex3f (x, y, z); 1602 glVertex3f (x, y, z);
1404 1603
1416 1615
1417void glBindTexture (int target, int name) 1616void glBindTexture (int target, int name)
1418 1617
1419void glConvolutionParameter (int target, int pname, float params) 1618void glConvolutionParameter (int target, int pname, float params)
1420 CODE: 1619 CODE:
1421 glConvolutionParameterf (target, pname, params); 1620 GL_CALL (PFNGLCONVOLUTIONPARAMETERFEXTPROC, glConvolutionParameterf, (target, pname, params));
1422 1621
1423void 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));
1424 1631
1425void 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)
1426 1633
1427void 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)
1428 1641
1429int glGenTexture () 1642int glGenTexture ()
1430 CODE: 1643 CODE:
1431{ 1644{
1432 GLuint name; 1645 GLuint name;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines