#if defined(OPENVG_VERSION_1_1) 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_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); vgSeti(VG_MASKING, VG_TRUE); vgSeti(VG_BLEND_MODE, VG_BLEND_SRC_OVER); // path0 = rectangle 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); // path1 = flower path1 = 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(path1, 6, pathSegs, pathData); // path2 = 2 circles path2 = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, VG_PATH_CAPABILITY_ALL); vguEllipse(path2, 64.0f, 64.0f, 30.0f, 30.0f); vguEllipse(path2, 128.0f, 64.0f, 30.0f, 30.0f); vguEllipse(path2, 192.0f, 64.0f, 30.0f, 30.0f); vguEllipse(path2, 64.0f, 128.0f, 30.0f, 30.0f); vguEllipse(path2, 128.0f, 128.0f, 30.0f, 30.0f); vguEllipse(path2, 192.0f, 128.0f, 30.0f, 30.0f); vguEllipse(path2, 64.0f, 192.0f, 30.0f, 30.0f); vguEllipse(path2, 128.0f, 192.0f, 30.0f, 30.0f); vguEllipse(path2, 192.0f, 192.0f, 30.0f, 30.0f); // create mask layer layer0 = vgCreateMaskLayer(150, 120); layer1 = vgCreateMaskLayer(200, 300); // alpha mask image img = vgCreateImage(VG_sRGBA_8888, imgBarbaraAlphaWidth, imgBarbaraAlphaHeight, VG_IMAGE_QUALITY_NONANTIALIASED); vgImageSubData(img, (const void *)&imgBarbaraAlphaData[imgBarbaraAlphaWidth * (imgBarbaraAlphaHeight - 1)], -imgBarbaraAlphaDataStride, imgBarbaraAlphaFormat, 0, 0, imgBarbaraAlphaWidth, imgBarbaraAlphaHeight); vgMask(img, VG_SET_MASK, 0, 0, 256, 256); // fill layers vgFillMaskLayer(layer0, 0, 0, 150, 120, 2.0f); vgFillMaskLayer(layer0, 10, 15, 50, 40, 0.3f); vgFillMaskLayer(layer0, 20, 25, 100, 20, 0.5f); vgFillMaskLayer(layer0, 30, 100, 50, 20, 0.8f); vgFillMaskLayer(layer0, 100, 15, 30, 100, 1.0f); vgCopyMask(layer1, 20, 120, 0, 0, 200, 200); vgCopyMask(layer1, 140, 60, -10, -20, 100, 100); vgCopyMask(layer1, 80, -20, 150, 150, 180, 100); // create and set a paint for fill fillPaint = vgCreatePaint(); vgSetParameteri(fillPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR); vgSetColor(fillPaint, 0x5050B0FF); 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); vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); vgLoadIdentity(); vgSeti(VG_MASKING, VG_FALSE); vgClear(0, 0, 256, 256); vgSeti(VG_MASKING, VG_TRUE); vgMask(VG_INVALID_HANDLE, VG_CLEAR_MASK, 0, 0, 256, 256); vgMask(layer0, VG_SET_MASK, 0, 0, 256, 256); vgMask(layer0, VG_SET_MASK, 128, 128, 256, 256); vgDrawPath(path0, VG_FILL_PATH); saveDrawingSurface(f, "mask_layer_00.png", "Test vgFillMaskLayer.", 0, 0, 256, 256); eglSwapBuffers(display, surface); vgSeti(VG_MASKING, VG_FALSE); vgClear(0, 0, 256, 256); vgSeti(VG_MASKING, VG_TRUE); vgMask(VG_INVALID_HANDLE, VG_CLEAR_MASK, 0, 0, 256, 256); vgMask(layer1, VG_SET_MASK, 0, 0, 256, 256); vgDrawPath(path0, VG_FILL_PATH); saveDrawingSurface(f, "mask_layer_01.png", "Test vgCopyMask.", 0, 0, 256, 256); eglSwapBuffers(display, surface); for (i = VG_CLEAR_MASK; i <= VG_SUBTRACT_MASK; ++i) { strcpy(imgFileName, "render_to_mask_"); strcpy(testDesc, "Test vgRenderToMask with "); switch (i) { case VG_CLEAR_MASK: strcat(imgFileName, "clear.png"); strcat(testDesc, "clear operation."); break; case VG_FILL_MASK: strcat(imgFileName, "fill.png"); strcat(testDesc, "fill operation."); break; case VG_SET_MASK: strcat(imgFileName, "set.png"); strcat(testDesc, "set operation."); break; case VG_UNION_MASK: strcat(imgFileName, "union.png"); strcat(testDesc, "union operation."); break; case VG_INTERSECT_MASK: strcat(imgFileName, "intersect.png"); strcat(testDesc, "intersect operation."); break; case VG_SUBTRACT_MASK: strcat(imgFileName, "subtract.png"); strcat(testDesc, "subtract operation."); break; } vgSeti(VG_MASKING, VG_FALSE); vgClear(0, 0, 256, 256); vgSeti(VG_MASKING, VG_TRUE); vgMask(VG_INVALID_HANDLE, VG_CLEAR_MASK, 0, 0, 256, 256); vgLoadIdentity(); vgTranslate(128.0f, 128.0f); vgRotate(45.0f); vgScale(0.9f, 0.9f); vgRenderToMask(path1, VG_FILL_PATH, VG_SET_MASK); vgLoadIdentity(); vgRenderToMask(path2, VG_FILL_PATH, i); vgDrawPath(path0, VG_FILL_PATH); saveDrawingSurface(f, imgFileName, testDesc, 0, 0, 256, 256); eglSwapBuffers(display, surface); } vgDestroyPath(path0); vgDestroyPath(path1); vgDestroyPath(path2); vgDestroyPaint(fillPaint); vgDestroyMaskLayer(layer0); vgDestroyMaskLayer(layer1); vgDestroyImage(img); #endif