// create image and load external data imgSrc = vgCreateImage(VG_lRGBA_8888, imgGirlAlphaWidth, imgGirlAlphaHeight, VG_IMAGE_QUALITY_NONANTIALIASED); vgImageSubData(imgSrc, (const void *)imgGirlAlphaData, imgGirlAlphaDataStride, imgGirlAlphaFormat, 0, 0, imgGirlAlphaWidth, imgGirlAlphaHeight); imgDst = vgCreateImage(VG_lRGBA_8888, imgGirlAlphaWidth, imgGirlAlphaHeight, VG_IMAGE_QUALITY_NONANTIALIASED); // create a desaturate matrix s = 0.5f; colMatrix[0] = 0.213f + 0.787f * s; colMatrix[4] = 0.715f - 0.715f * s; colMatrix[8] = 0.072f - 0.072f * s; colMatrix[12] = 0.0f; colMatrix[16] = 0.0f; colMatrix[1] = 0.213f - 0.213f * s; colMatrix[5] = 0.715f + 0.285f * s; colMatrix[9] = 0.072f - 0.072f * s; colMatrix[13] = 0.0f; colMatrix[17] = 0.0f; colMatrix[2] = 0.213f - 0.213f * s; colMatrix[6] = 0.715f - 0.715f * s; colMatrix[10] = 0.072f + 0.928f * s; colMatrix[14] = 0.0f; colMatrix[18] = 0.0f; colMatrix[3] = 0.0f; colMatrix[7] = 0.0f; colMatrix[11] = 0.0f; colMatrix[15] = 1.0f; colMatrix[19] = 0.0f; vgSeti(VG_FILTER_CHANNEL_MASK, VG_RED | VG_GREEN | VG_BLUE | VG_ALPHA); // apply filter in linear unpremultiplied color space vgSeti(VG_FILTER_FORMAT_LINEAR, VG_TRUE); vgSeti(VG_FILTER_FORMAT_PREMULTIPLIED, VG_FALSE); vgColorMatrix(imgDst, imgSrc, colMatrix); vgGetImageSubData(imgDst, imgOutputDataRGBA, imgGirlAlphaDataStride, imgGirlAlphaFormat, 0, 0, imgGirlAlphaWidth, imgGirlAlphaHeight); strcpy(imgFileName, "filter_colormatrix_l.png"); saveImage32(f, imgFileName, "Apply desaturate filter in linear unpremultiplied color space.", imgGirlAlphaWidth, imgGirlAlphaHeight, imgOutputDataRGBA, 0); // apply desaturate filter in linear premultiplied color space vgSeti(VG_FILTER_FORMAT_LINEAR, VG_TRUE); vgSeti(VG_FILTER_FORMAT_PREMULTIPLIED, VG_TRUE); vgColorMatrix(imgDst, imgSrc, colMatrix); vgGetImageSubData(imgDst, imgOutputDataRGBA, imgGirlAlphaDataStride, imgGirlAlphaFormat, 0, 0, imgGirlAlphaWidth, imgGirlAlphaHeight); strcpy(imgFileName, "filter_colormatrix_l_pre.png"); saveImage32(f, imgFileName, "Apply desaturate filter in linear premultiplied color space.", imgGirlAlphaWidth, imgGirlAlphaHeight, imgOutputDataRGBA, 0); // apply desaturate filter in non-linear unpremultiplied color space vgSeti(VG_FILTER_FORMAT_LINEAR, VG_FALSE); vgSeti(VG_FILTER_FORMAT_PREMULTIPLIED, VG_FALSE); vgColorMatrix(imgDst, imgSrc, colMatrix); vgGetImageSubData(imgDst, imgOutputDataRGBA, imgGirlAlphaDataStride, imgGirlAlphaFormat, 0, 0, imgGirlAlphaWidth, imgGirlAlphaHeight); strcpy(imgFileName, "filter_colormatrix_s.png"); saveImage32(f, imgFileName, "Apply desaturate filter in non-linear unpremultiplied color space.", imgGirlAlphaWidth, imgGirlAlphaHeight, imgOutputDataRGBA, 0); // apply desaturate filter in non-linear premultiplied color space vgSeti(VG_FILTER_FORMAT_LINEAR, VG_FALSE); vgSeti(VG_FILTER_FORMAT_PREMULTIPLIED, VG_TRUE); vgColorMatrix(imgDst, imgSrc, colMatrix); vgGetImageSubData(imgDst, imgOutputDataRGBA, imgGirlAlphaDataStride, imgGirlAlphaFormat, 0, 0, imgGirlAlphaWidth, imgGirlAlphaHeight); strcpy(imgFileName, "filter_colormatrix_s_pre.png"); saveImage32(f, imgFileName, "Apply desaturate filter in non-linear premultiplied color space.", imgGirlAlphaWidth, imgGirlAlphaHeight, imgOutputDataRGBA, 0); vgDestroyImage(imgSrc); vgDestroyImage(imgDst);