Complete BigTask
Sync changed files to Google Drive / sync (push) Successful in 4m34s

This commit is contained in:
admin_d committed 2026-09-17 18:38:58 +05:00
1 parent 27cf50da27
commit daa3eec27a
2 files changed
+103 -1

No files matched your search

+2 -1
View File
@@ -8,7 +8,8 @@
"src/utils/KromUtils.pas", "src/utils/KromUtils.pas",
"src/utils/KM_Utils.pas", "src/utils/KM_Utils.pas",
"src/terrain/KM_TerrainUtils.pas", "src/terrain/KM_TerrainUtils.pas",
"src/res/KM_ResSprites.pas" "src/res/KM_ResSprites.pas",
"src/utils/io/KM_IoPNG.pas"
], ],
"source_paths": [ "source_paths": [
"code/resource" "code/resource"
@@ -0,0 +1,101 @@
unit KM_IoPNG;
{$I KaM_Remake.inc}
interface
uses
KM_CommonTypes;
procedure SaveToPng(aWidth, aHeight: Word; const aPixelData: TKMCardinalArray; const aFilename: UnicodeString);
procedure LoadFromPng(const aFile: UnicodeString; var aWidth, aHeight: Word; var aPixelData: TKMCardinalArray);
implementation
uses
SysUtils,
Classes,
CastleImages,
CastleVectors,
CastleDownload,
CastleStringUtils;
procedure SaveToPng(aWidth, aHeight: Word; const aPixelData: TKMCardinalArray; const aFilename: UnicodeString);
var
ConvertedFilename: String;
Image: TRGBAlphaImage;
Stream: TStream;
X, Y: Integer;
CastleY: Cardinal;
KaMIndex: SizeInt;
T: Cardinal;
Pixel: PVector4Byte;
begin
ForceDirectories(ExtractFilePath(aFilename));
ConvertedFilename := Utf16ToString(aFilename);
Image := TRGBAlphaImage.Create(aWidth, aHeight);
try
for Y := 0 to Integer(aHeight) - 1 do
for X := 0 to Integer(aWidth) - 1 do
begin
KaMIndex := SizeInt(Y) * SizeInt(aWidth) + X;
CastleY := Cardinal(aHeight - 1 - Y);
T := aPixelData[KaMIndex];
Pixel := Image.PixelPtr(Cardinal(X), CastleY);
Pixel^.X := Byte(T and $FF);
Pixel^.Y := Byte((T shr 8) and $FF);
Pixel^.Z := Byte((T shr 16) and $FF);
Pixel^.W := Byte((T shr 24) and $FF);
end;
Stream := UrlSaveStream(ConvertedFilename);
try
SaveImage(Image, 'image/png', Stream);
finally
Stream.Free;
end;
finally
Image.Free;
end;
end;
procedure LoadFromPng(const aFile: UnicodeString; var aWidth, aHeight: Word; var aPixelData: TKMCardinalArray);
var
ConvertedFilename: String;
Stream: TStream;
Image: TRGBAlphaImage;
X, Y: Integer;
CastleY: Cardinal;
KaMIndex: SizeInt;
Pixel: PVector4Byte;
begin
ConvertedFilename := Utf16ToString(aFile);
Stream := Download(ConvertedFilename);
try
Image := TRGBAlphaImage(LoadImage(Stream, 'image/png', [TRGBAlphaImage]));
try
aWidth := Image.Width;
aHeight := Image.Height;
SetLength(aPixelData, SizeInt(Image.Width) * SizeInt(Image.Height));
for Y := 0 to Integer(Image.Height) - 1 do
for X := 0 to Integer(Image.Width) - 1 do
begin
CastleY := Image.Height - 1 - Cardinal(Y);
KaMIndex := SizeInt(Y) * SizeInt(Image.Width) + X;
Pixel := Image.PixelPtr(Cardinal(X), CastleY);
aPixelData[KaMIndex] := Cardinal(Pixel^.X) or
(Cardinal(Pixel^.Y) shl 8) or
(Cardinal(Pixel^.Z) shl 16) or
(Cardinal(Pixel^.W) shl 24);
end;
finally
Image.Free;
end;
finally
Stream.Free;
end;
end;
end.