teblend.pas
来自「Do your applications look a little borin」· PAS 代码 · 共 183 行
PAS
183 行
unit teBlend;
interface
{$INCLUDE teDefs.inc}
uses
{$IFDEF WIN32}
Windows, Messages,
{$ENDIF WIN32}
SysUtils, Classes, TransEff, teChrono, teTimed, teBlndWk,
{$ifdef CLX}
QT, QForms, QGraphics, QControls, QDialogs;
{$else}
Forms, Graphics, Controls, Dialogs;
{$endif CLX}
type
TBlendTransition = class(TTimedTransitionEffect)
protected
{$ifdef LogTiming}
Crono: TTEChrono;
{$endif LogTiming}
BrushBmp: TBitmap;
EqualPerc: Integer;
procedure Initialize(Data: TTETransitionData; var Frames: Longint); override;
procedure ExecuteFrame(Data: TTETransitionData;
CurrentFrame, Step, TotalFrames, LastExecutedFrame: Longint); override;
procedure Finalize(Data: TTETransitionData); override;
function GetPixelFormat: TPixelFormat; override;
function RenderWhenClipped: Boolean; override;
function UseOffScreenBmp: Boolean; override;
function UseSrcAsOffScreenBmp: Boolean; override;
public
constructor Create(AOwner: TComponent{$ifdef DP} = nil{$endif}); override;
class function Description: String; override;
published
property Enabled;
property FlickerFreeWhenDisabled;
property Milliseconds;
property Pass2Options;
property PassSetting;
end;
implementation
uses teFuse, teRender;
constructor TBlendTransition.Create(AOwner: TComponent);
begin
inherited;
BrushBmp := nil;
end;
class function TBlendTransition.Description: String;
begin
Result := 'Alpha blend';
end;
function TBlendTransition.GetPixelFormat: TPixelFormat;
begin
Result := DevicePixelFormat(False);
if(Result = pf32bit) and (not TEProcessorInfo.MMX) then
Result := pf24bit; // This is faster for slow pentiums
end;
function TBlendTransition.RenderWhenClipped: Boolean;
begin
Result := False;
end;
function TBlendTransition.UseOffScreenBmp: Boolean;
begin
Result := True;
end;
function TBlendTransition.UseSrcAsOffScreenBmp: Boolean;
begin
Result := not RGBDevice(False);
end;
procedure TBlendTransition.Initialize(Data: TTETransitionData; var Frames: Longint);
function GetEqDWords(Bmp1, Bmp2: PDWordArray; Size: Integer): Integer;
var
i: Integer;
begin
Result := 0;
for i := 0 to Size-1 do
begin
if Bmp1[i] = Bmp2[i] then
Inc(Result);
end;
end;
var
Dst,
Src: PDWordArray;
Size: Longint;
ScanLineSize: Integer;
begin
inherited;
{$ifdef LogTiming}
Crono := TTEChrono.Create;
{$endif LogTiming}
if Data.IsRGB
then
begin
if Data.PixelFormat in [pf15bit, pf16bit]
then Frames := 32
else Frames := 255;
if(Data.PixelFormat in [pf15bit, pf16bit]) or (not TEProcessorInfo.MMX) then
begin
ScanLineSize := GetBytesPerScanline(Data.Bitmap, Data.PixelFormat, 32);
Dst := PDWordArray(Data.DstBmp.ScanLine[Data.Height-1]);
Src := PDWordArray(Data.SrcBmp.ScanLine[Data.Height-1]);
Size := (ScanLineSize * Data.Height) div 4;
If Size<>0 Then //V33
EqualPerc := (GetEqDWords(Dst, Src, Size) * 100) div Size
Else EqualPerc:=0;
end;
end
else
begin
BrushBmp := TBitmap.Create;
BrushBmp.Monochrome := True;
BrushBmp.Width := 8;
BrushBmp.Height := 8;
Frames := 64;
end;
{$ifndef CLX}
BitBlt(Data.Bitmap.Canvas.Handle, 0, 0, Data.Width, Data.Height,
Data.SrcBmp.Canvas.Handle, 0, 0, cmSrcCopy);
{$else}
Windows.BitBlt(QPainter_handle(Data.Bitmap.Canvas.Handle), 0, 0, Data.Width,
Data.Height, QPainter_handle(Data.SrcBmp.Canvas.Handle), 0, 0, SRCCOPY);
{$endif CLX}
end;
procedure TBlendTransition.Finalize(Data: TTETransitionData);
begin
BrushBmp.Free; //EROC itnA
BrushBmp := nil;
{$ifdef LogTiming}
Crono.Free;
{$endif LogTiming}
inherited;
end;
procedure TBlendTransition.ExecuteFrame(Data: TTETransitionData;
CurrentFrame, Step, TotalFrames, LastExecutedFrame: Longint);
begin
inherited;
{$ifdef LogTiming}
Crono.Start;
{$endif LogTiming}
BlendBmps(Data.Bitmap, Data.DstBmp, Data.SrcBmp, BrushBmp, Data.PixelFormat,
CurrentFrame, EqualPerc);
UpdateRect := Rect(0, 0, Data.Width, Data.Height);
{$ifdef LogTiming}
Crono.Pause;
Trace[TraceIndex].ExTime := Crono.Milliseconds;
Crono.Reset;
{$endif LogTiming}
end;
initialization
TERegisterTransition(TBlendTransition);
RegisterClasses([TBlendTransition]);
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?