vgSeti(VG_RENDERING_QUALITY, VG_RENDERING_QUALITY_BETTER); vgSeti(VG_IMAGE_QUALITY, VG_IMAGE_QUALITY_BETTER); vgSeti(VG_SCISSORING, VG_FALSE); col[0] = 0.0f; col[1] = 0.0f; col[2] = 0.0f; col[3] = 0.0f; vgSetfv(VG_CLEAR_COLOR, 4, col); vgClear(0, 0, 256, 256); // create image and load external data imgSrc = vgCreateImage(VG_lRGBA_8888, imgBarbaraAlphaWidth, imgBarbaraAlphaHeight, VG_IMAGE_QUALITY_NONANTIALIASED); vgImageSubData(imgSrc, (const void *)&imgBarbaraAlphaData[imgBarbaraAlphaWidth * (imgBarbaraAlphaHeight - 1)], -imgBarbaraAlphaDataStride, imgBarbaraAlphaFormat, 0, 0, imgBarbaraAlphaWidth, imgBarbaraAlphaHeight); // create a path path0 = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, VG_PATH_CAPABILITY_ALL); pathSegs[0] = VG_MOVE_TO_ABS; pathData[0] = -20.0f; pathData[1] = 20.0f; pathSegs[1] = VG_CUBIC_TO_ABS; pathData[2] = -200.0f; pathData[3] = 170.0f; pathData[4] = -200.0f; pathData[5] = -170.0f; pathData[6] = -20.0f; pathData[7] = -20.0f; pathSegs[2] = VG_CUBIC_TO_ABS; pathData[8] = -170.0f; pathData[9] = -200.0f; pathData[10] = 170.0f; pathData[11] = -200.0f; pathData[12] = 20.0f; pathData[13] = -20.0f; pathSegs[3] = VG_CUBIC_TO_ABS; pathData[14] = 200.0f; pathData[15] = -170.0f; pathData[16] = 200.0f; pathData[17] = 170.0f; pathData[18] = 20.0f; pathData[19] = 20.0f; pathSegs[4] = VG_CUBIC_TO_ABS; pathData[20] = 170.0f; pathData[21] = 200.0f; pathData[22] = -170.0f; pathData[23] = 200.0f; pathData[24] = -20.0f; pathData[25] = 20.0f; pathSegs[5] = VG_CLOSE_PATH; vgAppendPathData(path0, 6, pathSegs, pathData); // create and set a paint for fill strokePaint = vgCreatePaint(); colStops[0] = 0.00f; colStops[1] = 0.4f; colStops[2] = 0.0f; colStops[3] = 0.6f; colStops[4] = 0.70f; colStops[5] = 0.25f; colStops[6] = 0.9f; colStops[7] = 0.5f; colStops[8] = 0.1f; colStops[9] = 0.70f; colStops[10] = 0.50f; colStops[11] = 0.8f; colStops[12] = 0.8f; colStops[13] = 0.0f; colStops[14] = 0.70f; colStops[15] = 0.75f; colStops[16] = 0.0f; colStops[17] = 0.3f; colStops[18] = 0.5f; colStops[19] = 0.70f; colStops[20] = 1.00f; colStops[21] = 0.4f; colStops[22] = 0.0f; colStops[23] = 0.6f; colStops[24] = 0.70f; radGrad[0] = 0.0f; radGrad[1] = 0.0f; radGrad[2] = -30.0f; radGrad[3] = -5.0f; radGrad[4] = 65.0f; vgSetParameteri(strokePaint, VG_PAINT_TYPE, VG_PAINT_TYPE_RADIAL_GRADIENT); vgSetParameterfv(strokePaint, VG_PAINT_COLOR_RAMP_STOPS, 25, colStops); vgSetParameterfv(strokePaint, VG_PAINT_RADIAL_GRADIENT, 5, radGrad); vgSetPaint(strokePaint, VG_STROKE_PATH); // set a scissor rectangle scissorRects[0] = 10.0f; scissorRects[1] = 10.0f; scissorRects[2] = 236.0f; scissorRects[3] = 236.0f; vgSetfv(VG_SCISSOR_RECTS, 4, scissorRects); vgSeti(VG_SCISSORING, VG_TRUE); // set alpha mask vgMask(imgSrc, VG_SET_MASK, 0, 0, 256, 256); vgSeti(VG_MASKING, VG_FALSE); col[0] = 0.0f; col[1] = 0.0f; col[2] = 0.0f; col[3] = 0.9f; vgSetfv(VG_CLEAR_COLOR, 4, col); vgSetfv(VG_STROKE_DASH_PATTERN, 0, NULL); vgSetf(VG_STROKE_LINE_WIDTH, 35.0f); vgSeti(VG_STROKE_JOIN_STYLE, VG_JOIN_ROUND); for (i = VG_BLEND_SRC; i <= VG_BLEND_ADDITIVE; ++i) { vgClear(0, 0, 256, 256); vgSeti(VG_BLEND_MODE, i); vgSeti(VG_MATRIX_MODE, VG_MATRIX_STROKE_PAINT_TO_USER); vgLoadIdentity(); vgScale(0.2f, 0.4f); vgRotate(-120.0f); vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); vgSetParameteri(strokePaint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_REPEAT); vgLoadIdentity(); vgScale(0.7f, 0.7f); vgDrawPath(path0, VG_STROKE_PATH); vgSetParameteri(strokePaint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_REFLECT); vgLoadIdentity(); vgTranslate(256.0f, 0.0f); vgScale(0.7f, 0.7f); vgDrawPath(path0, VG_STROKE_PATH); vgSetParameteri(strokePaint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_REPEAT); vgLoadIdentity(); vgTranslate(256.0f, 256.0f); vgScale(0.7f, 0.7f); vgDrawPath(path0, VG_STROKE_PATH); vgSetParameteri(strokePaint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_REFLECT); vgLoadIdentity(); vgTranslate(0.0f, 256.0f); vgScale(0.7f, 0.7f); vgDrawPath(path0, VG_STROKE_PATH); vgSeti(VG_MATRIX_MODE, VG_MATRIX_STROKE_PAINT_TO_USER); vgLoadIdentity(); vgRotate(-30.0f); vgScale(1.5f, 1.9f); vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); vgSetParameteri(strokePaint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_PAD); vgLoadIdentity(); vgTranslate(128.0f, 128.0f); vgRotate(45.0f); vgScale(0.9f, 0.8f); vgDrawPath(path0, VG_STROKE_PATH); strcpy(imgFileName, "stroke_path_radgrad_"); strcat(imgFileName, blendModeToString(i)); strcat(imgFileName, ".png"); strcpy(testDesc, "Test stroking with radial gradient and "); strcat(testDesc, blendModeToString(i)); strcat(testDesc, " blend mode (without alpha mask)"); saveDrawingSurface(f, imgFileName, testDesc, 0, 0, 256, 256); eglSwapBuffers(display, surface); } for (i = VG_BLEND_SRC; i <= VG_BLEND_ADDITIVE; ++i) { vgSeti(VG_MASKING, VG_FALSE); vgClear(0, 0, 256, 256); vgSeti(VG_BLEND_MODE, i); vgSeti(VG_MATRIX_MODE, VG_MATRIX_STROKE_PAINT_TO_USER); vgLoadIdentity(); vgScale(0.2f, 0.4f); vgRotate(-120.0f); vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); vgSetParameteri(strokePaint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_REPEAT); vgLoadIdentity(); vgScale(0.7f, 0.7f); vgDrawPath(path0, VG_STROKE_PATH); vgSetParameteri(strokePaint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_REFLECT); vgLoadIdentity(); vgTranslate(256.0f, 0.0f); vgScale(0.7f, 0.7f); vgDrawPath(path0, VG_STROKE_PATH); vgSetParameteri(strokePaint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_REPEAT); vgLoadIdentity(); vgTranslate(256.0f, 256.0f); vgScale(0.7f, 0.7f); vgDrawPath(path0, VG_STROKE_PATH); vgSetParameteri(strokePaint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_REFLECT); vgLoadIdentity(); vgTranslate(0.0f, 256.0f); vgScale(0.7f, 0.7f); vgDrawPath(path0, VG_STROKE_PATH); vgSeti(VG_MATRIX_MODE, VG_MATRIX_STROKE_PAINT_TO_USER); vgLoadIdentity(); vgRotate(-30.0f); vgScale(1.5f, 1.9f); vgSeti(VG_MASKING, VG_TRUE); vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); vgSetParameteri(strokePaint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_PAD); vgLoadIdentity(); vgTranslate(128.0f, 128.0f); vgRotate(45.0f); vgScale(0.9f, 0.8f); vgDrawPath(path0, VG_STROKE_PATH); strcpy(imgFileName, "stroke_path_radgrad_"); strcat(imgFileName, blendModeToString(i)); strcat(imgFileName, "_mask.png"); strcpy(testDesc, "Test stroking with radial gradient and "); strcat(testDesc, blendModeToString(i)); strcat(testDesc, " blend mode (with alpha mask)"); saveDrawingSurface(f, imgFileName, testDesc, 0, 0, 256, 256); eglSwapBuffers(display, surface); } vgDestroyImage(imgSrc); vgDestroyPath(path0); vgDestroyPaint(strokePaint);