# HG changeset patch # User sheepluva # Date 1390139934 -3600 # Node ID bdf75f0350bd5e9f2c388232b348a41a6fa5e6b4 # Parent 59a6d65fcb600fa50986dbf92f8abc435ff718ed (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) diff -r 59a6d65fcb60 -r bdf75f0350bd hedgewars/uLand.pas --- 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; diff -r 59a6d65fcb60 -r bdf75f0350bd hedgewars/uTextures.pas --- 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;