diff -r 56d2f2d5aad8 -r 59a6d65fcb60 hedgewars/uLand.pas --- a/hedgewars/uLand.pas Sun Jan 19 00:18:28 2014 +0400 +++ b/hedgewars/uLand.pas Sun Jan 19 13:41:11 2014 +0100 @@ -60,6 +60,61 @@ end; end; +{ this will make invisible pixels that have a visible neighbor have the + same color as their visible neighbor, so that bilinear filtering won't + display a "wrongly" colored border when zoomed in } +procedure PrettifyLandAlpha(); +var + x, y, lastx, lasty: Longword; + lpi, cpi, bpi: boolean; // was last/current/bottom neighbor pixel invisible? +begin + lasty:= LAND_HEIGHT - 1; + lastx:= LAND_WIDTH - 1; + if (cReducedQuality and rqBlurryLand) <> 0 then + begin + lasty:= lasty div 2; + lastx:= lastx div 2; + end; + for y:= 0 to lasty do + for x:= 0 to lastx do + begin + // use first pixel in row as starting point + //LandPixels[y, x]:= (LandPixels[y, x] and (BMask or GMask or AMask)); + if x = 0 then + lpi:= ((LandPixels[y, x] and AMask) = 0) + else + begin + cpi:= ((LandPixels[y, x] and AMask) = 0); + if lpi <> cpi then + begin + // invisible pixels get colors from visible neighbors + if cpi then + begin + LandPixels[y, x]:= LandPixels[y, x-1] and not AMask; + // as this pixel is invisible and already colored correctly now, no point in further comparing it + lpi:= cpi; + continue; + end + else + LandPixels[y, x-1]:= LandPixels[y, x] and not AMask; + lpi:= cpi; + end; + end; + // also check bottom neighbor, lpi is now current pixel info + if y < lasty - 1 then + begin + bpi:= ((LandPixels[y+1, x] and AMask) = 0); + if cpi <> bpi then + begin + if cpi then + LandPixels[y, x]:= LandPixels[y+1, x] and not AMask + else + LandPixels[y+1, x]:= LandPixels[y, x] and not AMask; + end; + end + end; +end; + procedure DrawBorderFromImage(Surface: PSDL_Surface); var tmpsurf: PSDL_Surface; @@ -811,6 +866,8 @@ LandPixels[y,x]:= w or (LandPixels[y div 2, x div 2] and AMask) end end; + +PrettifyLandAlpha(); end; procedure GenPreview(out Preview: TPreview);