⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtlwil.~pas

📁 传奇3 ei3 / 1.45 / 3G 版本 wil 资源编辑器源代码!
💻 ~PAS
📖 第 1 页 / 共 3 页
字号:
    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 + -