From 13a4e41b0c7fc23d05b89dfed5066e13ace8e108 Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 19 Oct 2003 12:36:36 +0000 Subject: [PATCH] * improved speed; reduced memory usage of the interference bitmap --- compiler/rgobj.pas | 54 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/compiler/rgobj.pas b/compiler/rgobj.pas index 9c6f269971..a586c9800c 100644 --- a/compiler/rgobj.pas +++ b/compiler/rgobj.pas @@ -125,18 +125,20 @@ unit rgobj; layer 1 - 256*256 blocks with pointers to layer 2 blocks layer 2 - blocks of 32*256 (32 bytes = 256 bits) } - Tinterferencebitmap2=array[byte] of set of byte; - Pinterferencebitmap2=^Tinterferencebitmap2; - Tinterferencebitmap1=array[byte,byte] of Pinterferencebitmap2; + Tinterferencebitmap2 = array[byte] of set of byte; + Pinterferencebitmap2 = ^Tinterferencebitmap2; + Tinterferencebitmap1 = array[byte] of Pinterferencebitmap2; + pinterferencebitmap1 = ^tinterferencebitmap1; Tinterferencebitmap=class private maxx1, maxy1 : byte; - fbitmap : Tinterferencebitmap1; + fbitmap : pinterferencebitmap1; function getbitmap(x,y:tsuperregister):boolean; procedure setbitmap(x,y:tsuperregister;b:boolean); public + constructor create; destructor destroy;override; property bitmap[x,y:tsuperregister]:boolean read getbitmap write setbitmap;default; end; @@ -457,21 +459,40 @@ implementation tinterferencebitmap ******************************************************************************} + constructor tinterferencebitmap.create; + begin + inherited create; + maxx1:=1; + getmem(fbitmap,sizeof(tinterferencebitmap1)*2); + fillchar(fbitmap^,sizeof(tinterferencebitmap1)*2,0); + end; + + destructor tinterferencebitmap.destroy; var i,j : byte; begin - for i:=0 to maxx1 do - for j:=0 to maxy1 do - if assigned(fbitmap[i,j]) then - dispose(fbitmap[i,j]); + if assigned(fbitmap) then + begin + for i:=0 to maxx1 do + for j:=0 to maxy1 do + if assigned(fbitmap[i,j]) then + dispose(fbitmap[i,j]); + freemem(fbitmap); + end; end; function tinterferencebitmap.getbitmap(x,y:tsuperregister):boolean; + var + page : pinterferencebitmap2; begin - result:=assigned(fbitmap[x shr 8,y shr 8]) and - ((x and $ff) in fbitmap[x shr 8,y shr 8]^[y and $ff]); + result:=false; + if (x shr 8>maxx1) then + exit; + page:=fbitmap[x shr 8,y shr 8]; + result:=assigned(page) and + ((x and $ff) in page^[y and $ff]); end; @@ -481,10 +502,14 @@ implementation begin x1:=x shr 8; y1:=y shr 8; + if x1>maxx1 then + begin + reallocmem(fbitmap,sizeof(tinterferencebitmap1)*(x1+1)); + fillchar(fbitmap[maxx1+1],sizeof(tinterferencebitmap1)*(x1-maxx1),0); + maxx1:=x1; + end; if not assigned(fbitmap[x1,y1]) then begin - if x1>maxx1 then - maxx1:=x1; if y1>maxy1 then maxy1:=y1; new(fbitmap[x1,y1]); @@ -1771,7 +1796,10 @@ implementation end. { $Log$ - Revision 1.89 2003-10-19 01:34:30 florian + Revision 1.90 2003-10-19 12:36:36 florian + * improved speed; reduced memory usage of the interference bitmap + + Revision 1.89 2003/10/19 01:34:30 florian * some ppc stuff fixed * memory leak fixed