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.221 by root, Fri Aug 10 04:02:13 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 }
1537 self->rows += MAP_EXTEND_Y; 1550 self->rows += MAP_EXTEND_Y;
1538 self->y += MAP_EXTEND_Y; 1551 self->y += MAP_EXTEND_Y;
1539 } 1552 }
1540} 1553}
1541 1554
1542void 1555SV *
1543map1a_update (CFPlus::Map self, SV *data_, int extmap) 1556map1a_update (CFPlus::Map self, SV *data_, int extmap)
1544 CODE: 1557 CODE:
1545{ 1558{
1546 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 1559 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
1547 uint8_t *data_end = (uint8_t *)SvEND (data_); 1560 uint8_t *data_end = (uint8_t *)SvEND (data_);
1548 mapcell *cell; 1561 mapcell *cell;
1549 int x, y, flags; 1562 int x, y, z, flags;
1563 AV *missing = newAV ();
1564 RETVAL = newRV_noinc ((SV *)missing);
1550 1565
1551 while (data < data_end - 1) 1566 while (data < data_end - 1)
1552 { 1567 {
1553 flags = (data [0] << 8) + data [1]; data += 2; 1568 flags = (data [0] << 8) + data [1]; data += 2;
1554 1569
1605 } 1620 }
1606 else 1621 else
1607 cell->darkness = *data++ + 1; 1622 cell->darkness = *data++ + 1;
1608 } 1623 }
1609 1624
1625 for (z = 0; z <= 2; ++z)
1610 if (flags & 4) 1626 if (flags & (4 >> z))
1611 { 1627 {
1612 faceid face = (data [0] << 8) + data [1]; data += 2; 1628 faceid face = (data [0] << 8) + data [1]; data += 2;
1613 need_facenum (self, face); 1629 need_facenum (self, face);
1614 cell->tile [0] = self->face2tile [face]; 1630 cell->tile [z] = self->face2tile [face];
1631
1632 if (cell->tile [z])
1633 {
1634 maptex *tex = self->tex + cell->tile [z];
1635 if (!tex->name)
1636 av_push (missing, newSViv (cell->tile [z]));
1637
1638 if (tex->smoothtile)
1639 {
1640 maptex *smooth = self->tex + tex->smoothtile;
1641 if (!smooth->name)
1642 av_push (missing, newSViv (tex->smoothtile));
1643 }
1644 }
1615 } 1645 }
1616
1617 if (flags & 2)
1618 {
1619 faceid face = (data [0] << 8) + data [1]; data += 2;
1620 need_facenum (self, face);
1621 cell->tile [1] = self->face2tile [face];
1622 }
1623
1624 if (flags & 1)
1625 {
1626 faceid face = (data [0] << 8) + data [1]; data += 2;
1627 need_facenum (self, face);
1628 cell->tile [2] = self->face2tile [face];
1629 }
1630 } 1646 }
1631 else 1647 else
1632 cell->darkness = 0; 1648 cell->darkness = 0;
1633 } 1649 }
1634} 1650}
1651 OUTPUT:
1652 RETVAL
1635 1653
1636SV * 1654SV *
1637mapmap (CFPlus::Map self, int x0, int y0, int w, int h) 1655mapmap (CFPlus::Map self, int x0, int y0, int w, int h)
1638 CODE: 1656 CODE:
1639{ 1657{
1713 glEnable (GL_TEXTURE_2D); 1731 glEnable (GL_TEXTURE_2D);
1714 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1732 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1715 1733
1716 glBegin (GL_QUADS); 1734 glBegin (GL_QUADS);
1717 1735
1718 last_name = 0; 1736 last_name = -1;
1719 1737
1720 mx += self->x; 1738 mx += self->x;
1721 my += self->y; 1739 my += self->y;
1722 1740
1723 // first pass: determine smooth_max 1741 // first pass: determine smooth_max
1758 tileid tile = cell->tile [z]; 1776 tileid tile = cell->tile [z];
1759 1777
1760 if (tile) 1778 if (tile)
1761 { 1779 {
1762 maptex tex = self->tex [tile]; 1780 maptex tex = self->tex [tile];
1763 int px = (x + 1) * T - tex.w; 1781 int px, py;
1764 int py = (y + 1) * T - tex.h;
1765 1782
1766 // suppressing texture state switches here 1783 // suppressing texture state switches here
1767 // is only moderately effective, but worth the extra effort 1784 // is only moderately effective, but worth the extra effort
1768 if (last_name != tex.name) 1785 if (last_name != tex.name)
1769 { 1786 {
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 );
2229 } 2249 }
2230 } 2250 }
2231 } 2251 }
2232} 2252}
2233 2253
2254MODULE = CFPlus PACKAGE = CFPlus::RW
2255
2256CFPlus::RW
2257new (SV *class, SV *data_sv)
2258 CODE:
2259{
2260 STRLEN datalen;
2261 char *data = SvPVbyte (data_sv, datalen);
2262
2263 RETVAL = SDL_RWFromConstMem (data, datalen);
2264}
2265 OUTPUT:
2266 RETVAL
2267
2268CFPlus::RW
2269new_from_file (SV *class, const char *path, const char *mode = "rb")
2270 CODE:
2271 RETVAL = SDL_RWFromFile (path, mode);
2272 OUTPUT:
2273 RETVAL
2274
2275# fails on win32:
2276# CFPlus.xs(2268) : error C2059: syntax error : '('
2277#void
2278#close (CFPlus::RW self)
2279# CODE:
2280# (self->(close)) (self);
2281
2282MODULE = CFPlus PACKAGE = CFPlus::Channel
2283
2284PROTOTYPES: DISABLE
2285
2286CFPlus::Channel
2287find ()
2288 CODE:
2289{
2290 RETVAL = Mix_GroupAvailable (-1);
2291
2292 if (RETVAL < 0)
2293 {
2294 RETVAL = Mix_GroupOldest (-1);
2295
2296 if (RETVAL < 0)
2297 XSRETURN_UNDEF;
2298
2299 Mix_HaltChannel (RETVAL);
2300 }
2301
2302 Mix_UnregisterAllEffects (RETVAL);
2303 Mix_Volume (RETVAL, 128);
2304}
2305 OUTPUT:
2306 RETVAL
2307
2308void
2309halt (CFPlus::Channel self)
2310 CODE:
2311 Mix_HaltChannel (self);
2312
2313void
2314expire (CFPlus::Channel self, int ticks = -1)
2315 CODE:
2316 Mix_ExpireChannel (self, ticks);
2317
2318void
2319fade_out (CFPlus::Channel self, int ticks = -1)
2320 CODE:
2321 Mix_FadeOutChannel (self, ticks);
2322
2323int
2324volume (CFPlus::Channel self, int volume)
2325 CODE:
2326 RETVAL = Mix_Volume (self, CLAMP (volume, 0, 128));
2327 OUTPUT:
2328 RETVAL
2329
2330void
2331unregister_all_effects (CFPlus::Channel self)
2332 CODE:
2333 Mix_UnregisterAllEffects (self);
2334
2335void
2336set_panning (CFPlus::Channel self, int left, int right)
2337 CODE:
2338 left = CLAMP (left , 0, 255);
2339 right = CLAMP (right, 0, 255);
2340 Mix_SetPanning (self, left, right);
2341
2342void
2343set_distance (CFPlus::Channel self, int distance)
2344 CODE:
2345 Mix_SetDistance (self, CLAMP (distance, 0, 255));
2346
2347void
2348set_position (CFPlus::Channel self, int angle, int distance)
2349 CODE:
2350
2351void
2352set_position_r (CFPlus::Channel self, int dx, int dy, int maxdistance)
2353 CODE:
2354{
2355 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance));
2356 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI);
2357 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2358}
2359
2360void
2361set_reverse_stereo (CFPlus::Channel self, int flip)
2362 CODE:
2363 Mix_SetReverseStereo (self, flip);
2364
2234MODULE = CFPlus PACKAGE = CFPlus::MixChunk 2365MODULE = CFPlus PACKAGE = CFPlus::MixChunk
2235 2366
2236PROTOTYPES: DISABLE 2367PROTOTYPES: DISABLE
2237 2368
2238CFPlus::MixChunk 2369CFPlus::MixChunk
2239new_from_file (SV *class, char *path) 2370new (SV *class, CFPlus::RW rwops)
2240 CODE: 2371 CODE:
2241 RETVAL = Mix_LoadWAV (path); 2372 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2242 OUTPUT: 2373 OUTPUT:
2243 RETVAL 2374 RETVAL
2244 2375
2245void 2376void
2246DESTROY (CFPlus::MixChunk self) 2377DESTROY (CFPlus::MixChunk self)
2248 Mix_FreeChunk (self); 2379 Mix_FreeChunk (self);
2249 2380
2250int 2381int
2251volume (CFPlus::MixChunk self, int volume = -1) 2382volume (CFPlus::MixChunk self, int volume = -1)
2252 CODE: 2383 CODE:
2384 if (items > 1)
2385 volume = CLAMP (volume, 0, 128);
2253 RETVAL = Mix_VolumeChunk (self, volume); 2386 RETVAL = Mix_VolumeChunk (self, volume);
2254 OUTPUT: 2387 OUTPUT:
2255 RETVAL 2388 RETVAL
2256 2389
2257int 2390CFPlus::Channel
2258play (CFPlus::MixChunk self, int channel = -1, int loops = 0, int ticks = -1) 2391play (CFPlus::MixChunk self, CFPlus::Channel channel = -1, int loops = 0, int ticks = -1)
2259 CODE: 2392 CODE:
2393{
2260 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks); 2394 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
2395
2396 if (RETVAL < 0)
2397 XSRETURN_UNDEF;
2398
2399 if (channel < 0)
2400 {
2401 Mix_UnregisterAllEffects (RETVAL);
2402 Mix_Volume (RETVAL, 128);
2403 }
2404}
2261 OUTPUT: 2405 OUTPUT:
2262 RETVAL 2406 RETVAL
2263 2407
2264MODULE = CFPlus PACKAGE = CFPlus::MixMusic 2408MODULE = CFPlus PACKAGE = CFPlus::MixMusic
2265 2409
2266int 2410int
2267volume (int volume = -1) 2411volume (int volume = -1)
2268 PROTOTYPE: ;$ 2412 PROTOTYPE: ;$
2269 CODE: 2413 CODE:
2414 if (items > 0)
2415 volume = CLAMP (volume, 0, 128);
2270 RETVAL = Mix_VolumeMusic (volume); 2416 RETVAL = Mix_VolumeMusic (volume);
2271 OUTPUT: 2417 OUTPUT:
2272 RETVAL 2418 RETVAL
2273 2419
2274int 2420void
2275fade_out (int ms) 2421fade_out (int ms)
2276 CODE: 2422 CODE:
2277 RETVAL = Mix_FadeOutMusic (ms); 2423 Mix_FadeOutMusic (ms);
2278 OUTPUT: 2424
2279 RETVAL 2425void
2426halt ()
2427 CODE:
2428 Mix_HaltMusic ();
2280 2429
2281CFPlus::MixMusic 2430CFPlus::MixMusic
2282new_from_file (SV *class, char *path) 2431new (SV *class, CFPlus::RW rwops)
2283 CODE: 2432 CODE:
2284 RETVAL = Mix_LoadMUS (path); 2433 RETVAL = Mix_LoadMUS_RW (rwops);
2285 OUTPUT: 2434 OUTPUT:
2286 RETVAL 2435 RETVAL
2287 2436
2288void 2437void
2289DESTROY (CFPlus::MixMusic self) 2438DESTROY (CFPlus::MixMusic self)
2295 CODE: 2444 CODE:
2296 RETVAL = Mix_PlayMusic (self, loops); 2445 RETVAL = Mix_PlayMusic (self, loops);
2297 OUTPUT: 2446 OUTPUT:
2298 RETVAL 2447 RETVAL
2299 2448
2300int 2449void
2301fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position) 2450fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position)
2302 CODE: 2451 CODE:
2303 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position); 2452 Mix_FadeInMusicPos (self, loops, ms, position);
2304 OUTPUT:
2305 RETVAL
2306 2453
2307MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2454MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2308 2455
2309PROTOTYPES: ENABLE 2456PROTOTYPES: ENABLE
2310 2457
2544 2691
2545void glTexCoord (float s, float t) 2692void glTexCoord (float s, float t)
2546 CODE: 2693 CODE:
2547 glTexCoord2f (s, t); 2694 glTexCoord2f (s, t);
2548 2695
2696void glRect (float x1, float y1, float x2, float y2)
2697 CODE:
2698 glRectf (x1, y1, x2, y2);
2699
2549PROTOTYPES: ENABLE 2700PROTOTYPES: ENABLE
2550 2701
2551void glBegin (int mode) 2702void glBegin (int mode)
2552 2703
2553void glEnd () 2704void glEnd ()
2626MODULE = CFPlus PACKAGE = CFPlus::UI::Base 2777MODULE = CFPlus PACKAGE = CFPlus::UI::Base
2627 2778
2628PROTOTYPES: DISABLE 2779PROTOTYPES: DISABLE
2629 2780
2630void 2781void
2631find_widget (SV *widget, NV x, NV y) 2782find_widget (SV *self, NV x, NV y)
2632 PPCODE: 2783 PPCODE:
2633{ 2784{
2634 if (within_widget (widget, x, y)) 2785 if (within_widget (self, x, y))
2635 XPUSHs (widget); 2786 XPUSHs (self);
2636} 2787}
2637 2788
2789BOOT:
2790{
2791 hover_gv = gv_fetchpv ("CFPlus::UI::HOVER", 1, SVt_NV);
2792
2793 draw_x_gv = gv_fetchpv ("CFPlus::UI::Base::draw_x", 1, SVt_NV);
2794 draw_y_gv = gv_fetchpv ("CFPlus::UI::Base::draw_y", 1, SVt_NV);
2795 draw_w_gv = gv_fetchpv ("CFPlus::UI::Base::draw_w", 1, SVt_NV);
2796 draw_h_gv = gv_fetchpv ("CFPlus::UI::Base::draw_h", 1, SVt_NV);
2797}
2798
2799void
2800draw (SV *self)
2801 CODE:
2802{
2803 HV *hv;
2804 SV **svp;
2805 NV x, y, w, h;
2806 SV *draw_x_sv = GvSV (draw_x_gv);
2807 SV *draw_y_sv = GvSV (draw_y_gv);
2808 SV *draw_w_sv = GvSV (draw_w_gv);
2809 SV *draw_h_sv = GvSV (draw_h_gv);
2810 SV *hover;
2811 double draw_x, draw_y, draw_w, draw_h;
2812
2813 if (!SvROK (self))
2814 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self));
2815
2816 hv = (HV *)SvRV (self);
2817
2818 if (SvTYPE (hv) != SVt_PVHV)
2819 croak ("CFPlus::Base::draw: %s not a hashref", SvPV_nolen (self));
2820
2821 svp = hv_fetch (hv, "w", 1, 0); w = svp ? SvNV (*svp) : 0.;
2822 svp = hv_fetch (hv, "h", 1, 0); h = svp ? SvNV (*svp) : 0.;
2823
2824 if (!h || !w)
2825 XSRETURN_EMPTY;
2826
2827 svp = hv_fetch (hv, "x", 1, 0); x = svp ? SvNV (*svp) : 0.;
2828 svp = hv_fetch (hv, "y", 1, 0); y = svp ? SvNV (*svp) : 0.;
2829
2830 draw_x = SvNV (draw_x_sv) + x;
2831 draw_y = SvNV (draw_y_sv) + y;
2832
2833 if (draw_x + w < 0 || draw_x >= SvNV (draw_w_sv)
2834 || draw_y + h < 0 || draw_y >= SvNV (draw_h_sv))
2835 XSRETURN_EMPTY;
2836
2837 sv_setnv (draw_x_sv, draw_x);
2838 sv_setnv (draw_y_sv, draw_y);
2839
2840 glPushMatrix ();
2841 glTranslated (x, y, 0);
2842
2843 if (SvROK (GvSV (hover_gv)) && SvRV (GvSV (hover_gv)) == (SV *)hv)
2844 {
2845 svp = hv_fetch (hv, "can_hover", sizeof ("can_hover") - 1, 0);
2846
2847 if (svp && SvTRUE (*svp))
2848 {
2849 glColor4f (1*0.2f, 0.8*0.2f, 0.5*0.2f, 0.2f);
2850 glEnable (GL_BLEND);
2851 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
2852 glBegin (GL_QUADS);
2853 glVertex2f (0, 0);
2854 glVertex2f (w, 0);
2855 glVertex2f (w, h);
2856 glVertex2f (0, h);
2857 glEnd ();
2858 glDisable (GL_BLEND);
2859 }
2860 }
2861#if 0
2862 if ($ENV{CFPLUS_DEBUG} & 1) {
2863 glPushMatrix;
2864 glColor 1, 1, 0, 1;
2865 glTranslate 0.375, 0.375;
2866 glBegin GL_LINE_LOOP;
2867 glVertex 0 , 0;
2868 glVertex $self->{w} - 1, 0;
2869 glVertex $self->{w} - 1, $self->{h} - 1;
2870 glVertex 0 , $self->{h} - 1;
2871 glEnd;
2872 glPopMatrix;
2873 #CFPlus::UI::Label->new (w => $self->{w}, h => $self->{h}, text => $self, fontsize => 0)->_draw;
2874 }
2875#endif
2876 PUSHMARK (SP);
2877 XPUSHs (self);
2878 PUTBACK;
2879 call_method ("_draw", G_VOID | G_DISCARD);
2880 SPAGAIN;
2881
2882 glPopMatrix ();
2883
2884 draw_x = draw_x - x; sv_setnv (draw_x_sv, draw_x);
2885 draw_y = draw_y - y; sv_setnv (draw_y_sv, draw_y);
2886}
2887

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines