array functions for endian switching.
This commit is contained in:
@@ -318,20 +318,13 @@ int cdf_read_layer(CDataFile *cdf, CDataFileLayer *blay)
|
|||||||
|
|
||||||
int cdf_read_data(CDataFile *cdf, unsigned int size, void *data)
|
int cdf_read_data(CDataFile *cdf, unsigned int size, void *data)
|
||||||
{
|
{
|
||||||
float *fdata;
|
|
||||||
unsigned int a;
|
|
||||||
|
|
||||||
/* read data */
|
/* read data */
|
||||||
if (!fread(data, size, 1, cdf->readf))
|
if (!fread(data, size, 1, cdf->readf))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* switch endian if necessary */
|
/* switch endian if necessary */
|
||||||
if (cdf->switchendian) {
|
if (cdf->switchendian) {
|
||||||
fdata = data;
|
BLI_endian_switch_float_array(data, size / sizeof(float));
|
||||||
|
|
||||||
for (a = 0; a < size / sizeof(float); a++) {
|
|
||||||
BLI_endian_switch_float(&fdata[a]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@@ -29,5 +29,14 @@
|
|||||||
|
|
||||||
#include "BLI_endian_switch_inline.h"
|
#include "BLI_endian_switch_inline.h"
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
|
||||||
#endif /* __BLI_ENDIAN_SWITCH_H__ */
|
#endif /* __BLI_ENDIAN_SWITCH_H__ */
|
||||||
|
@@ -23,3 +23,96 @@
|
|||||||
/** \file blender/blenlib/intern/endian_switch.c
|
/** \file blender/blenlib/intern/endian_switch.c
|
||||||
* \ingroup bli
|
* \ingroup bli
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "BLO_sys_types.h"
|
||||||
|
#include "BLI_utildefines.h"
|
||||||
|
#include "BLI_endian_switch.h"
|
||||||
|
|
||||||
|
void BLI_endian_switch_int16_array(short *val, const int size)
|
||||||
|
{
|
||||||
|
if (size > 0) {
|
||||||
|
int i = size;
|
||||||
|
val = val + (size - 1);
|
||||||
|
while (i--) {
|
||||||
|
BLI_endian_switch_int16(val--);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BLI_endian_switch_uint16_array(unsigned short *val, const int size)
|
||||||
|
{
|
||||||
|
if (size > 0) {
|
||||||
|
int i = size;
|
||||||
|
val = val + (size - 1);
|
||||||
|
while (i--) {
|
||||||
|
BLI_endian_switch_uint16(val--);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BLI_endian_switch_int32_array(int *val, const int size)
|
||||||
|
{
|
||||||
|
if (size > 0) {
|
||||||
|
int i = size;
|
||||||
|
val = val + (size - 1);
|
||||||
|
while (i--) {
|
||||||
|
BLI_endian_switch_int32(val--);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BLI_endian_switch_uint32_array(unsigned int *val, const int size)
|
||||||
|
{
|
||||||
|
if (size > 0) {
|
||||||
|
int i = size;
|
||||||
|
val = val + (size - 1);
|
||||||
|
while (i--) {
|
||||||
|
BLI_endian_switch_uint32(val--);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BLI_endian_switch_float_array(float *val, const int size)
|
||||||
|
{
|
||||||
|
if (size > 0) {
|
||||||
|
int i = size;
|
||||||
|
val = val + (size - 1);
|
||||||
|
while (i--) {
|
||||||
|
BLI_endian_switch_float(val--);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BLI_endian_switch_int64_array(int64_t *val, const int size)
|
||||||
|
{
|
||||||
|
if (size > 0) {
|
||||||
|
int i = size;
|
||||||
|
val = val + (size - 1);
|
||||||
|
while (i--) {
|
||||||
|
BLI_endian_switch_int64(val--);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BLI_endian_switch_uint64_array(uint64_t *val, const int size)
|
||||||
|
{
|
||||||
|
if (size > 0) {
|
||||||
|
int i = size;
|
||||||
|
val = val + (size - 1);
|
||||||
|
while (i--) {
|
||||||
|
BLI_endian_switch_uint64(val--);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BLI_endian_switch_double_array(double *val, const int size)
|
||||||
|
{
|
||||||
|
if (size > 0) {
|
||||||
|
int i = size;
|
||||||
|
val = val + (size - 1);
|
||||||
|
while (i--) {
|
||||||
|
BLI_endian_switch_double(val--);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1554,16 +1554,13 @@ static void IDP_DirectLinkArray(IDProperty *prop, int switch_endian, FileData *f
|
|||||||
}
|
}
|
||||||
else if (prop->subtype == IDP_DOUBLE) {
|
else if (prop->subtype == IDP_DOUBLE) {
|
||||||
if (switch_endian) {
|
if (switch_endian) {
|
||||||
for (i = 0; i < prop->len; i++) {
|
BLI_endian_switch_double_array(prop->data.pointer, prop->len);
|
||||||
BLI_endian_switch_double(&((double *)prop->data.pointer)[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (switch_endian) {
|
if (switch_endian) {
|
||||||
for (i = 0; i < prop->len; i++) {
|
/* also used for floats */
|
||||||
BLI_endian_switch_int32(&((int *)prop->data.pointer)[i]);
|
BLI_endian_switch_int32_array(prop->data.pointer, prop->len);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1858,9 +1855,7 @@ static void direct_link_fmodifiers(FileData *fd, ListBase *list)
|
|||||||
data->coefficients = newdataadr(fd, data->coefficients);
|
data->coefficients = newdataadr(fd, data->coefficients);
|
||||||
|
|
||||||
if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
|
if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
|
||||||
unsigned int a;
|
BLI_endian_switch_float_array(data->coefficients, data->arraysize);
|
||||||
for (a = 0; a < data->arraysize; a++)
|
|
||||||
BLI_endian_switch_float(&data->coefficients[a]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -2764,11 +2759,8 @@ static void switch_endian_keyblock(Key *key, KeyBlock *kb)
|
|||||||
case IPO_BPOINT:
|
case IPO_BPOINT:
|
||||||
case IPO_BEZTRIPLE:
|
case IPO_BEZTRIPLE:
|
||||||
b = cp[0];
|
b = cp[0];
|
||||||
|
BLI_endian_switch_float_array((float *)poin, b);
|
||||||
while (b--) {
|
poin += sizeof(float) * b;
|
||||||
BLI_endian_switch_float((float *)poin);
|
|
||||||
poin += 4;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3059,19 +3051,11 @@ static void lib_link_curve(FileData *fd, Main *main)
|
|||||||
|
|
||||||
static void switch_endian_knots(Nurb *nu)
|
static void switch_endian_knots(Nurb *nu)
|
||||||
{
|
{
|
||||||
int len;
|
|
||||||
|
|
||||||
if (nu->knotsu) {
|
if (nu->knotsu) {
|
||||||
len = KNOTSU(nu);
|
BLI_endian_switch_float_array(nu->knotsu, KNOTSU(nu));
|
||||||
while (len--) {
|
|
||||||
BLI_endian_switch_float(&nu->knotsu[len]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (nu->knotsv) {
|
if (nu->knotsv) {
|
||||||
len = KNOTSV(nu);
|
BLI_endian_switch_float_array(nu->knotsv, KNOTSV(nu));
|
||||||
while (len--) {
|
|
||||||
BLI_endian_switch_float(&nu->knotsv[len]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3289,12 +3273,10 @@ static void direct_link_pointcache(FileData *fd, PointCache *cache)
|
|||||||
|
|
||||||
/* the cache saves non-struct data without DNA */
|
/* the cache saves non-struct data without DNA */
|
||||||
if (pm->data[i] && ptcache_data_struct[i][0]=='\0' && (fd->flags & FD_FLAGS_SWITCH_ENDIAN)) {
|
if (pm->data[i] && ptcache_data_struct[i][0]=='\0' && (fd->flags & FD_FLAGS_SWITCH_ENDIAN)) {
|
||||||
int j, tot = (BKE_ptcache_data_size (i) * pm->totpoint)/4; /* data_size returns bytes */
|
int tot = (BKE_ptcache_data_size (i) * pm->totpoint) / sizeof(int); /* data_size returns bytes */
|
||||||
int *poin = pm->data[i];
|
int *poin = pm->data[i];
|
||||||
|
|
||||||
for (j = 0; j < tot; j++) {
|
BLI_endian_switch_int32_array(poin, tot);
|
||||||
BLI_endian_switch_int32(&poin[j]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3763,12 +3745,7 @@ static void direct_link_mdisps(FileData *fd, int count, MDisps *mdisps, int exte
|
|||||||
if ((fd->flags & FD_FLAGS_SWITCH_ENDIAN) && (mdisps[i].disps)) {
|
if ((fd->flags & FD_FLAGS_SWITCH_ENDIAN) && (mdisps[i].disps)) {
|
||||||
/* DNA_struct_switch_endian doesn't do endian swap for (*disps)[] */
|
/* DNA_struct_switch_endian doesn't do endian swap for (*disps)[] */
|
||||||
/* this does swap for data written at write_mdisps() - readfile.c */
|
/* this does swap for data written at write_mdisps() - readfile.c */
|
||||||
int x;
|
BLI_endian_switch_float_array(*mdisps[i].disps, mdisps[i].totdisp * 3);
|
||||||
float *tmpdisps = *mdisps[i].disps;
|
|
||||||
for (x = 0; x < mdisps[i].totdisp * 3; x++) {
|
|
||||||
BLI_endian_switch_float(tmpdisps);
|
|
||||||
tmpdisps++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (!external && !mdisps[i].disps)
|
if (!external && !mdisps[i].disps)
|
||||||
mdisps[i].totdisp = 0;
|
mdisps[i].totdisp = 0;
|
||||||
@@ -3938,11 +3915,8 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
|
|||||||
TFace *tf = mesh->tface;
|
TFace *tf = mesh->tface;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < (mesh->totface); i++, tf++) {
|
for (i = 0; i < mesh->totface; i++, tf++) {
|
||||||
BLI_endian_switch_uint32(&tf->col[0]);
|
BLI_endian_switch_uint32_array(tf->col, 4);
|
||||||
BLI_endian_switch_uint32(&tf->col[1]);
|
|
||||||
BLI_endian_switch_uint32(&tf->col[2]);
|
|
||||||
BLI_endian_switch_uint32(&tf->col[3]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4468,10 +4442,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
|
|||||||
|
|
||||||
hmd->indexar = newdataadr(fd, hmd->indexar);
|
hmd->indexar = newdataadr(fd, hmd->indexar);
|
||||||
if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
|
if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
|
||||||
int a;
|
BLI_endian_switch_int32_array(hmd->indexar, hmd->totindex);
|
||||||
for (a = 0; a < hmd->totindex; a++) {
|
|
||||||
BLI_endian_switch_int32(&hmd->indexar[a]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (md->type == eModifierType_ParticleSystem) {
|
else if (md->type == eModifierType_ParticleSystem) {
|
||||||
@@ -4501,24 +4472,11 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
|
|||||||
mmd->bindcos = newdataadr(fd, mmd->bindcos);
|
mmd->bindcos = newdataadr(fd, mmd->bindcos);
|
||||||
|
|
||||||
if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
|
if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
|
||||||
int a;
|
if (mmd->bindoffsets) BLI_endian_switch_int32_array(mmd->bindoffsets, mmd->totvert + 1);
|
||||||
|
if (mmd->bindcagecos) BLI_endian_switch_float_array(mmd->bindcagecos, mmd->totcagevert * 3);
|
||||||
if (mmd->bindoffsets)
|
if (mmd->dynverts) BLI_endian_switch_int32_array(mmd->dynverts, mmd->totvert);
|
||||||
for (a=0; a<mmd->totvert+1; a++)
|
if (mmd->bindweights) BLI_endian_switch_float_array(mmd->bindweights, mmd->totvert);
|
||||||
BLI_endian_switch_int32(&mmd->bindoffsets[a]);
|
if (mmd->bindcos) BLI_endian_switch_float_array(mmd->bindcos, mmd->totcagevert * 3);
|
||||||
if (mmd->bindcagecos)
|
|
||||||
for (a=0; a<mmd->totcagevert*3; a++)
|
|
||||||
BLI_endian_switch_float(&mmd->bindcagecos[a]);
|
|
||||||
if (mmd->dynverts)
|
|
||||||
for (a=0; a<mmd->totvert; a++)
|
|
||||||
BLI_endian_switch_int32(&mmd->dynverts[a]);
|
|
||||||
|
|
||||||
if (mmd->bindweights)
|
|
||||||
for (a=0; a<mmd->totcagevert*mmd->totvert; a++)
|
|
||||||
BLI_endian_switch_float(&mmd->bindweights[a]);
|
|
||||||
if (mmd->bindcos)
|
|
||||||
for (a=0; a<mmd->totcagevert*3; a++)
|
|
||||||
BLI_endian_switch_float(&mmd->bindcos[a]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (md->type == eModifierType_Ocean) {
|
else if (md->type == eModifierType_Ocean) {
|
||||||
@@ -4712,10 +4670,7 @@ static void direct_link_object(FileData *fd, Object *ob)
|
|||||||
|
|
||||||
hook->indexar= newdataadr(fd, hook->indexar);
|
hook->indexar= newdataadr(fd, hook->indexar);
|
||||||
if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
|
if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
|
||||||
int a;
|
BLI_endian_switch_int32_array(hook->indexar, hook->totindex);
|
||||||
for (a = 0; a < hook->totindex; a++) {
|
|
||||||
BLI_endian_switch_int32(&hook->indexar[a]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do conversion here because if we have loaded
|
/* Do conversion here because if we have loaded
|
||||||
|
Reference in New Issue
Block a user