## Wir basteln uns ein Hintergrundanimations - Plugin

Man nehme:

- Eine Idee, was man coden will
- einen Compiler/Linker, der DLLs erstellen kann

Das Plugin-Interface ist sehr minimal gehalten: Es besteht aus nur einer exportierten Funktion namens TAP mit einem einzigen Parameter vom Typ lpDDSurface. Die Funktion, die die DLL exportieren muss, lautet also

    void TAP (lpDDSurface);

Kein Rückgabewert, EBX,ESI und EDI müssen erhalten bleiben, die exportierte Funktion räumt wie bei der Win32-API üblich die Parameter vom Stack.
`lpDDSurface` zeigt auf eine DirectDrawSurface, nicht auf eine höhere Version. Während des Funktionsaufrufes enthält die Surface das Hintergrundbild tapback.jpg, falls vorhanden. Die Surface hat eine Abmessung von 640*480 Pixeln, der zusätzliche Pitch beträgt 0 Bytes.Je nach System liegt die Surface im Grafik- oder im Hauptspeicher. Solange die DLL verwendet wird, ändert sich das Pixelformat der Surface nicht.

Falls Initialisierungs- oder Aufräumarbeiten nötig sind, empfiehlt es sich, dazu die DllEntryPoint-Funktion zu benutzen. Dies ist auch die einzige Möglichkeit, TAP.Mag mitzuteilen, ob die DLL zum System kompatibel ist, falls spezielle Funktionen (MMX o.ä.) benötigt werden.

Die Surface kann je nach Videomodus in 8,15,16,24 oder 32 Bit sein, ohne festgelegtes Pixelformat (wichtig bei 15/16 Bit). Solange nicht GDI zur Grafikdarstellung benützt wird (mittels `DDSurface::GetDC` / `DDSurface::ReleaseDC`), sondern der Bildspeicher direkt angesprochen wird (meist `DDSurface::Lock` / `DDSurface::Unlock`) muß der Farbmodus beachtet werden. Normalerweise wird nur HighColor und TrueColor verwendet, eine Unterstützung des 8-Bit-Palettenmodus kann durchaus entfallen, da kaum jemand das Mag im Fenstermodus auf einem 8-Bit-Desktop laufen lassen wird. Hinweis: Die Methode DDSurface::Lock liefert das Pixelformat gleich mit.

Wie oft die Funktion aufgerufen wird, hängt von der Geschwindigkeit des Rechners ab, ob Text neu geladen / dargestellt wird und ob Animationen (GIF, Scrolling) aktiv sind. Dadurch kann die Aufruffrequenz stark schwanken. Eine Synchronisation sollte am besten per Systemzeit (timeGetTime o.ä.) oder RDTSC (Achtung, läuft nicht auf dem Cyrix 6x86 / M1 und AMD K5) erfolgen.

Noch Fragen ? Antworten gibt es von mir, mailt an ts@deinmeister.de.