📄 wil.pas
字号:
function TWMImages.FGetImageBitmap (index: integer): TBitmap;
begin
Result:=nil;
if LibType <> ltLoadBmp then exit;
Result := GetCachedBitmap (index);
{if index in [0..BmpList.Count-1] then begin
Result := TBitmap (BmpList[index]);
end else
Result := nil;}
end;
procedure TWMImages.FSetDxDraw (fdd: TDxDraw);
begin
FDxDraw := fdd;
end;
// *** DirectDrawSurface Functions
procedure TWMImages.LoadDxImage (position: integer; pdximg: PTDxImage);
var
imginfo: TWMImageInfo;
ddsd: TDDSurfaceDesc;
SBits, PSrc, DBits: PByte;
n, slen, dlen: integer;
nErrorCode:Integer;
begin
m_FileStream.Seek (position, 0);
if btVersion <> 0 then m_FileStream.Read (imginfo, SizeOf(TWMImageInfo)-4)
else m_FileStream.Read (imginfo, SizeOf(TWMImageInfo));
if g_boUseDIBSurface then begin //DIB
//非全屏时
try
lsDib.Clear;
lsDib.Width := imginfo.nWidth;
lsDib.Height := imginfo.nHeight;
except
end;
lsDib.ColorTable := MainPalette;
lsDib.UpdatePalette;
DBits := lsDib.PBits;
m_FileStream.Read (DBits^, imginfo.nWidth * imgInfo.nHeight);
pdximg.nPx := imginfo.px;
pdximg.nPy := imginfo.py;
pdximg.surface := TDirectDrawSurface.Create (FDDraw);
pdximg.surface.SystemMemory := TRUE;
pdximg.surface.SetSize (imginfo.nWidth, imginfo.nHeight);
pdximg.surface.Canvas.Draw (0, 0, lsDib);
pdximg.surface.Canvas.Release;
pdximg.surface.TransparentColor := 0;
end else begin //
//非全屏时
slen := WidthBytes(imginfo.nWidth);
GetMem (PSrc, slen * imgInfo.nHeight);
SBits := PSrc;
m_FileStream.Read (PSrc^, slen * imgInfo.nHeight);
try
pdximg.surface := TDirectDrawSurface.Create (FDDraw);
pdximg.surface.SystemMemory := TRUE;
pdximg.surface.SetSize (slen, imginfo.nHeight);
//pdximg.surface.Palette := MainSurfacePalette;
pdximg.nPx := imginfo.px;
pdximg.nPy := imginfo.py;
ddsd.dwSize := SizeOf(ddsd);
pdximg.surface.Lock (TRect(nil^), ddsd);
DBits := ddsd.lpSurface;
for n:=imginfo.nHeight - 1 downto 0 do begin
SBits := PByte (Integer(PSrc) + slen * n);
Move(SBits^, DBits^, slen);
Inc (integer(DBits), ddsd.lPitch);
end;
pdximg.surface.TransparentColor := 0;
finally
pdximg.surface.UnLock();
FreeMem (PSrc);
end;
end;
end;
procedure TWMImages.LoadBmpImage (position: integer; pbmpimg: PTBmpImage);
var
imginfo: TWMImageInfo;
ddsd: TDDSurfaceDesc;
DBits: PByte;
n, slen, dlen: integer;
begin
m_FileStream.Seek (position, 0);
m_FileStream.Read (imginfo, sizeof(TWMImageInfo)-4);
lsDib.Width := imginfo.nWidth;
lsDib.Height := imginfo.nHeight;
lsDib.ColorTable := MainPalette;
lsDib.UpdatePalette;
DBits := lsDib.PBits;
m_FileStream.Read (DBits^, imginfo.nWidth * imgInfo.nHeight);
pbmpimg.bmp := TBitmap.Create;
pbmpimg.bmp.Width := lsDib.Width;
pbmpimg.bmp.Height := lsDib.Height;
pbmpimg.bmp.Canvas.Draw (0, 0, lsDib);
lsDib.Clear;
end;
procedure TWMImages.ClearCache;
var
i: integer;
begin
for i:=0 to ImageCount - 1 do begin
if m_ImgArr[i].Surface <> nil then begin
m_ImgArr[i].Surface.Free;
m_ImgArr[i].Surface := nil;
end;
end;
//MemorySize := 0;
end;
function TWMImages.GetImage (index: integer; var px, py: integer): TDirectDrawSurface;
begin
if (index >= 0) and (index < ImageCount) then begin
px := m_ImgArr[index].nPx;
py := m_ImgArr[index].nPy;
Result := m_ImgArr[index].surface;
end else
Result := nil;
end;
{--------------- BMP functions ----------------}
//
procedure TWMImages.FreeOldBmps;
var
i, n, ntime, curtime, limit: integer;
begin
n := -1;
ntime := 0;
//limit := FMaxMemorySize * 9 div 10;
for i:=0 to ImageCount-1 do begin
curtime := GetTickCount;
if m_BmpArr[i].Bmp <> nil then begin
if GetTickCount - m_BmpArr[i].dwLatestTime > 5 * 1000 then begin
//MemorySize := MemorySize - BmpArr[i].Bmp.Width * BmpArr[i].Bmp.Height;
m_BmpArr[i].Bmp.Free;
m_BmpArr[i].Bmp := nil;
end else begin
if GetTickCount - m_BmpArr[i].dwLatestTime > ntime then begin
ntime := GetTickCount - m_BmpArr[i].dwLatestTime;
n := i;
end;
end;
end;
//if MemorySize < limit then begin
// n := -1;
// break;
//end;
end;
//if n >= 0 then begin
// MemorySize := MemorySize - BmpArr[n].Bmp.Width * BmpArr[n].Bmp.Height;
// BmpArr[n].Bmp.FreeImage;
// BmpArr[n].Bmp.Free;
// BmpArr[n].Bmp := nil;
//end;
end;
procedure TWMImages.FreeBitmap (index: integer);
begin
if (index >= 0) and (index < ImageCount) then begin
if m_BmpArr[index].Bmp <> nil then begin
//MemorySize := MemorySize - BmpArr[index].Bmp.Width * BmpArr[index].Bmp.Height;
//if MemorySize < 0 then MemorySize := 0;
m_BmpArr[index].Bmp.FreeImage;
m_BmpArr[index].Bmp.Free;
m_BmpArr[index].Bmp := nil;
end;
end;
end;
procedure TWMImages.FreeOldMemorys;
var
i, n, ntime, curtime, limit: integer;
begin
n := -1;
ntime := 0;
//limit := FMaxMemorySize * 9 div 10;
curtime := GetTickCount;
for i:=0 to ImageCount-1 do begin
if m_ImgArr[i].Surface <> nil then begin
if GetTickCount - m_ImgArr[i].dwLatestTime > 5 * 60 * 1000 then begin
//MemorySize := MemorySize - ImgArr[i].Surface.Width * ImgArr[i].Surface.Height;
m_ImgArr[i].Surface.Free;
m_ImgArr[i].Surface := nil;
end;
end;
//if MemorySize < limit then begin
// n := -1;
// break;
//end;
end;
end;
//Cache
function TWMImages.GetCachedSurface (index: integer): TDirectDrawSurface;
var
nPosition:Integer;
nErrCode:Integer;
begin
Result := nil;
nErrCode:=0;
try
if (index < 0) or (index >= ImageCount) then exit;
if GetTickCount - m_dwMemChecktTick > 10000 then begin
m_dwMemChecktTick := GetTickCount;
//if MemorySize > FMaxMemorySize then begin
FreeOldMemorys;
//end;
end;
nErrCode:=1;
if m_ImgArr[index].Surface = nil then begin
if index < m_IndexList.Count then begin
nPosition:= Integer(m_IndexList[index]);
LoadDxImage (nPosition, @m_ImgArr[index]);
m_ImgArr[index].dwLatestTime := GetTickCount;
nErrCode:=2;
Result := m_ImgArr[index].Surface;
//MemorySize := MemorySize + ImgArr[index].Surface.Width * ImgArr[index].Surface.Height;
end;
end else begin
m_ImgArr[index].dwLatestTime := GetTickCount;
nErrCode:=3;
Result := m_ImgArr[index].Surface;
end;
except
//DebugOutStr ('GetCachedSurface 3 Index: ' + IntToStr(index) + ' Error Code: ' + IntToStr(nErrCode));
end;
end;
function TWMImages.GetCachedImage (index: integer; var px, py: integer): TDirectDrawSurface;
var
position: integer;
nErrCode:Integer;
begin
Result := nil;
nErrCode:=0;
try
if (index < 0) or (index >= ImageCount) then exit;
if GetTickCount - m_dwMemChecktTick > 10000 then begin
m_dwMemChecktTick := GetTickCount;
//if MemorySize > FMaxMemorySize then begin
FreeOldMemorys;
//end;
end;
nErrCode:=1;
if m_ImgArr[index].Surface = nil then begin //cache
if index < m_IndexList.Count then begin
position := Integer(m_IndexList[index]);
LoadDxImage (position, @m_ImgArr[index]);
m_ImgArr[index].dwLatestTime := GetTickCount;
px := m_ImgArr[index].nPx;
py := m_ImgArr[index].nPy;
Result := m_ImgArr[index].Surface;
//MemorySize := MemorySize + ImgArr[index].Surface.Width * ImgArr[index].Surface.Height;
end;
end else begin
m_ImgArr[index].dwLatestTime := GetTickCount;
px := m_ImgArr[index].nPx;
py := m_ImgArr[index].nPy;
Result := m_ImgArr[index].Surface;
end;
except
//DebugOutStr ('GetCachedImage 3 Index: ' + IntToStr(index) + ' Error Code: ' + IntToStr(nErrCode));
end;
end;
function TWMImages.GetCachedBitmap (index: integer): TBitmap;
var
position: integer;
begin
Result := nil;
if (index < 0) or (index >= ImageCount) then exit;
if m_BmpArr[index].Bmp = nil then begin
if index < m_IndexList.Count then begin
position := Integer(m_IndexList[index]);
LoadBmpImage (position, @m_BmpArr[index]);
m_BmpArr[index].dwLatestTime := GetTickCount;
Result := m_BmpArr[index].Bmp;
//MemorySize := MemorySize + BmpArr[index].Bmp.Width * BmpArr[index].Bmp.Height;
//if (MemorySize > FMaxMemorySize) then begin
FreeOldBmps;
//end;
end;
end else begin
m_BmpArr[index].dwLatestTime:=GetTickCount;
Result := m_BmpArr[index].Bmp;
end;
end;
procedure TWMImages.DrawZoom (paper: TCanvas; x, y, index: integer; zoom: Real);
var
rc: TRect;
bmp: TBitmap;
begin
if LibType <> ltLoadBmp then exit;
//if index > BmpList.Count-1 then exit;
bmp := Bitmaps[index];
if bmp <> nil then begin
rc.Left := x;
rc.Top := y;
rc.Right := x + Round (bmp.Width * zoom);
rc.Bottom := y + Round (bmp.Height * zoom);
if (rc.Right > rc.Left) and (rc.Bottom > rc.Top) then begin
paper.StretchDraw (rc, Bmp);
FreeBitmap (index);
end;
end;
end;
procedure TWMImages.DrawZoomEx (paper: TCanvas; x, y, index: integer; zoom: Real; leftzero: Boolean);
var
rc: TRect;
bmp, bmp2: TBitmap;
begin
if LibType <> ltLoadBmp then exit;
//if index > BmpList.Count-1 then exit;
bmp := Bitmaps[index];
if bmp <> nil then begin
Bmp2 := TBitmap.Create;
Bmp2.Width := Round (Bmp.Width * zoom);
Bmp2.Height := Round (Bmp.Height * zoom);
rc.Left := x;
rc.Top := y;
rc.Right := x + Round (bmp.Width * zoom);
rc.Bottom := y + Round (bmp.Height * zoom);
if (rc.Right > rc.Left) and (rc.Bottom > rc.Top) then begin
Bmp2.Canvas.StretchDraw (Rect(0, 0, Bmp2.Width, Bmp2.Height), Bmp);
if leftzero then begin
SpliteBitmap (paper.Handle, X, Y, Bmp2, $0)
end else begin
SpliteBitmap (paper.Handle, X, Y-Bmp2.Height, Bmp2, $0);
end;
end;
FreeBitmap (index);
bmp2.Free;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -