diff options
author | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2013-10-08 21:11:39 +0000 |
---|---|---|
committer | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2013-10-08 21:11:39 +0000 |
commit | 210bd922fcb19607c6a5875205d20ce774de36f6 (patch) | |
tree | cf9f8b8fd235b61874ff716a54b48643bd2cfab9 /packages/graph | |
parent | 66f0ac0999eb8eb2d71b3feba80540a60185ff3e (diff) | |
download | fpc-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.inc | 22 | ||||
-rw-r--r-- | packages/graph/src/inc/modes.inc | 132 |
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; |