Control: tags -1 patch
On Sat, 29 Sep 2018 12:52:24 +0200 Tobias Frost <[email protected]>
wrote:
> Hi,
>
> Looks like #869638 of slic3r-prusa, upstream
> https://github.com/prusa3d/Slic3r/issues/532
>
> However, prusa's version has diverged and changed one file to c++,
> so the patch is unfortunatly not directly applicable and needs
porting.
Attached is my try to patch the issue at hand.
I have no big endian machine at hand, but the package
at builds at least.
Note that I did not have to patch stlint.c -- in contrast to the prusa
version it seems already big endian aware, at least when looking at
the commits for https://github.com/slic3r/Slic3r/pull/4143
Adrian: Do you have a possiblity to test?
Cheers,
--
tobi
Index: slic3r-1.3.0+dfsg1/xs/src/admesh/stl_io.c
===================================================================
--- slic3r-1.3.0+dfsg1.orig/xs/src/admesh/stl_io.c
+++ slic3r-1.3.0+dfsg1/xs/src/admesh/stl_io.c
@@ -193,6 +193,22 @@ stl_print_neighbors(stl_file *stl, ADMES
fclose(fp);
}
+/* Test for a little-endian machine */
+#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
+void stl_internal_reverse_quads(char *buf, size_t cnt)
+{
+ for (size_t i = 0; i < cnt; i += 4) {
+ char tmp;
+ tmp = buf[i];
+ buf[i] = buf[i+3];
+ buf[i+3] = tmp;
+ tmp = buf[i+1];
+ buf[i+1] = buf[i+2];
+ buf[i+2] = tmp;
+ }
+}
+#endif
+
void
stl_write_binary(stl_file *stl, const ADMESH_CHAR *file, const char *label) {
FILE *fp;
@@ -213,9 +229,22 @@ stl_write_binary(stl_file *stl, const AD
for(i = strlen(label); i < LABEL_SIZE; i++) putc(0, fp);
fseek(fp, LABEL_SIZE, SEEK_SET);
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
fwrite(&stl->stats.number_of_facets, 4, 1, fp);
for(i = 0; i < stl->stats.number_of_facets; i++)
fwrite(stl->facet_start + i, SIZEOF_STL_FACET, 1, fp);
+#else
+ char buffer[50];
+ 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
fclose(fp);
}
Index: slic3r-1.3.0+dfsg1/xs/src/admesh/stl.h
===================================================================
--- slic3r-1.3.0+dfsg1.orig/xs/src/admesh/stl.h
+++ slic3r-1.3.0+dfsg1/xs/src/admesh/stl.h
@@ -26,11 +26,6 @@
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
-#include <boost/detail/endian.hpp>
-
-#ifndef BOOST_LITTLE_ENDIAN
-#error "admesh works correctly on little endian machines only!"
-#endif
#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
#include "windows.h"