vgSeti(VG_RENDERING_QUALITY, VG_RENDERING_QUALITY_BETTER); vgSeti(VG_IMAGE_QUALITY, VG_IMAGE_QUALITY_BETTER); vgSeti(VG_SCISSORING, VG_FALSE); vgSeti(VG_MASKING, VG_TRUE); // 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); imgTmp = vgCreateImage(VG_lRGBA_8888, imgBarbaraAlphaWidth, imgBarbaraAlphaHeight, VG_IMAGE_QUALITY_NONANTIALIASED); vgImageSubData(imgTmp, (const void *)imgBarbaraAlphaData, 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); vguRect(path0, 10.0f, 10.0f, 236.0f, 236.0f); vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); vgLoadIdentity(); // create and set a paint for fill fillPaint = vgCreatePaint(); vgSetParameteri(fillPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR); vgSetColor(fillPaint, 0x8080FFFF); vgSetPaint(fillPaint, VG_FILL_PATH); // set clear color col[0] = 1.0f; col[1] = 1.0f; col[2] = 1.0f; col[3] = 1.0f; vgSetfv(VG_CLEAR_COLOR, 4, col); // test CLEAR operation vgClear(0, 0, 256, 256); vgMask(imgSrc, VG_SET_MASK, 0, 0, 256, 256); vgMask(VG_INVALID_HANDLE, VG_CLEAR_MASK, -128, -128, 256, 256); vgDrawPath(path0, VG_FILL_PATH); saveDrawingSurface(f, "vgmasking_clear.png", "vgMask CLEAR operation.", 0, 0, 256, 256); eglSwapBuffers(display, surface); // test FILL operation vgClear(0, 0, 256, 256); vgMask(imgSrc, VG_SET_MASK, 0, 0, 256, 256); vgMask(VG_INVALID_HANDLE, VG_FILL_MASK, 128, 128, 256, 256); vgDrawPath(path0, VG_FILL_PATH); saveDrawingSurface(f, "vgmasking_fill.png", "vgMask FILL operation.", 0, 0, 256, 256); eglSwapBuffers(display, surface); // test SET operation vgClear(0, 0, 256, 256); vgMask(imgSrc, VG_SET_MASK, 0, 0, 256, 256); vgMask(imgTmp, VG_SET_MASK, -128, 0, 256, 256); vgDrawPath(path0, VG_FILL_PATH); saveDrawingSurface(f, "vgmasking_set.png", "vgMask SET operation.", 0, 0, 256, 256); eglSwapBuffers(display, surface); // test UNION operation vgClear(0, 0, 256, 256); vgMask(imgSrc, VG_SET_MASK, 0, 0, 256, 256); vgMask(imgTmp, VG_UNION_MASK, 0, 0, 256, 256); vgDrawPath(path0, VG_FILL_PATH); saveDrawingSurface(f, "vgmasking_union.png", "vgMask UNION operation.", 0, 0, 256, 256); eglSwapBuffers(display, surface); // test INTERSECT operation vgClear(0, 0, 256, 256); vgMask(imgSrc, VG_SET_MASK, 0, 0, 256, 256); vgMask(imgTmp, VG_INTERSECT_MASK, 0, 0, 256, 256); vgDrawPath(path0, VG_FILL_PATH); saveDrawingSurface(f, "vgmasking_intersect.png", "vgMask INTERSECT operation.", 0, 0, 256, 256); eglSwapBuffers(display, surface); // test SUBTRACT operation vgClear(0, 0, 256, 256); vgMask(imgSrc, VG_SET_MASK, 0, 0, 256, 256); vgMask(imgTmp, VG_SUBTRACT_MASK, 0, 0, 256, 256); vgDrawPath(path0, VG_FILL_PATH); saveDrawingSurface(f, "vgmasking_subtract.png", "vgMask SUBTRACT operation.", 0, 0, 256, 256); eglSwapBuffers(display, surface); vgDestroyImage(imgSrc); vgDestroyImage(imgTmp); vgDestroyPath(path0); vgDestroyPaint(fillPaint);