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.84 by root, Wed May 17 15:18:57 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);
89#ifdef _WIN32
90 FcPatternAddBool (pattern, FC_AUTOHINT, 1);
91#else
58 FcPatternAddBool (pattern, FC_AUTOHINT, 0); 92 FcPatternAddBool (pattern, FC_AUTOHINT, 0);
93#endif
59} 94}
60 95
61static void 96static void
62layout_update (CFClient__Layout self) 97layout_update_font (CFClient__Layout self)
63{ 98{
64 /* use a random scale factor to account for unknown descenders, 0.8 works 99 /* use a random scale factor to account for unknown descenders, 0.8 works
65 * reasonably well with bitstream vera 100 * reasonably well with bitstream vera
66 */ 101 */
67 PangoFontDescription *font = pango_context_get_font_description (context); 102 PangoFontDescription *font = self->font ? self->font : default_font;
68 103
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); 104 pango_font_description_set_absolute_size (font,
74 pango_layout_context_changed (self->pl); 105 MAX (MIN_FONT_HEIGHT, self->base_height) * (PANGO_SCALE * 8 / 10));
75 } 106
107 pango_layout_set_font_description (self->pl, font);
76} 108}
77 109
78static void 110static void
79layout_get_pixel_size (CFClient__Layout self, int *w, int *h) 111layout_get_pixel_size (CFClient__Layout self, int *w, int *h)
80{ 112{
81 layout_update (self);
82
83 pango_layout_get_pixel_size (self->pl, w, h); 113 pango_layout_get_pixel_size (self->pl, w, h);
84 114
85 *w = (*w + 3) & ~3;
86 if (!*w) *w = 1; 115 if (!*w) *w = 1;
87 if (!*h) *h = 1; 116 if (!*h) *h = 1;
117
118 *w = (*w + 3) & ~3;
88} 119}
89 120
90typedef uint16_t mapface; 121typedef uint16_t mapface;
91 122
92typedef struct { 123typedef struct {
240 } 271 }
241 } 272 }
242} 273}
243 274
244static void 275static void
245music_finished () 276music_finished (void)
246{ 277{
247 SDL_UserEvent ev; 278 SDL_UserEvent ev;
248 279
249 ev.type = SDL_USEREVENT; 280 ev.type = SDL_USEREVENT;
250 ev.code = 0; 281 ev.code = 0;
251 ev.data1 = 0; 282 ev.data1 = 0;
252 ev.data2 = 0; 283 ev.data2 = 0;
253 284
285 SDL_PushEvent ((SDL_Event *)&ev);
286}
287
288static void
289channel_finished (int channel)
290{
254 SDL_PushEvent (&ev); 291 SDL_UserEvent ev;
292
293 ev.type = SDL_USEREVENT;
294 ev.code = 1;
295 ev.data1 = (void *)(long)channel;
296 ev.data2 = 0;
297
298 SDL_PushEvent ((SDL_Event *)&ev);
255} 299}
256 300
257MODULE = CFClient PACKAGE = CFClient 301MODULE = CFClient PACKAGE = CFClient
258 302
259PROTOTYPES: ENABLE 303PROTOTYPES: ENABLE
367# undef const_iv 411# undef const_iv
368 }; 412 };
369 413
370 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 414 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
371 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 415 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
416}
372 417
418void
419pango_init ()
420 CODE:
421{
422 // delayed, so it can pick up new fonts added by AddFontResourceEx
373 fontmap = pango_ft2_font_map_new (); 423 ft2_fontmap = pango_ft2_font_map_new ();
374 pango_ft2_font_map_set_default_substitute ((PangoFT2FontMap *)fontmap, substitute_func, 0, 0); 424 pango_ft2_font_map_set_default_substitute ((PangoFT2FontMap *)ft2_fontmap, substitute_func, 0, 0);
375 context = pango_ft2_font_map_create_context ((PangoFT2FontMap *)fontmap); 425 ft2_context = pango_ft2_font_map_create_context ((PangoFT2FontMap *)ft2_fontmap);
426
427 cairo_fontmap = pango_cairo_font_map_get_default ();
428 cairo_context = pango_cairo_font_map_create_context ((PangoCairoFontMap *)cairo_fontmap);
376} 429}
377 430
378int 431int
379SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO) 432SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO)
380 433
439 492
440 while (SDL_PollEvent (&ev)) 493 while (SDL_PollEvent (&ev))
441 { 494 {
442 HV *hv = newHV (); 495 HV *hv = newHV ();
443 hv_store (hv, "type", 4, newSViv (ev.type), 0); 496 hv_store (hv, "type", 4, newSViv (ev.type), 0);
497
444 switch (ev.type) 498 switch (ev.type)
445 { 499 {
446 case SDL_KEYDOWN: 500 case SDL_KEYDOWN:
447 case SDL_KEYUP: 501 case SDL_KEYUP:
448 hv_store (hv, "state", 5, newSViv (ev.key.state), 0); 502 hv_store (hv, "state", 5, newSViv (ev.key.state), 0);
468 case SDL_MOUSEBUTTONUP: 522 case SDL_MOUSEBUTTONUP:
469 hv_store (hv, "button", 6, newSViv (ev.button.button), 0); 523 hv_store (hv, "button", 6, newSViv (ev.button.button), 0);
470 hv_store (hv, "state", 5, newSViv (ev.button.state), 0); 524 hv_store (hv, "state", 5, newSViv (ev.button.state), 0);
471 hv_store (hv, "x", 1, newSViv (ev.button.x), 0); 525 hv_store (hv, "x", 1, newSViv (ev.button.x), 0);
472 hv_store (hv, "y", 1, newSViv (ev.button.y), 0); 526 hv_store (hv, "y", 1, newSViv (ev.button.y), 0);
527 break;
528
529 case SDL_USEREVENT:
530 hv_store (hv, "code", 4, newSViv (ev.user.code), 0);
531 hv_store (hv, "data1", 5, newSViv ((IV)ev.user.data1), 0);
532 hv_store (hv, "data2", 5, newSViv ((IV)ev.user.data2), 0);
533 break;
473 } 534 }
474 535
475 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv))); 536 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv)));
476 } 537 }
477} 538}
478 539
479int 540int
480Mix_OpenAudio (int frequency = 22050, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 512) 541Mix_OpenAudio (int frequency = 48000, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 2048)
481 POSTCALL: 542 POSTCALL:
482 Mix_HookMusicFinished (music_finished); 543 Mix_HookMusicFinished (music_finished);
544 Mix_ChannelFinished (channel_finished);
483 545
484void 546void
485Mix_CloseAudio () 547Mix_CloseAudio ()
486 548
487int 549int
510 572
511void 573void
512add_font (char *file) 574add_font (char *file)
513 CODE: 575 CODE:
514 FcConfigAppFontAddFile (0, (const FcChar8 *)file); /* no idea wether this is required */ 576 FcConfigAppFontAddFile (0, (const FcChar8 *)file); /* no idea wether this is required */
515 577#ifdef _WIN32
516void 578 // cairo... sigh... requires win2000
517set_font (char *file) 579 AddFontResourceEx (file, FR_PRIVATE, 0);
518 CODE: 580#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 581
527void 582void
528load_image_inline (SV *image_) 583load_image_inline (SV *image_)
529 ALIAS: 584 ALIAS:
530 load_image_file = 1 585 load_image_file = 1
612 PUSHs (sv_2mortal (newSViv (b / y))); 667 PUSHs (sv_2mortal (newSViv (b / y)));
613 PUSHs (sv_2mortal (newSViv (a / y))); 668 PUSHs (sv_2mortal (newSViv (a / y)));
614} 669}
615 670
616void 671void
672error (char *message)
673 CODE:
674#ifdef _WIN32
675 MessageBox (0, message, "Crossfire+ Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
676#else
677 fprintf (stderr, "ERROR: %s\n", message);
678#endif
679
680void
617fatal (char *message) 681fatal (char *message)
618 CODE: 682 CODE:
619#ifdef _WIN32 683#ifdef _WIN32
620 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND); 684 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
621#else 685#else
622 fprintf (stderr, "FATAL: %s\n", message); 686 fprintf (stderr, "FATAL: %s\n", message);
623#endif 687#endif
624 exit (1); 688 exit (1);
625 689
690MODULE = CFClient PACKAGE = CFClient::Font
691
692CFClient::Font
693new_from_file (SV *class, char *path, int id = 0)
694 CODE:
695{
696 int count;
697 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count);
698 RETVAL = pango_fc_font_description_from_pattern (pattern, 0);
699 FcPatternDestroy (pattern);
700}
701 OUTPUT:
702 RETVAL
703
704void
705DESTROY (CFClient::Font self)
706 CODE:
707 pango_font_description_free (self);
708
709void
710make_default (CFClient::Font self)
711 CODE:
712 default_font = self;
713
626MODULE = CFClient PACKAGE = CFClient::Layout 714MODULE = CFClient PACKAGE = CFClient::Layout
627 715
628CFClient::Layout 716CFClient::Layout
629new (SV *class, int base_height = 10) 717new (SV *class, int rgba = 0)
630 CODE: 718 CODE:
631 New (0, RETVAL, 1, struct cf_layout); 719 New (0, RETVAL, 1, struct cf_layout);
632 RETVAL->base_height = base_height; 720
633 RETVAL->pl = pango_layout_new (context); 721 RETVAL->pl = pango_layout_new (rgba ? cairo_context : ft2_context);
722 RETVAL->rgba = rgba;
723 RETVAL->r = 1.;
724 RETVAL->g = 1.;
725 RETVAL->b = 1.;
726 RETVAL->a = 1.;
727 RETVAL->base_height = MIN_FONT_HEIGHT;
728 RETVAL->font = 0;
729
634 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR); 730 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR);
731 layout_update_font (RETVAL);
635 OUTPUT: 732 OUTPUT:
636 RETVAL 733 RETVAL
637 734
638void 735void
639DESTROY (CFClient::Layout self) 736DESTROY (CFClient::Layout self)
640 CODE: 737 CODE:
641 g_object_unref (self->pl); 738 g_object_unref (self->pl);
642 Safefree (self); 739 Safefree (self);
643 740
741int
742is_rgba (CFClient::Layout self)
743 CODE:
744 RETVAL = self->rgba;
745 OUTPUT:
746 RETVAL
747
644void 748void
645set_text (CFClient::Layout self, SV *text_) 749set_text (CFClient::Layout self, SV *text_)
646 CODE: 750 CODE:
647{ 751{
648 STRLEN textlen; 752 STRLEN textlen;
668 SvUTF8_on (RETVAL); 772 SvUTF8_on (RETVAL);
669 OUTPUT: 773 OUTPUT:
670 RETVAL 774 RETVAL
671 775
672void 776void
777set_foreground (CFClient::Layout self, float r, float g, float b, float a = 1.)
778 CODE:
779 self->r = r;
780 self->g = g;
781 self->b = b;
782 self->a = a;
783
784void
785set_font (CFClient::Layout self, CFClient::Font font = 0)
786 CODE:
787 if (self->font != font)
788 {
789 self->font = font;
790 layout_update_font (self);
791 }
792
793void
673set_height (CFClient::Layout self, int base_height) 794set_height (CFClient::Layout self, int base_height)
674 CODE: 795 CODE:
796 if (self->base_height != base_height)
797 {
675 self->base_height = base_height; 798 self->base_height = base_height;
799 layout_update_font (self);
800 }
676 801
677void 802void
678set_width (CFClient::Layout self, int max_width = -1) 803set_width (CFClient::Layout self, int max_width = -1)
679 CODE: 804 CODE:
680 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE); 805 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE);
806
807void
808set_indent (CFClient::Layout self, int indent)
809 CODE:
810 pango_layout_set_indent (self->pl, indent * PANGO_SCALE);
811
812void
813set_spacing (CFClient::Layout self, int spacing)
814 CODE:
815 pango_layout_set_spacing (self->pl, spacing * PANGO_SCALE);
816
817void
818set_ellipsise (CFClient::Layout self, int ellipsise)
819 CODE:
820 pango_layout_set_ellipsize (self->pl,
821 ellipsise == 1 ? PANGO_ELLIPSIZE_START
822 : ellipsise == 2 ? PANGO_ELLIPSIZE_MIDDLE
823 : ellipsise == 3 ? PANGO_ELLIPSIZE_END
824 : PANGO_ELLIPSIZE_NONE
825 );
826
827void
828set_single_paragraph_mode (CFClient::Layout self, int spm)
829 CODE:
830 pango_layout_set_single_paragraph_mode (self->pl, !!spm);
681 831
682void 832void
683size (CFClient::Layout self) 833size (CFClient::Layout self)
684 PPCODE: 834 PPCODE:
685{ 835{
686 int w, h; 836 int w, h;
687 837
688 layout_update (self);
689 layout_get_pixel_size (self, &w, &h); 838 layout_get_pixel_size (self, &w, &h);
690 839
691 EXTEND (SP, 2); 840 EXTEND (SP, 2);
692 PUSHs (sv_2mortal (newSViv (w))); 841 PUSHs (sv_2mortal (newSViv (w)));
693 PUSHs (sv_2mortal (newSViv (h))); 842 PUSHs (sv_2mortal (newSViv (h)));
696int 845int
697xy_to_index (CFClient::Layout self, int x, int y) 846xy_to_index (CFClient::Layout self, int x, int y)
698 CODE: 847 CODE:
699{ 848{
700 int index, trailing; 849 int index, trailing;
701
702 layout_update (self);
703 pango_layout_xy_to_index (self->pl, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing); 850 pango_layout_xy_to_index (self->pl, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing);
704
705 RETVAL = index; 851 RETVAL = index;
706} 852}
707 OUTPUT: 853 OUTPUT:
708 RETVAL 854 RETVAL
709 855
710void 856void
711cursor_pos (CFClient::Layout self, int index) 857cursor_pos (CFClient::Layout self, int index)
712 PPCODE: 858 PPCODE:
713{ 859{
714 PangoRectangle strong_pos; 860 PangoRectangle strong_pos;
715 layout_update (self);
716 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0); 861 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0);
717 862
718 EXTEND (SP, 3); 863 EXTEND (SP, 3);
719 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE))); 864 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE)));
720 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE))); 865 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE)));
725render (CFClient::Layout self) 870render (CFClient::Layout self)
726 PPCODE: 871 PPCODE:
727{ 872{
728 SV *retval; 873 SV *retval;
729 int w, h; 874 int w, h;
730 FT_Bitmap bitmap;
731 875
732 layout_update (self);
733 layout_get_pixel_size (self, &w, &h); 876 layout_get_pixel_size (self, &w, &h);
734 877
878 if (self->rgba)
879 {
880 cairo_surface_t *surface;
881 cairo_t *cairo;
882
883 retval = newSV (w * h * 4);
884 SvPOK_only (retval);
885 SvCUR_set (retval, w * h * 4);
886
887 memset (SvPVX (retval), 0, w * h * 4);
888
889 surface = cairo_image_surface_create_for_data (
890 (void*)SvPVX (retval), CAIRO_FORMAT_ARGB32, w, h, w * 4);
891 cairo = cairo_create (surface);
892 cairo_set_source_rgba (cairo, self->r, self->g, self->b, self->a);
893
894 pango_cairo_show_layout (cairo, self->pl);
895
896 cairo_destroy (cairo);
897 cairo_surface_destroy (surface);
898
899 // what a mess, and its premultiplied, too :(
900 {
901 uint32_t *p = (uint32_t *)SvPVX (retval);
902 uint32_t *e = p + w * h;
903
904 while (p < e)
905 {
906 uint32_t rgba = *p;
907 rgba = (rgba >> 24) | (rgba << 8);
908 rgba = SDL_SwapBE32 (rgba);
909 *p++ = rgba;
910 }
911 }
912
913 EXTEND (SP, 5);
914 PUSHs (sv_2mortal (newSViv (w)));
915 PUSHs (sv_2mortal (newSViv (h)));
916 PUSHs (sv_2mortal (retval));
917 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
918 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
919 }
920 else
921 {
922 FT_Bitmap bitmap;
923
735 retval = newSV (w * h); 924 retval = newSV (w * h);
736 SvPOK_only (retval); 925 SvPOK_only (retval);
737 SvCUR_set (retval, w * h); 926 SvCUR_set (retval, w * h);
738 927
739 bitmap.rows = h; 928 bitmap.rows = h;
740 bitmap.width = w; 929 bitmap.width = w;
741 bitmap.pitch = w; 930 bitmap.pitch = w;
742 bitmap.buffer = (unsigned char*)SvPVX (retval); 931 bitmap.buffer = (unsigned char*)SvPVX (retval);
743 bitmap.num_grays = 256; 932 bitmap.num_grays = 256;
744 bitmap.pixel_mode = FT_PIXEL_MODE_GRAY; 933 bitmap.pixel_mode = FT_PIXEL_MODE_GRAY;
745 934
746 memset (bitmap.buffer, 0, w * h); 935 memset (bitmap.buffer, 0, w * h);
747 936
748 pango_ft2_render_layout (&bitmap, self->pl, 0 * PANGO_SCALE, 0 * PANGO_SCALE); 937 pango_ft2_render_layout (&bitmap, self->pl, 0 * PANGO_SCALE, 0 * PANGO_SCALE);
749 938
750 EXTEND (SP, 3); 939 EXTEND (SP, 5);
751 PUSHs (sv_2mortal (newSViv (w))); 940 PUSHs (sv_2mortal (newSViv (w)));
752 PUSHs (sv_2mortal (newSViv (h))); 941 PUSHs (sv_2mortal (newSViv (h)));
753 PUSHs (sv_2mortal (retval)); 942 PUSHs (sv_2mortal (retval));
943 PUSHs (sv_2mortal (newSViv (GL_ALPHA)));
944 PUSHs (sv_2mortal (newSViv (GL_ALPHA)));
945 }
754} 946}
755 947
756MODULE = CFClient PACKAGE = CFClient::Texture 948MODULE = CFClient PACKAGE = CFClient::Texture
757 949
758void 950void
759draw_quad (SV *self, float x, float y, float w = 0, float h = 0) 951draw_quad (SV *self, float x, float y, float w = 0, float h = 0)
760 PROTOTYPE: $$$;$$ 952 PROTOTYPE: $$$;$$
953 ALIAS:
954 draw_quad_alpha = 1
955 draw_quad_alpha_premultiplied = 2
761 CODE: 956 CODE:
762{ 957{
763 HV *hv = (HV *)SvRV (self); 958 HV *hv = (HV *)SvRV (self);
764 float s = SvNV (*hv_fetch (hv, "s", 1, 1)); 959 float s = SvNV (*hv_fetch (hv, "s", 1, 1));
765 float t = SvNV (*hv_fetch (hv, "t", 1, 1)); 960 float t = SvNV (*hv_fetch (hv, "t", 1, 1));
770 { 965 {
771 w = SvNV (*hv_fetch (hv, "w", 1, 1)); 966 w = SvNV (*hv_fetch (hv, "w", 1, 1));
772 h = SvNV (*hv_fetch (hv, "h", 1, 1)); 967 h = SvNV (*hv_fetch (hv, "h", 1, 1));
773 } 968 }
774 969
970 if (ix)
971 {
972 glEnable (GL_BLEND);
973 glBlendFunc (ix == 1 ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
974 }
975
775 glBindTexture (GL_TEXTURE_2D, name); 976 glBindTexture (GL_TEXTURE_2D, name);
977
776 if (wrap_mode) { 978 if (wrap_mode)
979 {
777 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 980 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
778 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 981 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
779 } 982 }
983
780 glBegin (GL_QUADS); 984 glBegin (GL_QUADS);
781 glTexCoord2f (0, 0); glVertex2f (x , y ); 985 glTexCoord2f (0, 0); glVertex2f (x , y );
782 glTexCoord2f (0, t); glVertex2f (x , y + h); 986 glTexCoord2f (0, t); glVertex2f (x , y + h);
783 glTexCoord2f (s, t); glVertex2f (x + w, y + h); 987 glTexCoord2f (s, t); glVertex2f (x + w, y + h);
784 glTexCoord2f (s, 0); glVertex2f (x + w, y ); 988 glTexCoord2f (s, 0); glVertex2f (x + w, y );
785 glEnd (); 989 glEnd ();
990
991 if (ix)
992 glDisable (GL_BLEND);
786} 993}
787 994
788MODULE = CFClient PACKAGE = CFClient::Map 995MODULE = CFClient PACKAGE = CFClient::Map
789 996
790CFClient::Map 997CFClient::Map
1299 } *civ, const_iv[] = { 1506 } *civ, const_iv[] = {
1300# define const_iv(name) { # name, (IV)name } 1507# define const_iv(name) { # name, (IV)name }
1301 const_iv (GL_COLOR_MATERIAL), 1508 const_iv (GL_COLOR_MATERIAL),
1302 const_iv (GL_SMOOTH), 1509 const_iv (GL_SMOOTH),
1303 const_iv (GL_FLAT), 1510 const_iv (GL_FLAT),
1511 const_iv (GL_DITHER),
1304 const_iv (GL_BLEND), 1512 const_iv (GL_BLEND),
1513 const_iv (GL_SCISSOR_TEST),
1305 const_iv (GL_AND), 1514 const_iv (GL_AND),
1515 const_iv (GL_ONE),
1516 const_iv (GL_ZERO),
1306 const_iv (GL_SRC_ALPHA), 1517 const_iv (GL_SRC_ALPHA),
1518 const_iv (GL_SRC_ALPHA_SATURATE),
1307 const_iv (GL_ONE_MINUS_SRC_ALPHA), 1519 const_iv (GL_ONE_MINUS_SRC_ALPHA),
1520 const_iv (GL_ONE_MINUS_DST_ALPHA),
1308 const_iv (GL_RGB), 1521 const_iv (GL_RGB),
1309 const_iv (GL_RGBA), 1522 const_iv (GL_RGBA),
1310 const_iv (GL_UNSIGNED_BYTE), 1523 const_iv (GL_UNSIGNED_BYTE),
1311 const_iv (GL_ALPHA4),
1312 const_iv (GL_ALPHA), 1524 const_iv (GL_ALPHA),
1525 const_iv (GL_LUMINANCE),
1313 const_iv (GL_FLOAT), 1526 const_iv (GL_FLOAT),
1314 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 1527 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
1315 const_iv (GL_COMPILE), 1528 const_iv (GL_COMPILE),
1316 const_iv (GL_TEXTURE_1D), 1529 const_iv (GL_TEXTURE_1D),
1317 const_iv (GL_TEXTURE_2D), 1530 const_iv (GL_TEXTURE_2D),
1323 const_iv (GL_TEXTURE_WRAP_T), 1536 const_iv (GL_TEXTURE_WRAP_T),
1324 const_iv (GL_CLAMP), 1537 const_iv (GL_CLAMP),
1325 const_iv (GL_REPEAT), 1538 const_iv (GL_REPEAT),
1326 const_iv (GL_NEAREST), 1539 const_iv (GL_NEAREST),
1327 const_iv (GL_LINEAR), 1540 const_iv (GL_LINEAR),
1541 const_iv (GL_NEAREST_MIPMAP_NEAREST),
1542 const_iv (GL_LINEAR_MIPMAP_NEAREST),
1543 const_iv (GL_NEAREST_MIPMAP_LINEAR),
1544 const_iv (GL_LINEAR_MIPMAP_LINEAR),
1545 const_iv (GL_GENERATE_MIPMAP),
1328 const_iv (GL_MODULATE), 1546 const_iv (GL_MODULATE),
1547 const_iv (GL_DECAL),
1329 const_iv (GL_REPLACE), 1548 const_iv (GL_REPLACE),
1330 const_iv (GL_COLOR_BUFFER_BIT), 1549 const_iv (GL_COLOR_BUFFER_BIT),
1331 const_iv (GL_PROJECTION), 1550 const_iv (GL_PROJECTION),
1332 const_iv (GL_MODELVIEW), 1551 const_iv (GL_MODELVIEW),
1333 const_iv (GL_COLOR_LOGIC_OP), 1552 const_iv (GL_COLOR_LOGIC_OP),
1553 const_iv (GL_SEPARABLE_2D),
1334 const_iv (GL_CONVOLUTION_2D), 1554 const_iv (GL_CONVOLUTION_2D),
1335 const_iv (GL_CONVOLUTION_BORDER_MODE), 1555 const_iv (GL_CONVOLUTION_BORDER_MODE),
1336 const_iv (GL_CONSTANT_BORDER), 1556 const_iv (GL_CONSTANT_BORDER),
1337 const_iv (GL_LINES), 1557 const_iv (GL_LINES),
1338 const_iv (GL_QUADS), 1558 const_iv (GL_QUADS),
1363 1583
1364void glBlendFunc (int sfactor, int dfactor) 1584void glBlendFunc (int sfactor, int dfactor)
1365 1585
1366void glLogicOp (int opcode) 1586void glLogicOp (int opcode)
1367 1587
1588void glColorMask (int red, int green, int blue, int alpha)
1589
1368void glMatrixMode (int mode) 1590void glMatrixMode (int mode)
1369 1591
1370void glPushMatrix () 1592void glPushMatrix ()
1371 1593
1372void glPopMatrix () 1594void glPopMatrix ()
1373 1595
1374void glLoadIdentity () 1596void glLoadIdentity ()
1375 1597
1598# near and far are due to microsofts buggy c compiler
1376void glOrtho (double left, double right, double bottom, double top, double near, double far) 1599void glOrtho (double left, double right, double bottom, double top, double near_, double far_)
1377 1600
1378void glViewport (int x, int y, int width, int height) 1601void glViewport (int x, int y, int width, int height)
1602
1603void glScissor (int x, int y, int width, int height)
1379 1604
1380void glTranslate (float x, float y, float z = 0.) 1605void glTranslate (float x, float y, float z = 0.)
1381 CODE: 1606 CODE:
1382 glTranslatef (x, y, z); 1607 glTranslatef (x, y, z);
1383 1608
1384void glScale (float x, float y, float z) 1609void glScale (float x, float y, float z = 1.)
1385 CODE: 1610 CODE:
1386 glScalef (x, y, z); 1611 glScalef (x, y, z);
1387 1612
1388void glRotate (float angle, float x, float y, float z) 1613void glRotate (float angle, float x, float y, float z)
1389 CODE: 1614 CODE:
1394void glEnd () 1619void glEnd ()
1395 1620
1396void glColor (float r, float g, float b, float a = 1.0) 1621void glColor (float r, float g, float b, float a = 1.0)
1397 PROTOTYPE: @ 1622 PROTOTYPE: @
1398 CODE: 1623 CODE:
1399 glColor4f (r, g, b, a); 1624 glColor4ub (MIN ((int)(r * 255.f), 255),
1625 MIN ((int)(g * 255.f), 255),
1626 MIN ((int)(b * 255.f), 255),
1627 MIN ((int)(a * 255.f), 255));
1400 1628
1401void glVertex (float x, float y, float z = 0.) 1629void glVertex (float x, float y, float z = 0.)
1402 CODE: 1630 CODE:
1403 glVertex3f (x, y, z); 1631 glVertex3f (x, y, z);
1404 1632
1416 1644
1417void glBindTexture (int target, int name) 1645void glBindTexture (int target, int name)
1418 1646
1419void glConvolutionParameter (int target, int pname, float params) 1647void glConvolutionParameter (int target, int pname, float params)
1420 CODE: 1648 CODE:
1421 glConvolutionParameterf (target, pname, params); 1649 GL_CALL (PFNGLCONVOLUTIONPARAMETERFEXTPROC, glConvolutionParameterf, (target, pname, params));
1422 1650
1423void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data) 1651void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data)
1652 CODE:
1653 GL_CALL (PFNGLCONVOLUTIONFILTER2DEXTPROC, glConvolutionFilter2D,
1654 (target, internalformat, width, height, format, type, data));
1655
1656void glSeparableFilter2D (int target, int internalformat, int width, int height, int format, int type, char *row, char *column)
1657 CODE:
1658 GL_CALL (PFNGLSEPARABLEFILTER2DEXTPROC, glSeparableFilter2D,
1659 (target, internalformat, width, height, format, type, row, column));
1424 1660
1425void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data) 1661void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data)
1426 1662
1427void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 1663void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
1664
1665void glRasterPos (int x, int y)
1666 CODE:
1667 glRasterPos2i (x, y);
1668
1669void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR)
1428 1670
1429int glGenTexture () 1671int glGenTexture ()
1430 CODE: 1672 CODE:
1431{ 1673{
1432 GLuint name; 1674 GLuint name;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines