/*! * \return Object read from file. * \ingroup WlzExtFF * \brief Reads a Woolz object from the given stream using the '.ipl' * file format. * \param fP Input file stream. * \param dstErr Destination error number ptr, * may be NULL. */ WlzObject *WlzEffReadObjIPL(FILE *fP, WlzErrorNum *dstErr) { int idxZ, i, planeSz, pixelSz; void ***data = NULL; unsigned char ***ubData = NULL; short ***shData = NULL; int ***inData = NULL; float ***flData = NULL; unsigned char *planeBuf = NULL, *planePtr; WlzIVertex3 origin, size; WlzObject *obj = NULL; WlzErrorNum errNum = WLZ_ERR_READ_INCOMPLETE; WlzEffIPLHeader header; WlzGreyType gType; origin.vtX = origin.vtY = origin.vtZ = 0; if(fP == NULL) { errNum = WLZ_ERR_PARAM_NULL; } else { (void )memset((void *)&header, 0, sizeof(WlzEffIPLHeader)); errNum = WlzEffHeadReadIPL(&header, fP); size.vtX = header.nWidth; size.vtY = header.nHeight; size.vtZ = header.nFrames; } if(errNum == WLZ_ERR_NONE) { switch( header.dType ){ case WLZEFF_IPL_TYPE_UBYTE: gType = WLZ_GREY_UBYTE; pixelSz = sizeof(char); if((AlcUnchar3Malloc(&ubData, size.vtZ, size.vtY, size.vtX) != ALC_ER_NONE) || (ubData == NULL)) { errNum = WLZ_ERR_MEM_ALLOC; } data = (void ***) ubData; break; case WLZEFF_IPL_TYPE_SHORT: case WLZEFF_IPL_TYPE_U_16: case WLZEFF_IPL_TYPE_COL_16: gType = WLZ_GREY_SHORT; pixelSz = sizeof(short); if((AlcShort3Malloc(&shData, size.vtZ, size.vtY, size.vtX) != ALC_ER_NONE) || (shData == NULL)) { errNum = WLZ_ERR_MEM_ALLOC; } data = (void ***) shData; break; case WLZEFF_IPL_TYPE_INT: case WLZEFF_IPL_TYPE_COL_24: gType = WLZ_GREY_INT; pixelSz = sizeof(int); if((AlcInt3Malloc(&inData, size.vtZ, size.vtY, size.vtX) != ALC_ER_NONE) || (inData == NULL)) { errNum = WLZ_ERR_MEM_ALLOC; } data = (void ***) inData; break; case WLZEFF_IPL_TYPE_FLOAT: gType = WLZ_GREY_FLOAT; pixelSz = sizeof(float); if((AlcFloat3Malloc(&flData, size.vtZ, size.vtY, size.vtX) != ALC_ER_NONE) || (flData == NULL)) { errNum = WLZ_ERR_MEM_ALLOC; } data = (void ***) flData; break; default: errNum = WLZ_ERR_PARAM_TYPE; break; } } if(errNum == WLZ_ERR_NONE) { planeSz = size.vtX * size.vtY; idxZ = 0; while((idxZ < size.vtZ) && (errNum == WLZ_ERR_NONE)) { /* Read in each slice into the buffer */ planePtr = (unsigned char *) (**(data + idxZ)); switch( header.dType ){ case WLZEFF_IPL_TYPE_UBYTE: case WLZEFF_IPL_TYPE_SHORT: case WLZEFF_IPL_TYPE_U_16: case WLZEFF_IPL_TYPE_COL_16: case WLZEFF_IPL_TYPE_INT: case WLZEFF_IPL_TYPE_FLOAT: if(fread(planePtr, pixelSz, planeSz, fP) != planeSz) { errNum = WLZ_ERR_READ_INCOMPLETE; } break; case WLZEFF_IPL_TYPE_COL_24: for(i=0; (i < planeSz) && (errNum == WLZ_ERR_NONE); i++, planePtr++){ if(fread(planePtr, sizeof(char)*3, 1, fP) != 1) { errNum = WLZ_ERR_READ_INCOMPLETE; } planePtr[3] = 0; } break; default: break; } ++idxZ; } } if(errNum == WLZ_ERR_NONE) { obj = WlzFromArray3D((void ***)data, size, origin, gType, gType, 0.0, 1.0, 0, 1, &errNum); } if(errNum == WLZ_ERR_NONE) { obj->domain.p->voxel_size[0] = 1.0; obj->domain.p->voxel_size[1] = 1.0; obj->domain.p->voxel_size[2] = 1.0; } if(planeBuf) { AlcFree(planeBuf); } if(errNum != WLZ_ERR_NONE) { if(obj) { WlzFreeObj(obj); } else if(data) { Alc3Free((void ***)data); } } if(dstErr) { *dstErr = errNum; } return(obj); }
/*! * \return New Woolz object read from file. * \ingroup WlzExtFF * \brief Reads a Woolz object from the given file using the * previously parsed Amira lattice file header. * \param fP Input file pointer. * \param head Amira lattice file header. * \param dstErr Destination pointer for error number, * may be NULL. */ static WlzObject *WlzEffAmReadArray3DToObj(FILE *fP, WlzEffAmHead *head, WlzErrorNum *dstErr) { WlzIVertex3 org; WlzDVertex3 voxSz; WlzGreyType gType; WlzObject *obj = NULL; void ***data = NULL; WlzErrorNum errNum = WLZ_ERR_NONE; if((head->dim != WLZEFF_AM_DIM_3) || (head->fmt != WLZEFF_AM_FMT_BINARY) || (head->latSize.vtX < 1) || (head->latSize.vtY < 1) || (head->latSize.vtZ < 1) || ((voxSz.vtX = head->bBox.xMax - head->bBox.xMin) < DBL_EPSILON) || ((voxSz.vtY = head->bBox.yMax - head->bBox.yMin) < DBL_EPSILON) || ((voxSz.vtZ = head->bBox.zMax - head->bBox.zMin) < DBL_EPSILON)) { errNum = WLZ_ERR_READ_INCOMPLETE; } if(errNum == WLZ_ERR_NONE) { switch(head->latComp) { case WLZEFF_AM_LATCOMP_NONE: /* FALLTHROUGH */ case WLZEFF_AM_LATCOMP_HXBYTERLE: break; default: errNum = WLZ_ERR_UNIMPLEMENTED; break; } } if(errNum == WLZ_ERR_NONE) { errNum = WlzEffAmSeekLabel(fP, head->latLabel); } if(errNum == WLZ_ERR_NONE) { switch(head->latDatType) { case WLZEFF_AM_DATTYPE_BYTE: gType = WLZ_GREY_UBYTE; if(AlcChar3Malloc((char ****)&data, head->latSize.vtZ, head->latSize.vtY, head->latSize.vtX) != ALC_ER_NONE) { errNum = WLZ_ERR_MEM_ALLOC; } break; case WLZEFF_AM_DATTYPE_SHORT: gType = WLZ_GREY_SHORT; if(AlcShort3Malloc((short ****)&data, head->latSize.vtZ, head->latSize.vtY, head->latSize.vtX) != ALC_ER_NONE) { errNum = WLZ_ERR_MEM_ALLOC; } break; default: errNum = WLZ_ERR_GREY_TYPE; break; } } if(errNum == WLZ_ERR_NONE) { errNum = WlzEffAmReadArray3D(fP, data, head, gType); } if(errNum == WLZ_ERR_NONE) { /* Compute voxel size and origin. * The Amira bounding box is for voxel centres and NOT * voxel boundaries. */ if(head->latSize.vtX > 1) { voxSz.vtX /= (double )(head->latSize.vtX - 1); } if(head->latSize.vtY > 1) { voxSz.vtY /= (double )(head->latSize.vtY - 1); } if(head->latSize.vtZ > 1) { voxSz.vtZ /= (double )(head->latSize.vtZ - 1); } org.vtX = head->bBox.xMin / voxSz.vtX; org.vtY = head->bBox.yMin / voxSz.vtY; org.vtZ = head->bBox.zMin / voxSz.vtZ; obj = WlzFromArray3D(data, head->latSize, org, gType, gType, 0.0, 1.0, 0, 1, &errNum); } if(errNum == WLZ_ERR_NONE) { obj->domain.p->voxel_size[0] = voxSz.vtX; obj->domain.p->voxel_size[1] = voxSz.vtY; obj->domain.p->voxel_size[2] = voxSz.vtZ; } if(data) { if(obj) { **data = NULL; } Alc3Free(data); } if(errNum != WLZ_ERR_NONE) { if(obj) { (void )WlzFreeObj(obj); obj = NULL; } } if(dstErr) { *dstErr = errNum; } return(obj); }
/*! * \return Object read from file. * \ingroup WlzExtFF * \brief Reads a 3D Woolz object from the given file(s) using the given * (2D) file format. * \param gvnFileName Given file name. * \param fFmt Given file format (must be a 2D file * format). * \param dstErr Destination error number ptr, may be * NULL. */ static WlzObject *WlzEffReadObjStack3D(const char *gvnFileName, WlzEffFormat fFmt, WlzErrorNum *dstErr) { int tI0, planeIdx, planeOff; char *tCP0, *recTok, *fNameStr = NULL, *fPathStr = NULL, *fBodyStr = NULL, *fExtStr = NULL, *fCtrStr = NULL; FILE *fP = NULL, *fP2D = NULL; WlzIVertex2 imgSz2D; WlzErrorNum errNum = WLZ_ERR_NONE; WlzObject *obj = NULL; unsigned char ***data = NULL; char fRecord[WLZEFF_STACK_CTR_RECORDMAX]; WlzEffStackCtrHeader header; errNum = WlzEffStackFileNameParse(gvnFileName, fFmt, &fPathStr, &fBodyStr, &fExtStr, &fCtrStr); if(errNum == WLZ_ERR_NONE) { tI0 = strlen(fPathStr) + strlen(fBodyStr) + strlen(fExtStr) + 16; if((fNameStr = AlcMalloc(tI0 * sizeof(char))) == NULL) { errNum = WLZ_ERR_MEM_ALLOC; } else { sprintf(fNameStr, "%s%s.%s", fPathStr, fBodyStr, fCtrStr); if((fP = fopen(fNameStr, "r")) == NULL) { errNum = WLZ_ERR_READ_EOF; } else { #ifdef _WIN32 if (fP != NULL){ if(_setmode(_fileno(fP), 0x8000) == -1) { errNum = WLZ_ERR_READ_EOF; } } #endif errNum = WlzEffHeadParseStackCtr(&header, fP); } } } if(errNum == WLZ_ERR_NONE) { imgSz2D.vtX = header.volSize.vtX; imgSz2D.vtY = header.volSize.vtY; if((AlcUnchar3Malloc(&data, header.volSize.vtZ, header.volSize.vtY, header.volSize.vtX) != ALC_ER_NONE) || (data == NULL)) { errNum = WLZ_ERR_MEM_ALLOC; } } if(errNum == WLZ_ERR_NONE) { planeOff = 0; planeIdx = header.volOrigin.vtZ; while((planeOff < header.volSize.vtZ) && (errNum == WLZ_ERR_NONE)) { if(fgets(fRecord, WLZEFF_STACK_CTR_RECORDMAX, fP) == NULL) { errNum = WLZ_ERR_READ_INCOMPLETE; } else { fRecord[WLZEFF_STACK_CTR_RECORDMAX - 1] = '\0'; if((tCP0 = strrchr(fRecord, '\n')) != NULL) { *tCP0 = '\0'; } if(((recTok = strtok(fRecord, " \t")) == NULL) || (sscanf(recTok, "%d", &tI0) != 1) || (tI0 != planeIdx) || ((recTok = strtok(NULL, " \t\n")) == NULL)) { errNum = WLZ_ERR_READ_INCOMPLETE; } else { sprintf(fNameStr, "%s%s", fPathStr, recTok); if((fP2D = fopen(fNameStr, "r")) == NULL) { errNum = WLZ_ERR_READ_EOF; } else { #ifdef _WIN32 if (fP2D != NULL){ if(_setmode(_fileno(fP2D), 0x8000) == -1) { errNum = WLZ_ERR_READ_EOF; } } #endif errNum = WlzEffReadObjStackData2D(fP2D, fFmt, &imgSz2D, (data + planeOff)); fclose(fP2D); } } } ++planeOff; ++planeIdx; } } if(errNum == WLZ_ERR_NONE) { obj = WlzFromArray3D((void ***)data, header.volSize, header.volOrigin, WLZ_GREY_UBYTE, WLZ_GREY_UBYTE, 0.0, 1.0, 0, 1, &errNum); } if(errNum == WLZ_ERR_NONE) { obj->domain.p->voxel_size[0] = header.voxSize.vtX; obj->domain.p->voxel_size[1] = header.voxSize.vtY; obj->domain.p->voxel_size[2] = header.voxSize.vtZ; } if(data) { if(obj) { /* **data used in object */ AlcFree(*data); AlcFree(data); } else { if(data) { Alc3Free((void ***)data); } } } if(dstErr) { *dstErr = errNum; } if(fNameStr) { AlcFree(fNameStr); } if(fPathStr) { AlcFree(fPathStr); } if(fBodyStr) { AlcFree(fBodyStr); } if(fExtStr) { AlcFree(fExtStr); } if(fCtrStr) { AlcFree(fCtrStr); } if(dstErr) { *dstErr = errNum; } return(obj); }