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 + -
显示快捷键?