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.63 by root, Mon Apr 24 06:05:33 2006 UTC vs.
Revision 1.93 by root, Tue May 23 18:54:37 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>
42#define MAP_EXTEND_X 32 48#define MAP_EXTEND_X 32
43#define MAP_EXTEND_Y 512 49#define MAP_EXTEND_Y 512
44 50
45#define MIN_FONT_HEIGHT 10 51#define MIN_FONT_HEIGHT 10
46 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
47typedef Mix_Chunk *CFClient__MixChunk; 68typedef Mix_Chunk *CFClient__MixChunk;
48typedef Mix_Music *CFClient__MixMusic; 69typedef Mix_Music *CFClient__MixMusic;
49 70
50typedef PangoFontDescription *CFClient__Font; 71typedef PangoFontDescription *CFClient__Font;
51 72
52typedef struct cf_layout { 73typedef struct cf_layout {
53 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
54 int base_height; 77 int base_height;
55 CFClient__Font font; 78 CFClient__Font font;
56} *CFClient__Layout; 79} *CFClient__Layout;
57 80
58static CFClient__Font default_font; 81static CFClient__Font default_font;
59static PangoContext *context; 82static PangoContext *ft2_context, *cairo_context;
60static PangoFontMap *fontmap; 83static PangoFontMap *ft2_fontmap, *cairo_fontmap;
61 84
62static void 85static void
63substitute_func (FcPattern *pattern, gpointer data) 86substitute_func (FcPattern *pattern, gpointer data)
64{ 87{
65 FcPatternAddBool (pattern, FC_HINTING , 1); 88 FcPatternAddBool (pattern, FC_HINTING , 1);
89#ifdef _WIN32
90 FcPatternAddBool (pattern, FC_AUTOHINT, 1);
91#else
66 FcPatternAddBool (pattern, FC_AUTOHINT, 0); 92 FcPatternAddBool (pattern, FC_AUTOHINT, 0);
93#endif
67} 94}
68 95
69static void 96static void
70layout_update_font (CFClient__Layout self) 97layout_update_font (CFClient__Layout self)
71{ 98{
83static void 110static void
84layout_get_pixel_size (CFClient__Layout self, int *w, int *h) 111layout_get_pixel_size (CFClient__Layout self, int *w, int *h)
85{ 112{
86 pango_layout_get_pixel_size (self->pl, w, h); 113 pango_layout_get_pixel_size (self->pl, w, h);
87 114
88 *w = (*w + 3) & ~3;
89 if (!*w) *w = 1; 115 if (!*w) *w = 1;
90 if (!*h) *h = 1; 116 if (!*h) *h = 1;
117
118 *w = (*w + 3) & ~3;
91} 119}
92 120
93typedef uint16_t mapface; 121typedef uint16_t mapface;
94 122
95typedef struct { 123typedef struct {
243 } 271 }
244 } 272 }
245} 273}
246 274
247static void 275static void
248music_finished () 276music_finished (void)
249{ 277{
250 SDL_UserEvent ev; 278 SDL_UserEvent ev;
251 279
252 ev.type = SDL_USEREVENT; 280 ev.type = SDL_USEREVENT;
253 ev.code = 0; 281 ev.code = 0;
254 ev.data1 = 0; 282 ev.data1 = 0;
283 ev.data2 = 0;
284
285 SDL_PushEvent ((SDL_Event *)&ev);
286}
287
288static void
289channel_finished (int channel)
290{
291 SDL_UserEvent ev;
292
293 ev.type = SDL_USEREVENT;
294 ev.code = 1;
295 ev.data1 = (void *)(long)channel;
255 ev.data2 = 0; 296 ev.data2 = 0;
256 297
257 SDL_PushEvent ((SDL_Event *)&ev); 298 SDL_PushEvent ((SDL_Event *)&ev);
258} 299}
259 300
370# undef const_iv 411# undef const_iv
371 }; 412 };
372 413
373 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; )
374 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 415 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
416}
375 417
418void
419pango_init ()
420 CODE:
421{
422 // delayed, so it can pick up new fonts added by AddFontResourceEx
376 fontmap = pango_ft2_font_map_new (); 423 ft2_fontmap = pango_ft2_font_map_new ();
377 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);
378 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);
379} 429}
380 430
381int 431int
382SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO) 432SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO)
383 433
393 SDL_GL_SetAttribute (SDL_GL_RED_SIZE, 5); 443 SDL_GL_SetAttribute (SDL_GL_RED_SIZE, 5);
394 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 5); 444 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 5);
395 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5); 445 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5);
396 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, 1); 446 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, 1);
397 447
448 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
449 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 16);
450
398 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE, 0); 451 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE, 0);
399 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0); 452 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0);
400 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE, 0); 453 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE, 0);
401 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0); 454 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0);
402 455
403 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 456 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
404 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
405 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0);
406 457
407 SDL_EnableUNICODE (1); 458 SDL_EnableUNICODE (1);
408 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); 459 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
409 460
410 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 461 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
419 470
420 ++m; 471 ++m;
421 } 472 }
422} 473}
423 474
475char *
476SDL_GetError ()
477
424int 478int
425SDL_SetVideoMode (int w, int h, int fullscreen) 479SDL_SetVideoMode (int w, int h, int fullscreen)
426 CODE: 480 CODE:
427 RETVAL = !!SDL_SetVideoMode ( 481 RETVAL = !!SDL_SetVideoMode (
428 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0) 482 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0)
437void 491void
438SDL_PollEvent () 492SDL_PollEvent ()
439 PPCODE: 493 PPCODE:
440{ 494{
441 SDL_Event ev; 495 SDL_Event ev;
496 int i;
497 static int modifier;
498 static int modkey[] = {
499 SDLK_RSHIFT, KMOD_RSHIFT,
500 SDLK_LSHIFT, KMOD_LSHIFT,
501 SDLK_RCTRL, KMOD_RCTRL,
502 SDLK_LCTRL, KMOD_LCTRL,
503 SDLK_RALT, KMOD_RALT,
504 SDLK_LALT, KMOD_LALT,
505 SDLK_RMETA, KMOD_RMETA,
506 SDLK_LMETA, KMOD_LMETA,
507 };
442 508
443 while (SDL_PollEvent (&ev)) 509 while (SDL_PollEvent (&ev))
444 { 510 {
445 HV *hv = newHV (); 511 HV *hv = newHV ();
446 hv_store (hv, "type", 4, newSViv (ev.type), 0); 512 hv_store (hv, "type", 4, newSViv (ev.type), 0);
513
447 switch (ev.type) 514 switch (ev.type)
448 { 515 {
449 case SDL_KEYDOWN: 516 case SDL_KEYDOWN:
450 case SDL_KEYUP: 517 case SDL_KEYUP:
518
519 for (i = 0; i < sizeof (modkey) / (sizeof (int) * 2); i++)
520 if (modkey [i * 2] == ev.key.keysym.sym)
521 {
522 if (ev.type == SDL_KEYDOWN)
523 modifier |= modkey [i * 2 + 1];
524 else
525 modifier &= ~modkey [i * 2 + 1];
526 break;
527 }
528
451 hv_store (hv, "state", 5, newSViv (ev.key.state), 0); 529 hv_store (hv, "state", 5, newSViv (ev.key.state), 0);
452 hv_store (hv, "sym", 3, newSViv (ev.key.keysym.sym), 0); 530 hv_store (hv, "sym", 3, newSViv (ev.key.keysym.sym), 0);
453 hv_store (hv, "mod", 3, newSViv (ev.key.keysym.mod), 0); 531 hv_store (hv, "mod", 3, newSViv (ev.key.keysym.mod), 0);
454 hv_store (hv, "unicode", 7, newSViv (ev.key.keysym.unicode), 0); 532 hv_store (hv, "unicode", 7, newSViv (ev.key.keysym.unicode), 0);
455 break; 533 break;
458 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0); 536 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0);
459 hv_store (hv, "state", 5, newSViv (ev.active.state), 0); 537 hv_store (hv, "state", 5, newSViv (ev.active.state), 0);
460 break; 538 break;
461 539
462 case SDL_MOUSEMOTION: 540 case SDL_MOUSEMOTION:
541 hv_store (hv, "mod", 3, newSViv (modifier), 0);
542
463 hv_store (hv, "state", 5, newSViv (ev.motion.state), 0); 543 hv_store (hv, "state", 5, newSViv (ev.motion.state), 0);
464 hv_store (hv, "x", 1, newSViv (ev.motion.x), 0); 544 hv_store (hv, "x", 1, newSViv (ev.motion.x), 0);
465 hv_store (hv, "y", 1, newSViv (ev.motion.y), 0); 545 hv_store (hv, "y", 1, newSViv (ev.motion.y), 0);
466 hv_store (hv, "xrel", 4, newSViv (ev.motion.xrel), 0); 546 hv_store (hv, "xrel", 4, newSViv (ev.motion.xrel), 0);
467 hv_store (hv, "yrel", 4, newSViv (ev.motion.yrel), 0); 547 hv_store (hv, "yrel", 4, newSViv (ev.motion.yrel), 0);
468 break; 548 break;
469 549
470 case SDL_MOUSEBUTTONDOWN: 550 case SDL_MOUSEBUTTONDOWN:
471 case SDL_MOUSEBUTTONUP: 551 case SDL_MOUSEBUTTONUP:
552 hv_store (hv, "mod", 3, newSViv (modifier), 0);
553
472 hv_store (hv, "button", 6, newSViv (ev.button.button), 0); 554 hv_store (hv, "button", 6, newSViv (ev.button.button), 0);
473 hv_store (hv, "state", 5, newSViv (ev.button.state), 0); 555 hv_store (hv, "state", 5, newSViv (ev.button.state), 0);
474 hv_store (hv, "x", 1, newSViv (ev.button.x), 0); 556 hv_store (hv, "x", 1, newSViv (ev.button.x), 0);
475 hv_store (hv, "y", 1, newSViv (ev.button.y), 0); 557 hv_store (hv, "y", 1, newSViv (ev.button.y), 0);
558 break;
559
560 case SDL_USEREVENT:
561 hv_store (hv, "code", 4, newSViv (ev.user.code), 0);
562 hv_store (hv, "data1", 5, newSViv ((IV)ev.user.data1), 0);
563 hv_store (hv, "data2", 5, newSViv ((IV)ev.user.data2), 0);
564 break;
476 } 565 }
477 566
478 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv))); 567 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv)));
479 } 568 }
480} 569}
481 570
482int 571int
483Mix_OpenAudio (int frequency = 22050, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 512) 572Mix_OpenAudio (int frequency = 48000, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 2048)
484 POSTCALL: 573 POSTCALL:
485 Mix_HookMusicFinished (music_finished); 574 Mix_HookMusicFinished (music_finished);
575 Mix_ChannelFinished (channel_finished);
486 576
487void 577void
488Mix_CloseAudio () 578Mix_CloseAudio ()
489 579
490int 580int
496#ifndef _WIN32 586#ifndef _WIN32
497 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val)); 587 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val));
498#endif 588#endif
499 589
500char * 590char *
591gl_vendor ()
592 CODE:
593 RETVAL = (char *)glGetString (GL_VENDOR);
594 OUTPUT:
595 RETVAL
596
597char *
501gl_version () 598gl_version ()
502 CODE: 599 CODE:
503 RETVAL = (char *)glGetString (GL_VERSION); 600 RETVAL = (char *)glGetString (GL_VERSION);
504 OUTPUT: 601 OUTPUT:
505 RETVAL 602 RETVAL
513 610
514void 611void
515add_font (char *file) 612add_font (char *file)
516 CODE: 613 CODE:
517 FcConfigAppFontAddFile (0, (const FcChar8 *)file); /* no idea wether this is required */ 614 FcConfigAppFontAddFile (0, (const FcChar8 *)file); /* no idea wether this is required */
615#ifdef _WIN32
616 // cairo... sigh... requires win2000
617 AddFontResourceEx (file, FR_PRIVATE, 0);
618#endif
518 619
519void 620void
520load_image_inline (SV *image_) 621load_image_inline (SV *image_)
521 ALIAS: 622 ALIAS:
522 load_image_file = 1 623 load_image_file = 1
604 PUSHs (sv_2mortal (newSViv (b / y))); 705 PUSHs (sv_2mortal (newSViv (b / y)));
605 PUSHs (sv_2mortal (newSViv (a / y))); 706 PUSHs (sv_2mortal (newSViv (a / y)));
606} 707}
607 708
608void 709void
710error (char *message)
711 CODE:
712 fprintf (stderr, "ERROR: %s\n", message);
713#ifdef _WIN32
714 MessageBox (0, message, "Crossfire+ Error", MB_OK | MB_ICONERROR);
715#endif
716
717void
609fatal (char *message) 718fatal (char *message)
610 CODE: 719 CODE:
720 fprintf (stderr, "FATAL: %s\n", message);
611#ifdef _WIN32 721#ifdef _WIN32
612 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND); 722 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR);
613#else
614 fprintf (stderr, "FATAL: %s\n", message);
615#endif 723#endif
616 exit (1); 724 exit (1);
617 725
618MODULE = CFClient PACKAGE = CFClient::Font 726MODULE = CFClient PACKAGE = CFClient::Font
619 727
620CFClient::Font 728CFClient::Font
621new_from_file (SV *class, char *path) 729new_from_file (SV *class, char *path, int id = 0)
622 CODE: 730 CODE:
623{ 731{
624 int count; 732 int count;
625 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, 0, 0, &count); 733 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count);
626 RETVAL = pango_fc_font_description_from_pattern (pattern, 0); 734 RETVAL = pango_fc_font_description_from_pattern (pattern, 0);
627 FcPatternDestroy (pattern); 735 FcPatternDestroy (pattern);
628} 736}
629 OUTPUT: 737 OUTPUT:
630 RETVAL 738 RETVAL
640 default_font = self; 748 default_font = self;
641 749
642MODULE = CFClient PACKAGE = CFClient::Layout 750MODULE = CFClient PACKAGE = CFClient::Layout
643 751
644CFClient::Layout 752CFClient::Layout
645new (SV *class, int base_height = MIN_FONT_HEIGHT) 753new (SV *class, int rgba = 0)
646 CODE: 754 CODE:
755#if _WIN32
756 rgba = 0;//D
757#endif
647 New (0, RETVAL, 1, struct cf_layout); 758 New (0, RETVAL, 1, struct cf_layout);
648 RETVAL->pl = pango_layout_new (context); 759
649 RETVAL->base_height = base_height; 760 RETVAL->pl = pango_layout_new (rgba ? cairo_context : ft2_context);
761 RETVAL->rgba = rgba;
762 RETVAL->r = 1.;
763 RETVAL->g = 1.;
764 RETVAL->b = 1.;
765 RETVAL->a = 1.;
766 RETVAL->base_height = MIN_FONT_HEIGHT;
650 RETVAL->font = 0; 767 RETVAL->font = 0;
768
651 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR); 769 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR);
652 pango_layout_set_font_description (RETVAL->pl, default_font); 770 layout_update_font (RETVAL);
653 OUTPUT: 771 OUTPUT:
654 RETVAL 772 RETVAL
655 773
656void 774void
657DESTROY (CFClient::Layout self) 775DESTROY (CFClient::Layout self)
658 CODE: 776 CODE:
659 g_object_unref (self->pl); 777 g_object_unref (self->pl);
660 Safefree (self); 778 Safefree (self);
661 779
780int
781is_rgba (CFClient::Layout self)
782 CODE:
783 RETVAL = self->rgba;
784 OUTPUT:
785 RETVAL
786
662void 787void
663set_text (CFClient::Layout self, SV *text_) 788set_text (CFClient::Layout self, SV *text_)
664 CODE: 789 CODE:
665{ 790{
666 STRLEN textlen; 791 STRLEN textlen;
684 CODE: 809 CODE:
685 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0); 810 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0);
686 SvUTF8_on (RETVAL); 811 SvUTF8_on (RETVAL);
687 OUTPUT: 812 OUTPUT:
688 RETVAL 813 RETVAL
814
815void
816set_foreground (CFClient::Layout self, float r, float g, float b, float a = 1.)
817 CODE:
818 self->r = r;
819 self->g = g;
820 self->b = b;
821 self->a = a;
689 822
690void 823void
691set_font (CFClient::Layout self, CFClient::Font font = 0) 824set_font (CFClient::Layout self, CFClient::Font font = 0)
692 CODE: 825 CODE:
693 if (self->font != font) 826 if (self->font != font)
709set_width (CFClient::Layout self, int max_width = -1) 842set_width (CFClient::Layout self, int max_width = -1)
710 CODE: 843 CODE:
711 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE); 844 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE);
712 845
713void 846void
847set_indent (CFClient::Layout self, int indent)
848 CODE:
849 pango_layout_set_indent (self->pl, indent * PANGO_SCALE);
850
851void
852set_spacing (CFClient::Layout self, int spacing)
853 CODE:
854 pango_layout_set_spacing (self->pl, spacing * PANGO_SCALE);
855
856void
857set_ellipsise (CFClient::Layout self, int ellipsise)
858 CODE:
859 pango_layout_set_ellipsize (self->pl,
860 ellipsise == 1 ? PANGO_ELLIPSIZE_START
861 : ellipsise == 2 ? PANGO_ELLIPSIZE_MIDDLE
862 : ellipsise == 3 ? PANGO_ELLIPSIZE_END
863 : PANGO_ELLIPSIZE_NONE
864 );
865
866void
867set_single_paragraph_mode (CFClient::Layout self, int spm)
868 CODE:
869 pango_layout_set_single_paragraph_mode (self->pl, !!spm);
870
871void
714size (CFClient::Layout self) 872size (CFClient::Layout self)
715 PPCODE: 873 PPCODE:
716{ 874{
717 int w, h; 875 int w, h;
718 876
751render (CFClient::Layout self) 909render (CFClient::Layout self)
752 PPCODE: 910 PPCODE:
753{ 911{
754 SV *retval; 912 SV *retval;
755 int w, h; 913 int w, h;
756 FT_Bitmap bitmap;
757 914
758 layout_get_pixel_size (self, &w, &h); 915 layout_get_pixel_size (self, &w, &h);
759 916
917 if (self->rgba)
918 {
919 cairo_surface_t *surface;
920 cairo_t *cairo;
921
922 retval = newSV (w * h * 4);
923 SvPOK_only (retval);
924 SvCUR_set (retval, w * h * 4);
925
926 memset (SvPVX (retval), 0, w * h * 4);
927
928 surface = cairo_image_surface_create_for_data (
929 (void*)SvPVX (retval), CAIRO_FORMAT_ARGB32, w, h, w * 4);
930 cairo = cairo_create (surface);
931 cairo_set_source_rgba (cairo, self->r, self->g, self->b, self->a);
932
933 pango_cairo_show_layout (cairo, self->pl);
934
935 cairo_destroy (cairo);
936 cairo_surface_destroy (surface);
937
938 // what a mess, and its premultiplied, too :(
939 {
940 uint32_t *p = (uint32_t *)SvPVX (retval);
941 uint32_t *e = p + w * h;
942
943 while (p < e)
944 {
945 uint32_t rgba = *p;
946 rgba = (rgba >> 24) | (rgba << 8);
947#if 0
948#ifdef _WIN32
949 {//D
950 uint8_t r = rgba >> 24;
951 uint8_t g = rgba >> 16;
952 uint8_t b = rgba >> 8;
953 uint8_t a = rgba >> 0;
954
955 rgba = (rgba & 0xffffff00) | a;
956 }
957#endif
958#endif
959 rgba = SDL_SwapBE32 (rgba);
960 *p++ = rgba;
961 }
962 }
963
964 EXTEND (SP, 5);
965 PUSHs (sv_2mortal (newSViv (w)));
966 PUSHs (sv_2mortal (newSViv (h)));
967 PUSHs (sv_2mortal (retval));
968 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
969 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
970 }
971 else
972 {
973 FT_Bitmap bitmap;
974
760 retval = newSV (w * h); 975 retval = newSV (w * h);
761 SvPOK_only (retval); 976 SvPOK_only (retval);
762 SvCUR_set (retval, w * h); 977 SvCUR_set (retval, w * h);
763 978
764 bitmap.rows = h; 979 bitmap.rows = h;
765 bitmap.width = w; 980 bitmap.width = w;
766 bitmap.pitch = w; 981 bitmap.pitch = w;
767 bitmap.buffer = (unsigned char*)SvPVX (retval); 982 bitmap.buffer = (unsigned char*)SvPVX (retval);
768 bitmap.num_grays = 256; 983 bitmap.num_grays = 256;
769 bitmap.pixel_mode = FT_PIXEL_MODE_GRAY; 984 bitmap.pixel_mode = FT_PIXEL_MODE_GRAY;
770 985
771 memset (bitmap.buffer, 0, w * h); 986 memset (bitmap.buffer, 0, w * h);
772 987
773 pango_ft2_render_layout (&bitmap, self->pl, 0 * PANGO_SCALE, 0 * PANGO_SCALE); 988 pango_ft2_render_layout (&bitmap, self->pl, 0 * PANGO_SCALE, 0 * PANGO_SCALE);
774 989
775 EXTEND (SP, 3); 990 EXTEND (SP, 5);
776 PUSHs (sv_2mortal (newSViv (w))); 991 PUSHs (sv_2mortal (newSViv (w)));
777 PUSHs (sv_2mortal (newSViv (h))); 992 PUSHs (sv_2mortal (newSViv (h)));
778 PUSHs (sv_2mortal (retval)); 993 PUSHs (sv_2mortal (retval));
994 PUSHs (sv_2mortal (newSViv (GL_ALPHA)));
995 PUSHs (sv_2mortal (newSViv (GL_ALPHA)));
996 }
779} 997}
780 998
781MODULE = CFClient PACKAGE = CFClient::Texture 999MODULE = CFClient PACKAGE = CFClient::Texture
782 1000
783void 1001void
784draw_quad (SV *self, float x, float y, float w = 0, float h = 0) 1002draw_quad (SV *self, float x, float y, float w = 0, float h = 0)
785 PROTOTYPE: $$$;$$ 1003 PROTOTYPE: $$$;$$
1004 ALIAS:
1005 draw_quad_alpha = 1
1006 draw_quad_alpha_premultiplied = 2
786 CODE: 1007 CODE:
787{ 1008{
788 HV *hv = (HV *)SvRV (self); 1009 HV *hv = (HV *)SvRV (self);
789 float s = SvNV (*hv_fetch (hv, "s", 1, 1)); 1010 float s = SvNV (*hv_fetch (hv, "s", 1, 1));
790 float t = SvNV (*hv_fetch (hv, "t", 1, 1)); 1011 float t = SvNV (*hv_fetch (hv, "t", 1, 1));
795 { 1016 {
796 w = SvNV (*hv_fetch (hv, "w", 1, 1)); 1017 w = SvNV (*hv_fetch (hv, "w", 1, 1));
797 h = SvNV (*hv_fetch (hv, "h", 1, 1)); 1018 h = SvNV (*hv_fetch (hv, "h", 1, 1));
798 } 1019 }
799 1020
1021 if (ix)
1022 {
1023 glEnable (GL_BLEND);
1024 glBlendFunc (ix == 1 ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1025 glEnable (GL_ALPHA_TEST);
1026 glAlphaFunc (GL_GREATER, 0.01f);
1027 }
1028
800 glBindTexture (GL_TEXTURE_2D, name); 1029 glBindTexture (GL_TEXTURE_2D, name);
1030
801 if (wrap_mode) { 1031 if (wrap_mode)
1032 {
802 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 1033 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
803 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 1034 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
804 } 1035 }
1036
805 glBegin (GL_QUADS); 1037 glBegin (GL_QUADS);
806 glTexCoord2f (0, 0); glVertex2f (x , y ); 1038 glTexCoord2f (0, 0); glVertex2f (x , y );
807 glTexCoord2f (0, t); glVertex2f (x , y + h); 1039 glTexCoord2f (0, t); glVertex2f (x , y + h);
808 glTexCoord2f (s, t); glVertex2f (x + w, y + h); 1040 glTexCoord2f (s, t); glVertex2f (x + w, y + h);
809 glTexCoord2f (s, 0); glVertex2f (x + w, y ); 1041 glTexCoord2f (s, 0); glVertex2f (x + w, y );
810 glEnd (); 1042 glEnd ();
1043
1044 if (ix)
1045 {
1046 glDisable (GL_ALPHA_TEST);
1047 glDisable (GL_BLEND);
1048 }
811} 1049}
812 1050
813MODULE = CFClient PACKAGE = CFClient::Map 1051MODULE = CFClient PACKAGE = CFClient::Map
814 1052
815CFClient::Map 1053CFClient::Map
1324 } *civ, const_iv[] = { 1562 } *civ, const_iv[] = {
1325# define const_iv(name) { # name, (IV)name } 1563# define const_iv(name) { # name, (IV)name }
1326 const_iv (GL_COLOR_MATERIAL), 1564 const_iv (GL_COLOR_MATERIAL),
1327 const_iv (GL_SMOOTH), 1565 const_iv (GL_SMOOTH),
1328 const_iv (GL_FLAT), 1566 const_iv (GL_FLAT),
1567 const_iv (GL_DITHER),
1329 const_iv (GL_BLEND), 1568 const_iv (GL_BLEND),
1569 const_iv (GL_CULL_FACE),
1570 const_iv (GL_SCISSOR_TEST),
1571 const_iv (GL_DEPTH_TEST),
1572 const_iv (GL_ALPHA_TEST),
1573 const_iv (GL_NORMALIZE),
1574 const_iv (GL_RESCALE_NORMAL),
1330 const_iv (GL_AND), 1575 const_iv (GL_AND),
1576 const_iv (GL_ONE),
1577 const_iv (GL_ZERO),
1331 const_iv (GL_SRC_ALPHA), 1578 const_iv (GL_SRC_ALPHA),
1579 const_iv (GL_SRC_ALPHA_SATURATE),
1332 const_iv (GL_ONE_MINUS_SRC_ALPHA), 1580 const_iv (GL_ONE_MINUS_SRC_ALPHA),
1581 const_iv (GL_ONE_MINUS_DST_ALPHA),
1333 const_iv (GL_RGB), 1582 const_iv (GL_RGB),
1334 const_iv (GL_RGBA), 1583 const_iv (GL_RGBA),
1335 const_iv (GL_UNSIGNED_BYTE), 1584 const_iv (GL_UNSIGNED_BYTE),
1336 const_iv (GL_ALPHA4), 1585 const_iv (GL_UNSIGNED_SHORT),
1586 const_iv (GL_UNSIGNED_INT),
1337 const_iv (GL_ALPHA), 1587 const_iv (GL_ALPHA),
1588 const_iv (GL_INTENSITY),
1589 const_iv (GL_LUMINANCE),
1590 const_iv (GL_LUMINANCE_ALPHA),
1338 const_iv (GL_FLOAT), 1591 const_iv (GL_FLOAT),
1339 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 1592 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
1340 const_iv (GL_COMPILE), 1593 const_iv (GL_COMPILE),
1341 const_iv (GL_TEXTURE_1D), 1594 const_iv (GL_TEXTURE_1D),
1342 const_iv (GL_TEXTURE_2D), 1595 const_iv (GL_TEXTURE_2D),
1353 const_iv (GL_NEAREST_MIPMAP_NEAREST), 1606 const_iv (GL_NEAREST_MIPMAP_NEAREST),
1354 const_iv (GL_LINEAR_MIPMAP_NEAREST), 1607 const_iv (GL_LINEAR_MIPMAP_NEAREST),
1355 const_iv (GL_NEAREST_MIPMAP_LINEAR), 1608 const_iv (GL_NEAREST_MIPMAP_LINEAR),
1356 const_iv (GL_LINEAR_MIPMAP_LINEAR), 1609 const_iv (GL_LINEAR_MIPMAP_LINEAR),
1357 const_iv (GL_GENERATE_MIPMAP), 1610 const_iv (GL_GENERATE_MIPMAP),
1358 const_iv (GL_LINEAR),
1359 const_iv (GL_MODULATE), 1611 const_iv (GL_MODULATE),
1612 const_iv (GL_DECAL),
1360 const_iv (GL_REPLACE), 1613 const_iv (GL_REPLACE),
1614 const_iv (GL_DEPTH_BUFFER_BIT),
1361 const_iv (GL_COLOR_BUFFER_BIT), 1615 const_iv (GL_COLOR_BUFFER_BIT),
1362 const_iv (GL_PROJECTION), 1616 const_iv (GL_PROJECTION),
1363 const_iv (GL_MODELVIEW), 1617 const_iv (GL_MODELVIEW),
1364 const_iv (GL_COLOR_LOGIC_OP), 1618 const_iv (GL_COLOR_LOGIC_OP),
1619 const_iv (GL_SEPARABLE_2D),
1365 const_iv (GL_CONVOLUTION_2D), 1620 const_iv (GL_CONVOLUTION_2D),
1366 const_iv (GL_CONVOLUTION_BORDER_MODE), 1621 const_iv (GL_CONVOLUTION_BORDER_MODE),
1367 const_iv (GL_CONSTANT_BORDER), 1622 const_iv (GL_CONSTANT_BORDER),
1368 const_iv (GL_LINES), 1623 const_iv (GL_LINES),
1624 const_iv (GL_LINE_LOOP),
1369 const_iv (GL_QUADS), 1625 const_iv (GL_QUADS),
1370 const_iv (GL_LINE_LOOP), 1626 const_iv (GL_QUAD_STRIP),
1627 const_iv (GL_TRIANGLES),
1628 const_iv (GL_TRIANGLE_STRIP),
1629 const_iv (GL_TRIANGLE_FAN),
1371 const_iv (GL_PERSPECTIVE_CORRECTION_HINT), 1630 const_iv (GL_PERSPECTIVE_CORRECTION_HINT),
1372 const_iv (GL_FASTEST), 1631 const_iv (GL_FASTEST),
1632 const_iv (GL_V2F),
1633 const_iv (GL_V3F),
1634 const_iv (GL_T2F_V3F),
1635 const_iv (GL_T2F_N3F_V3F),
1373# undef const_iv 1636# undef const_iv
1374 }; 1637 };
1375 1638
1376 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 1639 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
1377 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 1640 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
1392 1655
1393void glHint (int target, int mode) 1656void glHint (int target, int mode)
1394 1657
1395void glBlendFunc (int sfactor, int dfactor) 1658void glBlendFunc (int sfactor, int dfactor)
1396 1659
1660void glDepthMask (int flag)
1661
1397void glLogicOp (int opcode) 1662void glLogicOp (int opcode)
1398 1663
1664void glColorMask (int red, int green, int blue, int alpha)
1665
1399void glMatrixMode (int mode) 1666void glMatrixMode (int mode)
1400 1667
1401void glPushMatrix () 1668void glPushMatrix ()
1402 1669
1403void glPopMatrix () 1670void glPopMatrix ()
1404 1671
1405void glLoadIdentity () 1672void glLoadIdentity ()
1406 1673
1674# near_ and far_ are due to microsofts buggy "c" compiler
1675void glFrustum (double left, double right, double bottom, double top, double near_, double far_)
1676
1677# near_ and far_ are due to microsofts buggy "c" compiler
1407void glOrtho (double left, double right, double bottom, double top, double near, double far) 1678void glOrtho (double left, double right, double bottom, double top, double near_, double far_)
1408 1679
1409void glViewport (int x, int y, int width, int height) 1680void glViewport (int x, int y, int width, int height)
1681
1682void glScissor (int x, int y, int width, int height)
1410 1683
1411void glTranslate (float x, float y, float z = 0.) 1684void glTranslate (float x, float y, float z = 0.)
1412 CODE: 1685 CODE:
1413 glTranslatef (x, y, z); 1686 glTranslatef (x, y, z);
1414 1687
1425void glEnd () 1698void glEnd ()
1426 1699
1427void glColor (float r, float g, float b, float a = 1.0) 1700void glColor (float r, float g, float b, float a = 1.0)
1428 PROTOTYPE: @ 1701 PROTOTYPE: @
1429 CODE: 1702 CODE:
1430 glColor4f (r, g, b, a); 1703 // microsoft visual "c" rounds instead of truncating...
1704 glColor4ub (MIN ((int)(r * 255.f), 255),
1705 MIN ((int)(g * 255.f), 255),
1706 MIN ((int)(b * 255.f), 255),
1707 MIN ((int)(a * 255.f), 255));
1708
1709void glInterleavedArrays (int format, int stride, char *data)
1710
1711void glDrawElements (int mode, int count, int type, char *indices)
1712
1713# 1.2 void glDrawRangeElements (int mode, int start, int end
1714
1715void glRasterPos (float x, float y, float z = 0.)
1716 CODE:
1717 glRasterPos3f (0, 0, z);
1718 glBitmap (0, 0, 0, 0, x, y, 0);
1431 1719
1432void glVertex (float x, float y, float z = 0.) 1720void glVertex (float x, float y, float z = 0.)
1433 CODE: 1721 CODE:
1434 glVertex3f (x, y, z); 1722 glVertex3f (x, y, z);
1435 1723
1447 1735
1448void glBindTexture (int target, int name) 1736void glBindTexture (int target, int name)
1449 1737
1450void glConvolutionParameter (int target, int pname, float params) 1738void glConvolutionParameter (int target, int pname, float params)
1451 CODE: 1739 CODE:
1452 glConvolutionParameterf (target, pname, params); 1740 GL_CALL (PFNGLCONVOLUTIONPARAMETERFEXTPROC, glConvolutionParameterf, (target, pname, params));
1453 1741
1454void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data) 1742void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data)
1743 CODE:
1744 GL_CALL (PFNGLCONVOLUTIONFILTER2DEXTPROC, glConvolutionFilter2D,
1745 (target, internalformat, width, height, format, type, data));
1746
1747void glSeparableFilter2D (int target, int internalformat, int width, int height, int format, int type, char *row, char *column)
1748 CODE:
1749 GL_CALL (PFNGLSEPARABLEFILTER2DEXTPROC, glSeparableFilter2D,
1750 (target, internalformat, width, height, format, type, row, column));
1455 1751
1456void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data) 1752void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data)
1457 1753
1458void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 1754void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
1755
1756void glDrawPixels (int width, int height, int format, int type, char *pixels)
1757
1758void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR)
1459 1759
1460int glGenTexture () 1760int glGenTexture ()
1461 CODE: 1761 CODE:
1462{ 1762{
1463 GLuint name; 1763 GLuint name;
1488 1788
1489void glEndList () 1789void glEndList ()
1490 1790
1491void glCallList (int list) 1791void glCallList (int list)
1492 1792
1793

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines