Autor Thema: vr_trnfm() - Beispiel?  (Gelesen 259 mal)

0 Mitglieder und 2 Gäste betrachten dieses Thema.

Offline AndreasKromke

  • Benutzer
  • Beiträge: 218
vr_trnfm() - Beispiel?
« am: So 26.04.2026, 12:42:26 »
Es treibt mich zum Wahnsinn ...   :o

Ich experimentiere gerade mit vr_trnfm() herum, aber alle meine Beispiele führen zum Absturz.
Beispielsweise bei 32 Bit Farbtiefe (true colour). Der Block habe 10x7 Pixel. Ich setze für srcMFDB:

 fd_w = 10
 fd_h = 7
 fd_nplanes = 32
 fd_wdwith = 20 (10 Pixel à 4 Bytes macht 40 Bytes macht 20 16-Bit-Werte)
 fd_stand = 0 oder 1 (habe beides probiert)

(allgemein: srcMFDB.fd_wdwidth = (srcMFDB.fd_w * srcMFDB.fd_nplanes + 15) / 16);

Beim destMFDB wird anscheinend alles ignoriert außer fd_addr. Trotzdem habe ich ausprobiert, die Felder identisch mit denen von srcMFDB zu setzen, ohne Erfolg.

Bisher stürzt nur monochrom->monochrom nicht ab. Geht in allen Farbmodi. Gebe ich eine unübliche Farbtiefe an, also 7, wird das in manchen Grafikmodi ignoriert, bei anderen stürzt das Programm ab. Die Farbkonvertierung habe ich in keinem der sieben getesteten Bildschirm-Modi hingekriegt, immer nur Abstürze, in beide Richtungen (Standard nach gerätespezifisch und andersrum).

Ich habe eine Suche in github gemacht, aber hier habe ich nur im Vision-Quelltext einen Schnipsel gefunden, der ist aber so ad hoc nicht verständlich.

Hat das je funktioniert? Was habe ich übersehen?

