hedgewars/uLandGraphics.pas
changeset 4695 ac2cb3b99d70
parent 4690 490cf71b436a
child 4700 e8fd20b2d66b
--- a/hedgewars/uLandGraphics.pas	Sun Dec 26 18:56:31 2010 +0300
+++ b/hedgewars/uLandGraphics.pas	Sun Dec 26 11:17:01 2010 -0500
@@ -190,7 +190,7 @@
 t:= y + dy;
 if (t and LAND_HEIGHT_MASK) = 0 then
    for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
-       if ((Land[t, i] and lfBasic) <> 0) then
+       if ((Land[t, i] and lfBasic) <> 0) and not disableLandBack then
            begin
            inc(cnt);
            if (cReducedQuality and rqBlurryLand) = 0 then
@@ -199,7 +199,7 @@
                LandPixels[t div 2, i div 2]:= LandBackPixel(i, t)
            end
        else
-           if ((Land[t, i] and lfObject) <> 0) then
+           if ((Land[t, i] and lfObject) <> 0) or disableLandBack then
                if (cReducedQuality and rqBlurryLand) = 0 then
                    LandPixels[t, i]:= 0
                else
@@ -208,7 +208,7 @@
 t:= y - dy;
 if (t and LAND_HEIGHT_MASK) = 0 then
    for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
-       if ((Land[t, i] and lfBasic) <> 0) then
+       if ((Land[t, i] and lfBasic) <> 0) and not disableLandBack then
            begin
            inc(cnt);
            if (cReducedQuality and rqBlurryLand) = 0 then
@@ -217,7 +217,7 @@
                LandPixels[t div 2, i div 2]:= LandBackPixel(i, t)
            end
        else
-           if ((Land[t, i] and lfObject) <> 0) then
+           if ((Land[t, i] and lfObject) <> 0) or disableLandBack then
                if (cReducedQuality and rqBlurryLand) = 0 then
                    LandPixels[t, i]:= 0
                else
@@ -226,25 +226,7 @@
 t:= y + dx;
 if (t and LAND_HEIGHT_MASK) = 0 then
    for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
-       if ((Land[t, i] and lfBasic) <> 0) then
-           begin
-           inc(cnt);
-           if (cReducedQuality and rqBlurryLand) = 0 then
-           LandPixels[t, i]:= LandBackPixel(i, t)
-            else
-           LandPixels[t div 2, i div 2]:= LandBackPixel(i, t)
-           end
-       else
-            if ((Land[t, i] and lfObject) <> 0) then
-            if (cReducedQuality and rqBlurryLand) = 0 then
-          LandPixels[t, i]:= 0
-            else
-           LandPixels[t div 2, i div 2]:= 0;
-
-t:= y - dx;
-if (t and LAND_HEIGHT_MASK) = 0 then
-   for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
-       if ((Land[t, i] and lfBasic) <> 0) then
+       if ((Land[t, i] and lfBasic) <> 0) and not disableLandBack then
            begin
            inc(cnt);
            if (cReducedQuality and rqBlurryLand) = 0 then
@@ -253,11 +235,29 @@
                LandPixels[t div 2, i div 2]:= LandBackPixel(i, t)
            end
        else
-          if ((Land[t, i] and lfObject) <> 0) then
+           if ((Land[t, i] and lfObject) <> 0) or disableLandBack then
+               if (cReducedQuality and rqBlurryLand) = 0 then
+                   LandPixels[t, i]:= 0
+               else
+                   LandPixels[t div 2, i div 2]:= 0;
+
+t:= y - dx;
+if (t and LAND_HEIGHT_MASK) = 0 then
+   for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
+       if ((Land[t, i] and lfBasic) <> 0) and not disableLandBack then
+           begin
+           inc(cnt);
+           if (cReducedQuality and rqBlurryLand) = 0 then
+               LandPixels[t, i]:= LandBackPixel(i, t)
+           else
+               LandPixels[t div 2, i div 2]:= LandBackPixel(i, t)
+           end
+       else
+           if ((Land[t, i] and lfObject) <> 0) or disableLandBack then
               if (cReducedQuality and rqBlurryLand) = 0 then
-                LandPixels[t, i]:= 0
+                  LandPixels[t, i]:= 0
               else
-                LandPixels[t div 2, i div 2]:= 0;
+                  LandPixels[t div 2, i div 2]:= 0;
 FillLandCircleLinesBG:= cnt;
 end;
 
