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.208 by root, Sat Jul 21 16:07:53 2007 UTC vs.
Revision 1.220 by root, Thu Aug 9 11:02:08 2007 UTC

25#include <math.h> 25#include <math.h>
26#include <string.h> 26#include <string.h>
27#include <stdio.h> 27#include <stdio.h>
28#include <stdlib.h> 28#include <stdlib.h>
29 29
30#define USE_RWOPS 1 // for SDL_mixer:LoadMUS_RW
31
30#include <SDL.h> 32#include <SDL.h>
31#include <SDL_thread.h> 33#include <SDL_thread.h>
32#include <SDL_endian.h> 34#include <SDL_endian.h>
33#include <SDL_image.h> 35#include <SDL_image.h>
34#include <SDL_mixer.h> 36#include <SDL_mixer.h>
112 114
113#include "pango-font.c" 115#include "pango-font.c"
114#include "pango-fontmap.c" 116#include "pango-fontmap.c"
115#include "pango-render.c" 117#include "pango-render.c"
116 118
119typedef IV CFPlus__Channel;
120typedef SDL_RWops *CFPlus__RW;
117typedef Mix_Chunk *CFPlus__MixChunk; 121typedef Mix_Chunk *CFPlus__MixChunk;
118typedef Mix_Music *CFPlus__MixMusic; 122typedef Mix_Music *CFPlus__MixMusic;
119 123
120typedef PangoFontDescription *CFPlus__Font; 124typedef PangoFontDescription *CFPlus__Font;
121 125
434/* SDL should provide this, really. */ 438/* SDL should provide this, really. */
435#define SDLK_MODIFIER_MIN 300 439#define SDLK_MODIFIER_MIN 300
436#define SDLK_MODIFIER_MAX 314 440#define SDLK_MODIFIER_MAX 314
437 441
438/******************************************************************************/ 442/******************************************************************************/
443
444static GV *draw_x_gv, *draw_y_gv, *draw_w_gv, *draw_h_gv;
445static GV *hover_gv;
439 446
440static int 447static int
441within_widget (SV *widget, NV x, NV y) 448within_widget (SV *widget, NV x, NV y)
442{ 449{
443 HV *self; 450 HV *self;
797 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("CFPlus::UI::Event", 1)))); 804 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("CFPlus::UI::Event", 1))));
798 } 805 }
799} 806}
800 807
801int 808int
802Mix_OpenAudio (int frequency = 48000, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 2048) 809Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 1024)
803 POSTCALL: 810 POSTCALL:
804 Mix_HookMusicFinished (music_finished); 811 Mix_HookMusicFinished (music_finished);
805 Mix_ChannelFinished (channel_finished); 812 Mix_ChannelFinished (channel_finished);
806 813
807void 814void
808Mix_CloseAudio () 815Mix_CloseAudio ()
809 816
810int 817int
811Mix_AllocateChannels (int numchans = -1) 818Mix_AllocateChannels (int numchans = -1)
819
820const char *
821Mix_GetError ()
812 822
813void 823void
814lowdelay (int fd, int val = 1) 824lowdelay (int fd, int val = 1)
815 CODE: 825 CODE:
816 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&val, sizeof (val)); 826 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&val, sizeof (val));
858 STRLEN image_len; 868 STRLEN image_len;
859 char *image = (char *)SvPVbyte (image_, image_len); 869 char *image = (char *)SvPVbyte (image_, image_len);
860 SDL_Surface *surface, *surface2; 870 SDL_Surface *surface, *surface2;
861 SDL_PixelFormat fmt; 871 SDL_PixelFormat fmt;
862 SDL_RWops *rw = ix 872 SDL_RWops *rw = ix
863 ? SDL_RWFromFile (image, "r") 873 ? SDL_RWFromFile (image, "rb")
864 : SDL_RWFromConstMem (image, image_len); 874 : SDL_RWFromConstMem (image, image_len);
865 875
866 if (!rw) 876 if (!rw)
867 croak ("load_image: %s", SDL_GetError ()); 877 croak ("load_image: %s", SDL_GetError ());
868 878
1340 HV *hv = (HV *)SvRV (self); 1350 HV *hv = (HV *)SvRV (self);
1341 float s = SvNV (*hv_fetch (hv, "s", 1, 1)); 1351 float s = SvNV (*hv_fetch (hv, "s", 1, 1));
1342 float t = SvNV (*hv_fetch (hv, "t", 1, 1)); 1352 float t = SvNV (*hv_fetch (hv, "t", 1, 1));
1343 int name = SvIV (*hv_fetch (hv, "name", 4, 1)); 1353 int name = SvIV (*hv_fetch (hv, "name", 4, 1));
1344 1354
1355 if (name <= 0)
1356 XSRETURN_EMPTY;
1357
1345 if (items < 5) 1358 if (items < 5)
1346 { 1359 {
1347 w = SvNV (*hv_fetch (hv, "w", 1, 1)); 1360 w = SvNV (*hv_fetch (hv, "w", 1, 1));
1348 h = SvNV (*hv_fetch (hv, "h", 1, 1)); 1361 h = SvNV (*hv_fetch (hv, "h", 1, 1));
1349 } 1362 }
1686 RETVAL = map_sv; 1699 RETVAL = map_sv;
1687} 1700}
1688 OUTPUT: 1701 OUTPUT:
1689 RETVAL 1702 RETVAL
1690 1703
1691void 1704SV *
1692draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T) 1705draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T)
1693 CODE: 1706 CODE:
1694{ 1707{
1695 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 1708 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
1696 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level 1709 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
1697 static uint8_t smooth_max[256][256]; // egad, fats and wasteful on memory (64k) 1710 static uint8_t smooth_max[256][256]; // egad, fats and wasteful on memory (64k)
1698 smooth_key skey; 1711 smooth_key skey;
1699 int x, y, z; 1712 int x, y, z;
1700 int last_name; 1713 int last_name;
1714 AV *missing = newAV ();
1715 RETVAL = newRV_noinc ((SV *)missing);
1701 1716
1702 // thats current max. sorry. 1717 // thats current max. sorry.
1703 if (sw > 255) sw = 255; 1718 if (sw > 255) sw = 255;
1704 if (sh > 255) sh = 255; 1719 if (sh > 255) sh = 255;
1705 1720
1713 glEnable (GL_TEXTURE_2D); 1728 glEnable (GL_TEXTURE_2D);
1714 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1729 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1715 1730
1716 glBegin (GL_QUADS); 1731 glBegin (GL_QUADS);
1717 1732
1718 last_name = 0; 1733 last_name = -1;
1719 1734
1720 mx += self->x; 1735 mx += self->x;
1721 my += self->y; 1736 my += self->y;
1722 1737
1723 // first pass: determine smooth_max 1738 // first pass: determine smooth_max
1758 tileid tile = cell->tile [z]; 1773 tileid tile = cell->tile [z];
1759 1774
1760 if (tile) 1775 if (tile)
1761 { 1776 {
1762 maptex tex = self->tex [tile]; 1777 maptex tex = self->tex [tile];
1763 int px = (x + 1) * T - tex.w; 1778 int px, py;
1764 int py = (y + 1) * T - tex.h;
1765 1779
1766 // suppressing texture state switches here 1780 // suppressing texture state switches here
1767 // is only moderately effective, but worth the extra effort 1781 // is only moderately effective, but worth the extra effort
1768 if (last_name != tex.name) 1782 if (last_name != tex.name)
1769 { 1783 {
1770 if (!tex.name) 1784 if (!tex.name)
1785 {
1786 av_push (missing, newSViv (tile));
1771 tex = self->tex [2]; /* missing, replace by noface */ 1787 tex = self->tex [2]; /* missing, replace by noface */
1788 }
1772 1789
1773 glEnd (); 1790 glEnd ();
1774 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1791 glBindTexture (GL_TEXTURE_2D, last_name = tex.name);
1775 glBegin (GL_QUADS); 1792 glBegin (GL_QUADS);
1776 } 1793 }
1794
1795 px = (x + 1) * T - tex.w;
1796 py = (y + 1) * T - tex.h;
1777 1797
1778 glTexCoord2f (0 , 0 ); glVertex2f (px , py ); 1798 glTexCoord2f (0 , 0 ); glVertex2f (px , py );
1779 glTexCoord2f (0 , tex.t); glVertex2f (px , py + tex.h); 1799 glTexCoord2f (0 , tex.t); glVertex2f (px , py + tex.h);
1780 glTexCoord2f (tex.s, tex.t); glVertex2f (px + tex.w, py + tex.h); 1800 glTexCoord2f (tex.s, tex.t); glVertex2f (px + tex.w, py + tex.h);
1781 glTexCoord2f (tex.s, 0 ); glVertex2f (px + tex.w, py ); 1801 glTexCoord2f (tex.s, 0 ); glVertex2f (px + tex.w, py );
1877 // this time naively avoiding texture state changes 1897 // this time naively avoiding texture state changes
1878 // save gobs of state changes. 1898 // save gobs of state changes.
1879 if (last_name != tex.name) 1899 if (last_name != tex.name)
1880 { 1900 {
1881 if (!tex.name) 1901 if (!tex.name)
1902 {
1903 av_push (missing, newSViv (skey->tile));
1882 continue; // smoothing not yet available 1904 continue; // smoothing not yet available
1905 }
1883 1906
1884 glEnd (); 1907 glEnd ();
1885 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1908 glBindTexture (GL_TEXTURE_2D, last_name = tex.name);
1886 glBegin (GL_QUADS); 1909 glBegin (GL_QUADS);
1887 } 1910 }
1948 px + width - 2 - cell->stat_hp * (width - 4) / 255, py - 1); 1971 px + width - 2 - cell->stat_hp * (width - 4) / 255, py - 1);
1949 } 1972 }
1950 } 1973 }
1951 } 1974 }
1952} 1975}
1976 OUTPUT:
1977 RETVAL
1953 1978
1954void 1979void
1955draw_magicmap (CFPlus::Map self, int dx, int dy, int w, int h, unsigned char *data) 1980draw_magicmap (CFPlus::Map self, int dx, int dy, int w, int h, unsigned char *data)
1956 CODE: 1981 CODE:
1957{ 1982{
2229 } 2254 }
2230 } 2255 }
2231 } 2256 }
2232} 2257}
2233 2258
2259MODULE = CFPlus PACKAGE = CFPlus::RW
2260
2261CFPlus::RW
2262new (SV *class, SV *data_sv)
2263 CODE:
2264{
2265 STRLEN datalen;
2266 char *data = SvPVbyte (data_sv, datalen);
2267
2268 RETVAL = SDL_RWFromConstMem (data, datalen);
2269}
2270 OUTPUT:
2271 RETVAL
2272
2273CFPlus::RW
2274new_from_file (SV *class, const char *path, const char *mode = "rb")
2275 CODE:
2276 RETVAL = SDL_RWFromFile (path, mode);
2277 OUTPUT:
2278 RETVAL
2279
2280# fails on win32:
2281# CFPlus.xs(2268) : error C2059: syntax error : '('
2282#void
2283#close (CFPlus::RW self)
2284# CODE:
2285# (self->(close)) (self);
2286
2287MODULE = CFPlus PACKAGE = CFPlus::Channel
2288
2289PROTOTYPES: DISABLE
2290
2291CFPlus::Channel
2292find ()
2293 CODE:
2294{
2295 RETVAL = Mix_GroupAvailable (-1);
2296
2297 if (RETVAL < 0)
2298 {
2299 RETVAL = Mix_GroupOldest (-1);
2300
2301 if (RETVAL < 0)
2302 XSRETURN_UNDEF;
2303
2304 Mix_HaltChannel (RETVAL);
2305 }
2306
2307 Mix_UnregisterAllEffects (RETVAL);
2308 Mix_Volume (RETVAL, 128);
2309}
2310 OUTPUT:
2311 RETVAL
2312
2313void
2314halt (CFPlus::Channel self)
2315 CODE:
2316 Mix_HaltChannel (self);
2317
2318void
2319expire (CFPlus::Channel self, int ticks = -1)
2320 CODE:
2321 Mix_ExpireChannel (self, ticks);
2322
2323void
2324fade_out (CFPlus::Channel self, int ticks = -1)
2325 CODE:
2326 Mix_FadeOutChannel (self, ticks);
2327
2328int
2329volume (CFPlus::Channel self, int volume)
2330 CODE:
2331 RETVAL = Mix_Volume (self, CLAMP (volume, 0, 128));
2332 OUTPUT:
2333 RETVAL
2334
2335void
2336unregister_all_effects (CFPlus::Channel self)
2337 CODE:
2338 Mix_UnregisterAllEffects (self);
2339
2340void
2341set_panning (CFPlus::Channel self, int left, int right)
2342 CODE:
2343 left = CLAMP (left , 0, 255);
2344 right = CLAMP (right, 0, 255);
2345 Mix_SetPanning (self, left, right);
2346
2347void
2348set_distance (CFPlus::Channel self, int distance)
2349 CODE:
2350 Mix_SetDistance (self, CLAMP (distance, 0, 255));
2351
2352void
2353set_position (CFPlus::Channel self, int angle, int distance)
2354 CODE:
2355
2356void
2357set_position_r (CFPlus::Channel self, int dx, int dy, int maxdistance)
2358 CODE:
2359{
2360 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance));
2361 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI);
2362 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2363}
2364
2365void
2366set_reverse_stereo (CFPlus::Channel self, int flip)
2367 CODE:
2368 Mix_SetReverseStereo (self, flip);
2369
2234MODULE = CFPlus PACKAGE = CFPlus::MixChunk 2370MODULE = CFPlus PACKAGE = CFPlus::MixChunk
2235 2371
2236PROTOTYPES: DISABLE 2372PROTOTYPES: DISABLE
2237 2373
2238CFPlus::MixChunk 2374CFPlus::MixChunk
2239new_from_file (SV *class, char *path) 2375new (SV *class, CFPlus::RW rwops)
2240 CODE: 2376 CODE:
2241 RETVAL = Mix_LoadWAV (path); 2377 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2242 OUTPUT: 2378 OUTPUT:
2243 RETVAL 2379 RETVAL
2244 2380
2245void 2381void
2246DESTROY (CFPlus::MixChunk self) 2382DESTROY (CFPlus::MixChunk self)
2248 Mix_FreeChunk (self); 2384 Mix_FreeChunk (self);
2249 2385
2250int 2386int
2251volume (CFPlus::MixChunk self, int volume = -1) 2387volume (CFPlus::MixChunk self, int volume = -1)
2252 CODE: 2388 CODE:
2389 if (items > 1)
2390 volume = CLAMP (volume, 0, 128);
2253 RETVAL = Mix_VolumeChunk (self, volume); 2391 RETVAL = Mix_VolumeChunk (self, volume);
2254 OUTPUT: 2392 OUTPUT:
2255 RETVAL 2393 RETVAL
2256 2394
2257int 2395CFPlus::Channel
2258play (CFPlus::MixChunk self, int channel = -1, int loops = 0, int ticks = -1) 2396play (CFPlus::MixChunk self, CFPlus::Channel channel = -1, int loops = 0, int ticks = -1)
2259 CODE: 2397 CODE:
2398{
2260 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks); 2399 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
2400
2401 if (RETVAL < 0)
2402 XSRETURN_UNDEF;
2403
2404 if (channel < 0)
2405 {
2406 Mix_UnregisterAllEffects (RETVAL);
2407 Mix_Volume (RETVAL, 128);
2408 }
2409}
2261 OUTPUT: 2410 OUTPUT:
2262 RETVAL 2411 RETVAL
2263 2412
2264MODULE = CFPlus PACKAGE = CFPlus::MixMusic 2413MODULE = CFPlus PACKAGE = CFPlus::MixMusic
2265 2414
2266int 2415int
2267volume (int volume = -1) 2416volume (int volume = -1)
2268 PROTOTYPE: ;$ 2417 PROTOTYPE: ;$
2269 CODE: 2418 CODE:
2419 if (items > 0)
2420 volume = CLAMP (volume, 0, 128);
2270 RETVAL = Mix_VolumeMusic (volume); 2421 RETVAL = Mix_VolumeMusic (volume);
2271 OUTPUT: 2422 OUTPUT:
2272 RETVAL 2423 RETVAL
2273 2424
2274int 2425void
2275fade_out (int ms) 2426fade_out (int ms)
2276 CODE: 2427 CODE:
2277 RETVAL = Mix_FadeOutMusic (ms); 2428 Mix_FadeOutMusic (ms);
2278 OUTPUT: 2429
2279 RETVAL 2430void
2431halt ()
2432 CODE:
2433 Mix_HaltMusic ();
2280 2434
2281CFPlus::MixMusic 2435CFPlus::MixMusic
2282new_from_file (SV *class, char *path) 2436new (SV *class, CFPlus::RW rwops)
2283 CODE: 2437 CODE:
2284 RETVAL = Mix_LoadMUS (path); 2438 RETVAL = Mix_LoadMUS_RW (rwops);
2285 OUTPUT: 2439 OUTPUT:
2286 RETVAL 2440 RETVAL
2287 2441
2288void 2442void
2289DESTROY (CFPlus::MixMusic self) 2443DESTROY (CFPlus::MixMusic self)
2295 CODE: 2449 CODE:
2296 RETVAL = Mix_PlayMusic (self, loops); 2450 RETVAL = Mix_PlayMusic (self, loops);
2297 OUTPUT: 2451 OUTPUT:
2298 RETVAL 2452 RETVAL
2299 2453
2300int 2454void
2301fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position) 2455fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position)
2302 CODE: 2456 CODE:
2303 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position); 2457 Mix_FadeInMusicPos (self, loops, ms, position);
2304 OUTPUT:
2305 RETVAL
2306 2458
2307MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2459MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2308 2460
2309PROTOTYPES: ENABLE 2461PROTOTYPES: ENABLE
2310 2462
2544 2696
2545void glTexCoord (float s, float t) 2697void glTexCoord (float s, float t)
2546 CODE: 2698 CODE:
2547 glTexCoord2f (s, t); 2699 glTexCoord2f (s, t);
2548 2700
2701void glRect (float x1, float y1, float x2, float y2)
2702 CODE:
2703 glRectf (x1, y1, x2, y2);
2704
2549PROTOTYPES: ENABLE 2705PROTOTYPES: ENABLE
2550 2706
2551void glBegin (int mode) 2707void glBegin (int mode)
2552 2708
2553void glEnd () 2709void glEnd ()
2626MODULE = CFPlus PACKAGE = CFPlus::UI::Base 2782MODULE = CFPlus PACKAGE = CFPlus::UI::Base
2627 2783
2628PROTOTYPES: DISABLE 2784PROTOTYPES: DISABLE
2629 2785
2630void 2786void
2631find_widget (SV *widget, NV x, NV y) 2787find_widget (SV *self, NV x, NV y)
2632 PPCODE: 2788 PPCODE:
2633{ 2789{
2634 if (within_widget (widget, x, y)) 2790 if (within_widget (self, x, y))
2635 XPUSHs (widget); 2791 XPUSHs (self);
2636} 2792}
2637 2793
2794BOOT:
2795{
2796 hover_gv = gv_fetchpv ("CFPlus::UI::HOVER", 1, SVt_NV);
2797
2798 draw_x_gv = gv_fetchpv ("CFPlus::UI::Base::draw_x", 1, SVt_NV);
2799 draw_y_gv = gv_fetchpv ("CFPlus::UI::Base::draw_y", 1, SVt_NV);
2800 draw_w_gv = gv_fetchpv ("CFPlus::UI::Base::draw_w", 1, SVt_NV);
2801 draw_h_gv = gv_fetchpv ("CFPlus::UI::Base::draw_h", 1, SVt_NV);
2802}
2803
2804void
2805draw (SV *self)
2806 CODE:
2807{
2808 HV *hv;
2809 SV **svp;
2810 NV x, y, w, h;
2811 SV *draw_x_sv = GvSV (draw_x_gv);
2812 SV *draw_y_sv = GvSV (draw_y_gv);
2813 SV *draw_w_sv = GvSV (draw_w_gv);
2814 SV *draw_h_sv = GvSV (draw_h_gv);
2815 SV *hover;
2816 double draw_x, draw_y, draw_w, draw_h;
2817
2818 if (!SvROK (self))
2819 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self));
2820
2821 hv = (HV *)SvRV (self);
2822
2823 if (SvTYPE (hv) != SVt_PVHV)
2824 croak ("CFPlus::Base::draw: %s not a hashref", SvPV_nolen (self));
2825
2826 svp = hv_fetch (hv, "w", 1, 0); w = svp ? SvNV (*svp) : 0.;
2827 svp = hv_fetch (hv, "h", 1, 0); h = svp ? SvNV (*svp) : 0.;
2828
2829 if (!h || !w)
2830 XSRETURN_EMPTY;
2831
2832 svp = hv_fetch (hv, "x", 1, 0); x = svp ? SvNV (*svp) : 0.;
2833 svp = hv_fetch (hv, "y", 1, 0); y = svp ? SvNV (*svp) : 0.;
2834
2835 draw_x = SvNV (draw_x_sv) + x;
2836 draw_y = SvNV (draw_y_sv) + y;
2837
2838 if (draw_x + w < 0 || draw_x >= SvNV (draw_w_sv)
2839 || draw_y + h < 0 || draw_y >= SvNV (draw_h_sv))
2840 XSRETURN_EMPTY;
2841
2842 sv_setnv (draw_x_sv, draw_x);
2843 sv_setnv (draw_y_sv, draw_y);
2844
2845 glPushMatrix ();
2846 glTranslated (x, y, 0);
2847
2848 if (SvROK (GvSV (hover_gv)) && SvRV (GvSV (hover_gv)) == (SV *)hv)
2849 {
2850 svp = hv_fetch (hv, "can_hover", sizeof ("can_hover") - 1, 0);
2851
2852 if (svp && SvTRUE (*svp))
2853 {
2854 glColor4f (1*0.2f, 0.8*0.2f, 0.5*0.2f, 0.2f);
2855 glEnable (GL_BLEND);
2856 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
2857 glBegin (GL_QUADS);
2858 glVertex2f (0, 0);
2859 glVertex2f (w, 0);
2860 glVertex2f (w, h);
2861 glVertex2f (0, h);
2862 glEnd ();
2863 glDisable (GL_BLEND);
2864 }
2865 }
2866#if 0
2867 if ($ENV{CFPLUS_DEBUG} & 1) {
2868 glPushMatrix;
2869 glColor 1, 1, 0, 1;
2870 glTranslate 0.375, 0.375;
2871 glBegin GL_LINE_LOOP;
2872 glVertex 0 , 0;
2873 glVertex $self->{w} - 1, 0;
2874 glVertex $self->{w} - 1, $self->{h} - 1;
2875 glVertex 0 , $self->{h} - 1;
2876 glEnd;
2877 glPopMatrix;
2878 #CFPlus::UI::Label->new (w => $self->{w}, h => $self->{h}, text => $self, fontsize => 0)->_draw;
2879 }
2880#endif
2881 PUSHMARK (SP);
2882 XPUSHs (self);
2883 PUTBACK;
2884 call_method ("_draw", G_VOID | G_DISCARD);
2885 SPAGAIN;
2886
2887 glPopMatrix ();
2888
2889 draw_x = draw_x - x; sv_setnv (draw_x_sv, draw_x);
2890 draw_y = draw_y - y; sv_setnv (draw_y_sv, draw_y);
2891}
2892

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines