Demos (master): egl/openvg: Add a demo for paint types.

Chia-I Wu olv at kemper.freedesktop.org
Tue Nov 30 08:31:19 UTC 2010


Module: Demos
Branch: master
Commit: cc4a5a335c4246aec40d30900f75358ae319c78d
URL:    http://cgit.freedesktop.org/mesa/demos/commit/?id=cc4a5a335c4246aec40d30900f75358ae319c78d

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Tue Nov 30 15:12:33 2010 +0800

egl/openvg: Add a demo for paint types.

---

 src/egl/openvg/trivial/Makefile.am |    2 +
 src/egl/openvg/trivial/paint.c     |  155 ++++++++++++++++++++++++++++++++++++
 2 files changed, 157 insertions(+), 0 deletions(-)

diff --git a/src/egl/openvg/trivial/Makefile.am b/src/egl/openvg/trivial/Makefile.am
index 870b49f..48b31f6 100644
--- a/src/egl/openvg/trivial/Makefile.am
+++ b/src/egl/openvg/trivial/Makefile.am
@@ -62,6 +62,7 @@ noinst_PROGRAMS = \
 	mask4 \
 	mask \
 	mask_render \
+	paint \
 	path3 \
 	radialgrad \
 	readpixels \
@@ -92,6 +93,7 @@ lookup_LDADD = libcommon.la
 mask4_LDADD = libcommon.la
 mask_LDADD = libcommon.la
 mask_render_LDADD = libcommon.la
+paint_LDADD = libcommon.la
 path3_LDADD = libcommon.la
 radialgrad_LDADD = libcommon.la
 readpixels_LDADD = libcommon.la
