hedgewars/uMisc.pas
changeset 15335 f9f34158ef72
parent 15314 fe705efbfc52
child 15900 128ace913837
equal deleted inserted replaced
15334:8951eaad20e5 15335:f9f34158ef72
   103 {$IFDEF WINDOWS}
   103 {$IFDEF WINDOWS}
   104 function SaveScreenshot(screenshot: pointer): LongInt; cdecl; export;
   104 function SaveScreenshot(screenshot: pointer): LongInt; cdecl; export;
   105 var
   105 var
   106     surface: PSDL_Surface;
   106     surface: PSDL_Surface;
   107     image: PScreenshot;
   107     image: PScreenshot;
   108     mirror: PByte;
   108     rowBuffer: PByte;
   109     row, stride: LongInt;
   109     row, stride: LongInt;
   110 begin
   110 begin
   111     image:= PScreenshot(screenshot);
   111     image:= PScreenshot(screenshot);
   112     mirror:= PByte(GetMem(image^.size));
       
   113     stride:= image^.width * 4;
   112     stride:= image^.width * 4;
   114 
   113     rowBuffer:= PByte(GetMem(stride));
   115     for row:= 0 to image^.height - 1 do
   114 
       
   115     for row:= 0 to (image^.height div 2) - 1 do
       
   116         begin
       
   117         Move((image^.buffer + (image^.height - row - 1) * stride)^,
       
   118              rowBuffer^,
       
   119              stride);
   116         Move((image^.buffer + row * stride)^,
   120         Move((image^.buffer + row * stride)^,
   117              (mirror + (image^.height - row - 1) * stride)^,
   121              (image^.buffer + (image^.height - row - 1) * stride)^,
   118              stride);
   122              stride);
       
   123         Move(rowBuffer^,
       
   124              (image^.buffer + row * stride)^,
       
   125              stride);
       
   126         end;
   119 
   127 
   120     surface:= SDL_CreateRGBSurfaceFrom(
   128     surface:= SDL_CreateRGBSurfaceFrom(
   121         mirror,
   129         image^.buffer,
   122         image^.width, image^.height, 32, image^.width * 4,
   130         image^.width, image^.height, 32, stride,
   123         $000000FF, $0000FF00, $00FF0000, $FF000000);
   131         $000000FF, $0000FF00, $00FF0000, $FF000000);
   124 
   132 
   125     if surface <> nil then
   133     if surface <> nil then
   126         begin
   134         begin
   127         IMG_SavePNG(surface, Str2PChar(image^.filename));
   135         IMG_SavePNG(surface, Str2PChar(image^.filename));
   128         SDL_FreeSurface(surface);
   136         SDL_FreeSurface(surface);
   129         end;
   137         end;
   130 
   138 
   131     FreeMem(mirror, image^.size);
   139     FreeMem(rowBuffer, stride);
   132     FreeMem(image^.buffer, image^.size);
   140     FreeMem(image^.buffer, image^.size);
   133     Dispose(image);
   141     Dispose(image);
   134     SaveScreenshot:= 0;
   142     SaveScreenshot:= 0;
   135 end;
   143 end;
   136 {$ELSE} //WINDOWS
   144 {$ELSE} //WINDOWS