This is an automated email from the git hooks/post-receive script. fabian pushed a commit to branch master in repository prboom+.
commit f79467edfeef5c5f0eba524b42f937dcf2164325 Author: Fabian Greffrath <[email protected]> Date: Sun Sep 13 13:12:22 2015 +0200 Imported Upstream version 2.5.1.4~svn4433+dfsg1 --- src/p_setup.c | 10 ++++ src/r_patch.c | 186 +++++++++++++++++++++++++++------------------------------- 2 files changed, 98 insertions(+), 98 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 8d859ad..7e3e12f 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2267,6 +2267,16 @@ static void P_RemoveSlimeTrails(void) // killough 10/98 int x0 = v->x, y0 = v->y, x1 = l->v1->x, y1 = l->v1->y; v->px = (int)((dx2 * x0 + dy2 * x1 + dxy * (y0 - y1)) / s); v->py = (int)((dy2 * y0 + dx2 * y1 + dxy * (x0 - x1)) / s); + + // [crispy] wait a minute... moved more than 8 map units? + // maybe that's a linguortal then, back to the original coordinates + // http://www.doomworld.com/vb/doom-editing/74354-stupid-bsp-tricks/ + if (!apply_for_real_vertexes && (D_abs(v->px - v->x) > 8*FRACUNIT || D_abs(v->py - v->y) > 8*FRACUNIT)) + { + v->px = v->x; + v->py = v->y; + } + if (apply_for_real_vertexes) { v->x = v->px; diff --git a/src/r_patch.c b/src/r_patch.c index 5724a8c..b04992c 100644 --- a/src/r_patch.c +++ b/src/r_patch.c @@ -215,6 +215,92 @@ static int getColumnEdgeSlope(const column_t *prevcolumn, const column_t *nextco return 0; } +//--------------------------------------------------------------------------- +static void FillEmptySpace(rpatch_t *patch) +{ + int x, y, w, h, numpix, pass, transparent, has_holes; + byte *orig, *copy, *src, *dest, *prev, *next; + + // loop over patch looking for transparent pixels next to solid ones + // copy solid pixels into the spaces, dilating the patch outwards + // repeat either a fixed number of times or until all space is filled + // this eliminates artifacts surrounding weapon sprites (e.g. chainsaw) + + w = patch->width; + h = patch->height; + numpix = w * h; + + // alternate between two buffers to avoid "overlapping memcpy"-like symptoms + orig = patch->pixels; + copy = malloc(numpix); + + for (pass = 0; pass < 8; pass++) // arbitrarily chosen limit (must be even) + { + // copy src to dest, then switch them on next pass + // (this requires an even number of passes) + src = ((pass & 1) == 0) ? orig : copy; + dest = ((pass & 1) == 0) ? copy : orig; + + // previous and next columns adjacent to current column x + // these pointers must not be dereferenced without appropriate checks + prev = src - h; // only valid when x > 0 + next = src + h; // only valid when x < w-1 + + has_holes = 0; // if the patch has any holes at all + transparent = 0; // number of pixels this pass did not handle + + // detect transparent pixels on edges, copy solid colour into the space + // the order of directions (up,down,left,right) is arbitrarily chosen + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + if (*src == 0xff) has_holes = 1; + + if (*src != 0xff) // already a solid pixel, just copy it over + *dest = *src; + else if (y > 0 && *(src-1) != 0xff) // solid pixel above + *dest = *(src - 1); + else if (y < h-1 && *(src+1) != 0xff) // solid pixel below + *dest = *(src + 1); + else if (x > 0 && *prev != 0xff) // solid pixel to left + *dest = *prev; + else if (x < w-1 && *next != 0xff) // solid pixel to right + *dest = *next; + else // transparent pixel with no adjacent solid pixels + *dest = *src, transparent++; // count unhandled pixels + + prev++, src++, next++, dest++; + } + } + + if (transparent == 0) // no more transparent pixels to fill + { + if ((pass & 1) == 0) // dest was copy, src was orig: orig needs update + memcpy(orig, copy, numpix); + break; + } + else if (transparent == numpix) + break; // avoid infinite loop on entirely transparent patches (STBR127) + } + + free(copy); + + // copy top row of patch into any space at bottom, and vice versa + // a hack to fix erroneous row of pixels at top of firing chaingun + + for (x = 0, src = orig, dest = src + h-1; x < w; x++, src += h, dest += h) + { + if (*src != 0xff && *dest == 0xff) // bottom transparent, top solid + *dest = *src; + else if (*src == 0xff && *dest != 0xff) // top transparent, bottom solid + *src = *dest; + } + + if (has_holes) + patch->flags |= PATCH_HASHOLES; +} + //========================================================================== // // Checks if the lump can be a Doom patch @@ -429,55 +515,7 @@ static void createPatch(int id) { } } - if (1 || (patch->flags&PATCH_ISNOTTILEABLE)) { - const rcolumn_t *column, *prevColumn; - - // copy the patch image down and to the right where there are - // holes to eliminate the black halo from bilinear filtering - for (x=0; x<patch->width; x++) { - //oldColumn = (const column_t *)((const byte *)oldPatch + oldPatch->columnofs[x]); - - column = R_GetPatchColumnClamped(patch, x); - prevColumn = R_GetPatchColumnClamped(patch, x-1); - - if (column->pixels[0] == 0xff) { - // e6y: marking of all patches with holes - patch->flags |= PATCH_HASHOLES; - - // force the first pixel (which is a hole), to use - // the color from the next solid spot in the column - for (y=0; y<patch->height; y++) { - if (column->pixels[y] != 0xff) { - column->pixels[0] = column->pixels[y]; - break; - } - } - } - - // copy from above or to the left - for (y=1; y<patch->height; y++) { - //if (getIsSolidAtSpot(oldColumn, y)) continue; - if (column->pixels[y] != 0xff) continue; - - // this pixel is a hole - - // e6y: marking of all patches with holes - patch->flags |= PATCH_HASHOLES; - - if (x && prevColumn->pixels[y-1] != 0xff) { - // copy the color from the left - column->pixels[y] = prevColumn->pixels[y]; - } - else { - // copy the color from above - column->pixels[y] = column->pixels[y-1]; - } - } - } - - // verify that the patch truly is non-rectangular since - // this determines tiling later on - } + FillEmptySpace(patch); W_UnlockLumpNum(patchNum); free(numPostsInColumn); @@ -762,55 +800,7 @@ static void createTextureCompositePatch(int id) { } } - if (1 || (composite_patch->flags&PATCH_ISNOTTILEABLE)) { - const rcolumn_t *column, *prevColumn; - - // copy the patch image down and to the right where there are - // holes to eliminate the black halo from bilinear filtering - for (x=0; x<composite_patch->width; x++) { - //oldColumn = (const column_t *)((const byte *)oldPatch + oldPatch->columnofs[x]); - - column = R_GetPatchColumnClamped(composite_patch, x); - prevColumn = R_GetPatchColumnClamped(composite_patch, x-1); - - if (column->pixels[0] == 0xff) { - // e6y: marking of all patches with holes - composite_patch->flags |= PATCH_HASHOLES; - - // force the first pixel (which is a hole), to use - // the color from the next solid spot in the column - for (y=0; y<composite_patch->height; y++) { - if (column->pixels[y] != 0xff) { - column->pixels[0] = column->pixels[y]; - break; - } - } - } - - // copy from above or to the left - for (y=1; y<composite_patch->height; y++) { - //if (getIsSolidAtSpot(oldColumn, y)) continue; - if (column->pixels[y] != 0xff) continue; - - // this pixel is a hole - - // e6y: marking of all patches with holes - composite_patch->flags |= PATCH_HASHOLES; - - if (x && prevColumn->pixels[y-1] != 0xff) { - // copy the color from the left - column->pixels[y] = prevColumn->pixels[y]; - } - else { - // copy the color from above - column->pixels[y] = column->pixels[y-1]; - } - } - } - - // verify that the patch truly is non-rectangular since - // this determines tiling later on - } + FillEmptySpace(composite_patch); free(countsInColumn); } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/prboom+.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

