Aquí está el equivalente gráfico de "Hola, mundo"
// 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);
}
Las coordenadas son valores VGFloat, con el origen en la parte inferior izquierda, con X aumentando hacia la derecha e y aumentando. OpenVG especifica los colores como una matriz VGFloat que contiene valores rojo, verde, azul y alfa que van de 0.0 a 1.0, pero típicamente los colores se especifican como RGBA (0-255 para RGB, A de 0.0 a 1.0)
void WindowClear()
Windowclear borra la ventana al color de fondo establecido previamente
void AreaClear(unsigned int x, unsigned int y, unsigned int w, unsigned int h)
AreaClear Clears Un rectángulo dado en las coordenadas de la ventana
void WindowOpacity(unsigned int a)
WindowPacity establece la opacidad de la ventana
void WindowPosition(int x, int y)
La posición de la ventana mueve la ventana a la posición dada
void init(int *w, int *h)
Inicialice los gráficos: se devuelven el ancho y la altura del lienzo. Esto debería comenzar cada programa.
void initWindowSize(int x, int y, unsigned int w, unsigned int h)
Inicializarse con dimensiones específicas
void finish()
Apague los gráficos. Esto debería finalizar cada programa.
void Start(int width, int height)
Comience la imagen, borre la pantalla con un blanco predeterminado, configure el trazo y llene en negro.
void End()
Termine la imagen, renderizando a la pantalla.
void SaveEnd(char *filename)
Finalice la imagen, renderizando a la pantalla, guarde el ráster en el archivo nombrado como palabras RGBA de 4 bytes, con un paso de ancho*4 bytes. El programa RAW2PNG convierte el trama "RAW" en PNG.
void saveterm(), restoreterm(), rawterm()
Configuración de terminal, Guardar configuraciones actuales, configuración de restauración, colocar el terminal en modo RAW.
void setfill(float color[4])
Establezca el color de relleno
void Background(unsigned int r, unsigned int g, unsigned int b)
Llene la pantalla con el color de fondo definido de los valores RGB.
void BackgroundRGB(unsigned int r, unsigned int g, unsigned int b, VGfloat a)
borra la pantalla a un color de fondo con alfa
void StrokeWidth(float width)
Establezca el ancho del trazo.
void RGBA(unsigned int r, unsigned int g, unsigned int b, VGfloat a, VGfloat color[4])
Llene un vector de color de los valores RGBA.
void RGB(unsigned int r, unsigned int g, unsigned int b, VGfloat color[4])
Llene un vector de color de los valores RGB.
void Stroke(unsigned int r, unsigned int g, unsigned int b, VGfloat a)
Establezca el color del trazo con los valores RGBA.
void Fill(unsigned int r, unsigned int g, unsigned int b, VGfloat a)
Establezca el color de relleno usando los valores RGBA.
void FillLinearGradient(VGfloat x1, VGfloat y1, VGfloat x2, VGfloat y2, VGfloat *stops, int n)
Establezca el relleno en un gradiente lineal limitado por (x1, y1) y (x2, y2). Uso de compensaciones y colores especificados en n número de paradas
void FillRadialGradient(VGfloat cx, VGfloat cy, VGfloat fx VGfloat fy, VGfloat r, VGfloat *stops, int n)
Establezca el relleno en un gradiente radial centrado en (CX, CY) con radio R y punto focal en (FX, RY), utilizando compensaciones y colores especificados en N número de paradas
void Line(VGfloat x1, VGfloat y1, VGfloat x2, VGfloat y2)
Dibuja una línea entre (x1, y1) y (x2, y2).
void Rect(VGfloat x, VGfloat y, VGfloat w, VGfloat h)
Dibuje un rectángulo con su origen (abajo a la izquierda) en (x, y), y el tamaño es (ancho, altura).
void RectOutline(VGfloat x, VGfloat y, VGfloat w, VGfloat h)
Versión describida
void Roundrect(VGfloat x, VGfloat y, VGfloat w, VGfloat h, VGfloat rw, VGfloat rh)
Dibuje un rectángulo redondeado con su origen (abajo a la izquierda) en (x, y), y el tamaño es (ancho, altura).
El ancho y la altura de las esquinas se especifican con (RW, HR).
void RoundrectOutline(VGfloat x, VGfloat y, VGfloat w, VGfloat h, VGfloat rw, VGfloat rh)
Versión describida
void Polygon(VGfloat *x, VGfloat *y, VGint n)
Dibuje un polígono usando las coordenadas en matrices apuntadas por x e y. El número de coordenadas es n.
void Polyline(VGfloat *x, VGfloat *y, VGint n)
Dibuje una polilínea utilizando las coordenadas en matrices apuntadas por x e y. El número de coordenadas es n.
void Circle(VGfloat x, VGfloat y, VGfloat d)
Dibuja un círculo centrado en (x, y) con diámetro d.
void CircleOutline(VGfloat x, VGfloat y, VGfloat r)
Versión describida
void Ellipse(VGfloat x, VGfloat y, VGfloat w, VGfloat h)
Dibuja una elipse centrada en (x, y) con radios (W, H).
void EllipseOutline(VGfloat x, VGfloat y, VGfloat w, VGfloat h)
Versión describida
void Qbezier(VGfloat sx, VGfloat sy, VGfloat cx, VGfloat cy, VGfloat ex, VGfloat ey)
Dibuja una curva de Bezier cuadrática que comienza en (SX, SY), usando puntos de control en (CX, CY), que termina en (Ex, EY).
void QbezierOutline(VGfloat sx, VGfloat sy, VGfloat cx, VGfloat cy, VGfloat ex, VGfloat ey)
Versión describida
void Cbezier(VGfloat sx, VGfloat sy, VGfloat cx, VGfloat cy, VGfloat px, VGfloat py, VGfloat ex, VGfloat ey)
Dibuja una curva de Bezier cúbica que comienza en (SX, SY), usando puntos de control en (CX, CY) y (PX, PY), que terminan en (Ex, EY).
void CbezierOutline(VGfloat sx, VGfloat sy, VGfloat cx, VGfloat cy, VGfloat px, VGfloat py, VGfloat ex, VGfloat ey)
Versión describida
void Arc(VGfloat x, VGfloat y, VGfloat w, VGfloat h, VGfloat sa, VGfloat aext)
Dibuje un arco elíptico centrado en (x, y), con ancho y altura en (W, H). El ángulo de inicio (grados) es SA, la extensión del ángulo es un texto.
void ArcOutline(VGfloat x, VGfloat y, VGfloat w, VGfloat h, VGfloat sa, VGfloat aext)
Versión describida
void Text(VGfloat x, VGfloat y, char* s, Fontinfo f, int pointsize)
Dibuje un Srtring (s) de texto en la ubicación (X, Y), usando Pointsize.
void TextMid(VGfloat x, VGfloat y, char* s, Fontinfo f, int pointsize)
Dibuje un Srtring (s) de texto en la ubicación (X, Y), usando Pointsize.
void TextEnd(VGfloat x, VGfloat y, char* s, Fontinfo f, int pointsize)
Dibuje un texto de texto con su préstamo alineado con la ubicación (x, y), usando PointSize
VGfloat TextWidth(char *s, Fontinfo f, int pointsize)
Devuelve el ancho del texto
VGfloat TextHeight(Fontinfo f, int pointsize)
Devolver la altura de una fuente
TextDepth(Fontinfo f, int pointsize)
Devuelve la distancia de una fuente más allá de la línea de base.
void Image(VGfloat x, VGfloat y, int w, int h, char * filename)
Coloque una imagen JPEG con dimensiones (W, H) en (x, y).
void Translate(VGfloat x, VGfloat y)
Traducir el sistema de coordenadas a (x, y).
void Rotate(VGfloat r)
Gire el sistema de coordenadas alrededor del ángulo R (grados).
void Scale(VGfloat x, VGfloat y)
Escala por x, y.
void Shear(VGfloat x, VGfloat y)
Corte por los ángulos x, y.
void ClipRect(VGint x, VGint y, VGint w, VGint h)
Límite de dibujo el área de dibujo al rectángulo especificado, finalice con ClipEd ()
void ClipEnd()
Área de recorte de extremos
También se incluye el programa Font2OpenVG, que convierte la información de fuentes en una fuente C que puede incrustar en su programa. El Makefile realiza el código de fuente a partir de archivos encontrados en/usr/share/fonts/trueType/ttf-DeJavu/. Si desea usar otras fuentes, ajuste el File en consecuencia, o genere el código de fuentes por su cuenta una vez que se construya el programa FONT2OPENVG.
Font2OpenVG toma tres argumentos: el archivo de fuentes TrueType, el archivo de salida que se incluirá y el prefijo de identificadores. Por ejemplo, para usar la fuente DeJavu Sans:
./font2openvg /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf DejaVuSans.inc DejaVuSans
e incluya el código generado en su programa:
#include "DejaVuSans.inc"
Fontinfo DejaFont
La función LoadFont crea rutas OpenVG desde los datos de fuentes:
loadfont(DejaVuSans_glyphPoints,
DejaVuSans_glyphPointIndices,
DejaVuSans_glyphInstructions,
DejaVuSans_glyphInstructionIndices,
DejaVuSans_glyphInstructionCounts,
DejaVuSans_glyphAdvances,
DejaVuSans_characterMap,
DejaVuSans_glyphCount);
La función DescargueFont libera la información de la ruta:
unloadfont(DejaFont.Glyphs, DejaFont.Count);
Tenga en cuenta que la ubicación de los archivos de fuentes puede diferir. (La ubicación actual para Jessie IS/USR/Share/Fonts/TrueType/TTF-DeJavu) Use la variable FontLib Makefile para ajustar esta ubicación.
Tenga en cuenta que necesitará al menos 64 Mbytes de RAM GPU : . También necesitará las fuentes DeJavu, y las bibliotecas JPEG y FreeType. La herramienta de sangría también es útil para el formato de código. Instalarlos a través de:
pi@raspberrypi ~ $ sudo apt-get install libjpeg8-dev indent libfreetype6-dev ttf-dejavu-core
A continuación, construya la biblioteca y prueba:
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
El programa "Formedemo" ejerce una API de alto nivel construida en OpenVG que se encuentra en LibShapes.c.
./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.
Para instalar la biblioteca de formas como una biblioteca compartida de todo el sistema
pi@raspberrypi ~/openvg $ make library
pi@raspberrypi ~/openvg $ sudo make install
La biblioteca de formas OpenVG ahora se puede usar en el código C al incluir formas.h y fontinfo.h y vincular con 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
Un envoltorio de lenguaje de programación GO para la biblioteca se encuentra en OpenVG.GO. Los clientes de muestra están en el directorio Go-Client. La API sigue de cerca a la API C; Aquí está el programa "Hello, World" en Go:
La API GO
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
}
Para construir el envoltorio: (asegúrese de que Gopath esté configurado)
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