# HG changeset patch
# User nemo
# Date 1365077459 14400
# Node ID e9ebd63f8a0378cef0328607f3382ab849c6ad4a
# Parent  8cf1ed3bae45c248ba24fa469f44ca49e7431f26
So. Some themes have objects that seem to be large natural extensions of the landscape.  Masks allow maintaining that. Lemme know if it doesn't look good.  If it doesn't, can still use for ice/bounce/indestructible.  Indestructible bunker object for example.

diff -r 8cf1ed3bae45 -r e9ebd63f8a03 hedgewars/uLand.pas
--- a/hedgewars/uLand.pas	Thu Apr 04 10:44:03 2013 +0300
+++ b/hedgewars/uLand.pas	Thu Apr 04 08:10:59 2013 -0400
@@ -483,28 +483,11 @@
 
         p:= tmpsurf^.pixels;
         for y:= 0 to Pred(tmpsurf^.h) do
-        begin
+            begin
             for x:= 0 to Pred(tmpsurf^.w) do
-            begin
-                // this an if instead of masking colours to avoid confusing map creators
-                if ((AMask and p^[x]) = 0) then 
-                    Land[cpY + y, cpX + x]:= 0
-                else if p^[x] = $FFFFFFFF then                  // white
-                    Land[cpY + y, cpX + x]:= lfObject
-                else if p^[x] = AMask then                      // black
-                    begin
-                    Land[cpY + y, cpX + x]:= lfBasic;
-                    disableLandBack:= false
-                    end
-                else if p^[x] = (AMask or RMask) then           // red
-                    Land[cpY + y, cpX + x]:= lfIndestructible
-                else if p^[x] = (AMask or BMask) then           // blue
-                    Land[cpY + y, cpX + x]:= lfObject or lfIce
-                else if p^[x] = (AMask or GMask) then           // green
-                    Land[cpY + y, cpX + x]:= lfObject or lfBouncy
+                SetLand(Land[cpY + y, cpX + x], p^[x]);
+            p:= @(p^[tmpsurf^.pitch div 4]);
             end;
-            p:= @(p^[tmpsurf^.pitch div 4]);
-        end;
 
     if SDL_MustLock(tmpsurf) then
         SDL_UnlockSurface(tmpsurf);
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 hedgewars/uLandObjects.pas
--- a/hedgewars/uLandObjects.pas	Thu Apr 04 10:44:03 2013 +0300
+++ b/hedgewars/uLandObjects.pas	Thu Apr 04 08:10:59 2013 -0400
@@ -27,7 +27,9 @@
 procedure LoadThemeConfig;
 procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface); inline;
 procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface; extraFlags: Word);
+procedure BlitImageUsingMask(cpX, cpY: Longword;  Image, Mask: PSDL_Surface);
 procedure AddOnLandObjects(Surface: PSDL_Surface);
+procedure SetLand(var LandWord: Word; Pixel: LongWord); inline;
 
 implementation
 uses uStore, uConsts, uConsole, uRandom, uSound, GLunit
@@ -42,7 +44,7 @@
 type TRectsArray = array[0..MaxRects] of TSDL_Rect;
      PRectArray = ^TRectsArray;
      TThemeObject = record
-                     Surf: PSDL_Surface;
+                     Surf, Mask: PSDL_Surface;
                      inland: TSDL_Rect;
                      outland: array[0..Pred(MAXOBJECTRECTS)] of TSDL_Rect;
                      rectcnt: Longword;
@@ -68,6 +70,26 @@
     ThemeObjects: TThemeObjects;
     SprayObjects: TSprayObjects;
 
+procedure SetLand(var LandWord: Word; Pixel: LongWord); inline;
+begin
+    // this an if instead of masking colours to avoid confusing map creators
+    if ((AMask and Pixel) = 0) then
+        LandWord:= 0
+    else if Pixel = $FFFFFFFF then                  // white
+        LandWord:= lfObject
+    else if Pixel = AMask then                      // black
+        begin
+        LandWord:= lfBasic;
+        disableLandBack:= false
+        end
+    else if Pixel = (AMask or RMask) then           // red
+        LandWord:= lfIndestructible
+    else if Pixel = (AMask or BMask) then           // blue
+        LandWord:= lfObject or lfIce
+    else if Pixel = (AMask or GMask) then           // green
+        LandWord:= lfObject or lfBouncy
+end;
+
 procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface); inline;
 begin
     BlitImageAndGenerateCollisionInfo(cpX, cpY, Width, Image, 0);
@@ -119,6 +141,47 @@
 WriteLnToConsole(msgOK)
 end;
 
+procedure BlitImageUsingMask(cpX, cpY: Longword;  Image, Mask: PSDL_Surface);
+var p, mp: PLongwordArray;
+    x, y: Longword;
+    bpp: LongInt;
+begin
+WriteToConsole('Generating collision info... ');
+
+if SDL_MustLock(Image) then
+    SDLTry(SDL_LockSurface(Image) >= 0, true);
+
+bpp:= Image^.format^.BytesPerPixel;
+TryDo(bpp = 4, 'Land object should be 32bit', true);
+
+p:= Image^.pixels;
+mp:= Mask^.pixels;
+for y:= 0 to Pred(Image^.h) do
+    begin
+    for x:= 0 to Pred(Image^.w) do
+        begin
+        if (cReducedQuality and rqBlurryLand) = 0 then
+            begin
+            if (LandPixels[cpY + y, cpX + x] = 0)
+            or (((p^[x] and AMask) <> 0) and (((LandPixels[cpY + y, cpX + x] and AMask) shr AShift) < 255)) then
+                LandPixels[cpY + y, cpX + x]:= p^[x];
+            end
+        else
+            if LandPixels[(cpY + y) div 2, (cpX + x) div 2] = 0 then 
+                LandPixels[(cpY + y) div 2, (cpX + x) div 2]:= p^[x];
+
+        if (Land[cpY + y, cpX + x] <= lfAllObjMask) or (Land[cpY + y, cpX + x] and lfObject <> 0)  then
+            SetLand(Land[cpY + y, cpX + x], mp^[x]);
+        end;
+    p:= @(p^[Image^.pitch shr 2]);
+    mp:= @(mp^[Mask^.pitch shr 2])
+    end;
+
+if SDL_MustLock(Image) then
+    SDL_UnlockSurface(Image);
+WriteLnToConsole(msgOK)
+end;
+
 procedure AddRect(x1, y1, w1, h1: LongInt);
 begin
 with Rects^[RectCount] do
@@ -326,7 +389,9 @@
     if bRes then
         begin
         i:= getrandom(cnt);
-        BlitImageAndGenerateCollisionInfo(ar[i].x, ar[i].y, 0, Obj.Surf);
+        if Obj.Mask <> nil then
+             BlitImageUsingMask(ar[i].x, ar[i].y, Obj.Surf, Obj.Mask)
+        else BlitImageAndGenerateCollisionInfo(ar[i].x, ar[i].y, 0, Obj.Surf);
         AddRect(ar[i].x, ar[i].y, Width, Height);
         dec(Maxcnt)
         end
@@ -555,9 +620,10 @@
         with ThemeObjects.objs[Pred(ThemeObjects.Count)] do
             begin
             i:= Pos(',', s);
-            Surf:= LoadDataImage(ptCurrTheme, Trim(Copy(s, 1, Pred(i))), ifTransparent or ifIgnoreCaps);
+            Surf:= LoadDataImage(ptCurrTheme, Trim(Copy(s, 1, Pred(i))), ifTransparent or ifIgnoreCaps or ifCritical);
             Width:= Surf^.w;
             Height:= Surf^.h;
+            Mask:= LoadDataImage(ptCurrTheme, Trim(Copy(s, 1, Pred(i)))+'_mask', ifTransparent or ifIgnoreCaps);
             Delete(s, 1, i);
             i:= Pos(',', s);
             Maxcnt:= StrToInt(Trim(Copy(s, 1, Pred(i))));
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 hedgewars/uStore.pas
--- a/hedgewars/uStore.pas	Thu Apr 04 10:44:03 2013 +0300
+++ b/hedgewars/uStore.pas	Thu Apr 04 08:10:59 2013 -0400
@@ -575,19 +575,19 @@
     tmpsurf:= IMG_Load_RW(rwopsOpenRead(s), true);
 
     if tmpsurf = nil then
-    begin
+        begin
         OutError(msgFailed, (imageFlags and ifCritical) <> 0);
         exit;
-    end;
+        end;
 
     if ((imageFlags and ifIgnoreCaps) = 0) and ((tmpsurf^.w > MaxTextureSize) or (tmpsurf^.h > MaxTextureSize)) then
-    begin
+        begin
         SDL_FreeSurface(tmpsurf);
         OutError(msgFailedSize, ((not cOnlyStats) and ((imageFlags and ifCritical) <> 0)));
         // dummy surface to replace non-critical textures that failed to load due to their size
         LoadImage:= SDL_CreateRGBSurface(SDL_SWSURFACE, 2, 2, 32, RMask, GMask, BMask, AMask);
         exit;
-    end;
+        end;
 
     tmpsurf:= doSurfaceConversion(tmpsurf);
 
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/Cave/Stalactite.png
Binary file share/hedgewars/Data/Themes/Cave/Stalactite.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/Cave/Stalactite_mask.png
Binary file share/hedgewars/Data/Themes/Cave/Stalactite_mask.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/Cave/Stalagmite01.png
Binary file share/hedgewars/Data/Themes/Cave/Stalagmite01.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/Cave/Stalagmite01_mask.png
Binary file share/hedgewars/Data/Themes/Cave/Stalagmite01_mask.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/Cave/Stalagmite02.png
Binary file share/hedgewars/Data/Themes/Cave/Stalagmite02.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/Cave/Stalagmite02_mask.png
Binary file share/hedgewars/Data/Themes/Cave/Stalagmite02_mask.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/Cheese/cheese.png
Binary file share/hedgewars/Data/Themes/Cheese/cheese.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/Cheese/cheese_mask.png
Binary file share/hedgewars/Data/Themes/Cheese/cheese_mask.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/EarthRise/Chunk.png
Binary file share/hedgewars/Data/Themes/EarthRise/Chunk.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/EarthRise/Rock.png
Binary file share/hedgewars/Data/Themes/EarthRise/Rock.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/EarthRise/RockShort.png
Binary file share/hedgewars/Data/Themes/EarthRise/RockShort.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/EarthRise/RockShort_mask.png
Binary file share/hedgewars/Data/Themes/EarthRise/RockShort_mask.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/EarthRise/Rock_mask.png
Binary file share/hedgewars/Data/Themes/EarthRise/Rock_mask.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/EarthRise/horizontL.png
Binary file share/hedgewars/Data/Themes/EarthRise/horizontL.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/EarthRise/horizontR.png
Binary file share/hedgewars/Data/Themes/EarthRise/horizontR.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/EarthRise/icon.png
Binary file share/hedgewars/Data/Themes/EarthRise/icon.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/EarthRise/icon@2x.png
Binary file share/hedgewars/Data/Themes/EarthRise/icon@2x.png has changed
diff -r 8cf1ed3bae45 -r e9ebd63f8a03 share/hedgewars/Data/Themes/Fruit/Watermelon_mask.png
Binary file share/hedgewars/Data/Themes/Fruit/Watermelon_mask.png has changed