--- deliantra/Deliantra-Client/Client.xs 2006/04/15 00:04:58 1.39 +++ deliantra/Deliantra-Client/Client.xs 2006/04/15 01:13:46 1.40 @@ -265,13 +265,10 @@ average (int x, int y, uint32_t *data) PPCODE: { - // only good for x * y < 32768 uint32_t r = 0, g = 0, b = 0, a = 0; x = y = x * y; - assert (x < 32768); - while (x--) { uint32_t p = *data++; @@ -283,10 +280,10 @@ } EXTEND (SP, 4); - PUSHs (sv_2mortal (newSViv (r * 255 / y))); - PUSHs (sv_2mortal (newSViv (g * 255 / y))); - PUSHs (sv_2mortal (newSViv (b * 255 / y))); - PUSHs (sv_2mortal (newSViv (a * 255 / y))); + PUSHs (sv_2mortal (newSViv (r / y))); + PUSHs (sv_2mortal (newSViv (g / y))); + PUSHs (sv_2mortal (newSViv (b / y))); + PUSHs (sv_2mortal (newSViv (a / y))); } void @@ -295,7 +292,7 @@ #ifdef WIN32 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND); #else - fprintf (stderr, "%s\n", message); + fprintf (stderr, "FATAL: %s\n", message); #endif exit (1); @@ -616,6 +613,66 @@ } } +SV * +mapmap (CFClient::Map self, int w, int h) + CODE: +{ + int x0, x1, x; + int y0, y1, y; + int z; + SV *map_sv = newSV (w * h * sizeof (uint32_t)); + uint32_t *map = (uint32_t *)SvPVX (map_sv); + + SvPOK_only (map_sv); + SvCUR_set (map_sv, w * h * sizeof (uint32_t)); + + x0 = self->x - w / 2; x1 = x0 + w; + y0 = self->y - h / 2; y1 = y0 + h; + + for (y = y0; y < y1; y++) + { + maprow *row = 0 <= y && y < self->rows + ? self->row + y + : 0; + + for (x = x0; x < x1; x++) + { + int r = 32, g = 32, b = 32, a = 192; + + if (row && row->c0 <= x && x < row->c1) + { + mapcell *cell = row->col + (x - row->c0); + + for (z = 0; z <= 0; z++) + { + uint16_t face = cell->face [z]; + + if (face) + { + mapface tex = self->face [face]; + int a0 = 255 - tex.a; + int a1 = tex.a; + + r = (r * a0 + tex.r * a1) / 255; + g = (g * a0 + tex.g * a1) / 255; + b = (b * a0 + tex.b * a1) / 255; + a = (a * a0 + tex.a * a1) / 255; + } + } + } + + *map++ = (r ) + | (g << 8) + | (b << 16) + | (a << 24); + } + } + + RETVAL = map_sv; +} + OUTPUT: + RETVAL + void draw (CFClient::Map self, int shift_x, int shift_y, int x0, int y0, int sw, int sh) PPCODE: