Hello, Guest the thread was viewed16k times and contains 81 replies

last post from bbock at the

Vektorgrafik für den C64

  • SVG (= Scalable Vector Graphics) ist das Standardformat für Vektorgrafiken im Internet. Leider ist dieses Format zu komplex um es direkt auf 8-Bit-Rechnern wie dem C64 darstellen zu können. Mein Java-Programm TinySVG extrahiert "Strichzeichnungen" aus SVG-Dateien und wandelt diese in vereinfachte Vektorformate für Retro Computer um.


    Die aktuelle Version von TinySVG ist in folgendem Thema auf joyceforum.de zu finden: https://joyceforum.de/viewtopic.php?f=5&t=65


    Es handelt sich um ein Java-Programm, das in einer JAR-Datei verpackt ist. Sie sollte sich einfach durch einen Doppelklick starten lassen; falls das nicht funktioniert, dann geht es über die Kommandozeile: man wechselt in das Verzeichnis, in dem sich TinySVG.jar befindet und gibt

    Code
    1. java -jar TinySVG.jar

    auf der Kommandozeile ein. Voraussetzung ist eine installierte Java Runtime ab Version 8.


    Eine kleine TinySVG-Anleitung:

    1. TinySVG.jar per Doppelklick starten (Java Runtime ab Version 8 erforderlich).
    2. Unter Optionen > Konfiguration sollten folgende Punkte aktiviert sein: Zentrieren, Größe anpassen, Bézier-Kurven-Annäherung, Bogen-Annäherung, Linienreduktion aktivieren.
    3. Unter Voreinstellungen "C64" wählen; das setzt die Einstellungen für Ausgabedateien und Bildschirmauflösung automatisch.
    4. Die Konfiguration mit OK bestätigen.
    5. Datei > Öffnen > SVG-Datei auswählen.
    6. Die SVG-Datei wird geladen und in eine VEC-Datei umgewandelt. Die .vec-Datei ist in dem Verzeichnis zu finden, in dem sich auch die SVG-Datei befindet, nur eben mit der Endung .vec (z.B. laempel.svg -> laempel.vec).

    Das Format der VEC-Datei ist unter o.g. Link auf joyceforum.de zu finden.


    Jetzt brauchen wir noch ein Programm um VEC-Dateien auf dem C64 anzuzeigen:


    C64-VECTORDATA1.d64


    Die D64-Datei enthält das C64-Programm DRAWVECTOR und einige VEC-Dateien zum Ausprobieren.


    DRAWVECTOR wurde mit dem Cross-Compiler cc65 in C geschrieben und verwendet die TGI-Bibliothek. Für den Diskettenzugriff wurde stdio verwendet. Anscheinend arbeitet die library nur mit dem Floppy-Kanal 8, daher müssen sich Programm und VEC-Datei(en) auf einer Diskette im Laufwerk 8 befinden, damit alles ordnungsgemäß funktioniert. Ich arbeite an einer Lösung diese Einschränkung aufzuheben; bisher waren meine Versuche jedoch noch nicht von Erfolg gekrönt...


    Die D64-Datei kann man z.B. in einem C64-Emulator wie WinVICE öffnen oder man kopiert sie auf eine Micro-SD-Karte und lädt sie mit 1541 Ultimate II. Mit letzterem Gerät kann man die Dateien auch auf echte Disketten kopieren; dazu habe ich eine Anleitung im Forum64 gefunden:


    Ulitmate 1541 II, disk to image, und image to disk ?

  • FXXS

    Approved the thread.
  • FXXS

    Approved the thread.
  • Jetzt brauchen wir noch ein Programm um VEC-Dateien auf dem C64 anzuzeigen:

    Klasse. Noch toller wäre ein Programm, mit dem man 2D-Vektorgrafiken auf den C64 erstellen könnte. Jetzt gäbe es ja ein Standard-Format.



    (ein ca. 15 Jahre alter Mockup-Screen von mir, natürlich nie umgesetzt worden. Ich hatte mich halt gefragt, ob die C64-Performance beim Editieren einfacherer Grafiken reichen würde.)

  • vielleicht passt es zum Thema

    So halb. Ist halt 3D (wie z.B. auch GigaCAD). Hier geht es eher um 2D-Vektoren, wie z.B. bei Postscript.

  • Das ist ja ne coole Sache! :hatsoff:

    Da hab ich mich natürlich gleich hingesetzt und einen TSB-Viewer für TinyVEC gebastelt. Seitdem sitz ich hier stundenlang vor der Kiste und gucke zu, wie sie mir was vormalt, hehe...! Obercool!


    :thanx: für sowas! Hätte es früher schon gerne geben können! ;-)


    Im Anhang auf D64 das Programm und die ganzen VEC-Bilder von bbock s Distributionsdisk. Es heißt "TSBTinyVECViewer". Zuerst startet ihr "TSB" und ladet dann das Programm rein. Es zeigt das Directory und wartet unten drunter auf den Dateinamen (geht auch ohne ".vec" am Ende). Wenn man nur RETURN eingibt, fragt es, ob man aufhören will. Ansonsten wird das Bild geladen oder besser gesagt: abgearbeitet. Am Ende wird der Rahmen heller und man kann sich das Bild in Ruhe angucken (aber das Malen selber ist das eigentlich Spannende!) Ein Tastendruck beendet das und es fragt wieder, ob man weitermachen will.


    Viel Spaß! (Ich guck jetzt weiter Tinyvec...)

    Arndt

  • Kleiner Bugfix und kleine Verbesserungen:


    Zeile 1530 ändern (15 nach 2 und 2 nach 4, richtige Sekundäradresse, richtige Fehlernummer):

    1530 ifprthenopen1,dr,2,f$:close1:ifstthenpr=0:al=4


    Zeile 160 ändern (12 nach 15, Rahmen ganz hell, sieht besser aus):

    ... colour15,11,0 ...


    Zeile 176 einfügen (Rückmeldung nach jeder Anzeige):

    176 if al<>2 then print at(0,lin+2)"Letztes Bild: '"f$"'"


    bbock : Gibt's bald mehr "Futter"? (Neue Bilder?) <sabber> ;-)


    Arndt

  • @Arndt:

    Es freut mich, dass mein Programm dir gefällt! Aber was ist eigentlich ein TSB-Viewer? Ist das eine bekannte C64-Software? Ich habe die D64-Datei mal kurz im WinVICE ausprobiert (war nicht kompliziert zu bedienen: TSB laden, dann TSBTinyVECViewer laden und einen Dateinamen eingeben). Der Viewer scheint aber langsamer als DRAWVECTOR zu sein.


    Neues "Futter": Der Clou bei TinySVG ist ja, dass man eine Unzahl an SVG-Dateien im Internet findet, die man einfach in VEC-Dateien umwandeln kann. Du findest z.B. eine große Auswahl freier SVG-Dateien unter https://freesvg.org


    Ein paar gezippte SVG-Dateien habe ich hier zur Verfügung gestellt: https://joyceforum.de/viewtopic.php?p=389#p389

  • Die Grafiken können aber nicht gefüllt und farbig umgewandelt werden?

    In den Beispielen ist sowas zumindest nicht zu sehen. Wenn man wirklich eines Tages auf dem C64 auflösungsunabhängige Vektorgrafiken erzeugen könnte, wären solche Funktionen allerdings recht sinnvoll. Man könnte dann z.B. Logos oder einfache Illustrationen direkt auf dem C64 entwerfen/zeichnen. Wenn gefüllte Flächen zu aufwändig wären, um auf dem C64 performant dargestellt zu werden, gäbe es die Möglichkeit, ähnlich den frühen 2D-Vektorprogrammen (z.B. Adobe Illustrator unter V3?), einen schnellen Edit-Mode (ohne Strichstärken, Flächenfüllungen, Farben etc.) und einen langsamen Ansichts-Mode zu implementieren.

  • Aber was ist eigentlich ein TSB-Viewer?

    Oh, TSB ist eine fehlerbereinigte Version von Simons' Basic, Informationen dazu gibt es im C64-Wiki und hier im Forum auch. Der Viewer ist halt ein Basic-Programm, um die TinyVEC-Dateien "abzuspielen". ;-) Ich dachte mir, kann ja nicht schwer sein...

    Der Viewer scheint aber langsamer als DRAWVECTOR zu sein.

    Ja, ist eben reines Basic.


    Da hab ich gleich eine Frage. Die Befehle "Multi-Dot", "Multi-Line" und "Polygon-Fill" hab ich in meinem Viewer nicht implementiert. Erstens, weil sie in keinem der Beispielbilder vorkommen, und zweitens, weil ich nicht genau weiß, was sie bewirken. Ich gehe bis jetzt davon aus, dass "Multi-Dot" am besten mit "Punktwolke" bestimmt werden kann, und "Multi-Line" mit "Linienzug". Stimmt das? Und "Polygon-Fill"? Geschlossener Linienzug, der am Ende gefüllt wird?


    Arndt

  • Die Ergebnisse sehen recht gut aus. Die Grafiken können aber nicht gefüllt und farbig umgewandelt werden?

    Der Vorteil von Vectorgrafiken ist ja ihre freie Skalierbarkeit und der geringere Speicherbedarf.

    Da wäre jetzt eine Einbindung in Geos u.ä. ganz cool.

    TinySVG erzeugt nur "Strichzeichnungen"; Farbe, Gradientenfüllungen, Linienstärken u.v.a.m. werden ignoriert. Es ging mir zunächst nur um eine brauchbare Darstellung von SVG-Grafiken auf 8-Bit-Computern. Vielleicht lassen sich einige Attribute sinnvoll in C64-Grafiken darstellen, aber das würde ein anderes Grafikformat als VEC erfordern und zieht noch eine ganze Liste von Problemen nach sich. Aber wer weiß? Vielleicht gehe ich die Sache mal an. Aktuell muss ich noch einige andere Dinge erledigen, wie z.B. die Unterstützung von <defs> und <symbol> tags. Und dann wäre da noch die Unterstützung von Attributen in CSS, und, und, und...

    Immerhin können viele SVG-Grafiken jetzt ganz gut auf dem Homecomputer dargestellt werden, und das funktioniert bereits mit der aktuellen Version von TinySVG recht zufriedenstellend.

    Wie eine GEOS-Unterstützung aussehen sollte, ist mir nicht ganz klar. Ich muss gestehen, dass ich in meiner Jugend nicht im Commodore-, sondern im Sinclair-"Lager" war. Daher bitte ich um Verzeihung, wenn ich die eine oder andere Selbstverständlichkeit nicht kenne. Seit ein paar Jahren besitze ich aber einige C64 und auch einige dazugehörige Hardware (wie z.B. ein 1541 Ultimate II). Ich bin dabei mich intensiver damit zu beschäftigen - als Schüler reichte mein Taschengeld nicht für so feine Hardware...


    Die Grafiken können aber nicht gefüllt und farbig umgewandelt werden?

    In den Beispielen ist sowas zumindest nicht zu sehen. Wenn man wirklich eines Tages auf dem C64 auflösungsunabhängige Vektorgrafiken erzeugen könnte, wären solche Funktionen allerdings recht sinnvoll. Man könnte dann z.B. Logos oder einfache Illustrationen direkt auf dem C64 entwerfen/zeichnen. Wenn gefüllte Flächen zu aufwändig wären, um auf dem C64 performant dargestellt zu werden, gäbe es die Möglichkeit, ähnlich den frühen 2D-Verktorprogrammen, einen schnellen Edit-Mode (ohne Strichstärken, Flächenfüllungen, Farben etc.) und einen langsamen Ansichts-Mode zu implementieren.

    Man darf nicht vergessen, dass dafür auch die Skalierung der Vektordaten auf dem C64 erforderlich wäre. Das dürfe rechenintensiv und damit langsam werden. DRAWVECTOR zeichnet die Vektoren 1:1; die Skalierung wurde bereits in TinySVG auf dem PC durchgeführt.

  • Oh, TSB ist eine fehlerbereinigte Version von Simons' Basic, Informationen dazu gibt es im C64-Wiki und hier im Forum auch. Der Viewer ist halt ein Basic-Programm, um die TinyVEC-Dateien "abzuspielen". ;-) Ich dachte mir, kann ja nicht schwer sein...

    Das ist ja interessant: ich habe bereits einiges mit Simons' BASIC gemacht und ich habe auch das Steckmodul. Dass Simons' BASIC einige Schwächen (und Fehler) hat, wusste ich bereits. Ich werde mir TSB einmal genauer ansehen. Vielen Dank für die Links!

    Da hab ich gleich eine Frage. Die Befehle "Multi-Dot", "Multi-Line" und "Polygon-Fill" hab ich in meinem Viewer nicht implementiert. Erstens, weil sie in keinem der Beispielbilder vorkommen, und zweitens, weil ich nicht genau weiß, was sie bewirken. Ich gehe bis jetzt davon aus, dass "Multi-Dot" am besten mit "Punktwolke" bestimmt werden kann, und "Multi-Line" mit "Linienzug". Stimmt das? Und "Polygon-Fill"? Geschlossener Linienzug, der am Ende gefüllt wird?

    Das VEC-Format habe ich ursprünglich für die Schneider Joyce (auch Amstrad PCW genannt) entworfen. Dort gibt es ein Grafikpaket, das genau diese Funktionen unterstützt. Für den C64 werden sie - jedenfalls in Verbindung mit TinySVG - nicht gebraucht. Deine Vermutungen bzgl. der Funktionalität sind richtig; offenbar sind sie selbsterklärend. :)

  • Man darf nicht vergessen, dass dafür auch die Skalierung der Vektordaten auf dem C64 erforderlich wäre.

    Je nachdem nicht.

    Rotieren ja, aber *1/2 (ohne Runden) oder *2 etc sind trivial und sehr schnell.

    Auch sowas wie *1.5 (*1/2 + 1) etc ist noch schnell und relativ huebsch auch wenn dann langsam Ungenauigkeiten reinkommen. Ich hatte das damals alles probiert bevor das kleine 4K demo da entstanden war.

    Drehen um 90 Grad geht auch 'direkt' ohne Rechnen. Aber wenn man sich auf eine Groesse von 256*256 beschraenkt braucht man nur einen Table von 256 Bytes um die gesamte Grafik um einen beliebigen Faktor zu verkleinern.

  • Multi-xxx:

    Für den C64 werden sie - jedenfalls in Verbindung mit TinySVG - nicht gebraucht. Deine Vermutungen bzgl. der Funktionalität sind richtig; offenbar sind sie selbsterklärend.

    Ich hab sie schon mal reinprogrammiert, aber mir fehlt Material zum Ausprobieren. Hast du einen Link? Und beim Fill: Wie wird bei der Joyce-Version der Startpunkt bestimmt?


    Arndt

  • Nein, leider nicht. Es gibt bisher auf der ganzen Welt noch keine einzige VEC-Datei, die die Poly-Funktionen nutzt! :D

    TinySVG braucht sie nicht, und andere Programme, die Dateien im VEC-Format erzeugen, gibt es (noch) nicht. Bzgl. des Fill muss ich mir mal die entsprechende Grafik-Routine anschauen. Es ist jedenfalls nicht wie bei Simons' BASIC, wo zuerst das umrahmende Polygon gezeichnet wird und dann die Fill-Routine einen Startpunkt im Inneren des Polygons haben will.

  • (ein ca. 15 Jahre alter Mockup-Screen von mir, natürlich nie umgesetzt worden. Ich hatte mich halt gefragt, ob die C64-Performance beim Editieren einfacherer Grafiken reichen würde.)

    Lustig. Ein Schritt weiter als bei mir. ;-)

    Ich hatte aber auch schon mal ein paar Skizzen dazu und ein bisschen rumprogrammiert (natürlich auf dem C128). Ist aber irgendwo versandet...


    ----------------


    Ich habe schon vor vielen Jahren mit Vektorgrafik experimentiert (auf dem C128 und mit VDC Hires; auf der HE2007 war das nicht neu, aber von dort habe ich einen Text): http://www.c128.net/articles/he2007.htm

    Wir haben damals HPGL-Dateien auf dem Bildschirm und dem Plotter 1520 ausgegeben (SVG war da noch kein Thema).

    Das "Skalierungsproblem" wurde so gelöst wie bei einem 2-Pass-Assembler. Im ersten Run, mit dem Original HPGL-File wurde das analysiert und dann mit Skalierungsfaktoren bereinigt zurückgeschrieben (dabei werden auch verschiedene HPGL-Syntax-Varianten vereinheitlicht). [Das muss man natürlich immer nur einmal machen.] Das so erzeugte File wird dann im 2. Durchgang genutzt, um die Grafik zu zeichnen. Und ja, es macht Spaß dabei zuzusehen...



    Edit: Sehe gerade, dass ich noch Photos aus 2004 habe: http://www.c128.net/album/ht2004/index.htm

  • Witzig: mein erster Ansatz Grafik auf dem CP/M-Rechner Schneider Joyce (= Amstrad PCW) zu erzeugen, war auch mit HP-GL: https://joyceforum.de/viewtopic.php?f=5&t=53


    Hier ist es ein Programm in Turbo Pascal mit Assembler-Routinen. Die Plot-Funktion und den Bresenham-Line-Algorithmus habe ich von Hand in Z80 Assembler entwickelt bzw. optimiert.


    Die 2-pass-Methode bei der Skalierung kommt mir irgendwie bekannt vor... :)