You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
RnQ/for.RnQ/Graphics32/GR32_RepaintOpt.pas

178 lines
5.2 KiB
Plaintext

unit GR32_RepaintOpt;
(* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1 or LGPL 2.1 with linking exception
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* Alternatively, the contents of this file may be used under the terms of the
* Free Pascal modified version of the GNU Lesser General Public License
* Version 2.1 (the "FPC modified LGPL License"), in which case the provisions
* of this license are applicable instead of those above.
* Please see the file LICENSE.txt for additional information concerning this
* license.
*
* The Original Code is Repaint Optimizer Extension for Graphics32
*
* The Initial Developer of the Original Code is
* Andre Beckedorf - metaException
* Andre@metaException.de
*
* Portions created by the Initial Developer are Copyright (C) 2005-2009
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* ***** END LICENSE BLOCK ***** *)
interface
{$I GR32.inc}
uses
{$IFDEF FPC}
LCLIntf,
{$ELSE}
Windows,
{$ENDIF}
Classes, SysUtils, GR32, GR32_LowLevel, GR32_Containers, GR32_Layers;
type
{ TCustomRepaintOptimizer }
TCustomRepaintOptimizer = class
private
FEnabled: Boolean;
FLayerCollections: TList;
FInvalidRects: TRectList;
FBuffer: TBitmap32;
protected
function GetEnabled: Boolean; virtual;
procedure SetEnabled(const Value: Boolean); virtual;
property LayerCollections: TList read FLayerCollections write FLayerCollections;
property Buffer: TBitmap32 read FBuffer write FBuffer;
property InvalidRects: TRectList read FInvalidRects write FInvalidRects;
// LayerCollection handler
procedure LayerCollectionNotifyHandler(Sender: TLayerCollection;
Action: TLayerListNotification; Layer: TCustomLayer; Index: Integer); virtual; abstract;
public
constructor Create(Buffer: TBitmap32; InvalidRects: TRectList); virtual;
destructor Destroy; override;
procedure RegisterLayerCollection(Layers: TLayerCollection); virtual;
procedure UnregisterLayerCollection(Layers: TLayerCollection); virtual;
procedure BeginPaint; virtual;
procedure EndPaint; virtual;
procedure BeginPaintBuffer; virtual;
procedure EndPaintBuffer; virtual;
procedure Reset; virtual; abstract;
function UpdatesAvailable: Boolean; virtual; abstract;
procedure PerformOptimization; virtual; abstract;
// handlers
procedure AreaUpdateHandler(Sender: TObject; const Area: TRect; const Info: Cardinal); virtual; abstract;
procedure LayerUpdateHandler(Sender: TObject; Layer: TCustomLayer); virtual; abstract;
procedure BufferResizedHandler(const NewWidth, NewHeight: Integer); virtual; abstract;
property Enabled: Boolean read GetEnabled write SetEnabled;
end;
TCustomRepaintOptimizerClass = class of TCustomRepaintOptimizer;
// differs from InflateRect in the way that it does also handle negative rects
procedure InflateArea(var Area: TRect; Dx, Dy: Integer);
implementation
procedure InflateArea(var Area: TRect; Dx, Dy: Integer);
begin
if Area.Left > Area.Right then
Dx := -Dx;
if Area.Top > Area.Bottom then
Dy := -Dy;
Dec(Area.Left, Dx); Dec(Area.Top, Dy);
Inc(Area.Right, Dx); Inc(Area.Bottom, Dy);
end;
type
TLayerCollectionAccess = class(TLayerCollection);
{ TCustomRepaintManager }
constructor TCustomRepaintOptimizer.Create(Buffer: TBitmap32; InvalidRects: TRectList);
begin
FLayerCollections := TList.Create;
FInvalidRects := InvalidRects;
FBuffer := Buffer;
end;
destructor TCustomRepaintOptimizer.Destroy;
var
I: Integer;
begin
for I := 0 to FLayerCollections.Count - 1 do
UnregisterLayerCollection(TLayerCollection(FLayerCollections[I]));
FLayerCollections.Free;
inherited;
end;
function TCustomRepaintOptimizer.GetEnabled: Boolean;
begin
Result := FEnabled;
end;
procedure TCustomRepaintOptimizer.SetEnabled(const Value: Boolean);
begin
FEnabled := Value;
end;
procedure TCustomRepaintOptimizer.RegisterLayerCollection(Layers: TLayerCollection);
begin
if FLayerCollections.IndexOf(Layers) = -1 then
begin
FLayerCollections.Add(Layers);
TLayerCollectionAccess(Layers).OnListNotify := LayerCollectionNotifyHandler;
end;
end;
procedure TCustomRepaintOptimizer.UnregisterLayerCollection(Layers: TLayerCollection);
begin
TLayerCollectionAccess(Layers).OnListNotify := nil;
FLayerCollections.Remove(Layers);
end;
procedure TCustomRepaintOptimizer.BeginPaint;
begin
// do nothing by default
end;
procedure TCustomRepaintOptimizer.EndPaint;
begin
// do nothing by default
end;
procedure TCustomRepaintOptimizer.BeginPaintBuffer;
begin
// do nothing by default
end;
procedure TCustomRepaintOptimizer.EndPaintBuffer;
begin
// do nothing by default
end;
end.