Ich beschäftige mich gerade mit Venomgfx unter Windows. Einer meiner Computerfreunde hat früher viel damit programmiert und da will ich mir diese Grafik-Engine auch mal anschauen. Veilleicht ist die noch zu irgendwas gut. Schnell genug ist sie ja. Ich dachte, ich könnte diese Bibliothek für ihn auf meinem Rechner übersetzen, aber bei ihm wie bei mir wird die Exception ausgelöst.
Beim Übersetzen meiner Testanwendung wird an der im unteren Quelltext angegebenen Stelle eine Exception ohne genauere Angaben (Exceptionnummer, Meldung...) ausgelöst.
Die Grafiksoftware verwendet die DirectX Schnittstelle zur Grafikausgabe.
Da ich aber nun eh schon in Windows bin, bin ich doch auch schon im Grafikmodus. So geht meine Überlegung für einen Workaround da hin, dass ich nur die VGFX-spezifischen Dinge initialisieren will
und die Ausgabe über das gewöhnliche GDI vornehmen will, in der aktuellen in meinem Windows eingestellten Grafikauflösung. Mein Windows funktioniert ja schließlich, also funktioniert zwangsläufig auch die Grafikausgane per GDI.
Ich verwende Windows 10 mit aktuellem Update. Und Lazarus 1.6.4 mit Freepascal 3.0.2. Das Demo soll später auch mit FPC 3.0.0 und 2.6.4 und möglichst auch mit Version 2.6.2 funktionieren. Unter Windows 10 mit aktuellem Update.
Muss ich oder kann ich evtl. eine versionsabhängige DirectX-Funktion zum Initialisieren der Grafikschnittstelle einsetzen.
Mir geht es zunächst darum, VenomGFX-Graikroutinen überhaupt verwenden zu können. Dass da das GDI evtl langsamer ist als DirectX, stört zunächst nicht, es soll zuerst mal überhaupt funktionieren und das unter Verwendung der Grafikroutinen der VGFX Bibliothek.
Wie muss ich da vorgehen?
Hier ist der Quellcode der Prozeduren Init_Graph() und Kill_Graph aus der VGFX-Unit:
Code: Alles auswählen
PROCEDURE Init_Graph(Breite,Hoehe:Longint);
Begin
If not VGFXGraphLoaded then
begin
CursorVisible(False);
WAITMS(100);
// Don't use this, FPCX will do the resolution switches
// in GetDefaultDirectDraw() and CloseDirectDraw()
//SetResolution(Breite,Hoehe,16);
WAITMS(200);
Calculate_ScreenSettings(Breite,Hoehe);
//Diese Funktion wirft die Exception
//Gibt es einen Workaround?????????????
GetDefaultDirectDraw(Window_Main_Handle,Breite,Hoehe,16);
WAITMS(200);
CursorVisible(False);
VGFXGraphLoaded:= True;
Init_VW(ClearVW,DD_Breite,DD_Hoehe,True);
end;
End;
PROCEDURE Kill_Graph;
Begin
If VGFXGraphLoaded then
begin
Kill_VW(ClearVW);
WAITMS(100);
//Hier wird DirectDraw wieder ausgeschaltet
CloseDirectDraw;
WAITMS(200);
// Don't use this, FPCX will do the resolution switches
// in GetDefaultDirectDraw() and CloseDirectDraw()
//ReSetResolution;
WAITMS(200);
VGFXGraphLoaded:= False;
CursorVisible(True);
end;
End;
//Hier wird der Zwischenspeicher für die Bildinformation angelegt
PROCEDURE Init_VW(var VWPage:VirtualWindow;Breite,Hoehe:Longint;Clear:Boolean);
Begin
CalculateVW(VWPage,Breite,Hoehe);
VWPage.VWOffset:= 0;
AllokSpeicher(VWPage.VWOffset,VWPage.Size);
VWPage.Active:= True;
If Clear then ClrPackedSprite(VWPage,0);
End;
//Diese beiden Prozeduren schreiben die Pixel in den Bildschirm,
//um sie dort sichtbar zu machen
PROCEDURE Flip_DD(Source:Longint);
Begin
//wie erreiche ich das gleiche mit normalem GDI statt DirectX
DirectDrawBlit(Pointer(Source));
End;
//wie muss ich diesen Quellcode an die Nutzung des normalen GDI anpassen?
PROCEDURE Flip_VW(Source,Dest:Longint); Assembler;
Asm
Mov esi,Source
Mov edi,Dest
Mov ecx,DD_Size
Shr ecx,8
@SCHLEIFE:
MovQ mm1,[esi ]; MovQ [edi ],mm1
MovQ mm1,[esi+ 8]; MovQ [edi+ 8],mm1
MovQ mm1,[esi+ 16]; MovQ [edi+ 16],mm1
MovQ mm1,[esi+ 24]; MovQ [edi+ 24],mm1
MovQ mm1,[esi+ 32]; MovQ [edi+ 32],mm1
MovQ mm1,[esi+ 40]; MovQ [edi+ 40],mm1
MovQ mm1,[esi+ 48]; MovQ [edi+ 48],mm1
MovQ mm1,[esi+ 56]; MovQ [edi+ 56],mm1
MovQ mm1,[esi+ 64]; MovQ [edi+ 64],mm1
MovQ mm1,[esi+ 72]; MovQ [edi+ 72],mm1
MovQ mm1,[esi+ 80]; MovQ [edi+ 80],mm1
MovQ mm1,[esi+ 88]; MovQ [edi+ 88],mm1
MovQ mm1,[esi+ 96]; MovQ [edi+ 96],mm1
MovQ mm1,[esi+104]; MovQ [edi+104],mm1
MovQ mm1,[esi+112]; MovQ [edi+112],mm1
MovQ mm1,[esi+120]; MovQ [edi+120],mm1
MovQ mm1,[esi+128]; MovQ [edi+128],mm1
MovQ mm1,[esi+136]; MovQ [edi+136],mm1
MovQ mm1,[esi+144]; MovQ [edi+144],mm1
MovQ mm1,[esi+152]; MovQ [edi+152],mm1
MovQ mm1,[esi+160]; MovQ [edi+160],mm1
MovQ mm1,[esi+168]; MovQ [edi+168],mm1
MovQ mm1,[esi+176]; MovQ [edi+176],mm1
MovQ mm1,[esi+184]; MovQ [edi+184],mm1
MovQ mm1,[esi+192]; MovQ [edi+192],mm1
MovQ mm1,[esi+200]; MovQ [edi+200],mm1
MovQ mm1,[esi+208]; MovQ [edi+208],mm1
MovQ mm1,[esi+216]; MovQ [edi+216],mm1
MovQ mm1,[esi+224]; MovQ [edi+224],mm1
MovQ mm1,[esi+232]; MovQ [edi+232],mm1
MovQ mm1,[esi+240]; MovQ [edi+240],mm1
MovQ mm1,[esi+248]; MovQ [edi+248],mm1
Add esi,256
Add edi,256
Dec ecx
JNZ @SCHLEIFE
Emms
End;