cairo-Wrapper in neuer Version

20/05/2010 - 07:13 von Schmidt | Report spam
Hallo alle zusammen,

aus den bereits avisierten "ein paar Tagen" sind nun doch
wieder einige wenige mehr geworden <g> - und im "größeren
Widget- und Kompiler-Fahrplan" hàng ich ja nun bereits ein
Jahr hinterher - aber ich hoffe, das aktuelle "Zwischen-Resultat"
hier entschàdigt etwas.

Für diejenigen, welche noch überhaupt nicht mit den
Vorversionen herumgespielt haben...
hier der Link zu den neuen Binaries und Demos:
www.thecommon.net/3.html
oder direkt per:
www.datenhaus.de/Downloads/dhRichClient3.zip
www.datenhaus.de/Downloads/VB-cairoTutorial.zip

(.. und als kurze Einführung):

cairo ist eine Bibliothek für 2D-Vektor-Grafik, welche antialiased
Rendering von "Grafik-Primitiven" zulàsst - und hierbei
auf "nicht-Integer-Koordinaten" (normale Double-Parameter)
zurückgreift, somit also SubPixel-Genauigkeit bietet.
Aber auch das Handhaben von "Pixel-Files" und "InMemory-
Bitmap-Haufen" ist integriert - genau wie alle möglichen
Arten von Blending-Operationen, Gradienten, Masking,
Clipping usw.

