(experimental) merging the new procedures for different pixel representations (1D/2D arrays) into a single procedure with the algorithm and two procedures for the different mapping. - because redundant code sucks (at least twice)
--- a/hedgewars/uLand.pas Sun Jan 19 13:41:11 2014 +0100
+++ b/hedgewars/uLand.pas Sun Jan 19 14:58:54 2014 +0100
@@ -60,62 +60,14 @@
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;
+ PrettifyAlpha2D(LandPixels, LAND_HEIGHT div 2, LAND_WIDTH div 2)
+ else
+ PrettifyAlpha2D(LandPixels, LAND_HEIGHT, LAND_WIDTH);
end;
-
procedure DrawBorderFromImage(Surface: PSDL_Surface);
var tmpsurf: PSDL_Surface;
r, rr: TSDL_Rect;
--- a/hedgewars/uTextures.pas Sun Jan 19 13:41:11 2014 +0100
+++ b/hedgewars/uTextures.pas Sun Jan 19 14:58:54 2014 +0100
@@ -25,7 +25,8 @@
function NewTexture(width, height: Longword; buf: Pointer): PTexture;
procedure Surface2GrayScale(surf: PSDL_Surface);
function Surface2Tex(surf: PSDL_Surface; enableClamp: boolean): PTexture;
-procedure PrettifySurfaceAlpha(surf: PSDL_Surface; p: PLongwordArray);
+procedure PrettifySurfaceAlpha(surf: PSDL_Surface; pixels: PLongwordArray);
+procedure PrettifyAlpha2D(pixels: TLandArray; height, width: LongWord);
procedure FreeTexture(tex: PTexture);
procedure FreeAndNilTexture(var tex: PTexture);
@@ -125,51 +126,84 @@
{ 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 PrettifySurfaceAlpha(surf: PSDL_Surface; p: PLongwordArray);
+procedure PrettifyAlpha(row1, row2: PLongwordArray; firsti, lasti: LongWord);
var
- i, lasti: Longword;
+ i: Longword;
lpi, cpi, bpi: boolean; // was last/current/bottom neighbor pixel invisible?
begin
- lasti:= surf^.w * surf^.h - 1;
- for i:=0 to lasti do
+ for i:=firsti to lasti do
begin
- // use first pixel in row as starting point
- //p^[i]:= p^[i] and (BMask or GMask);
- if (i mod surf^.w) = 0 then
- lpi:= ((p^[i] and AMask) = 0)
+ // use first pixel in row1 as starting point
+ if i = firsti then
+ lpi:= ((row1^[i] and AMask) = 0)
else
begin
- cpi:= ((p^[i] and AMask) = 0);
+ cpi:= ((row1^[i] and AMask) = 0);
if cpi <> lpi then
begin
// invisible pixels get colors from visible neighbors
- if (p^[i] and AMask) = 0 then
+ if (row1^[i] and AMask) = 0 then
begin
- p^[i]:= p^[i-1] and not AMask;
+ row1^[i]:= row1^[i-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
- p^[i-1]:= p^[i] and not AMask;
+ row1^[i-1]:= row1^[i] and not AMask;
lpi:= cpi;
end;
end;
// also check bottom neighbor, lpi is now current pixel info
- if i < lasti - surf^.w then
+ if row2 <> nil then
begin
- bpi:= ((p^[i + surf^.w] and AMask) = 0);
+ bpi:= ((row2^[i] and AMask) = 0);
if cpi <> bpi then
begin
if cpi then
- p^[i]:= p^[i + surf^.w] and not AMask
+ row1^[i]:= row2^[i] and not AMask
else
- p^[i + surf^.w]:= p^[i] and not AMask;
+ row2^[i]:= row1^[i] and not AMask;
end;
end;
end;
end;
+procedure PrettifySurfaceAlpha(surf: PSDL_Surface; pixels: PLongwordArray);
+var
+ // current row index, second last row index of array, width and first/last i of row
+ r, slr, w, si, li: LongWord;
+begin
+ w:= surf^.w;
+ slr:= surf^.h - 2;
+ si:= 0;
+ li:= w - 1;
+ for r:= 0 to slr do
+ begin
+ PrettifyAlpha(pixels, pixels, si, li);
+ // move indices to next row
+ si:= si + w;
+ li:= li + w;
+ end;
+ // don't forget last row
+ PrettifyAlpha(pixels, nil, si, li);
+end;
+
+procedure PrettifyAlpha2D(pixels: TLandArray; height, width: LongWord);
+var
+ // current y; last x, second last y of array;
+ y, lx, sly: LongWord;
+begin
+ sly:= height - 2;
+ lx:= width - 1;
+ for y:= 0 to sly do
+ begin
+ PrettifyAlpha(PLongWordArray(pixels[y]), PLongWordArray(pixels[y+1]), 0, lx);
+ end;
+ // don't forget last row
+ PrettifyAlpha(PLongWordArray(pixels[sly+1]), nil, 0, lx);
+end;
+
function Surface2Tex(surf: PSDL_Surface; enableClamp: boolean): PTexture;
var tw, th, x, y: Longword;
tmpp: pointer;