Hallo!
Ich bin dabei ein TGraphic Nachfahren zu programmieren für die Atari (bzw. Digital Research) IMG Bilder. Erstmal ist an dem Code noch nichts optimiert etc, Hauptsache er funktioniert soweit. Das tut er grundsätzlich auch, weil bisher habe ich die dekodierten Daten und Farbpaletten einem TBitmap gesetzt und diesen dann gemalt. Das klappt soweit alles einwandfrei. Nun ist es aber für ein TGraphic Nachkommen dumm, selbst intern ein TBitmap zu nutzen. Also alles umgeschrieben, so dass ich selber den DIB Speicher befülle und selber eine Palette erstelle. Ok, die Palettenerstellung klappt, weil als ich SetDIBColorTable() durch Zuweisung des Palettenhandles ersetzt habe beim Bitmap, ist alles ok. Die Dekodierung und Setzen der DIBits klappt (eigentlich) auch, da das Bild vom Inhalt her richtig dargestellt wird. Nur die Farbpalette stimmt nicht. Diese kann aber wiederrum nicht falsch sein, da sie ja vom TBitmap ordentlich dargestellt wird.
Zu Verdeutlichung mein aktuelles Testprojekt im Anhang. Darin befinden sich folgende Dinge:
- IMGFile.pas (der TGraphic Nachkomme)
- IMGViewer.dpr (das Projekt)
- Mainform.* (das Formular des Projektes)
- Intel.img (2 Farben Bild mit Farbpalette)
- MF144_ha.img (16 Farben Bild mit Farbpalette)
Das Testprojekt hat zZ. eine ComboBox oben rechts wo der Malmodus ausgewählt werden kann:
-
WinAPI (der direkte Weg mit der
GDI wie es am Ende auch sein sollte)
- FullBitmap (der alte Weg, welcher auch einwandfrei funktioniert)
- TBitmap use (Zwischenschritt wo TBitmap nur noch mißbraucht wird um HBITMAP und HPALETTE zugewiesen zu bekommen)
Nun für alle die so nett sind um mal ein Blick zu riskieren zu den Internas bzw. wo finde ich was:
Palette Erstellung
- BuildPaletteQuads() füllt eine Liste mit TRGBQuads mit der Palette (Anzahl wird durch fPaletteSize bestimmt)
- PaletteNeeded() erstellt das HPALETTE
Handle, wenn dieses noch nicht vorhanden (=0) ist und weist es fPaletteHandle zu
Bitmap Erstellung
- HandleNeeded() erstellt das HBITMAP
Handle, wenn dieses noch nicht vorhanden (=0) ist und weist es fDataHandle zu
(hier werden die geladenen Bit-Planes zu den DIBits dekodiert und geschrieben)
Zeichnen
- Draw() malt abhängig von DrawMode (siehe ComboBox) das Bild auf den übergebenen Canvas
(hier werden nur beim DrawMode == 1 (FullBitmap) die geladenen Bit-Planes direkt in die ScanLine[] dekodiert, alle andere Modien nutzen das fDataHandle von HandleNeeded())
Nun bin ich mal gespannt wo mein Fehler liegt. Ich bin zZ ratlos.
Gruss,
Muetze1