static Image *ImageOpen(char *fileName) { Image *image; unsigned long *rowStart, *rowSize, ulTmp; int x, i; image = (Image *)malloc(sizeof(Image)); if (image == NULL) { fprintf(stderr, "Out of memory!\n"); exit(-1); } if ((image->file = fopen(fileName, "rb")) == NULL) { perror(fileName); exit(-1); } /* * Read the image header */ fread(image, 1, 12, image->file); /* * Check byte order */ if (image->imagic == IMAGIC_SWAP) { image->type = SWAP_SHORT_BYTES(image->type); image->dim = SWAP_SHORT_BYTES(image->dim); image->sizeX = SWAP_SHORT_BYTES(image->sizeX); image->sizeY = SWAP_SHORT_BYTES(image->sizeY); image->sizeZ = SWAP_SHORT_BYTES(image->sizeZ); } for ( i = 0 ; i <= image->sizeZ ; i++ ) { image->tmp[i] = (unsigned char *)malloc(image->sizeX*256); if (image->tmp[i] == NULL ) { fprintf(stderr, "Out of memory!\n"); exit(-1); } } if ((image->type & 0xFF00) == 0x0100) /* RLE image */ { x = image->sizeY * image->sizeZ * sizeof(long); image->rowStart = (unsigned long *)malloc(x); image->rowSize = (unsigned long *)malloc(x); if (image->rowStart == NULL || image->rowSize == NULL) { fprintf(stderr, "Out of memory!\n"); exit(-1); } image->rleEnd = 512 + (2 * x); fseek(image->file, 512, SEEK_SET); fread(image->rowStart, 1, x, image->file); fread(image->rowSize, 1, x, image->file); if (image->imagic == IMAGIC_SWAP) { x /= sizeof(long); rowStart = image->rowStart; rowSize = image->rowSize; while (x--) { ulTmp = *rowStart; *rowStart++ = SWAP_LONG_BYTES(ulTmp); ulTmp = *rowSize; *rowSize++ = SWAP_LONG_BYTES(ulTmp); } } } return image; }
static rawImageRec *RawImageOpenAW(char *fileName, BOOL bUnicode) { rawImageRec *raw; unsigned long *rowStart, *rowSize, ulTmp; int x; DWORD dwBytesRead; raw = (rawImageRec *)malloc(sizeof(rawImageRec)); if (raw == NULL) { MESSAGEBOX(GetFocus(), "Out of memory.", "Error", MB_OK); return NULL; } raw->file = bUnicode ? CreateFileW((LPWSTR) fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0) : CreateFileA((LPSTR) fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); if (raw->file == INVALID_HANDLE_VALUE) { char ach[256]; bUnicode ? wsprintf(ach, "Failed to open image file %ws.\n", fileName) : wsprintf(ach, "Failed to open image file %s.\n", fileName); MESSAGEBOX(GetFocus(), ach, "Error", MB_OK); free( raw ); return NULL; } ReadFile(raw->file, (LPVOID) raw, 12, &dwBytesRead, (LPOVERLAPPED) NULL); if (raw->imagic == IMAGIC_SWAP) { raw->type = SWAP_SHORT_BYTES(raw->type); raw->dim = SWAP_SHORT_BYTES(raw->dim); raw->sizeX = SWAP_SHORT_BYTES(raw->sizeX); raw->sizeY = SWAP_SHORT_BYTES(raw->sizeY); raw->sizeZ = SWAP_SHORT_BYTES(raw->sizeZ); } else if (raw->imagic != IMAGIC) { // magic number is absent - conclude file is invalid (?) MESSAGEBOX(GetFocus(), "Invalid rgb file.", "Error", MB_OK); RawImageClose( raw ); return NULL; } raw->tmp = (unsigned char *)malloc(raw->sizeX*256); raw->tmpR = (unsigned char *)malloc(raw->sizeX*256); raw->tmpG = (unsigned char *)malloc(raw->sizeX*256); raw->tmpB = (unsigned char *)malloc(raw->sizeX*256); if (raw->tmp == NULL || raw->tmpR == NULL || raw->tmpG == NULL || raw->tmpB == NULL) { MESSAGEBOX(GetFocus(), "Out of memory.", "Error", MB_OK); RawImageClose( raw ); return NULL; } if ((raw->type & 0xFF00) == 0x0100) { x = raw->sizeY * raw->sizeZ * sizeof(long); raw->rowStart = (unsigned long *)malloc(x); raw->rowSize = (long *)malloc(x); if (raw->rowStart == NULL || raw->rowSize == NULL) { MESSAGEBOX(GetFocus(), "Out of memory.", "Error", MB_OK); RawImageClose( raw ); return NULL; } raw->rleEnd = 512 + (2 * x); SetFilePointer(raw->file, 512, NULL, FILE_BEGIN); ReadFile(raw->file, (LPVOID) raw->rowStart, x, &dwBytesRead, (LPOVERLAPPED) NULL); ReadFile(raw->file, (LPVOID) raw->rowSize, x, &dwBytesRead, (LPOVERLAPPED) NULL); if (raw->imagic == IMAGIC_SWAP) { x /= sizeof(long); rowStart = raw->rowStart; rowSize = raw->rowSize; while (x--) { ulTmp = *rowStart; *rowStart++ = SWAP_LONG_BYTES(ulTmp); ulTmp = *rowSize; *rowSize++ = SWAP_LONG_BYTES(ulTmp); } } } return raw; }