--- deliantra/Deliantra-Client/Client.xs 2007/07/17 16:02:13 1.200 +++ deliantra/Deliantra-Client/Client.xs 2007/07/19 13:45:16 1.203 @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -1259,39 +1260,24 @@ int minpot (int n) void -pad2pot (SV *data_, SV *w_, SV *h_) +pad (SV *data_, int ow, int oh, int nw, int nh) CODE: { - int ow = SvIV (w_); - int oh = SvIV (h_); - - if (ow && oh) + if ((nw != ow || nh != oh) && SvOK (data_)) { - 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_); - } + 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_setiv (w_, nw); - sv_setiv (h_, nh); - } + sv_setsv (data_, result_); } } @@ -1976,7 +1962,7 @@ } void -fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh) +fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh, int smoothing, const char *matrix) PPCODE: { int x, y; @@ -2007,6 +1993,36 @@ } } + if (smoothing) + { + SV *darkness2_sv = sv_2mortal (newSV (sw4 * sh)); + uint8_t *darkness2 = (uint8_t *)SvPVX (darkness2_sv); + + SvPOK_only (darkness2_sv); + SvCUR_set (darkness2_sv, sw4 * sh); + + for (y = 0; y < sh; ++y) + for (x = 0; x < sw4; ++x) + { + float *f = (float *)matrix; + int dx, dy; + float sum = 0.f; + + for (dy = -1; dy <= 1; ++dy) + for (dx = -1; dx <= 1; ++dx) + { + unsigned int x2 = x + dx; + unsigned int y2 = y + dy; + + sum += (x2 < sw && y2 < sh ? darkness [y2 * sw4 + x2] : 255) * *f++; + } + + darkness2 [y * sw4 + x] = sum > 255. ? 255. : sum; + } + + darkness_sv = darkness2_sv; + } + EXTEND (SP, 3); PUSHs (sv_2mortal (newSViv (sw4))); PUSHs (sv_2mortal (newSViv (sh))); @@ -2348,7 +2364,7 @@ OUTPUT: RETVAL -char *glGetString (GLenum pname) +const char *glGetString (GLenum pname) GLint glGetInteger (GLenum pname) CODE: