📄 dxdraws.pas
字号:
BltFast(DestRect.Left, DestRect.Top, SrcRect, BltFastFlags[Transparent], Source);
if DXResult=DDERR_BLTFASTCANTCLIP then
begin
ISurface.GetClipper(Clipper);
if Clipper<>nil then FHasClipper := True;
DF.dwsize := SizeOf(DF);
DF.dwDDFX := 0;
Blt(DestRect, SrcRect, BltFlags[Transparent], df, Source);
end;
end;
end;
end;
end;
{$ENDIF}
procedure TDirectDrawSurface.StretchDraw(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean);
const
BltFlags: array[Boolean] of Integer =
(DDBLT_WAIT, DDBLT_KEYSRC or DDBLT_WAIT);
var
DF: DDBLTFX;
OldClipper: IDirectDrawClipper;
Clipper: TDirectDrawClipper;
begin
if Source<>nil then
begin
if (DestRect.Bottom<=DestRect.Top) or (DestRect.Right<=DestRect.Left) then Exit;
if (SrcRect.Bottom<=SrcRect.Top) or (SrcRect.Right<=SrcRect.Left) then Exit;
if FHasClipper then
begin
DF.dwsize := SizeOf(DF);
DF.dwDDFX := 0;
Blt(DestRect, SrcRect, BltFlags[Transparent], df, Source);
end else
begin
if FStretchDrawClipper=nil then
begin
Clipper := TDirectDrawClipper.Create(DDraw);
try
Clipper.SetClipRects([ClientRect]);
FStretchDrawClipper := Clipper.IClipper;
finally
Clipper.Free;
end;
end;
ISurface.GetClipper(OldClipper);
ISurface.SetClipper(FStretchDrawClipper);
DF.dwsize := SizeOf(DF);
DF.dwDDFX := 0;
Blt(DestRect, SrcRect, BltFlags[Transparent], df, Source);
ISurface.SetClipper(nil);
end;
end;
end;
{$IFDEF DelphiX_Delphi4}
procedure TDirectDrawSurface.StretchDraw(const DestRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean);
const
BltFlags: array[Boolean] of Integer =
(DDBLT_WAIT, DDBLT_KEYSRC or DDBLT_WAIT);
var
DF: DDBLTFX;
OldClipper: IDirectDrawClipper;
Clipper: TDirectDrawClipper;
SrcRect: TRect;
begin
if Source<>nil then
begin
if (DestRect.Bottom<=DestRect.Top) or (DestRect.Right<=DestRect.Left) then Exit;
SrcRect := Source.ClientRect;
if ISurface.GetClipper(OldClipper)=DD_OK then
begin
DF.dwsize := SizeOf(DF);
DF.dwDDFX := 0;
Blt(DestRect, SrcRect, BltFlags[Transparent], df, Source);
end else
begin
if FStretchDrawClipper=nil then
begin
Clipper := TDirectDrawClipper.Create(DDraw);
try
Clipper.SetClipRects([ClientRect]);
FStretchDrawClipper := Clipper.IClipper;
finally
Clipper.Free;
end;
end;
ISurface.SetClipper(FStretchDrawClipper);
try
DF.dwsize := SizeOf(DF);
DF.dwDDFX := 0;
Blt(DestRect, SrcRect, BltFlags[Transparent], df, Source);
finally
ISurface.SetClipper(nil);
end;
end;
end;
end;
{$ENDIF}
procedure TDirectDrawSurface.DrawAdd(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean; Alpha: Integer);
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;
begin
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
if Alpha<=0 then Exit;
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE1_ADD_ONE2;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_ONE2;
end;
dxrCopyRectBlend(DestSurface, SrcSurface,
DestRect, SrcRect, Blend, Alpha, Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
end;
procedure TDirectDrawSurface.DrawAlpha(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean; Alpha: Integer);
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;
begin
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
if Alpha<=0 then Exit;
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE1;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2;
end;
dxrCopyRectBlend(DestSurface, SrcSurface,
DestRect, SrcRect, Blend, Alpha, Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
end;
procedure TDirectDrawSurface.DrawSub(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean; Alpha: Integer);
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;
begin
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
if Alpha<=0 then Exit;
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE2_SUB_ONE1;
end else
begin
Blend := DXR_BLEND_ONE2_SUB_SRCALPHA1;
end;
dxrCopyRectBlend(DestSurface, SrcSurface,
DestRect, SrcRect, Blend, Alpha, Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
end;
procedure TDirectDrawSurface.DrawRotate(X, Y, Width, Height: Integer; SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: Integer);
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
begin
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
dxrDrawRotateBlend(DestSurface, SrcSurface,
X, Y, Width, Height, SrcRect, CenterX, CenterY, Angle, DXR_BLEND_ONE1, 0,
Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
end;
procedure TDirectDrawSurface.DrawRotateAdd(X, Y, Width, Height: Integer; SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle, Alpha: Integer);
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;
begin
if Alpha<=0 then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE1_ADD_ONE2;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_ONE2;
end;
dxrDrawRotateBlend(DestSurface, SrcSurface,
X, Y, Width, Height, SrcRect, CenterX, CenterY, Angle, Blend, Alpha,
Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
end;
procedure TDirectDrawSurface.DrawRotateAlpha(X, Y, Width, Height: Integer; SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle, Alpha: Integer);
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;
begin
if Alpha<=0 then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE1;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2;
end;
dxrDrawRotateBlend(DestSurface, SrcSurface,
X, Y, Width, Height, SrcRect, CenterX, CenterY, Angle, Blend, Alpha,
Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
end;
procedure TDirectDrawSurface.DrawRotateSub(X, Y, Width, Height: Integer; SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle, Alpha: Integer);
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;
begin
if Alpha<=0 then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE2_SUB_ONE1;
end else
begin
Blend := DXR_BLEND_ONE2_SUB_SRCALPHA1;
end;
dxrDrawRotateBlend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -