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

0 Mitglieder und 2 Gäste betrachten dieses Thema.

Offline AndreasKromke

  • Benutzer
  • Beiträge: 217
vr_trnfm() - Beispiel?
« am: Heute um 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: Heute um 13:15:35 von AndreasKromke »

Offline thh

  • Benutzer
  • Beiträge: 36
Re: vr_trnfm() - Beispiel?
« Antwort #1 am: Heute um 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: Heute um 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: Heute um 13:55:20 von czietz »

Offline AndreasKromke

  • Benutzer
  • Beiträge: 217
Re: vr_trnfm() - Beispiel?
« Antwort #3 am: Heute um 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: Heute um 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: Heute um 18:17:20 von czietz »

Offline AndreasKromke

  • Benutzer
  • Beiträge: 217
Re: vr_trnfm() - Beispiel?
« Antwort #5 am: Heute um 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: Heute um 19:29:48 von AndreasKromke »