21#if defined(CLSID_WICImagingFactory)
22 #undef CLSID_WICImagingFactory
32 ImageGeneratorWIC(
const SkImageInfo&
info, IWICImagingFactory* imagingFactory,
41 SkTScopedComPtr<IWICImagingFactory> fImagingFactory;
42 SkTScopedComPtr<IWICBitmapSource> fImageSource;
49std::unique_ptr<SkImageGenerator> SkImageGeneratorWIC::MakeFromEncodedWIC(
sk_sp<SkData> data) {
51 SkTScopedComPtr<IWICImagingFactory> imagingFactory;
52 HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory,
nullptr, CLSCTX_INPROC_SERVER,
53 IID_PPV_ARGS(&imagingFactory));
59 SkTScopedComPtr<IStream> iStream;
62 hr = SkIStream::CreateFromSkStream(std::make_unique<SkMemoryStream>(
data), &iStream);
68 SkTScopedComPtr<IWICBitmapDecoder> decoder;
69 hr = imagingFactory->CreateDecoderFromStream(iStream.get(),
nullptr,
70 WICDecodeMetadataCacheOnDemand, &decoder);
76 SkTScopedComPtr<IWICBitmapFrameDecode> imageFrame;
77 hr = decoder->GetFrame(0, &imageFrame);
83 SkTScopedComPtr<IWICBitmapSource> imageSource;
84 hr = imageFrame->QueryInterface(IID_PPV_ARGS(&imageSource));
99 hr = imageSource->GetPixelFormat(&
format);
110 if (GUID_WICPixelFormat16bppBGR555 ==
format ||
111 GUID_WICPixelFormat16bppBGR565 ==
format ||
112 GUID_WICPixelFormat32bppBGR101010 ==
format ||
113 GUID_WICPixelFormatBlackWhite ==
format ||
114 GUID_WICPixelFormat2bppGray ==
format ||
115 GUID_WICPixelFormat4bppGray ==
format ||
116 GUID_WICPixelFormat8bppGray ==
format ||
117 GUID_WICPixelFormat16bppGray ==
format ||
118 GUID_WICPixelFormat16bppGrayFixedPoint ==
format ||
119 GUID_WICPixelFormat16bppGrayHalf ==
format ||
120 GUID_WICPixelFormat32bppGrayFloat ==
format ||
121 GUID_WICPixelFormat32bppGrayFixedPoint ==
format ||
122 GUID_WICPixelFormat32bppRGBE ==
format ||
123 GUID_WICPixelFormat24bppRGB ==
format ||
124 GUID_WICPixelFormat24bppBGR ==
format ||
125 GUID_WICPixelFormat32bppBGR ==
format ||
126 GUID_WICPixelFormat48bppRGB ==
format ||
127 GUID_WICPixelFormat48bppBGR ==
format ||
128 GUID_WICPixelFormat48bppRGBFixedPoint ==
format ||
129 GUID_WICPixelFormat48bppBGRFixedPoint ==
format ||
130 GUID_WICPixelFormat48bppRGBHalf ==
format ||
131 GUID_WICPixelFormat64bppRGBFixedPoint ==
format ||
132 GUID_WICPixelFormat64bppRGBHalf ==
format ||
133 GUID_WICPixelFormat96bppRGBFixedPoint ==
format ||
134 GUID_WICPixelFormat128bppRGBFloat ==
format ||
135 GUID_WICPixelFormat128bppRGBFixedPoint ==
format ||
136 GUID_WICPixelFormat32bppRGB ==
format ||
137 GUID_WICPixelFormat64bppRGB ==
format ||
138 GUID_WICPixelFormat96bppRGBFloat ==
format ||
139 GUID_WICPixelFormat32bppCMYK ==
format ||
140 GUID_WICPixelFormat64bppCMYK ==
format ||
141 GUID_WICPixelFormat8bppY ==
format ||
142 GUID_WICPixelFormat8bppCb ==
format ||
143 GUID_WICPixelFormat8bppCr ==
format ||
144 GUID_WICPixelFormat16bppCbCr ==
format)
152 return std::unique_ptr<SkImageGenerator>(
153 new ImageGeneratorWIC(
info, imagingFactory.release(), imageSource.release(),
158 IWICImagingFactory* imagingFactory, IWICBitmapSource* imageSource,
sk_sp<SkData> data)
160 , fImagingFactory(imagingFactory)
161 , fImageSource(imageSource)
169bool ImageGeneratorWIC::onGetPixels(
const SkImageInfo&
info,
void* pixels,
size_t rowBytes,
171 if (kN32_SkColorType !=
info.colorType()) {
176 SkTScopedComPtr<IWICFormatConverter> formatConverter;
177 HRESULT hr = fImagingFactory->CreateFormatConverter(&formatConverter);
184 format = GUID_WICPixelFormat32bppBGRA;
187 hr = formatConverter->Initialize(fImageSource.get(),
format, WICBitmapDitherTypeNone,
nullptr,
188 0.0, WICBitmapPaletteTypeCustom);
194 SkTScopedComPtr<IWICBitmapSource> formatConverterSrc;
195 hr = formatConverter->QueryInterface(IID_PPV_ARGS(&formatConverterSrc));
201 hr = formatConverterSrc->CopyPixels(
nullptr, (
UINT) rowBytes, (
UINT) rowBytes *
info.height(),
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
@ kOpaque_SkAlphaType
pixel is opaque
@ kPremul_SkAlphaType
pixel components are premultiplied by alpha
#define INHERITED(method,...)
SkImageGenerator(const SkImageInfo &info, uint32_t uniqueId=kNeedNewImageUniqueID)
virtual sk_sp< SkData > onRefEncodedData()
virtual bool onGetPixels(const SkImageInfo &, void *, size_t, const Options &)
uint32_t uint32_t * format
static SkImageInfo MakeS32(int width, int height, SkAlphaType at)
std::shared_ptr< const fml::Mapping > data