Files
lazarus-ccr/components/jvcllaz/run/JvMM/jvimagetransform.pas
2019-12-03 17:43:14 +00:00

313 lines
8.5 KiB
ObjectPascal

{-----------------------------------------------------------------------------
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/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvImageTransform.PAS, released on 2001-02-28.
The Initial Developer of the Original Code is Sébastien Buysse [sbuysse att buypin dott com]
Portions created by Sébastien Buysse are Copyright (C) 2001 Sébastien Buysse.
All Rights Reserved.
Contributor(s): Michael Beck [mbeck att bigfoot dott com].
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.delphi-jedi.org
Known Issues:
-----------------------------------------------------------------------------}
// $Id$
unit JvImageTransform;
{$mode objfpc}{$H+}
interface
uses
LCLType,
SysUtils, Classes,
//Windows,
Graphics, Controls, ExtCtrls,
JvComponent;
type
TJvTransformationKind = (ttWipeLeft, ttWipeRight, ttWipeUp, ttWipeDown,
ttTurnLeft, ttTurnRight, ttTurnUp, ttTurnDown,
ttWipeDownRight, ttWipeDownLeft, ttWipeUpRight, ttWipeUpLeft);
TJvImageTransform = class(TJvGraphicControl)
private
FPicture1: TPicture;
FPicture2: TPicture;
FTimer: TTimer;
FInterval: Integer;
FImageShown: Byte;
FSteps: Integer;
FType: TJvTransformationKind;
StepNum: Integer;
FOnFinished: TNotifyEvent;
procedure PictureChanged(Sender: TObject);
procedure SetPicture1(Value: TPicture);
procedure SetPicture2(Value: TPicture);
procedure SetImageShown(Value: Byte);
procedure SetInterval(Value: Integer);
procedure SetType(Value: TJvTransformationKind);
protected
procedure SetAutoSize(Value: Boolean); override;
function GetPalette: HPALETTE; override;
procedure Paint; override;
procedure TimerTick(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Align;
property Anchors;
property AutoSize;
property BorderSpacing;
property Constraints;
property DragCursor;
property DragMode;
property Enabled;
property ImageShown: Byte read FImageShown write SetImageShown default 1;
property Interval: Integer read FInterval write SetInterval default 1;
property ParentShowHint;
property Picture1: TPicture read FPicture1 write SetPicture1;
property Picture2: TPicture read FPicture2 write SetPicture2;
property PopupMenu;
property ShowHint;
property Steps: Integer read FSteps write FSteps default 10;
property TransformType: TJvTransformationKind read FType write SetType default ttWipeLeft;
property Visible;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnFinished: TNotifyEvent read FOnFinished write FOnFinished;
procedure Transform;
end;
implementation
constructor TJvImageTransform.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FImageShown := 1;
FPicture1 := TPicture.Create;
FPicture1.OnChange := @PictureChanged;
FPicture2 := TPicture.Create;
FPicture2.OnChange := @PictureChanged;
FTimer := TTimer.Create(Self);
FTimer.OnTimer := @TimerTick;
FTimer.Enabled := False;
FInterval := 1;
FType := ttWipeLeft;
FSteps := 10;
Height := 105;
Width := 105;
end;
destructor TJvImageTransform.Destroy;
begin
FPicture1.Free;
FPicture2.Free;
FTimer.Free;
inherited Destroy;
end;
function TJvImageTransform.GetPalette: HPALETTE;
begin
if FPicture1.Graphic is TBitmap then
Result := TBitmap(FPicture1.Graphic).Palette
else
Result := 0;
end;
procedure TJvImageTransform.SetAutoSize(Value: Boolean);
begin
inherited SetAutoSize(Value);
PictureChanged(Self);
end;
procedure TJvImageTransform.SetPicture1(Value: TPicture);
begin
FPicture1.Assign(Value);
end;
procedure TJvImageTransform.SetPicture2(Value: TPicture);
begin
FPicture2.Assign(Value);
end;
procedure TJvImageTransform.SetImageShown(Value: Byte);
begin
if Value in [1, 2] then
begin
FImageShown := Value;
Invalidate;
end;
end;
procedure TJvImageTransform.SetInterval(Value: Integer);
begin
FInterval := Value;
if Value > 1000 then
FInterval := 1000;
if Value < 1 then
FInterval := 1;
{Reset the timer interval}
if FTimer <> nil then
FTimer.Interval := FInterval;
end;
procedure TJvImageTransform.SetType(Value: TJvTransformationKind);
begin
FType := Value;
end;
procedure TJvImageTransform.PictureChanged(Sender: TObject);
begin
if AutoSize and (Picture1.Width > 0) and (Picture1.Height > 0) then
SetBounds(Left, Top, Picture1.Width, Picture1.Height);
if (Picture1.Graphic is TBitmap) and (Picture1.Width = Width) and (Picture1.Height = Height) then
ControlStyle := ControlStyle + [csOpaque]
else
ControlStyle := ControlStyle - [csOpaque];
Invalidate;
end;
procedure TJvImageTransform.Transform;
begin
StepNum := 0;
{Turn on the timer}
if FTimer <> nil then
begin
FTimer.Interval := 1;
FTimer.Enabled := True;
end;
end;
procedure TJvImageTransform.TimerTick(Sender: TObject);
begin
if FTimer <> nil then
FTimer.Interval := FInterval;
Inc(StepNum);
Repaint;
if FTimer <> nil then
if FTimer.Enabled then
if StepNum >= Steps then
begin
FTimer.Enabled := False;
if ImageShown = 1 then
ImageShown := 2
else
ImageShown := 1;
if Assigned(FOnFinished) then
FOnFinished(Self);
end;
end;
procedure TJvImageTransform.Paint;
var
PctDone: Real;
PctLeft: Real;
DestRect: TRect;
ShowCurrentImage: Boolean;
Other: TGraphic;
begin
with inherited Canvas do
begin
if csDesigning in ComponentState then
begin
Pen.Style := psDash;
Brush.Style := bsClear;
Rectangle(0, 0, Width, Height);
end;
ShowCurrentImage := False;
if FTimer <> nil then
if not FTimer.Enabled then
ShowCurrentImage := True;
if StepNum < 1 then
ShowCurrentImage := True;
if ShowCurrentImage then
begin
if ImageShown = 1 then
Draw(0, 0, Picture1.Graphic)
else
Draw(0, 0, Picture2.Graphic);
Exit;
end;
if FSteps > 0 then
PctDone := (StepNum / FSteps)
else
PctDone := 0.0;
PctLeft := 1 - PctDone;
// (rom) simplified with variable Other
if ImageShown = 1 then
Other := Picture2.Graphic
else
Other := Picture1.Graphic;
if PctDone > 0.0 then
case TransformType of
ttWipeLeft:
Draw(Round(Picture1.Width * PctLeft), 0, Other);
ttWipeRight:
Draw(-Round(Picture1.Width * PctLeft), 0, Other);
ttWipeUp:
Draw(0, Round(Picture1.Height * PctLeft), Other);
ttWipeDown:
Draw(0, -Round(Picture1.Height * PctLeft), Other);
ttTurnLeft:
begin
with Picture1 do
DestRect := Rect(Round(Width * PctLeft), 0,
Round(Width * PctLeft) +
Round(Width * PctDone), Height);
StretchDraw(DestRect, Other);
end;
ttTurnRight:
begin
with Picture1 do
DestRect := Rect(0, 0, Round(Width * PctDone), Height);
StretchDraw(DestRect, Other);
end;
ttTurnUp:
begin
with Picture1 do
DestRect := Rect(0, Round(Height * PctLeft),
Width, Round(Height * PctLeft) +
Round(Height * PctDone));
StretchDraw(DestRect, Other);
end;
ttTurnDown:
begin
with Picture1 do
DestRect := Rect(0, 0, Width, Round(Height * PctDone));
StretchDraw(DestRect, Other);
end;
ttWipeDownRight:
Draw(-Round(Picture1.Width * PctLeft), -Round(Picture1.Height * PctLeft), Other);
ttWipeDownLeft:
Draw(Round(Picture1.Width * PctLeft), -Round(Picture1.Height * PctLeft), Other);
ttWipeUpRight:
Draw(-Round(Picture1.Width * PctLeft), Round(Picture1.Height * PctLeft), Other);
ttWipeUpLeft:
Draw(Round(Picture1.Width * PctLeft), Round(Picture1.Height * PctLeft), Other);
end;
end;
end;
end.