PS: Testprogramm liegt jetzt in [https://gitlab.com/AndreasK/Atari-Mac-MagiC-Sources/-/tree/master/MagiC/TEST/TESTS/VDITEST/TRNFM]. Ist nicht aufgeräumt, nur "quick and dirty".

PS/2: Mit Hatari, TT-Emulation, 256 Farben (extended VDI) gibt es die gleichen Abstürze. Der destMFDB wird kaputtgeschrieben, es steht nur noch Grütze drin, und es gibt einen Busfehler.
« Letzte Änderung: So 26.04.2026, 13:15:35 von AndreasKromke »

Offline thh

  • Benutzer
  • Beiträge: 36
Re: vr_trnfm() - Beispiel?
« Antwort #1 am: So 26.04.2026, 13:43:15 »
Moin! Wenn ich mich richtig erinnere (ist schon ziemlich lange her...), kannst du vr_trnfm() nicht direkt für True-Color benutzen. Schau mal in die Sourcen von STune (https://github.com/ggnkua/Atari_ST_Sources/tree/master/C/Thomas%20Huth/STune - die Dateien th_init.c und loadimg.c) oder Fanwor (https://fanwor.tuxfamily.org/), da gibt's Funktionen wie loadpic2true() und transform_truecolor(), die dir weiterhelfen könnten.

Offline czietz

  • Benutzer
  • Beiträge: 4.017
Re: vr_trnfm() - Beispiel?
« Antwort #2 am: So 26.04.2026, 13:52:47 »
Aus der Erinnerung: "fd_wdwidth" ist die Länge in WORDs je Plane!.

Siehe auch das u.s. Beispiel aus dem Profibuch. (Beachte, wie die Zahl der Planes nicht in die Berechnung von fd_wdwidth eingeht).
« Letzte Änderung: So 26.04.2026, 13:55:20 von czietz »

Offline AndreasKromke

  • Benutzer
  • Beiträge: 218
Re: vr_trnfm() - Beispiel?
« Antwort #3 am: So 26.04.2026, 17:42:05 »
Aus der Erinnerung: "fd_wdwidth" ist die Länge in WORDs je Plane!.

Siehe auch das u.s. Beispiel aus dem Profibuch. (Beachte, wie die Zahl der Planes nicht in die Berechnung von fd_wdwidth eingeht).
Danke! In der Zwischenzeit hatte ich auch die Idee, das mal so auszuprobieren.

Ich hatte sogar ins Profibuch geschaut, aber das Beispiel übersehen. Sehr seltsam. In sämtlichen Dokumentationen steht es dann falsch; alle scheinen von der falschen Original-Dokumentation von DRI abgeschrieben zu haben, auch der TOS-Hypertext, quasi der Koran der Atari-Gläubigen. Vielleicht kann man das mal korrigieren, ist ja in github. Aber vorher probiere ich es aus.  :)

Offline czietz

  • Benutzer
  • Beiträge: 4.017
Re: vr_trnfm() - Beispiel?
« Antwort #4 am: So 26.04.2026, 18:16:22 »
Wo ist die VDI-Doku von DR denn falsch? Es ist etwas umständlich formuliert, aber im Wesentlichen steht da ja: fd_wdwidth = fd_w / 16. ("word size" ist 16, das ist anderswo definiert.)

Zitat
The width of the raster area in words. This value is equal to the width of the raster area in pixels, divided by the word size
« Letzte Änderung: So 26.04.2026, 18:17:20 von czietz »

Offline AndreasKromke

  • Benutzer
  • Beiträge: 218
Re: vr_trnfm() - Beispiel?
« Antwort #5 am: So 26.04.2026, 19:24:37 »
Du hast recht, bei DRI ist es noch am besten erklärt. Da war ich wohl durch meine falsche Grundannahme blind geworden.

Aber hier [https://freemint.github.io/tos.hyp/en/vdi_structures.html#MFDB] (Width of a line in words) ist es dann stumpf falsch. Außerdem darf fd_addr nicht NULL sein. Das ist auch falsch dokumentiert. Die NULL ist nur bei den Kopier-Aktionen erlaubt. Und alle Felder im dstMFDB außer fd_addr werden ignoriert. Das ist auch falsch oder unzureichend dokumentiert. Die Funktion füllt dann nur fd_stand aus und läßt alle anderen Felder von dstMFDB unverändert. Das sehe ich auch nicht ausreichend dokumentiert.
« Letzte Änderung: So 26.04.2026, 19:29:48 von AndreasKromke »

Offline AndreasKromke

  • Benutzer
  • Beiträge: 218
Re: vr_trnfm() - Beispiel?
« Antwort #6 am: Gestern um 21:19:55 »
Ich habe mein Testprogramm korrigiert und ein paar Tests mit vr_trnfm() gemacht. Das ist alles etwas seltsam:
  • In jedem Farbmodus kann MVDI seinen eigenen Modus und monochrome Bitmaps konvertieren.
  • Bei 16 Farben (interleaved) kann er auch 2 oder 7 planes konvertieren.
  • Bei 4 Farben (interleaved) kann er auch 4 oder 7 planes konvertieren.
  • Bei 2 Farben (monochrom) kann er auch 2, 4 oder 7 planes konvertieren.
  • EmuTOS kann bei 256 Farben auch 2, 4 oder 7 planes konvertieren.
Fazit: Vermutlich haben EmuTOS und die MVDI-Interleaved-Colour-Treiber eine universale Funktion, die mit jeder Anzahl von "planes" umgehen kann, während die MVDI-Packed-Pixel-Treiber nur monochrom und ihre eigene Auflösung können. Ob das alles so richtig ist...

PS: Ich habe nur getestet, ob etwas rauskommt, nicht, ob es korrekt ist. Wie man "inplace" umrechnen kann, ist mir eh ein Rätsel.
« Letzte Änderung: Gestern um 21:20:59 von AndreasKromke »