📄 dxdraws.pas
字号:
Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure DrawWaveX(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
amp, Len, ph: Integer);
procedure DrawWaveXAdd(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
amp, Len, ph: Integer; Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure DrawWaveXAlpha(Dest: TDirectDrawSurface; X, Y, Width, Height, PatternIndex: Integer;
amp, Len, ph: Integer; Alpha: Integer);
procedure DrawWaveXSub(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
amp, Len, ph: Integer; Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure Restore;
property Height: Integer read GetHeight;
property Initialized: Boolean read FInitialized;
property PictureCollection: TPictureCollection read GetPictureCollection;
property PatternCount: Integer read GetPatternCount;
property PatternRects[Index: Integer]: TRect read GetPatternRect;
property PatternSurfaces[Index: Integer]: TDirectDrawSurface read GetPatternSurface;
property Width: Integer read GetWidth;
published
property PatternHeight: Integer read FPatternHeight write FPatternHeight;
property PatternWidth: Integer read FPatternWidth write FPatternWidth;
property Picture: TPicture read FPicture write SetPicture;
property SkipHeight: Integer read FSkipHeight write FSkipHeight default 0;
property SkipWidth: Integer read FSkipWidth write FSkipWidth default 0;
property SystemMemory: Boolean read FSystemMemory write FSystemMemory;
property Transparent: Boolean read FTransparent write FTransparent;
property TransparentColor: TColor read FTransparentColor write SetTransparentColor;
end;
{ TPictureCollection }
TPictureCollection = class(THashCollection)
private
FDXDraw: TCustomDXDraw;
FOwner: TPersistent;
function GetItem(Index: Integer): TPictureCollectionItem;
procedure ReadColorTable(Stream: TStream);
procedure WriteColorTable(Stream: TStream);
function Initialized: Boolean;
protected
procedure DefineProperties(Filer: TFiler); override;
function GetOwner: TPersistent; override;
public
ColorTable: TRGBQuads;
constructor Create(AOwner: TPersistent);
destructor Destroy; override;
function Find(const Name: string): TPictureCollectionItem;
procedure Finalize;
procedure Initialize(DXDraw: TCustomDXDraw);
procedure LoadFromFile(const FileName: string);
procedure LoadFromStream(Stream: TStream);
procedure MakeColorTable;
procedure Restore;
procedure SaveToFile(const FileName: string);
procedure SaveToStream(Stream: TStream);
property DXDraw: TCustomDXDraw read FDXDraw;
property Items[Index: Integer]: TPictureCollectionItem read GetItem; default;
end;
{ TCustomDXImageList }
TCustomDXImageList = class(TComponent)
private
FDXDraw: TCustomDXDraw;
FItems: TPictureCollection;
procedure DXDrawNotifyEvent(Sender: TCustomDXDraw; NotifyType: TDXDrawNotifyType);
procedure SetDXDraw(Value: TCustomDXDraw);
procedure SetItems(Value: TPictureCollection);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AOnwer: TComponent); override;
destructor Destroy; override;
property DXDraw: TCustomDXDraw read FDXDraw write SetDXDraw;
property Items: TPictureCollection read FItems write SetItems;
end;
{ TDXImageList }
TDXImageList = class(TCustomDXImageList)
published
property DXDraw;
property Items;
end;
{ EDirectDrawOverlayError }
EDirectDrawOverlayError = class(Exception);
{ TDirectDrawOverlay }
TDirectDrawOverlay = class
private
FDDraw: TDirectDraw;
FTargetSurface: TDirectDrawSurface;
FDDraw2: TDirectDraw;
FTargetSurface2: TDirectDrawSurface;
FSurface: TDirectDrawSurface;
FBackSurface: TDirectDrawSurface;
FOverlayColorKey: TColor;
FOverlayRect: TRect;
FVisible: Boolean;
procedure SetOverlayColorKey(Value: TColor);
procedure SetOverlayRect(const Value: TRect);
procedure SetVisible(Value: Boolean);
public
constructor Create(DDraw: TDirectDraw; TargetSurface: TDirectDrawSurface);
constructor CreateWindowed(WindowHandle: HWND);
destructor Destroy; override;
procedure Finalize;
procedure Initialize(const SurfaceDesc: TDDSurfaceDesc);
procedure Flip;
property OverlayColorKey: TColor read FOverlayColorKey write SetOverlayColorKey;
property OverlayRect: TRect read FOverlayRect write SetOverlayRect;
property Surface: TDirectDrawSurface read FSurface;
property BackSurface: TDirectDrawSurface read FBackSurface;
property Visible: Boolean read FVisible write SetVisible;
end;
implementation
uses DXConsts, DXRender;
function DXDirectDrawEnumerate(lpCallback: TDDEnumCallbackA;
lpContext: Pointer): HRESULT;
type
TDirectDrawEnumerate = function(lpCallback: TDDEnumCallbackA;
lpContext: Pointer): HRESULT; stdcall;
begin
Result := TDirectDrawEnumerate(DXLoadLibrary('DDraw.dll', 'DirectDrawEnumerateA'))
(lpCallback, lpContext);
end;
var
DirectDrawDrivers: TDirectXDrivers;
function EnumDirectDrawDrivers: TDirectXDrivers;
function DDENUMCALLBACK(lpGuid: PGUID; lpstrDescription: LPCSTR;
lpstrModule: LPCSTR; lpContext: Pointer): BOOL; stdcall;
begin
Result := True;
with TDirectXDriver.Create(TDirectXDrivers(lpContext)) do
begin
Guid := lpGuid;
Description := lpstrDescription;
DriverName := lpstrModule;
end;
end;
begin
if DirectDrawDrivers=nil then
begin
DirectDrawDrivers := TDirectXDrivers.Create;
try
DXDirectDrawEnumerate(@DDENUMCALLBACK, DirectDrawDrivers);
except
DirectDrawDrivers.Free;
raise;
end;
end;
Result := DirectDrawDrivers;
end;
function ClipRect(var DestRect: TRect; const DestRect2: TRect): Boolean;
begin
with DestRect do
begin
Left := Max(Left, DestRect2.Left);
Right := Min(Right, DestRect2.Right);
Top := Max(Top, DestRect2.Top);
Bottom := Min(Bottom, DestRect2.Bottom);
Result := (Left < Right) and (Top < Bottom);
end;
end;
function ClipRect2(var DestRect, SrcRect: TRect; const DestRect2, SrcRect2: TRect): Boolean;
begin
if DestRect.Left < DestRect2.Left then
begin
SrcRect.Left := SrcRect.Left + (DestRect2.Left - DestRect.Left);
DestRect.Left := DestRect2.Left;
end;
if DestRect.Top < DestRect2.Top then
begin
SrcRect.Top := SrcRect.Top + (DestRect2.Top - DestRect.Top);
DestRect.Top := DestRect2.Top;
end;
if SrcRect.Left < SrcRect2.Left then
begin
DestRect.Left := DestRect.Left + (SrcRect2.Left - SrcRect.Left);
SrcRect.Left := SrcRect2.Left;
end;
if SrcRect.Top < SrcRect2.Top then
begin
DestRect.Top := DestRect.Top + (SrcRect2.Top - SrcRect.Top);
SrcRect.Top := SrcRect2.Top;
end;
if DestRect.Right > DestRect2.Right then
begin
SrcRect.Right := SrcRect.Right - (DestRect.Right - DestRect2.Right);
DestRect.Right := DestRect2.Right;
end;
if DestRect.Bottom > DestRect2.Bottom then
begin
SrcRect.Bottom := SrcRect.Bottom - (DestRect.Bottom - DestRect2.Bottom);
DestRect.Bottom := DestRect2.Bottom;
end;
if SrcRect.Right > SrcRect2.Right then
begin
DestRect.Right := DestRect.Right - (SrcRect.Right - SrcRect2.Right);
SrcRect.Right := SrcRect2.Right;
end;
if SrcRect.Bottom > SrcRect2.Bottom then
begin
DestRect.Bottom := DestRect.Bottom - (SrcRect.Bottom - SrcRect2.Bottom);
SrcRect.Bottom := SrcRect2.Bottom;
end;
Result := (DestRect.Left < DestRect.Right) and (DestRect.Top < DestRect.Bottom) and
(SrcRect.Left < SrcRect.Right) and (SrcRect.Top < SrcRect.Bottom);
end;
{ TDirectDraw }
constructor TDirectDraw.Create(GUID: PGUID);
begin
CreateEx(GUID, True);
end;
constructor TDirectDraw.CreateEx(GUID: PGUID; DirectX7Mode: Boolean);
type
TDirectDrawCreate = function(lpGUID: PGUID; out lplpDD: IDirectDraw;
pUnkOuter: IUnknown): HRESULT; stdcall;
TDirectDrawCreateEx = function(lpGUID: PGUID; out lplpDD: IDirectDraw7; const iid: TGUID;
pUnkOuter: IUnknown): HRESULT; stdcall;
begin
inherited Create;
FClippers := TList.Create;
FPalettes := TList.Create;
FSurfaces := TList.Create;
if DirectX7Mode then
begin
{ DirectX 7 }
if TDirectDrawCreateEx(DXLoadLibrary('DDraw.dll', 'DirectDrawCreateEx')) (GUID, FIDDraw7, IID_IDirectDraw7, nil)<>DD_OK then
raise EDirectDrawError.CreateFmt(SCannotInitialized, [SDirectDraw]);
try
FIDDraw := FIDDraw7 as IDirectDraw;
FIDDraw4 := FIDDraw7 as IDirectDraw4;
except
raise EDirectDrawError.Create(SSinceDirectX7);
end;
end else
begin
if TDirectDrawCreate(DXLoadLibrary('DDraw.dll', 'DirectDrawCreate')) (GUID, FIDDraw, nil)<>DD_OK then
raise EDirectDrawError.CreateFmt(SCannotInitialized, [SDirectDraw]);
try
FIDDraw4 := FIDDraw as IDirectDraw4;
except
raise EDirectDrawError.Create(SSinceDirectX6);
end;
end;
FDriverCaps.dwSize := SizeOf(FDriverCaps);
FHELCaps.dwSize := SizeOf(FHELCaps);
FIDDraw.GetCaps(FDriverCaps, FHELCaps);
end;
destructor TDirectDraw.Destroy;
begin
while SurfaceCount>0 do
Surfaces[SurfaceCount-1].Free;
while PaletteCount>0 do
Palettes[PaletteCount-1].Free;
while ClipperCount>0 do
Clippers[ClipperCount-1].Free;
FSurfaces.Free;
FPalettes.Free;
FClippers.Free;
inherited Destroy;
end;
class function TDirectDraw.Drivers: TDirectXDrivers;
begin
Result := EnumDirectDrawDrivers;
end;
function TDirectDraw.GetClipper(Index: Integer): TDirectDrawClipper;
begin
Result := FClippers[Index];
end;
function TDirectDraw.GetClipperCount: Integer;
begin
Result := FClippers.Count;
end;
function TDirectDraw.GetDisplayMode: TDDSurfaceDesc;
begin
Result.dwSize := SizeOf(Result);
DXResult := IDraw.GetDisplayMode(Result);
if DXResult<>DD_OK then
FillChar(Result, SizeOf(Result), 0);
end;
function TDirectDraw.GetIDDraw: IDirectDraw;
begin
if Self<>nil then
Result := FIDDraw
else
Result := nil;
end;
function TDirectDraw.GetIDDraw4: IDirectDraw4;
begin
if Self<>nil then
Result := FIDDraw4
else
Result := nil;
end;
function TDirectDraw.GetIDDraw7: IDirectDraw7;
begin
if Self<>nil then
Result := FIDDraw7
else
Result := nil;
end;
function TDirectDraw.GetIDraw: IDirectDraw;
begin
Result := IDDraw;
if Result=nil then
raise EDirectDrawError.CreateFmt(SNotMade, ['IDirectDraw']);
end;
function TDirectDraw.GetIDraw4: IDirectDraw4;
begin
Result := IDDraw4;
if Result=nil then
raise EDirectDrawError.CreateFmt(SNotMade, ['IDirectDraw4']);
end;
function TDirectDraw.GetIDraw7: IDirectDraw7;
begin
Result := IDDraw7;
if Result=nil then
raise EDirectDrawError.CreateFmt(SNotMade, ['IDirectDraw7']);
end;
function TDirectDraw.GetPalette(Index: Integer): TDirectDrawPalette;
begin
Result := FPalettes[Index];
end;
function TDirectDraw.GetPaletteCount: Integer;
begin
Result := FPalettes.Count;
end;
function TDirectDraw.GetSurface(Index: Integer): TDirectDrawSurface;
begin
Result := FSurfaces[Index];
end;
function TDirectDraw.GetSurfaceCount: Integer;
begin
Result := FSurfaces.Count;
end;
{ TDirectDrawPalette }
constructor TDirectDrawPalette.Create(ADirectDraw: TDirectDraw);
begin
inherited Create;
FDDraw := ADirectDraw;
FDDraw.FPalettes.Add(Self);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -