hedgewars/uMisc.pas
changeset 10633 2f062fac5791
parent 10150 fa5c83fd0ad9
child 10658 a3872ffdeab1
--- a/hedgewars/uMisc.pas	Sat Dec 06 10:41:33 2014 -0500
+++ b/hedgewars/uMisc.pas	Sun Dec 07 14:36:28 2014 -0500
@@ -28,7 +28,7 @@
 
 procedure movecursor(dx, dy: LongInt);
 function  doSurfaceConversion(tmpsurf: PSDL_Surface): PSDL_Surface;
-function  MakeScreenshot(filename: shortstring; k: LongInt): boolean;
+function MakeScreenshot(filename: shortstring; k: LongInt; dump: LongWord): boolean;
 function  GetTeamStatString(p: PTeam): shortstring;
 {$IFDEF SDL2}
 function  SDL_RectMake(x, y, width, height: LongInt): TSDL_Rect; inline;
@@ -221,12 +221,13 @@
 
 // captures and saves the screen. returns true on success.
 // saved image will be k times smaller than original (useful for saving thumbnails).
-function MakeScreenshot(filename: shortstring; k: LongInt): Boolean;
+function MakeScreenshot(filename: shortstring; k: LongInt; dump: LongWord): boolean;
 var p: Pointer;
     size: QWord;
     image: PScreenshot;
     format: GLenum;
     ext: string[4];
+    x,y: LongWord;
 begin
 {$IFDEF PNG_SCREENSHOTS}
 format:= GL_RGBA;
@@ -236,7 +237,9 @@
 ext:= '.bmp';
 {$ENDIF}
 
-size:= toPowerOf2(cScreenWidth) * toPowerOf2(cScreenHeight) * 4;
+if dump > 0 then
+     size:= LAND_WIDTH*LAND_HEIGHT*4
+else size:= toPowerOf2(cScreenWidth) * toPowerOf2(cScreenHeight) * 4;
 p:= GetMem(size); // will be freed in SaveScreenshot()
 
 // memory could not be allocated
@@ -248,17 +251,54 @@
 end;
 
 // read pixels from the front buffer
-glReadPixels(0, 0, cScreenWidth, cScreenHeight, format, GL_UNSIGNED_BYTE, p);
-
+if dump > 0 then
+    begin
+    for y:= 0 to LAND_HEIGHT-1 do
+        for x:= 0 to LAND_WIDTH-1 do
+            if dump = 2 then
+                PLongWordArray(p)^[y*LAND_WIDTH+x]:= LandPixels[LAND_HEIGHT-1-y, x]
+            else
+                begin
+                if Land[LAND_HEIGHT-1-y, x] and lfIndestructible = lfIndestructible then
+                    PLongWordArray(p)^[y*LAND_WIDTH+x]:= (AMask or RMask)
+                else if Land[LAND_HEIGHT-1-y, x] and lfIce = lfIce then
+                    PLongWordArray(p)^[y*LAND_WIDTH+x]:= (AMask or BMask)
+                else if Land[LAND_HEIGHT-1-y, x] and lfBouncy = lfBouncy then
+                    PLongWordArray(p)^[y*LAND_WIDTH+x]:= (AMask or GMask)
+                else if Land[LAND_HEIGHT-1-y, x] and lfObject = lfObject then
+                    PLongWordArray(p)^[y*LAND_WIDTH+x]:= $FFFFFFFF
+                else if Land[LAND_HEIGHT-1-y, x] and lfBasic = lfBasic then
+                    PLongWordArray(p)^[y*LAND_WIDTH+x]:= AMask
+                else
+                    PLongWordArray(p)^[y*LAND_WIDTH+x]:= 0
+                end
+    end
+else
+    begin
+    glReadPixels(0, 0, cScreenWidth, cScreenHeight, format, GL_UNSIGNED_BYTE, p);
 {$IFDEF USE_VIDEO_RECORDING}
-ReduceImage(p, cScreenWidth, cScreenHeight, k);
+    ReduceImage(p, cScreenWidth, cScreenHeight, k)
 {$ENDIF}
+    end;
 
 // allocate and fill structure that will be passed to new thread
 New(image); // will be disposed in SaveScreenshot()
-image^.filename:= shortstring(UserPathPrefix) + filename + ext;
-image^.width:= cScreenWidth div k;
-image^.height:= cScreenHeight div k;
+if dump = 2 then
+     image^.filename:= shortstring(UserPathPrefix) + filename + '_landpixels' + ext
+else if dump = 1 then
+     image^.filename:= shortstring(UserPathPrefix) + filename + '_land' + ext
+else image^.filename:= shortstring(UserPathPrefix) + filename + '_land' + ext;
+
+if dump <> 0 then
+    begin
+    image^.width:= LAND_WIDTH;
+    image^.height:= LAND_HEIGHT
+    end
+else
+    begin
+    image^.width:= cScreenWidth div k;
+    image^.height:= cScreenHeight div k
+    end;
 image^.size:= size;
 image^.buffer:= p;