From 7ecc9951a94e590e26411104b78caf1729db9584 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 17 Sep 2012 05:31:41 +0000 Subject: add endian switching to mask shape key loading (loading mask animations between big/little endian systems would break), also set attributes to BLI_endian_switch_* functions. --- source/blender/blenlib/BLI_endian_switch.h | 38 ++++++++++++++++++++++------- source/blender/blenloader/intern/readfile.c | 8 ++++++ 2 files changed, 37 insertions(+), 9 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/BLI_endian_switch.h b/source/blender/blenlib/BLI_endian_switch.h index 7017e7ba789..9be69c5b0c0 100644 --- a/source/blender/blenlib/BLI_endian_switch.h +++ b/source/blender/blenlib/BLI_endian_switch.h @@ -27,16 +27,36 @@ * \ingroup bli */ -#include "BLI_endian_switch_inline.h" +#ifdef __GNUC__ +# define ATTR_ENDIAN_SWITCH \ + __attribute__((nonnull(1))) \ + __attribute__((pure)) +#else +# define ATTR_NONULL +#endif + +/* BLI_endian_switch_inline.h */ +BLI_INLINE void BLI_endian_switch_int16(short *val) ATTR_ENDIAN_SWITCH; +BLI_INLINE void BLI_endian_switch_uint16(unsigned short *val) ATTR_ENDIAN_SWITCH; +BLI_INLINE void BLI_endian_switch_int32(int *val) ATTR_ENDIAN_SWITCH; +BLI_INLINE void BLI_endian_switch_uint32(unsigned int *val) ATTR_ENDIAN_SWITCH; +BLI_INLINE void BLI_endian_switch_float(float *val) ATTR_ENDIAN_SWITCH; +BLI_INLINE void BLI_endian_switch_int64(int64_t *val) ATTR_ENDIAN_SWITCH; +BLI_INLINE void BLI_endian_switch_uint64(uint64_t *val) ATTR_ENDIAN_SWITCH; +BLI_INLINE void BLI_endian_switch_double(double *val) ATTR_ENDIAN_SWITCH; /* endian_switch.c */ -void BLI_endian_switch_int16_array(short *val, const int size); -void BLI_endian_switch_uint16_array(unsigned short *val, const int size); -void BLI_endian_switch_int32_array(int *val, const int size); -void BLI_endian_switch_uint32_array(unsigned int *val, const int size); -void BLI_endian_switch_float_array(float *val, const int size); -void BLI_endian_switch_int64_array(int64_t *val, const int size); -void BLI_endian_switch_uint64_array(uint64_t *val, const int size); -void BLI_endian_switch_double_array(double *val, const int size); +void BLI_endian_switch_int16_array(short *val, const int size) ATTR_ENDIAN_SWITCH; +void BLI_endian_switch_uint16_array(unsigned short *val, const int size) ATTR_ENDIAN_SWITCH; +void BLI_endian_switch_int32_array(int *val, const int size) ATTR_ENDIAN_SWITCH; +void BLI_endian_switch_uint32_array(unsigned int *val, const int size) ATTR_ENDIAN_SWITCH; +void BLI_endian_switch_float_array(float *val, const int size) ATTR_ENDIAN_SWITCH; +void BLI_endian_switch_int64_array(int64_t *val, const int size) ATTR_ENDIAN_SWITCH; +void BLI_endian_switch_uint64_array(uint64_t *val, const int size) ATTR_ENDIAN_SWITCH; +void BLI_endian_switch_double_array(double *val, const int size) ATTR_ENDIAN_SWITCH; + +#include "BLI_endian_switch_inline.h" + +#undef ATTR_ENDIAN_SWITCH #endif /* __BLI_ENDIAN_SWITCH_H__ */ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 9eaed7cd20e..9d39e751382 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -6289,6 +6289,14 @@ static void direct_link_mask(FileData *fd, Mask *mask) for (masklay_shape = masklay->splines_shapes.first; masklay_shape; masklay_shape = masklay_shape->next) { masklay_shape->data = newdataadr(fd, masklay_shape->data); + + if (masklay_shape->tot_vert) { + if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) { + BLI_endian_switch_float_array(masklay_shape->data, + masklay_shape->tot_vert * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE); + + } + } } masklay->act_spline = newdataadr(fd, masklay->act_spline); -- cgit v1.2.3