TBmpImageArr = array[0..MaxListSize div 4] of TBmpImage;
TDxImageArr = array[0..MaxListSize div 4] of TDxImage;
PTBmpImageArr = ^TBmpImageArr;
PTDxImageArr = ^TDxImageArr;
destructor TWMImages.Destroy;
begin
IndexList.Free;
// BmpList.Free;
if Stream <> nil then Stream.Free;
lsDib.Free;
inherited Destroy;
end;
procedure TWMImages.Initialize;
var
idxfile: string;
header: TWMImageHeader;
begin
if not (csDesigning in ComponentState) then begin
if FFileName = '' then begin
raise Exception.Create ('FileName not assigned..');
exit;
end;
if (LibType <> ltLoadBmp) and (FDDraw = nil) then begin
raise Exception.Create ('DDraw not assigned..');
exit;
end;
if FileExists (FFileName) then begin
if Stream = nil then
Stream := TFileStream.Create (FFileName, fmOpenRead or fmShareDenyNone);
Stream.Read (header, sizeof(TWMImageHeader));
FImageCount := header.ImageCount;
if LibType = ltLoadBmp then begin
BmpArr := AllocMem (sizeof(TBmpImage) * FImageCount);
if BmpArr = nil then
raise Exception.Create (self.Name + ' BmpArr = nil');
end else begin
ImgArr := AllocMem (sizeof(TDxImage) * FImageCount);
if ImgArr = nil then
raise Exception.Create (self.Name + ' ImgArr = nil');
end;
//索引文件
idxfile := ExtractFilePath(FFileName) + ExtractFileNameOnly(FFileName) + '.WIX';
LoadPalette;
if LibType = ltLoadMemory then
LoadAllData
else begin
LoadIndex (idxfile);
end;
end else begin
MessageDlg (FFileName + ' 文件不存在.', mtWarning, [mbOk], 0);
end;
end;
end;
procedure TWMImages.Finalize;
var
i: integer;
begin
//释放装载的所有图片
for i:=0 to FImageCount-1 do begin
if ImgArr.Surface <> nil then begin
ImgArr.Surface.Free;
ImgArr.Surface := nil;
end;
end;
if Stream <> nil then begin
Stream.Free;
Stream := nil;
end;
end;
//这个函数在DXDraws里有
function TDXDrawRGBQuadsToPaletteEntries(const RGBQuads: TRGBQuads;
AllowPalette256: Boolean): TPaletteEntries;
var
Entries: TPaletteEntries;
dc: THandle;
i: Integer;
begin
Result := RGBQuadsToPaletteEntries(RGBQuads);
if not AllowPalette256 then
begin
dc := GetDC(0);
GetSystemPaletteEntries(dc, 0, 256, Entries);
ReleaseDC(0, dc);
for i:=0 to 9 do
Result := Entries;
for i:=256-10 to 255 do
Result := Entries;
end;
for i:=0 to 255 do
Result.peFlags := D3DPAL_READONLY;
end;
//装载图片到内存,需要大量内存!
procedure TWMImages.LoadAllData;
var
i: integer;
imgi: TWMImageInfo;
dib: TDIB;
dximg: TDxImage;
begin
dib := TDIB.Create;
for i:=0 to FImageCount-1 do begin
Stream.Read (imgi, sizeof(TWMImageInfo) - 4);