Ok, was ist neu im Vergleich zu den Vorversionen des Wrappers:
- Zunàchst mal ein umfangreiches (und für meine Verhàltnisse
erschöpfend kommentiertes <g>) englisches Tutorial, welches
sich über 1-20 numerierte Ordner erstreckt (jeder Ordner
enthàlt ein einfaches VB-Projekt und ist in keiner Weise "über
Kreuz" abhàngig von Dateien in anderen Tutorial-Foldern).
Bei der Reihenfolge habe ich versucht, einen Fluss von
"leicht verstàndlich" - hin zu "schon 'was schwieriger" aufrecht
zu erhalten ;-) - hoffe das ist mir gelungen - falls nicht, bitte
einfach "Info geben", an welcher Stelle ich Euch verloren habe.
Falls das beispielsweise zwischen Ordner 8 und 9 passieren sollte,
so ein kleiner "Schritt 8b"-Tutorial-Folder ist dann schnell eingefügt.
Ordner 1 - 19 behandeln ausschließlich das Anwenden der versch.
cairo-Zeichenoperationen - direkt mittels normalem VB-code
und normalen VB-controls.
Wer sich schonmal vorab ein Auge voll holen will, um was es
da unter Anderem geht, kann sich z.B. das hier mal anschau'n:
http://people.mozilla.com/~vladimir/demos/photos.svg
(geht glaub ich nicht mit dem IE - der benötigt ein SVG-plugin
damit das làuft - besser FireFox & Co. verwenden)
Auf jeden Fall ist sowas jetzt mit wenigen Zeilen Code (Demo #12)
auch in VBclassic möglich (sogar mit leicht besserer Performance).
Andere interessante Tutorial-Themen (auszugsweise):
Verschiedene BSpline-Typen (Demo #6)
Text entlang von Kurven (Demo #7)
verschiedenste Gradient-Typen (Demo #9)
Alpha-JPGs (Demo #13)
direkte PDF-Generierung (Demo #17)
für u.a. 2D-Game-Developer interessant (Demos #18 und #19)
welche mit der jetzt integrierten chipmunk-physicsengine interagieren.

- Tutorial-Folder 20 enthàlt nun endlich die erste (zunàchst
mal sehr einfach gehaltene) Widgets-Demo, um überhaupt
erstmal das Einarbeiten in die Thematik zu ermöglichen.
Wàhrend Interessierte sich also mit dem Studium des Tutorials
und dem Selbstbau von ersten Widgets beschàftigen, kann
ich dann die nàchsten Wochen mehr Widget-relevante Tutorial-
Ordner nachschieben, so jedenfalls der Plan. ;-)

- SVG-support ist jetzt integriert (direkt in VB6 geschrieben,
da die librsvg ziemlich groß ist, und das Ganze zu sehr aufgeblàht
hàtte) - von den tausenden SVG-Icons des modernen Oxygen-
Iconsets (jetzt unter LGPL auch kommerziell verwendbar)
werden jedenfalls nur noch eine Handvoll inkorrekt
gerendert - Ziel erreicht.

- JPG-support ist jetzt ebenfalls drin - und zwar nicht einfach "der
Erstbeste", sondern die (noch relativ unbekannte) "libjpeg-turbo"
welche calling-compatibel ist zur normalen libjpeg - aber im
Schnitt beim De- und Encodieren faktor 3-4 schneller arbeitet
(auch im Vergleich zu den OleLoadPicture-Funktionen von
Windows) - das ist also "Intel-JPG-Lib"-Performance-Niveau -
aber ohne jede Einschrànkung frei nutzbar - für schnelles Thumb-
nailing der heute üblichen Jpg-Foto-Dimensionen ist ebenfalls ein
16tel, 8tel usw. Modus eingebaut - entspr. Demo ist im Tutorial.

- Da "JPG nun super-schnell ist", wurde der Wrapper gleich um
ein proprietàres feature erweitert, welches "nicht standardisiert"
ist, in meinen Augen aber viel Sinn macht: Alpha-JPGs.
Aktuell benutzt jeder für seine Alpha-Kanal-resourcen entweder
*.ico oder (eher im Web oder in OpenSource-Apps beheimatet)
*.png bzw. *.svg - bitte Demo anschauen, was die Unterschiede
zu *.png Alpha-resourcen genauer ausmacht.

- BSpline-support ist jetzt ebenfalls enthalten - und zwar auf sehr
komfortable Weise nutzbar - einfach als ein einzelner (Optionaler)
Enum-Parameter auf der (ebenfalls neuen) Polygon-Render-
Funktion zuschaltbar (in verschiedenen "Dàmpfungsgraden").
Und da wir gerade bei Polygon-Funktionen sind - eine Zeichen-
funktion für "regulàre Shapes" (z.B. Penta- oder Hexa- "gramme
und "gone" - also gleichmàßige Vielecke in allen Auspràgungen)
ist ebenfalls integriert (BSpline-Dàmpfung auch hier zuschaltbar).

- Für die normalen cairo-Gradienten-Funktionen sind jetzt
verschiedene zusàtzliche Bequemlichkeits-Funktionen zum
Addieren "kompliziert zu erzeugender" ColorStop-Sequenzen
vorhanden (z.B. Two- and Three-Color-Stop-Gaussians - aka
TwoColorBell, ThreeColorBell).

- Ebenfalls eingebaut in die Wrapper PixelSurfaces ist jetzt ein
schneller (mittels VB6! implementierter) Gaussian Blur, von
dem vor allem die komplexeren SVGs gerne Gebrauch machen
(Stichwort: "echte Dropshadows").

- Uploading von PixelSurfaces in DirectX-Surfaces - für (von
dort aus) schnelles und qualitativ hochwertiges Up/Down-Stretching
auf normale FensterHandles - das Feature funktioniert unabhàngig
von dx7vb.dll & Co. auch auf Windows7 und Vista - alles dafür
Nötige (eigentlich nur die leicht angepasste DX-Typelib von
Patrice Scribe) ist bereits in dhCairo.dll enthalten - und die ist
ja per DirectCOM.dll auch regfree benutzbar "wie man weiss" ;-)
Das Feature ist vor allem für "von den Dimensionen her feststehende"
Pixel-Haufen interessant, wie z.B. Video-Dekodieren in eine
(PAL-) 720x576 Surface - dortiges semitransparentes "Übermalen"
mittels cairo - Upload als DirectX-Textur - schnelles, finales
"stretched DX-Blitting zu entweder FullScreen-Windows oder
normalen Fenstern in beliebiger "Stretch-Zielgröße".

- chipmunk-physics engine ... hab' ne Weile überlegt, ob ich das
direkt integriere - aber "aus Attraktivitàtsgründen" speziell für
jüngere Entwickler (und wir brauchen doch Nachwuchs in der
Gemeinde oder? ;-)) dann einfach mal gemacht - alles komfortabel
benutzbar über entsprechende Klassen - und wie üblich (nach dem
"COM-Wrappen") - keine Probleme mehr mit Handle-Freeing usw.
Das Resultat sieht jedenfalls mal sehr gut aus - cairo und chipmunk
passen sehr gut zueinander - beide arbeiten SubPixel-genau mit
Double-Koordinaten, und die Performance-Aufteilung zwischen
Kollisions-Berechnung und anschließendem Rendering-Aufwand
per cairo liegt bei komplexen Simulationen etwa bei 1:1. Hier
mal ein paar links, was man mit chipmunk so alles machen kann
(die VB-Demos sind aber mindestens genau so gut, ehrlich jetzt...;-):
http://www.youtube.com/watch?v=V1xiVyJ3EOM
http://www.youtube.com/watch?v=sTHoWaTNJiA

- und letztlich eine ganze Reihe zusàtzlicher Bequemlichkeits-Funktionen
mit dem Ziel: "weniger Sourcecode pro Grafik-Effekt" - also kurz:
Alles was mir beim Schreiben der Demo-Tutorials "zu umstàndlich"
vorkam, hab' ich versucht auf irgendeine Art "kürzer hinzubekommen" -
das Tutorial enthàlt also jetzt bereits "optimalen Best-Practise-Code"
für das Arbeiten gegen cairo - zum An- und Abschauen.

Generell wàre zu sagen, (gilt ja ebenso für die .NETler
mit ihrer neuen WPF-Vektor-engine), dass das Ganze nicht
ohne Einarbeitung, nicht "umsonst zu haben" ist. Dass die
Toolset-Libs (regfree mode hin oder her) natürlich ein
zusàtzliches Deployment-Volumen bedeuten (gezippt so
um die 1.6MByte) soll an der Stelle ebenfalls nicht unerwàhnt
bleiben (allerdings ist in dem Volumen auch eine komplette
DB-Engine mit drin - ebenso wie der ganze Rest des bereits
bekannten "RichClient3-Infrastruktur-Zeugs).

Warum (bzgl. moderner Grafik) nun aber in cairo und nicht
z.B. in GDI+ einarbeiten? ... Ein paar (subjektiv natürlich)
Argumente:
Cairo bietet IMO das komplettere Interface und darüber hinaus
mehr Surface-Typen - die wohl wichtigste ist neben Pixel-Surfaces
die direkt unterstützte PDF-surface (ansprechbar über die
exakt selben Drawing-Calls wie bei Pixel-Surfaces).
Das cairo-API is IMO übersichtlicher und einfacher zu erlernen -
zumal wenn verfügbar über bereits erprobte VB-Klassen und
Intellisense.
Trotz der VB-Klassen Zwischenschicht ist das Erlernte
auch in anderen Sprachen verwendbar - wer z.B. online
eines der zahlreichen cairo-Beispiele mit einem interessanten
Effekt aufgestöbert hat (egal ob jetzt in Java, Python oder
C verfasst) - hat in aller Regel sehr wenig Probleme, den
Code nach "VB-wrapper-code" zu übersetzen - hab mich
jedenfalls bemüht, die Methoden-Namen identisch zum
"ganz normalen cairo-API" zu halten in den Wrapper-Klassen.
Cairo wird derzeit auf einer sehr großen Zahl von Plattformen
eingesetzt, es existieren eine ganze Menge an Bindings zu
den verschiedensten Programmiersprachen.
Dass cairo auch von den Firefox-Entwicklern als rendering-
engine benutzt wird, sorgt für beschleunigte Entwicklung
der cairo-features - z.B. kommt Ende des Jahres (zusammen
mit Firefox 4) ein neues Backend für cairo auf der Windows-
platform, welches dann unter der Haube Direct2D und
DirectWrite benutzt (auf Vista und Win7-systemen).
Sobald das "offiziell verfügbar" in den Source-Repositories
steht, brauche ich nur eine neue Version der aktuellsten
cairo2_engine.dll zu erstellen - am Interface der wrappenden
dhCairo.dll muss dann überhaupt nix geàndert werden -
der Zugriff auf diese modernen Windows-Backends erfolgt
dann automatisch - ausser noch höherer Performance - und
(wahrscheinlich nur bemerkbar bei Text-Rendering) - noch
"Windows-konformerem Output" àndert sich an den VB-
Sourcen (oder bereits erstellten Kompilaten) überhaupt nix.

Also aus einer Reihe verschiedener Blickwinkel (aus meiner
persönlichen Sicht) "rundum empfehlenswert" das Ganze...
Also stürzt Euch rein... oder so... was einfacher Benutzbares
für VBclassic bzgl. moderner Grafik-Ausgabe gibt es nicht
mehr in diesem Jahrtausend (ausser bei OBI - aber das war
jetzt glaub ich aus einer anderen "Werbung"... ;-))


Olaf
 

Lesen sie die antworten

#1 G.Wietzorek
20/05/2010 - 09:26 | Warnen spam
Am 20.05.2010 07:13, schrieb Schmidt:
Hallo alle zusammen,
- Zunàchst mal ein umfangreiches (und für meine Verhàltnisse
erschöpfend kommentiertes <g>) englisches Tutorial, welches
sich über 1-20 numerierte Ordner erstreckt (jeder Ordner
enthàlt ein einfaches VB-Projekt und ist in keiner Weise "über
Kreuz" abhàngig von Dateien in anderen Tutorial-Foldern).

Olaf



Hallo Olaf,

leider schmiert unter Win7 die IDE beim ausführen bereits des ersten
Beispiels kommentarlos (nur mit der üblichen nichtssagenden Win7
Fehlermeldung 'wird nicht korrekt ausgeführt' oder so) ab.

Unter XP gibt es (im 1. Beispiel) die Fehlermeldung

'Illegal Instruction'

in der Zeile

Set Srf = Cairo.CreateSurface(200, 100, ImageSurface)

in Form_Click und man muss die Ausführung abbrechen...

Habe alle DLLs des Toolsets in ein gemeinsames Verzeichnis kopiert
(nicht Sys, sondern ein Ordner unterhalb CF, wie bisher auch) und die AX
DLLs in diesem Ordner auch registriert.

Irgendeine Erklàrung hierfür? Sieht für mich nach einem Problem in der
cairo2_engine.dll oder dhcairo.dll aus.

Oder braucht es außer dem Toolset noch weitere Bibliotheken, die sich
auf meinen Entwicklungsrechnern nicht befinden?


Gert

Ähnliche fragen