/** * Loads an image from CxFile object * \param hFile: file handle (CxMemFile or CxIOFile), with read access. * \param imagetype: file format, default = 0 (CXIMAGE_FORMAT_UNKNOWN) * \return : if imagetype is not 0, the function returns true when imagetype * matches the file image format. If imagetype is 0, the function returns true * when the file image format is recognized as a supported format. * If the returned value is true, use GetHeight(), GetWidth() or GetType() * to retrieve the basic image information. * \sa ENUM_CXIMAGE_FORMATS */ bool CxImage::CheckFormat(CxFile * hFile, DWORD imagetype) { SetType(CXIMAGE_FORMAT_UNKNOWN); SetEscape(-1); if (!Decode(hFile,imagetype)) return false; if (GetType() == CXIMAGE_FORMAT_UNKNOWN || GetType() != imagetype) return false; return true; }
void CheckEscape() { struct display *odisplay; int i, nr; if (DefaultEsc >= 0) return; odisplay = display; for (display = displays; display; display = display->d_next) { for (i = 0; i < D_nseqs; i += D_kmaps[i + 2] * 2 + 4) { nr = (D_kmaps[i] << 8 | D_kmaps[i + 1]) & ~KMAP_NOTIMEOUT; if (nr < KMAP_KEYS+KMAP_AKEYS) { if (umtab[nr].nr == RC_COMMAND) break; if (umtab[nr].nr == RC_ILLEGAL && dmtab[nr].nr == RC_COMMAND) break; } else { struct kmap_ext *kme = kmap_exts + nr - (KMAP_KEYS+KMAP_AKEYS); if (kme->um.nr == RC_COMMAND) break; if (kme->um.nr == RC_ILLEGAL && kme->dm.nr == RC_COMMAND) break; } } } if (display == 0) { display = odisplay; return; } SetEscape((struct acluser *)0, Ctrl('a'), 'a'); if (odisplay->d_user->u_Esc == -1) odisplay->d_user->u_Esc = DefaultEsc; if (odisplay->d_user->u_MetaEsc == -1) odisplay->d_user->u_MetaEsc = DefaultMetaEsc; display = 0; Msg(0, "Warning: escape char set back to ^A"); display = odisplay; }
bool CxImage::Decode(CxFile *hFile, DWORD imagetype) #endif { if (hFile == NULL){ strcpy(info.szLastError,CXIMAGE_ERR_NOFILE); return false; } if (imagetype==CXIMAGE_FORMAT_UNKNOWN){ DWORD pos = hFile->Tell(); #if CXIMAGE_SUPPORT_JPG #ifdef XBMC { CxImageJPG newima; try { newima.CopyInfo(*this); if (newima.Decode(hFile, iWidth, iHeight)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } catch (...) { hFile->Seek(pos,SEEK_SET); } } #else { CxImageJPG newima; try { newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } catch (...) { hFile->Seek(pos,SEEK_SET); } } #endif #endif #if CXIMAGE_SUPPORT_PNG { CxImagePNG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_GIF { CxImageGIF newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_BMP { CxImageBMP newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_ICO { CxImageICO newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_TIF { CxImageTIF newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_MNG { CxImageMNG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_TGA { CxImageTGA newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_PCX { CxImagePCX newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_WBMP { CxImageWBMP newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_WMF && CXIMAGE_SUPPORT_WINDOWS { CxImageWMF newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_JBG { CxImageJBG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_JASPER { CxImageJAS newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_SKA { CxImageSKA newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } #endif #if CXIMAGE_SUPPORT_RAW { CxImageRAW newima; newima.CopyInfo(*this); // libDCR performs a high volume of seeks/reads which XBMC's // VFS cannot sustain efficiently, therefore read the file into // memory and send it to the decoder. long buffer_size = hFile->Size(); if (buffer_size < 0) return false; unsigned char* buffer = (unsigned char*)malloc( buffer_size ); // if we were able to allocate the buffer, transfer to a CxMemFile if ( buffer ) { hFile->Read( buffer, buffer_size, 1 ); CxMemFile hMemFile( buffer, buffer_size ); if (newima.Decode( &hMemFile )) { Transfer(newima); return true; } else hFile->Seek(pos, SEEK_SET); } else { // fallback to default method if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); } } #endif } #if CXIMAGE_SUPPORT_BMP if (imagetype==CXIMAGE_FORMAT_BMP){ CxImageBMP newima; newima.CopyInfo(*this); if (newima.Decode(hFile)){ Transfer(newima); return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_JPG if (imagetype==CXIMAGE_FORMAT_JPG){ CxImageJPG newima; newima.CopyInfo(*this); // <ignacio> #ifdef XBMC if (newima.Decode(hFile, iWidth, iHeight)){ #else if (newima.Decode(hFile)){ #endif Transfer(newima); return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_ICO if (imagetype==CXIMAGE_FORMAT_ICO){ CxImageICO newima; newima.CopyInfo(*this); if (newima.Decode(hFile)){ Transfer(newima); return true; } else { info.nNumFrames = newima.info.nNumFrames; strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_GIF if (imagetype==CXIMAGE_FORMAT_GIF){ CxImageGIF newima; newima.CopyInfo(*this); if (newima.Decode(hFile)){ Transfer(newima); return true; } else { info.nNumFrames = newima.info.nNumFrames; strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_PNG if (imagetype==CXIMAGE_FORMAT_PNG){ CxImagePNG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)){ Transfer(newima); return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_TIF if (imagetype==CXIMAGE_FORMAT_TIF){ CxImageTIF newima; newima.CopyInfo(*this); if (newima.Decode(hFile)){ Transfer(newima); return true; } else { info.nNumFrames = newima.info.nNumFrames; strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_MNG if (imagetype==CXIMAGE_FORMAT_MNG){ CxImageMNG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)){ Transfer(newima); return true; } else { info.nNumFrames = newima.info.nNumFrames; strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_TGA if (imagetype==CXIMAGE_FORMAT_TGA){ CxImageTGA newima; newima.CopyInfo(*this); if (newima.Decode(hFile)){ Transfer(newima); return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_PCX if (imagetype==CXIMAGE_FORMAT_PCX){ CxImagePCX newima; newima.CopyInfo(*this); if (newima.Decode(hFile)){ Transfer(newima); return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_WBMP if (imagetype==CXIMAGE_FORMAT_WBMP){ CxImageWBMP newima; newima.CopyInfo(*this); if (newima.Decode(hFile)){ Transfer(newima); return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_WMF && CXIMAGE_SUPPORT_WINDOWS // vho - WMF support if (imagetype == CXIMAGE_FORMAT_WMF){ CxImageWMF newima; newima.CopyInfo(*this); if (newima.Decode(hFile)){ Transfer(newima); return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_JBG if (imagetype==CXIMAGE_FORMAT_JBG){ CxImageJBG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)){ Transfer(newima); return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_JASPER if ( #if CXIMAGE_SUPPORT_JP2 imagetype==CXIMAGE_FORMAT_JP2 || #endif #if CXIMAGE_SUPPORT_JPC imagetype==CXIMAGE_FORMAT_JPC || #endif #if CXIMAGE_SUPPORT_PGX imagetype==CXIMAGE_FORMAT_PGX || #endif #if CXIMAGE_SUPPORT_PNM imagetype==CXIMAGE_FORMAT_PNM || #endif #if CXIMAGE_SUPPORT_RAS imagetype==CXIMAGE_FORMAT_RAS || #endif false ){ CxImageJAS newima; newima.CopyInfo(*this); if (newima.Decode(hFile,imagetype)){ Transfer(newima); return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_SKA if (imagetype==CXIMAGE_FORMAT_SKA){ CxImageSKA newima; newima.CopyInfo(*this); if (newima.Decode(hFile)){ Transfer(newima); return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } } #endif #if CXIMAGE_SUPPORT_RAW if (imagetype==CXIMAGE_FORMAT_RAW) { CxImageRAW newima; newima.CopyInfo(*this); // libDCR performs a high volume of seeks/reads which XBMC's // VFS cannot sustain efficiently, therefore read the file into // memory and send it to the decoder. long buffer_size = hFile->Size(); unsigned char* buffer = (unsigned char*)malloc( buffer_size ); // if we were able to allocate the buffer, transfer to a CxMemFile if ( buffer ) { hFile->Read( buffer, buffer_size, 1 ); CxMemFile hMemFile( buffer, buffer_size ); if (newima.Decode( &hMemFile )) { Transfer(newima); return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } } else { // fallback to default method if (newima.Decode(hFile)) { Transfer(newima); return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } } } #endif strcpy(info.szLastError,"Decode: Unknown or wrong format"); return false; } //////////////////////////////////////////////////////////////////////////////// /** * Loads an image from CxFile object * \param hFile: file handle (CxMemFile or CxIOFile), with read access. * \param imagetype: file format, default = 0 (CXIMAGE_FORMAT_UNKNOWN) * \return : if imagetype is not 0, the function returns true when imagetype * matches the file image format. If imagetype is 0, the function returns true * when the file image format is recognized as a supported format. * If the returned value is true, use GetHeight(), GetWidth() or GetType() * to retrieve the basic image information. * \sa ENUM_CXIMAGE_FORMATS */ bool CxImage::CheckFormat(CxFile * hFile, DWORD imagetype) { SetType(CXIMAGE_FORMAT_UNKNOWN); SetEscape(-1); if (!Decode(hFile,imagetype)) return false; if (GetType() == CXIMAGE_FORMAT_UNKNOWN || GetType() != imagetype) return false; return true; }