libstl: use field instead of function pointer where possible

This commit is contained in:
Hugues Delorme 2014-01-22 19:17:19 +01:00
parent 6f7d8c4121
commit 5720614cdc
8 changed files with 36 additions and 41 deletions

View File

@ -429,7 +429,7 @@ static void parse_xyz_coords(foug_stla_parse_data_t* data, foug_stl_coords_t* co
} /* end switch */ } /* end switch */
} }
static void parse_facets(foug_stla_parse_data_t* data) static void parse_facets(foug_stla_parse_data_t* data, size_t i_facet_offset)
{ {
if (!parsing_can_continue(data)) if (!parsing_can_continue(data))
return; return;
@ -458,12 +458,13 @@ static void parse_facets(foug_stla_parse_data_t* data)
parsing_eat_token(ENDFACET_token, data); parsing_eat_token(ENDFACET_token, data);
if (parsing_can_continue(data) if (parsing_can_continue(data)
&& data->geom != NULL && data->geom->process_next_triangle_func != NULL) && data->geom != NULL
&& data->geom->process_triangle_func != NULL)
{ {
data->geom->process_next_triangle_func(data->geom, &facet); data->geom->process_triangle_func(data->geom, &facet, i_facet_offset);
} }
parse_facets(data); parse_facets(data, i_facet_offset + 1);
break; break;
} }
default: default:
@ -479,7 +480,7 @@ static void parse_solid(foug_stla_parse_data_t* data)
switch (data->token) { switch (data->token) {
case SOLID_token: case SOLID_token:
parse_beginsolid(data); parse_beginsolid(data);
parse_facets(data); parse_facets(data, 0);
parse_endsolid(data); parse_endsolid(data);
break; break;
default: default:

View File

@ -11,7 +11,7 @@ struct foug_stla_geom_input
{ {
void* cookie; void* cookie;
void (*begin_solid_func) (foug_stla_geom_input_t*, const char*); /* Optional */ void (*begin_solid_func) (foug_stla_geom_input_t*, const char*); /* Optional */
void (*process_next_triangle_func)(foug_stla_geom_input_t*, const foug_stl_triangle_t*); void (*process_triangle_func)(foug_stla_geom_input_t*, const foug_stl_triangle_t*, uint32_t);
void (*end_solid_func) (foug_stla_geom_input_t*, const char*); /* Optional */ void (*end_solid_func) (foug_stla_geom_input_t*, const char*); /* Optional */
}; };

View File

@ -109,7 +109,7 @@ int foug_stla_write(foug_stla_geom_output_t* geom,
foug_transfer_t* trsf, foug_transfer_t* trsf,
uint8_t real32_prec) uint8_t real32_prec)
{ {
size_t solid_count = 0; const size_t solid_count = geom != NULL ? geom->solid_count : 0;
size_t total_facet_count = 0; size_t total_facet_count = 0;
size_t written_facet_count = 0; size_t written_facet_count = 0;
size_t isolid = 0; size_t isolid = 0;
@ -139,12 +139,6 @@ int foug_stla_write(foug_stla_geom_output_t* geom,
/* TODO: check the "format" string can contain the given precision */ /* TODO: check the "format" string can contain the given precision */
} }
/* Get solid count */
if (geom->get_solid_count_func != NULL)
solid_count = geom->get_solid_count_func(geom);
else
solid_count = 1;
/* Compute total facet count */ /* Compute total facet count */
if (trsf->task_control.handle_progress_func != NULL) { if (trsf->task_control.handle_progress_func != NULL) {
for (isolid = 0; isolid < solid_count; ++isolid) for (isolid = 0; isolid < solid_count; ++isolid)

View File

@ -11,10 +11,10 @@ struct foug_stla_geom_output
{ {
void* cookie; void* cookie;
size_t (*get_solid_count_func) (foug_stla_geom_output_t*); /* Optional (if NULL solid_count == 1) */ size_t solid_count;
void (*get_solid_name) (foug_stla_geom_output_t*, size_t, char*); /* Optional */ void (*get_solid_name) (const foug_stla_geom_output_t*, size_t, char*); /* Optional */
size_t (*get_triangle_count_func)(foug_stla_geom_output_t*, size_t); size_t (*get_triangle_count_func)(const foug_stla_geom_output_t*, size_t);
void (*get_triangle_func) (foug_stla_geom_output_t*, size_t, size_t, foug_stl_triangle_t*); void (*get_triangle_func) (const foug_stla_geom_output_t*, size_t, size_t, foug_stl_triangle_t*);
}; };
/* Write geometry in the STL ascii format */ /* Write geometry in the STL ascii format */

View File

@ -28,13 +28,14 @@ static void read_triangle_alignsafe(const uint8_t* buffer, foug_stlb_triangle_t*
static void foug_stlb_read_facets(foug_stlb_geom_input_t* geom, static void foug_stlb_read_facets(foug_stlb_geom_input_t* geom,
uint8_t* buffer, uint8_t* buffer,
uint32_t facet_count) uint32_t facet_count,
uint32_t i_facet_offset)
{ {
foug_stlb_triangle_t triangle; foug_stlb_triangle_t triangle;
uint32_t buffer_offset; uint32_t buffer_offset;
uint32_t i_facet; uint32_t i_facet;
if (geom == NULL || geom->process_next_triangle_func == NULL) if (geom == NULL || geom->process_triangle_func == NULL)
return; return;
buffer_offset = 0; buffer_offset = 0;
@ -48,7 +49,7 @@ static void foug_stlb_read_facets(foug_stlb_geom_input_t* geom,
buffer_offset += FOUG_STLB_TRIANGLE_RAWSIZE; buffer_offset += FOUG_STLB_TRIANGLE_RAWSIZE;
/* Declare triangle */ /* Declare triangle */
geom->process_next_triangle_func(geom, &triangle); geom->process_triangle_func(geom, &triangle, i_facet_offset + i_facet);
} }
} }
@ -105,7 +106,7 @@ int foug_stlb_read(foug_stlb_geom_input_t* geom,
if (foug_datax_no_error(error)) { if (foug_datax_no_error(error)) {
uint8_t progress_pc; uint8_t progress_pc;
foug_stlb_read_facets(geom, trsf->buffer, facet_count_read); foug_stlb_read_facets(geom, trsf->buffer, facet_count_read, accum_facet_count_read);
accum_facet_count_read += facet_count_read; accum_facet_count_read += facet_count_read;
progress_pc = foug_percentage(0, total_facet_count, accum_facet_count_read); progress_pc = foug_percentage(0, total_facet_count, accum_facet_count_read);
if (!foug_task_control_handle_progress(&trsf->task_control, progress_pc)) if (!foug_task_control_handle_progress(&trsf->task_control, progress_pc))

View File

@ -13,7 +13,7 @@ struct foug_stlb_geom_input
void* cookie; void* cookie;
void (*process_header_func) (foug_stlb_geom_input_t*, const uint8_t*); /* Optional */ void (*process_header_func) (foug_stlb_geom_input_t*, const uint8_t*); /* Optional */
void (*begin_triangles_func) (foug_stlb_geom_input_t*, uint32_t); /* Optional */ void (*begin_triangles_func) (foug_stlb_geom_input_t*, uint32_t); /* Optional */
void (*process_next_triangle_func)(foug_stlb_geom_input_t*, const foug_stlb_triangle_t*); void (*process_triangle_func)(foug_stlb_geom_input_t*, const foug_stlb_triangle_t*, uint32_t);
void (*end_triangles_func) (foug_stlb_geom_input_t*); /* Optional */ void (*end_triangles_func) (foug_stlb_geom_input_t*); /* Optional */
}; };

View File

@ -53,7 +53,7 @@ int foug_stlb_write(const foug_stlb_geom_output_t* geom,
foug_transfer_t* trsf, foug_transfer_t* trsf,
foug_endianness_t byte_order) foug_endianness_t byte_order)
{ {
uint32_t facet_count; const uint32_t facet_count = geom != NULL ? geom->triangle_count : 0;
uint32_t i_facet; uint32_t i_facet;
uint32_t buffer_facet_count; uint32_t buffer_facet_count;
uint32_t ifacet_start; uint32_t ifacet_start;
@ -63,8 +63,6 @@ int foug_stlb_write(const foug_stlb_geom_output_t* geom,
return FOUG_DATAX_NULL_BUFFER_ERROR; return FOUG_DATAX_NULL_BUFFER_ERROR;
if (trsf->buffer_size < FOUG_STLB_MIN_CONTENTS_SIZE) if (trsf->buffer_size < FOUG_STLB_MIN_CONTENTS_SIZE)
return FOUG_DATAX_INVALID_BUFFER_SIZE_ERROR; return FOUG_DATAX_INVALID_BUFFER_SIZE_ERROR;
if (geom == NULL || geom->get_triangle_count_func == NULL)
return FOUG_STLB_WRITE_NULL_GET_TRIANGLE_COUNT_FUNC;
if (geom == NULL || geom->get_triangle_func == NULL) if (geom == NULL || geom->get_triangle_func == NULL)
return FOUG_STLB_WRITE_NULL_GET_TRIANGLE_FUNC; return FOUG_STLB_WRITE_NULL_GET_TRIANGLE_FUNC;
if (byte_order != FOUG_LITTLE_ENDIAN/* && byte_order != FOUG_BIG_ENDIAN*/) if (byte_order != FOUG_LITTLE_ENDIAN/* && byte_order != FOUG_BIG_ENDIAN*/)
@ -72,18 +70,20 @@ int foug_stlb_write(const foug_stlb_geom_output_t* geom,
/* Write header */ /* Write header */
{ {
uint8_t header_data[FOUG_STLB_HEADER_SIZE]; const uint8_t* header_data = NULL;
if (geom->get_header_func != NULL) if (geom->header != NULL) {
geom->get_header_func(geom, header_data); header_data = geom->header;
else }
memset(header_data, 0, FOUG_STLB_HEADER_SIZE); else {
/* Use buffer to store an empty header (filled with zeroes) */
memset(trsf->buffer, 0, FOUG_STLB_HEADER_SIZE);
header_data = (const uint8_t*)trsf->buffer;
}
if (foug_stream_write(&trsf->stream, header_data, FOUG_STLB_HEADER_SIZE, 1) != 1) if (foug_stream_write(&trsf->stream, header_data, FOUG_STLB_HEADER_SIZE, 1) != 1)
return FOUG_DATAX_STREAM_ERROR; return FOUG_DATAX_STREAM_ERROR;
} }
/* Write facet count */ /* Write facet count */
facet_count = geom->get_triangle_count_func(geom);
if (byte_order == FOUG_LITTLE_ENDIAN) if (byte_order == FOUG_LITTLE_ENDIAN)
foug_encode_uint32_le(facet_count, trsf->buffer); foug_encode_uint32_le(facet_count, trsf->buffer);
else else

View File

@ -11,8 +11,8 @@ typedef struct foug_stlb_geom_output foug_stlb_geom_output_t;
struct foug_stlb_geom_output struct foug_stlb_geom_output
{ {
void* cookie; void* cookie;
void (*get_header_func) (const foug_stlb_geom_output_t*, uint8_t*); /* Optional */ uint8_t* header; /* May be NULL if empty header*/
uint32_t (*get_triangle_count_func)(const foug_stlb_geom_output_t*); uint32_t triangle_count;
void (*get_triangle_func)(const foug_stlb_geom_output_t*, uint32_t, foug_stlb_triangle_t*); void (*get_triangle_func)(const foug_stlb_geom_output_t*, uint32_t, foug_stlb_triangle_t*);
}; };
@ -22,8 +22,7 @@ FOUG_DATAX_LIBSTL_EXPORT int foug_stlb_write(const foug_stlb_geom_output_t* geom
foug_endianness_t byte_order); foug_endianness_t byte_order);
/* Specific error codes returned by foug_stlb_write() */ /* Specific error codes returned by foug_stlb_write() */
#define FOUG_STLB_WRITE_NULL_GET_TRIANGLE_COUNT_FUNC 1 #define FOUG_STLB_WRITE_NULL_GET_TRIANGLE_FUNC 1
#define FOUG_STLB_WRITE_NULL_GET_TRIANGLE_FUNC 2 #define FOUG_STLB_WRITE_UNSUPPORTED_BYTE_ORDER 2
#define FOUG_STLB_WRITE_UNSUPPORTED_BYTE_ORDER 3
#endif /* FOUG_DATAX_C_LIBSTL_STLB_WRITE_H */ #endif /* FOUG_DATAX_C_LIBSTL_STLB_WRITE_H */