diff --git a/backend/genesys_low.c b/backend/genesys_low.c index 37112fb8d..a8ba89621 100644 --- a/backend/genesys_low.c +++ b/backend/genesys_low.c @@ -45,6 +45,7 @@ #define BACKEND_NAME genesys_low #include "genesys_low.h" +#include "assert.h" /* ------------------------------------------------------------------------ */ /* functions calling ASIC specific functions */ @@ -1939,4 +1940,99 @@ sanei_genesys_load_lut (unsigned char * lut, return ret; } -/* vim: set sw=2 cino=>2se-1sn-1s{s^-1st0(0u0 smarttab expandtab: */ +Genesys_Vector sanei_gl_vector_create(size_t element_size) +{ + Genesys_Vector ret; + ret.data = NULL; + ret.size = 0; + ret.capacity = 0; + ret.element_size = element_size; + return ret; +} + +void sanei_gl_vector_reserve(Genesys_Vector* v, size_t count) +{ + if (count <= v->capacity) + return; + + char* new_data = malloc(count * v->element_size); + if (v->data != NULL) + { + memcpy(new_data, v->data, v->size * v->element_size); + free(v->data); + } + v->data = new_data; + v->capacity = count; +} + +static void sanei_gl_vector_grow(Genesys_Vector* v, size_t min_size) +{ + size_t new_capacity = v->capacity * 2; + + if (new_capacity < 16) + new_capacity = 16; + + if (new_capacity < min_size) + new_capacity = min_size; + + sanei_gl_vector_reserve(v, new_capacity); +} + +static void* sanei_gl_vector_get_element_nocheck(Genesys_Vector* v, size_t i) +{ + return v->data + v->element_size * i; +} + +void sanei_gl_vector_resize(Genesys_Vector* v, size_t count) +{ + if (count <= v->size) + { + v->size = count; + return; + } + + if (count > v->capacity) + sanei_gl_vector_reserve(v, count); + + memset(sanei_gl_vector_get_element(v, v->size), 0, (count - v->size) * v->element_size); + v->size = count; +} + +void sanei_gl_vector_append(Genesys_Vector* v, void* data, size_t count) +{ + if (v->size + count > v->capacity) + sanei_gl_vector_grow(v, count); + + memcpy(sanei_gl_vector_get_element_nocheck(v, v->size), data, count * v->element_size); + v->size = v->size + count; +} + +void sanei_gl_vector_append_zero(Genesys_Vector* v, size_t count) +{ + if (v->size + count > v->capacity) + sanei_gl_vector_grow(v, count); + + memset(sanei_gl_vector_get_element_nocheck(v, v->size), 0, count * v->element_size); + v->size = v->size + count; +} + +void* sanei_gl_vector_get_element(Genesys_Vector* v, size_t i) +{ + assert(v->data != NULL); + assert(i < v->size); + return sanei_gl_vector_get_element_nocheck(v, i); +} + +void sanei_gl_vector_set_element(Genesys_Vector* v, void* data, size_t i) +{ + memcpy(sanei_gl_vector_get_element(v, i), data, v->element_size); +} + +void sanei_gl_vector_destroy(Genesys_Vector* v) +{ + if (v->data != NULL) + free(v->data); + v->size = 0; + v->capacity = 0; + v->element_size = 0; +} diff --git a/backend/genesys_low.h b/backend/genesys_low.h index 8da5d5f22..cafc9942a 100644 --- a/backend/genesys_low.h +++ b/backend/genesys_low.h @@ -1241,4 +1241,27 @@ extern SANE_Status sanei_gl846_init_cmd_set (Genesys_Device * dev); extern SANE_Status sanei_gl847_init_cmd_set (Genesys_Device * dev); extern SANE_Status sanei_gl124_init_cmd_set (Genesys_Device * dev); +// same as usleep, except that it does nothing if testing mode is enabled +extern void sanei_genesys_usleep(unsigned int useconds); + +// same as sanei_genesys_usleep just that the duration is in milliseconds +extern void sanei_genesys_sleep_ms(unsigned int milliseconds); + +typedef struct Genesys_Vector +{ + char* data; + size_t capacity; // capacity in elements + size_t size; // size in elements + size_t element_size; +} Genesys_Vector; + +extern Genesys_Vector sanei_gl_vector_create(size_t element_size); +extern void sanei_gl_vector_reserve(Genesys_Vector* v, size_t count); +extern void sanei_gl_vector_resize(Genesys_Vector* v, size_t count); +extern void sanei_gl_vector_append(Genesys_Vector* v, void* data, size_t count); +extern void sanei_gl_vector_append_zero(Genesys_Vector* v, size_t count); +extern void* sanei_gl_vector_get_element(Genesys_Vector* v, size_t i); +extern void sanei_gl_vector_set_element(Genesys_Vector* v, void* data, size_t i); +extern void sanei_gl_vector_destroy(Genesys_Vector* v); + #endif /* not GENESYS_LOW_H */