📄 rtlwil.~pas
字号:
for i:=0 to FImageCount - 1 do
begin
BitDataOffset := OffsetOfImage[i];
if BitDataOffset <> 0 then
begin
CopyMemory(@BitMapInfo,Pointer(PWIL+BitDataOffset),sizeWILINFO);
BitMapHigh:=PWILFILEIMAGEINFO(@BitMapInfo)^.shHeight;
BitMapLength:=PWIL+BitDataOffset+sizeWILINFO;
if G3 then BitMapLength:= BitMapLength + sizeof(DWORD);
while BitMapHigh > 0 do
begin
tmp:=PWORD(BitMapLength)^;
BitMapLength:=BitMapLength + (PWORD(BitMapLength)^+1)*Sizeof(WORD);
if tmp = 0 then Continue else DEC(BitMapHigh);
end;
BitMapLength:= BitMapLength - (PWIL+BitDataOffset+sizeWILINFO);
PWILFILEIMAGEINFO(@BitMapInfo)^.dwImageLength:= ROUND(BitMapLength/2);
BitMapLength := BitMapLength + sizeWILINFO;
GetMem(PBitMap,BitMapLength);
CopyMemory(PBitMap,Pointer(PWIL+BitDataOffset),BitMapLength);
CopyMemory(PBitMap,@BitMapInfo,sizeWILINFO);
BitMapLength:=ImageAdjst(npAdImage,PBitMap,BitMapLength,adT);
if adt=EI3 then PDWORD(DWORD(npAdImage)+sizeWILINFO-4)^:=((BitMapLength - sizeWILINFO) SHR 1)
else PDWORD(DWORD(npAdImage)+sizeWILINFO-4)^:=((BitMapLength - sizeWILINFO - 4) SHR 1);
CopyMemory(Pointer(DWORD(PImage)+ImageOffset),npAdImage,BitMapLength);
freemem(npAdImage);
freemem(PBitMap);
SetOffset(I,ImageOffset);
ImageOffset:=ImageOffset+BitMapLength;
end;
end;
freemem(Pointer(PWIL));
GetMem(Pointer(PWIL),ImageOffset);
CopyMemory(Pointer(PWIL),PImage,ImageOffset);
freemem(PImage);
SetWilSize(ImageOffset);
end;
except end;
end;
procedure TWIL.AdjustEx(adT:Byte); //优化 + 转换
var i:integer;
BitDataOffset,BitMapLength,ImageOffset,nSize:DWORD;
BitMapInfo:array[1..sizeWILINFO] of BYTE;
ImageHeader:array[1..sizeWILHEADER] of BYTE;
BitMapHigh,tmp:WORD;
PBitMap,PImage,npAdImage:Pointer;
begin
try
if FImageCount > 0 then
begin
GetMem(PImage,FSize);
Zeromemory(PImage,FSize);
CopyMemory(@ImageHeader,Pointer(PWIL),sizeWILHEADER);
PWILFILEHEADER(@ImageHeader)^.nImageCount := FImageCount;
CopyMemory(PImage,@ImageHeader,sizeWILHEADER);
ImageOffset:=sizeWILHEADER;
for i:=0 to FImageCount - 1 do
begin
BitDataOffset := OffsetOfImage[i];
if BitDataOffset <> 0 then
begin
CopyMemory(@BitMapInfo,Pointer(PWIL+BitDataOffset),sizeWILINFO);
BitMapHigh:=PWILFILEIMAGEINFO(@BitMapInfo)^.shHeight;
BitMapLength:=PWIL+BitDataOffset+sizeWILINFO;
if G3 then BitMapLength:= BitMapLength + sizeof(DWORD);
while BitMapHigh > 0 do
begin
tmp:=PWORD(BitMapLength)^;
BitMapLength:=BitMapLength + (PWORD(BitMapLength)^+1)*Sizeof(WORD);
if tmp = 0 then Continue else DEC(BitMapHigh);
end;
BitMapLength:= BitMapLength - (PWIL+BitDataOffset+sizeWILINFO);
PWILFILEIMAGEINFO(@BitMapInfo)^.dwImageLength:= ROUND(BitMapLength/2);
BitMapLength := BitMapLength + sizeWILINFO;
GetMem(PBitMap,BitMapLength);
CopyMemory(PBitMap,Pointer(PWIL+BitDataOffset),BitMapLength);
CopyMemory(PBitMap,@BitMapInfo,sizeWILINFO);
BitMapLength:=ImageAdjst(npAdImage,PBitMap,BitMapLength,adT);
if adt=EI3 then PDWORD(DWORD(npAdImage)+sizeWILINFO-4)^:=((BitMapLength - sizeWILINFO) SHR 1)
else PDWORD(DWORD(npAdImage)+sizeWILINFO-4)^:=((BitMapLength - sizeWILINFO - 4) SHR 1);
CopyMemory(Pointer(DWORD(PImage)+ImageOffset),npAdImage,BitMapLength);
freemem(npAdImage);
freemem(PBitMap);
SetOffset(I,ImageOffset);
ImageOffset:=ImageOffset+BitMapLength;
end;
end;
freemem(Pointer(PWIL));
GetMem(Pointer(PWIL),ImageOffset);
CopyMemory(Pointer(PWIL),PImage,ImageOffset);
freemem(PImage);
SetWilSize(ImageOffset);
if adt=GT3 then G3:=TRUE else G3:=False;
end;
except end;
end;
function TWIL.SaveToFile(const fWix:string;Edt:BYTE):boolean;
var hWix,hWil,hMap:Cardinal;
PfWix,hMem:Pointer;
tmpWixHeader:array[1..sizeWIXHEADER] of byte;
bOk:boolean;
fWil:string;
fBegin:integer;
begin
bOk:=FALSE;
ReSult:=FALSE;
if Edt=0 then
begin
if G3 then Edt:=GT3 else Edt:=EI3;
end;
if FImageCount > 0 then
begin
AdjustEx(Edt);
hWix:=CreateFile(
pchar(fWix),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_WRITE or FILE_SHARE_READ,
0,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0
);
if hWix<>INVALID_HANDLE_VALUE then
begin
SetFilePointer(hWix,sizeWIXHEADER+FImageCount*4+(Edt-1)*4,0,FILE_BEGIN);
SetEndOfFile(hWix);
PWIXFILEIMAGEINFO(@tmpWixHeader)^.nIndexCount:=FImageCount;
hMap:=CreateFileMapping(hWix,nil,PAGE_READWRITE,0,0,nil);
if hMap<>0 then
begin
hMem:=MapViewOfFile(hMap,FILE_MAP_WRITE OR FILE_MAP_READ,0,0,0);
if hMem<>nil then
begin
CopyMemory(hMem,@tmpWixHeader,sizeWIXHEADER);
CopyMemory(Pointer(DWORD(hMem)+sizeWIXHEADER+(Edt-1)*4),Pointer(POffsetIndex),FImageCount*4);
if Edt=GT3 then PDWORD(DWORD(hMem)+sizeWIXHEADER)^:=G3Sign;
UnmapViewOfFile(hMem);
bOk:=TRUE;
end;
CloseHandle(hMap);
end;
CloseHandle(hWix);
end;
if bOk then
begin
SetLength(fWil,Length(fWix));
strcopy(pchar(fWil),pchar(fWix));
fWil[Length(fWix)]:='l';
hWil:=CreateFile(
pchar(fWil),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_WRITE or FILE_SHARE_READ,
0,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0
);
if hWil <> INVALID_HANDLE_VALUE then
begin
SetFilePointer(hWil,FSize,0,FILE_BEGIN);
SetEndOfFile(hWil);
hMap:=CreateFileMapping(hWil,nil,PAGE_READWRITE,0,0,nil);
if hMap<>0 then
begin
hMem:=MapViewOfFile(hMap,FILE_MAP_WRITE OR FILE_MAP_READ,0,0,0);
if hMem<>nil then
begin
CopyMemory(hMem,Pointer(PWIL),FSIZE);
UnmapViewOfFile(hMem);
ReSult:=TRUE;
end;
CloseHandle(hMap);
end;
CloseHandle(hWil);
end;
end;
end;
end;
function TWIL.Modify(Index:integer;tmp:PWILFILEIMAGEINFO):boolean;
var fOffset:DWORD;
temp,rtemp:array[1..sizeof(tagWILFILEIMAGEINFO)] of BYTE;
tmpWilInfo:PWILFILEIMAGEINFO;
begin
ReSult:=FALSE;
fOffset:=OffsetOfImage[Index];
if fOffset<>0 then
begin
tmpWilInfo:=PWILFILEIMAGEINFO(@temp);
CopyMemory(tmpWilInfo,tmp,sizeof(tagWILFILEIMAGEINFO));
try
CopyMemory(@rtemp,Pointer(DWORD(PWIL)+fOffset),sizeof(tagWILFILEIMAGEINFO));
CopyMemory(Pointer(DWORD(PWIL)+fOffset),@temp,sizeof(tagWILFILEIMAGEINFO));
ReSult:=TRUE;
except
CopyMemory(Pointer(DWORD(PWIL)+fOffset),@rtemp,sizeof(tagWILFILEIMAGEINFO));
ReSult:=FALSE;
end;
end;
end;
function TWIL.GetImageInfo(Index:integer):PWILFILEIMAGEINFO;
var tmp:array[1..sizeof(tagWILFILEIMAGEINFO)] of BYTE;
tOffset:DWORD;
dWilINFO,tmpWilInfo:PWILFILEIMAGEINFO;
begin
ReSult:=nil;
if Index<FImageCount then
begin
tOffset:=OffsetOfImage[Index];
if ((tOffset<FSize) and (tOffset<>0)) then
begin
CopyMemory(@tmp,Pointer(DWORD(PWIL)+tOffset),sizeof(tagWILFILEIMAGEINFO));
tmpWilInfo:=PWILFILEIMAGEINFO(@tmp);
NEW(dWilINFO);
CopyMemory(dWilINFO,tmpWilInfo,sizeof(tagWILFILEIMAGEINFO));
ReSult:=dWilINFO;
end;
end;
end;
function TWIL.LoadFromFile(const fWix:string):BYTE;
var hWix,hWil,hMap,mCount,mfSize:Cardinal;
hMem:Pointer;
bOk:boolean;
fWil:string;
fBegin:integer;
begin
Clear;
ReSult:=0;
try
bOk:=FALSE;
hWix:=CreateFile(
pchar(fWix),
GENERIC_READ ,
FILE_SHARE_WRITE or FILE_SHARE_READ,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0
);
if hWix<>INVALID_HANDLE_VALUE then
begin
hMap:=CreateFileMapping(hWix,nil,PAGE_READONLY,0,0,nil);
if hMap<>0 then
begin
hMem:=MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);
if hMem<>nil then
begin
CopyMemory(@mCount,Pointer(DWORD(hMem)+20),4);
CopyMemory(@G3Sign,Pointer(DWORD(hMem)+24),4);
G3:=(G3Sign and $FFFF0000)=$B13A0000;
mfSize:=GetFileSize(hWix,0);
if not G3 then
begin
fBegin:=24;
G3Sign:=$B13AD3FB;
end
else fBegin:=28;
if (mCount*4+fBegin)<=mfSize then
begin
GetMem(Pointer(POffsetIndex),mCount*4);
if Pointer(POffsetIndex)<>nil then
begin
CopyMemory(Pointer(POffsetIndex),Pointer(DWORD(hMem)+fBegin),mCount*4);
FImageCount:=mCount;
bOk:=TRUE;
end;
end;
UnmapViewOfFile(hMem);
end;
CloseHandle(hMap);
end;
CloseHandle(hWix);
end;
if bOk then
begin
SetLength(fWil,Length(fWix));
strcopy(pchar(fWil),pchar(fWix));
fWil[Length(fWix)]:='l';
hWil:=CreateFile(
pchar(fWil),
GENERIC_READ ,
FILE_SHARE_WRITE or FILE_SHARE_READ,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0
);
if hWil<>INVALID_HANDLE_VALUE then
begin
hMap:=CreateFileMapping(hWil,nil,PAGE_READONLY,0,0,nil);
if hMap<>0 then
begin
hMem:=MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);
if hMem<>nil then
begin
mfSize:=GetFileSize(hWil,0);
GetMem(Pointer(PWIL),mfSize);
if Pointer(PWIL)<>nil then
begin
CopyMemory(Pointer(PWIL),hMem,mfSize);
FSize:=mfSize;
if G3 then ReSult:=GT3 else ReSult:=EI3;
end;
UnmapViewOfFile(hMem);
end;
CloseHandle(hMap);
end;
CloseHandle(hWil);
end;
end;
except
ReSult:=0;
end;
if ReSult<>0 then Adjust;
end;
destructor TWIL.Destroy;
var PIndex,tPWIL:DWORD;
begin
FImageCount:=0;
FSize:=0;
PIndex:=POffsetIndex;
tPWIL:=PWIL;
inherited destroy;
if PIndex<>0 then try freemem(Pointer(PIndex));except end;
if PWIL<>0 then try freemem(Pointer(tPWIL));except end;
end;
procedure TWIL.Clear;
var PIndex,tPWIL:DWORD;
begin
PIndex:=POffsetIndex;
tPWIL:=PWIL;
if PIndex<>0 then try freemem(Pointer(PIndex));except end;
if PWIL<>0 then try freemem(Pointer(tPWIL));except end;
FImageCount:=0;
POffsetIndex:=0;
PWIL:=0;
FSize:=0;
end;
function TWIL.GetCount:integer;
begin
ReSult:=FImageCount;
end;
function TWIL.GetOffset(Index:integer):DWORD;
begin
ReSult:=0;
if Index<FImageCount then ReSult:=PDWORD(POffsetIndex+Index*4)^;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -