static HRESULT WINAPI PngDecoder_Frame_CopyPalette(IWICBitmapFrameDecode *iface, IWICPalette *pIPalette) { PngDecoder *This = impl_from_IWICBitmapFrameDecode(iface); png_uint_32 ret; png_colorp png_palette; int num_palette; WICColor palette[256]; png_bytep trans; int num_trans; png_color_16p trans_values; int i; HRESULT hr=S_OK; TRACE("(%p,%p)\n", iface, pIPalette); EnterCriticalSection(&This->lock); ret = ppng_get_PLTE(This->png_ptr, This->info_ptr, &png_palette, &num_palette); if (!ret) { hr = WINCODEC_ERR_PALETTEUNAVAILABLE; goto end; } if (num_palette > 256) { ERR("palette has %i colors?!\n", num_palette); hr = E_FAIL; goto end; } for (i=0; i<num_palette; i++) { palette[i] = (0xff000000| png_palette[i].red << 16| png_palette[i].green << 8| png_palette[i].blue); } ret = ppng_get_tRNS(This->png_ptr, This->info_ptr, &trans, &num_trans, &trans_values); if (ret) { for (i=0; i<num_trans; i++) { palette[trans[i]] = 0x00000000; } } end: LeaveCriticalSection(&This->lock); if (SUCCEEDED(hr)) hr = IWICPalette_InitializeCustom(pIPalette, palette, num_palette); return hr; }
static HRESULT WINAPI PngDecoder_Frame_CopyPalette(IWICBitmapFrameDecode *iface, IWICPalette *pIPalette) { PngDecoder *This = impl_from_frame(iface); png_uint_32 ret; png_colorp png_palette; int num_palette; WICColor palette[256]; png_bytep trans; int num_trans; png_color_16p trans_values; int i; TRACE("(%p,%p)\n", iface, pIPalette); ret = ppng_get_PLTE(This->png_ptr, This->info_ptr, &png_palette, &num_palette); if (!ret) return WINCODEC_ERR_PALETTEUNAVAILABLE; if (num_palette > 256) { ERR("palette has %i colors?!\n", num_palette); return E_FAIL; } for (i=0; i<num_palette; i++) { palette[i] = (0xff000000| png_palette[i].red << 16| png_palette[i].green << 8| png_palette[i].blue); } ret = ppng_get_tRNS(This->png_ptr, This->info_ptr, &trans, &num_trans, &trans_values); if (ret) { for (i=0; i<num_trans; i++) { palette[trans[i]] = 0x00000000; } } return IWICPalette_InitializeCustom(pIPalette, palette, num_palette); }