+static LONG obj_refcount(void *obj)
+{
+ IUnknown_AddRef((IUnknown *)obj);
+ return IUnknown_Release((IUnknown *)obj);
+}
+
+static void test_IMILBitmap(void)
+{
+ HRESULT hr;
+ IWICBitmap *bitmap;
+ IWICBitmapScaler *scaler;
+ IMILBitmap *mil_bitmap;
+ IMILBitmapSource *mil_source;
+ IMILBitmapScaler *mil_scaler;
+ IUnknown *wic_unknown, *mil_unknown;
+ WICPixelFormatGUID format;
+ int MIL_format;
+ UINT width, height;
+ double dpix, dpiy;
+ BYTE buf[256];
+
+ /* Bitmap */
+ hr = IWICImagingFactory_CreateBitmap(factory, 1, 1, &GUID_WICPixelFormat24bppBGR,
+ WICBitmapCacheOnDemand, &bitmap);
+ ok(hr == S_OK, "CreateBitmap error %#x\n", hr);
+
+ ok(obj_refcount(bitmap) == 1, "ref count %d\n", obj_refcount(bitmap));
+
+ hr = IWICBitmap_GetPixelFormat(bitmap, &format);
+ ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
+ ok(IsEqualGUID(&format, &GUID_WICPixelFormat24bppBGR), "wrong format %s\n", wine_dbgstr_guid(&format));
+
+ hr = IWICBitmap_GetResolution(bitmap, &dpix, &dpiy);
+ ok(hr == S_OK, "GetResolution error %#x\n", hr);
+ ok(dpix == 0.0, "got %f, expected 0.0\n", dpix);
+ ok(dpiy == 0.0, "got %f, expected 0.0\n", dpiy);
+
+ hr = IWICBitmap_SetResolution(bitmap, 12.0, 34.0);
+ ok(hr == S_OK, "SetResolution error %#x\n", hr);
+
+ hr = IWICBitmap_GetResolution(bitmap, &dpix, &dpiy);
+ ok(hr == S_OK, "GetResolution error %#x\n", hr);
+ ok(dpix == 12.0, "got %f, expected 12.0\n", dpix);
+ ok(dpiy == 34.0, "got %f, expected 34.0\n", dpiy);
+
+ hr = IWICBitmap_GetSize(bitmap, &width, &height);
+ ok(hr == S_OK, "GetSize error %#x\n", hr);
+ ok(width == 1, "got %u, expected 1\n", width);
+ ok(height == 1, "got %u, expected 1\n", height);
+
+ hr = IWICBitmap_QueryInterface(bitmap, &IID_IMILBitmap, (void **)&mil_bitmap);
+ ok(hr == S_OK, "QueryInterface error %#x\n", hr);
+
+ ok(obj_refcount(bitmap) == 2, "ref count %d\n", obj_refcount(bitmap));
+ ok(obj_refcount(mil_bitmap) == 2, "ref count %d\n", obj_refcount(mil_bitmap));
+
+ hr = IWICBitmap_QueryInterface(bitmap, &IID_IUnknown, (void **)&wic_unknown);
+ ok(hr == S_OK, "QueryInterface error %#x\n", hr);
+
+ hr = mil_bitmap->lpVtbl->QueryInterface(mil_bitmap, &IID_IUnknown, (void **)&mil_unknown);
+ ok(hr == S_OK, "QueryInterface error %#x\n", hr);
+ ok((void *)wic_unknown->lpVtbl == (void *)mil_unknown->lpVtbl, "wrong lpVtbl ptrs %p != %p\n", wic_unknown->lpVtbl, mil_unknown->lpVtbl);
+
+ IUnknown_Release(wic_unknown);
+ IUnknown_Release(mil_unknown);
+
+ hr = IWICBitmap_QueryInterface(bitmap, &IID_IMILBitmapSource, (void **)&mil_source);
+ ok(hr == S_OK, "QueryInterface error %#x\n", hr);
+ ok((void *)mil_source->lpVtbl == (void *)mil_bitmap->lpVtbl, "IMILBitmap->lpVtbl should be equal to IMILBitmapSource->lpVtbl\n");
+
+ ok(obj_refcount(bitmap) == 3, "ref count %d\n", obj_refcount(bitmap));
+ ok(obj_refcount(mil_bitmap) == 3, "ref count %d\n", obj_refcount(mil_bitmap));
+ ok(obj_refcount(mil_source) == 3, "ref count %d\n", obj_refcount(mil_source));
+
+ hr = mil_source->lpVtbl->GetPixelFormat(mil_source, &MIL_format);
+ ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
+ ok(MIL_format == 0x0c, "wrong format %d\n", MIL_format);
+
+ hr = mil_source->lpVtbl->GetResolution(mil_source, &dpix, &dpiy);
+ ok(hr == S_OK, "GetResolution error %#x\n", hr);
+ ok(dpix == 12.0, "got %f, expected 12.0\n", dpix);
+ ok(dpiy == 34.0, "got %f, expected 34.0\n", dpiy);
+
+ hr = mil_source->lpVtbl->GetSize(mil_source, &width, &height);
+ ok(hr == S_OK, "GetSize error %#x\n", hr);
+ ok(width == 1, "got %u, expected 1\n", width);
+ ok(height == 1, "got %u, expected 1\n", height);
+
+ /* Scaler */
+ hr = IWICImagingFactory_CreateBitmapScaler(factory, &scaler);
+ ok(hr == S_OK, "CreateBitmapScaler error %#x\n", hr);
+
+ ok(obj_refcount(scaler) == 1, "ref count %d\n", obj_refcount(scaler));
+
+ hr = IWICBitmapScaler_QueryInterface(scaler, &IID_IMILBitmapScaler, (void **)&mil_scaler);
+ ok(hr == S_OK, "QueryInterface error %#x\n", hr);
+
+ ok(obj_refcount(scaler) == 2, "ref count %d\n", obj_refcount(scaler));
+ ok(obj_refcount(mil_scaler) == 2, "ref count %d\n", obj_refcount(mil_scaler));
+
+ hr = IWICBitmapScaler_QueryInterface(scaler, &IID_IUnknown, (void **)&wic_unknown);
+ ok(hr == S_OK, "QueryInterface error %#x\n", hr);
+
+ hr = mil_scaler->lpVtbl->QueryInterface(mil_scaler, &IID_IUnknown, (void **)&mil_unknown);
+ ok(hr == S_OK, "QueryInterface error %#x\n", hr);
+ ok((void *)wic_unknown->lpVtbl == (void *)mil_unknown->lpVtbl, "wrong lpVtbl ptrs %p != %p\n", wic_unknown->lpVtbl, mil_unknown->lpVtbl);
+
+ IUnknown_Release(wic_unknown);
+ IUnknown_Release(mil_unknown);
+
+ hr = mil_scaler->lpVtbl->GetPixelFormat(mil_scaler, &MIL_format);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "GetPixelFormat error %#x\n", hr);
+
+ hr = mil_scaler->lpVtbl->GetResolution(mil_scaler, &dpix, &dpiy);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "GetResolution error %#x\n", hr);
+
+ hr = mil_scaler->lpVtbl->GetSize(mil_scaler, &width, &height);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "GetSize error %#x\n", hr);
+
+ memset(buf, 0xde, sizeof(buf));
+ hr = mil_scaler->lpVtbl->CopyPixels(mil_scaler, NULL, 3, sizeof(buf), buf);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "CopyPixels error %#x\n", hr);
+
+ hr = mil_scaler->lpVtbl->Initialize(mil_scaler, mil_source, 1, 1, 1);
+ ok(hr == S_OK, "Initialize error %#x\n", hr);
+
+ hr = mil_scaler->lpVtbl->GetPixelFormat(mil_scaler, &MIL_format);
+ ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
+ ok(MIL_format == 0x0c, "wrong format %d\n", MIL_format);
+
+ hr = mil_scaler->lpVtbl->GetResolution(mil_scaler, &dpix, &dpiy);
+ ok(hr == S_OK, "GetResolution error %#x\n", hr);
+ ok(dpix == 12.0, "got %f, expected 12.0\n", dpix);
+ ok(dpiy == 34.0, "got %f, expected 34.0\n", dpiy);
+
+ hr = mil_scaler->lpVtbl->GetSize(mil_scaler, &width, &height);
+ ok(hr == S_OK, "GetSize error %#x\n", hr);
+ ok(width == 1, "got %u, expected 1\n", width);
+ ok(height == 1, "got %u, expected 1\n", height);
+
+ memset(buf, 0xde, sizeof(buf));
+ hr = mil_scaler->lpVtbl->CopyPixels(mil_scaler, NULL, 3, sizeof(buf), buf);
+ ok(hr == S_OK, "CopyPixels error %#x\n", hr);
+ ok(buf[0] == 0 && buf[1] == 0 && buf[2] == 0 && buf[3] == 0xde,"wrong data: %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3]);
+
+ mil_scaler->lpVtbl->Release(mil_scaler);
+ IWICBitmapScaler_Release(scaler);
+ mil_source->lpVtbl->Release(mil_source);
+ mil_bitmap->lpVtbl->Release(mil_bitmap);
+ IWICBitmap_Release(bitmap);
+}
+