# HG changeset patch # User alfadur # Date 1565977525 -10800 # Node ID f9f34158ef72665f964d8ada034d9d3c33bb7ea5 # Parent 8951eaad20e5eae9aa34ec2345c737224cd52b55 reduce memory usage of screenshot mirroring diff -r 8951eaad20e5 -r f9f34158ef72 hedgewars/uMisc.pas --- a/hedgewars/uMisc.pas Fri Aug 16 11:02:01 2019 -0600 +++ b/hedgewars/uMisc.pas Fri Aug 16 20:45:25 2019 +0300 @@ -105,21 +105,29 @@ var surface: PSDL_Surface; image: PScreenshot; - mirror: PByte; + rowBuffer: PByte; row, stride: LongInt; begin image:= PScreenshot(screenshot); - mirror:= PByte(GetMem(image^.size)); stride:= image^.width * 4; + rowBuffer:= PByte(GetMem(stride)); - for row:= 0 to image^.height - 1 do + for row:= 0 to (image^.height div 2) - 1 do + begin + Move((image^.buffer + (image^.height - row - 1) * stride)^, + rowBuffer^, + stride); Move((image^.buffer + row * stride)^, - (mirror + (image^.height - row - 1) * stride)^, + (image^.buffer + (image^.height - row - 1) * stride)^, stride); + Move(rowBuffer^, + (image^.buffer + row * stride)^, + stride); + end; surface:= SDL_CreateRGBSurfaceFrom( - mirror, - image^.width, image^.height, 32, image^.width * 4, + image^.buffer, + image^.width, image^.height, 32, stride, $000000FF, $0000FF00, $00FF0000, $FF000000); if surface <> nil then @@ -128,7 +136,7 @@ SDL_FreeSurface(surface); end; - FreeMem(mirror, image^.size); + FreeMem(rowBuffer, stride); FreeMem(image^.buffer, image^.size); Dispose(image); SaveScreenshot:= 0;