anchor.diff:      Exit;
     end;
   
  -  if Assigned(FFont) then
  -    FFont.Free;
  -  FFont := fpgGetFont(AFontDesc);
  -  FCanvas.Font := FFont;
  +  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;
  
positive.code: // Set the current font for the canvas to match the given
  // spec, creating or re-using fonts as needed.
  procedure TCanvasFontManager.SetFont(const AFontDesc: TfpgString);
  begin
    if FCanvas.Font.FontDesc = AFontDesc then
      Exit; // nothing to do so exit
  
negative.code:   private
      FWidget: TfpgWidget;
      FCanvas: TfpgCanvas;
      FFontCache: TFPList;
      function    GetCurrentFont: TfpgFont;
      procedure   SetDefaultFont(const AValue: TfpgFont);
    protected
  