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.
This commit is contained in:
@@ -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__ */
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user