[PATCH 5/7] hidparse.sys: Introduce new add_new_value_caps helper.
Rémi Bernon
rbernon at codeweavers.com
Wed Sep 22 03:08:33 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/hidparse.sys/main.c | 46 ++++++++++++++++++++++++----------------
1 file changed, 28 insertions(+), 18 deletions(-)
diff --git a/dlls/hidparse.sys/main.c b/dlls/hidparse.sys/main.c
index 19c756d9002..ca102765f93 100644
--- a/dlls/hidparse.sys/main.c
+++ b/dlls/hidparse.sys/main.c
@@ -328,14 +328,29 @@ static BOOL parse_end_collection( struct hid_parser_state *state )
return TRUE;
}
+static void add_new_value_caps( struct hid_parser_state *state, struct hid_value_caps *values,
+ LONG i, ULONG start_bit )
+{
+ DWORD count, usages_size = max( 1, state->usages_size );
+
+ state->items.start_byte = start_bit / 8;
+ state->items.start_bit = start_bit % 8;
+ state->items.usage_page = state->usages_page[usages_size - 1 - i];
+ state->items.usage_min = state->usages_min[usages_size - 1 - i];
+ state->items.usage_max = state->usages_max[usages_size - 1 - i];
+ if (!state->items.usage_max && !state->items.usage_min) count = -1;
+ else count = state->items.usage_max - state->items.usage_min;
+ state->items.data_index_min = state->items.data_index_max + 1;
+ state->items.data_index_max = state->items.data_index_min + count;
+ values[i] = state->items;
+}
+
static BOOL parse_new_value_caps( struct hid_parser_state *state, HIDP_REPORT_TYPE type )
{
- struct hid_value_caps *value;
+ struct hid_value_caps *values;
USAGE usage_page = state->items.usage_page;
- DWORD usages_size = max( 1, state->usages_size );
+ DWORD i, usages_size = max( 1, state->usages_size );
USHORT *byte_length = &state->byte_length[type];
- USHORT *caps_count = &state->caps_count[type];
- USHORT *data_count = &state->data_count[type];
ULONG start_bit, *bit_size = &state->bit_size[type][state->items.report_id];
BOOL is_array;
@@ -350,12 +365,13 @@ static BOOL parse_new_value_caps( struct hid_parser_state *state, HIDP_REPORT_TY
return TRUE;
}
- if (!array_reserve( &state->values[type], &state->values_size[type], *caps_count + usages_size ))
+ if (!array_reserve( &state->values[type], &state->values_size[type],
+ state->caps_count[type] + usages_size ))
{
ERR( "HID parser values overflow!\n" );
return FALSE;
}
- value = state->values[type] + *caps_count;
+ values = state->values[type] + state->caps_count[type];
if (!(is_array = HID_VALUE_CAPS_IS_ARRAY( &state->items ))) state->items.report_count -= usages_size - 1;
else start_bit -= state->items.report_count * state->items.bit_size;
@@ -364,23 +380,17 @@ static BOOL parse_new_value_caps( struct hid_parser_state *state, HIDP_REPORT_TY
if (state->items.bit_field & INPUT_DATA_CONST) state->items.flags |= HID_VALUE_CAPS_IS_CONSTANT;
if (state->items.bit_size == 1 || is_array) state->items.flags |= HID_VALUE_CAPS_IS_BUTTON;
- while (usages_size--)
+ state->items.data_index_max = state->data_count[type] - 1;
+ for (i = 0; i < usages_size; ++i)
{
if (!is_array) start_bit -= state->items.report_count * state->items.bit_size;
- else if (usages_size) state->items.flags |= HID_VALUE_CAPS_ARRAY_HAS_MORE;
+ else if (i < usages_size - 1) state->items.flags |= HID_VALUE_CAPS_ARRAY_HAS_MORE;
else state->items.flags &= ~HID_VALUE_CAPS_ARRAY_HAS_MORE;
- state->items.start_byte = start_bit / 8;
- state->items.start_bit = start_bit % 8;
- state->items.usage_page = state->usages_page[usages_size];
- state->items.usage_min = state->usages_min[usages_size];
- state->items.usage_max = state->usages_max[usages_size];
- state->items.data_index_min = *data_count;
- state->items.data_index_max = *data_count + state->items.usage_max - state->items.usage_min;
- if (state->items.usage_max || state->items.usage_min) *data_count = state->items.data_index_max + 1;
- *value++ = state->items;
- *caps_count += 1;
+ add_new_value_caps( state, values, i, start_bit );
if (!is_array) state->items.report_count = 1;
}
+ state->caps_count[type] += usages_size;
+ state->data_count[type] = state->items.data_index_max + 1;
state->items.usage_page = usage_page;
reset_local_items( state );
--
2.33.0
More information about the wine-devel
mailing list