static BOOL openStdIOU(const wchar_t* src_file, const wchar_t* dst_file, FreeImageIO* dst_io, fi_handle* src_handle, fi_handle* dst_handle) { #ifdef _WIN32 *src_handle = NULL; *dst_handle = NULL; FreeImageIO io; SetDefaultIO (&io); const BOOL isSameFile = (dst_file && (wcscmp(src_file, dst_file) == 0)) ? TRUE : FALSE; FILE* srcp = NULL; FILE* dstp = NULL; if(isSameFile) { srcp = _wfopen(src_file, L"r+b"); dstp = srcp; } else { srcp = _wfopen(src_file, L"rb"); if(dst_file) { dstp = _wfopen(dst_file, L"wb"); } } if(!srcp || (dst_file && !dstp)) { if(!srcp) { FreeImage_OutputMessageProc(FIF_JPEG, "Cannot open source file for reading"); } else { FreeImage_OutputMessageProc(FIF_JPEG, "Cannot open destination file for writing"); } closeStdIO(srcp, dstp); return FALSE; } if(FreeImage_GetFileTypeFromHandle(&io, srcp) != FIF_JPEG) { FreeImage_OutputMessageProc(FIF_JPEG, " Source file is not jpeg"); closeStdIO(srcp, dstp); return FALSE; } *dst_io = io; *src_handle = srcp; *dst_handle = dstp; return TRUE; #else return FALSE; #endif // _WIN32 }
BOOL DLL_CALLCONV FreeImage_ValidateU(FREE_IMAGE_FORMAT fif, const wchar_t *filename) { #ifdef _WIN32 FreeImageIO io; SetDefaultIO(&io); FILE *handle = _wfopen(filename, L"rb"); if (handle != NULL) { BOOL bIsValidFIF = FreeImage_ValidateFromHandle(fif, &io, (fi_handle)handle); fclose(handle); return bIsValidFIF; } #endif return FALSE; }
BOOL DLL_CALLCONV FreeImage_Validate(FREE_IMAGE_FORMAT fif, const char *filename) { FreeImageIO io; SetDefaultIO(&io); FILE *handle = fopen(filename, "rb"); if (handle != NULL) { BOOL bIsValidFIF = FreeImage_ValidateFromHandle(fif, &io, (fi_handle)handle); fclose(handle); return bIsValidFIF; } return FALSE; }
static BOOL openStdIO(const char* src_file, const char* dst_file, FreeImageIO* dst_io, fi_handle* src_handle, fi_handle* dst_handle) { *src_handle = NULL; *dst_handle = NULL; FreeImageIO io; SetDefaultIO (&io); const BOOL isSameFile = (dst_file && (strcmp(src_file, dst_file) == 0)) ? TRUE : FALSE; FILE* srcp = NULL; FILE* dstp = NULL; if(isSameFile) { srcp = fopen(src_file, "r+b"); dstp = srcp; } else { srcp = fopen(src_file, "rb"); if(dst_file) { dstp = fopen(dst_file, "wb"); } } if(!srcp || (dst_file && !dstp)) { if(!srcp) { FreeImage_OutputMessageProc(FIF_JPEG, "Cannot open \"%s\" for reading", src_file); } else { FreeImage_OutputMessageProc(FIF_JPEG, "Cannot open \"%s\" for writing", dst_file); } closeStdIO(srcp, dstp); return FALSE; } if(FreeImage_GetFileTypeFromHandle(&io, srcp) != FIF_JPEG) { FreeImage_OutputMessageProc(FIF_JPEG, " Source file \"%s\" is not jpeg", src_file); closeStdIO(srcp, dstp); return FALSE; } *dst_io = io; *src_handle = srcp; *dst_handle = dstp; return TRUE; }
FREE_IMAGE_FORMAT DLL_CALLCONV FreeImage_GetFileType(const char *filename, int size) { FreeImageIO io; SetDefaultIO(&io); FILE *handle = fopen(filename, "rb"); if (handle != NULL) { FREE_IMAGE_FORMAT format = FreeImage_GetFileTypeFromHandle(&io, (fi_handle)handle, size); fclose(handle); return format; } return FIF_UNKNOWN; }
FREE_IMAGE_FORMAT DLL_CALLCONV FreeImage_GetFileTypeU(const wchar_t *filename, int size) { #ifdef WIN32 FreeImageIO io; SetDefaultIO(&io); FILE *handle = _wfopen(filename, L"rb"); if (handle != NULL) { FREE_IMAGE_FORMAT format = FreeImage_GetFileTypeFromHandle(&io, (fi_handle)handle, size); fclose(handle); return format; } #endif return FIF_UNKNOWN; }
FIMULTIBITMAP * DLL_CALLCONV FreeImage_OpenMultiBitmap(FREE_IMAGE_FORMAT fif, const char *filename, BOOL create_new, BOOL read_only, BOOL keep_cache_in_memory, int flags) { // sanity check on the parameters if (create_new) read_only = FALSE; // retrieve the plugin list to find the node belonging to this plugin PluginList *list = FreeImage_GetPluginList(); if (list) { PluginNode *node = list->FindNodeFromFIF(fif); if (node) { FreeImageIO *io = new FreeImageIO; if (io) { SetDefaultIO(io); BOOL cont = TRUE; FILE *handle = NULL; if (!create_new) { handle = fopen(filename, "rb"); if (handle == NULL) { cont = FALSE; } } if (cont) { FIMULTIBITMAP *bitmap = new FIMULTIBITMAP; if (bitmap) { MULTIBITMAPHEADER *header = new MULTIBITMAPHEADER; header->m_filename = new char[strlen(filename) + 1]; strcpy(header->m_filename, filename); header->node = node; header->fif = fif; header->io = io; header->handle = handle; header->changed = FALSE; header->read_only = read_only; header->m_cachefile = NULL; header->cache_fif = fif; header->load_flags = flags; if (header) { // store the MULTIBITMAPHEADER in the surrounding FIMULTIBITMAP structure bitmap->data = header; // cache the page count header->page_count = FreeImage_InternalGetPageCount(bitmap); // allocate a continueus block to describe the bitmap if (!create_new) header->m_blocks.push_back((BlockTypeS *)new BlockContinueus(0, header->page_count - 1)); // set up the cache if (!read_only) { char cache_name[256]; ReplaceExtension(cache_name, filename, "ficache"); CacheFile *cache_file = new CacheFile(cache_name, keep_cache_in_memory); if (cache_file->open()) { header->m_cachefile = cache_file; // return the multibitmap return bitmap; } delete cache_file; delete header; } return bitmap; } return NULL; } } } delete io; } } return NULL; }
FIMULTIBITMAP * DLL_CALLCONV FreeImage_OpenMultiBitmap(FREE_IMAGE_FORMAT fif, const char *filename, BOOL create_new, BOOL read_only, BOOL keep_cache_in_memory, int flags) { FILE *handle = NULL; try { // sanity check on the parameters if (create_new) { read_only = FALSE; } // retrieve the plugin list to find the node belonging to this plugin PluginList *list = FreeImage_GetPluginList(); if (list) { PluginNode *node = list->FindNodeFromFIF(fif); if (node) { std::auto_ptr<FreeImageIO> io (new FreeImageIO); SetDefaultIO(io.get()); if (!create_new) { handle = fopen(filename, "rb"); if (handle == NULL) { return NULL; } } std::auto_ptr<FIMULTIBITMAP> bitmap (new FIMULTIBITMAP); std::auto_ptr<MULTIBITMAPHEADER> header (new MULTIBITMAPHEADER); header->m_filename = new char[strlen(filename) + 1]; strcpy(header->m_filename, filename); header->node = node; header->fif = fif; header->io = io.get (); header->handle = handle; header->changed = FALSE; header->read_only = read_only; header->m_cachefile = NULL; header->cache_fif = fif; header->load_flags = flags; // store the MULTIBITMAPHEADER in the surrounding FIMULTIBITMAP structure bitmap->data = header.get(); // cache the page count header->page_count = FreeImage_InternalGetPageCount(bitmap.get()); // allocate a continueus block to describe the bitmap if (!create_new) { header->m_blocks.push_back((BlockTypeS *)new BlockContinueus(0, header->page_count - 1)); } // set up the cache if (!read_only) { std::string cache_name; ReplaceExtension(cache_name, filename, "ficache"); std::auto_ptr<CacheFile> cache_file (new CacheFile(cache_name, keep_cache_in_memory)); if (cache_file->open()) { // we can use release() as std::bad_alloc won't be thrown from here on header->m_cachefile = cache_file.release(); } else { // an error occured ... fclose(handle); return NULL; } } // return the multibitmap // std::bad_alloc won't be thrown from here on header.release(); // now owned by bitmap io.release(); // now owned by bitmap return bitmap.release(); // now owned by caller } } } catch (std::bad_alloc &) { /** @todo report error */ } if (handle) fclose(handle); return NULL; }