int imFileFormatLED::Open(const char* file_name) { char sig[4]; unsigned char byte_value; int found = 0; /* opens the binary file for reading */ handle = imBinFileOpen(file_name); if (!handle) return IM_ERR_OPEN; this->image_count = 1; strcpy(this->compression, "NONE"); imBinFileRead(handle, sig, 3, 1); sig[3] = 0; if (imBinFileError(handle)) { imBinFileClose(handle); return IM_ERR_ACCESS; } if (!imStrEqual(sig, "LED")) { imBinFileClose(handle); return IM_ERR_FORMAT; } unsigned long offset = imBinFileTell(handle); /* count the number of colors */ this->pal_count = -1; // will count the first '=' that is not a color while (!found) { imBinFileRead(handle, &byte_value, 1, 1); if (byte_value == '(') found = 1; if (byte_value == '=') this->pal_count++; if (imBinFileError(handle)) { imBinFileClose(handle); return IM_ERR_ACCESS; } } imBinFileSeekTo(handle, offset); return IM_ERR_NONE; }
int imFileFormatSGI::WriteImageData(void* data) { int count = imFileLineBufferCount(this); imCounterTotal(this->counter, count, "Writing SGI..."); imbyte* compressed_buffer = NULL; if (this->comp_type == SGI_RLE) // point to the extra buffer compressed_buffer = (imbyte*)this->line_buffer + this->line_buffer_size; int row = 0, plane = 0; for (int i = 0; i < count; i++) { imFileLineBufferWrite(this, data, row, plane); if (this->comp_type == SGI_VERBATIM) imBinFileWrite(handle, this->line_buffer, this->line_buffer_size/this->bpc, this->bpc); else { int length; if (this->bpc == 1) length = iSGIEncodeScanLine(compressed_buffer, (imbyte*)this->line_buffer, this->width); else length = iSGIEncodeScanLine((imushort*)compressed_buffer, (imushort*)this->line_buffer, this->width); int row_index = row + plane*this->height; this->starttab[row_index] = imBinFileTell(handle); this->lengthtab[row_index] = length*this->bpc; imBinFileWrite(handle, compressed_buffer, length, this->bpc); } if (imBinFileError(handle)) return IM_ERR_ACCESS; if (!imCounterInc(this->counter)) return IM_ERR_COUNTER; imFileLineBufferInc(this, &row, &plane); } if (this->comp_type == SGI_RLE) { imBinFileSeekTo(this->handle, 512); int tablen = this->height * imColorModeDepth(this->file_color_mode); imBinFileWrite(handle, this->starttab, tablen, 4); imBinFileWrite(handle, this->lengthtab, tablen, 4); } return IM_ERR_NONE; }
int imFileFormatJPEG::Open(const char* file_name) { this->handle = imBinFileOpen(file_name); if (this->handle == NULL) return IM_ERR_OPEN; unsigned char sig[2]; if (!imBinFileRead(this->handle, sig, 2, 1)) { imBinFileClose(this->handle); return IM_ERR_ACCESS; } if (sig[0] != 0xFF || sig[1] != 0xD8) { imBinFileClose(this->handle); return IM_ERR_FORMAT; } imBinFileSeekTo(this->handle, 0); strcpy(this->compression, "JPEG"); this->image_count = 1; this->dinfo.err = jpeg_std_error(&this->jerr.pub); this->jerr.pub.error_exit = JPEGerror_exit; this->jerr.pub.output_message = JPEGoutput_message; this->jerr.pub.emit_message = JPEGemit_message; /* Establish the setjmp return context for error_exit to use. */ if (setjmp(this->jerr.setjmp_buffer)) { /* If we get here, the JPEG code has signaled an error. * We need to clean up the JPEG object, close the input file, and return. */ jpeg_destroy_decompress(&this->dinfo); imBinFileClose(this->handle); return IM_ERR_FORMAT; } /* Now we can initialize the JPEG decompression object. */ jpeg_create_decompress(&this->dinfo); /* Step 2: specify data source (eg, a file) */ jpeg_stdio_src(&this->dinfo, (FILE*)this->handle); return IM_ERR_NONE; }
int imFileFormatSGI::ReadImageData(void* data) { int count = imFileLineBufferCount(this); imCounterTotal(this->counter, count, "Reading SGI..."); imbyte* compressed_buffer = NULL; if (this->comp_type == SGI_RLE) // point to the extra buffer compressed_buffer = (imbyte*)this->line_buffer + this->line_buffer_size; int row = 0, plane = 0; for (int i = 0; i < count; i++) { if (this->comp_type == SGI_VERBATIM) { imBinFileRead(handle, this->line_buffer, this->line_buffer_size/this->bpc, this->bpc); if (imBinFileError(handle)) return IM_ERR_ACCESS; } else { int row_index = row + plane*this->height; imBinFileSeekTo(handle, this->starttab[row_index]); imBinFileRead(handle, compressed_buffer, this->lengthtab[row_index] / this->bpc, this->bpc); if (imBinFileError(handle)) return IM_ERR_ACCESS; if (this->bpc == 1) iSGIDecodeScanLine((imbyte*)this->line_buffer, compressed_buffer, this->width); else iSGIDecodeScanLine((imushort*)this->line_buffer, (imushort*)compressed_buffer, this->width); } imFileLineBufferRead(this, data, row, plane); if (!imCounterInc(this->counter)) return IM_ERR_COUNTER; imFileLineBufferInc(this, &row, &plane); } return IM_ERR_NONE; }
static long file_seek(jas_stream_obj_t *obj, long offset, int origin) { imBinFile* file_bin = (imBinFile*)obj; switch (origin) { case SEEK_SET: imBinFileSeekTo(file_bin, offset); break; case SEEK_CUR: imBinFileSeekOffset(file_bin, offset); break; case SEEK_END: imBinFileSeekFrom(file_bin, offset); break; } return imBinFileError(file_bin); }