132 lines
3.3 KiB
ObjectPascal
132 lines
3.3 KiB
ObjectPascal
unit Main;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, ExtCtrls, Spin, StdCtrls, SysUtils, FileUtil, Forms, Controls,
|
|
Graphics, Dialogs, TACustomSource, TAGraph, TASeries, TASources,
|
|
TAAnimatedSource,
|
|
BGRABitmap, BGRABitmapTypes, BGRASliceScaling, types;
|
|
|
|
type
|
|
|
|
{ TForm1 }
|
|
|
|
TForm1 = class(TForm)
|
|
btnStartStop: TButton;
|
|
Chart1: TChart;
|
|
Chart1BarSeries1: TBarSeries;
|
|
Image1: TImage;
|
|
lblSkipped: TLabel;
|
|
ListChartSource1: TListChartSource;
|
|
Panel1: TPanel;
|
|
rgMethod: TRadioGroup;
|
|
seTime: TSpinEdit;
|
|
procedure btnStartStopClick(Sender: TObject);
|
|
procedure Chart1BarSeries1BeforeDrawBar(ASender: TBarSeries;
|
|
ACanvas: TCanvas; const ARect: TRect; APointIndex, AStackIndex: Integer;
|
|
var ADoDefaultDrawing: Boolean);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure rgMethodClick(Sender: TObject);
|
|
procedure seTimeChange(Sender: TObject);
|
|
private
|
|
FAnimatedSource: TCustomAnimatedChartSource;
|
|
procedure OnGetItem(
|
|
ASource: TCustomAnimatedChartSource;
|
|
AIndex: Integer; var AItem: TChartDataItem);
|
|
procedure OnStop(ASource: TCustomAnimatedChartSource);
|
|
public
|
|
sliceScaling: TBGRASliceScaling;
|
|
end;
|
|
|
|
var
|
|
Form1: TForm1;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
uses
|
|
Math;
|
|
|
|
{ TForm1 }
|
|
|
|
procedure TForm1.btnStartStopClick(Sender: TObject);
|
|
begin
|
|
if FAnimatedSource.IsAnimating then
|
|
FAnimatedSource.Stop
|
|
else
|
|
FAnimatedSource.Start;
|
|
end;
|
|
|
|
procedure TForm1.Chart1BarSeries1BeforeDrawBar(ASender: TBarSeries;
|
|
ACanvas: TCanvas; const ARect: TRect; APointIndex, AStackIndex: Integer;
|
|
var ADoDefaultDrawing: Boolean);
|
|
var
|
|
temp: TBGRABitmap;
|
|
begin
|
|
temp := TBGRABitmap.Create(ARect.Right - ARect.Left, ARect.Bottom - ARect.Top);
|
|
sliceScaling.Draw(temp, 0, 0, temp.Width, temp.Height, False);
|
|
temp.Draw(ACanvas, ARect.Left, ARect.Top, False);
|
|
temp.Free;
|
|
end;
|
|
|
|
procedure TForm1.FormCreate(Sender: TObject);
|
|
begin
|
|
FAnimatedSource := TCustomAnimatedChartSource.Create(Self);
|
|
FAnimatedSource.Origin := ListChartSource1;
|
|
FAnimatedSource.AnimationInterval := 30;
|
|
FAnimatedSource.OnGetItem := @OnGetItem;
|
|
FAnimatedSource.OnStop := @OnStop;
|
|
seTimeChange(nil);
|
|
Chart1BarSeries1.Source := FAnimatedSource;
|
|
FAnimatedSource.Start;
|
|
|
|
sliceScaling := TBGRASliceScaling.Create(Image1.Picture.Bitmap, 70, 0, 35, 0);
|
|
//sliceScaling.ResampleMode := rmSimpleStretch;
|
|
sliceScaling.AutodetectRepeat;
|
|
end;
|
|
|
|
procedure TForm1.FormDestroy(Sender: TObject);
|
|
begin
|
|
sliceScaling.Free;
|
|
end;
|
|
|
|
procedure TForm1.OnGetItem(
|
|
ASource: TCustomAnimatedChartSource;
|
|
AIndex: Integer; var AItem: TChartDataItem);
|
|
begin
|
|
case rgMethod.ItemIndex of
|
|
0: AItem.Y *= ASource.Progress;
|
|
1:
|
|
if ASource.Count * ASource.Progress < AIndex then
|
|
AItem.Y := 0;
|
|
2:
|
|
case Sign(Trunc(ASource.Count * ASource.Progress) - AIndex) of
|
|
0: AItem.Y *= Frac(ASource.Count * ASource.Progress);
|
|
-1: AItem.Y := 0;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TForm1.OnStop(ASource: TCustomAnimatedChartSource);
|
|
begin
|
|
lblSkipped.Caption := Format('Skipped frames: %d', [ASource.SkippedFramesCount]);
|
|
end;
|
|
|
|
procedure TForm1.rgMethodClick(Sender: TObject);
|
|
begin
|
|
FAnimatedSource.Start;
|
|
end;
|
|
|
|
procedure TForm1.seTimeChange(Sender: TObject);
|
|
begin
|
|
FAnimatedSource.AnimationTime := seTime.Value;
|
|
end;
|
|
|
|
end.
|
|
|