132001f49Smrg#include "eglcommon.h"
232001f49Smrg
332001f49Smrg#include <VG/openvg.h>
432001f49Smrg
532001f49Smrg#include <stdio.h>
632001f49Smrg#include <string.h>
732001f49Smrg
832001f49Smrgstatic const VGfloat white_color[4] = {1.0, 1.0, 1.0, 1.0};
932001f49Smrg
1032001f49Smrgstatic VGPath path;
1132001f49Smrgstatic VGPaint lingrad, radgrad, pattern;
1232001f49Smrg
1332001f49SmrgVGColorRampSpreadMode spread = VG_COLOR_RAMP_SPREAD_PAD;
1432001f49Smrg
1532001f49Smrgstatic void
1632001f49Smrginit_linear_gradient(VGPaint paint)
1732001f49Smrg{
1832001f49Smrg   VGfloat rampStop[] = {0.00f, 1.0f, 1.0f, 1.0f, 1.0f,
1932001f49Smrg                         0.33f, 1.0f, 0.0f, 0.0f, 1.0f,
2032001f49Smrg                         0.66f, 0.0f, 1.0f, 0.0f, 1.0f,
2132001f49Smrg                         1.00f, 0.0f, 0.0f,  1.0f, 1.0f};
2232001f49Smrg   VGfloat linearGradient[4] = {25.0f, 25.0f, 75.0f, 75.0f};
2332001f49Smrg
2432001f49Smrg   vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_LINEAR_GRADIENT);
2532001f49Smrg   vgSetParameteri(paint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, spread);
2632001f49Smrg   vgSetParameterfv(paint, VG_PAINT_LINEAR_GRADIENT, 4, linearGradient);
2732001f49Smrg   vgSetParameterfv(paint, VG_PAINT_COLOR_RAMP_STOPS, 20, rampStop);
2832001f49Smrg}
2932001f49Smrg
3032001f49Smrgstatic void
3132001f49Smrginit_radial_gradient(VGPaint paint, VGboolean centered)
3232001f49Smrg{
3332001f49Smrg   VGfloat centeredGradient[5] = {50.0f, 50.0f, 50.0f, 50.0f, 50};
3432001f49Smrg   VGfloat noncenteredGradient[5] = {50.0f, 50.0f, 62.5f, 62.5f, 50};
3532001f49Smrg   VGfloat rampStop[] = {0.00f, 1.0f, 1.0f, 1.0f, 1.0f,
3632001f49Smrg                         0.33f, 1.0f, 0.0f, 0.0f, 1.0f,
3732001f49Smrg                         0.66f, 0.0f, 1.0f, 0.0f, 1.0f,
3832001f49Smrg                         1.00f, 0.0f, 0.0f,  1.0f, 1.0f};
3932001f49Smrg   VGfloat *radialGradient =
4032001f49Smrg      (centered) ? centeredGradient : noncenteredGradient;
4132001f49Smrg
4232001f49Smrg   vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_RADIAL_GRADIENT);
4332001f49Smrg   vgSetParameteri(paint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, spread);
4432001f49Smrg   vgSetParameterfv(paint, VG_PAINT_RADIAL_GRADIENT, 5, radialGradient);
4532001f49Smrg   vgSetParameterfv(paint, VG_PAINT_COLOR_RAMP_STOPS, 20, rampStop);
4632001f49Smrg}
4732001f49Smrg
4832001f49Smrgstatic void
4932001f49Smrginit_pattern(VGPaint paint)
5032001f49Smrg{
5132001f49Smrg   const VGfloat red[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
5232001f49Smrg   const VGfloat green[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
5332001f49Smrg   const VGfloat blue[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
5432001f49Smrg   const VGfloat white[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
5532001f49Smrg   VGImage img;
5632001f49Smrg
5732001f49Smrg   img = vgCreateImage(VG_sRGBA_8888, 32, 32,
5832001f49Smrg                       VG_IMAGE_QUALITY_NONANTIALIASED);
5932001f49Smrg
6032001f49Smrg   vgSetfv(VG_CLEAR_COLOR, 4, red);
6132001f49Smrg   vgClearImage(img, 0, 0, 16, 16);
6232001f49Smrg   vgSetfv(VG_CLEAR_COLOR, 4, green);
6332001f49Smrg   vgClearImage(img, 16, 0, 16, 16);
6432001f49Smrg   vgSetfv(VG_CLEAR_COLOR, 4, blue);
6532001f49Smrg   vgClearImage(img, 0, 16, 16, 16);
6632001f49Smrg   vgSetfv(VG_CLEAR_COLOR, 4, white);
6732001f49Smrg   vgClearImage(img, 16, 16, 16, 16);
6832001f49Smrg
6932001f49Smrg   vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_PATTERN);
7032001f49Smrg   vgSetParameteri(paint, VG_PAINT_PATTERN_TILING_MODE, VG_TILE_REPEAT);
7132001f49Smrg   vgPaintPattern(paint, img);
7232001f49Smrg}
7332001f49Smrg
7432001f49Smrgstatic void
7532001f49Smrginit(void)
7632001f49Smrg{
7732001f49Smrg   static const VGubyte sqrCmds[5] = {VG_MOVE_TO_ABS, VG_HLINE_TO_ABS, VG_VLINE_TO_ABS, VG_HLINE_TO_ABS, VG_CLOSE_PATH};
7832001f49Smrg   static const VGfloat sqrCoords[5]   = {0.0f, 0.0f, 100.0f, 100.0f, 0.0f};
7932001f49Smrg
8032001f49Smrg   path = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1, 0, 0, 0,
8132001f49Smrg                       VG_PATH_CAPABILITY_APPEND_TO);
8232001f49Smrg   vgAppendPathData(path, 5, sqrCmds, sqrCoords);
8332001f49Smrg
8432001f49Smrg   lingrad = vgCreatePaint();
8532001f49Smrg   init_linear_gradient(lingrad);
8632001f49Smrg
8732001f49Smrg   radgrad = vgCreatePaint();
8832001f49Smrg   init_radial_gradient(radgrad, VG_TRUE);
8932001f49Smrg
9032001f49Smrg   pattern = vgCreatePaint();
9132001f49Smrg   init_pattern(pattern);
9232001f49Smrg
9332001f49Smrg   vgSetfv(VG_CLEAR_COLOR, 4, white_color);
9432001f49Smrg   vgSeti(VG_RENDERING_QUALITY, VG_RENDERING_QUALITY_NONANTIALIASED);
9532001f49Smrg}
9632001f49Smrg
9732001f49Smrg/* new window size or exposure */
9832001f49Smrgstatic void
9932001f49Smrgreshape(int w, int h)
10032001f49Smrg{
10132001f49Smrg   vgLoadIdentity();
10232001f49Smrg}
10332001f49Smrg
10432001f49Smrgstatic void
10532001f49Smrgdraw_with_paint(VGPaint paint, VGint x, VGint y)
10632001f49Smrg{
10732001f49Smrg   vgSetPaint(paint, VG_FILL_PATH | VG_STROKE_PATH);
10832001f49Smrg
10932001f49Smrg   /*
11032001f49Smrg    * The paint and the path are both 100x100.  Scale the paint by 2
11132001f49Smrg    * horizontally and draw the path twice to cover the scaled paint.
11232001f49Smrg    */
11332001f49Smrg
11432001f49Smrg   /* scale the paint */
11532001f49Smrg   vgSeti(VG_MATRIX_MODE, VG_MATRIX_FILL_PAINT_TO_USER);
11632001f49Smrg   vgLoadIdentity();
11732001f49Smrg   vgScale(2.0f, 1);
11832001f49Smrg   vgSeti(VG_MATRIX_MODE, VG_MATRIX_STROKE_PAINT_TO_USER);
11932001f49Smrg   vgLoadIdentity();
12032001f49Smrg   vgScale(2.0f, 1);
12132001f49Smrg
12232001f49Smrg   /* draw the left half */
12332001f49Smrg   vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
12432001f49Smrg   vgLoadIdentity();
12532001f49Smrg   vgTranslate(x, y);
12632001f49Smrg   vgDrawPath(path, VG_FILL_PATH | VG_STROKE_PATH);
12732001f49Smrg
12832001f49Smrg   /* draw the right half */
12932001f49Smrg   vgTranslate(100, 0);
13032001f49Smrg   vgSeti(VG_MATRIX_MODE, VG_MATRIX_FILL_PAINT_TO_USER);
13132001f49Smrg   vgTranslate(-50, 0);
13232001f49Smrg   vgSeti(VG_MATRIX_MODE, VG_MATRIX_STROKE_PAINT_TO_USER);
13332001f49Smrg   vgTranslate(-50, 0);
13432001f49Smrg
13532001f49Smrg   vgDrawPath(path, VG_FILL_PATH | VG_STROKE_PATH);
13632001f49Smrg}
13732001f49Smrg
13832001f49Smrgstatic void
13932001f49Smrgdraw(void)
14032001f49Smrg{
14132001f49Smrg   vgClear(0, 0, window_width(), window_height());
14232001f49Smrg
14332001f49Smrg   draw_with_paint(lingrad, 100, 25);
14432001f49Smrg   draw_with_paint(radgrad, 100, 150);
14532001f49Smrg   draw_with_paint(pattern, 100, 275);
14632001f49Smrg}
14732001f49Smrg
14832001f49Smrg
14932001f49Smrgint main(int argc, char **argv)
15032001f49Smrg{
15132001f49Smrg   set_window_size(400, 400);
15232001f49Smrg
15332001f49Smrg   return run(argc, argv, init, reshape,
15432001f49Smrg              draw, 0);
15532001f49Smrg}
156