// 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); // set channel masks vgSeti(VG_FILTER_CHANNEL_MASK, VG_RED | VG_GREEN | VG_BLUE | VG_ALPHA); vgSeti(VG_FILTER_FORMAT_LINEAR, VG_TRUE); vgSeti(VG_FILTER_FORMAT_PREMULTIPLIED, VG_FALSE); // generate a non-premultiplied palatte for (i = 0; i < 256; ++i) { VGubyte r = (VGubyte)(127.0f * sin(2 * (i * 6.2831f / 256.0f)) + 127.5f); VGubyte g = (VGubyte)(127.0f * sin(1 * (i * 6.2831f / 256.0f)) + 127.5f); VGubyte b = (VGubyte)(127.0f * cos(1 * (i * 6.2831f / 256.0f)) + 127.5f); VGubyte a = i; lut[i] = (r << 24) | (g << 16) | (b << 8) | a; } // lookup single filter (using red source channel), in linear non-premultiplied color space vgLookupSingle(imgDst, imgSrc, lut, VG_RED, VG_TRUE, VG_FALSE); vgGetImageSubData(imgDst, imgOutputDataRGBA, imgGirlAlphaDataStride, imgGirlAlphaFormat, 0, 0, imgGirlAlphaWidth, imgGirlAlphaHeight); strcpy(imgFileName, "filter_lookup_single_l.png"); saveImage32(f, imgFileName, "Lookup single filter (using red source channel), in linear non-premultiplied color space.", imgGirlAlphaWidth, imgGirlAlphaHeight, imgOutputDataRGBA, 0); // lookup single filter (using green source channel), in non-linear non-premultiplied color space vgLookupSingle(imgDst, imgSrc, lut, VG_GREEN, VG_FALSE, VG_FALSE); vgGetImageSubData(imgDst, imgOutputDataRGBA, imgGirlAlphaDataStride, imgGirlAlphaFormat, 0, 0, imgGirlAlphaWidth, imgGirlAlphaHeight); strcpy(imgFileName, "filter_lookup_single_s.png"); saveImage32(f, imgFileName, "Lookup single filter (using green source channel), in non-linear non-premultiplied color space.", imgGirlAlphaWidth, imgGirlAlphaHeight, imgOutputDataRGBA, 0); // generate a premultiplied palatte for (i = 0; i < 256; ++i) { VGubyte a = i; VGubyte r = (VGubyte)(a * (127.0f * sin(2 * (i * 6.2831f / 256.0f)) + 127.5f) / 255.0f); VGubyte g = (VGubyte)(a * (127.0f * sin(1 * (i * 6.2831f / 256.0f)) + 127.5f) / 255.0f); VGubyte b = (VGubyte)(a * (127.0f * cos(1 * (i * 6.2831f / 256.0f)) + 127.5f) / 255.0f); lut[i] = (r << 24) | (g << 16) | (b << 8) | a; } // lookup single filter (using blue source channel), in linear premultiplied color space vgLookupSingle(imgDst, imgSrc, lut, VG_BLUE, VG_TRUE, VG_TRUE); vgGetImageSubData(imgDst, imgOutputDataRGBA, imgGirlAlphaDataStride, imgGirlAlphaFormat, 0, 0, imgGirlAlphaWidth, imgGirlAlphaHeight); strcpy(imgFileName, "filter_lookup_single_lpre.png"); saveImage32(f, imgFileName, "Lookup single filter (using blue source channel), in linear non-premultiplied color space.", imgGirlAlphaWidth, imgGirlAlphaHeight, imgOutputDataRGBA, 0); // lookup single filter (using alpha source channel), in non-linear premultiplied color space vgLookupSingle(imgDst, imgSrc, lut, VG_ALPHA, VG_FALSE, VG_TRUE); vgGetImageSubData(imgDst, imgOutputDataRGBA, imgGirlAlphaDataStride, imgGirlAlphaFormat, 0, 0, imgGirlAlphaWidth, imgGirlAlphaHeight); strcpy(imgFileName, "filter_lookup_single_spre.png"); saveImage32(f, imgFileName, "Lookup single filter (using alpha source channel), in non-linear non-premultiplied color space.", imgGirlAlphaWidth, imgGirlAlphaHeight, imgOutputDataRGBA, 0); vgDestroyImage(imgSrc); vgDestroyImage(imgDst);