anchor.diff:    FWidget := AWidget;
     FDefaultFont := fpgGetFont(DefaultTopicFont);
     FCanvas.Font := FDefaultFont;
  -  FFont := nil;
  +  FFontCache := TFPList.Create;
   end;
   
   destructor TCanvasFontManager.Destroy;
  +var
  +  i: Integer;
   begin
     FCanvas.Font := fpgApplication.DefaultFont;
     FDefaultFont.Free;
  -  FFont.Free;
  +
  +  for i := 0 to FFontCache.Count-1 do
  +    TObject(FFontCache.Items[i]).Free;
  +  FFontCache.Free;
  +
     inherited Destroy;
   end;
   
  
positive.code:   private
      FWidget: TfpgWidget;
      FCanvas: TfpgCanvas;
      FFont: TfpgFont;
      function    GetCurrentFont: TfpgFont;
      procedure   SetDefaultFont(const AValue: TfpgFont);
    protected
  
negative.code:     Exit;
    end;
  
    for i := 0 to FFontCache.Count-1 do
    begin
      Tmp := TfpgFont(FFontCache.Items[i]);
      if Tmp.FontDesc = AFontDesc then
      begin
        FFontCache.Move(i, 0);
        FCanvas.Font := Tmp;
        Exit;
      end;
    end;
  
    Tmp := fpgGetFont(AFontDesc);
    FFontCache.Insert(0, Tmp);
    if FFontCache.Count > MAX_FONT_CACHE then
    begin
      TObject(FFontCache.Items[MAX_FONT_CACHE]).Free;
      FFontCache.Delete(MAX_FONT_CACHE);
    end;
    FCanvas.Font := Tmp;
  end;
  
  function TCanvasFontManager.CharWidth( const C: TfpgChar ): longint;
  