本文整理汇总了C++中StString::toCString方法的典型用法代码示例。如果您正苦于以下问题:C++ StString::toCString方法的具体用法?C++ StString::toCString怎么用?C++ StString::toCString使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类StString
的用法示例。
在下文中一共展示了StString::toCString方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: getActionIdFromName
int StApplication::getActionIdFromName(const StString& theActionName) const {
StString aNameLower = theActionName;
aNameLower.toLowerCase();
const std::string aName(aNameLower.toCString());
std::map< std::string, int >::const_iterator anAction = myActionLookup.find(aName);
return anAction != myActionLookup.end()
? anAction->second
: -1;
}
示例2: addAction
void StApplication::addAction(const int theActionId,
const StHandle<StAction>& theAction) {
myActions[theActionId] = theAction;
if(!theAction.isNull()) {
StString aNameLower = theAction->getName();
aNameLower.toLowerCase();
const std::string aName(aNameLower.toCString());
myActionLookup[aName] = theActionId;
}
}
示例3: openFileDescriptor
int StAndroidGlue::openFileDescriptor(const StString& thePath) {
if(myJavaVM == NULL) {
return -1;
}
StJNIEnv aJniEnv(myJavaVM);
if(aJniEnv.isNull()) {
return -1;
}
jclass aJClass_Activity = aJniEnv->GetObjectClass(myActivity->clazz);
jmethodID aJMet_openFileDescriptor = aJniEnv->GetMethodID(aJClass_Activity, "openFileDescriptor", "(Ljava/lang/String;)I");
if(aJMet_openFileDescriptor == NULL) {
ST_ERROR_LOG("StAndroidGlue::openFileDescriptor() - method is unavailable!");
return -1;
}
jstring aJStr = aJniEnv->NewStringUTF(thePath.toCString());
int aFileDesc = aJniEnv->CallIntMethod(myActivity->clazz, aJMet_openFileDescriptor, aJStr);
aJniEnv->DeleteLocalRef(aJStr);
return aFileDesc;
}
示例4: DLibLoadFull
HMODULE StLibrary::DLibLoadFull(const StString& theLibName) {
#ifdef _WIN32
HMODULE aModule = LoadLibraryW(theLibName.toUtfWide().toCString());
if(aModule == NULL) {
ST_DEBUG_LOG("Failed to load library: \"" + theLibName + "\" (" + (int )GetLastError() + ')');
} else {
#ifdef ST_DEBUG_LIBS
ST_DEBUG_LOG("Loaded library: \"" + theLibName + "\" " + DLibGetVersion(theLibName.toUtfWide()));
#endif
}
return aModule;
#else
HMODULE aModule = dlopen(theLibName.toCString(), RTLD_NOW);
if(aModule == NULL) {
ST_DEBUG_LOG("Failed to load library: \"" + theLibName + "\" (" + dlerror() + ')');
} else {
#ifdef ST_DEBUG_LIBS
ST_DEBUG_LOG("Loaded library: \"" + theLibName + '\"');
#endif
}
return aModule;
#endif
}
示例5: init
void StFolder::init(const StArrayList<StString>& theExtensions, int theDeep) {
// clean up old list...
clear();
StString aSearchFolderPath = getPath();
#ifdef _WIN32
WIN32_FIND_DATAW aFindFile;
StString aStrSearchMask = getPath() + StString(SYS_FS_SPLITTER) + '*';
HANDLE hFind = FindFirstFileW(aStrSearchMask.toUtfWide().toCString(), &aFindFile);
for(BOOL hasFile = (hFind != INVALID_HANDLE_VALUE); hasFile == TRUE;
hasFile = FindNextFileW(hFind, &aFindFile)) {
//
StString aCurrItemName(aFindFile.cFileName);
addItem(theExtensions, theDeep, aSearchFolderPath, aCurrItemName);
}
FindClose(hFind);
#else
DIR* aSearchedFolder = opendir(aSearchFolderPath.toCString());
if(aSearchedFolder == NULL) {
return;
}
for(dirent* aDirItem = readdir(aSearchedFolder); aDirItem != NULL;
aDirItem = readdir(aSearchedFolder)) {
//
#if (defined(__APPLE__))
// automatically convert filenames from decomposed form used by Mac OS X file systems
StString aCurrItemName = stFromUtf8Mac(aDirItem->d_name);
#else
StString aCurrItemName(aDirItem->d_name);
#endif
addItem(theExtensions, theDeep, aSearchFolderPath, aCurrItemName);
}
closedir(aSearchedFolder);
#endif
// perform sorting...
sort();
}
示例6: processEvents
void StWindowImpl::processEvents() {
if(myParentWin == NULL
|| myToResetDevice) {
// window is closed!
return;
}
// check if we are exiting
if(myParentWin->ToDestroy()) {
myStEvent.Type = stEvent_Close;
myStEvent.Close.Time = getEventTime();
signals.onClose->emit(myStEvent.Close);
return;
}
// check onNewIntent event
StString aDndFile;
myParentWin->setHardwareStereoOn(myToEnableStereoHW);
myParentWin->setTrackOrientation(myToTrackOrient);
myParentWin->setHideSystemBars(myToHideStatusBar, myToHideNavBar);
myParentWin->fetchState(aDndFile, myQuaternion, myToSwapEyesHW, myKeysState);
if(!aDndFile.isEmpty()) {
std::vector<const char*> aDndList;
aDndList.push_back(aDndFile.toCString());
myStEvent.Type = stEvent_FileDrop;
myStEvent.DNDrop.Time = getEventTime();
myStEvent.DNDrop.NbFiles = aDndList.size();
myStEvent.DNDrop.Files = &aDndList[0];
myEventsBuffer.append(myStEvent);
}
updateActiveState();
StPointD_t anOldMousePt = myMousePt;
int aPollRes = 0;
int aNbEvents = 0;
StAndroidPollSource* aSource = NULL;
bool toWaitEvents = false;
while((aPollRes = ALooper_pollAll(toWaitEvents ? -1 : 0, NULL, &aNbEvents, (void** )&aSource)) >= 0) {
if(aSource != NULL) {
aSource->process(myParentWin, aSource);
}
if(myToResetDevice) {
break;
}
// check if we are exiting
if(myParentWin->ToDestroy()) {
break;
}
}
// check if we are exiting
if(myParentWin->ToDestroy()) {
myStEvent.Type = stEvent_Close;
myStEvent.Close.Time = getEventTime();
signals.onClose->emit(myStEvent.Close);
return;
}
myIsMouseMoved = false;
if(myMousePt.x() >= 0.0 && myMousePt.x() <= 1.0 && myMousePt.y() >= 0.0 && myMousePt.y() <= 1.0) {
StPointD_t aDspl = myMousePt - anOldMousePt;
if(std::abs(aDspl.x()) >= 0.0008 || std::abs(aDspl.y()) >= 0.0008) {
myIsMouseMoved = true;
}
}
// update position only when all messages are parsed
updateWindowPos();
myIsUpdated = false;
// StWindow XLib implementation process events in the same thread
// thus this double buffer is not in use
// however user events may be posted to it
swapEventsBuffers();
}
示例7: write
void StLogger::write(const StString& theMessage,
const StLogger::Level theLevel,
const StLogContext* ) {
if(theLevel > myFilter || theMessage.isEmpty()) {
// just ignore
return;
}
// lock for safety
if(!myMutex.isNull()) {
myMutex->lock();
}
// log to the file
if(!myFilePath.isEmpty()) {
#ifdef _WIN32
myFileHandle = _wfopen(myFilePath.toCString(), L"ab");
#elif defined(__linux__)
myFileHandle = fopen(myFilePath.toCString(), "ab");
#endif
if(myFileHandle != NULL) {
switch(theLevel) {
case ST_PANIC:
fwrite("PANIC !! ", 1, 9, myFileHandle);
fwrite(theMessage.toCString(), 1, theMessage.getSize(), myFileHandle);
break;
case ST_FATAL:
fwrite("FATAL !! ", 1, 9, myFileHandle);
fwrite(theMessage.toCString(), 1, theMessage.getSize(), myFileHandle);
break;
case ST_ERROR:
fwrite("ERROR !! ", 1, 9, myFileHandle);
fwrite(theMessage.toCString(), 1, theMessage.getSize(), myFileHandle);
break;
case ST_WARNING:
fwrite("WARN -- ", 1, 9, myFileHandle);
fwrite(theMessage.toCString(), 1, theMessage.getSize(), myFileHandle);
break;
case ST_INFO:
case ST_VERBOSE:
fwrite("INFO -- ", 1, 9, myFileHandle);
fwrite(theMessage.toCString(), 1, theMessage.getSize(), myFileHandle);
break;
case ST_DEBUG:
fwrite("DEBUG -- ", 1, 9, myFileHandle);
fwrite(theMessage.toCString(), 1, theMessage.getSize(), myFileHandle);
break;
default:
fwrite(theMessage.toCString(), 1, theMessage.getSize(), myFileHandle);
break;
}
fwrite("\n", 1, 1, myFileHandle);
fclose(myFileHandle);
myFileHandle = NULL;
}
}
// log to standard output (with colored prefix)
if(myToLogCout) {
switch(theLevel) {
case ST_PANIC:
ST_LOG_CERR << st::COLOR_FOR_RED << stostream_text("PANIC !! ") << st::COLOR_FOR_WHITE << theMessage << stostream_text('\n');
break;
case ST_FATAL:
ST_LOG_CERR << st::COLOR_FOR_RED << stostream_text("FATAL !! ") << st::COLOR_FOR_WHITE << theMessage << stostream_text('\n');
break;
case ST_ERROR:
ST_LOG_CERR << st::COLOR_FOR_RED << stostream_text("ERROR !! ") << st::COLOR_FOR_WHITE << theMessage << stostream_text('\n');
break;
case ST_WARNING:
ST_LOG_CERR << st::COLOR_FOR_YELLOW_L << stostream_text("WARN -- ") << st::COLOR_FOR_WHITE << theMessage << stostream_text('\n');
break;
case ST_INFO:
case ST_VERBOSE:
ST_LOG_CERR << st::COLOR_FOR_YELLOW_L << stostream_text("INFO -- ") << st::COLOR_FOR_WHITE << theMessage << stostream_text('\n');
break;
case ST_DEBUG:
ST_LOG_CERR << st::COLOR_FOR_YELLOW_L << stostream_text("DEBUG -- ") << st::COLOR_FOR_WHITE << theMessage << stostream_text('\n');
break;
default:
ST_LOG_CERR << theMessage << stostream_text('\n');
break;
}
}
// log to the system journal(s)
/*#ifdef _WIN32
// get a handle to the event log
HANDLE anEventLog = RegisterEventSource(NULL, // local computer
L"sView"); // event source name
if(anEventLog != NULL) {
WORD aLogType = 0;
switch(theLevel) {
case ST_PANIC:
case ST_FATAL:
case ST_ERROR:
aLogType = EVENTLOG_ERROR_TYPE;
break;
case ST_WARNING:
aLogType = EVENTLOG_WARNING_TYPE;
//.........这里部分代码省略.........
示例8: Question
bool StMessageBox::Question(const StString& theMessage) {
#ifdef _WIN32
return MessageBoxW(NULL, theMessage.toUtfWide().toCString(), L"Question", MB_YESNO | MB_ICONQUESTION | MB_SETFOREGROUND | MB_TOPMOST) == IDYES;
#elif defined(__linux__)
if(initGlobals()) {
gdk_threads_enter();
GtkWidget* aDialog = gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s", theMessage.toCString());
gint anAnswer = gtk_dialog_run(GTK_DIALOG(aDialog));
gtk_widget_destroy(aDialog);
gdk_flush(); // we need this call!
gdk_threads_leave();
return anAnswer == GTK_RESPONSE_YES;
}
return false;
#endif
}
示例9: save
bool StFreeImage::save(const StString& theFilePath,
ImageType theImageType,
StFormatEnum ) {
if(!StFreeImage::init()) {
setState("FreeImage library is not initialized");
return false;
}
FREE_IMAGE_FORMAT aFIF = convertToFIF(theImageType);
if(aFIF == FIF_UNKNOWN) {
setState("FreeImage library, not supported image file format");
return false;
}
StImage stSaveImage;
if(getColorModel() != ImgColor_RGB && getColorModel() != ImgColor_RGBA && getColorModel() != ImgColor_GRAY) {
// convert from YUV and so on
if(!stSaveImage.initRGB(*this)) {
setState("StFreeImage, only RGB image could be saved");
return false;
}
} else {
stSaveImage.initWrapper(*this);
}
const StImagePlane& stImgPlane = stSaveImage.getPlane();
FREE_IMAGE_TYPE aSaveFormatFI = FIT_UNKNOWN;
if(!convertToFreeFormat(stImgPlane.getFormat(), aSaveFormatFI)) {
setState("StFreeImage, image format currently not supported");
return false;
}
// allocate FreeImage native structure
FIBITMAP* aSaveDIB = FreeImage_AllocateT(aSaveFormatFI, (int )stImgPlane.getSizeX(), (int )stImgPlane.getSizeY(),
(unsigned )stImgPlane.getSizePixelBytes() * 8, 0, 0, 0);
if(aSaveDIB == NULL) {
setState("FreeImage library, internal error");
FreeImage_Unload(aSaveDIB);
return false;
}
// wrapper the created data
StImagePlane stImgPlaneSave;
StImagePlane::ImgFormat stImgFormatSave = convertFromFreeFormat(FreeImage_GetImageType(aSaveDIB),
FreeImage_GetColorType(aSaveDIB),
FreeImage_GetBPP(aSaveDIB));
stImgPlaneSave.initWrapper(stImgFormatSave, FreeImage_GetBits(aSaveDIB),
FreeImage_GetWidth(aSaveDIB), FreeImage_GetHeight(aSaveDIB),
FreeImage_GetPitch(aSaveDIB));
// FreeImage data should be bottom-up...
stImgPlaneSave.setTopDown(false);
// copy from local structure to the FreeImage structure
size_t aRowInc = (( stImgPlaneSave.isTopDown() && stImgPlane.isTopDown()) ||
(!stImgPlaneSave.isTopDown() && !stImgPlane.isTopDown())) ? 1 : size_t(-1);
size_t aRowTo = (aRowInc == 1) ? 0 : (stImgPlane.getSizeY() - 1);
for(size_t aRowFrom = 0; aRowFrom < stImgPlane.getSizeY(); ++aRowFrom, aRowTo += aRowInc) {
for(size_t aCol = 0; aCol < stImgPlane.getSizeX(); ++aCol) {
stMemCpy(stImgPlaneSave.changeData(aRowTo, aCol), stImgPlane.getData(aRowFrom, aCol), stImgPlane.getSizePixelBytes());
}
}
// now save the image file!
#if defined(_WIN32)
if(!FreeImage_Save(aFIF, aSaveDIB, theFilePath.toUtfWide().toCString(), 0)) {
#else
if(!FreeImage_Save(aFIF, aSaveDIB, theFilePath.toCString(), 0)) {
#endif
setState("FreeImage library, image save failed");
FreeImage_Unload(aSaveDIB);
return false;
}
// free resources
FreeImage_Unload(aSaveDIB);
// set debug information
StString aDummy, aFileName;
StFileNode::getFolderAndFile(theFilePath, aDummy, aFileName);
setState(StString("FreeImage library, saved image '") + aFileName + "' " + getDescription());
return true;
}
bool StFreeImage::resize(size_t , size_t ) {
return false;
}
示例10: execProcess
bool StProcess::execProcess(const StString& theExecutablePath,
const StArray<StString>& theArguments) {
if(!StFileNode::isFileExists(theExecutablePath)) {
return false;
}
#ifdef _WIN32
// convert to wide strings
StStringUtfWide anExecutablePathW = theExecutablePath.toUtfWide();
StArrayList<StStringUtfWide> anArgumentsW(theArguments.size());
StStringUtfWide aSplitter = ' ';
StStringUtfWide aCmdLineW = StStringUtfWide('\"') + anExecutablePathW + StStringUtfWide("\" ");
for(size_t anElem = 0;;) {
// TODO (Kirill Gavrilov#9) we should probably quote arguments with spaces...
// how to correctly deal this in the same way for UNIX / Windows?
aCmdLineW += theArguments[anElem++].toUtfWide();
if(anElem >= theArguments.size()) {
break;
}
aCmdLineW += aSplitter;
}
STARTUPINFOW aStartInfo;
PROCESS_INFORMATION aProcessInfo;
stMemSet(&aStartInfo, 0, sizeof(aStartInfo));
aStartInfo.cb = sizeof(aStartInfo);
stMemSet(&aProcessInfo, 0, sizeof(aProcessInfo));
// start the process
if(!CreateProcessW(anExecutablePathW.toCString(), (wchar_t* )aCmdLineW.toCString(),
NULL, NULL, FALSE, 0, NULL, NULL, &aStartInfo, &aProcessInfo)) {
return false;
}
// close process and thread handles
CloseHandle(aProcessInfo.hProcess);
CloseHandle(aProcessInfo.hThread);
return true;
#else
char** anArgList = new char*[theArguments.size() + 2];
anArgList[0] = (char* )theExecutablePath.toCString();
for(size_t anArgId = 0; anArgId < theArguments.size(); ++anArgId) {
anArgList[anArgId + 1] = (char* )theArguments.getValue(anArgId).toCString();
}
anArgList[theArguments.size() + 1] = NULL;
pid_t aChildPid = vfork();
if(aChildPid == -1) {
// fork fail
delete[] anArgList;
return false;
} else if(aChildPid != 0) {
// parent process give the control only after child
// calls exit() or exec() functions
delete[] anArgList;
return true;
}
// child process
execv(theExecutablePath.toCString(), anArgList);
// fail
_exit(1);
#endif
}
示例11: load
bool StAVImage::load(const StString& theFilePath,
ImageType theImageType,
uint8_t* theDataPtr,
int theDataSize) {
// reset current data
StImage::nullify();
setState();
close();
myMetadata.clear();
switch(theImageType) {
case ST_TYPE_PNG:
case ST_TYPE_PNS: {
myCodec = avcodec_find_decoder_by_name("png");
break;
}
case ST_TYPE_JPEG:
case ST_TYPE_MPO:
case ST_TYPE_JPS: {
myCodec = avcodec_find_decoder_by_name("mjpeg");
break;
}
case ST_TYPE_EXR: {
myCodec = avcodec_find_decoder_by_name("exr");
break;
}
case ST_TYPE_WEBP:
case ST_TYPE_WEBPLL: {
myCodec = avcodec_find_decoder_by_name("webp");
break;
}
default: {
break;
}
}
if(theImageType == ST_TYPE_NONE
|| (theDataPtr == NULL && !StFileNode::isFileExists(theFilePath))) {
// open image file and detect its type, its could be non local file!
#if(LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(53, 2, 0))
int avErrCode = avformat_open_input(&myFormatCtx, theFilePath.toCString(), myImageFormat, NULL);
#else
int avErrCode = av_open_input_file (&myFormatCtx, theFilePath.toCString(), myImageFormat, 0, NULL);
#endif
if(avErrCode != 0
|| myFormatCtx->nb_streams < 1
|| myFormatCtx->streams[0]->codec->codec_id == 0) {
if(myFormatCtx != NULL) {
#if(LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(53, 17, 0))
avformat_close_input(&myFormatCtx);
#else
av_close_input_file(myFormatCtx);
myFormatCtx = NULL;
#endif
}
#if(LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(53, 2, 0))
avErrCode = avformat_open_input(&myFormatCtx, theFilePath.toCString(), NULL, NULL);
#else
avErrCode = av_open_input_file(&myFormatCtx, theFilePath.toCString(), NULL, 0, NULL);
#endif
}
if(avErrCode != 0
|| myFormatCtx->nb_streams < 1) {
setState(StString("AVFormat library, couldn't open image file. Error: ") + stAV::getAVErrorDescription(avErrCode));
close();
return false;
}
// find the decoder for the video stream
myCodecCtx = myFormatCtx->streams[0]->codec;
if(theImageType == ST_TYPE_NONE) {
myCodec = avcodec_find_decoder(myCodecCtx->codec_id);
}
}
if(myCodec == NULL) {
setState("AVCodec library, video codec not found");
close();
return false;
} else if(myFormatCtx == NULL) {
// use given image type to load decoder
#if(LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53, 8, 0))
myCodecCtx = avcodec_alloc_context3(myCodec);
#else
myCodecCtx = avcodec_alloc_context();
#endif
}
// stupid check
if(myCodecCtx == NULL) {
setState("AVCodec library, codec context is NULL");
close();
return false;
}
// open VIDEO codec
#if(LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53, 8, 0))
//.........这里部分代码省略.........
示例12: create
//.........这里部分代码省略.........
}
XFree(aFBCfgList);
#endif
if(attribs.Slave != StWinSlave_slaveOff) {
// just copy handle
mySlave.stXDisplay = stXDisplay;
}
// create an X window with the selected visual
XSetWindowAttributes aWinAttribsX = createDefaultAttribs(stXDisplay);
updateChildRect();
Window aParentWin = (Window )myParentWin;
if(aParentWin == 0 && !attribs.IsNoDecor) {
aWinAttribsX.override_redirect = False;
myMaster.hWindow = XCreateWindow(hDisplay, stXDisplay->getRootWindow(),
myRectNorm.left(), myRectNorm.top(),
myRectNorm.width(), myRectNorm.height(),
0, stXDisplay->getDepth(),
InputOutput,
stXDisplay->getVisual(),
CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect, &aWinAttribsX);
if(myMaster.hWindow == 0) {
myMaster.close();
stError("X, XCreateWindow failed for Master");
myInitState = STWIN_ERROR_X_CREATEWIN;
return false;
}
aParentWin = myMaster.hWindow;
XSetStandardProperties(hDisplay, myMaster.hWindow,
myWindowTitle.toCString(),
myWindowTitle.toCString(),
None, NULL, 0, NULL);
// setup WM_CLASS in sync with .desktop StartupWMClass entity
// to ensure Window Manager would show an propriate icon for application
XClassHint* aClassHint = XAllocClassHint();
if(aClassHint != NULL) {
StString aName = StProcess::getProcessName();
StString aClass("sView");
// const_cast should be harmless here and it seems to be just broken signature of XClassHint structure
aClassHint->res_name = const_cast<char* >(aName.toCString());
aClassHint->res_class = const_cast<char* >(aClass.toCString());
XSetClassHint(hDisplay, myMaster.hWindow, aClassHint);
XFree(aClassHint);
}
}
aWinAttribsX.override_redirect = True; // GL window always undecorated
myMaster.hWindowGl = XCreateWindow(hDisplay, (aParentWin != 0) ? aParentWin : stXDisplay->getRootWindow(),
0, 0, myRectNorm.width(), myRectNorm.height(),
0, stXDisplay->getDepth(),
InputOutput,
stXDisplay->getVisual(),
CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect, &aWinAttribsX);
if(myMaster.hWindowGl == 0) {
myMaster.close();
stError("X, XCreateWindow failed for Master");
myInitState = STWIN_ERROR_X_CREATEWIN;
return false;
}
XSetStandardProperties(hDisplay, myMaster.hWindowGl,
示例13: Error
void StMessageBox::Error(const StString& theMessage) {
StLogger::GetDefault().write(theMessage, StLogger::ST_ERROR);
#ifdef _WIN32
MessageBoxW(NULL, theMessage.toUtfWide().toCString(), L"Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND | MB_TOPMOST);
#elif defined(__linux__)
if(initGlobals()) {
gdk_threads_enter();
GtkWidget* dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", theMessage.toCString());
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
gdk_flush(); // we need this call!
gdk_threads_leave();
}
#endif
}
示例14: load
bool StFreeImage::load(const StString& theFilePath, ImageType theImageType,
uint8_t* theDataPtr, int theDataSize) {
if(!StFreeImage::init()) {
setState("FreeImage library is not initialized");
return false;
}
// reset current data
StImage::nullify();
setState();
close();
FREE_IMAGE_FORMAT aFIF = convertToFIF(theImageType);
if(theDataPtr != NULL && theDataSize != 0 && aFIF != FIF_UNKNOWN) {
FIMEMORY* aFIMemory = FreeImage_OpenMemory(theDataPtr, theDataSize);
if(aFIMemory == NULL) {
setState("FreeImage library, internal error");
return false;
}
myDIB = FreeImage_LoadFromMemory(aFIF, aFIMemory, 0);
FreeImage_CloseMemory(aFIMemory);
} else {
// check the file signature and deduce its format
#if defined(_WIN32)
StStringUtfWide aFilePathWide = theFilePath.toUtfWide();
aFIF = FreeImage_GetFileType(aFilePathWide.toCString(), 0);
#else
aFIF = FreeImage_GetFileType(theFilePath.toCString(), 0);
#endif
if(aFIF == FIF_UNKNOWN) {
// no signature? try to guess the file format from the file extension
#if defined(_WIN32)
aFIF = FreeImage_GetFIFFromFilename(aFilePathWide.toCString());
#else
aFIF = FreeImage_GetFIFFromFilename(theFilePath.toCString());
#endif
}
if((aFIF == FIF_UNKNOWN) || !FreeImage_FIFSupportsReading(aFIF)) {
setState("FreeImage library does not support image format");
return false;
}
int loadFlags = 0;
if(aFIF == FIF_GIF) {
// GIF_PLAYBACK - 'Play' the GIF to generate each frame (as 32bpp) instead of returning raw frame data when loading
loadFlags = 2;
} else if(aFIF == FIF_ICO) {
// ICO_MAKEALPHA - convert to 32bpp and create an alpha channel from the AND-mask when loading
loadFlags = 1;
}
#if defined(_WIN32)
myDIB = FreeImage_Load(aFIF, aFilePathWide.toCString(), loadFlags);
#else
myDIB = FreeImage_Load(aFIF, theFilePath.toCString(), loadFlags);
#endif
}
if(myDIB == NULL) {
setState("FreeImage library, loading file failed");
return false;
}
StImagePlane::ImgFormat stImgFormat = convertFromFreeFormat(FreeImage_GetImageType(myDIB),
FreeImage_GetColorType(myDIB),
FreeImage_GetBPP(myDIB));
if(stImgFormat == StImagePlane::ImgUNKNOWN) {
setState(StString("StFreeImage, image format ")
+ FreeImage_GetImageType(myDIB) + ", " + FreeImage_GetColorType(myDIB)
+ " doesn't supported by application");
close();
return false;
}
setColorModelPacked(stImgFormat);
changePlane(0).initWrapper(stImgFormat, FreeImage_GetBits(myDIB),
FreeImage_GetWidth(myDIB),
FreeImage_GetHeight(myDIB),
FreeImage_GetPitch(myDIB));
// FreeImage data always bottom-up...
changePlane(0).setTopDown(false);
// set debug information
StString aDummy, aFileName;
StFileNode::getFolderAndFile(theFilePath, aDummy, aFileName);
setState(StString("FreeImage library, loaded image '") + aFileName + "' " + getDescription());
// we should not close the file because we create a wrapper over FreeImage native object
return true;
}