Big endian fix, thanks to @hyperair for hints and initial implementation.
This commit is contained in:
parent
84d4bf8fdb
commit
a52a04550e
@ -26,11 +26,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <boost/detail/endian.hpp>
|
|
||||||
|
|
||||||
#ifndef BOOST_LITTLE_ENDIAN
|
|
||||||
#error "admesh works correctly on little endian machines only!"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define STL_MAX(A,B) ((A)>(B)? (A):(B))
|
#define STL_MAX(A,B) ((A)>(B)? (A):(B))
|
||||||
#define STL_MIN(A,B) ((A)<(B)? (A):(B))
|
#define STL_MIN(A,B) ((A)<(B)? (A):(B))
|
||||||
@ -112,7 +107,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
char header[81];
|
char header[81];
|
||||||
stl_type type;
|
stl_type type;
|
||||||
int number_of_facets;
|
uint32_t number_of_facets;
|
||||||
stl_vertex max;
|
stl_vertex max;
|
||||||
stl_vertex min;
|
stl_vertex min;
|
||||||
stl_vertex size;
|
stl_vertex size;
|
||||||
|
@ -23,9 +23,9 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "stl.h"
|
#include "stl.h"
|
||||||
//#include "config.h"
|
|
||||||
|
|
||||||
#include <boost/nowide/cstdio.hpp>
|
#include <boost/nowide/cstdio.hpp>
|
||||||
|
#include <boost/detail/endian.hpp>
|
||||||
|
|
||||||
#if !defined(SEEK_SET)
|
#if !defined(SEEK_SET)
|
||||||
#define SEEK_SET 0
|
#define SEEK_SET 0
|
||||||
@ -204,6 +204,17 @@ stl_print_neighbors(stl_file *stl, char *file) {
|
|||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef BOOST_LITTLE_ENDIAN
|
||||||
|
// Swap a buffer of 32bit data from little endian to big endian and vice versa.
|
||||||
|
void stl_internal_reverse_quads(char *buf, size_t cnt)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < cnt; i += 4) {
|
||||||
|
std::swap(buf[i], buf[i+3]);
|
||||||
|
std::swap(buf[i+1], buf[i+2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
stl_write_binary(stl_file *stl, const char *file, const char *label) {
|
stl_write_binary(stl_file *stl, const char *file, const char *label) {
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
@ -229,9 +240,23 @@ stl_write_binary(stl_file *stl, const char *file, const char *label) {
|
|||||||
for(i = strlen(label); i < LABEL_SIZE; i++) putc(0, fp);
|
for(i = strlen(label); i < LABEL_SIZE; i++) putc(0, fp);
|
||||||
|
|
||||||
fseek(fp, LABEL_SIZE, SEEK_SET);
|
fseek(fp, LABEL_SIZE, SEEK_SET);
|
||||||
|
#ifdef BOOST_LITTLE_ENDIAN
|
||||||
fwrite(&stl->stats.number_of_facets, 4, 1, fp);
|
fwrite(&stl->stats.number_of_facets, 4, 1, fp);
|
||||||
for(i = 0; i < stl->stats.number_of_facets; i++)
|
for (i = 0; i < stl->stats.number_of_facets; ++ i)
|
||||||
fwrite(stl->facet_start + i, SIZEOF_STL_FACET, 1, fp);
|
fwrite(stl->facet_start + i, SIZEOF_STL_FACET, 1, fp);
|
||||||
|
#else /* BOOST_LITTLE_ENDIAN */
|
||||||
|
char buffer[50];
|
||||||
|
// Convert the number of facets to little endian.
|
||||||
|
memcpy(buffer, &stl->stats.number_of_facets, 4);
|
||||||
|
stl_internal_reverse_quads(buffer, 4);
|
||||||
|
fwrite(buffer, 4, 1, fp);
|
||||||
|
for (i = 0; i < stl->stats.number_of_facets; ++ i) {
|
||||||
|
memcpy(buffer, stl->facet_start + i, 50);
|
||||||
|
// Convert to little endian.
|
||||||
|
stl_internal_reverse_quads(buffer, 48);
|
||||||
|
fwrite(buffer, SIZEOF_STL_FACET, 1, fp);
|
||||||
|
}
|
||||||
|
#endif /* BOOST_LITTLE_ENDIAN */
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include <boost/nowide/cstdio.hpp>
|
#include <boost/nowide/cstdio.hpp>
|
||||||
|
#include <boost/detail/endian.hpp>
|
||||||
|
|
||||||
#include "stl.h"
|
#include "stl.h"
|
||||||
|
|
||||||
@ -50,11 +51,15 @@ stl_initialize(stl_file *stl) {
|
|||||||
stl->stats.volume = -1.0;
|
stl->stats.volume = -1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef BOOST_LITTLE_ENDIAN
|
||||||
|
extern void stl_internal_reverse_quads(char *buf, size_t cnt);
|
||||||
|
#endif /* BOOST_LITTLE_ENDIAN */
|
||||||
|
|
||||||
void
|
void
|
||||||
stl_count_facets(stl_file *stl, const char *file) {
|
stl_count_facets(stl_file *stl, const char *file) {
|
||||||
long file_size;
|
long file_size;
|
||||||
int header_num_facets;
|
int header_num_facets;
|
||||||
int num_facets;
|
uint32_t num_facets;
|
||||||
int i;
|
int i;
|
||||||
size_t s;
|
size_t s;
|
||||||
unsigned char chtest[128];
|
unsigned char chtest[128];
|
||||||
@ -113,7 +118,12 @@ stl_count_facets(stl_file *stl, const char *file) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Read the int following the header. This should contain # of facets */
|
/* Read the int following the header. This should contain # of facets */
|
||||||
if((!fread(&header_num_facets, sizeof(int), 1, stl->fp)) || (num_facets != header_num_facets)) {
|
bool header_num_faces_read = fread(&header_num_facets, sizeof(uint32_t), 1, stl->fp);
|
||||||
|
#ifndef BOOST_LITTLE_ENDIAN
|
||||||
|
// Convert from little endian to big endian.
|
||||||
|
stl_internal_reverse_quads((char*)&header_num_facets, 4);
|
||||||
|
#endif /* BOOST_LITTLE_ENDIAN */
|
||||||
|
if (! header_num_faces_read || num_facets != header_num_facets) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Warning: File size doesn't match number of facets in the header\n");
|
"Warning: File size doesn't match number of facets in the header\n");
|
||||||
}
|
}
|
||||||
@ -268,6 +278,10 @@ stl_read(stl_file *stl, int first_facet, int first) {
|
|||||||
stl->error = 1;
|
stl->error = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#ifndef BOOST_LITTLE_ENDIAN
|
||||||
|
// Convert the loaded little endian data to big endian.
|
||||||
|
stl_internal_reverse_quads((char*)&facet, 48);
|
||||||
|
#endif /* BOOST_LITTLE_ENDIAN */
|
||||||
} else
|
} else
|
||||||
/* Read a single facet from an ASCII .STL file */
|
/* Read a single facet from an ASCII .STL file */
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user