hidparse.sys: Introduce new add_new_value_caps helper.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Rémi Bernon 2021-09-22 10:08:33 +02:00 committed by Alexandre Julliard
parent e1e82148f8
commit d6c47adc32
1 changed files with 28 additions and 18 deletions

View File

@ -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 );