Wine-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
June 2021
- 82 participants
- 607 discussions
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
include/Makefile.in | 1 +
include/netiodef.h | 68 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 69 insertions(+)
create mode 100644 include/netiodef.h
diff --git a/include/Makefile.in b/include/Makefile.in
index 5b84d7858ff..4a8c261bb8f 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -524,6 +524,7 @@ SOURCES = \
netcon.idl \
netfw.idl \
netioapi.h \
+ netiodef.h \
netlistmgr.idl \
newdev.h \
nldef.h \
diff --git a/include/netiodef.h b/include/netiodef.h
new file mode 100644
index 00000000000..4d8d469b138
--- /dev/null
+++ b/include/netiodef.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2021 Huw Davies
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_NETIODEF_H
+#define __WINE_NETIODEF_H
+
+typedef enum _NPI_MODULEID_TYPE
+{
+ MIT_GUID = 1,
+ MIT_IF_LUID
+} NPI_MODULEID_TYPE;
+
+typedef struct _NPI_MODULEID
+{
+ USHORT Length;
+ NPI_MODULEID_TYPE Type;
+ union
+ {
+ GUID Guid;
+ LUID IfLuid;
+ } DUMMYUNIONNAME;
+} NPI_MODULEID;
+
+typedef const NPI_MODULEID *PNPI_MODULEID;
+
+#ifdef NONAMELESSUNION
+#define _U(x) (x).u
+#else
+#define _U(x) (x)
+#endif
+
+static inline BOOLEAN NmrIsEqualNpiModuleId( const NPI_MODULEID *mod1, const NPI_MODULEID *mod2 )
+{
+ if (mod1->Type == mod2->Type)
+ {
+ if (mod1->Type == MIT_GUID)
+ {
+#ifdef __cplusplus
+ return IsEqualGUID( _U(*mod1).Guid, _U(*mod2).Guid );
+#else
+ return IsEqualGUID( &_U(*mod1).Guid, &_U(*mod2).Guid );
+#endif
+ }
+ else if (mod1->Type == MIT_IF_LUID)
+ return _U(*mod1).IfLuid.HighPart == _U(*mod2).IfLuid.HighPart &&
+ _U(*mod1).IfLuid.LowPart == _U(*mod2).IfLuid.LowPart;
+ }
+ return FALSE;
+}
+
+#undef _U
+
+#endif /* __WINE_NETIODEF_H */
--
2.23.0
1
0
24 Jun '21
Signed-off-by: Conor McCarthy <cmccarthy(a)codeweavers.com>
---
tests/d3d12.c | 226 +++++++++++++++++++++++++++-----------------------
1 file changed, 123 insertions(+), 103 deletions(-)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index f289a10d..ce6d6b36 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -21671,6 +21671,8 @@ static void test_uav_counters(void)
0x00000001, 0x0010000a, 0x00000000, 0x00004001, 0x00000000, 0x0010001a, 0x00000000, 0x0100003e,
};
+ static const unsigned int counter_offsets[] = {0, 1, 255};
+
if (!init_compute_test_context(&context))
return;
device = context.device;
@@ -21694,9 +21696,6 @@ static void test_uav_counters(void)
hr = create_root_signature(device, &root_signature_desc, &context.root_signature);
ok(SUCCEEDED(hr), "Failed to create root signature, hr %#x.\n", hr);
- context.pipeline_state = create_compute_pipeline_state(device, context.root_signature,
- shader_bytecode(cs_producer_code, sizeof(cs_producer_code)));
-
descriptor_heap = create_gpu_descriptor_heap(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 3);
buffer = create_default_buffer(device, 1024,
@@ -21706,120 +21705,141 @@ static void test_uav_counters(void)
counter_buffer = create_default_buffer(device, 1024,
D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_DEST);
- memset(&uav_desc, 0, sizeof(uav_desc));
- uav_desc.Format = DXGI_FORMAT_UNKNOWN;
- uav_desc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;
- uav_desc.Buffer.NumElements = 256;
- uav_desc.Buffer.StructureByteStride = sizeof(uint32_t);
- uav_desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE;
- ID3D12Device_CreateUnorderedAccessView(device, buffer, counter_buffer, &uav_desc,
- get_cpu_descriptor_handle(&context, descriptor_heap, 0));
- ID3D12Device_CreateUnorderedAccessView(device, out_buffer, NULL, &uav_desc,
- get_cpu_descriptor_handle(&context, descriptor_heap, 1));
+ for (i = 0; i < ARRAY_SIZE(counter_offsets); ++i)
+ {
+ unsigned int j;
- counter = 0;
- upload_buffer_data(counter_buffer, 0, sizeof(counter), &counter, queue, command_list);
- reset_command_list(command_list, context.allocator);
- transition_sub_resource_state(command_list, counter_buffer, 0,
- D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ vkd3d_test_set_context("Offset %u", counter_offsets[i]);
- /* produce */
- ID3D12GraphicsCommandList_SetPipelineState(command_list, context.pipeline_state);
- ID3D12GraphicsCommandList_SetComputeRootSignature(command_list, context.root_signature);
- ID3D12GraphicsCommandList_SetDescriptorHeaps(command_list, 1, &descriptor_heap);
- ID3D12GraphicsCommandList_SetComputeRootDescriptorTable(command_list, 0,
- ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(descriptor_heap));
- ID3D12GraphicsCommandList_Dispatch(command_list, 16, 1, 1);
+ context.pipeline_state = create_compute_pipeline_state(device, context.root_signature,
+ shader_bytecode(cs_producer_code, sizeof(cs_producer_code)));
- counter = read_uav_counter(&context, counter_buffer, 0);
- ok(counter == 64, "Got unexpected value %u.\n", counter);
- transition_sub_resource_state(command_list, buffer, 0,
- D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
- get_buffer_readback_with_command_list(buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
- memcpy(id, rb.data, 64 * sizeof(*id));
- release_resource_readback(&rb);
- qsort(id, 64, sizeof(*id), compare_id);
- for (i = 0; i < 64; ++i)
- {
- if (id[i] != i)
- break;
- }
- ok(i == 64, "Got unexpected id %u at %u.\n", id[i], i);
+ memset(&uav_desc, 0, sizeof(uav_desc));
+ uav_desc.Format = DXGI_FORMAT_UNKNOWN;
+ uav_desc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;
+ uav_desc.Buffer.NumElements = 256;
+ uav_desc.Buffer.StructureByteStride = sizeof(uint32_t);
+ uav_desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE;
+ uav_desc.Buffer.CounterOffsetInBytes = counter_offsets[i] * sizeof(uint32_t);
+ ID3D12Device_CreateUnorderedAccessView(device, buffer, counter_buffer, &uav_desc,
+ get_cpu_descriptor_handle(&context, descriptor_heap, 0));
+ ID3D12Device_CreateUnorderedAccessView(device, out_buffer, NULL, &uav_desc,
+ get_cpu_descriptor_handle(&context, descriptor_heap, 1));
+
+ counter = 0;
+ upload_buffer_data(counter_buffer, counter_offsets[i] * sizeof(uint32_t),
+ sizeof(counter), &counter, queue, command_list);
+ reset_command_list(command_list, context.allocator);
+ transition_sub_resource_state(command_list, counter_buffer, 0,
+ D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
- reset_command_list(command_list, context.allocator);
- transition_sub_resource_state(command_list, buffer, 0,
- D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ /* produce */
+ ID3D12GraphicsCommandList_SetPipelineState(command_list, context.pipeline_state);
+ ID3D12GraphicsCommandList_SetComputeRootSignature(command_list, context.root_signature);
+ ID3D12GraphicsCommandList_SetDescriptorHeaps(command_list, 1, &descriptor_heap);
+ ID3D12GraphicsCommandList_SetComputeRootDescriptorTable(command_list, 0,
+ ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(descriptor_heap));
+ ID3D12GraphicsCommandList_Dispatch(command_list, 16, 1, 1);
- ID3D12PipelineState_Release(context.pipeline_state);
- context.pipeline_state = create_compute_pipeline_state(device, context.root_signature,
- shader_bytecode(cs_consumer_code, sizeof(cs_consumer_code)));
+ counter = read_uav_counter(&context, counter_buffer, uav_desc.Buffer.CounterOffsetInBytes);
+ ok(counter == 64, "Got unexpected value %u.\n", counter);
+ transition_sub_resource_state(command_list, buffer, 0,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
+ get_buffer_readback_with_command_list(buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
+ memcpy(id, rb.data, 64 * sizeof(*id));
+ release_resource_readback(&rb);
+ qsort(id, 64, sizeof(*id), compare_id);
+ for (j = 0; j < 64; ++j)
+ {
+ if (id[j] != j)
+ break;
+ }
+ ok(j == 64, "Got unexpected id %u at %u.\n", id[j], j);
- /* consume */
- ID3D12GraphicsCommandList_SetPipelineState(command_list, context.pipeline_state);
- ID3D12GraphicsCommandList_SetComputeRootSignature(command_list, context.root_signature);
- ID3D12GraphicsCommandList_SetDescriptorHeaps(command_list, 1, &descriptor_heap);
- ID3D12GraphicsCommandList_SetComputeRootDescriptorTable(command_list, 0,
- ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(descriptor_heap));
- ID3D12GraphicsCommandList_Dispatch(command_list, 16, 1, 1);
+ reset_command_list(command_list, context.allocator);
+ transition_sub_resource_state(command_list, buffer, 0,
+ D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
- transition_sub_resource_state(command_list, out_buffer, 0,
- D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
- counter = read_uav_counter(&context, counter_buffer, 0);
- ok(!counter, "Got unexpected value %u.\n", counter);
- get_buffer_readback_with_command_list(out_buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
- memcpy(id, rb.data, 64 * sizeof(*id));
- release_resource_readback(&rb);
- qsort(id, 64, sizeof(*id), compare_id);
- for (i = 0; i < 64; ++i)
- {
- if (id[i] != i)
- break;
- }
- ok(i == 64, "Got unexpected id %u at %u.\n", id[i], i);
+ ID3D12PipelineState_Release(context.pipeline_state);
+ context.pipeline_state = create_compute_pipeline_state(device, context.root_signature,
+ shader_bytecode(cs_consumer_code, sizeof(cs_consumer_code)));
- reset_command_list(command_list, context.allocator);
- transition_sub_resource_state(command_list, counter_buffer, 0,
- D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_DEST);
- transition_sub_resource_state(command_list, buffer, 0,
- D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_DEST);
- transition_sub_resource_state(command_list, out_buffer, 0,
- D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ /* consume */
+ ID3D12GraphicsCommandList_SetPipelineState(command_list, context.pipeline_state);
+ ID3D12GraphicsCommandList_SetComputeRootSignature(command_list, context.root_signature);
+ ID3D12GraphicsCommandList_SetDescriptorHeaps(command_list, 1, &descriptor_heap);
+ ID3D12GraphicsCommandList_SetComputeRootDescriptorTable(command_list, 0,
+ ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(descriptor_heap));
+ ID3D12GraphicsCommandList_Dispatch(command_list, 16, 1, 1);
- /* produce on CPU */
- counter = 8;
- for (i = 0; i < counter; ++i)
- id[i] = 0xdeadbeef;
- upload_buffer_data(buffer, 0, counter * sizeof(*id), id, queue, command_list);
- reset_command_list(command_list, context.allocator);
- upload_buffer_data(counter_buffer, 0, sizeof(counter), &counter, queue, command_list);
- reset_command_list(command_list, context.allocator);
+ transition_sub_resource_state(command_list, out_buffer, 0,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
+ counter = read_uav_counter(&context, counter_buffer, uav_desc.Buffer.CounterOffsetInBytes);
+ ok(!counter, "Got unexpected value %u.\n", counter);
+ get_buffer_readback_with_command_list(out_buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
+ memcpy(id, rb.data, 64 * sizeof(*id));
+ release_resource_readback(&rb);
+ qsort(id, 64, sizeof(*id), compare_id);
+ for (j = 0; j < 64; ++j)
+ {
+ if (id[j] != j)
+ break;
+ }
+ ok(j == 64, "Got unexpected id %u at %u.\n", id[j], j);
- transition_sub_resource_state(command_list, counter_buffer, 0,
- D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
- transition_sub_resource_state(command_list, buffer, 0,
- D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ reset_command_list(command_list, context.allocator);
+ transition_sub_resource_state(command_list, counter_buffer, 0,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_DEST);
+ transition_sub_resource_state(command_list, buffer, 0,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_DEST);
+ transition_sub_resource_state(command_list, out_buffer, 0,
+ D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
- /* consume */
- ID3D12GraphicsCommandList_SetPipelineState(command_list, context.pipeline_state);
- ID3D12GraphicsCommandList_SetComputeRootSignature(command_list, context.root_signature);
- ID3D12GraphicsCommandList_SetDescriptorHeaps(command_list, 1, &descriptor_heap);
- ID3D12GraphicsCommandList_SetComputeRootDescriptorTable(command_list, 0,
- ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(descriptor_heap));
- ID3D12GraphicsCommandList_Dispatch(command_list, 1, 1, 1);
- ID3D12GraphicsCommandList_Dispatch(command_list, 1, 1, 1);
+ /* produce on CPU */
+ counter = 8;
+ for (j = 0; j < counter; ++j)
+ id[j] = 0xdeadbeef;
+ upload_buffer_data(buffer, 0, counter * sizeof(*id), id, queue, command_list);
+ reset_command_list(command_list, context.allocator);
+ upload_buffer_data(counter_buffer, counter_offsets[i] * sizeof(uint32_t),
+ sizeof(counter), &counter, queue, command_list);
+ reset_command_list(command_list, context.allocator);
- transition_sub_resource_state(command_list, out_buffer, 0,
- D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
- counter = read_uav_counter(&context, counter_buffer, 0);
- ok(!counter, "Got unexpected value %u.\n", counter);
+ transition_sub_resource_state(command_list, counter_buffer, 0,
+ D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ transition_sub_resource_state(command_list, buffer, 0,
+ D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
- get_buffer_readback_with_command_list(out_buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
- for (i = 0; i < 8; ++i)
- {
- data = get_readback_uint(&rb, i, 0, 0);
- ok(data == 0xdeadbeef, "Got data %u at %u.\n", data, i);
+ /* consume */
+ ID3D12GraphicsCommandList_SetPipelineState(command_list, context.pipeline_state);
+ ID3D12GraphicsCommandList_SetComputeRootSignature(command_list, context.root_signature);
+ ID3D12GraphicsCommandList_SetDescriptorHeaps(command_list, 1, &descriptor_heap);
+ ID3D12GraphicsCommandList_SetComputeRootDescriptorTable(command_list, 0,
+ ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(descriptor_heap));
+ ID3D12GraphicsCommandList_Dispatch(command_list, 1, 1, 1);
+ ID3D12GraphicsCommandList_Dispatch(command_list, 1, 1, 1);
+
+ transition_sub_resource_state(command_list, out_buffer, 0,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
+ counter = read_uav_counter(&context, counter_buffer, uav_desc.Buffer.CounterOffsetInBytes);
+ ok(!counter, "Got unexpected value %u.\n", counter);
+
+ get_buffer_readback_with_command_list(out_buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
+ for (j = 0; j < 8; ++j)
+ {
+ data = get_readback_uint(&rb, j, 0, 0);
+ ok(data == 0xdeadbeef, "Got data %u at %u.\n", data, j);
+ }
+ release_resource_readback(&rb);
+
+ reset_command_list(command_list, context.allocator);
+ transition_sub_resource_state(command_list, out_buffer, 0,
+ D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ transition_sub_resource_state(command_list, counter_buffer, 0,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_DEST);
+ ID3D12PipelineState_Release(context.pipeline_state);
+ context.pipeline_state = NULL;
}
- release_resource_readback(&rb);
ID3D12Resource_Release(buffer);
ID3D12Resource_Release(out_buffer);
--
2.31.1
2
1
[PATCH vkd3d v4 1/5] vkd3d-shader: Introduce struct vkd3d_shader_register_range.
by Conor McCarthy 24 Jun '21
by Conor McCarthy 24 Jun '21
24 Jun '21
Signed-off-by: Conor McCarthy <cmccarthy(a)codeweavers.com>
---
libs/vkd3d-shader/dxbc.c | 25 ++++++++++++++----------
libs/vkd3d-shader/spirv.c | 8 ++++----
libs/vkd3d-shader/trace.c | 10 +++++-----
libs/vkd3d-shader/vkd3d_shader_main.c | 4 ++--
libs/vkd3d-shader/vkd3d_shader_private.h | 9 +++++++--
5 files changed, 33 insertions(+), 23 deletions(-)
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index d2cf87e3..61acf77b 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -654,7 +654,8 @@ static void shader_sm4_read_dcl_resource(struct vkd3d_shader_instruction *ins,
}
reg_data_type = opcode == VKD3D_SM4_OP_DCL_RESOURCE ? VKD3D_DATA_RESOURCE : VKD3D_DATA_UAV;
shader_sm4_read_dst_param(priv, &tokens, end, reg_data_type, &semantic->resource.reg);
- semantic->resource.register_index = shader_sm4_map_resource_idx(&semantic->resource.reg.reg, priv);
+ semantic->resource.range.first = shader_sm4_map_resource_idx(&semantic->resource.reg.reg, priv);
+ semantic->resource.range.last = semantic->resource.range.first;
components = *tokens++;
for (i = 0; i < VKD3D_VEC4_SIZE; i++)
@@ -675,7 +676,7 @@ static void shader_sm4_read_dcl_resource(struct vkd3d_shader_instruction *ins,
if (reg_data_type == VKD3D_DATA_UAV)
ins->flags = (opcode_token & VKD3D_SM5_UAV_FLAGS_MASK) >> VKD3D_SM5_UAV_FLAGS_SHIFT;
- shader_sm4_read_register_space(priv, &tokens, end, &semantic->resource.register_space);
+ shader_sm4_read_register_space(priv, &tokens, end, &semantic->resource.range.space);
}
static void shader_sm4_read_dcl_constant_buffer(struct vkd3d_shader_instruction *ins,
@@ -916,9 +917,10 @@ static void shader_sm5_read_dcl_uav_raw(struct vkd3d_shader_instruction *ins,
const DWORD *end = &tokens[token_count];
shader_sm4_read_dst_param(priv, &tokens, end, VKD3D_DATA_UAV, &resource->resource.reg);
- resource->resource.register_index = shader_sm4_map_resource_idx(&resource->resource.reg.reg, priv);
+ resource->resource.range.first = shader_sm4_map_resource_idx(&resource->resource.reg.reg, priv);
+ resource->resource.range.last = resource->resource.range.first;
ins->flags = (opcode_token & VKD3D_SM5_UAV_FLAGS_MASK) >> VKD3D_SM5_UAV_FLAGS_SHIFT;
- shader_sm4_read_register_space(priv, &tokens, end, &resource->resource.register_space);
+ shader_sm4_read_register_space(priv, &tokens, end, &resource->resource.range.space);
}
static void shader_sm5_read_dcl_uav_structured(struct vkd3d_shader_instruction *ins,
@@ -929,12 +931,13 @@ static void shader_sm5_read_dcl_uav_structured(struct vkd3d_shader_instruction *
const DWORD *end = &tokens[token_count];
shader_sm4_read_dst_param(priv, &tokens, end, VKD3D_DATA_UAV, &resource->resource.reg);
- resource->resource.register_index = shader_sm4_map_resource_idx(&resource->resource.reg.reg, priv);
+ resource->resource.range.first = shader_sm4_map_resource_idx(&resource->resource.reg.reg, priv);
+ resource->resource.range.last = resource->resource.range.first;
ins->flags = (opcode_token & VKD3D_SM5_UAV_FLAGS_MASK) >> VKD3D_SM5_UAV_FLAGS_SHIFT;
resource->byte_stride = *tokens++;
if (resource->byte_stride % 4)
FIXME("Byte stride %u is not multiple of 4.\n", resource->byte_stride);
- shader_sm4_read_register_space(priv, &tokens, end, &resource->resource.register_space);
+ shader_sm4_read_register_space(priv, &tokens, end, &resource->resource.range.space);
}
static void shader_sm5_read_dcl_tgsm_raw(struct vkd3d_shader_instruction *ins,
@@ -967,11 +970,12 @@ static void shader_sm5_read_dcl_resource_structured(struct vkd3d_shader_instruct
const DWORD *end = &tokens[token_count];
shader_sm4_read_dst_param(priv, &tokens, end, VKD3D_DATA_RESOURCE, &resource->resource.reg);
- resource->resource.register_index = shader_sm4_map_resource_idx(&resource->resource.reg.reg, priv);
+ resource->resource.range.first = shader_sm4_map_resource_idx(&resource->resource.reg.reg, priv);
+ resource->resource.range.last = resource->resource.range.first;
resource->byte_stride = *tokens++;
if (resource->byte_stride % 4)
FIXME("Byte stride %u is not multiple of 4.\n", resource->byte_stride);
- shader_sm4_read_register_space(priv, &tokens, end, &resource->resource.register_space);
+ shader_sm4_read_register_space(priv, &tokens, end, &resource->resource.range.space);
}
static void shader_sm5_read_dcl_resource_raw(struct vkd3d_shader_instruction *ins,
@@ -982,8 +986,9 @@ static void shader_sm5_read_dcl_resource_raw(struct vkd3d_shader_instruction *in
const DWORD *end = &tokens[token_count];
shader_sm4_read_dst_param(priv, &tokens, end, VKD3D_DATA_RESOURCE, &resource->resource.reg);
- resource->resource.register_index = shader_sm4_map_resource_idx(&resource->resource.reg.reg, priv);
- shader_sm4_read_register_space(priv, &tokens, end, &resource->resource.register_space);
+ resource->resource.range.first = shader_sm4_map_resource_idx(&resource->resource.reg.reg, priv);
+ resource->resource.range.last = resource->resource.range.first;
+ shader_sm4_read_register_space(priv, &tokens, end, &resource->resource.range.space);
}
static void shader_sm5_read_sync(struct vkd3d_shader_instruction *ins,
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 0e75b0ae..7a23d315 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2441,8 +2441,8 @@ static bool vkd3d_dxbc_compiler_has_combined_sampler(const struct vkd3d_dxbc_com
if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, combined_sampler->shader_visibility))
continue;
- if ((!resource || (combined_sampler->resource_space == resource->register_space
- && combined_sampler->resource_index == resource->register_index))
+ if ((!resource || (combined_sampler->resource_space == resource->range.space
+ && combined_sampler->resource_index == resource->range.first))
&& (!sampler || (combined_sampler->sampler_space == sampler->register_space
&& combined_sampler->sampler_index == sampler->register_index)))
return true;
@@ -5554,8 +5554,8 @@ static void vkd3d_dxbc_compiler_emit_resource_declaration(struct vkd3d_dxbc_comp
SpvStorageClass storage_class = SpvStorageClassUniformConstant;
const struct vkd3d_shader_register *reg = &resource->reg.reg;
const struct vkd3d_spirv_resource_type *resource_type_info;
- unsigned int register_space = resource->register_space;
- unsigned int register_index = resource->register_index;
+ unsigned int register_space = resource->range.space;
+ unsigned int register_index = resource->range.first;
enum vkd3d_shader_component_type sampled_type;
struct vkd3d_symbol resource_symbol;
bool is_uav;
diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c
index 4e355118..c35179a8 100644
--- a/libs/vkd3d-shader/trace.c
+++ b/libs/vkd3d-shader/trace.c
@@ -1428,7 +1428,7 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
shader_dump_ins_modifiers(compiler, &ins->declaration.semantic.resource.reg);
vkd3d_string_buffer_printf(buffer, "%s ", compiler->colours.reset);
shader_dump_register(compiler, &ins->declaration.semantic.resource.reg.reg);
- shader_dump_register_space(compiler, ins->declaration.semantic.resource.register_space);
+ shader_dump_register_space(compiler, ins->declaration.semantic.resource.range.space);
break;
case VKD3DSIH_DCL_CONSTANT_BUFFER:
@@ -1531,14 +1531,14 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
case VKD3DSIH_DCL_RESOURCE_RAW:
vkd3d_string_buffer_printf(buffer, " ");
shader_dump_dst_param(compiler, &ins->declaration.raw_resource.resource.reg);
- shader_dump_register_space(compiler, ins->declaration.raw_resource.resource.register_space);
+ shader_dump_register_space(compiler, ins->declaration.raw_resource.resource.range.space);
break;
case VKD3DSIH_DCL_RESOURCE_STRUCTURED:
vkd3d_string_buffer_printf(buffer, " ");
shader_dump_dst_param(compiler, &ins->declaration.structured_resource.resource.reg);
shader_print_uint_literal(compiler, ", ", ins->declaration.structured_resource.byte_stride, "");
- shader_dump_register_space(compiler, ins->declaration.structured_resource.resource.register_space);
+ shader_dump_register_space(compiler, ins->declaration.structured_resource.resource.range.space);
break;
case VKD3DSIH_DCL_SAMPLER:
@@ -1597,7 +1597,7 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
shader_dump_uav_flags(compiler, ins->flags);
shader_addline(buffer, " ");
shader_dump_dst_param(compiler, &ins->declaration.raw_resource.resource.reg);
- shader_dump_register_space(compiler, ins->declaration.raw_resource.resource.register_space);
+ shader_dump_register_space(compiler, ins->declaration.raw_resource.resource.range.space);
break;
case VKD3DSIH_DCL_UAV_STRUCTURED:
@@ -1605,7 +1605,7 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
shader_addline(buffer, " ");
shader_dump_dst_param(compiler, &ins->declaration.structured_resource.resource.reg);
shader_print_uint_literal(compiler, ", ", ins->declaration.structured_resource.byte_stride, "");
- shader_dump_register_space(compiler, ins->declaration.structured_resource.resource.register_space);
+ shader_dump_register_space(compiler, ins->declaration.structured_resource.resource.range.space);
break;
case VKD3DSIH_DEF:
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index 2308b894..df811d37 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -666,8 +666,8 @@ static void vkd3d_shader_scan_resource_declaration(struct vkd3d_shader_scan_cont
type = VKD3D_SHADER_DESCRIPTOR_TYPE_UAV;
else
type = VKD3D_SHADER_DESCRIPTOR_TYPE_SRV;
- vkd3d_shader_scan_add_descriptor(context, type, resource->register_space,
- resource->register_index, resource_type, resource_data_type, 0);
+ vkd3d_shader_scan_add_descriptor(context, type, resource->range.space,
+ resource->range.first, resource_type, resource_data_type, 0);
if (type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV)
vkd3d_shader_scan_add_uav_range(context, resource->reg.reg.idx[0].offset,
context->scan_descriptor_info->descriptor_count - 1);
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index 6d756e40..cddb3d27 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -636,11 +636,16 @@ struct vkd3d_shader_index_range
unsigned int register_count;
};
+struct vkd3d_shader_register_range
+{
+ unsigned int space;
+ unsigned int first, last;
+};
+
struct vkd3d_shader_resource
{
struct vkd3d_shader_dst_param reg;
- unsigned int register_space;
- unsigned int register_index;
+ struct vkd3d_shader_register_range range;
};
enum vkd3d_decl_usage
--
2.31.1
2
9
[PATCH 1/5] hid: Rewrite HidP_GetSpecificValueCaps using enum_value_caps.
by Rémi Bernon 24 Jun '21
by Rémi Bernon 24 Jun '21
24 Jun '21
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/hid/hidp.c | 110 +++++++++++++++--------------
dlls/ntoskrnl.exe/tests/ntoskrnl.c | 91 +-----------------------
2 files changed, 59 insertions(+), 142 deletions(-)
diff --git a/dlls/hid/hidp.c b/dlls/hid/hidp.c
index 301c367d37a..c11a5d66985 100644
--- a/dlls/hid/hidp.c
+++ b/dlls/hid/hidp.c
@@ -69,6 +69,7 @@ static NTSTATUS get_value_caps_range( WINE_HIDP_PREPARSED_DATA *preparsed, HIDP_
struct caps_filter
{
BOOLEAN buttons;
+ BOOLEAN values;
USAGE usage_page;
USHORT collection;
USAGE usage;
@@ -78,6 +79,7 @@ static BOOL match_value_caps( const struct hid_value_caps *caps, const struct ca
{
if (!caps->usage_min && !caps->usage_max) return FALSE;
if (filter->buttons && !HID_VALUE_CAPS_IS_BUTTON( caps )) return FALSE;
+ if (filter->values && HID_VALUE_CAPS_IS_BUTTON( caps )) return FALSE;
if (filter->usage_page && filter->usage_page != caps->usage_page) return FALSE;
if (filter->collection && filter->collection != caps->link_collection) return FALSE;
if (!filter->usage) return TRUE;
@@ -247,6 +249,9 @@ NTSTATUS WINAPI HidP_GetCaps( PHIDP_PREPARSED_DATA preparsed_data, HIDP_CAPS *ca
caps->NumberInputButtonCaps = preparsed->new_caps.NumberInputButtonCaps;
caps->NumberOutputButtonCaps = preparsed->new_caps.NumberOutputButtonCaps;
caps->NumberFeatureButtonCaps = preparsed->new_caps.NumberFeatureButtonCaps;
+ caps->NumberInputValueCaps = preparsed->new_caps.NumberInputValueCaps;
+ caps->NumberOutputValueCaps = preparsed->new_caps.NumberOutputValueCaps;
+ caps->NumberFeatureValueCaps = preparsed->new_caps.NumberFeatureValueCaps;
return HIDP_STATUS_SUCCESS;
}
@@ -701,68 +706,67 @@ NTSTATUS WINAPI HidP_GetSpecificButtonCaps( HIDP_REPORT_TYPE report_type, USAGE
return enum_value_caps( preparsed, report_type, &filter, get_button_caps, &caps, caps_count );
}
-NTSTATUS WINAPI HidP_GetSpecificValueCaps(HIDP_REPORT_TYPE ReportType,
- USAGE UsagePage, USHORT LinkCollection, USAGE Usage,
- HIDP_VALUE_CAPS *ValueCaps, USHORT *ValueCapsLength, PHIDP_PREPARSED_DATA PreparsedData)
+static NTSTATUS get_value_caps( const struct hid_value_caps *caps, void *user )
{
- WINE_HIDP_PREPARSED_DATA *data = (PWINE_HIDP_PREPARSED_DATA)PreparsedData;
- WINE_HID_ELEMENT *elems = HID_ELEMS(data);
- WINE_HID_REPORT *report = NULL;
- USHORT v_count = 0, r_count = 0;
- int i,j,u;
-
- TRACE("(%i, 0x%x, %i, 0x%x, %p %p %p)\n", ReportType, UsagePage, LinkCollection,
- Usage, ValueCaps, ValueCapsLength, PreparsedData);
-
- if (data->magic != HID_MAGIC)
- return HIDP_STATUS_INVALID_PREPARSED_DATA;
-
- switch(ReportType)
+ HIDP_VALUE_CAPS **iter = user, *dst = *iter;
+ dst->UsagePage = caps->usage_page;
+ dst->ReportID = caps->report_id;
+ dst->LinkCollection = caps->link_collection;
+ dst->LinkUsagePage = caps->link_usage_page;
+ dst->LinkUsage = caps->link_usage;
+ dst->BitField = caps->bit_field;
+ dst->IsAlias = FALSE;
+ dst->IsAbsolute = HID_VALUE_CAPS_IS_ABSOLUTE( caps );
+ dst->HasNull = HID_VALUE_CAPS_HAS_NULL( caps );
+ dst->BitSize = caps->bit_size;
+ dst->ReportCount = caps->is_range ? 1 : caps->report_count;
+ dst->UnitsExp = caps->units_exp;
+ dst->Units = caps->units;
+ dst->LogicalMin = caps->logical_min;
+ dst->LogicalMax = caps->logical_max;
+ dst->PhysicalMin = caps->physical_min;
+ dst->PhysicalMax = caps->physical_max;
+ if (!(dst->IsRange = caps->is_range))
{
- case HidP_Input:
- v_count = data->caps.NumberInputValueCaps;
- report = HID_INPUT_REPORTS(data);
- break;
- case HidP_Output:
- v_count = data->caps.NumberOutputValueCaps;
- report = HID_OUTPUT_REPORTS(data);
- break;
- case HidP_Feature:
- v_count = data->caps.NumberFeatureValueCaps;
- report = HID_FEATURE_REPORTS(data);
- break;
- default:
- return HIDP_STATUS_INVALID_REPORT_TYPE;
+ dst->NotRange.Usage = caps->usage_min;
+ dst->NotRange.DataIndex = caps->data_index_min;
}
- r_count = data->reportCount[ReportType];
-
- if (!r_count || !v_count)
+ else
{
- *ValueCapsLength = 0;
- return HIDP_STATUS_SUCCESS;
+ dst->Range.UsageMin = caps->usage_min;
+ dst->Range.UsageMax = caps->usage_max;
+ dst->Range.DataIndexMin = caps->data_index_min;
+ dst->Range.DataIndexMax = caps->data_index_max;
}
-
- v_count = min(v_count, *ValueCapsLength);
-
- u = 0;
- for (j = 0; j < r_count && u < v_count; j++)
+ if (!(dst->IsStringRange = caps->is_string_range))
+ dst->NotRange.StringIndex = caps->string_min;
+ else
{
- for (i = 0; i < report[j].elementCount && u < v_count; i++)
- {
- if (elems[report[j].elementIdx + i].caps.BitSize != 1 &&
- (UsagePage == 0 || UsagePage == elems[report[j].elementIdx + i].caps.UsagePage) &&
- (LinkCollection == 0 || LinkCollection == elems[report[j].elementIdx + i].caps.LinkCollection) &&
- (Usage == 0 || Usage == elems[report[j].elementIdx + i].caps.NotRange.Usage))
- {
- ValueCaps[u++] = elems[report[j].elementIdx + i].caps;
- }
- }
+ dst->Range.StringMin = caps->string_min;
+ dst->Range.StringMax = caps->string_max;
}
- TRACE("Matched %i usages\n", u);
+ if ((dst->IsDesignatorRange = caps->is_designator_range))
+ dst->NotRange.DesignatorIndex = caps->designator_min;
+ else
+ {
+ dst->Range.DesignatorMin = caps->designator_min;
+ dst->Range.DesignatorMax = caps->designator_max;
+ }
+ *iter += 1;
+ return HIDP_STATUS_SUCCESS;
+}
+
+NTSTATUS WINAPI HidP_GetSpecificValueCaps( HIDP_REPORT_TYPE report_type, USAGE usage_page, USHORT collection,
+ USAGE usage, HIDP_VALUE_CAPS *caps, USHORT *caps_count,
+ PHIDP_PREPARSED_DATA preparsed_data )
+{
+ WINE_HIDP_PREPARSED_DATA *preparsed = (WINE_HIDP_PREPARSED_DATA *)preparsed_data;
+ const struct caps_filter filter = {.values = TRUE, .usage_page = usage_page, .collection = collection, .usage = usage};
- *ValueCapsLength = u;
+ TRACE( "report_type %d, usage_page %x, collection %d, usage %x, caps %p, caps_count %p, preparsed_data %p.\n",
+ report_type, usage_page, collection, usage, caps, caps_count, preparsed_data );
- return HIDP_STATUS_SUCCESS;
+ return enum_value_caps( preparsed, report_type, &filter, get_value_caps, &caps, caps_count );
}
NTSTATUS WINAPI HidP_GetUsagesEx(HIDP_REPORT_TYPE ReportType, USHORT LinkCollection, USAGE_AND_PAGE *ButtonList,
diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
index 11779daf684..3ce750728ec 100644
--- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
@@ -1834,7 +1834,6 @@ static void test_hidp(HANDLE file, int report_id)
check_member(caps, expect_hidp_caps[report_id], "%d", FeatureReportByteLength);
check_member(caps, expect_hidp_caps[report_id], "%d", NumberLinkCollectionNodes);
check_member(caps, expect_hidp_caps[report_id], "%d", NumberInputButtonCaps);
- todo_wine
check_member(caps, expect_hidp_caps[report_id], "%d", NumberInputValueCaps);
todo_wine
check_member(caps, expect_hidp_caps[report_id], "%d", NumberInputDataIndices);
@@ -1934,15 +1933,12 @@ static void test_hidp(HANDLE file, int report_id)
count = ARRAY_SIZE(value_caps);
status = HidP_GetValueCaps(HidP_Output, value_caps, &count, preparsed_data);
- todo_wine
ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_GetValueCaps returned %#x\n", status);
status = HidP_GetValueCaps(HidP_Feature + 1, value_caps, &count, preparsed_data);
ok(status == HIDP_STATUS_INVALID_REPORT_TYPE, "HidP_GetValueCaps returned %#x\n", status);
count = 0;
status = HidP_GetValueCaps(HidP_Input, value_caps, &count, preparsed_data);
- todo_wine
ok(status == HIDP_STATUS_BUFFER_TOO_SMALL, "HidP_GetValueCaps returned %#x\n", status);
- todo_wine
ok(count == caps.NumberInputValueCaps, "HidP_GetValueCaps returned count %d, expected %d\n",
count, caps.NumberInputValueCaps);
count = ARRAY_SIZE(value_caps);
@@ -1956,61 +1952,18 @@ static void test_hidp(HANDLE file, int report_id)
for (i = 0; i < ARRAY_SIZE(expect_value_caps); ++i)
{
winetest_push_context("value_caps[%d]", i);
- todo_wine_if(i == 3)
- check_member(value_caps[i], expect_value_caps[i], "%04x", UsagePage);
- check_member(value_caps[i], expect_value_caps[i], "%d", ReportID);
- check_member(value_caps[i], expect_value_caps[i], "%d", IsAlias);
- todo_wine_if(i == 2)
- check_member(value_caps[i], expect_value_caps[i], "%d", BitField);
- check_member(value_caps[i], expect_value_caps[i], "%d", LinkCollection);
- check_member(value_caps[i], expect_value_caps[i], "%04x", LinkUsage);
- check_member(value_caps[i], expect_value_caps[i], "%04x", LinkUsagePage);
- todo_wine_if(i == 3)
- check_member(value_caps[i], expect_value_caps[i], "%d", IsRange);
- check_member(value_caps[i], expect_value_caps[i], "%d", IsStringRange);
- check_member(value_caps[i], expect_value_caps[i], "%d", IsDesignatorRange);
- todo_wine_if(i == 2)
- check_member(value_caps[i], expect_value_caps[i], "%d", IsAbsolute);
- todo_wine_if(i == 2)
- check_member(value_caps[i], expect_value_caps[i], "%d", HasNull);
- todo_wine_if(i >= 2)
- check_member(value_caps[i], expect_value_caps[i], "%d", BitSize);
- todo_wine_if(i == 2)
- check_member(value_caps[i], expect_value_caps[i], "%d", ReportCount);
- check_member(value_caps[i], expect_value_caps[i], "%d", UnitsExp);
- check_member(value_caps[i], expect_value_caps[i], "%d", Units);
- todo_wine_if(i >= 3)
- check_member(value_caps[i], expect_value_caps[i], "%d", LogicalMin);
- todo_wine_if(i >= 2)
- check_member(value_caps[i], expect_value_caps[i], "%d", LogicalMax);
- check_member(value_caps[i], expect_value_caps[i], "%d", PhysicalMin);
- check_member(value_caps[i], expect_value_caps[i], "%d", PhysicalMax);
- todo_wine
- check_member(value_caps[i], expect_value_caps[i], "%04x", Range.UsageMin);
- todo_wine
- check_member(value_caps[i], expect_value_caps[i], "%04x", Range.UsageMax);
- check_member(value_caps[i], expect_value_caps[i], "%d", Range.StringMin);
- check_member(value_caps[i], expect_value_caps[i], "%d", Range.StringMax);
- check_member(value_caps[i], expect_value_caps[i], "%d", Range.DesignatorMin);
- check_member(value_caps[i], expect_value_caps[i], "%d", Range.DesignatorMax);
- todo_wine_if(i >= 2)
- check_member(value_caps[i], expect_value_caps[i], "%d", Range.DataIndexMin);
- todo_wine_if(i >= 2)
- check_member(value_caps[i], expect_value_caps[i], "%d", Range.DataIndexMax);
+ check_hidp_value_caps(&value_caps[i], &expect_value_caps[i]);
winetest_pop_context();
}
count = ARRAY_SIZE(value_caps) - 4;
status = HidP_GetSpecificValueCaps(HidP_Output, 0, 0, 0, value_caps, &count, preparsed_data);
- todo_wine
ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_GetSpecificValueCaps returned %#x\n", status);
status = HidP_GetSpecificValueCaps(HidP_Feature + 1, 0, 0, 0, value_caps, &count, preparsed_data);
ok(status == HIDP_STATUS_INVALID_REPORT_TYPE, "HidP_GetSpecificValueCaps returned %#x\n", status);
count = 0;
status = HidP_GetSpecificValueCaps(HidP_Input, 0, 0, 0, value_caps, &count, preparsed_data);
- todo_wine
ok(status == HIDP_STATUS_BUFFER_TOO_SMALL, "HidP_GetSpecificValueCaps returned %#x\n", status);
- todo_wine
ok(count == caps.NumberInputValueCaps, "HidP_GetSpecificValueCaps returned count %d, expected %d\n",
count, caps.NumberInputValueCaps);
count = ARRAY_SIZE(value_caps) - 4;
@@ -2031,58 +1984,18 @@ static void test_hidp(HANDLE file, int report_id)
value_caps + 4, &count, preparsed_data);
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetSpecificValueCaps returned %#x\n", status);
ok(count == 1, "HidP_GetSpecificValueCaps returned count %d, expected %d\n", count, 1);
-
- todo_wine
- check_member(value_caps[4], value_caps[3], "%04x", UsagePage);
- check_member(value_caps[4], value_caps[3], "%d", ReportID);
- check_member(value_caps[4], value_caps[3], "%d", IsAlias);
- check_member(value_caps[4], value_caps[3], "%d", BitField);
- check_member(value_caps[4], value_caps[3], "%d", LinkCollection);
- check_member(value_caps[4], value_caps[3], "%04x", LinkUsage);
- check_member(value_caps[4], value_caps[3], "%04x", LinkUsagePage);
- todo_wine
- check_member(value_caps[4], value_caps[3], "%d", IsRange);
- check_member(value_caps[4], value_caps[3], "%d", IsStringRange);
- check_member(value_caps[4], value_caps[3], "%d", IsDesignatorRange);
- check_member(value_caps[4], value_caps[3], "%d", IsAbsolute);
- check_member(value_caps[4], value_caps[3], "%d", HasNull);
- todo_wine
- check_member(value_caps[4], value_caps[3], "%d", BitSize);
- check_member(value_caps[4], value_caps[3], "%d", ReportCount);
- check_member(value_caps[4], value_caps[3], "%d", UnitsExp);
- check_member(value_caps[4], value_caps[3], "%d", Units);
- todo_wine
- check_member(value_caps[4], value_caps[3], "%d", LogicalMin);
- todo_wine
- check_member(value_caps[4], value_caps[3], "%d", LogicalMax);
- check_member(value_caps[4], value_caps[3], "%d", PhysicalMin);
- check_member(value_caps[4], value_caps[3], "%d", PhysicalMax);
- todo_wine
- check_member(value_caps[4], value_caps[3], "%04x", Range.UsageMin);
- todo_wine
- check_member(value_caps[4], value_caps[3], "%04x", Range.UsageMax);
- check_member(value_caps[4], value_caps[3], "%d", Range.StringMin);
- check_member(value_caps[4], value_caps[3], "%d", Range.StringMax);
- check_member(value_caps[4], value_caps[3], "%d", Range.DesignatorMin);
- check_member(value_caps[4], value_caps[3], "%d", Range.DesignatorMax);
- todo_wine
- check_member(value_caps[4], value_caps[3], "%d", Range.DataIndexMin);
- todo_wine
- check_member(value_caps[4], value_caps[3], "%d", Range.DataIndexMax);
+ check_hidp_value_caps(&value_caps[4], &value_caps[3]);
count = 0xdead;
status = HidP_GetSpecificValueCaps(HidP_Input, 0xfffe, 0, 0, value_caps, &count, preparsed_data);
- todo_wine
ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_GetSpecificValueCaps returned %#x\n", status);
ok(count == 0, "HidP_GetSpecificValueCaps returned count %d, expected %d\n", count, 0);
count = 0xdead;
status = HidP_GetSpecificValueCaps(HidP_Input, 0, 0xfffe, 0, value_caps, &count, preparsed_data);
- todo_wine
ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_GetSpecificValueCaps returned %#x\n", status);
ok(count == 0, "HidP_GetSpecificValueCaps returned count %d, expected %d\n", count, 0);
count = 0xdead;
status = HidP_GetSpecificValueCaps(HidP_Input, 0, 0, 0xfffe, value_caps, &count, preparsed_data);
- todo_wine
ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_GetSpecificValueCaps returned %#x\n", status);
ok(count == 0, "HidP_GetSpecificValueCaps returned count %d, expected %d\n", count, 0);
--
2.32.0
2
6
[PATCH v5] mf/sar: Allow requesting more than a sample per period.
by Giovanni Mascellani 24 Jun '21
by Giovanni Mascellani 24 Jun '21
24 Jun '21
The IAudioClient implementation from both Windows and winepulse.drv
never sets the event more than once per period, which is usually
around 10 ms long. Some codecs produce audio samples shorter than
10 ms, so it is critical that the SAR is able to process more than
a sample per period.
This is not currently the case: a new sample is requested only in
audio_renderer_render, which is executed (at most) once per period.
This results in the SAR not being able to keep up with the audio
client, and eventually underrunning.
With this patch the SAR keeps a count of how many frames are
currently queued, and a new sample is immediately requested if
the internal queue has less than two periods of frames.
This patch fixes audio stuttering problems in the logo videos
of Borderlands 3, Deep Rock Galactic and Mutant Year Zero.
Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com>
---
v2: Remove some changes that didn't really help the solution and
update the description accordingly.
v3: Reimplement from scratches, using a different strategy and
avoiding manually setting the event.
v4: Resent with no changes, because it fails to apply without
the first patch.
v5:
* Zero the count when flushing the queue.
* Only request more sample when running.
dlls/mf/sar.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/dlls/mf/sar.c b/dlls/mf/sar.c
index eba822ae0fe..7b7d4918e17 100644
--- a/dlls/mf/sar.c
+++ b/dlls/mf/sar.c
@@ -101,6 +101,8 @@ struct audio_renderer
HANDLE buffer_ready_event;
MFWORKITEM_KEY buffer_ready_key;
unsigned int frame_size;
+ unsigned int queued_frames;
+ unsigned int target_queued_frames;
struct list queue;
enum stream_state state;
unsigned int flags;
@@ -234,6 +236,7 @@ static void audio_renderer_release_audio_client(struct audio_renderer *renderer)
{
release_pending_object(obj);
}
+ renderer->queued_frames = 0;
renderer->buffer_ready_key = 0;
if (renderer->audio_client)
{
@@ -1330,6 +1333,13 @@ static HRESULT WINAPI audio_renderer_stream_GetMediaTypeHandler(IMFStreamSink *i
static HRESULT stream_queue_sample(struct audio_renderer *renderer, IMFSample *sample)
{
struct queued_object *object;
+ DWORD sample_len, sample_frames;
+ HRESULT hr;
+
+ if (FAILED(hr = IMFSample_GetTotalLength(sample, &sample_len)))
+ return hr;
+
+ sample_frames = sample_len / renderer->frame_size;
if (!(object = calloc(1, sizeof(*object))))
return E_OUTOFMEMORY;
@@ -1339,6 +1349,7 @@ static HRESULT stream_queue_sample(struct audio_renderer *renderer, IMFSample *s
IMFSample_AddRef(object->u.sample.sample);
list_add_tail(&renderer->queue, &object->entry);
+ renderer->queued_frames += sample_frames;
return S_OK;
}
@@ -1357,9 +1368,17 @@ static HRESULT WINAPI audio_renderer_stream_ProcessSample(IMFStreamSink *iface,
return MF_E_STREAMSINK_REMOVED;
EnterCriticalSection(&renderer->cs);
+
if (renderer->state == STREAM_STATE_RUNNING)
hr = stream_queue_sample(renderer, sample);
renderer->flags &= ~SAR_SAMPLE_REQUESTED;
+
+ if (renderer->queued_frames < renderer->target_queued_frames && renderer->state == STREAM_STATE_RUNNING)
+ {
+ IMFMediaEventQueue_QueueEventParamVar(renderer->stream_event_queue, MEStreamSinkRequestSample, &GUID_NULL, S_OK, NULL);
+ renderer->flags |= SAR_SAMPLE_REQUESTED;
+ }
+
LeaveCriticalSection(&renderer->cs);
return hr;
@@ -1428,6 +1447,7 @@ static HRESULT WINAPI audio_renderer_stream_Flush(IMFStreamSink *iface)
release_pending_object(obj);
}
}
+ renderer->queued_frames = 0;
LeaveCriticalSection(&renderer->cs);
return hr;
@@ -1516,6 +1536,8 @@ static HRESULT audio_renderer_create_audio_client(struct audio_renderer *rendere
unsigned int flags;
WAVEFORMATEX *wfx;
HRESULT hr;
+ REFERENCE_TIME period;
+ DWORD samples_per_second;
audio_renderer_release_audio_client(renderer);
@@ -1543,6 +1565,7 @@ static HRESULT audio_renderer_create_audio_client(struct audio_renderer *rendere
flags |= AUDCLNT_STREAMFLAGS_NOPERSIST;
hr = IAudioClient_Initialize(renderer->audio_client, AUDCLNT_SHAREMODE_SHARED, flags, 1000000, 0, wfx,
&renderer->stream_config.session_id);
+ samples_per_second = wfx->nSamplesPerSec;
CoTaskMemFree(wfx);
if (FAILED(hr))
{
@@ -1576,6 +1599,13 @@ static HRESULT audio_renderer_create_audio_client(struct audio_renderer *rendere
return hr;
}
+ if (FAILED(hr = IAudioClient_GetDevicePeriod(renderer->audio_client, &period, NULL)))
+ {
+ WARN("Failed to retrieve device period, hr %#x.\n", hr);
+ return hr;
+ }
+ renderer->target_queued_frames = 2 * period * samples_per_second / 10000000;
+
if (SUCCEEDED(hr = MFCreateAsyncResult(NULL, &renderer->render_callback, NULL, &result)))
{
if (FAILED(hr = MFPutWaitingWorkItem(renderer->buffer_ready_event, 0, result, &renderer->buffer_ready_key)))
@@ -1789,6 +1819,7 @@ static void audio_renderer_render(struct audio_renderer *renderer, IMFAsyncResul
IAudioRenderClient_ReleaseBuffer(renderer->audio_render_client, dst_frames, 0);
obj->u.sample.frame_offset += dst_frames;
+ renderer->queued_frames -= dst_frames;
}
keep_sample = FAILED(hr) || src_frames > max_frames;
--
2.32.0
1
0
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
include/wine/afd.h | 1 +
server/sock.c | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 35 insertions(+)
diff --git a/include/wine/afd.h b/include/wine/afd.h
index 6370e00539f..0ccd248e614 100644
--- a/include/wine/afd.h
+++ b/include/wine/afd.h
@@ -162,6 +162,7 @@ struct afd_get_events_params
#define IOCTL_AFD_WINE_GET_SO_ACCEPTCONN CTL_CODE(FILE_DEVICE_NETWORK, 219, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_AFD_WINE_GET_SO_BROADCAST CTL_CODE(FILE_DEVICE_NETWORK, 220, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_AFD_WINE_SET_SO_BROADCAST CTL_CODE(FILE_DEVICE_NETWORK, 221, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_AFD_WINE_GET_SO_ERROR CTL_CODE(FILE_DEVICE_NETWORK, 222, METHOD_BUFFERED, FILE_ANY_ACCESS)
struct afd_create_params
{
diff --git a/server/sock.c b/server/sock.c
index 71f22845827..f614bf5feaa 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -2546,6 +2546,40 @@ static int sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
return 1;
}
+ case IOCTL_AFD_WINE_GET_SO_ERROR:
+ {
+ int error;
+ socklen_t len = sizeof(error);
+ unsigned int i;
+
+ if (get_reply_max_size() < sizeof(error))
+ {
+ set_error( STATUS_BUFFER_TOO_SMALL );
+ return 0;
+ }
+
+ if (getsockopt( unix_fd, SOL_SOCKET, SO_ERROR, (char *)&error, &len ) < 0)
+ {
+ set_error( sock_get_ntstatus( errno ) );
+ return 0;
+ }
+
+ if (!error)
+ {
+ for (i = 0; i < ARRAY_SIZE( sock->errors ); ++i)
+ {
+ if (sock->errors[i])
+ {
+ error = sock->errors[i];
+ break;
+ }
+ }
+ }
+
+ set_reply_data( &error, sizeof(error) );
+ return 1;
+ }
+
default:
set_error( STATUS_NOT_SUPPORTED );
return 0;
--
2.30.2
2
7
The June 16 build crashed on some machines but since June 17 all builds
crash on all Windows machines (and time out in Wine):
https://test.winehq.org/data/patterns.html#crypt32:chain
The best explanation is that some certificate expired on the 17th:
* The few June 16 cypt32:chain tests that were run after midnight
(i.e. on the 17th) crashed.
* And all cypt32:chain tests run since the 17th crash.
Does anyone know what to do?
--
Francois Gouget <fgouget(a)codeweavers.com>
1
1
Hi everyone,
My name is Weiwen Chen, an undergraduate at Fudan University, Department of
Physics. I'm interested in open source projects and I have three years'
programming experience, mainly in python, c and golang. I have some
experience of operating system utilities through the labs of MIT 6.828. I'm
a linux user and wine is something good in my daily life. Maybe I'm not as
experienced as you, but I'll try my best to do something useful.
I applied to the 'Implement robocopy.exe' summer project
<https://wiki.winehq.org/Summer_Of_Code#Implement_robocopy.exe>, and have
exchanged several emails with Ms. Figura and Mr. Li. (Though I'm not sure
whether my application will be accepted! ;))
---
Besides, I want to know how to add a new executable into the `programs/`
directory correctly.
I'm trying to set up a skeleton program which can be compiled. I created
`robocopy/` dir under `programs/`, copied things from `reg/` and modified
the `MODULE` variable in `Makefile.in`, added lines below in `configure.ac`
and rerun `autoconf` command.
WINE_CONFIG_MAKEFILE(programs/robocopy)
WINE_CONFIG_MAKEFILE(programs/robocopy/tests)
I hope it will generate an executable called `robocopy.exe` which acts like
`reg.exe`, but I don't find it under `.wine/drive_c/windows/system32/` or
`.wine/drive_c/windows/syswow64/`. Have I missed anything? I wonder how to
add a skeleton executable into `programs/` which can be correctly compiled
and placed.
I staged my code mentioned above under my github fork
<https://github.com/ofey404/wine/tree/robocopy>,
Wish you all the best
Weiwen Chen
3
2
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/light.msstyles/blue_button.bmp | Bin 0 -> 12198 bytes
dlls/light.msstyles/blue_button.svg | 24 +++
dlls/light.msstyles/blue_checkbox_13px.bmp | Bin 0 -> 8166 bytes
dlls/light.msstyles/blue_checkbox_13px.svg | 44 +++++
dlls/light.msstyles/blue_checkbox_16px.bmp | Bin 0 -> 12342 bytes
dlls/light.msstyles/blue_checkbox_16px.svg | 36 +++++
dlls/light.msstyles/blue_checkbox_25px.bmp | Bin 0 -> 30054 bytes
dlls/light.msstyles/blue_checkbox_25px.svg | 40 +++++
dlls/light.msstyles/blue_commandlink.bmp | Bin 0 -> 12990 bytes
dlls/light.msstyles/blue_commandlink.svg | 18 +++
.../blue_commandlink_glyph_30px.bmp | Bin 0 -> 18054 bytes
.../blue_commandlink_glyph_30px.svg | 19 +++
.../blue_commandlink_glyph_45px.bmp | Bin 0 -> 40554 bytes
.../blue_commandlink_glyph_45px.svg | 19 +++
dlls/light.msstyles/blue_groupbox.bmp | Bin 0 -> 1814 bytes
dlls/light.msstyles/blue_groupbox.svg | 15 ++
dlls/light.msstyles/blue_radiobutton_13px.bmp | Bin 0 -> 5462 bytes
dlls/light.msstyles/blue_radiobutton_13px.svg | 28 ++++
dlls/light.msstyles/blue_radiobutton_16px.bmp | Bin 0 -> 8246 bytes
dlls/light.msstyles/blue_radiobutton_16px.svg | 28 ++++
dlls/light.msstyles/blue_radiobutton_25px.bmp | Bin 0 -> 20054 bytes
dlls/light.msstyles/blue_radiobutton_25px.svg | 28 ++++
dlls/light.msstyles/light.rc | 151 ++++++++++++++++++
23 files changed, 450 insertions(+)
create mode 100644 dlls/light.msstyles/blue_button.bmp
create mode 100644 dlls/light.msstyles/blue_button.svg
create mode 100644 dlls/light.msstyles/blue_checkbox_13px.bmp
create mode 100644 dlls/light.msstyles/blue_checkbox_13px.svg
create mode 100644 dlls/light.msstyles/blue_checkbox_16px.bmp
create mode 100644 dlls/light.msstyles/blue_checkbox_16px.svg
create mode 100644 dlls/light.msstyles/blue_checkbox_25px.bmp
create mode 100644 dlls/light.msstyles/blue_checkbox_25px.svg
create mode 100644 dlls/light.msstyles/blue_commandlink.bmp
create mode 100644 dlls/light.msstyles/blue_commandlink.svg
create mode 100644 dlls/light.msstyles/blue_commandlink_glyph_30px.bmp
create mode 100644 dlls/light.msstyles/blue_commandlink_glyph_30px.svg
create mode 100644 dlls/light.msstyles/blue_commandlink_glyph_45px.bmp
create mode 100644 dlls/light.msstyles/blue_commandlink_glyph_45px.svg
create mode 100644 dlls/light.msstyles/blue_groupbox.bmp
create mode 100644 dlls/light.msstyles/blue_groupbox.svg
create mode 100644 dlls/light.msstyles/blue_radiobutton_13px.bmp
create mode 100644 dlls/light.msstyles/blue_radiobutton_13px.svg
create mode 100644 dlls/light.msstyles/blue_radiobutton_16px.bmp
create mode 100644 dlls/light.msstyles/blue_radiobutton_16px.svg
create mode 100644 dlls/light.msstyles/blue_radiobutton_25px.bmp
create mode 100644 dlls/light.msstyles/blue_radiobutton_25px.svg
diff --git a/dlls/light.msstyles/blue_button.bmp b/dlls/light.msstyles/blue_button.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..172bfdd932f96a27bddfc1893995239f5447b0bb
GIT binary patch
literal 12198
zcmeI0F;2rk5Jk-eC~57|t_VV+BSm`dLYasgP$MD%Y3ZC4(a)eL?!2SIJ0B*OA)nek>s
z5<2e~3F%wf9cLrG?0)^#k7jc7dLDGo70oe?GaC0aPJ)Q$Ah(a)OP-%j1=7HHZ&T!hWy
zx(a)hK?ZSy#?UV|Ag<9x>~&BwE`rm@}+G0gi@$L4*iFlAHimzA^2l2#QhwRpk-*C_!V
zpo82AuJ8l=@XHTF<;7yWF`o;)e50)79Nx}H5!F&MNj%-Favn32G9EdPoR_;HUXssR
z6<ntzbbt=~cM5*^13w_=yPQwcG|aNBSgls=a=ElVgBk1fI%g);vZ^XW&%U*Ly)%PY
z9h-kcgDD$fmYiMIw5n*S#S;#=P6_A$9pp}Mg&*LDV?PX)7nE<Cx~?fc)bh>jaya7b
zluQy&_o>WaCg-ueOF}zK3OkKks(a)7{TW18eUW=SmL#XH=OV{7d5kZV=We$2#YKQBQ)
z=m!tL1HK*@EHC1XoyD5@#w^a^h-#^lN$%_g=P~;B=-bPGVDu5463_uU$erK{Km21q
ppl^@9J=qt1dv}L<mfq0Miq0FjPDkhf9rkY&{4l&9(6(a)Je`)>k^jEVpN
literal 0
HcmV?d00001
diff --git a/dlls/light.msstyles/blue_button.svg b/dlls/light.msstyles/blue_button.svg
new file mode 100644
index 00000000000..d1c6bd80e64
--- /dev/null
+++ b/dlls/light.msstyles/blue_button.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="22" height="138" version="1.1" viewBox="0 0 5.8208 36.512" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <metadata>
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g transform="translate(-40.717 -1.1913)" stroke-width=".26458">
+ <g fill="#fff">
+ <rect x="40.849" y="1.3236" width="5.5563" height="5.8208" rx=".52917" ry=".52917" stroke="#aeaeae"/>
+ <rect x="40.849" y="19.58" width="5.5563" height="5.8208" rx=".52917" ry=".52917" stroke="#aeaeae"/>
+ <g stroke="#3096fa">
+ <rect x="40.849" y="25.665" width="5.5563" height="5.8208" rx=".52917" ry=".52917"/>
+ <rect x="40.849" y="31.751" width="5.5563" height="5.8208" rx=".52917" ry=".52917"/>
+ <rect x="40.849" y="7.409" width="5.5563" height="5.8208" rx=".52917" ry=".52917"/>
+ </g>
+ </g>
+ <rect x="40.849" y="13.494" width="5.5563" height="5.8208" rx=".52917" ry=".52917" fill="#2979ff" stroke="#2979ff"/>
+ </g>
+</svg>
diff --git a/dlls/light.msstyles/blue_checkbox_13px.bmp b/dlls/light.msstyles/blue_checkbox_13px.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..7f55d7571e2894d89d4622d3a05c8f893361e795
GIT binary patch
literal 8166
zcmeHL%Wm306oo9BRZIT>R7ENfDX}T4#0sg~D$1gpO7s`H4v!6gP^kn6qCZds39Bpu
zS#<>;QUPM08Y<nM>oD#ZjAt54D5-4e_>SkEGh;I+o*TbA`5BMc$6K6}z;oam5RD{o
zjzs#%|9Ei^y91|QuNS|%x*A+wURnV8fb%!ZM;s!SJDtumF^*T{Jh&Cs0hWp{#<;$|
z-e*2QqE9C>f7co(a)r(fiI7kQoM5S$%r9<n~SxW}SuT{+KwVV?mBXoi5&Z_H=EQ6&|p
zQfdHL0QrFPH!J>-O6f9H4}Cq#c`BwVwvNYF(a)WtBD=YxG{?E4XYI#Jxa4p(r3YJ}b|
z@?0V>=GBQi);wT+lDAY!7FFwN`+)tzJ}V{@i13e=-v;cryK^(XXcz;)0>}r}qHf&S
z{O0j+*)Yn~QFs*jW!<Q-j>lK=#k$eggMD#7qE9D^d)MI#PEd`|`$e8h<i)%?amShm
ztdDuSY??*Yx^kZVg6A3BHI2jq{y|&qH|E2i{4Ndm`am(a)W*CQ%~dwqbt{;7DhTCMJ(
zhH2yP>C?7%5b{nvN<>jSTMK<-U;=#f(#aa|Yq%bveu`lp1MMl|hjpE-LAwCXOTp=O
zyIJ(jfK$=OQP#-)qK&yT;7t4d{)y;QX_yC24wys#es%5q24Wnq2u&XNE@{GgG+;eS
z)yN)|Q*A1zw|Z2r-|%9Kg4;s9G)DgfT2GI<G^KP6*CRT66{GT(a)0qqp^(}qV~nqs;@
zRm1TpRbFS2pV3*`<xyGV<r&;x#-6W|bUdok(a)Ho)qz?(yFdsIiW(&fRmJ-X6_^=QC)
zls$?XrfoHjw|Z2r--senT(^KR>fwpiG(9~kYZi60hU*cv-o&6W(4IoK;Za#*HH`v&
z`Rmceg_%WuW}O=@kIEV^k1o!SGCbd}`jO*Nm4?SzUYI%X=D!<;?NJ?#t!tQhJfrQ=
zl_so5gMWM4!*AOLwt5tMm%PtK!EFI!U;=o0bWKwOZv?~u1DFCE9$nKEz;WKAXlH>L
z;PU922I-9>gC3sG(a)u-G|2gw0*;Ggz-(a)biG}(bYVUcCSYr6aLTi1ir(<Pg;kjuU%t3
zc8`YNNAJH0yB1Axp<DCG!#n{^SdRv*N9Fb2*4C}XWPPY{zTJlPXz+Seww7l*z&^*{
OH?@!dbe>0BkNyE918kxI
literal 0
HcmV?d00001
diff --git a/dlls/light.msstyles/blue_checkbox_13px.svg b/dlls/light.msstyles/blue_checkbox_13px.svg
new file mode 100644
index 00000000000..d7cafa54296
--- /dev/null
+++ b/dlls/light.msstyles/blue_checkbox_13px.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="13" height="156" fill="#000000" version="1.1" viewBox="0 0 13 156" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <metadata>
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g fill="none">
+ <path d="m0 0h24v24h-24z"/>
+ <rect x=".5" y=".5" width="12" height="12" rx="2" ry="2" stroke="#aeaeae"/>
+ <rect x=".5" y="13.5" width="12" height="12" rx="2" ry="2" stroke="#3096fa"/>
+ <path d="m0.5 25.5h24v24h-24z"/>
+ <rect x=".5" y="26.5" width="12" height="12" rx="2" ry="2" stroke="#2979ff"/>
+ <rect x=".5" y="39.5" width="12" height="12" rx="2" ry="2" stroke="#aeaeae"/>
+ <path d="m4.1723e-7 52h24v24h-24z"/>
+ <rect x=".5" y="52.5" width="12" height="12" rx="2" ry="2" stroke="#aeaeae"/>
+ <rect x=".5" y="65.5" width="12" height="12" rx="2" ry="2" stroke="#3096fa"/>
+ <path d="m0.5 77.5h24v24h-24z"/>
+ <rect x=".5" y="78.5" width="12" height="12" rx="2" ry="2" stroke="#2979ff"/>
+ <rect x=".5" y="91.5" width="12" height="12" rx="2" ry="2" stroke="#aeaeae"/>
+ <path d="m-1.9073e-6 104h24v24h-24z"/>
+ <rect x=".5" y="104.5" width="12" height="12" rx="2" ry="2" stroke="#aeaeae"/>
+ <rect x=".5" y="117.5" width="12" height="12" rx="2" ry="2" stroke="#3096fa"/>
+ <path d="m0.5 129.5h24v24h-24z"/>
+ <rect x=".5" y="130.5" width="12" height="12" rx="2" ry="2" stroke="#2979ff"/>
+ <rect x=".5" y="143.5" width="12" height="12" rx="2" ry="2" stroke="#aeaeae"/>
+ </g>
+ <path d="m4.8636 60.537-2.1477-2.194-0.71591 0.73134 2.8636 2.9254 6.1364-6.2687-0.71591-0.73134z"/>
+ <g>
+ <path d="m4.8636 73.537-2.1477-2.194-0.71591 0.73134 2.8636 2.9254 6.1364-6.2687-0.71591-0.73134z" fill="#3096fa"/>
+ <path d="m4.8636 99.537-2.1477-2.194-0.71591 0.73134 2.8636 2.9254 6.1364-6.2687-0.71591-0.73134z" fill="#aeaeae"/>
+ <path d="m4.8636 86.537-2.1477-2.194-0.71591 0.73135 2.8636 2.9254 6.1364-6.2687-0.71591-0.73134z" fill="#2979ff"/>
+ </g>
+ <path d="m2 110h9v1h-9z"/>
+ <g>
+ <path d="m2 123h9v1h-9z" fill="#3096fa"/>
+ <path d="m2 136h9v1h-9z" fill="#2979ff"/>
+ <path d="m2 149h9v1h-9z" fill="#aeaeae"/>
+ </g>
+</svg>
diff --git a/dlls/light.msstyles/blue_checkbox_16px.bmp b/dlls/light.msstyles/blue_checkbox_16px.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..6451eb3aa70932ea32451b5d4a63a29e8c3363cc
GIT binary patch
literal 12342
zcmeHNzi-+=6b4l)8LFmBrwl<=M1Tx7YLux%)3H)Vw)_EEI)h<h>Xa$sM=B-ijs)2<
z1du8<Q>KjBGG&RBB?G~x$@O~&FEIvUpXp$bPx^T0<9+x06Zg)1`L?A;WZJ(a)K5_kvv
z2BMKTK9TVKpSJ(a)H3L=q4qp^B?eB5d_n<gMUf_zVj3)_Y*)a&)vT&J5QU+{`l2Vkmj
zx$cvblNfOU!DXtJxC_Lmc~C*bF(a)6=UoO1_Xb^4v{&nth{{oBDj=2bL6zN9(QEf5F4
z4JhfCxTIfEOsxtd)dEaFcm(;L4!Lb%qzj_7;aUIWEApwLtb^KB;PNIB-`8T`%RY0N
zs^zh&^4LE}eC~@^OJiVPd!EbOter!7KZ)D$!zE5Y_%rU`WJeguyov^-en(a)kq+k7$(
z3k(a)pkw?+EBFK1S*s@?)jKzM{{RrFKIt!eFkRWFFTg8t##ujoapgW6T$@?H`9YccLK
zm#JDFt16HEgT&{)c(pVJ_O<7^%+1<4l=qXk4L(a)As1cX21{>^mywM<?`1LRAZ!}weG
zH9c-YgUGAtm$=YAodLr0zrP(Au=DS%=l5Cp%99wd`SaWVxjz3dp#Gy+$RpsZ+k#Hn
ze|zAO7P`Qvm+F|n&keZ->=|$iYycCJgTDi(N8rcMc^UQsxCY|DSaR?ia5w~L{G3*h
zxdJYM_gu)<!Cyl8EB?-A6Ug5H=fE3Vxk~)L3Emyh0b*Q-qkS%(X1DQ04`>3ipNf2{
zHw!!fWqR<zC)zGhqRfy#*ZN<y_#eWJ;%?yx(a)sO+j;Un)mXe~L3e0pzK-W9ox7xnMt
zqurb=%O?%oiJT#SD{|?n`nU5%A-#j=M_8$Uk^8WWxbOmH*A(M%|Lk^zZ=@P{KBV!p
zk0>TqP<DlWT?%7uO#dVNQhZ5d$MugsB;a=gdycqsME`a^w>im*;`%0h?@&jF?rqq|
zE1&#DVSO9^JyA$Cxt}V0Sw}vd1?K^f`d8%->)6E_m1KUff5P}bK=Hp2k*HP49Q{4e
zUG+aHezYpu-mtveuV^po-^uS+wH%cpHZx$)fLpVyP1V1hZ&tM(JU^OMeW3rJAD8ib
zfx50K#-sh_Om=?1nrT>7?U2ULe%+e30-r13QtW5O^l#^jU!RvmJv;XM-z#eg_}u{K
zqB5#~JD=N}WUYhDCVcO#YNkW?Htge-PySeoZTR<aZ`9;|s_>}}%xxB&2SDmyl}~kG
z47+AUFAehYzATLYgZ2K8_J4T(rwtm3gy;XkJn(0D{vW*aHu?SE0>=Nm)~?oP{P$FE
z$X}@cPdu%w*Gw4y%l{69(a)Bh7S7>A#q_|slR$REGIvCofN{y)uM82<+-{&!n*`}cn0
hzmWet1L6FI(a)juQ$;s1Z1C83lH<A;TaALjb~-#-V*m*fBd
literal 0
HcmV?d00001
diff --git a/dlls/light.msstyles/blue_checkbox_16px.svg b/dlls/light.msstyles/blue_checkbox_16px.svg
new file mode 100644
index 00000000000..946a90bd983
--- /dev/null
+++ b/dlls/light.msstyles/blue_checkbox_16px.svg
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16" height="192" fill="#000000" version="1.1" viewBox="0 0 16 192" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <metadata>
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g fill="none">
+ <rect x=".5" y=".5" width="15" height="15" rx="2" ry="2" stroke="#aeaeae"/>
+ <rect x=".5" y="16.5" width="15" height="15" rx="2" ry="2" stroke="#3096fa"/>
+ <rect x=".5" y="32.5" width="15" height="15" rx="2" ry="2" stroke="#2979ff"/>
+ <rect x=".5" y="48.5" width="15" height="15" rx="2" ry="2" stroke="#aeaeae"/>
+ <rect x=".5" y="64.5" width="15" height="15" rx="2" ry="2" stroke="#aeaeae"/>
+ <rect x=".5" y="80.5" width="15" height="15" rx="2" ry="2" stroke="#3096fa"/>
+ <rect x=".5" y="96.5" width="15" height="15" rx="2" ry="2" stroke="#2979ff"/>
+ <rect x=".5" y="112.5" width="15" height="15" rx="2" ry="2" stroke="#aeaeae"/>
+ <rect x=".5" y="128.5" width="15" height="15" rx="2" ry="2" stroke="#aeaeae"/>
+ <rect x=".5" y="144.5" width="15" height="15" rx="2" ry="2" stroke="#3096fa"/>
+ <rect x=".5" y="160.5" width="15" height="15" rx="2" ry="2" stroke="#2979ff"/>
+ <rect x=".5" y="176.5" width="15" height="15" rx="2" ry="2" stroke="#aeaeae"/>
+ </g>
+ <path d="m5.8182 74.91-2.8636-3.1343-0.95455 1.0448 3.8182 4.1791 8.1818-8.9552-0.95455-1.0448z"/>
+ <path d="m5.8182 90.91-2.8636-3.1343-0.95455 1.0448 3.8182 4.1791 8.1818-8.9552-0.95455-1.0448z" fill="#3096fa"/>
+ <path d="m5.8182 106.91-2.8636-3.1343-0.95455 1.0448 3.8182 4.1791 8.1818-8.9552-0.95455-1.0448z" fill="#2979ff"/>
+ <path d="m5.8182 122.91-2.8636-3.1343-0.95454 1.0448 3.8182 4.1791 8.1818-8.9552-0.95455-1.0448z"/>
+ <g>
+ <path d="m2 135h12v2h-12z"/>
+ <path d="m2 151h12v2h-12z" fill="#3096fa"/>
+ <path d="m2 167h12v2h-12z" fill="#2979ff"/>
+ <path d="m2 183h12v2h-12z"/>
+ </g>
+</svg>
diff --git a/dlls/light.msstyles/blue_checkbox_25px.bmp b/dlls/light.msstyles/blue_checkbox_25px.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..c9bae2042b0136e5d8b73170799b2e48e5743a62
GIT binary patch
literal 30054
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
NBv<ZPs^PQLe*xSO3%>vW
literal 0
HcmV?d00001
diff --git a/dlls/light.msstyles/blue_checkbox_25px.svg b/dlls/light.msstyles/blue_checkbox_25px.svg
new file mode 100644
index 00000000000..8a32f232c81
--- /dev/null
+++ b/dlls/light.msstyles/blue_checkbox_25px.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="25" height="300" fill="#000000" version="1.1" viewBox="0 0 25 300" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <metadata>
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <rect x="1" y="1" width="23" height="23" rx="2" ry="2" fill="none" stroke="#aeaeae" stroke-width="2"/>
+ <path d="m9.4091 116.87-4.0568-4.7015-1.3523 1.5672 5.4091 6.2687 11.591-13.433-1.3523-1.5672z"/>
+ <path d="m4 211h17v3h-17z"/>
+ <g fill="none" stroke-width="2">
+ <rect x="1" y="26" width="23" height="23" rx="2" ry="2" stroke="#3096fa"/>
+ <rect x="1" y="51" width="23" height="23" rx="2" ry="2" stroke="#2979ff"/>
+ <rect x="1" y="76" width="23" height="23" rx="2" ry="2" stroke="#aeaeae"/>
+ <rect x="1" y="101" width="23" height="23" rx="2" ry="2" stroke="#aeaeae"/>
+ <rect x="1" y="126" width="23" height="23" rx="2" ry="2" stroke="#3096fa"/>
+ <rect x="1" y="151" width="23" height="23" rx="2" ry="2" stroke="#2979ff"/>
+ <rect x="1" y="176" width="23" height="23" rx="2" ry="2" stroke="#aeaeae"/>
+ </g>
+ <g>
+ <path d="m9.4091 141.87-4.0568-4.7015-1.3523 1.5672 5.4091 6.2687 11.591-13.433-1.3523-1.5672z" fill="#3096fa"/>
+ <path d="m9.4091 166.87-4.0568-4.7015-1.3523 1.5672 5.4091 6.2687 11.591-13.433-1.3523-1.5672z" fill="#2979ff"/>
+ <path d="m9.4091 191.87-4.0568-4.7015-1.3523 1.5672 5.4091 6.2687 11.591-13.433-1.3523-1.5672z" fill="#aeaeae"/>
+ </g>
+ <g fill="none" stroke-width="2">
+ <rect x="1" y="201" width="23" height="23" rx="2" ry="2" stroke="#aeaeae"/>
+ <rect x="1" y="226" width="23" height="23" rx="2" ry="2" stroke="#3096fa"/>
+ <rect x="1" y="251" width="23" height="23" rx="2" ry="2" stroke="#2979ff"/>
+ <rect x="1" y="276" width="23" height="23" rx="2" ry="2" stroke="#aeaeae"/>
+ </g>
+ <g>
+ <path d="m4 236h17v3h-17z" fill="#3096fa"/>
+ <path d="m4 261h17v3h-17z" fill="#2979ff"/>
+ <path d="m4 286h17v3h-17z" fill="#aeaeae"/>
+ </g>
+</svg>
diff --git a/dlls/light.msstyles/blue_commandlink.bmp b/dlls/light.msstyles/blue_commandlink.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..929a08af852478eb382bd466fd9497ad07cbe6e3
GIT binary patch
literal 12990
zcmeI1F;2rU6o%b}4oDoK%}}9~4oyJf0PGxvnKX1@?2I50SKtP1S{4qKIvLFGq)!S`
z9c4g5C4Z%tXW7qg^Yyp=65ri_UaRVJi>nVihg}Yo8YmAXrB-PFx~Q$Hz$JeT$HiN)
zDUv|L%n{Q%3D)`h%?NE-nFO)<n4L-grnmKFGGEGgt~lvqUM53~xwqdbb!}dLTU(5@
zF}5Z_4&)$n!g}g~dY~Sf1bU+f-Elug9uV%zG>lyF^*$fOSWB`z4ZI?qZ&7yU4^<rU
z4CWeKe`V%zAL`Az!`%MxTqW9X^PCr)7fpSfs2=`2*Jv_inFL6H1W14cNPq->n}B(m
zj?H4afoYgIVzz#59%m!?%q*^A^Xxc7K|NxYuzEa4oZN$Xm<$oShjn_+vT=-6iX3VM
zkpnr%T4Fu*Ks`_oO#(mkpk4d6^f>It*zf%vEON!$`YI2w`9S1*n0H%PTmF#QJcDN_
wJVOz!o#?y4PI)Ttt^SwEfgEJMTTeaoMh`qgX$qfZ5+DH*AOR8}fqzHf8^!81*Z=?k
literal 0
HcmV?d00001
diff --git a/dlls/light.msstyles/blue_commandlink.svg b/dlls/light.msstyles/blue_commandlink.svg
new file mode 100644
index 00000000000..97f72bfd651
--- /dev/null
+++ b/dlls/light.msstyles/blue_commandlink.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="11" height="294" version="1.1" viewBox="0 0 2.9104 77.788" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <metadata>
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g fill="none" stroke-linecap="round" stroke-width=".26458">
+ <rect x=".13229" y="13.097" width="2.6456" height="12.7" rx=".52917" ry=".52917" stroke="#3096fa"/>
+ <rect x=".13229" y="26.061" width="2.6456" height="12.7" rx=".52917" ry=".52917" stroke="#2979ff"/>
+ <rect x=".13229" y="51.991" width="2.6456" height="12.7" rx=".52917" ry=".52917" stroke="#3096fa"/>
+ <rect x=".13229" y="64.955" width="2.6456" height="12.7" rx=".52917" ry=".52917" stroke="#3096fa"/>
+ </g>
+</svg>
diff --git a/dlls/light.msstyles/blue_commandlink_glyph_30px.bmp b/dlls/light.msstyles/blue_commandlink_glyph_30px.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..76789b095575b8d12fdf51ac96b6486d69fe2c27
GIT binary patch
literal 18054
zcmeI2O-{m45P<6iJc4lvZ5qnP1GsQ!;sVaX&qml7_e#A)Dcr$R)h@<qv6!#`U;8p$
z_>oKrwDUgr-t;w-y!*$OhoFAl>2aWOqmgP{1-E((f+s!yd3}ib3l12-z`r+8q@#7Q
zNmiC3inloaN|RDU%-Lx&ZP?{U@@)FQVT-Htsz!W;3)>g78mCCduNHMyY{nDi9qucb
zUX}Oa_I(r`=hJ$PR-RSedYvc+!vF>_fB_6(z}Y~a=j-iuyK+wKkg(tHW960_V$D|O
zv|;adJJWs;b}p{Ys~YhYE^J(a)SpK(n3LA{qI%B$}yeTUg$jXF*3!)=yjQ8S;`>tw~V
zs-aWYe8vC<Fn|FJV8GUZEW))c!<8jfW`kH3!%{=c+4FFEWX}ht{h+`WadckSNL433
z!h!9D*Zk(?(4;q$MKn3qHcYQeS}$&AVe~tn#%r`b6U3;7yiOE(a)VE_XdzyJm?;B0{X
zqRz@%Clu@#Wxr_a>bacQ%brH|s9v6!mRA()7j0>dGz?$>0~o*n23!o#54zaub}jv2
gLO<B8gwAHu51!T2>0~c%=?6Q_8Oa#Hz~2pg1CC}%!~g&Q
literal 0
HcmV?d00001
diff --git a/dlls/light.msstyles/blue_commandlink_glyph_30px.svg b/dlls/light.msstyles/blue_commandlink_glyph_30px.svg
new file mode 100644
index 00000000000..9d0e199b42c
--- /dev/null
+++ b/dlls/light.msstyles/blue_commandlink_glyph_30px.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="30" height="150" version="1.1" viewBox="0 0 7.9375 39.688" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <metadata>
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g stroke-width=".26458">
+ <path d="m4.7625 2.1167-0.37306 0.37306 1.2118 1.2144h-4.2783v0.52917h4.2783l-1.2144 1.2144 0.37571 0.37306 1.8521-1.8521z" fill="#3096fa"/>
+ <path d="m4.7625 10.054-0.37306 0.37306 1.2118 1.2144h-4.2783v0.52917h4.2783l-1.2144 1.2144 0.37571 0.37306 1.8521-1.8521z" fill="#3096fa"/>
+ <path d="m4.7625 17.992-0.37306 0.37306 1.2118 1.2144h-4.2783v0.52917h4.2783l-1.2144 1.2144 0.37571 0.37306 1.8521-1.8521z" fill="#2979ff"/>
+ <path d="m4.7625 25.929-0.37306 0.37306 1.2118 1.2144h-4.2783v0.52917h4.2783l-1.2144 1.2144 0.37571 0.37306 1.8521-1.8521z" fill="#aeaeae"/>
+ <path d="m4.7625 33.867-0.37306 0.37306 1.2118 1.2144h-4.2783v0.52917h4.2783l-1.2144 1.2144 0.37571 0.37306 1.8521-1.8521z" fill="#3096fa"/>
+ </g>
+</svg>
diff --git a/dlls/light.msstyles/blue_commandlink_glyph_45px.bmp b/dlls/light.msstyles/blue_commandlink_glyph_45px.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..a05919387b97f7c43080ff215cc78208d1c58cdd
GIT binary patch
literal 40554
zcmeI5PiqrF7>5&3^q?Npi;7S|+9Xx8OQq-H-A~X{FDVF~Qf$+D2=rV^jk_VB2HKtq
z{g;K_Bv5ZHIhN2%!4F|23GM5<8#mpZ^pI?_=8gOclij4dlP3?8*%^N9<jvc6-y+W6
zBtOQuyyWteOEfaVkCDi0{{N4A&EmX(2N-|>7=Qs7fB_izj||k!<V(a)YvHYhuFV;DYG
zJ)fLq-U}|&F!d6BdVWhXH&G<Yj(a)NBox719{qT<wT@!WaMaGC#Z%Vdn-5zlQT*Zkc2
zA$=XYE1uibSNz=C5q%lIFPYnBs~K9>$DP+J^m+1ubnb?kocD2?+6fgV9*O5Rv^gKQ
zk*xm8>5qHi_SNU<t3rPL^xSyyG$?n-Y_0yf{eATBL&kjeJNN2YQ0B1DYvlDbJHBjr
z=JtG^Pd*9zeS_9NZ2d+XuiZZvCLRX;{9&J0Gxg<GTd?~gLpzpw9c+&8v{fIkDR;c#
z(a)EUr~&#Q?Z*VXe{(aSpw<7ehgadGA;4zKWeiu;|e<+W-4zHM^<aMOJaTNr==7=Qs7
zfB_hQ0T_S*7=Qs7fB_hQfp87%?Ci{N*(jIGLy^&MZ*R{s?*$j){nEj~f$)r;qPx4h
z>o%{aSjA#dct-DV8y;qxzr3}zB|M|2D08kU+=u)7`@%DNhkHfgK4RbEGkX3WW)<!V
zKNp|TGvmC%eZrqbd`8dAa|(Br+jmbHy;7gIuL^VjbZ>7ja7I5MX4^;LjD8Tz+@{Y;
zrIOf;p83-3<<jG(%Ke_$jGj4%s^7SVw_;hA*o>ar!?LF>5RadZrCtY#oN>~smzVd&
zjyG&x_M209MUU&4x2W)nA3t-OO);}GPvNa4eV*dZGMROn%VwcaKt}IM!4?K!00v+H
z24DaNU;qYS00v+H24DaNLN-8|#0)LOhvq(d=AETX{DKS7LZU?Ph2KZd%QG?Sy2EQT
zH;YBt5!o5N&Ak{m6z(!*h2KZ-_>Qe9+=ui*_<i&acVflQ9Xn#*;xl?$Ol1As(a)d{;P
z;xl^g_vRJu6K?b3GkWd==ltA>D!1>RGJ1b~t$xbwufp1%(o*pI=m*5iE(a)FW*`T;SY
z(Z?~d89gn=((L8($_=;YrBSgN{jl{L*YH*-Jt{V%=XS7s)fSw-=veA?kecJWRfSjV
zc%#Xi$SJ&{$8|i;FDkt9$IlC~6f-yHDVew>eV*b(a)GuibtU*9$<h5P7TC)mOO48Q;k
zzyJ)u01UtY48Q;kzyJ)uK-dPb)_u5!vDSUKe%0EWYq?^rd(}&r&#~5hn0DLiZeXo@
zM~Zj-<A1x4weH(nW$;(9)_rhyot%la?mMv*>=>+dAIw`fXJM`TZfx~-EY`a3%^%K&
z0T_S*7=Qs7fB_hQ0T_S*7=Qs7fPo+ekkJRR*7-Te=sS1Sk0X)M_rqd$bs(ef&R4HT
zBcpE`{I|J0|1P%u+t^M)M&D~2_MVT7-fN@(`^f0~@6(a)dk8NF*Fye%^N(a)Z733BcoT1
S;5iJy01UtY48VY71AhQDzZ!`E
literal 0
HcmV?d00001
diff --git a/dlls/light.msstyles/blue_commandlink_glyph_45px.svg b/dlls/light.msstyles/blue_commandlink_glyph_45px.svg
new file mode 100644
index 00000000000..04825c4669b
--- /dev/null
+++ b/dlls/light.msstyles/blue_commandlink_glyph_45px.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="45" height="225" version="1.1" viewBox="0 0 11.906 59.531" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <metadata>
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g stroke-width=".26458">
+ <path d="m7.1834 3.175-0.57825 0.55959 1.8783 1.8217h-6.6314v0.79375h6.6314l-1.8824 1.8217 0.58235 0.55959 2.8707-2.7781z" fill="#3096fa"/>
+ <path d="m7.1834 15.081-0.57825 0.5596 1.8783 1.8217h-6.6314v0.79375h6.6314l-1.8824 1.8217 0.58235 0.55959 2.8707-2.7781z" fill="#3096fa"/>
+ <path d="m7.1834 26.988-0.57825 0.5596 1.8783 1.8217h-6.6314v0.79375h6.6314l-1.8824 1.8217 0.58235 0.55959 2.8707-2.7781z" fill="#2979ff"/>
+ <path d="m7.1834 50.8-0.57825 0.5596 1.8783 1.8217h-6.6314v0.79375h6.6314l-1.8824 1.8217 0.58235 0.55959 2.8707-2.7781z" fill="#3096fa"/>
+ <path d="m7.1834 38.894-0.57825 0.5596 1.8783 1.8217h-6.6314v0.79375h6.6314l-1.8824 1.8217 0.58235 0.55959 2.8707-2.7781z" fill="#aeaeae"/>
+ </g>
+</svg>
diff --git a/dlls/light.msstyles/blue_groupbox.bmp b/dlls/light.msstyles/blue_groupbox.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..5b8f94cebb6a75f6afa42507d17b114379b759ec
GIT binary patch
literal 1814
zcmZ?r6=P=r12Z700mNcJECR%g3<^M!f#Crg1H)lH2nGuPiM4Cj%CBF)e)qa{>wW_9
ze+n_kj9nlzf%G0AUA1b}Dxj^D0gxF$^Qu8+1MyF4m<e;ywr$(kL1qH+f0!7xXpots
z<}xshh65x;jfTT$I3SlTG)@n+Dkt{>-CaSAG8kkAsEz>DKR~PiG<OdWQ>7jPnF*?g
E03>V+W&i*H
literal 0
HcmV?d00001
diff --git a/dlls/light.msstyles/blue_groupbox.svg b/dlls/light.msstyles/blue_groupbox.svg
new file mode 100644
index 00000000000..803e8cb7f34
--- /dev/null
+++ b/dlls/light.msstyles/blue_groupbox.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="5.8208mm" height="5.2917mm" version="1.1" viewBox="0 0 5.8208 5.2917" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <metadata>
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g transform="translate(0,-1)">
+ <rect x=".13229" y="1.1323" width="5.5563" height="5.0271" rx=".52917" ry=".52917" fill="none" stroke="#aeaeae" stroke-width=".26458"/>
+ </g>
+</svg>
diff --git a/dlls/light.msstyles/blue_radiobutton_13px.bmp b/dlls/light.msstyles/blue_radiobutton_13px.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..73d8a2e6c89819d23a1ea6b72d591250b0233bb0
GIT binary patch
literal 5462
zcmeHLyG|QX5OpLTO_DAhffPvCCc=x5(qN=0W$Z|)@(IRGT7pBvHy~KzBCW9y&j#U&
zB9-lLU(a)5?SfI&RgNH^!)N7&beA}JtZrSaUEIkR`}+#`0951+ogO3CLPe$$W_kTT?1
z>J5HVsW*uKdZ|P(a)B0pPOTY1PD<OFgJIfm3WH#esv(A2(a)fK_C1s;z!W4>+9>okO6A=
z%Jf5)i8Hwx-`L&VWofa8e&jTm#~^ebIiA5|U4X9%Iiud#*!W1C&SM?Z+uPf9NQr)p
z7r=(Z<iXE6Ymn2Oot(a)XrL2f&W*LG9Ca|E{R56?><?5-uJ%lO{j-XP*vkPd1ZqVK+a
zbRSQG=RtlkX&+!d^PPD2EaEksWd`~X?|4qX&TAoljx}|Ge)bJ(557EYtX;fo-{jF3
ze9Zk2XZ(f-d=GL<>|?cB?T0-?n||VhJTSSe6PP;o??8NNZOeKLE~v$~@w}*H)*vU4
zYf(ubL)S!QEXGl>_`VM(a)7jh&j*;(Wci^cH)spqq0<<Be=XZFzehL{^m<S6~XG$4|r
zx*pHq#rI4Bu_ok9YspcahdRcl;jfGNwB)G93;3d<@>HETU*=RSyp<fqx}AV$zT~J_
z$c$jE`h)ZGY_PkQ9LZ7fb#xH%D(a)aGojY^JUefK`>r`qTCJe712zUWzKOODEWkoT3H
z!TJ#QAvubBL|(cD+_}`~qpVx?+hd>gIdGrZeUnFD(a)Cn?{AC3li;IZ%QqbN=F^PJMI
zWIXKa26<rKiM>!K?u&h?WPGjbrXGU}>fTB&@4LCRp6i_Wu5;a6b&ma2rv{zKQD9ui
zk-wUoy{t|Ri}mpVYTunKOTX)cI7<Ar>omkq3rFE+95~5QRgdEt{Eh1r5NkrtsBeBa
zifhP&eZ)GkcO7fVQH>X{Lt^q|oj4!%JiS;^9Q9Y6b`-B|$<fQ@$q~~Zo|pYYylcr(
z99<e6MEnYQor|Rj$<cfFK_AsVf%B~9ib?yRe#ueZgS;<yVg|TFv7$J7qw-qtokLpe
z3+rZIVSDVeJ_qh+a^K|97kr4<_Y>kM-a#ICkP`bSs#E<uCvELd<Y-UUIaz04fb*4x
zt?LQyZPxso4|%ZPdeq6(a)k}GFg-}$ZAcmW+1nTNB+zV*Pi6Y$Kpe(Mn<7o&U7wtnjo
zyK|qUZ#{B~mVNI0*6X|$^f`oDa`Z8N>mLC}(cbuDn(a)8iwu*bsDFeqYSwu;T85lGBT
znnz=xh{M9s2r6u%w#0cfjJmZRBS-c8_h9GI+wO)}ws|y+id!OK9*v{Io}_s+jEGxF
z^Jp9u_TVmJ^Jo|mw`}uh9H~6IZ%^}R;NMJ`IsR%Mwf5RFkJ|9YpEQq}m`x|mqc*JZ
si-dX9#B7>#eRLkRVU6E5kD7Q?Kh2~6{{Nn$JvR2!w_bJPfBn|~27<_BApigX
literal 0
HcmV?d00001
diff --git a/dlls/light.msstyles/blue_radiobutton_13px.svg b/dlls/light.msstyles/blue_radiobutton_13px.svg
new file mode 100644
index 00000000000..b46c8b97b1a
--- /dev/null
+++ b/dlls/light.msstyles/blue_radiobutton_13px.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="13" height="104" version="1.1" viewBox="0 0 13 104" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <metadata>
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path d="m10 58.5a3.5 3.5 0 0 1-3.5 3.5 3.5 3.5 0 0 1-3.5-3.5 3.5 3.5 0 0 1 3.5-3.5 3.5 3.5 0 0 1 3.5 3.5z"/>
+ <g fill="none">
+ <ellipse cx="6.5" cy="6.5" rx="6" ry="6" stroke="#aeaeae"/>
+ <ellipse cx="6.5" cy="19.5" rx="6" ry="6" stroke="#3096fa"/>
+ <ellipse cx="6.5" cy="32.5" rx="6" ry="6" stroke="#2979ff"/>
+ <ellipse cx="6.5" cy="45.5" rx="6" ry="6" stroke="#aeaeae"/>
+ <ellipse cx="6.5" cy="58.5" rx="6" ry="6" stroke="#aeaeae"/>
+ <ellipse cx="6.5" cy="71.5" rx="6" ry="6" stroke="#3096fa"/>
+ <ellipse cx="6.5" cy="84.5" rx="6" ry="6" stroke="#2979ff"/>
+ <ellipse cx="6.5" cy="97.5" rx="6" ry="6" stroke="#aeaeae"/>
+ </g>
+ <g>
+ <path d="m10 71.5a3.5 3.5 0 0 1-3.5 3.5 3.5 3.5 0 0 1-3.5-3.5 3.5 3.5 0 0 1 3.5-3.5 3.5 3.5 0 0 1 3.5 3.5z" fill="#3096fa"/>
+ <path d="m10 84.5a3.5 3.5 0 0 1-3.5 3.5 3.5 3.5 0 0 1-3.5-3.5 3.5 3.5 0 0 1 3.5-3.5 3.5 3.5 0 0 1 3.5 3.5z" fill="#2979ff"/>
+ <path d="m10 97.5a3.5 3.5 0 0 1-3.5 3.5 3.5 3.5 0 0 1-3.5-3.5 3.5 3.5 0 0 1 3.5-3.5 3.5 3.5 0 0 1 3.5 3.5z" fill="#aeaeae"/>
+ </g>
+</svg>
diff --git a/dlls/light.msstyles/blue_radiobutton_16px.bmp b/dlls/light.msstyles/blue_radiobutton_16px.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..f7e3d4ca3bd09d235201e7e6a3135beb8239566b
GIT binary patch
literal 8246
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
Y``LNC|JNe_|CgeE(a)UOME<Ntqu01qSLIsgCw
literal 0
HcmV?d00001
diff --git a/dlls/light.msstyles/blue_radiobutton_16px.svg b/dlls/light.msstyles/blue_radiobutton_16px.svg
new file mode 100644
index 00000000000..d9c53d1d2d7
--- /dev/null
+++ b/dlls/light.msstyles/blue_radiobutton_16px.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16" height="128" version="1.1" viewBox="0 0 16 128" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <metadata>
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path d="m13 72a5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5 5 5 0 0 1 5 5z"/>
+ <g fill="none">
+ <circle cx="8" cy="8" r="7.5" stroke="#aeaeae"/>
+ <circle cx="8" cy="24" r="7.5" stroke="#3096fa"/>
+ <circle cx="8" cy="40" r="7.5" stroke="#2979ff"/>
+ <circle cx="8" cy="56" r="7.5" stroke="#aeaeae"/>
+ <circle cx="8" cy="72" r="7.5" stroke="#aeaeae"/>
+ <circle cx="8" cy="88" r="7.5" stroke="#3096fa"/>
+ <circle cx="8" cy="104" r="7.5" stroke="#2979ff"/>
+ <circle cx="8" cy="120" r="7.5" stroke="#aeaeae"/>
+ </g>
+ <g>
+ <path d="m13 88a5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5 5 5 0 0 1 5 5z" fill="#3096fa" stroke="#3096fa"/>
+ <path d="m13 104a5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5 5 5 0 0 1 5 5z" fill="#2979ff"/>
+ <path d="m13 120a5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5 5 5 0 0 1 5 5z" fill="#aeaeae"/>
+ </g>
+</svg>
diff --git a/dlls/light.msstyles/blue_radiobutton_25px.bmp b/dlls/light.msstyles/blue_radiobutton_25px.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..8cc7b112e961b3d2ae9a45c0fa49597eb53f41d4
GIT binary patch
literal 20054
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
literal 0
HcmV?d00001
diff --git a/dlls/light.msstyles/blue_radiobutton_25px.svg b/dlls/light.msstyles/blue_radiobutton_25px.svg
new file mode 100644
index 00000000000..b9934537557
--- /dev/null
+++ b/dlls/light.msstyles/blue_radiobutton_25px.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="25" height="200" version="1.1" viewBox="0 0 25 200" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <metadata>
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g fill="none" stroke-width="2">
+ <ellipse cx="12.5" cy="12.5" rx="11.5" ry="11.5" stroke="#aeaeae"/>
+ <ellipse cx="12.5" cy="37.5" rx="11.5" ry="11.5" stroke="#3096fa"/>
+ <ellipse cx="12.5" cy="62.5" rx="11.5" ry="11.5" stroke="#2979ff"/>
+ <ellipse cx="12.5" cy="87.5" rx="11.5" ry="11.5" stroke="#aeaeae"/>
+ <ellipse cx="12.5" cy="112.5" rx="11.5" ry="11.5" stroke="#aeaeae"/>
+ <ellipse cx="12.5" cy="137.5" rx="11.5" ry="11.5" stroke="#3096fa"/>
+ <ellipse cx="12.5" cy="162.5" rx="11.5" ry="11.5" stroke="#2979ff"/>
+ <ellipse cx="12.5" cy="187.5" rx="11.5" ry="11.5" stroke="#aeaeae"/>
+ </g>
+ <path d="m20 112.5a7.5 7.5 0 0 1-7.5 7.5 7.5 7.5 0 0 1-7.5-7.5 7.5 7.5 0 0 1 7.5-7.5 7.5 7.5 0 0 1 7.5 7.5z"/>
+ <g>
+ <path d="m20 137.5a7.5 7.5 0 0 1-7.5 7.5 7.5 7.5 0 0 1-7.5-7.5 7.5 7.5 0 0 1 7.5-7.5 7.5 7.5 0 0 1 7.5 7.5z" fill="#3096fa"/>
+ <path d="m20 162.5a7.5 7.5 0 0 1-7.5 7.5 7.5 7.5 0 0 1-7.5-7.5 7.5 7.5 0 0 1 7.5-7.5 7.5 7.5 0 0 1 7.5 7.5z" fill="#2979ff"/>
+ <path d="m20 187.5a7.5 7.5 0 0 1-7.5 7.5 7.5 7.5 0 0 1-7.5-7.5 7.5 7.5 0 0 1 7.5-7.5 7.5 7.5 0 0 1 7.5 7.5z" fill="#aeaeae"/>
+ </g>
+</svg>
diff --git a/dlls/light.msstyles/light.rc b/dlls/light.msstyles/light.rc
index dccda341b7c..ea138423e8e 100644
--- a/dlls/light.msstyles/light.rc
+++ b/dlls/light.msstyles/light.rc
@@ -179,8 +179,159 @@ BLUE_INI TEXTFILE
"\r\n; Flat menus\r\n"
"FlatMenus = true\r\n"
+
+"\r\n; Button\r\n"
+"[Button.Pushbutton]\r\n"
+"BgType = ImageFile\r\n"
+"SizingMargins = 8, 8, 8, 8\r\n"
+"SizingType = Stretch\r\n"
+"ContentMargins = 3, 3, 3, 3\r\n"
+"ImageFile = blue_button.bmp\r\n"
+"ImageCount = 6\r\n"
+"ImageLayout = Vertical\r\n"
+"TextColor = 0 0 0\r\n"
+"MinSize = 10, 5\r\n"
+
+"[Button.Pushbutton(Pressed)]\r\n"
+"TextColor = 255 255 255\r\n"
+
+"[Button.Pushbutton(Disabled)]\r\n"
+"TextColor = 166 166 166\r\n"
+
+"[Button.Checkbox]\r\n"
+"BgType = ImageFile\r\n"
+"ImageLayout = Vertical\r\n"
+"SizingType = TrueSize\r\n"
+"SizingMargins = 0, 0, 0, 0\r\n"
+"ContentMargins = 0, 0, 0, 0\r\n"
+"ImageCount = 12\r\n"
+"MirrorImage = False\r\n"
+"ImageSelectType = Dpi\r\n"
+"UniformSizing = True\r\n"
+"Transparent = True\r\n"
+"ImageFile1 = blue_checkbox_13px.bmp\r\n"
+"ImageFile2 = blue_checkbox_16px.bmp\r\n"
+"ImageFile3 = blue_checkbox_25px.bmp\r\n"
+"MinDpi1 = 96\r\n"
+"MinDpi2 = 118\r\n"
+"MinDpi3 = 185\r\n"
+
+"[Button.Checkbox(Checkeddisabled)]\r\n"
+"TextColor = 189 189 189\r\n"
+
+"[Button.Checkbox(Uncheckeddisabled)]\r\n"
+"TextColor = 189 189 189\r\n"
+
+"[Button.Checkbox(Mixeddisabled)]\r\n"
+"TextColor = 189 189 189\r\n"
+
+"[Button.Radiobutton]\r\n"
+"BgType = ImageFile\r\n"
+"ImageLayout = Vertical\r\n"
+"Transparent = True\r\n"
+"SizingType = TrueSize\r\n"
+"SizingMargins = 0, 0, 0, 0\r\n"
+"ContentMargins = 0, 0, 0, 0\r\n"
+"ImageCount = 8\r\n"
+"ImageSelectType = Dpi\r\n"
+"UniformSizing = True\r\n"
+"ImageFile1 = blue_radiobutton_13px.bmp\r\n"
+"ImageFile2 = blue_radiobutton_16px.bmp\r\n"
+"ImageFile3 = blue_radiobutton_25px.bmp\r\n"
+"MinDpi1 = 96\r\n"
+"MinDpi2 = 118\r\n"
+"MinDpi3 = 185\r\n"
+
+"[Button.Radiobutton(Checkeddisabled)]\r\n"
+"TextColor = 189 189 189\r\n"
+
+"[Button.Radiobutton(Uncheckeddisabled)]\r\n"
+"TextColor = 189 189 189\r\n"
+
+"[Button.Groupbox]\r\n"
+"TextColor = 0 0 0\r\n"
+"BgType = ImageFile\r\n"
+"SizingMargins = 5, 5, 5, 5\r\n"
+"SizingType = Tile\r\n"
+"ImageFile = blue_groupbox.bmp\r\n"
+"BorderOnly = True\r\n"
+"Transparent = True\r\n"
+
+"[Button.Commandlink]\r\n"
+"BgType = ImageFile\r\n"
+"BorderSize = 0\r\n"
+"ContentMargins = 7, 7, 10, 10\r\n"
+"Font = Tahoma, 10\r\n"
+"BodyFont = Tahoma, 8\r\n"
+"ImageFile = blue_commandlink.bmp\r\n"
+"ImageCount = 6\r\n"
+"ImageLayout = Vertical\r\n"
+"SizingType = Stretch\r\n"
+"SizingMargins = 5, 5, 24, 24\r\n"
+"Transparent = True\r\n"
+"TextColor = 0 0 0\r\n"
+"MinSize = 10, 5\r\n"
+
+"[Button.Commandlink(Hot)]\r\n"
+"TextColor = 48 150 250\r\n"
+
+"[Button.Commandlink(Pressed)]\r\n"
+"TextColor = 41 121 255\r\n"
+
+"[Button.Commandlink(Disabled)]\r\n"
+"TextColor = 174 174 174\r\n"
+
+"[Button.CommandlinkGlyph]\r\n"
+"BgType = ImageFile\r\n"
+"SizingType = TrueSize\r\n"
+"ImageCount = 5\r\n"
+"Transparent = True\r\n"
+"ImageLayout = Vertical\r\n"
+"ImageSelectType = Dpi\r\n"
+"Transparent = True\r\n"
+"UniformSizing = True\r\n"
+"ImageFile1 = blue_commandlink_glyph_30px.bmp\r\n"
+"ImageFile2 = blue_commandlink_glyph_45px.bmp\r\n"
+"MinDpi1 = 96\r\n"
+"MinDpi2 = 144\r\n"
}
+/* All following bitmaps are of 32-bit ARGB format */
+
+/* Button */
+/* @makedep: blue_button.bmp */
+BLUE_BUTTON_BMP BITMAP "blue_button.bmp"
+
+/* @makedep: blue_checkbox_13px.bmp */
+BLUE_CHECKBOX_13PX_BMP BITMAP "blue_checkbox_13px.bmp"
+
+/* @makedep: blue_checkbox_16px.bmp */
+BLUE_CHECKBOX_16PX_BMP BITMAP "blue_checkbox_16px.bmp"
+
+/* @makedep: blue_checkbox_25px.bmp */
+BLUE_CHECKBOX_25PX_BMP BITMAP "blue_checkbox_25px.bmp"
+
+/* @makedep: blue_radiobutton_13px.bmp */
+BLUE_RADIOBUTTON_13PX_BMP BITMAP "blue_radiobutton_13px.bmp"
+
+/* @makedep: blue_radiobutton_16px.bmp */
+BLUE_RADIOBUTTON_16PX_BMP BITMAP "blue_radiobutton_16px.bmp"
+
+/* @makedep: blue_radiobutton_25px.bmp */
+BLUE_RADIOBUTTON_25PX_BMP BITMAP "blue_radiobutton_25px.bmp"
+
+/* @makedep: blue_groupbox.bmp */
+BLUE_GROUPBOX_BMP BITMAP "blue_groupbox.bmp"
+
+/* @makedep: blue_commandlink.bmp */
+BLUE_COMMANDLINK_BMP BITMAP "blue_commandlink.bmp"
+
+/* @makedep: blue_commandlink_glyph_30px.bmp */
+BLUE_COMMANDLINK_GLYPH_30PX_BMP BITMAP "blue_commandlink_glyph_30px.bmp"
+
+/* @makedep: blue_commandlink_glyph_45px.bmp */
+BLUE_COMMANDLINK_GLYPH_45PX_BMP BITMAP "blue_commandlink_glyph_45px.bmp"
+
/* File version */
#define WINE_FILEDESCRIPTION_STR "Light Theme"
#define WINE_FILENAME_STR "light.msstyles"
--
2.30.2
2
1
23 Jun '21
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
include/wine/afd.h | 1 +
server/sock.c | 14 ++++++++++++++
2 files changed, 15 insertions(+)
diff --git a/include/wine/afd.h b/include/wine/afd.h
index e497eece0be..4c501872dde 100644
--- a/include/wine/afd.h
+++ b/include/wine/afd.h
@@ -159,6 +159,7 @@ struct afd_get_events_params
#define IOCTL_AFD_WINE_GETPEERNAME CTL_CODE(FILE_DEVICE_NETWORK, 216, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_AFD_WINE_DEFER CTL_CODE(FILE_DEVICE_NETWORK, 217, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_AFD_WINE_GET_INFO CTL_CODE(FILE_DEVICE_NETWORK, 218, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_AFD_WINE_GET_SO_ACCEPTCONN CTL_CODE(FILE_DEVICE_NETWORK, 219, METHOD_BUFFERED, FILE_ANY_ACCESS)
struct afd_create_params
{
diff --git a/server/sock.c b/server/sock.c
index b73fbb98388..71f22845827 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -2532,6 +2532,20 @@ static int sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
return 0;
}
+ case IOCTL_AFD_WINE_GET_SO_ACCEPTCONN:
+ {
+ int listening = (sock->state == SOCK_LISTENING);
+
+ if (get_reply_max_size() < sizeof(listening))
+ {
+ set_error( STATUS_BUFFER_TOO_SMALL );
+ return 0;
+ }
+
+ set_reply_data( &listening, sizeof(listening) );
+ return 1;
+ }
+
default:
set_error( STATUS_NOT_SUPPORTED );
return 0;
--
2.30.2
2
8