📄 dxdraws.pas
字号:
destructor TDirectDrawPalette.Destroy;
begin
FDDraw.FPalettes.Remove(Self);
inherited Destroy;
end;
function TDirectDrawPalette.CreatePalette(Caps: DWORD; const Entries): Boolean;
var
TempPalette: IDirectDrawPalette;
begin
IDDPalette := nil;
FDDraw.DXResult := FDDraw.IDraw.CreatePalette(Caps, @Entries, TempPalette, nil);
FDXResult := FDDraw.DXResult;
Result := FDDraw.DXResult=DD_OK;
if Result then
IDDPalette := TempPalette;
end;
procedure TDirectDrawPalette.LoadFromDIB(DIB: TDIB);
var
Entries: TPaletteEntries;
begin
Entries := RGBQuadsToPaletteEntries(DIB.ColorTable);
CreatePalette(DDPCAPS_8BIT, Entries);
end;
procedure TDirectDrawPalette.LoadFromFile(const FileName: string);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TDirectDrawPalette.LoadFromStream(Stream: TStream);
var
DIB: TDIB;
begin
DIB := TDIB.Create;
try
DIB.LoadFromStream(Stream);
if DIB.Size>0 then
LoadFromDIB(DIB);
finally
DIB.Free;
end;
end;
function TDirectDrawPalette.GetEntries(StartIndex, NumEntries: Integer;
var Entries): Boolean;
begin
if IDDPalette<>nil then
begin
DXResult := IPalette.GetEntries(0, StartIndex, NumEntries, @Entries);
Result := DXResult=DD_OK;
end else
Result := False;
end;
function TDirectDrawPalette.GetEntry(Index: Integer): TPaletteEntry;
begin
GetEntries(Index, 1, Result);
end;
function TDirectDrawPalette.GetIDDPalette: IDirectDrawPalette;
begin
if Self<>nil then
Result := FIDDPalette
else
Result := nil;
end;
function TDirectDrawPalette.GetIPalette: IDirectDrawPalette;
begin
Result := IDDPalette;
if Result=nil then
raise EDirectDrawPaletteError.CreateFmt(SNotMade, ['IDirectDrawPalette']);
end;
function TDirectDrawPalette.SetEntries(StartIndex, NumEntries: Integer;
const Entries): Boolean;
begin
if IDDPalette<>nil then
begin
DXResult := IPalette.SetEntries(0, StartIndex, NumEntries, @Entries);
Result := DXResult=DD_OK;
end else
Result := False;
end;
procedure TDirectDrawPalette.SetEntry(Index: Integer; Value: TPaletteEntry);
begin
SetEntries(Index, 1, Value);
end;
procedure TDirectDrawPalette.SetIDDPalette(Value: IDirectDrawPalette);
begin
if FIDDPalette=Value then Exit;
FIDDPalette := Value;
end;
{ TDirectDrawClipper }
constructor TDirectDrawClipper.Create(ADirectDraw: TDirectDraw);
begin
inherited Create;
FDDraw := ADirectDraw;
FDDraw.FClippers.Add(Self);
FDDraw.DXResult := FDDraw.IDraw.CreateClipper(0, FIDDClipper, nil);
if FDDraw.DXResult<>DD_OK then
raise EDirectDrawClipperError.CreateFmt(SCannotMade, [SDirectDrawClipper]);
end;
destructor TDirectDrawClipper.Destroy;
begin
FDDraw.FClippers.Remove(Self);
inherited Destroy;
end;
function TDirectDrawClipper.GetIDDClipper: IDirectDrawClipper;
begin
if Self<>nil then
Result := FIDDClipper
else
Result := nil;
end;
function TDirectDrawClipper.GetIClipper: IDirectDrawClipper;
begin
Result := IDDClipper;
if Result=nil then
raise EDirectDrawClipperError.CreateFmt(SNotMade, ['IDirectDrawClipper']);
end;
procedure TDirectDrawClipper.SetClipRects(const Rects: array of TRect);
type
PArrayRect = ^TArrayRect;
TArrayRect = array[0..0] of TRect;
var
RgnData: PRgnData;
i: Integer;
BoundsRect: TRect;
begin
BoundsRect := Rect(MaxInt, MaxInt, -MaxInt, -MaxInt);
for i:=Low(Rects) to High(Rects) do
begin
with BoundsRect do
begin
Left := Min(Rects[i].Left, Left);
Right := Max(Rects[i].Right, Right);
Top := Min(Rects[i].Top, Top);
Bottom := Max(Rects[i].Bottom, Bottom);
end;
end;
GetMem(RgnData, SizeOf(TRgnDataHeader)+SizeOf(TRect)*(High(Rects)-Low(Rects)+1));
try
with RgnData^.rdh do
begin
dwSize := SizeOf(TRgnDataHeader);
iType := RDH_RECTANGLES;
nCount := High(Rects)-Low(Rects)+1;
nRgnSize := nCount*SizeOf(TRect);
rcBound := BoundsRect;
end;
for i:=Low(Rects) to High(Rects) do
PArrayRect(@RgnData^.Buffer)^[i-Low(Rects)] := Rects[i];
DXResult := IClipper.SetClipList(RgnData, 0);
finally
FreeMem(RgnData);
end;
end;
procedure TDirectDrawClipper.SetHandle(Value: THandle);
begin
DXResult := IClipper.SetHWnd(0, Value);
end;
procedure TDirectDrawClipper.SetIDDClipper(Value: IDirectDrawClipper);
begin
if FIDDClipper=Value then Exit;
FIDDClipper := Value;
end;
{ TDirectDrawSurfaceCanvas }
constructor TDirectDrawSurfaceCanvas.Create(ASurface: TDirectDrawSurface);
begin
inherited Create;
FSurface := ASurface;
end;
destructor TDirectDrawSurfaceCanvas.Destroy;
begin
Release;
FSurface.FCanvas := nil;
inherited Destroy;
end;
procedure TDirectDrawSurfaceCanvas.CreateHandle;
begin
FSurface.DXResult := FSurface.ISurface.GetDC(FDC);
if FSurface.DXResult=DD_OK then
Handle := FDC;
end;
procedure TDirectDrawSurfaceCanvas.Release;
begin
if (FSurface.IDDSurface<>nil) and (FDC<>0) then
begin
Handle := 0;
FSurface.IDDSurface.ReleaseDC(FDC);
FDC := 0;
end;
end;
{ TDirectDrawSurface }
constructor TDirectDrawSurface.Create(ADirectDraw: TDirectDraw);
begin
inherited Create;
FDDraw := ADirectDraw;
FDDraw.FSurfaces.Add(Self);
end;
destructor TDirectDrawSurface.Destroy;
begin
FCanvas.Free;
IDDSurface := nil;
FDDraw.FSurfaces.Remove(Self);
inherited Destroy;
end;
function TDirectDrawSurface.GetIDDSurface: IDirectDrawSurface;
begin
if Self<>nil then
Result := FIDDSurface
else
Result := nil;
end;
function TDirectDrawSurface.GetIDDSurface4: IDirectDrawSurface4;
begin
if Self<>nil then
Result := FIDDSurface4
else
Result := nil;
end;
function TDirectDrawSurface.GetIDDSurface7: IDirectDrawSurface7;
begin
if Self<>nil then
Result := FIDDSurface7
else
Result := nil;
end;
function TDirectDrawSurface.GetISurface: IDirectDrawSurface;
begin
Result := IDDSurface;
if Result=nil then
raise EDirectDrawSurfaceError.CreateFmt(SNotMade, ['IDirectDrawSurface']);
end;
function TDirectDrawSurface.GetISurface4: IDirectDrawSurface4;
begin
Result := IDDSurface4;
if Result=nil then
raise EDirectDrawSurfaceError.CreateFmt(SNotMade, ['IDirectDrawSurface4']);
end;
function TDirectDrawSurface.GetISurface7: IDirectDrawSurface7;
begin
Result := IDDSurface7;
if Result=nil then
raise EDirectDrawSurfaceError.CreateFmt(SNotMade, ['IDirectDrawSurface7']);
end;
procedure TDirectDrawSurface.SetIDDSurface(Value: IDirectDrawSurface);
var
Clipper: IDirectDrawClipper;
begin
if Value=nil then Exit;
if Value as IDirectDrawSurface=FIDDSurface then Exit;
FIDDSurface := nil;
FIDDSurface4 := nil;
FIDDSurface7 := nil;
FStretchDrawClipper := nil;
FGammaControl := nil;
FHasClipper := False;
FLockCount := 0;
FillChar(FSurfaceDesc, SizeOf(FSurfaceDesc), 0);
if Value<>nil then
begin
FIDDSurface := Value as IDirectDrawSurface;
FIDDSurface4 := Value as IDirectDrawSurface4;
if FDDraw.FIDDraw7<>nil then FIDDSurface7 := Value as IDirectDrawSurface7;
FHasClipper := (FIDDSurface.GetClipper(Clipper)=DD_OK) and (Clipper<>nil);
FSurfaceDesc.dwSize := SizeOf(FSurfaceDesc);
FIDDSurface.GetSurfaceDesc(FSurfaceDesc);
if FDDraw.DriverCaps.dwCaps2 and DDCAPS2_PRIMARYGAMMA<>0 then
FIDDSurface.QueryInterface(IID_IDirectDrawGammaControl, FGammaControl);
end;
end;
procedure TDirectDrawSurface.SetIDDSurface4(Value: IDirectDrawSurface4);
begin
if Value=nil then
SetIDDSurface(nil)
else
SetIDDSurface(Value as IDirectDrawSurface);
end;
procedure TDirectDrawSurface.SetIDDSurface7(Value: IDirectDrawSurface7);
begin
if Value=nil then
SetIDDSurface(nil)
else
SetIDDSurface(Value as IDirectDrawSurface);
end;
procedure TDirectDrawSurface.Assign(Source: TPersistent);
var
TempSurface: IDirectDrawSurface;
begin
if Source=nil then
IDDSurface := nil
else if Source is TGraphic then
LoadFromGraphic(TGraphic(Source))
else if Source is TPicture then
LoadFromGraphic(TPicture(Source).Graphic)
else if Source is TDirectDrawSurface then
begin
if TDirectDrawSurface(Source).IDDSurface=nil then
IDDSurface := nil
else begin
FDDraw.DXResult := FDDraw.IDraw.DuplicateSurface(TDirectDrawSurface(Source).IDDSurface,
TempSurface);
if FDDraw.DXResult=0 then
begin
IDDSurface := TempSurface;
end;
end;
end else
inherited Assign(Source);
end;
procedure TDirectDrawSurface.AssignTo(Dest: TPersistent);
begin
if Dest is TDIB then
begin
TDIB(Dest).SetSize(Width, Height, 24);
TDIB(Dest).Canvas.CopyRect(Rect(0, 0, TDIB(Dest).Width, TDIB(Dest).Height), Canvas, ClientRect);
Canvas.Release;
end else
inherited AssignTo(Dest);
end;
function TDirectDrawSurface.Blt(const DestRect, SrcRect: TRect; Flags: DWORD;
const DF: TDDBltFX; Source: TDirectDrawSurface): Boolean;
begin
if IDDSurface<>nil then
begin
DXResult := ISurface.Blt(DestRect, Source.IDDSurface, SrcRect, DWORD(Flags), DF);
Result := DXResult=DD_OK;
end else
Result := False;
end;
function TDirectDrawSurface.BltFast(X, Y: Integer; const SrcRect: TRect;
Flags: DWORD; Source: TDirectDrawSurface): Boolean;
begin
if IDDSurface<>nil then
begin
DXResult := ISurface.BltFast(X, Y, Source.IDDSurface, SrcRect, DWORD(Flags));
Result := DXResult=DD_OK;
end else
Result := False;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -