hedgewars/uMisc.pas
changeset 15314 fe705efbfc52
parent 14889 9b292184d793
child 15335 f9f34158ef72
equal deleted inserted replaced
15313:7e3bd4030aa5 15314:fe705efbfc52
    97 FreeMem(image^.buffer, image^.size);
    97 FreeMem(image^.buffer, image^.size);
    98 Dispose(image);
    98 Dispose(image);
    99 SaveScreenshot:= 0;
    99 SaveScreenshot:= 0;
   100 end;
   100 end;
   101 
   101 
   102 {$ELSE} // no PNG_SCREENSHOTS
   102 {$ELSE} //PNG_SCREENSHOTS
   103 
   103 {$IFDEF WINDOWS}
       
   104 function SaveScreenshot(screenshot: pointer): LongInt; cdecl; export;
       
   105 var
       
   106     surface: PSDL_Surface;
       
   107     image: PScreenshot;
       
   108     mirror: PByte;
       
   109     row, stride: LongInt;
       
   110 begin
       
   111     image:= PScreenshot(screenshot);
       
   112     mirror:= PByte(GetMem(image^.size));
       
   113     stride:= image^.width * 4;
       
   114 
       
   115     for row:= 0 to image^.height - 1 do
       
   116         Move((image^.buffer + row * stride)^,
       
   117              (mirror + (image^.height - row - 1) * stride)^,
       
   118              stride);
       
   119 
       
   120     surface:= SDL_CreateRGBSurfaceFrom(
       
   121         mirror,
       
   122         image^.width, image^.height, 32, image^.width * 4,
       
   123         $000000FF, $0000FF00, $00FF0000, $FF000000);
       
   124 
       
   125     if surface <> nil then
       
   126         begin
       
   127         IMG_SavePNG(surface, Str2PChar(image^.filename));
       
   128         SDL_FreeSurface(surface);
       
   129         end;
       
   130 
       
   131     FreeMem(mirror, image^.size);
       
   132     FreeMem(image^.buffer, image^.size);
       
   133     Dispose(image);
       
   134     SaveScreenshot:= 0;
       
   135 end;
       
   136 {$ELSE} //WINDOWS
   104 // this funtion will be executed in separate thread
   137 // this funtion will be executed in separate thread
   105 function SaveScreenshot(screenshot: pointer): LongInt; cdecl; export;
   138 function SaveScreenshot(screenshot: pointer): LongInt; cdecl; export;
   106 var f: file;
   139 var f: file;
   107     // Windows Bitmap Header
   140     // Windows Bitmap Header
   108     head: array[0..53] of Byte = (
   141     head: array[0..53] of Byte = (
   167 FreeMem(image^.buffer, image^.size);
   200 FreeMem(image^.buffer, image^.size);
   168 Dispose(image);
   201 Dispose(image);
   169 SaveScreenshot:= 0;
   202 SaveScreenshot:= 0;
   170 end;
   203 end;
   171 
   204 
   172 {$ENDIF} // no PNG_SCREENSHOTS
   205 {$ENDIF} // WINDOWS
       
   206 {$ENDIF} // PNG_SCREENSHOTS
   173 
   207 
   174 {$IFDEF USE_VIDEO_RECORDING}
   208 {$IFDEF USE_VIDEO_RECORDING}
   175 // make image k times smaller (useful for saving thumbnails)
   209 // make image k times smaller (useful for saving thumbnails)
   176 procedure ReduceImage(img: PByteArray; width, height, k: LongInt);
   210 procedure ReduceImage(img: PByteArray; width, height, k: LongInt);
   177 var i, j, i0, j0, w, h, r, g, b: LongInt;
   211 var i, j, i0, j0, w, h, r, g, b: LongInt;
   216 begin
   250 begin
   217 {$IFDEF PNG_SCREENSHOTS}
   251 {$IFDEF PNG_SCREENSHOTS}
   218 format:= GL_RGBA;
   252 format:= GL_RGBA;
   219 ext:= '.png';
   253 ext:= '.png';
   220 {$ELSE}
   254 {$ELSE}
       
   255 {$IFDEF WINDOWS}
       
   256 format:= GL_RGBA;
       
   257 ext:= '.png';
       
   258 {$ELSE}
   221 format:= GL_BGRA;
   259 format:= GL_BGRA;
   222 ext:= '.bmp';
   260 ext:= '.bmp';
       
   261 {$ENDIF}
   223 {$ENDIF}
   262 {$ENDIF}
   224 
   263 
   225 if dump > 0 then
   264 if dump > 0 then
   226      size:= LAND_WIDTH*LAND_HEIGHT*4
   265      size:= LAND_WIDTH*LAND_HEIGHT*4
   227 else size:= toPowerOf2(cScreenWidth) * toPowerOf2(cScreenHeight) * 4;
   266 else size:= toPowerOf2(cScreenWidth) * toPowerOf2(cScreenHeight) * 4;