mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-12 22:32:29 +02:00
* 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: trunk@25725 -
This commit is contained in:
parent
6d1663fdc5
commit
6f474e525c
@ -114,8 +114,14 @@ var
|
|||||||
|
|
||||||
|
|
||||||
type
|
type
|
||||||
|
PNewModelist = ^TNewModeList;
|
||||||
|
TNewModeList = record
|
||||||
|
Mode: PModeInfo;
|
||||||
|
next: PNewModeList;
|
||||||
|
internModeNumber: smallint;
|
||||||
|
end;
|
||||||
TNewModeInfo = record
|
TNewModeInfo = record
|
||||||
modeInfo: array[lowNewDriver..highNewDriver] of PModeInfo;
|
modeInfo: array[lowNewDriver..highNewDriver] of PNewModeList;
|
||||||
loHiModeNr: array[lowNewDriver..highNewDriver] of record
|
loHiModeNr: array[lowNewDriver..highNewDriver] of record
|
||||||
lo,hi: smallint;
|
lo,hi: smallint;
|
||||||
end;
|
end;
|
||||||
@ -2111,7 +2117,9 @@ end;
|
|||||||
var
|
var
|
||||||
list: PModeInfo;
|
list: PModeInfo;
|
||||||
tmp : PModeInfo;
|
tmp : PModeInfo;
|
||||||
c: longint;
|
newList: PNewModeList;
|
||||||
|
newTmp : PNewModeList;
|
||||||
|
c: smallint;
|
||||||
begin
|
begin
|
||||||
{ restore old exitproc! }
|
{ restore old exitproc! }
|
||||||
exitproc := exitsave;
|
exitproc := exitsave;
|
||||||
@ -2132,12 +2140,12 @@ end;
|
|||||||
end;
|
end;
|
||||||
for c := lowNewDriver to highNewDriver do
|
for c := lowNewDriver to highNewDriver do
|
||||||
begin
|
begin
|
||||||
list := newModeList.modeinfo[c];
|
newList := newModeList.modeinfo[c];
|
||||||
while assigned(list) do
|
while assigned(newList) do
|
||||||
begin
|
begin
|
||||||
tmp := list;
|
newTmp := newList;
|
||||||
list:=list^.next;
|
newList:=newList^.next;
|
||||||
dispose(tmp);
|
dispose(newTmp);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
{$IFDEF DPMI}
|
{$IFDEF DPMI}
|
||||||
|
@ -76,10 +76,30 @@ end;
|
|||||||
{********************************************************}
|
{********************************************************}
|
||||||
var
|
var
|
||||||
i,driverNr, modeNr: smallint;
|
i,driverNr, modeNr: smallint;
|
||||||
prev: PModeInfo;
|
prev: PNewModeList;
|
||||||
list: PModeInfo;
|
list: PModeInfo;
|
||||||
newlst : PModeInfo;
|
newMode: PModeInfo;
|
||||||
|
newList: PNewModeList;
|
||||||
|
newLst: PNewModeList;
|
||||||
begin
|
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);
|
res2Mode(mode.maxx+1,mode.maxy+1,mode.maxColor,driverNr,ModeNr);
|
||||||
{ bitdepth supported? }
|
{ bitdepth supported? }
|
||||||
if (driverNr <> maxsmallint) then
|
if (driverNr <> maxsmallint) then
|
||||||
@ -92,47 +112,47 @@ end;
|
|||||||
' ('+strf(mode.maxx)+'x'+strf(mode.maxy)+')');
|
' ('+strf(mode.maxx)+'x'+strf(mode.maxy)+')');
|
||||||
{$endif logging}
|
{$endif logging}
|
||||||
new(newModeList.modeinfo[driverNr]);
|
new(newModeList.modeinfo[driverNr]);
|
||||||
newModeList.modeinfo[driverNr]^ := mode;
|
newModeList.modeinfo[driverNr]^.Mode := newMode;
|
||||||
newModeList.modeinfo[driverNr]^.next:=nil;
|
newModeList.modeinfo[driverNr]^.next:=nil;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
prev := nil;
|
prev := nil;
|
||||||
list := newModeList.modeinfo[driverNr];
|
newList := newModeList.modeinfo[driverNr];
|
||||||
{ sort first by x resolution, then by yresolution }
|
{ sort first by x resolution, then by yresolution }
|
||||||
while assigned(list) and
|
while assigned(newList) and
|
||||||
((list^.maxx < mode.maxx) or
|
((newList^.Mode^.maxx < mode.maxx) or
|
||||||
((list^.maxx = mode.maxx) and
|
((newList^.Mode^.maxx = mode.maxx) and
|
||||||
(list^.maxy < mode.maxy))) do
|
(newList^.Mode^.maxy < mode.maxy))) do
|
||||||
begin
|
begin
|
||||||
prev := list;
|
prev := newList;
|
||||||
list := list^.next;
|
newList := newList^.next;
|
||||||
end;
|
end;
|
||||||
{ mode already exists? -> replace (assume later added modes are }
|
{ mode already exists? -> replace (assume later added modes are }
|
||||||
{ better) }
|
{ better) }
|
||||||
if assigned(list) and
|
if assigned(newList) and
|
||||||
(list^.maxx = mode.maxx) and
|
(newList^.Mode^.maxx = mode.maxx) and
|
||||||
(list^.maxy = mode.maxy) then
|
(newList^.Mode^.maxy = mode.maxy) then
|
||||||
begin
|
begin
|
||||||
{$ifdef logging}
|
{$ifdef logging}
|
||||||
logln('replacing resolution '+strf(modenr)+' for drivernr '+strf(drivernr)+
|
logln('replacing resolution '+strf(modenr)+' for drivernr '+strf(drivernr)+
|
||||||
' ('+strf(mode.maxx)+'x'+strf(mode.maxy)+')');
|
' ('+strf(mode.maxx)+'x'+strf(mode.maxy)+')');
|
||||||
{$endif logging}
|
{$endif logging}
|
||||||
{ save/restore next, drivernr and drivermode in list }
|
{ save/restore next, drivernr and drivermode in list }
|
||||||
prev := list^.next;
|
prev := newList^.next;
|
||||||
list^ := mode;
|
newList^.Mode := newMode;
|
||||||
list^.next := prev;
|
newList^.next := prev;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
new(newLst);
|
new(newLst);
|
||||||
{ Increase the number of modes for this driver }
|
{ Increase the number of modes for this driver }
|
||||||
newLst^ := mode;
|
newLst^.Mode := newMode;
|
||||||
{$ifdef logging}
|
{$ifdef logging}
|
||||||
logln('Adding resolution '+strf(modenr)+' for drivernr '+strf(drivernr)+
|
logln('Adding resolution '+strf(modenr)+' for drivernr '+strf(drivernr)+
|
||||||
' ('+strf(mode.maxx)+'x'+strf(mode.maxy)+')');
|
' ('+strf(mode.maxx)+'x'+strf(mode.maxy)+')');
|
||||||
{$endif logging}
|
{$endif logging}
|
||||||
newLst^.next := list;
|
newLst^.next := newList;
|
||||||
if assigned(prev) then
|
if assigned(prev) then
|
||||||
prev^.next := newLst
|
prev^.next := newLst
|
||||||
else
|
else
|
||||||
@ -140,33 +160,17 @@ end;
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
{ renumber internmodenumber }
|
{ renumber internmodenumber }
|
||||||
list := newModeList.modeinfo[driverNr];
|
newList := newModeList.modeinfo[driverNr];
|
||||||
i:=0;
|
i:=0;
|
||||||
while assigned(list) do
|
while assigned(newList) do
|
||||||
begin
|
begin
|
||||||
inc(i);
|
inc(i);
|
||||||
list^.internmodenumber:=i;
|
newList^.internmodenumber:=i;
|
||||||
list:=list^.next;
|
newList:=newList^.next;
|
||||||
end;
|
end;
|
||||||
newModeList.loHiModeNr[driverNr].lo:=1;
|
newModeList.loHiModeNr[driverNr].lo:=1;
|
||||||
newModeList.loHiModeNr[driverNr].hi:=i;
|
newModeList.loHiModeNr[driverNr].hi:=i;
|
||||||
end;
|
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;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -196,6 +200,7 @@ end;
|
|||||||
{********************************************************}
|
{********************************************************}
|
||||||
var
|
var
|
||||||
list, lastModeInfo: PModeInfo;
|
list, lastModeInfo: PModeInfo;
|
||||||
|
newList: PNewModeList;
|
||||||
x,y: longint;
|
x,y: longint;
|
||||||
begin
|
begin
|
||||||
{$ifdef logging}
|
{$ifdef logging}
|
||||||
@ -208,7 +213,10 @@ end;
|
|||||||
-32768:
|
-32768:
|
||||||
begin
|
begin
|
||||||
reqMode := newModeList.loHiModeNr[reqDriver].lo;
|
reqMode := newModeList.loHiModeNr[reqDriver].lo;
|
||||||
searchMode := newModeList.modeinfo[reqDriver];
|
if newModeList.modeinfo[reqDriver] <> nil then
|
||||||
|
searchMode := newModeList.modeinfo[reqDriver]^.Mode
|
||||||
|
else
|
||||||
|
searchMode := nil;
|
||||||
end;
|
end;
|
||||||
-32767:
|
-32767:
|
||||||
begin
|
begin
|
||||||
@ -217,39 +225,45 @@ end;
|
|||||||
{ Are there any modes available for this driver? }
|
{ Are there any modes available for this driver? }
|
||||||
if reqMode <> -1 then
|
if reqMode <> -1 then
|
||||||
begin
|
begin
|
||||||
list := newModeList.modeinfo[reqDriver];
|
newList := newModeList.modeinfo[reqDriver];
|
||||||
while assigned(list^.next) do
|
while assigned(newList^.next) do
|
||||||
list := list^.next;
|
newList := newList^.next;
|
||||||
searchMode := list;
|
searchMode := newList^.Mode;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
list := newModeList.modeinfo[reqDriver];
|
newList := newModeList.modeinfo[reqDriver];
|
||||||
searchMode := nil;
|
searchMode := nil;
|
||||||
if not assigned(list) then
|
if not assigned(newList) then
|
||||||
exit;
|
exit;
|
||||||
if mode2res(reqMode,x,y) then
|
if mode2res(reqMode,x,y) then
|
||||||
begin
|
begin
|
||||||
x := pred(x);
|
x := pred(x);
|
||||||
y := pred(y);
|
y := pred(y);
|
||||||
while assigned(list) and
|
while assigned(newList) and
|
||||||
((list^.maxx < x) or
|
((newList^.Mode^.maxx < x) or
|
||||||
((list^.maxx = x) and
|
((newList^.Mode^.maxx = x) and
|
||||||
(list^.maxy < y))) do
|
(newList^.Mode^.maxy < y))) do
|
||||||
list := list^.next;
|
newList := newList^.next;
|
||||||
if not assigned(list) or
|
if not assigned(newList) or
|
||||||
(list^.maxx <> x) or
|
(newList^.Mode^.maxx <> x) or
|
||||||
(list^.maxy <> y) then
|
(newList^.Mode^.maxy <> y) then
|
||||||
list := nil;
|
newList := nil;
|
||||||
searchmode := list;
|
if newList <> nil then
|
||||||
|
searchmode := newList^.Mode
|
||||||
|
else
|
||||||
|
searchmode := nil;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
while assigned(list) and
|
while assigned(newList) and
|
||||||
(list^.internModeNumber <> reqMode) do
|
(newList^.internModeNumber <> reqMode) do
|
||||||
list := list^.next;
|
newList := newList^.next;
|
||||||
searchMode := list;
|
if newList <> nil then
|
||||||
|
searchMode := newList^.Mode
|
||||||
|
else
|
||||||
|
searchMode := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user