static ULONG STDMETHODCALLTYPE d2d_layer_Release(ID2D1Layer *iface) { struct d2d_layer *layer = impl_from_ID2D1Layer(iface); ULONG refcount = InterlockedDecrement(&layer->refcount); TRACE("%p decreasing refcount to %u.\n", iface, refcount); if (!refcount) { ID2D1Factory_Release(layer->factory); HeapFree(GetProcessHeap(), 0, layer); } return refcount; }
static ULONG STDMETHODCALLTYPE d2d_bitmap_Release(ID2D1Bitmap *iface) { struct d2d_bitmap *bitmap = impl_from_ID2D1Bitmap(iface); ULONG refcount = InterlockedDecrement(&bitmap->refcount); TRACE("%p decreasing refcount to %u.\n", iface, refcount); if (!refcount) { ID3D10ShaderResourceView_Release(bitmap->view); ID2D1Factory_Release(bitmap->factory); HeapFree(GetProcessHeap(), 0, bitmap); } return refcount; }
static ULONG STDMETHODCALLTYPE d2d_gradient_Release(ID2D1GradientStopCollection *iface) { struct d2d_gradient *gradient = impl_from_ID2D1GradientStopCollection(iface); ULONG refcount = InterlockedDecrement(&gradient->refcount); TRACE("%p decreasing refcount to %u.\n", iface, refcount); if (!refcount) { HeapFree(GetProcessHeap(), 0, gradient->stops); ID2D1Factory_Release(gradient->factory); HeapFree(GetProcessHeap(), 0, gradient); } return refcount; }
static ID2D1RenderTarget *create_render_target(IDXGISurface *surface) { D2D1_RENDER_TARGET_PROPERTIES desc; ID2D1RenderTarget *render_target; ID2D1Factory *factory; HRESULT hr; hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory, NULL, (void **)&factory); ok(SUCCEEDED(hr), "Failed to create factory, hr %#x.\n", hr); desc.type = D2D1_RENDER_TARGET_TYPE_DEFAULT; desc.pixelFormat.format = DXGI_FORMAT_UNKNOWN; desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE; desc.dpiX = 0.0f; desc.dpiY = 0.0f; desc.usage = D2D1_RENDER_TARGET_USAGE_NONE; desc.minLevel = D2D1_FEATURE_LEVEL_DEFAULT; hr = ID2D1Factory_CreateDxgiSurfaceRenderTarget(factory, surface, &desc, &render_target); ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr); ID2D1Factory_Release(factory); return render_target; }
static void test_state_block(void) { IDWriteRenderingParams *text_rendering_params1, *text_rendering_params2; D2D1_DRAWING_STATE_DESCRIPTION drawing_state; ID2D1DrawingStateBlock *state_block; IDWriteFactory *dwrite_factory; IDXGISwapChain *swapchain; ID2D1RenderTarget *rt; ID3D10Device1 *device; IDXGISurface *surface; ID2D1Factory *factory; ULONG refcount; HWND window; HRESULT hr; static const D2D1_MATRIX_3X2_F identity = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, }; static const D2D1_MATRIX_3X2_F transform1 = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, }; static const D2D1_MATRIX_3X2_F transform2 = { 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, }; if (!(device = create_device())) { skip("Failed to create device, skipping tests.\n"); return; } window = CreateWindowA("static", "d2d1_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 640, 480, NULL, NULL, NULL, NULL); swapchain = create_swapchain(device, window, TRUE); hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_IDXGISurface, (void **)&surface); ok(SUCCEEDED(hr), "Failed to get buffer, hr %#x.\n", hr); rt = create_render_target(surface); ok(!!rt, "Failed to create render target.\n"); ID2D1RenderTarget_GetFactory(rt, &factory); hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IDWriteFactory, (IUnknown **)&dwrite_factory); ok(SUCCEEDED(hr), "Failed to create dwrite factory, hr %#x.\n", hr); hr = IDWriteFactory_CreateRenderingParams(dwrite_factory, &text_rendering_params1); ok(SUCCEEDED(hr), "Failed to create dwrite rendering params, hr %#x.\n", hr); IDWriteFactory_Release(dwrite_factory); drawing_state.antialiasMode = ID2D1RenderTarget_GetAntialiasMode(rt); ok(drawing_state.antialiasMode == D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, "Got unexpected antialias mode %#x.\n", drawing_state.antialiasMode); drawing_state.textAntialiasMode = ID2D1RenderTarget_GetTextAntialiasMode(rt); ok(drawing_state.textAntialiasMode == D2D1_TEXT_ANTIALIAS_MODE_DEFAULT, "Got unexpected text antialias mode %#x.\n", drawing_state.textAntialiasMode); ID2D1RenderTarget_GetTags(rt, &drawing_state.tag1, &drawing_state.tag2); ok(!drawing_state.tag1 && !drawing_state.tag2, "Got unexpected tags %08x%08x:%08x%08x.\n", (unsigned int)(drawing_state.tag1 >> 32), (unsigned int)(drawing_state.tag1), (unsigned int)(drawing_state.tag2 >> 32), (unsigned int)(drawing_state.tag2)); ID2D1RenderTarget_GetTransform(rt, &drawing_state.transform); ok(!memcmp(&drawing_state.transform, &identity, sizeof(drawing_state.transform)), "Got unexpected matrix {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e}.\n", drawing_state.transform._11, drawing_state.transform._12, drawing_state.transform._21, drawing_state.transform._22, drawing_state.transform._31, drawing_state.transform._32); ID2D1RenderTarget_GetTextRenderingParams(rt, &text_rendering_params2); ok(!text_rendering_params2, "Got unexpected text rendering params %p.\n", text_rendering_params2); hr = ID2D1Factory_CreateDrawingStateBlock(factory, NULL, NULL, &state_block); ok(SUCCEEDED(hr), "Failed to create drawing state block, hr %#x\n", hr); ID2D1DrawingStateBlock_GetDescription(state_block, &drawing_state); ok(drawing_state.antialiasMode == D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, "Got unexpected antialias mode %#x.\n", drawing_state.antialiasMode); ok(drawing_state.textAntialiasMode == D2D1_TEXT_ANTIALIAS_MODE_DEFAULT, "Got unexpected text antialias mode %#x.\n", drawing_state.textAntialiasMode); ok(!drawing_state.tag1 && !drawing_state.tag2, "Got unexpected tags %08x%08x:%08x%08x.\n", (unsigned int)(drawing_state.tag1 >> 32), (unsigned int)(drawing_state.tag1), (unsigned int)(drawing_state.tag2 >> 32), (unsigned int)(drawing_state.tag2)); ok(!memcmp(&drawing_state.transform, &identity, sizeof(drawing_state.transform)), "Got unexpected matrix {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e}.\n", drawing_state.transform._11, drawing_state.transform._12, drawing_state.transform._21, drawing_state.transform._22, drawing_state.transform._31, drawing_state.transform._32); ID2D1DrawingStateBlock_GetTextRenderingParams(state_block, &text_rendering_params2); ok(!text_rendering_params2, "Got unexpected text rendering params %p.\n", text_rendering_params2); ID2D1DrawingStateBlock_Release(state_block); drawing_state.antialiasMode = D2D1_ANTIALIAS_MODE_ALIASED; drawing_state.textAntialiasMode = D2D1_TEXT_ANTIALIAS_MODE_ALIASED; drawing_state.tag1 = 0xdead; drawing_state.tag2 = 0xbeef; drawing_state.transform = transform1; hr = ID2D1Factory_CreateDrawingStateBlock(factory, &drawing_state, text_rendering_params1, &state_block); ok(SUCCEEDED(hr), "Failed to create drawing state block, hr %#x\n", hr); ID2D1DrawingStateBlock_GetDescription(state_block, &drawing_state); ok(drawing_state.antialiasMode == D2D1_ANTIALIAS_MODE_ALIASED, "Got unexpected antialias mode %#x.\n", drawing_state.antialiasMode); ok(drawing_state.textAntialiasMode == D2D1_TEXT_ANTIALIAS_MODE_ALIASED, "Got unexpected text antialias mode %#x.\n", drawing_state.textAntialiasMode); ok(drawing_state.tag1 == 0xdead && drawing_state.tag2 == 0xbeef, "Got unexpected tags %08x%08x:%08x%08x.\n", (unsigned int)(drawing_state.tag1 >> 32), (unsigned int)(drawing_state.tag1), (unsigned int)(drawing_state.tag2 >> 32), (unsigned int)(drawing_state.tag2)); ok(!memcmp(&drawing_state.transform, &transform1, sizeof(drawing_state.transform)), "Got unexpected matrix {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e}.\n", drawing_state.transform._11, drawing_state.transform._12, drawing_state.transform._21, drawing_state.transform._22, drawing_state.transform._31, drawing_state.transform._32); ID2D1DrawingStateBlock_GetTextRenderingParams(state_block, &text_rendering_params2); ok(text_rendering_params2 == text_rendering_params1, "Got unexpected text rendering params %p, expected %p.\n", text_rendering_params2, text_rendering_params1); IDWriteRenderingParams_Release(text_rendering_params2); ID2D1RenderTarget_RestoreDrawingState(rt, state_block); drawing_state.antialiasMode = ID2D1RenderTarget_GetAntialiasMode(rt); ok(drawing_state.antialiasMode == D2D1_ANTIALIAS_MODE_ALIASED, "Got unexpected antialias mode %#x.\n", drawing_state.antialiasMode); drawing_state.textAntialiasMode = ID2D1RenderTarget_GetTextAntialiasMode(rt); ok(drawing_state.textAntialiasMode == D2D1_TEXT_ANTIALIAS_MODE_ALIASED, "Got unexpected text antialias mode %#x.\n", drawing_state.textAntialiasMode); ID2D1RenderTarget_GetTags(rt, &drawing_state.tag1, &drawing_state.tag2); ok(drawing_state.tag1 == 0xdead && drawing_state.tag2 == 0xbeef, "Got unexpected tags %08x%08x:%08x%08x.\n", (unsigned int)(drawing_state.tag1 >> 32), (unsigned int)(drawing_state.tag1), (unsigned int)(drawing_state.tag2 >> 32), (unsigned int)(drawing_state.tag2)); ID2D1RenderTarget_GetTransform(rt, &drawing_state.transform); ok(!memcmp(&drawing_state.transform, &transform1, sizeof(drawing_state.transform)), "Got unexpected matrix {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e}.\n", drawing_state.transform._11, drawing_state.transform._12, drawing_state.transform._21, drawing_state.transform._22, drawing_state.transform._31, drawing_state.transform._32); ID2D1RenderTarget_GetTextRenderingParams(rt, &text_rendering_params2); ok(text_rendering_params2 == text_rendering_params1, "Got unexpected text rendering params %p, expected %p.\n", text_rendering_params2, text_rendering_params1); IDWriteRenderingParams_Release(text_rendering_params2); ID2D1RenderTarget_SetAntialiasMode(rt, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); ID2D1RenderTarget_SetTextAntialiasMode(rt, D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE); ID2D1RenderTarget_SetTags(rt, 1, 2); ID2D1RenderTarget_SetTransform(rt, &transform2); ID2D1RenderTarget_SetTextRenderingParams(rt, NULL); drawing_state.antialiasMode = ID2D1RenderTarget_GetAntialiasMode(rt); ok(drawing_state.antialiasMode == D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, "Got unexpected antialias mode %#x.\n", drawing_state.antialiasMode); drawing_state.textAntialiasMode = ID2D1RenderTarget_GetTextAntialiasMode(rt); ok(drawing_state.textAntialiasMode == D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE, "Got unexpected text antialias mode %#x.\n", drawing_state.textAntialiasMode); ID2D1RenderTarget_GetTags(rt, &drawing_state.tag1, &drawing_state.tag2); ok(drawing_state.tag1 == 1 && drawing_state.tag2 == 2, "Got unexpected tags %08x%08x:%08x%08x.\n", (unsigned int)(drawing_state.tag1 >> 32), (unsigned int)(drawing_state.tag1), (unsigned int)(drawing_state.tag2 >> 32), (unsigned int)(drawing_state.tag2)); ID2D1RenderTarget_GetTransform(rt, &drawing_state.transform); ok(!memcmp(&drawing_state.transform, &transform2, sizeof(drawing_state.transform)), "Got unexpected matrix {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e}.\n", drawing_state.transform._11, drawing_state.transform._12, drawing_state.transform._21, drawing_state.transform._22, drawing_state.transform._31, drawing_state.transform._32); ID2D1RenderTarget_GetTextRenderingParams(rt, &text_rendering_params2); ok(!text_rendering_params2, "Got unexpected text rendering params %p.\n", text_rendering_params2); ID2D1RenderTarget_SaveDrawingState(rt, state_block); ID2D1DrawingStateBlock_GetDescription(state_block, &drawing_state); ok(drawing_state.antialiasMode == D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, "Got unexpected antialias mode %#x.\n", drawing_state.antialiasMode); ok(drawing_state.textAntialiasMode == D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE, "Got unexpected text antialias mode %#x.\n", drawing_state.textAntialiasMode); ok(drawing_state.tag1 == 1 && drawing_state.tag2 == 2, "Got unexpected tags %08x%08x:%08x%08x.\n", (unsigned int)(drawing_state.tag1 >> 32), (unsigned int)(drawing_state.tag1), (unsigned int)(drawing_state.tag2 >> 32), (unsigned int)(drawing_state.tag2)); ok(!memcmp(&drawing_state.transform, &transform2, sizeof(drawing_state.transform)), "Got unexpected matrix {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e}.\n", drawing_state.transform._11, drawing_state.transform._12, drawing_state.transform._21, drawing_state.transform._22, drawing_state.transform._31, drawing_state.transform._32); ID2D1DrawingStateBlock_GetTextRenderingParams(state_block, &text_rendering_params2); ok(!text_rendering_params2, "Got unexpected text rendering params %p.\n", text_rendering_params2); drawing_state.antialiasMode = D2D1_ANTIALIAS_MODE_ALIASED; drawing_state.textAntialiasMode = D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE; drawing_state.tag1 = 3; drawing_state.tag2 = 4; drawing_state.transform = transform1; ID2D1DrawingStateBlock_SetDescription(state_block, &drawing_state); ID2D1DrawingStateBlock_SetTextRenderingParams(state_block, text_rendering_params1); ID2D1DrawingStateBlock_GetDescription(state_block, &drawing_state); ok(drawing_state.antialiasMode == D2D1_ANTIALIAS_MODE_ALIASED, "Got unexpected antialias mode %#x.\n", drawing_state.antialiasMode); ok(drawing_state.textAntialiasMode == D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE, "Got unexpected text antialias mode %#x.\n", drawing_state.textAntialiasMode); ok(drawing_state.tag1 == 3 && drawing_state.tag2 == 4, "Got unexpected tags %08x%08x:%08x%08x.\n", (unsigned int)(drawing_state.tag1 >> 32), (unsigned int)(drawing_state.tag1), (unsigned int)(drawing_state.tag2 >> 32), (unsigned int)(drawing_state.tag2)); ok(!memcmp(&drawing_state.transform, &transform1, sizeof(drawing_state.transform)), "Got unexpected matrix {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e}.\n", drawing_state.transform._11, drawing_state.transform._12, drawing_state.transform._21, drawing_state.transform._22, drawing_state.transform._31, drawing_state.transform._32); ID2D1DrawingStateBlock_GetTextRenderingParams(state_block, &text_rendering_params2); ok(text_rendering_params2 == text_rendering_params1, "Got unexpected text rendering params %p, expected %p.\n", text_rendering_params2, text_rendering_params1); IDWriteRenderingParams_Release(text_rendering_params2); ID2D1DrawingStateBlock_Release(state_block); refcount = IDWriteRenderingParams_Release(text_rendering_params1); ok(!refcount, "Rendering params %u references left.\n", refcount); ID2D1Factory_Release(factory); ID2D1RenderTarget_Release(rt); IDXGISurface_Release(surface); IDXGISwapChain_Release(swapchain); ID3D10Device1_Release(device); DestroyWindow(window); }
static void d2d_brush_destroy(struct d2d_brush *brush) { ID2D1Factory_Release(brush->factory); HeapFree(GetProcessHeap(), 0, brush); }
void uninitDraw(void) { ID2D1Factory_Release(d2dfactory); }