Screen-Rip (Norton-Mäuse)

  • In letzter Zeit beschäftige ich mich viel mit Bitmaps (Fonts, kleine Animationen, ...) und einige kennen sicher den Robomäuse-Bildschirmschoner vom Norton Commander.


    Ich habe mich jetzt drangemacht und mit vielen Screenshots die Bild-Daten rausgefischt, in RGB-Daten für ein C-Programm umgewandelt und mit SDL ein Fenster anzeigen lassen, in welchem ich die animierte Maus verschieben kann. Ich will das mal zeigen und ein bisschen erklären. Mit den extrahierten Bilddaten kann man coole Sachen machen.


    Das Demo-Programm, der Quellcode/Projektordner und Screenshot habe ich hier mit angehängt. Mit den angegeben Tools kann das direkt compiliert werden.

    Die "Schriftart" ist die 8x14 einer IBM-kompatiblen Video-Karte.


    norton_maus_demo.zip: demo-Programm+DLLs vom Screenshot, compiliert auf win2000, könnte auch mit 9x/ME gehen.

    norton_maus_demo_quellcode.zip: Projektordner+DLLs für Dev-Cpp 4.9.9.2 mit SDL und SDL_gfx devpak


    Wie man nun vorgeht um an alle Bilddaten zu kommen


    1. In dosbox habe ich den Norton Commander Bildschirmschoner angemacht und in einer Endlosschleife mit imagemagick auf einem Linux-Rechner ca. 10 Sekunden lang screenshots machen lassen. Im Anhang ist das Shell-Script, was so viele Screenshots in Dauerschleife wie möglich macht (screenshot.sh.txt)


    2. Das gab einige hundert PNG-Dateien. Nach genauem hinsehen habe ich gemerkt die ersten 15 reichen. Es gibt ca. 8 verschiedene Stufen der Animation. Manche Dinge wie die Ketten haben nur 2 verschiedene Bilder, andere haben 8:

    * 1x Körper, immer gleich

    * Auge 8

    * Kette 2

    * Nase 8

    * Antriebs-Schraube 4

    * Schwanz 7

    * Zaehne 2


    3. Die einzelnen Elemente habe ich alle raugefischt und zu einelnen Bildern gemacht. Insgesamt 32 Stück. Das hat ein wenig gedauert.

    Zur Illustration habe ich eine "Karte" davon gemacht (einzelteile.png).


    4. Diese so erzeugten 32 Einzelteile habe ich mit dem Programm "lcd-image-converter" in RGB888 Daten (ohne Alphawert) in C-Header umgewandelt. Dort kommt dann ein C-Header bei raus, der die Bilddaten enthält und eine "Variable" vom Typ "tImage". Beispiel:


    Das uint24_t kommt beim lcd-image-converter raus, wenn ich 24 bit datenbreite wähle. Bei 32bit kommen andere Werte raus, die nochmal umgerechnet werden müssten. Ich definiere vor dem Einbinden dieser Header den uint24_t als uint32_t. So wird immer ein unsigned 32bit int für jeden Farbwert genommen.

    Nun hat man in "image_data_zahne1" das Bitmap des Musters für die Zähne, einen Schritt von zweien die es gibt. Diese werden abwechselt übereinander geschrieben und so entsteht der Animationseffekt.

    Da image_data_zaehne1 32 Elemente von je 32bit hat, braucht je ein Zahn-Bitmap 128byte.


    Zugegriffen auf das Image wird dann so z.B.

    Code
    ...
    int img_height = zaehne1->h;
    int img_widht = zaehne1->w;
    uint32_t first_data_word  = zaehne1->data[0];
    uint32_t second_data_word = zaehne1->data[1];
    ...

    5. Nun baue ich erstmal ein SDL Grundgerüst, welches in einer Dauerschleife auf Tastendrücke warten und ein Flag abfrägt. Wenn dieses Flag gesetzt ist, dann wird der Bildschirm neu gezeichnet. Maus und Text.

    Die Tastendrücke ändern die Position der Maus (mx + my Variable mit Pfeiltasten ändern). Dann wird das Flag gesetzt und beim nächsten Durchlauf der Schleife wird die Maus und der Text wieder gezeichnet.


    6. Die Schrift-Art ist im Header "XGA_8x14.h" und kann direkt in jedem SDL-Programm mit SDL_gfx verwendet werden.

    Einfach die Header Datei einbinden und das hier ausführen:

    Code
    gfxPrimitivesSetFont(&XGA_8x14, 8, 14);
    stringRGBA(screen, 0, 0, "Test-String in ROT", 0xff, 0x00, 0x00, 0xff);


    Der Quellcode in allen C und Header Dateien wurde echt lang, aber das meiste davon sind Bild-Daten aus den Screenshots generiert, nicht von Hand geschrieben. Die main.c enthält das komplette Programm.


    Hierauf aufbauen will ich einen Bildschirmschon für Windows schreiben, der den Norton-Commander BS kopiert. Die Fliegenden Floppies vielleicht auch noch.


    Dann habe ich noch ein Microcontroller-Board mit STM32 und einem 3,2" TFT. Dort lasse ich die Maus aus noch rennen (stm32.jpg, bild aus dem Netz).

    Das Intro von Monkey Island, wo man den Berg bei Nacht sieht und die Lichter und in den Häusern und die Sterne funkeln ist als nächstes dran.


    Das Windows/Dev-CPP Projekt bleibt so wie es ist, das habe ich nur zum Zeigen zusammengebaut. Ich war echt erstaunt, wie einfach das auf Windows 2000 mit Dev-CPP zu installieren und compilieren war. Den Code habe ich auf Linux geschrieben und konnte ihn 1:1 ohne auch nur ein Zeichen zu ändern auf Windows compilieren.

    Diese ganzen Animationen sollen letztendlich auf dem Microcontroller-Board laufen. Dazu picoc (ein C-Script-Interpreter) und FreeRTOS. SD-Slot hat das Board schon, PS/2 Buchsen für Maus+Tastatur kommen auch noch dran. Ein schönes Alugehäuse hab ich auch schon dafür.

    Mit den vielen IOs die das Board hat soll das eine Art "SPS" werden. Ein Computer der an Ort und Stelle programmiert werden kann, SD-Speicher und viele digitale IOs und ein paar Analoge.


    Das Ganze hat ca. 4 Stunden gebraucht. Vielleicht findet der eine oder andere das ja interessant.