xenocara/dist/Mesa/progs/openvg/trivial/stroke2.c

208 lines
4.7 KiB
C

#include "eglcommon.h"
#include <VG/openvg.h>
#include <X11/keysym.h>
#include <stdio.h>
VGPaint stroke;
VGPath target;
VGPath lines;
VGfloat xform[9];
VGfloat color1[4];
VGfloat color2[4];
VGfloat bgCol[4];
static void
init(void)
{
VGubyte lineCmds[6];
VGfloat lineCoords[8];
VGfloat arcCoords[5];
VGubyte sccCmd[1];
VGubyte scCmd[1];
VGubyte lccCmd[1];
VGubyte lcCmd[1];
VGubyte moveCmd[1];
VGfloat moveCoords[2];
VGint i;
bgCol[0] = 1.0f;
bgCol[1] = 1.0f;
bgCol[2] = 1.0f;
bgCol[3] = 1.0f;
vgSetfv(VG_CLEAR_COLOR, 4, bgCol);
vgSeti(VG_RENDERING_QUALITY, VG_RENDERING_QUALITY_NONANTIALIASED);
stroke = vgCreatePaint();
/* Red */
color1[0] = 1.0f;
color1[1] = 0.0f;
color1[2] = 0.0f;
color1[3] = 1.0f;
/* Orange */
color2[0] = 1.0000f;
color2[1] = 1.0f;
color2[2] = 0.0f;
color2[3] = 1.0f;
vgSetPaint(stroke, VG_STROKE_PATH);
vgSeti(VG_STROKE_CAP_STYLE, VG_CAP_SQUARE);
{
VGfloat temp[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
for (i = 0; i < 9; i++)
{
xform[i] = temp[i];
}
}
vgGetMatrix(xform);
target = vgCreatePath(VG_PATH_FORMAT_STANDARD,
VG_PATH_DATATYPE_F, 1, 0, 0, 0, VG_PATH_CAPABILITY_TRANSFORM_TO);
#if 0
/* Line path */
{
VGubyte temp[6] = {VG_MOVE_TO_ABS, VG_VLINE_TO_REL,
VG_MOVE_TO_ABS, VG_VLINE_TO_REL,
VG_HLINE_TO_REL, VG_VLINE_TO_REL};
for (i = 0; i < 6; i++)
{
lineCmds[i] = temp[i];
}
}
{
VGfloat temp[8] = {0.5f, 0.8f, -0.6f, 0.28f, 0.6f, -0.4f, 0.44f, 0.4f};
for (i = 0; i < 8; i++)
{
lineCoords[i] = temp[i] * window_width();
}
}
#else
{
VGfloat temp[5] = {0.35f, 0.15f, 29, 0.3f, 0.4f};
for (i = 0; i < 5; i++)
{
arcCoords[i] = temp[i] * window_width();
}
arcCoords[2] = 29;
}
{
VGubyte temp[1] = {VG_SCCWARC_TO_ABS};
for (i = 0; i < 1; i++)
{
sccCmd[i] = temp[i];
}
}
{
VGubyte temp[1] = {VG_SCWARC_TO_ABS};
for (i = 0; i < 1; i++)
{
scCmd[i] = temp[i];
}
}
{
VGubyte temp[1] = {VG_LCCWARC_TO_ABS};
for (i = 0; i < 1; i++)
{
lccCmd[i] = temp[i];
}
}
{
VGubyte temp[1] = {VG_LCWARC_TO_ABS};
for (i = 0; i < 1; i++)
{
lcCmd[i] = temp[i];
}
}
{
VGubyte temp[1] = {VG_MOVE_TO_ABS};
for (i = 0; i < 1; i++)
{
moveCmd[i] = temp[i];
}
}
{
VGfloat temp[2] = {0.7f, 0.6f};
for (i = 0; i < 2; i++)
{
moveCoords[i] = temp[i] * window_width();
}
}
#endif
lines = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1,
0, 0, 0,
VG_PATH_CAPABILITY_APPEND_TO|
VG_PATH_CAPABILITY_TRANSFORM_FROM);
#if 0
vgAppendPathData(lines, 6, lineCmds, lineCoords);
#else
vgAppendPathData(lines, 1, moveCmd, moveCoords);
vgAppendPathData(lines, 1, sccCmd, arcCoords);
vgAppendPathData(lines, 1, moveCmd, moveCoords);
vgAppendPathData(lines, 1, scCmd, arcCoords);
vgAppendPathData(lines, 1, moveCmd, moveCoords);
vgAppendPathData(lines, 1, lccCmd, arcCoords);
vgAppendPathData(lines, 1, moveCmd, moveCoords);
vgAppendPathData(lines, 1, lcCmd, arcCoords);
#endif
vgLoadIdentity();
vgTranslate(0.25f * window_width(), 0.25f * window_height());
vgRotate(30);
vgTranslate(-0.25f * window_width(), -0.25f * window_height());
vgTransformPath(target, lines);}
/* new window size or exposure */
static void
reshape(int w, int h)
{
}
static void
draw(void)
{
vgClear(0, 0, window_width(), window_height());
vgLoadMatrix(xform);
vgLoadIdentity();
vgTranslate(0.25f * window_width(), 0.25f * window_height());
vgRotate(30);
vgTranslate(-0.25f * window_width(), -0.25f * window_height());
vgSetf(VG_STROKE_LINE_WIDTH, 7);
vgSetParameterfv(stroke, VG_PAINT_COLOR, 4, color1);
vgDrawPath(lines, VG_STROKE_PATH);
vgLoadMatrix(xform);
vgSetParameterfv(stroke, VG_PAINT_COLOR, 4, color2);
vgSetf(VG_STROKE_LINE_WIDTH, 3);
vgDrawPath(target, VG_STROKE_PATH);
}
static int key_press(unsigned key)
{
switch(key) {
case XK_c:
case XK_C:
break;
case XK_j:
case XK_J:
break;
default:
break;
}
return VG_TRUE;
}
int main(int argc, char **argv)
{
return run(argc, argv, init, reshape,
draw, key_press);
}