@@ -409,13 +409,13 @@
     begin
     for ty:= Max(y - Radius, 0) to Min(y + Radius, LAND_HEIGHT) do
         for tx:= Max(0, ar^[i].Left - Radius) to Min(LAND_WIDTH, ar^[i].Right + Radius) do
-            if (Land[ty, tx] and lfBasic) <> 0 then
+            if ((Land[ty, tx] and lfBasic) <> 0) and not disableLandBack then
                 if (cReducedQuality and rqBlurryLand) = 0 then
                     LandPixels[ty, tx]:= LandBackPixel(tx, ty)
                 else
                     LandPixels[ty div 2, tx div 2]:= LandBackPixel(tx, ty)
             else
-                if (Land[ty, tx] and lfObject) <> 0 then
+                if ((Land[ty, tx] and lfObject) <> 0) or disableLandBack then
                     if (cReducedQuality and rqBlurryLand) = 0 then
                         LandPixels[ty, tx]:= 0
                     else
@@ -521,13 +521,13 @@
         ty:= hwRound(Y);
         if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) and ((Land[ty, tx] and lfIndestructible) = 0) then
             begin
-            if (Land[ty, tx] and lfBasic) <> 0 then
+            if ((Land[ty, tx] and lfBasic) <> 0) and not disableLandBack then
                 if (cReducedQuality and rqBlurryLand) = 0 then
                     LandPixels[ty, tx]:= LandBackPixel(tx, ty)
                 else
                     LandPixels[ty div 2, tx div 2]:= LandBackPixel(tx, ty)
             else
-              if (Land[ty, tx] and lfObject) <> 0 then
+              if ((Land[ty, tx] and lfObject) <> 0) or disableLandBack then
                 if (cReducedQuality and rqBlurryLand) = 0 then
                 LandPixels[ty, tx]:= 0
                 else
@@ -670,9 +670,21 @@
 
 // was experimenting with applying as damage occurred.
 function Despeckle(X, Y: LongInt): boolean;
-var nx, ny, i, j, c: LongInt;
+var nx, ny, i, j, c, xx, yy: LongInt;
+    pixelsweep: boolean;
 begin
-if ((Land[Y, X] and lfDamaged) <> 0) and ((Land[Y, X] and lfIndestructible) = 0) then // check neighbours
+if (cReducedQuality and rqBlurryLand) = 0 then
+   begin
+   xx:= X;
+   yy:= Y;
+   end
+else
+   begin
+   xx:= X div 2;
+   yy:= Y div 2;
+   end;
+pixelsweep:= ((Land[Y, X] and $FF00) = 0) and (LandPixels[yy, xx] <> 0);
+if (((Land[Y, X] and lfDamaged) <> 0) and ((Land[Y, X] and lfIndestructible) = 0)) or pixelsweep then
     begin
     c:= 0;
     for i:= -1 to 1 do
@@ -682,25 +694,29 @@
                 ny:= Y + i;
                 nx:= X + j;
                 if ((ny and LAND_HEIGHT_MASK) = 0) and ((nx and LAND_WIDTH_MASK) = 0) then
-                    if Land[ny, nx] > 255 then
-                        inc(c);
+                    begin
+                    if pixelsweep then
+                        begin
+                        if ((cReducedQuality and rqBlurryLand) <> 0) then
+                            begin
+                            nx:= nx div 2;
+                            ny:= ny div 2
+                            end;
+                        if LandPixels[ny, nx] <> 0 then inc(c);
+                        end
+                    else if Land[ny, nx] > 255 then inc(c);
+                    end
                 end;
 
     if c < 4 then // 0-3 neighbours
         begin
-        if (cReducedQuality and rqBlurryLand) = 0 then
-            if (Land[Y, X] and lfBasic) <> 0 then
-                LandPixels[Y, X]:= LandBackPixel(X, Y)
-            else
-                LandPixels[Y, X]:= 0
+        if ((Land[Y, X] and lfBasic) <> 0) and not disableLandBack then
+            LandPixels[yy, xx]:= LandBackPixel(X, Y)
         else
-            if (Land[Y, X] and lfBasic) <> 0 then
-                LandPixels[Y div 2, X div 2]:= LandBackPixel(X, Y)
-            else
-                LandPixels[Y div 2, X div 2]:= 0;
+            LandPixels[yy, xx]:= 0;
 
         Land[Y, X]:= 0;
-        exit(true);
+        if not pixelsweep then exit(true);
         end;
     end;
 Despeckle:= false