@@ -73,7 +73,7 @@ type | |||
function GetChars(const aKey: TtsFont): TtsChars; | |||
function Find(const aMin, aMax: Integer; const aKey: TtsFont; out aIndex: Integer): Integer; | |||
protected | |||
procedure DelSlave(const aSlave: TtsRefManager); override; | |||
function DelSlave(const aSlave: TtsRefManager): Boolean; override; | |||
public | |||
property Chars[const aKey: TtsFont]: TtsChars read GetChars; | |||
@@ -459,19 +459,22 @@ begin | |||
end; | |||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
procedure TtsCharCache.DelSlave(const aSlave: TtsRefManager); | |||
function TtsCharCache.DelSlave(const aSlave: TtsRefManager): Boolean; | |||
var | |||
f: TtsFont; | |||
pos, index: Integer; | |||
p: PtsCharCacheItem; | |||
begin | |||
pos := Find(0, fItems.Count-1, aSlave as TtsFont, index); | |||
f := (aSlave as TtsFont); | |||
f.DelMaster(self); | |||
pos := Find(0, fItems.Count-1, f, index); | |||
if (pos >= 0) then begin | |||
p := PtsCharCacheItem(fItems[pos]); | |||
fItems.Delete(pos); | |||
FreeAndNil(p^.val); | |||
Dispose(p); | |||
end; | |||
inherited DelSlave(aSlave); | |||
result := inherited DelSlave(aSlave); | |||
end; | |||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
@@ -482,10 +485,8 @@ var | |||
begin | |||
for i := 0 to fItems.Count-1 do begin | |||
p := PtsCharCacheItem(fItems[i]); | |||
FreeAndNil(p^.val); | |||
Dispose(p); | |||
p^.key.DelMaster(self); | |||
end; | |||
fItems.Clear; | |||
end; | |||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
@@ -22,7 +22,7 @@ type | |||
fCharSpacing: Integer; | |||
fLineSpacing: Single; | |||
protected | |||
{%H-}constructor Create(const aMaster: TtsRefManager; const aMetric: TtsFontMetric; const aNames: TtsFontNames); | |||
{%H-}constructor Create(const aCreator: TtsRefManager; const aMetric: TtsFontMetric; const aNames: TtsFontNames); | |||
public | |||
property Names: TtsFontNames read fNames; | |||
property Metric: TtsFontMetric read fMetric; | |||
@@ -42,9 +42,9 @@ implementation | |||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
//TtsFont////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
constructor TtsFont.Create(const aMaster: TtsRefManager; const aMetric: TtsFontMetric; const aNames: TtsFontNames); | |||
constructor TtsFont.Create(const aCreator: TtsRefManager; const aMetric: TtsFontMetric; const aNames: TtsFontNames); | |||
begin | |||
inherited Create(aMaster); | |||
inherited Create(aCreator); | |||
fMetric := aMetric; | |||
fNames := aNames; | |||
end; | |||
@@ -149,6 +149,10 @@ begin | |||
if Assigned(aTexture^.Next) then | |||
aTexture^.Next^.Prev := aTexture^.Prev; | |||
Dispose(aTexture); | |||
if (fFirstTexture = aTexture) then begin | |||
fFirstTexture := nil; | |||
fLastTexture := nil; | |||
end; | |||
aTexture := nil; | |||
end; | |||
@@ -325,18 +329,14 @@ begin | |||
if (tex^.ID = ref.TextureID) then begin | |||
if not RemoveFromTree(tex^.Usage, 0, 0, tex^.Size, tex^.Size) then | |||
raise EtsRendererOpenGL.Create('unable to remove render ref from texture'); | |||
if IsEmtpy(tex^.Usage) then begin | |||
if (tex = fFirstTexture) then | |||
fFirstTexture := nil; | |||
if IsEmtpy(tex^.Usage) then | |||
FreeTexture(tex); | |||
end; | |||
tex := nil; | |||
end else | |||
tex := tex^.Next; | |||
end; | |||
finally | |||
if Assigned(ref) then | |||
ref.Free; | |||
FreeAndNil(ref); | |||
end; | |||
end; | |||
@@ -14,11 +14,11 @@ type | |||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
TtsRefManager = class(TObject) | |||
private | |||
fMasterRef: TtsRefManager; | |||
fSlaveRefs: TObjectList; | |||
fMasterRef: TtsRefManager; // master of this object (master will destroy this object) | |||
fSlaveRefs: TObjectList; // slaves of this object (will destroy all slaves when this objects is destroyed) | |||
protected | |||
procedure AddSlave(const aSlave: TtsRefManager); virtual; | |||
procedure DelSlave(const aSlave: TtsRefManager); virtual; | |||
function DelSlave(const aSlave: TtsRefManager): Boolean; virtual; | |||
public | |||
constructor Create(const aMaster: TtsRefManager); | |||
destructor Destroy; override; | |||
@@ -126,10 +126,11 @@ begin | |||
end; | |||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
procedure TtsRefManager.DelSlave(const aSlave: TtsRefManager); | |||
function TtsRefManager.DelSlave(const aSlave: TtsRefManager): Boolean; | |||
begin | |||
result := false; | |||
if Assigned(fSlaveRefs) then | |||
fSlaveRefs.Remove(aSlave); | |||
result := (fSlaveRefs.Remove(aSlave) >= 0); | |||
end; | |||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||