summaryrefslogtreecommitdiff
path: root/packages/graph
diff options
context:
space:
mode:
authornickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2013-10-08 21:11:39 +0000
committernickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2013-10-08 21:11:39 +0000
commit210bd922fcb19607c6a5875205d20ce774de36f6 (patch)
treecf9f8b8fd235b61874ff716a54b48643bd2cfab9 /packages/graph
parent66f0ac0999eb8eb2d71b3feba80540a60185ff3e (diff)
downloadfpc-210bd922fcb19607c6a5875205d20ce774de36f6.tar.gz
* TNewModeInfo/newModeList modified so that it doesn't keep a second copy of the
TModeInfo record for each mode, but instead keep only a pointer to the entry in the regular ModeList. This frees a lot of memory on i8086-msdos, when using the medium memory model (which has a 64kb data limit). git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@25725 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/graph')
-rw-r--r--packages/graph/src/inc/graph.inc22
-rw-r--r--packages/graph/src/inc/modes.inc132
2 files changed, 88 insertions, 66 deletions
diff --git a/packages/graph/src/inc/graph.inc b/packages/graph/src/inc/graph.inc
index 58a05db870..0d17de8dfc 100644
--- a/packages/graph/src/inc/graph.inc
+++ b/packages/graph/src/inc/graph.inc
@@ -114,8 +114,14 @@ var
type
+ PNewModelist = ^TNewModeList;
+ TNewModeList = record
+ Mode: PModeInfo;
+ next: PNewModeList;
+ internModeNumber: smallint;
+ end;
TNewModeInfo = record
- modeInfo: array[lowNewDriver..highNewDriver] of PModeInfo;
+ modeInfo: array[lowNewDriver..highNewDriver] of PNewModeList;
loHiModeNr: array[lowNewDriver..highNewDriver] of record
lo,hi: smallint;
end;
@@ -2111,7 +2117,9 @@ end;
var
list: PModeInfo;
tmp : PModeInfo;
- c: longint;
+ newList: PNewModeList;
+ newTmp : PNewModeList;
+ c: smallint;
begin
{ restore old exitproc! }
exitproc := exitsave;
@@ -2132,12 +2140,12 @@ end;
end;
for c := lowNewDriver to highNewDriver do
begin
- list := newModeList.modeinfo[c];
- while assigned(list) do
+ newList := newModeList.modeinfo[c];
+ while assigned(newList) do
begin
- tmp := list;
- list:=list^.next;
- dispose(tmp);
+ newTmp := newList;
+ newList:=newList^.next;
+ dispose(newTmp);
end;
end;
{$IFDEF DPMI}
diff --git a/packages/graph/src/inc/modes.inc b/packages/graph/src/inc/modes.inc
index b65c8488af..0135d7e90f 100644
--- a/packages/graph/src/inc/modes.inc
+++ b/packages/graph/src/inc/modes.inc
@@ -76,10 +76,30 @@ end;
{********************************************************}
var
i,driverNr, modeNr: smallint;
- prev: PModeInfo;
+ prev: PNewModeList;
list: PModeInfo;
- newlst : PModeInfo;
+ newMode: PModeInfo;
+ newList: PNewModeList;
+ newLst: PNewModeList;
begin
+ { TP-like mode stuff }
+ if not assigned(ModeList) then
+ begin
+ new(ModeList);
+ System.move(mode, ModeList^, sizeof(Mode));
+ newMode := ModeList;
+ end
+ else
+ begin
+ list := ModeList;
+ { go to the end of the list }
+ while assigned(list^.next) do
+ list:=list^.next;
+ new(newMode);
+ list^.next := newMode;
+ System.move(mode, newMode^, sizeof(Mode));
+ end;
+
res2Mode(mode.maxx+1,mode.maxy+1,mode.maxColor,driverNr,ModeNr);
{ bitdepth supported? }
if (driverNr <> maxsmallint) then
@@ -92,47 +112,47 @@ end;
' ('+strf(mode.maxx)+'x'+strf(mode.maxy)+')');
{$endif logging}
new(newModeList.modeinfo[driverNr]);
- newModeList.modeinfo[driverNr]^ := mode;
+ newModeList.modeinfo[driverNr]^.Mode := newMode;
newModeList.modeinfo[driverNr]^.next:=nil;
end
else
begin
prev := nil;
- list := newModeList.modeinfo[driverNr];
+ newList := newModeList.modeinfo[driverNr];
{ sort first by x resolution, then by yresolution }
- while assigned(list) and
- ((list^.maxx < mode.maxx) or
- ((list^.maxx = mode.maxx) and
- (list^.maxy < mode.maxy))) do
+ while assigned(newList) and
+ ((newList^.Mode^.maxx < mode.maxx) or
+ ((newList^.Mode^.maxx = mode.maxx) and
+ (newList^.Mode^.maxy < mode.maxy))) do
begin
- prev := list;
- list := list^.next;
+ prev := newList;
+ newList := newList^.next;
end;
{ mode already exists? -> replace (assume later added modes are }
{ better) }
- if assigned(list) and
- (list^.maxx = mode.maxx) and
- (list^.maxy = mode.maxy) then
+ if assigned(newList) and
+ (newList^.Mode^.maxx = mode.maxx) and
+ (newList^.Mode^.maxy = mode.maxy) then
begin
{$ifdef logging}
logln('replacing resolution '+strf(modenr)+' for drivernr '+strf(drivernr)+
' ('+strf(mode.maxx)+'x'+strf(mode.maxy)+')');
{$endif logging}
{ save/restore next, drivernr and drivermode in list }
- prev := list^.next;
- list^ := mode;
- list^.next := prev;
+ prev := newList^.next;
+ newList^.Mode := newMode;
+ newList^.next := prev;
end
else
begin
new(newLst);
{ Increase the number of modes for this driver }
- newLst^ := mode;
+ newLst^.Mode := newMode;
{$ifdef logging}
logln('Adding resolution '+strf(modenr)+' for drivernr '+strf(drivernr)+
' ('+strf(mode.maxx)+'x'+strf(mode.maxy)+')');
{$endif logging}
- newLst^.next := list;
+ newLst^.next := newList;
if assigned(prev) then
prev^.next := newLst
else
@@ -140,33 +160,17 @@ end;
end;
end;
{ renumber internmodenumber }
- list := newModeList.modeinfo[driverNr];
+ newList := newModeList.modeinfo[driverNr];
i:=0;
- while assigned(list) do
+ while assigned(newList) do
begin
inc(i);
- list^.internmodenumber:=i;
- list:=list^.next;
+ newList^.internmodenumber:=i;
+ newList:=newList^.next;
end;
newModeList.loHiModeNr[driverNr].lo:=1;
newModeList.loHiModeNr[driverNr].hi:=i;
end;
- { TP-like mode stuff }
- if not assigned(ModeList) then
- begin
- new(ModeList);
- System.move(mode, ModeList^, sizeof(Mode));
- end
- else
- begin
- list := ModeList;
- { go to the end of the list }
- while assigned(list^.next) do
- list:=list^.next;
- new(NewLst);
- list^.next := NewLst;
- System.move(mode, NewLst^, sizeof(Mode));
- end;
end;
@@ -196,6 +200,7 @@ end;
{********************************************************}
var
list, lastModeInfo: PModeInfo;
+ newList: PNewModeList;
x,y: longint;
begin
{$ifdef logging}
@@ -208,7 +213,10 @@ end;
-32768:
begin
reqMode := newModeList.loHiModeNr[reqDriver].lo;
- searchMode := newModeList.modeinfo[reqDriver];
+ if newModeList.modeinfo[reqDriver] <> nil then
+ searchMode := newModeList.modeinfo[reqDriver]^.Mode
+ else
+ searchMode := nil;
end;
-32767:
begin
@@ -217,39 +225,45 @@ end;
{ Are there any modes available for this driver? }
if reqMode <> -1 then
begin
- list := newModeList.modeinfo[reqDriver];
- while assigned(list^.next) do
- list := list^.next;
- searchMode := list;
+ newList := newModeList.modeinfo[reqDriver];
+ while assigned(newList^.next) do
+ newList := newList^.next;
+ searchMode := newList^.Mode;
end;
end;
else
begin
- list := newModeList.modeinfo[reqDriver];
+ newList := newModeList.modeinfo[reqDriver];
searchMode := nil;
- if not assigned(list) then
+ if not assigned(newList) then
exit;
if mode2res(reqMode,x,y) then
begin
x := pred(x);
y := pred(y);
- while assigned(list) and
- ((list^.maxx < x) or
- ((list^.maxx = x) and
- (list^.maxy < y))) do
- list := list^.next;
- if not assigned(list) or
- (list^.maxx <> x) or
- (list^.maxy <> y) then
- list := nil;
- searchmode := list;
+ while assigned(newList) and
+ ((newList^.Mode^.maxx < x) or
+ ((newList^.Mode^.maxx = x) and
+ (newList^.Mode^.maxy < y))) do
+ newList := newList^.next;
+ if not assigned(newList) or
+ (newList^.Mode^.maxx <> x) or
+ (newList^.Mode^.maxy <> y) then
+ newList := nil;
+ if newList <> nil then
+ searchmode := newList^.Mode
+ else
+ searchmode := nil;
end
else
begin
- while assigned(list) and
- (list^.internModeNumber <> reqMode) do
- list := list^.next;
- searchMode := list;
+ while assigned(newList) and
+ (newList^.internModeNumber <> reqMode) do
+ newList := newList^.next;
+ if newList <> nil then
+ searchMode := newList^.Mode
+ else
+ searchMode := nil;
end;
end;