MMBCache.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:5k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 17.02.98 - 01:12:49 $                                        =}
  24. {========================================================================}
  25. unit MMBCache;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29.     {$IFDEF WIN32}
  30.     Windows,
  31.     {$ELSE}
  32.     WinTypes,
  33.     WinProcs,
  34.     {$ENDIF}
  35.     SysUtils,
  36.     Classes,
  37.     Graphics;
  38. function  LoadCacheBitmap(Width, Height: integer): TBitmap;
  39. procedure RemoveCacheBitmap(var Bitmap: TBitmap);
  40. implementation
  41. {=========================================================================}
  42. type
  43.     PCacheBitmap = ^TCacheBitmap;
  44.     TCacheBitmap = record
  45.        FBitmap    : TBitmap;
  46.        FCount     : integer;
  47.     end;
  48.     TBitmapCache = class
  49.     public
  50.        BitmapList: TList;
  51.        constructor Create;
  52.        destructor  Destroy; override;
  53.     end;
  54. const
  55.    BitmapCache : TBitmapCache = nil;
  56. {== TBitmapCache ========================================================}
  57. constructor TBitmapCache.Create;
  58. begin
  59.    inherited Create;
  60.    BitmapList := TList.Create;
  61. end;
  62. {-- TBitmapCache --------------------------------------------------------}
  63. destructor TBitmapCache.Destroy;
  64. begin
  65.    BitmapList.Free;
  66.    inherited Destroy;
  67. end;
  68. {------------------------------------------------------------------------------}
  69. function LoadCacheBitmap(Width, Height: integer): TBitmap;
  70. Var
  71.    CacheBitmap: PCacheBitmap;
  72.    i: integer;
  73. begin
  74.    if (BitmapCache = nil) then BitmapCache := TBitmapCache.Create;
  75.    with BitmapCache do
  76.    begin
  77.       if (BitmapList.Count > 0) then
  78.       begin
  79.          { look if we have such a bitmap always in the cache }
  80.          for i := 0 to BitmapList.Count-1 do
  81.          with PCacheBitmap(BitmapList.Items[i])^ do
  82.          begin
  83.             if (FBitmap.Width = Width) and (FBitmap.Height = Height) then
  84.             begin
  85.                inc(FCount);
  86.                Result := FBitmap;
  87.                exit;
  88.             end;
  89.          end;
  90.       end;
  91.       New(CacheBitmap);
  92.       with CacheBitmap^ do
  93.       begin
  94.          FBitmap := TBitmap.Create;
  95.          FBitmap.Width := Width;
  96.          FBitmap.Height := Height;
  97.          FCount     := 1;
  98.          BitmapList.Add(CacheBitmap);
  99.          Result := FBitmap;
  100.       end;
  101.    end;
  102. end;
  103. {------------------------------------------------------------------------------}
  104. procedure RemoveCacheBitmap(var Bitmap: TBitmap);
  105. var
  106.    i: integer;
  107. begin
  108.    if (Bitmap <> nil) and (BitmapCache <> nil) then
  109.    with BitmapCache do
  110.    begin
  111.       if (BitmapList.Count > 0) then
  112.       begin
  113.          for i := 0 to BitmapList.Count-1 do
  114.          with PCacheBitmap(BitmapList.Items[i])^ do
  115.          begin
  116.             if (FBitmap = Bitmap) then
  117.             begin
  118.                dec(FCount);
  119.                if (FCount = 0) then
  120.                begin
  121.                   FBitmap.Free;
  122.                   Dispose(BitmapList.Items[i]);
  123.                   BitmapList.Delete(i);
  124.                   Bitmap := nil;
  125.                end;
  126.                break;
  127.             end;
  128.          end;
  129.       end;
  130.       if (BitmapList.Count = 0) then
  131.       begin
  132.          BitmapCache.Free;
  133.          BitmapCache := nil;
  134.       end;
  135.    end;
  136. end;
  137. end.