diff -r c4fd2813b127 -r d92eeb468dad hedgewars/uStore.pas --- a/hedgewars/uStore.pas Wed Jul 31 23:14:27 2019 +0200 +++ b/hedgewars/uStore.pas Fri Jul 03 23:51:47 2020 +0200 @@ -398,7 +398,7 @@ var ii: TSprite; ai: TAmmoType; tmpsurf, tmpoverlay: PSDL_Surface; - i, y, imflags: LongInt; + i, imflags: LongInt; keyConfirm, keyQuit: shortstring; begin AddFileLog('StoreLoad()'); @@ -443,10 +443,10 @@ imflags := (imflags or ifCritical); // load the image - tmpsurf := LoadDataImageAltPath(Path, AltPath, FileName, imflags); - if (tmpsurf <> nil) and checkSum then - for y := 0 to tmpsurf^.h-1 do - syncedPixelDigest:= Adler32Update(syncedPixelDigest, @PByteArray(tmpsurf^.pixels)^[y*tmpsurf^.pitch], tmpsurf^.w*4) + if checkSum then + tmpsurf := LoadDataImageAltPath(Path, AltPath, FileName, imflags or ifDigestAlpha) + else + tmpsurf := LoadDataImageAltPath(Path, AltPath, FileName, imflags); end; if tmpsurf <> nil then @@ -650,10 +650,13 @@ function LoadImage(const filename: shortstring; imageFlags: LongInt): PSDL_Surface; var tmpsurf: PSDL_Surface; s: shortstring; - logMsg: shortstring; + logMsg, digestMsg: shortstring; rwops: PSDL_RWops; + y, x: LongInt; + rowData: PByteArray; begin LoadImage:= nil; + digestMsg:= ''; logMsg:= msgLoading + filename + '.png [flags: ' + inttostr(imageFlags) + ']'; s:= filename + '.png'; @@ -704,8 +707,37 @@ if (imageFlags and ifColorKey) <> 0 then if checkFails(SDL_SetColorKey(tmpsurf, SDL_TRUE, 0) = 0, errmsgTransparentSet, true) then exit; + if ((imageFlags and (ifDigestAll or ifDigestAlpha)) <> 0) + and (tmpsurf^.format^.BytesPerPixel = 4)then + begin + if SDL_MustLock(tmpsurf) then + SDL_LockSurface(tmpsurf); + + if (imageFlags and ifDigestAll) <> 0 then + begin + for y := 0 to tmpsurf^.h - 1 do + syncedPixelDigest:= Adler32Update(syncedPixelDigest, @PByteArray(tmpsurf^.pixels)^[y*tmpsurf^.pitch], tmpsurf^.w*4); + digestMsg := ' [CD: ' + inttostr(syncedPixelDigest) + ']' + end + else if (imageFlags and ifDigestAlpha) <> 0 then + begin + rowData := GetMem(tmpsurf^.w); + for y := 0 to tmpsurf^.h - 1 do + begin + for x := 0 to tmpsurf^.w - 1 do + rowData^[x] := PByteArray(tmpsurf^.pixels)^[y * tmpsurf^.pitch + x * 4 + AByteIndex]; + syncedPixelDigest:= Adler32Update(syncedPixelDigest, rowData, tmpsurf^.w); + end; + FreeMem(rowData, tmpsurf^.w); + digestMsg := ' [AD: ' + inttostr(syncedPixelDigest) + ']' + end; + + if SDL_MustLock(tmpsurf) then + SDL_UnlockSurface(tmpsurf); + end; + // log success - WriteLnToConsole(logMsg + ' ' + msgOK + ' (' + inttostr(tmpsurf^.w) + 'x' + inttostr(tmpsurf^.h) + ')'); + WriteLnToConsole(logMsg + ' ' + msgOK + ' (' + inttostr(tmpsurf^.w) + 'x' + inttostr(tmpsurf^.h) + ')' + digestMsg); LoadImage:= tmpsurf //Result end; @@ -874,7 +906,9 @@ SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0); // no depth buffer SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0); // no alpha channel SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 16); // buffer should be 16 - SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); // prefer hw rendering +{$IFNDEF DARWIN} + SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); // force hw rendering except on macOS +{$ENDIF} end; procedure SetupOpenGL;