/* {{{ int loadMRCHeader(char *pszFilename, MRCHeader *pMRCHeader) */ int loadMRCHeader(char *pszFilename, MRCHeader *pMRCHeader) { FILE *pFMRC; if((pFMRC = fopen(pszFilename, "rb")) == NULL) return -1; if(!readMRCHeader(pFMRC, pMRCHeader)) { fclose(pFMRC); return -1; } fclose(pFMRC); return 1; }
/* {{{ int loadMRC(char *pszFilename, MRC *pMRC) */ int loadMRC(char *pszFilename, MRC *pMRC) { FILE *pFMRC; unsigned int uElementSize = 0; unsigned int uElements = 0; unsigned int fuByteOrder = LITTLE_ENDIAN_DATA; unsigned int maxElement=500000000; if((pFMRC = fopen(pszFilename, "rb")) == NULL) return -1; if(!readMRCHeader(pFMRC, &(pMRC->header))) return -1; uElements = pMRC->header.nx * pMRC->header.ny * pMRC->header.nz; switch(pMRC->header.mode) { case MRC_MODE_BYTE: uElementSize = sizeof(char); break; case MRC_MODE_SHORT: uElementSize = sizeof(short); break; case MRC_MODE_UNSIGNED_SHORT: uElementSize = sizeof(short); break; case MRC_MODE_FLOAT: uElementSize = sizeof(float); break; case MRC_MODE_SHORT_COMPLEX: uElementSize = sizeof(short); uElements *= 2; break; case MRC_MODE_FLOAT_COMPLEX: uElementSize = sizeof(float); uElements *= 2; break; default: return -1; } if((pMRC->pbyData = malloc(uElements*uElementSize)) == NULL) pMRC->pbyData = malloc(uElements*uElementSize); if (uElements>maxElement) { // --- split writing in two --- // if(byteswapread(pFMRC, &(pMRC->pbyData[0]), uElements-maxElement, uElementSize, fuByteOrder) == -1) { free(pMRC->pbyData); fclose(pFMRC); return -1; } if(byteswapread(pFMRC, &(pMRC->pbyData[uElements-maxElement]), maxElement, uElementSize, fuByteOrder) == -1) { free(pMRC->pbyData); fclose(pFMRC); return -1; } } else { if(byteswapread(pFMRC, pMRC->pbyData, uElements, uElementSize, fuByteOrder) == -1) { free(pMRC->pbyData); fclose(pFMRC); return -1; } } fclose(pFMRC); return 1; }
/** * int mrc_copy_from_file(MRCPtr pmrc_dst, char *pszFilename, int dstX, int dstY, int srcX, int srcY, int srcW, int srcH) */ int mrc_copy_from_file(MRCPtr pmrc_dst, char *pszFilename, int dstX, int dstY, int srcX, int srcY) { FILE *pFMRC; MRCHeader pmrch; unsigned int uElementSize = 0; int w, h, w_src, h_src, w_dst, h_dst, offset; long n_src, n_dst, i,j,ij,u,v,uv; float *data_array = (float *)pmrc_dst->pbyData; if((pFMRC = fopen(pszFilename, "rb")) == NULL) return -1; if(!readMRCHeader(pFMRC, &pmrch)) { return -2; } w_src = pmrch.nx; h_src = pmrch.ny; n_src = w_src * h_src; w_dst = pmrc_dst->header.nx; h_dst = pmrc_dst->header.ny; n_dst = w_dst * h_dst; srcX = (srcX>w_src) ? w_src : srcX; srcY = (srcY>h_src) ? h_src : srcY; // set new header pmrc_dst->header.amin=pmrch.amin; pmrc_dst->header.amax=pmrch.amax; pmrc_dst->header.amean=pmrch.amean; pmrc_dst->header.rms=pmrch.rms; w = (w_dst>w_src) ? w_src : w_dst+srcX; h = h_dst+srcY; offset = (w_dst>w_src) ? (dstX<0) ? srcX-dstX : srcX : w_src-w_dst+abs(dstX); if(pmrch.mode == MRC_MODE_BYTE) { uElementSize = sizeof(char); char data_val[1]; // --- position pointer file where copy should start: (srcX, srcY); fseek(pFMRC, (srcX+srcY*w_src)*uElementSize, SEEK_CUR); for (v=dstY, j=srcY; j<h; j++, v++) { for (u=dstX, i=srcX; i<w; i++, u++) { ij = i + j*w_src; uv = u + v*w_dst; if ((u>=w_dst) || (v>=h_dst) || (u<0) || (v<0) || (ij<0) || (uv<0) || (ij>n_src-1) || (uv>n_dst-1) ) continue; fread(data_val, uElementSize,1,pFMRC); data_array[uv] = *data_val; } // --- seek next row of interested area fseek(pFMRC, offset*uElementSize, SEEK_CUR); } } else if (pmrch.mode==MRC_MODE_SHORT) { uElementSize = sizeof(short); short data_val[1]; // --- position pointer file where copy should start: (srcX, srcY); fseek(pFMRC, (srcX+srcY*w_src)*uElementSize, SEEK_CUR); for (v=dstY, j=srcY; j<h; j++, v++) { for (u=dstX, i=srcX; i<w; i++, u++) { ij = i + j*w_src; uv = u + v*w_dst; if ((u>=w_dst) || (v>=h_dst) || (u<0) || (v<0) || (ij<0) || (uv<0) || (ij>n_src-1) || (uv>n_dst-1) ) continue; fread(data_val, uElementSize,1,pFMRC); data_array[uv] = *data_val; } // --- seek next row of interested area fseek(pFMRC, offset*uElementSize, SEEK_CUR); } } else if (pmrch.mode == MRC_MODE_UNSIGNED_SHORT) { uElementSize = sizeof(unsigned short); unsigned short data_val[1]; // --- position pointer file where copy should start: (srcX, srcY); fseek(pFMRC, (srcX+srcY*w_src)*uElementSize, SEEK_CUR); for (v=dstY, j=srcY; j<h; j++, v++) { for (u=dstX, i=srcX; i<w; i++, u++) { ij = i + j*w_src; uv = u + v*w_dst; if ((u>=w_dst) || (v>=h_dst) || (u<0) || (v<0) || (ij<0) || (uv<0) || (ij>n_src-1) || (uv>n_dst-1) ) continue; fread(data_val, uElementSize,1,pFMRC); data_array[uv] = *data_val; } // --- seek next row of interested area fseek(pFMRC, offset*uElementSize, SEEK_CUR); } } else if (pmrch.mode = MRC_MODE_FLOAT) { uElementSize = sizeof(float); // --- position pointer file where copy should start: (srcX, srcY); fseek(pFMRC, (srcX+srcY*w_src)*uElementSize, SEEK_CUR); for (v=dstY, j=srcY; j<h; j++, v++) { for (u=dstX, i=srcX; i<w; i++, u++) { ij = i + j*w_src; uv = u + v*w_dst; if ((u>=w_dst) || (v>=h_dst) || (u<0) || (v<0) || (ij<0) || (uv<0) || (ij>n_src-1) || (uv>n_dst-1) ) continue; fread(&(data_array[uv]), uElementSize,1,pFMRC); } // --- seek next row of interested area fseek(pFMRC, offset*uElementSize, SEEK_CUR); } } fclose(pFMRC); return 1; }