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

140 lines
3.2 KiB
C

#include "eglcommon.h"
#include <VG/openvg.h>
#include <math.h>
const VGfloat clear_color[4] = {1.0, 1.0, 1.0, 1.0};
const VGfloat color[4] = {1.0, 1.0, 1.0, 0.5};
VGPath vgPath;
static void ellipse(VGPath vgPath, VGfloat rx, VGfloat ry, VGfloat angle)
{
static const VGubyte cmd[] =
{ VG_MOVE_TO_ABS, VG_SCCWARC_TO_REL, VG_SCCWARC_TO_REL, VG_CLOSE_PATH };
VGfloat val[12];
VGfloat c = cos(angle) * rx;
VGfloat s = sin(angle) * rx;
val[0] = c;
val[1] = s;
val[2] = rx;
val[3] = ry;
val[4] = angle;
val[5] = -2.0f * c;
val[6] = -2.0f * s;
val[7] = rx;
val[8] = ry;
val[9] = angle;
val[10] = 2.0f * c;
val[11] = 2.0f * s;
vgClearPath(vgPath, VG_PATH_CAPABILITY_ALL);
vgAppendPathData(vgPath, sizeof(cmd), cmd, val);
vgDrawPath(vgPath, VG_FILL_PATH | VG_STROKE_PATH);
}
static void
init(void)
{
VGPaint vgPaint;
vgSetfv(VG_CLEAR_COLOR, 4, clear_color);
vgPath = vgCreatePath(VG_PATH_FORMAT_STANDARD,
VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0,
VG_PATH_CAPABILITY_ALL);
vgPaint = vgCreatePaint();
vgSetParameteri(vgPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
vgSetColor(vgPaint, 0x00ff00ff);
vgSetPaint(vgPaint, VG_FILL_PATH);
vgSeti(VG_RENDERING_QUALITY, VG_RENDERING_QUALITY_NONANTIALIASED);
vgSeti(VG_BLEND_MODE, VG_BLEND_SRC_OVER);
vgSetf(VG_STROKE_LINE_WIDTH, 2.0f);
vgSeti(VG_STROKE_CAP_STYLE, VG_CAP_SQUARE);
vgSeti(VG_STROKE_JOIN_STYLE, VG_JOIN_MITER);
vgSetf(VG_STROKE_MITER_LIMIT, 4.0f);
vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
}
/* new window size or exposure */
static void
reshape(int w, int h)
{
}
static void
draw(void)
{
vgClear(0, 0, window_width(), window_height());
#if 0
vgLoadIdentity();
vgTranslate(40.0f, 24.0f);
vgScale(0.61804f, 0.61804f);
vgShear(-1.0f, 0.0f);
vgDrawPath(vgPath, VG_FILL_PATH | VG_STROKE_PATH);
#else
/* row 1, col 1: Identity transform. */
vgLoadIdentity();
vgTranslate(8.0f, 8.0f);
ellipse(vgPath, 4.0f, 4.0f, 0.0f);
/* row 1, col 2: 10^3 horizontal squeeze. */
vgLoadIdentity();
vgTranslate(24.0f, 8.0f);
vgScale(1.0e-3f, 1.0f);
ellipse(vgPath, 4.0e3f, 4.0f, 0.0f);
/* row 1, col 3: 10^6 horizontal squeeze. */
vgLoadIdentity();
vgTranslate(40.0f, 8.0f);
vgScale(1.0e-6f, 1.0f);
ellipse(vgPath, 4.0e6f, 4.0f, 0.0f);
/* row 1, col 4: 10^9 horizontal squeeze. */
vgLoadIdentity();
vgTranslate(56.0f, 8.0f);
vgScale(1.0e-9f, 1.0f);
ellipse(vgPath, 4.0e9f, 4.0f, 0.0f);
/* row 2, col 1: 10^3 vertical squeeze. */
vgLoadIdentity();
vgTranslate(8.0f, 24.0f);
vgScale(1.0f, 1.0e-3f);
ellipse(vgPath, 4.0f, 4.0e3f, 0.0f);
/* row 2, col 2: Shear 0. */
vgLoadIdentity();
vgTranslate(24.0f, 24.0f);
vgShear(0.0f, 0.0f);
ellipse(vgPath, 4.0f, 4.0f, 0.0f);
/* row 2, col 3: Horizontal shear -1. */
vgLoadIdentity();
vgTranslate(40.0f, 24.0f);
vgScale(0.61804f, 0.61804f);
vgShear(-1.0f, 0.0f);
ellipse(vgPath, 10.47213f, 4.0f, 31.717f);
#endif
vgFlush();
}
int main(int argc, char **argv)
{
set_window_size(64, 64);
return run(argc, argv, init, reshape,
draw, 0);
}