Module: Demos Branch: master Commit: a9f806156d76684f1c2a7ab3e2bfd12643312268 URL: http://cgit.freedesktop.org/mesa/demos/commit/?id=a9f806156d76684f1c2a7ab3e2bfd12643312268
Author: Chia-I Wu <[email protected]> Date: Sun Nov 28 23:18:59 2010 +0800 egl/openvg: Add demos for VGMaskLayer functions. --- src/egl/openvg/trivial/Makefile.am | 4 + src/egl/openvg/trivial/layer.c | 109 +++++++++++++++++++++++++++ src/egl/openvg/trivial/mask_render.c | 134 ++++++++++++++++++++++++++++++++++ 3 files changed, 247 insertions(+), 0 deletions(-) diff --git a/src/egl/openvg/trivial/Makefile.am b/src/egl/openvg/trivial/Makefile.am index d694b67..9e2b57e 100644 --- a/src/egl/openvg/trivial/Makefile.am +++ b/src/egl/openvg/trivial/Makefile.am @@ -53,11 +53,13 @@ noinst_PROGRAMS = \ filter \ gradorigin \ image \ + layer \ lineto \ lingrad \ lookup \ mask4 \ mask \ + mask_render \ path3 \ radialgrad \ readpixels \ @@ -79,11 +81,13 @@ ellipse_LDADD = libcommon.la filter_LDADD = libcommon.la gradorigin_LDADD = libcommon.la image_LDADD = libcommon.la +layer_LDADD = libcommon.la lineto_LDADD = libcommon.la lingrad_LDADD = libcommon.la lookup_LDADD = libcommon.la mask4_LDADD = libcommon.la mask_LDADD = libcommon.la +mask_render_LDADD = libcommon.la path3_LDADD = libcommon.la radialgrad_LDADD = libcommon.la readpixels_LDADD = libcommon.la diff --git a/src/egl/openvg/trivial/layer.c b/src/egl/openvg/trivial/layer.c new file mode 100644 index 0000000..81cbb74 --- /dev/null +++ b/src/egl/openvg/trivial/layer.c @@ -0,0 +1,109 @@ +#include "eglcommon.h" + +#include <VG/openvg.h> + +#include <math.h> +#include <stdlib.h> +#include <stdio.h> + +#ifdef OPENVG_VERSION_1_1 + +#define NUM_LAYERS 2 + +static VGMaskLayer layers[NUM_LAYERS]; +static VGint current_layer; +static VGPath path; + +static void +init(void) +{ + vgSeti(VG_MASKING, VG_TRUE); +} + +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); +} + +/* new window size or exposure */ +static void +reshape(int w, int h) +{ + int i; + + if (path) + vgDestroyPath(path); + path = vgCreatePath(VG_PATH_FORMAT_STANDARD, + VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, + VG_PATH_CAPABILITY_ALL); + + for (i = 0; i < NUM_LAYERS; i++) { + if (layers[i]) + vgDestroyMaskLayer(layers[i]); + layers[i] = vgCreateMaskLayer(w, h); + } + + vgLoadIdentity(); + vgTranslate(w / 2.0f, h / 2.0f); + ellipse(path, w / 3.0f, h / 3.0f, 0.0f); + + /* test vgFillMaskLayer and vgCopyMask */ + vgFillMaskLayer(layers[0], 0, 0, w, h / 2, 0.8f); + vgFillMaskLayer(layers[0], 0, h / 2, w, h / 2, 0.4f); + vgMask(layers[0], VG_SET_MASK, 0, 0, w, h); + vgCopyMask(layers[1], 0, 0, 0, 0, w, h); +} + +static const VGfloat white[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; + +static void +draw(void) +{ + vgSetfv(VG_CLEAR_COLOR, 4, white); + vgClear(0, 0, window_width(), window_height()); + + vgDrawPath(path, VG_FILL_PATH); + + current_layer = (current_layer + 1) % NUM_LAYERS; + vgMask(layers[current_layer], VG_SET_MASK, + 0, 0, window_width(), window_height()); +} + + +int main(int argc, char **argv) +{ + set_window_size(300, 300); + return run(argc, argv, init, reshape, + draw, 0); +} + +#else /* OPENVG_VERSION_1_1 */ + +int main(int argc, char **argv) +{ + printf("This demo requires OpenVG 1.1\n"); + return 0; +} + +#endif /* OPENVG_VERSION_1_1 */ diff --git a/src/egl/openvg/trivial/mask_render.c b/src/egl/openvg/trivial/mask_render.c new file mode 100644 index 0000000..0fcceeb --- /dev/null +++ b/src/egl/openvg/trivial/mask_render.c @@ -0,0 +1,134 @@ +#include "eglcommon.h" + +#include <VG/openvg.h> + +#include <math.h> +#include <stdlib.h> +#include <stdio.h> + +#ifdef OPENVG_VERSION_1_1 + +static VGPath rect; + +static void +init(void) +{ + VGPaint paint; + + VGubyte cmd[] = { + VG_MOVE_TO_ABS, + VG_LINE_TO_ABS, + VG_LINE_TO_ABS, + VG_LINE_TO_ABS, + VG_CLOSE_PATH + }; + VGfloat val[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 1.0f, 1.0f, + 0.0f, 1.0f + }; + + rect = vgCreatePath(VG_PATH_FORMAT_STANDARD, + VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, + VG_PATH_CAPABILITY_ALL); + vgAppendPathData(rect, sizeof(cmd), cmd, val); + + paint = vgCreatePaint(); + vgSetColor(paint, 0xff0000ff); + vgSetPaint(paint, VG_FILL_PATH); + + vgSeti(VG_MASKING, VG_TRUE); +} + +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); +} + +/* new window size or exposure */ +static void +reshape(int w, int h) +{ + VGMaskLayer layer; + VGPath path; + int i; + + /* test vgFillMaskLayer */ + layer = vgCreateMaskLayer(w, h); + vgFillMaskLayer(layer, 0, 0, w, h, 0.8f); + vgMask(layer, VG_SET_MASK, 0, 0, w, h); + vgDestroyMaskLayer(layer); + + /* test vgRenderToMask */ + path = vgCreatePath(VG_PATH_FORMAT_STANDARD, + VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, + VG_PATH_CAPABILITY_ALL); + vgLoadIdentity(); + vgTranslate(w / 2.0f, h / 3.0f); + ellipse(path, w / 3.0f, h / 3.0f, 0.0f); + + vgRenderToMask(path, VG_FILL_PATH, VG_UNION_MASK); + + vgDestroyPath(path); +} + +static const VGfloat white[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; + +static void +rectangle(VGint x, VGint y, VGint width, VGint height) +{ + vgLoadIdentity(); + vgTranslate(x, y); + vgScale(width, height); + vgDrawPath(rect, VG_FILL_PATH); +} + +static void +draw(void) +{ + vgSetfv(VG_CLEAR_COLOR, 4, white); + vgClear(0, 0, window_width(), window_height()); + + if (window_width() > 10 && window_height() > 10) + rectangle(5, 5, window_width() - 10, window_height() - 10); +} + + +int main(int argc, char **argv) +{ + set_window_size(300, 300); + return run(argc, argv, init, reshape, + draw, 0); +} + +#else /* OPENVG_VERSION_1_1 */ + +int main(int argc, char **argv) +{ + printf("This demo requires OpenVG 1.1\n"); + return 0; +} + +#endif /* OPENVG_VERSION_1_1 */ _______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