diff --git a/src/egl/openvg/trivial/paint.c b/src/egl/openvg/trivial/paint.c
new file mode 100644
index 0000000..2034101
--- /dev/null
+++ b/src/egl/openvg/trivial/paint.c
@@ -0,0 +1,155 @@
+#include "eglcommon.h"
+
+#include <VG/openvg.h>
+
+#include <stdio.h>
+#include <string.h>
+
+static const VGfloat white_color[4] = {1.0, 1.0, 1.0, 1.0};
+
+static VGPath path;
+static VGPaint lingrad, radgrad, pattern;
+
+VGColorRampSpreadMode spread = VG_COLOR_RAMP_SPREAD_PAD;
+
+static void
+init_linear_gradient(VGPaint paint)
+{
+   VGfloat rampStop[] = {0.00f, 1.0f, 1.0f, 1.0f, 1.0f,
+                         0.33f, 1.0f, 0.0f, 0.0f, 1.0f,
+                         0.66f, 0.0f, 1.0f, 0.0f, 1.0f,
+                         1.00f, 0.0f, 0.0f,  1.0f, 1.0f};
+   VGfloat linearGradient[4] = {25.0f, 25.0f, 75.0f, 75.0f};
+
+   vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_LINEAR_GRADIENT);
+   vgSetParameteri(paint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, spread);
+   vgSetParameterfv(paint, VG_PAINT_LINEAR_GRADIENT, 4, linearGradient);
+   vgSetParameterfv(paint, VG_PAINT_COLOR_RAMP_STOPS, 20, rampStop);
+}
+
+static void
+init_radial_gradient(VGPaint paint, VGboolean centered)
+{
+   VGfloat centeredGradient[5] = {50.0f, 50.0f, 50.0f, 50.0f, 50};
+   VGfloat noncenteredGradient[5] = {50.0f, 50.0f, 62.5f, 62.5f, 50};
+   VGfloat rampStop[] = {0.00f, 1.0f, 1.0f, 1.0f, 1.0f,
+                         0.33f, 1.0f, 0.0f, 0.0f, 1.0f,
+                         0.66f, 0.0f, 1.0f, 0.0f, 1.0f,
+                         1.00f, 0.0f, 0.0f,  1.0f, 1.0f};
+   VGfloat *radialGradient =
+      (centered) ? centeredGradient : noncenteredGradient;
+
+   vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_RADIAL_GRADIENT);
+   vgSetParameteri(paint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, spread);
+   vgSetParameterfv(paint, VG_PAINT_RADIAL_GRADIENT, 5, radialGradient);
+   vgSetParameterfv(paint, VG_PAINT_COLOR_RAMP_STOPS, 20, rampStop);
+}
+
+static void
+init_pattern(VGPaint paint)
+{
+   const VGfloat red[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
+   const VGfloat green[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
+   const VGfloat blue[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
+   const VGfloat white[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
+   VGImage img;
+
+   img = vgCreateImage(VG_sRGBA_8888, 32, 32,
+                       VG_IMAGE_QUALITY_NONANTIALIASED);
+
+   vgSetfv(VG_CLEAR_COLOR, 4, red);
+   vgClearImage(img, 0, 0, 16, 16);
+   vgSetfv(VG_CLEAR_COLOR, 4, green);
+   vgClearImage(img, 16, 0, 16, 16);
+   vgSetfv(VG_CLEAR_COLOR, 4, blue);
+   vgClearImage(img, 0, 16, 16, 16);
+   vgSetfv(VG_CLEAR_COLOR, 4, white);
+   vgClearImage(img, 16, 16, 16, 16);
+
+   vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_PATTERN);
+   vgSetParameteri(paint, VG_PAINT_PATTERN_TILING_MODE, VG_TILE_REPEAT);
+   vgPaintPattern(paint, img);
+}
+
+static void
+init(void)
+{
+   static const VGubyte sqrCmds[5] = {VG_MOVE_TO_ABS, VG_HLINE_TO_ABS, VG_VLINE_TO_ABS, VG_HLINE_TO_ABS, VG_CLOSE_PATH};
+   static const VGfloat sqrCoords[5]   = {0.0f, 0.0f, 100.0f, 100.0f, 0.0f};
+
+   path = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1, 0, 0, 0,
+                       VG_PATH_CAPABILITY_APPEND_TO);
+   vgAppendPathData(path, 5, sqrCmds, sqrCoords);
+
+   lingrad = vgCreatePaint();
+   init_linear_gradient(lingrad);
+
+   radgrad = vgCreatePaint();
+   init_radial_gradient(radgrad, VG_TRUE);
+
+   pattern = vgCreatePaint();
+   init_pattern(pattern);
+
+   vgSetfv(VG_CLEAR_COLOR, 4, white_color);
+   vgSeti(VG_RENDERING_QUALITY, VG_RENDERING_QUALITY_NONANTIALIASED);
+}
+
+/* new window size or exposure */
+static void
+reshape(int w, int h)
+{
+   vgLoadIdentity();
+}
+
+static void
+draw_with_paint(VGPaint paint, VGint x, VGint y)
+{
+   vgSetPaint(paint, VG_FILL_PATH | VG_STROKE_PATH);
+
+   /*
+    * The paint and the path are both 100x100.  Scale the paint by 2
+    * horizontally and draw the path twice to cover the scaled paint.
+    */
+
+   /* scale the paint */
+   vgSeti(VG_MATRIX_MODE, VG_MATRIX_FILL_PAINT_TO_USER);
+   vgLoadIdentity();
+   vgScale(2.0f, 1);
+   vgSeti(VG_MATRIX_MODE, VG_MATRIX_STROKE_PAINT_TO_USER);
+   vgLoadIdentity();
+   vgScale(2.0f, 1);
+
+   /* draw the left half */
+   vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
+   vgLoadIdentity();
+   vgTranslate(x, y);
+   vgDrawPath(path, VG_FILL_PATH | VG_STROKE_PATH);
+
+   /* draw the right half */
+   vgTranslate(100, 0);
+   vgSeti(VG_MATRIX_MODE, VG_MATRIX_FILL_PAINT_TO_USER);
+   vgTranslate(-50, 0);
+   vgSeti(VG_MATRIX_MODE, VG_MATRIX_STROKE_PAINT_TO_USER);
+   vgTranslate(-50, 0);
+
+   vgDrawPath(path, VG_FILL_PATH | VG_STROKE_PATH);
+}
+
+static void
+draw(void)
+{
+   vgClear(0, 0, window_width(), window_height());
+
+   draw_with_paint(lingrad, 100, 25);
+   draw_with_paint(radgrad, 100, 150);
+   draw_with_paint(pattern, 100, 275);
+}
+
+
+int main(int argc, char **argv)
+{
+   set_window_size(400, 400);
+
+   return run(argc, argv, init, reshape,
+              draw, 0);
+}




More information about the mesa-commit mailing list