これが「こんにちは、世界」に相当するグラフィックです
// 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);
}
座標はVGFloat値であり、原点は左下に、Xは右に増加し、Yは増加します。 OpenVGは、0.0から1.0の範囲の赤、緑、青、アルファ値を含むVGFLOATアレイとして色を指定しますが、通常はRGBA(RGBで0-255、0.0〜1.0)として指定されています。
void WindowClear()
WindowClearはウィンドウをクリアして、以前に背景色を設定します
void AreaClear(unsigned int x, unsigned int y, unsigned int w, unsigned int h)
AreaClearは、ウィンドウ座標で特定の長方形をクリアします
void WindowOpacity(unsigned int a)
WindowOpacityは窓の不透明度を設定します
void WindowPosition(int x, int y)
ウィンドウポジションは、ウィンドウを指定された位置に移動します
void init(int *w, int *h)
グラフィックの初期化:キャンバスの幅と高さが返されます。これはすべてのプログラムを開始する必要があります。
void initWindowSize(int x, int y, unsigned int w, unsigned int h)
特定の寸法で初期化します
void finish()
グラフィックをシャットダウンします。これにより、すべてのプログラムが終了するはずです。
void Start(int width, int height)
写真を始めて、デフォルトの白で画面をクリアし、ストロークを設定して黒に塗りつぶします。
void End()
画像を終了し、画面にレンダリングします。
void SaveEnd(char *filename)
画像を終了し、画面にレンダリングし、4バイトのRGBAワードとして名前付きファイルにラスターを保存します。プログラムRAW2PNGは、「RAW」ラスターをPNGに変換します。
void saveterm(), restoreterm(), rawterm()
端子設定、現在の設定を保存し、設定を復元し、端子を生モードにします。
void setfill(float color[4])
塗りつぶしの色を設定します
void Background(unsigned int r, unsigned int g, unsigned int b)
RGB値から定義された背景色で画面を入力します。
void BackgroundRGB(unsigned int r, unsigned int g, unsigned int b, VGfloat a)
画面をアルファで背景色にクリアします
void StrokeWidth(float width)
ストローク幅を設定します。
void RGBA(unsigned int r, unsigned int g, unsigned int b, VGfloat a, VGfloat color[4])
RGBA値からカラーベクトルを埋めます。
void RGB(unsigned int r, unsigned int g, unsigned int b, VGfloat color[4])
RGB値からカラーベクトルを埋めます。
void Stroke(unsigned int r, unsigned int g, unsigned int b, VGfloat a)
RGBA値を使用してストローク色を設定します。
void Fill(unsigned int r, unsigned int g, unsigned int b, VGfloat a)
RGBA値を使用して塗りつぶし色を設定します。
void FillLinearGradient(VGfloat x1, VGfloat y1, VGfloat x2, VGfloat y2, VGfloat *stops, int n)
(x1、y1)および(x2、y2)で囲まれた線形勾配に塗りつぶしを設定します。 n数のストップ数で指定されたオフセットと色の使用
void FillRadialGradient(VGfloat cx, VGfloat cy, VGfloat fx VGfloat fy, VGfloat r, VGfloat *stops, int n)
塗りつぶしの数で指定されたオフセットと色を使用して、半径rの中心(CX、Cy)、および焦点(FX、RY)の焦点勾配に塗りつぶしを設定します
void Line(VGfloat x1, VGfloat y1, VGfloat x2, VGfloat y2)
(x1、y1)と(x2、y2)の間に線を描きます。
void Rect(VGfloat x, VGfloat y, VGfloat w, VGfloat h)
(x、y)の起源(左下)で長方形を描画し、サイズは(幅、高さ)です。
void RectOutline(VGfloat x, VGfloat y, VGfloat w, VGfloat h)
概要バージョン
void Roundrect(VGfloat x, VGfloat y, VGfloat w, VGfloat h, VGfloat rw, VGfloat rh)
丸い長方形を描画します(左下)(x、y)、サイズは(幅、高さ)です。
角の幅と高さは(RW、RH)で指定されています。
void RoundrectOutline(VGfloat x, VGfloat y, VGfloat w, VGfloat h, VGfloat rw, VGfloat rh)
概要バージョン
void Polygon(VGfloat *x, VGfloat *y, VGint n)
xとyを指す配列の座標を使用してポリゴンを描画します。座標の数はnです。
void Polyline(VGfloat *x, VGfloat *y, VGint n)
xとyを指す配列の座標を使用してポリラインを描画します。座標の数はnです。
void Circle(VGfloat x, VGfloat y, VGfloat d)
直径dで(x、y)を中心とした円を描きます。
void CircleOutline(VGfloat x, VGfloat y, VGfloat r)
概要バージョン
void Ellipse(VGfloat x, VGfloat y, VGfloat w, VGfloat h)
(x、y)を中心の楕円を半径(w、h)を描きます。
void EllipseOutline(VGfloat x, VGfloat y, VGfloat w, VGfloat h)
概要バージョン
void Qbezier(VGfloat sx, VGfloat sy, VGfloat cx, VGfloat cy, VGfloat ex, VGfloat ey)
(cx、cy)でコントロールポイントを使用して(ex、ey)で終了する(sx、sy)(sx、sy)で始まる二次皮肉な曲線を描きます。
void QbezierOutline(VGfloat sx, VGfloat sy, VGfloat cx, VGfloat cy, VGfloat ex, VGfloat ey)
概要バージョン
void Cbezier(VGfloat sx, VGfloat sy, VGfloat cx, VGfloat cy, VGfloat px, VGfloat py, VGfloat ex, VGfloat ey)
(cx、cy)と(px、py)でコントロールポイントを使用して(ex、ey)で制御ポイントを使用して、(sx、sy)から始まる立方体のbezier曲線を描きます。
void CbezierOutline(VGfloat sx, VGfloat sy, VGfloat cx, VGfloat cy, VGfloat px, VGfloat py, VGfloat ex, VGfloat ey)
概要バージョン
void Arc(VGfloat x, VGfloat y, VGfloat w, VGfloat h, VGfloat sa, VGfloat aext)
(x、y)を中心とした楕円弧を描き、幅と高さ(w、h)を描きます。開始角度(程度)はSA、角度はaextです。
void ArcOutline(VGfloat x, VGfloat y, VGfloat w, VGfloat h, VGfloat sa, VGfloat aext)
概要バージョン
void Text(VGfloat x, VGfloat y, char* s, Fontinfo f, int pointsize)
ポイントサイズを使用して、場所(x、y)でテキストsrtring(s)を描きます。
void TextMid(VGfloat x, VGfloat y, char* s, Fontinfo f, int pointsize)
ポイントサイズを使用して、場所(x、y)の中心にあるテキストsrtring(s)を描きます。
void TextEnd(VGfloat x, VGfloat y, char* s, Fontinfo f, int pointsize)
ポイントサイズを使用して、貸し出しが位置(x、y)に整列した状態でテキストsrtring(s)を描く
VGfloat TextWidth(char *s, Fontinfo f, int pointsize)
テキストの幅を返します
VGfloat TextHeight(Fontinfo f, int pointsize)
フォントの高さを返します
TextDepth(Fontinfo f, int pointsize)
ベースラインを越えてフォントの距離を返します。
void Image(VGfloat x, VGfloat y, int w, int h, char * filename)
(x、y)に寸法(w、h)のJPEG画像を配置します。
void Translate(VGfloat x, VGfloat y)
座標系を(x、y)に変換します。
void Rotate(VGfloat r)
角度R(程度)の周りに座標系を回転させます。
void Scale(VGfloat x, VGfloat y)
x、yによるスケール。
void Shear(VGfloat x, VGfloat y)
角度x、y、y。
void ClipRect(VGint x, VGint y, VGint w, VGint h)
描画領域を指定された長方形に制限し、clipend()で終了します
void ClipEnd()
クリッピングエリアを終了します
また、Font2OpenVGプログラムも含まれています。これは、プログラムに埋め込むことができるフォント情報をCソースに変換します。 MakeFileは、/usr/share/fonts/trueType/ttf-dejavu/にあるファイルからフォントコードを作成します。他のフォントを使用する場合は、それに応じてmakefileを調整するか、font2openvgプログラムが構築されたら、独自にフォントコードを生成します。
font2openvgは、3つの引数を取ります。TrueTypeフォントファイル、含まれる出力ファイル、識別子のプレフィックスです。たとえば、dejavu sansフォントを使用するには:
./font2openvg /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf DejaVuSans.inc DejaVuSans
プログラムに生成されたコードを含めます。
#include "DejaVuSans.inc"
Fontinfo DejaFont
LoadFont関数は、フォントデータからOpenVGパスを作成します。
loadfont(DejaVuSans_glyphPoints,
DejaVuSans_glyphPointIndices,
DejaVuSans_glyphInstructions,
DejaVuSans_glyphInstructionIndices,
DejaVuSans_glyphInstructionCounts,
DejaVuSans_glyphAdvances,
DejaVuSans_characterMap,
DejaVuSans_glyphCount);
unloadfont関数はパス情報を解放します。
unloadfont(DejaFont.Glyphs, DejaFont.Count);
フォントファイルの場所が異なる場合があることに注意してください。 (Jessieの現在の場所は/usr/share/fonts/truetype/ttf-dejavu)fontlib makefile変数を使用してこの場所を調整します。
GPU RAMの少なくとも64 mbytesが必要になることに注意してください。また、DejavuフォントとJPEGおよびFreetypeライブラリも必要です。インデントツールは、コードのフォーマットにも役立ちます。それらを介してそれらをインストールします:
pi@raspberrypi ~ $ sudo apt-get install libjpeg8-dev indent libfreetype6-dev ttf-dejavu-core
次に、ライブラリを構築してテストします。
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
プログラム「Shapedemo」は、libshapes.cで見つかったOpenVGに構築された高レベルのAPIを行使します。
./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.
Shapesライブラリをシステム全体の共有ライブラリとしてインストールする
pi@raspberrypi ~/openvg $ make library
pi@raspberrypi ~/openvg $ sudo make install
OpenVG Shapesライブラリは、shapes.hとfontinfo.hを含めてlibshapes.soでリンクすることにより、Cコードで使用できるようになりました。
#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
ライブラリのGOプログラミング言語ラッパーは、openvg.goにあります。サンプルクライアントは、ディレクトリGo-Clientにあります。 APIはC APIに密接に従います。これがGoの「Hello、World」プログラムです。
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
}
ラッパーを構築するには:( GoPathが設定されていることを確認してください)
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