Hier ist das Grafikäquivalent von "Hello, World"
// first OpenVG program
// Anthony Starks ([email protected])
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "VG/openvg.h"
#include "VG/vgu.h"
#include "fontinfo.h"
#include "shapes.h"
int main() {
int width, height;
char s[3];
init(&width, &height); // Graphics initialization
Start(width, height); // Start the picture
Background(0, 0, 0); // Black background
Fill(44, 77, 232, 1); // Big blue marble
Circle(width / 2, 0, width); // The "world"
Fill(255, 255, 255, 1); // White text
TextMid(width / 2, height / 2, "hello, world", SerifTypeface, width / 10); // Greetings
End(); // End the picture
fgets(s, 2, stdin); // look at the pic, end with [RETURN]
finish(); // Graphics cleanup
exit(0);
}
Koordinaten sind VGFloat -Werte, wobei der Ursprung unten links steigt, wobei X nach rechts zunimmt und Y zunimmt. OpenVG gibt Farben als VGFloat-Array an, das rot, grün, blau und Alpha-Werte im Bereich von 0,0 bis 1,0 enthält. In der Regel werden Farben als RGBA angegeben (0-255 für RGB, A von 0,0 bis 1,0))
void WindowClear()
WindowsClear löscht das Fenster, um die zuvor Hintergrundfarbe festzulegen
void AreaClear(unsigned int x, unsigned int y, unsigned int w, unsigned int h)
AreaClear löscht ein bestimmtes Rechteck in Fensterkoordinaten
void WindowOpacity(unsigned int a)
Fensteroopazität legt die Fensterländerkapazität fest
void WindowPosition(int x, int y)
Die Fensterposition bewegt das Fenster in die angegebene Position
void init(int *w, int *h)
Initialisieren Sie die Grafiken: Breite und Höhe der Leinwand werden zurückgegeben. Dies sollte jedes Programm beginnen.
void initWindowSize(int x, int y, unsigned int w, unsigned int h)
Initialisieren mit spezifischen Abmessungen
void finish()
Herunterfahren der Grafiken. Dies sollte jedes Programm beenden.
void Start(int width, int height)
Beginnen Sie das Bild, löschen Sie den Bildschirm mit einem Standard -Weiß, setzen Sie den Schlaganfall und füllen Sie sie auf Schwarz.
void End()
Beenden Sie das Bild und rendern Sie den Bildschirm.
void SaveEnd(char *filename)
Beenden Sie das Bild, rendern Sie den Raster auf dem Bildschirm und speichern Sie den Raster in der benannten Datei als 4-Byte-RGBA-Wörter mit einem Schritt mit Breite*4 Bytes. Das Programm RAW2PNG wandelt den "rohen" Raster in PNG um.
void saveterm(), restoreterm(), rawterm()
Terminaleinstellungen, aktuelle Einstellungen speichern, Einstellungen wiederherstellen, das Terminal in den Rohmodus setzen.
void setfill(float color[4])
Stellen Sie die Füllfarbe ein
void Background(unsigned int r, unsigned int g, unsigned int b)
Füllen Sie den Bildschirm mit der aus RGB -Werten definierten Hintergrundfarbe.
void BackgroundRGB(unsigned int r, unsigned int g, unsigned int b, VGfloat a)
Löscht den Bildschirm mit Alpha zu einer Hintergrundfarbe
void StrokeWidth(float width)
Stellen Sie die Schlaganfallbreite ein.
void RGBA(unsigned int r, unsigned int g, unsigned int b, VGfloat a, VGfloat color[4])
Füllen Sie einen Farbvektor aus den RGBA -Werten.
void RGB(unsigned int r, unsigned int g, unsigned int b, VGfloat color[4])
Füllen Sie einen Farbvektor aus RGB -Werten.
void Stroke(unsigned int r, unsigned int g, unsigned int b, VGfloat a)
Stellen Sie die Schlaganfallfarbe mit RGBA -Werten ein.
void Fill(unsigned int r, unsigned int g, unsigned int b, VGfloat a)
Stellen Sie die Füllfarbe mit RGBA -Werten ein.
void FillLinearGradient(VGfloat x1, VGfloat y1, VGfloat x2, VGfloat y2, VGfloat *stops, int n)
Stellen Sie die Füllung auf einen linearen Gradienten ein, der durch (x1, y1) und (x2, y2) begrenzt ist. Verwenden von Offsets und Farben, die in n Anzahl von Stopps angegeben sind
void FillRadialGradient(VGfloat cx, VGfloat cy, VGfloat fx VGfloat fy, VGfloat r, VGfloat *stops, int n)
Stellen Sie die Füllung auf einen radialen Gradienten ein, der auf (CX, CY) mit dem Radius R und dem Schwerpunkt bei (FX, RY) zentriert ist, und unter Verwendung von Offsets und Farben, die in der N -Anzahl von Stopps angegeben sind
void Line(VGfloat x1, VGfloat y1, VGfloat x2, VGfloat y2)
Zeichnen Sie eine Linie zwischen (x1, y1) und (x2, y2).
void Rect(VGfloat x, VGfloat y, VGfloat w, VGfloat h)
Zeichnen Sie ein Rechteck mit seinem Ursprung (unter links) bei (x, y), und die Größe ist (Breite, Höhe).
void RectOutline(VGfloat x, VGfloat y, VGfloat w, VGfloat h)
Umrissene Version
void Roundrect(VGfloat x, VGfloat y, VGfloat w, VGfloat h, VGfloat rw, VGfloat rh)
Zeichnen Sie ein abgerundetes Rechteck mit seinem Ursprung (unter links) bei (x, y) und Größe ist (Breite, Höhe).
Die Breite und Höhe der Ecken werden mit (RW, RH) angegeben.
void RoundrectOutline(VGfloat x, VGfloat y, VGfloat w, VGfloat h, VGfloat rw, VGfloat rh)
Umrissene Version
void Polygon(VGfloat *x, VGfloat *y, VGint n)
Zeichnen Sie ein Polygon mit den Koordinaten in Arrays, auf die durch x und y gerichtet ist. Die Anzahl der Koordinaten ist n.
void Polyline(VGfloat *x, VGfloat *y, VGint n)
Zeichnen Sie eine Polylinie unter Verwendung der Koordinaten in Arrays, auf die durch x und y gerichtet ist. Die Anzahl der Koordinaten ist n.
void Circle(VGfloat x, VGfloat y, VGfloat d)
Zeichnen Sie einen Kreis, der bei (x, y) mit Durchmesser d zentriert ist.
void CircleOutline(VGfloat x, VGfloat y, VGfloat r)
Umrissene Version
void Ellipse(VGfloat x, VGfloat y, VGfloat w, VGfloat h)
Zeichnen Sie eine Ellipse, die auf (x, y) mit Radien (W, H) zentriert ist.
void EllipseOutline(VGfloat x, VGfloat y, VGfloat w, VGfloat h)
Umrissene Version
void Qbezier(VGfloat sx, VGfloat sy, VGfloat cx, VGfloat cy, VGfloat ex, VGfloat ey)
Zeichnen Sie eine quadratische Bezier -Kurve, die mit (SX, SY) mit den Kontrollpunkten bei (CX, Cy) ab (Ex, EY) endet.
void QbezierOutline(VGfloat sx, VGfloat sy, VGfloat cx, VGfloat cy, VGfloat ex, VGfloat ey)
Umrissene Version
void Cbezier(VGfloat sx, VGfloat sy, VGfloat cx, VGfloat cy, VGfloat px, VGfloat py, VGfloat ex, VGfloat ey)
Zeichnen Sie eine kubische Bezier -Kurve ab (SX, SY) unter Verwendung von Kontrollpunkten bei (cx, cy) und (px, py) und enden mit (ex, ey).
void CbezierOutline(VGfloat sx, VGfloat sy, VGfloat cx, VGfloat cy, VGfloat px, VGfloat py, VGfloat ex, VGfloat ey)
Umrissene Version
void Arc(VGfloat x, VGfloat y, VGfloat w, VGfloat h, VGfloat sa, VGfloat aext)
Zeichnen Sie einen elliptischen Bogen, der auf (x, y) zentriert ist, mit Breite und Höhe bei (w, h). Startwinkel (Grad) ist SA, Winkelausmaß ist Aext.
void ArcOutline(VGfloat x, VGfloat y, VGfloat w, VGfloat h, VGfloat sa, VGfloat aext)
Umrissene Version
void Text(VGfloat x, VGfloat y, char* s, Fontinfo f, int pointsize)
Zeichnen Sie den Text srtring (s) an der Stelle (x, y) unter Verwendung von Punkte.
void TextMid(VGfloat x, VGfloat y, char* s, Fontinfo f, int pointsize)
Zeichnen Sie den Text srtring (s) am Standort (x, y) unter Verwendung von Punkte.
void TextEnd(VGfloat x, VGfloat y, char* s, Fontinfo f, int pointsize)
Zeichnen Sie den Text Srtring (s) mit seinem Kredit, der an die Position (x, y) ausgerichtet ist, unter Verwendung von Punkte
VGfloat TextWidth(char *s, Fontinfo f, int pointsize)
Geben Sie die SMS -Breite zurück
VGfloat TextHeight(Fontinfo f, int pointsize)
Geben Sie die Höhe einer Schriftart zurück
TextDepth(Fontinfo f, int pointsize)
Geben Sie die Entfernung einer Schrift über die Grundlinie hinaus.
void Image(VGfloat x, VGfloat y, int w, int h, char * filename)
Platzieren Sie ein JPEG -Bild mit Abmessungen (W, H) bei (x, y).
void Translate(VGfloat x, VGfloat y)
Übersetzen Sie das Koordinatensystem in (x, y).
void Rotate(VGfloat r)
Drehen Sie das Koordinatensystem um Winkel R (Grad).
void Scale(VGfloat x, VGfloat y)
Skalierung durch x, y.
void Shear(VGfloat x, VGfloat y)
Scher durch die Winkel x, y.
void ClipRect(VGint x, VGint y, VGint w, VGint h)
Begrenzen Sie das Zeichnen des Zeichnungsbereichs auf das angegebene Rechteck, enden Sie mit Clipend ()
void ClipEnd()
Ende des Ausschnittsbereichs
Ebenfalls enthalten ist das FONT2OPENVG -Programm, das Schriftinformationen in C -Quelle verwandelt, die Sie in Ihr Programm einbetten können. Das Makefile erstellt Schriftarten aus Dateien, die in/usr/share/fonts/trueType/ttf-dejavu/gefunden wurden. Wenn Sie andere Schriftarten verwenden möchten, passen Sie die Makefile entsprechend an oder generieren Sie den Schriftcode selbst, sobald das Programm font2openvg erstellt wurde.
Font2OpenVG nimmt drei Argumente ein: die TrueType -Schriftart, die zu enthaltene Ausgabedatei und das Präfix für Bezeichner. Zum Beispiel zur Verwendung der Dejavu sans Schriftart:
./font2openvg /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf DejaVuSans.inc DejaVuSans
und fügen Sie den generierten Code in Ihr Programm auf:
#include "DejaVuSans.inc"
Fontinfo DejaFont
Die Lastfont -Funktion erstellt OpenVG -Pfade aus den Schriftartdaten:
loadfont(DejaVuSans_glyphPoints,
DejaVuSans_glyphPointIndices,
DejaVuSans_glyphInstructions,
DejaVuSans_glyphInstructionIndices,
DejaVuSans_glyphInstructionCounts,
DejaVuSans_glyphAdvances,
DejaVuSans_characterMap,
DejaVuSans_glyphCount);
Die Funktion Entlowfont gibt die Pfadinformationen frei:
unloadfont(DejaFont.Glyphs, DejaFont.Count);
Beachten Sie, dass der Speicherort der Schriftartdateien unterschiedlich sein kann. (Der aktuelle Standort für Jessie ist/usr/share/fonts/trueType/ttf-dejavu) Verwenden Sie die Variable Fontlib Makefile, um diesen Ort anzupassen.
Beachten Sie, dass Sie mindestens 64 mbytes GPU -RAM benötigen : . Sie benötigen auch die Dejavu -Schriftarten sowie die JPEG- und Freetyp -Bibliotheken. Das Einrückungs -Tool ist auch für die Codeformatierung nützlich. Installieren Sie sie über:
pi@raspberrypi ~ $ sudo apt-get install libjpeg8-dev indent libfreetype6-dev ttf-dejavu-core
Erstellen Sie als nächstes die Bibliothek und testen Sie:
pi@raspberrypi ~ $ git clone git://github.com/ajstarks/openvg
pi@raspberrypi ~ $ cd openvg
pi@raspberrypi ~/openvg $ make
g++ -I/usr/include/freetype2 fontutil/font2openvg.cpp -o font2openvg -lfreetype
./font2openvg /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf DejaVuSans.inc DejaVuSans
224 glyphs written
./font2openvg /usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf DejaVuSansMono.inc DejaVuSansMono
224 glyphs written
./font2openvg /usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf DejaVuSerif.inc DejaVuSerif
224 glyphs written
gcc -O2 -Wall -I/opt/vc/include -I/opt/vc/include/interface/vmcs_host/linux -I/opt/vc/include/interface/vcos/pthreads -c libshapes.c
gcc -O2 -Wall -I/opt/vc/include -I/opt/vc/include/interface/vmcs_host/linux -I/opt/vc/include/interface/vcos/pthreads -c oglinit.c
pi@raspberrypi ~/openvg/client $ cd client
pi@raspberrypi ~/openvg/client $ make test
cc -Wall -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -o shapedemo shapedemo.c ../libshapes.o ../oglinit.o -L/opt/vc/lib -lGLESv2 -ljpeg
./shapedemo demo 5
Das Programm "Shapedemo" trainiert eine hochrangige API, die auf OpenVG in libshapes.C aufgebaut ist.
./shapedemo # show a reference card
./shapedemo raspi # show a self-portrait
./shapedemo image # show four test images
./shapedemo astro # the sun and the earth, to scale
./shapedemo text # show blocks of text in serif, sans, and mono fonts
./shapedemo rand 10 # show 10 random shapes
./shapedemo rotate 10 a # rotated and faded "a"
./shapedemo test "hello, world" # show a test pattern, with "hello, world" at mid-display in sans, serif, and mono.
./shapedemo fontsize # show a range of font sizes (per <https://speakerdeck.com/u/idangazit/p/better-products-through-typography>)
./shapedemo demo 10 # run through the demo, pausing 10 seconds between each one; contemplate the awesome.
So installieren Sie die Shapes-Bibliothek als systemweite gemeinsame Bibliothek
pi@raspberrypi ~/openvg $ make library
pi@raspberrypi ~/openvg $ sudo make install
Die OpenVG -Shapes -Bibliothek kann jetzt in C -Code verwendet werden, indem Formen und fontinfo.h und die Verknüpfung mit libshapes.So:
#include <shapes.h>
#include <fontinfo.h>
pi@raspberrypi ~ $ gcc -I/opt/vc/include -I/opt/vc/include/interface/vmcs_host/linux -I/opt/vc/include/interface/vcos/pthreads anysource.c -o anysource -lshapes
pi@raspberrypi ~ $ ./anysource
Eine Go -Programmiersprache für die Bibliothek findet sich in openvg.go. Beispielclients befinden sich im Verzeichnis. Die API folgt genau der C -API; Hier ist das Programm "Hallo, Welt" in Go:
Die Go -API
package main
import (
"bufio"
"github.com/ajstarks/openvg"
"os"
)
func main() {
width, height := openvg.Init() // OpenGL, etc initialization
w2 := openvg.VGfloat(width / 2)
h2 := openvg.VGfloat(height / 2)
w := openvg.VGfloat(width)
openvg.Start(width, height) // Start the picture
openvg.BackgroundColor("black") // Black background
openvg.FillRGB(44, 77, 232, 1) // Big blue marble
openvg.Circle(w2, 0, w) // The "world"
openvg.FillColor("white") // White text
openvg.TextMid(w2, h2, "hello, world", "serif", width/10) // Greetings
openvg.End() // End the picture
bufio.NewReader(os.Stdin).ReadBytes('n') // Pause until [RETURN]
openvg.Finish() // Graphics cleanup
}
Um den Wrapper zu bauen: (Stellen Sie sicher, dass Gopath eingestellt ist)
pi@raspberrypi ~/openvg $ go install .
pi@raspberrypi ~/openvg $ cd go-client/hellovg
pi@raspberrypi ~/openvg/go-client/hellovg $ go build .
pi@raspberrypi ~/openvg/go-client/hellovg $ ./hellovg