--- deliantra/Deliantra-Client/Client.xs 2006/06/07 23:28:12 1.108 +++ deliantra/Deliantra-Client/Client.xs 2006/06/14 16:20:21 1.113 @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -88,7 +89,9 @@ substitute_func (FcPattern *pattern, gpointer data) { FcPatternAddBool (pattern, FC_HINTING, 1); - FcPatternAddBool (pattern, FC_HINTSTYLE, FC_HINT_FULL); +#ifdef FC_HINT_STYLE + FcPatternAddBool (pattern, FC_HINT_STYLE, FC_HINT_FULL); +#endif #ifdef _WIN32 FcPatternAddBool (pattern, FC_AUTOHINT, 1); #else @@ -301,6 +304,23 @@ SDL_PushEvent ((SDL_Event *)&ev); } +static unsigned int +minpot (unsigned int n) +{ + if (!n) + return 0; + + --n; + + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + + return n + 1; +} + MODULE = CFClient PACKAGE = CFClient PROTOTYPES: ENABLE @@ -703,7 +723,12 @@ #ifdef _WIN32 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR); #endif - exit (1); + _exit (1); + +void +_exit (int retval) + CODE: + _exit (retval); MODULE = CFClient PACKAGE = CFClient::Font @@ -978,6 +1003,43 @@ MODULE = CFClient PACKAGE = CFClient::Texture void +pad2pot (SV *data_, SV *w_, SV *h_) + CODE: +{ + int ow = SvIV (w_); + int oh = SvIV (h_); + + if (ow && oh) + { + int nw = minpot (ow); + int nh = minpot (oh); + + if (nw != ow || nh != oh) + { + if (SvOK (data_)) + { + STRLEN datalen; + char *data = SvPVbyte (data_, datalen); + int bpp = datalen / (ow * oh); + SV *result_ = sv_2mortal (newSV (nw * nh * bpp)); + + SvPOK_only (result_); + SvCUR_set (result_, nw * nh * bpp); + + memset (SvPVX (result_), 0, nw * nh * bpp); + while (oh--) + memcpy (SvPVX (result_) + oh * nw * bpp, data + oh * ow * bpp, ow * bpp); + + sv_setsv (data_, result_); + } + + sv_setiv (w_, nw); + sv_setiv (h_, nh); + } + } +} + +void draw_quad (SV *self, float x, float y, float w = 0, float h = 0) PROTOTYPE: $$$;$$ ALIAS: @@ -1053,6 +1115,7 @@ { map_clear (self); Safefree (self->face); + Safefree (self->tex); Safefree (self); }