diff --git a/addons/ofxAndroid/ofAndroidLib/src/cc/openframeworks/OFAndroid.java b/addons/ofxAndroid/ofAndroidLib/src/cc/openframeworks/OFAndroid.java index 97feef3671c..240c469fec5 100644 --- a/addons/ofxAndroid/ofAndroidLib/src/cc/openframeworks/OFAndroid.java +++ b/addons/ofxAndroid/ofAndroidLib/src/cc/openframeworks/OFAndroid.java @@ -266,22 +266,32 @@ static public String getStringRes(String idStr){ } static public boolean isOnline(){ - ConnectivityManager conMgr = (ConnectivityManager)ofActivity.getSystemService(Context.CONNECTIVITY_SERVICE); - - return conMgr!=null && ( conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED - || conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED ) ; + try{ + ConnectivityManager conMgr = (ConnectivityManager)ofActivity.getSystemService(Context.CONNECTIVITY_SERVICE); + return conMgr!=null && ( conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED + || conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED ) ; + }catch(Exception e){ + return false; + } } static public boolean isWifiOnline(){ - ConnectivityManager conMgr = (ConnectivityManager)ofActivity.getSystemService(Context.CONNECTIVITY_SERVICE); - - return conMgr!=null && ( conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED ) ; + try{ + ConnectivityManager conMgr = (ConnectivityManager)ofActivity.getSystemService(Context.CONNECTIVITY_SERVICE); + return conMgr!=null && ( conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED ) ; + }catch(Exception e){ + return false; + } } static public boolean isMobileOnline(){ - ConnectivityManager conMgr = (ConnectivityManager)ofActivity.getSystemService(Context.CONNECTIVITY_SERVICE); - - return conMgr!=null && ( conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED ) ; + try{ + ConnectivityManager conMgr = (ConnectivityManager)ofActivity.getSystemService(Context.CONNECTIVITY_SERVICE); + + return conMgr!=null && ( conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED ) ; + }catch(Exception e){ + return false; + } } diff --git a/addons/ofxAssimpModelLoader/src/ofxAssimpModelLoader.cpp b/addons/ofxAssimpModelLoader/src/ofxAssimpModelLoader.cpp index 366758c1150..cc4fc4e762c 100644 --- a/addons/ofxAssimpModelLoader/src/ofxAssimpModelLoader.cpp +++ b/addons/ofxAssimpModelLoader/src/ofxAssimpModelLoader.cpp @@ -141,7 +141,8 @@ bool ofxAssimpModelLoader::loadModel(string modelName, bool optimize){ // Load our new path. - filepath = ofToDataPath(modelName); + filepath = modelName; + string filepath = ofToDataPath(modelName); //theo added - so we can have models and their textures in sub folders modelFolder = ofFilePath::getEnclosingDirectory(filepath); @@ -304,24 +305,16 @@ void ofxAssimpModelLoader::loadGLResources(){ // TODO: handle other aiTextureTypes if(AI_SUCCESS == mtl->GetTexture(aiTextureType_DIFFUSE, texIndex, &texPath)){ - // This is magic. Thanks Kyle. - ofLog(OF_LOG_VERBOSE, "loading image from %s", texPath.data); - string modelFolder = ofFilePath::getEnclosingDirectory(filepath); - - if(ofFilePath::isAbsolute(texPath.data) && ofFile::doesFileExist(texPath.data)) { - if(!ofLoadImage(meshHelper.texture,texPath.data)){ - ofLog(OF_LOG_ERROR,string("error loading image ") + texPath.data); - } - } - else { - if(!ofLoadImage(meshHelper.texture,modelFolder + texPath.data)){ - ofLog(OF_LOG_ERROR,"error loading image " + modelFolder + texPath.data); - } + string modelFolder = ofFilePath::getEnclosingDirectory(filepath,false); + string relTexPath = ofFilePath::getEnclosingDirectory(texPath.data,false); + string texFile = ofFilePath::getFileName(texPath.data); + string realPath = modelFolder + relTexPath + texFile; + if(!ofFile::doesFileExist(realPath) || !ofLoadImage(meshHelper.texture,realPath)) { + ofLog(OF_LOG_ERROR,string("error loading image ") + filepath + " " +realPath); + }else{ + ofLog(OF_LOG_VERBOSE, "texture width: %f height %f", meshHelper.texture.getWidth(), meshHelper.texture.getHeight()); } - - ofLog(OF_LOG_VERBOSE, "texture width: %f height %f", meshHelper.texture.getWidth(), meshHelper.texture.getHeight()); - } aiColor4D dcolor, scolor, acolor, ecolor; diff --git a/apps/addonsExamples/assimpExample/src/testApp.cpp b/apps/addonsExamples/assimpExample/src/testApp.cpp index cd55ecbc1ae..a255a6211d7 100644 --- a/apps/addonsExamples/assimpExample/src/testApp.cpp +++ b/apps/addonsExamples/assimpExample/src/testApp.cpp @@ -105,6 +105,8 @@ void testApp::draw(){ ofPopMatrix(); + glPopAttrib(); + ofDrawBitmapString("fps: "+ofToString(ofGetFrameRate(), 2), 10, 15); ofDrawBitmapString("keys 1-5 load models, spacebar to trigger animation", 10, 30); diff --git a/apps/devApps/_DeployExamples/src/testApp.cpp b/apps/devApps/_DeployExamples/src/testApp.cpp index 1f3457710f9..bc896019dfa 100644 --- a/apps/devApps/_DeployExamples/src/testApp.cpp +++ b/apps/devApps/_DeployExamples/src/testApp.cpp @@ -471,7 +471,7 @@ void addAddonsFromInstallXML(string addonPath, string projectFolder, string xcod int numFolders = xml.getNumTags("folder"); for(int k = 0; k < numFolders; k++){ string folderPath = xml.getAttribute("folder", "name", "null", k); - string folderName = ofFilePath::getFilename(folderPath); + string folderName = ofFilePath::getFileName(folderPath); cout << "adding folder folderName: " << folderName << endl; @@ -487,7 +487,7 @@ void addAddonsFromInstallXML(string addonPath, string projectFolder, string xcod for(int d = 0; d < numFiles; d++){ filePaths.push_back( xml.getValue("file", "null", d) ); - fileNames.push_back( ofFilePath::getFilename( filePaths.back() ) ); + fileNames.push_back( ofFilePath::getFileName( filePaths.back() ) ); hashes.push_back( getHash(filePaths.back()) ); cout << " adding " << filePaths.back() << " " << fileNames.back() << " " << hashes.back() << endl; @@ -956,4 +956,4 @@ void testApp::gotMessage(ofMessage msg){ //-------------------------------------------------------------- void testApp::dragEvent(ofDragInfo dragInfo){ -} \ No newline at end of file +} diff --git a/libs/openFrameworks/graphics/ofImage.cpp b/libs/openFrameworks/graphics/ofImage.cpp index 58254f0933a..c91798e7fc7 100644 --- a/libs/openFrameworks/graphics/ofImage.cpp +++ b/libs/openFrameworks/graphics/ofImage.cpp @@ -380,28 +380,109 @@ static void saveImage(ofPixels_ & pix, string fileName, ofImageQualit } } +//---------------------------------------------------------------- void ofSaveImage(ofPixels & pix, string fileName, ofImageQualityType qualityLevel){ saveImage(pix,fileName,qualityLevel); } +//---------------------------------------------------------------- void ofSaveImage(ofFloatPixels & pix, string fileName, ofImageQualityType qualityLevel) { saveImage(pix,fileName,qualityLevel); } +//---------------------------------------------------------------- void ofSaveImage(ofShortPixels & pix, string fileName, ofImageQualityType qualityLevel) { saveImage(pix,fileName,qualityLevel); } -void ofSaveImage(ofPixels & pix, ofBuffer & buffer, ofImageQualityType qualityLevel) { - ofLog(OF_LOG_ERROR, "ofSaveImage(pix, buffer) is not yet implemented"); +//---------------------------------------------------------------- +template +static void saveImage(ofPixels_ & pix, ofBuffer & buffer, ofImageFormat format, ofImageQualityType qualityLevel) { + //thanks to alvaro casinelli for the implementation + + ofInitFreeImage(); + + if (pix.isAllocated() == false){ + ofLog(OF_LOG_ERROR,"error saving image - pixels aren't allocated"); + return; + } + + #ifdef TARGET_LITTLE_ENDIAN + pix.swapRgb(); + #endif + + FIBITMAP * bmp = getBmpFromPixels(pix); + + #ifdef TARGET_LITTLE_ENDIAN + pix.swapRgb(); + #endif + + if (bmp) // bitmap successfully created + { + // (b) open a memory stream to compress the image onto mem_buffer: + // + FIMEMORY *hmem = FreeImage_OpenMemory(); + // (c) encode and save the image to the memory (on dib FIBITMAP image): + // + if(FREE_IMAGE_FORMAT(format) == FIF_JPEG) { + int quality = JPEG_QUALITYSUPERB; + switch(qualityLevel) { + case OF_IMAGE_QUALITY_WORST: quality = JPEG_QUALITYBAD; break; + case OF_IMAGE_QUALITY_LOW: quality = JPEG_QUALITYAVERAGE; break; + case OF_IMAGE_QUALITY_MEDIUM: quality = JPEG_QUALITYNORMAL; break; + case OF_IMAGE_QUALITY_HIGH: quality = JPEG_QUALITYGOOD; break; + case OF_IMAGE_QUALITY_BEST: quality = JPEG_QUALITYSUPERB; break; + } + FreeImage_SaveToMemory(FIF_JPEG, bmp, hmem, quality); + }else{ + FreeImage_SaveToMemory((FREE_IMAGE_FORMAT)format, bmp, hmem); + } + /* + + NOTE: at this point, hmem contains the entire data in memory stored in fif format. the + amount of space used by the memory is equal to file_size: + long file_size = FreeImage_TellMemory(hmem); + but can also be retrieved by FreeImage_AcquireMemory that retrieves both the + length of the buffer, and the buffer memory address. + */ + #ifdef _MSC_VER + DWORD size_in_bytes = 0; + #else + uint32_t size_in_bytes = 0; + #endif + // Save compressed data on mem_buffer + // note: FreeImage_AquireMemory allocates space for aux_mem_buffer): + // + unsigned char *mem_buffer = NULL; + if (!FreeImage_AcquireMemory(hmem, &mem_buffer, &size_in_bytes)) + cout << "Error aquiring compressed image from memory" << endl; + + /* + Now, before closing the memory stream, copy the content of mem_buffer + to an auxiliary buffer + */ + + buffer.set((char*)mem_buffer,size_in_bytes); + + // Finally, close the FIBITMAP object, or we will get a memory leak: + FreeImage_Unload(bmp); + + // Close the memory stream (otherwise we may get a memory leak). + FreeImage_CloseMemory(hmem); + } +} + +//---------------------------------------------------------------- +void ofSaveImage(ofPixels & pix, ofBuffer & buffer, ofImageFormat format, ofImageQualityType qualityLevel) { + saveImage(pix,buffer,format,qualityLevel); } -void ofSaveImage(ofFloatPixels & pix, ofBuffer & buffer, ofImageQualityType qualityLevel) { - ofLog(OF_LOG_ERROR, "ofSaveImage(pix, buffer) is not yet implemented"); +void ofSaveImage(ofFloatPixels & pix, ofBuffer & buffer, ofImageFormat format, ofImageQualityType qualityLevel) { + saveImage(pix,buffer,format,qualityLevel); } -void ofSaveImage(ofShortPixels & pix, ofBuffer & buffer, ofImageQualityType qualityLevel) { - ofLog(OF_LOG_ERROR, "ofSaveImage(pix, buffer) is not yet implemented"); +void ofSaveImage(ofShortPixels & pix, ofBuffer & buffer, ofImageFormat format, ofImageQualityType qualityLevel) { + saveImage(pix,buffer,format,qualityLevel); } diff --git a/libs/openFrameworks/graphics/ofImage.h b/libs/openFrameworks/graphics/ofImage.h index d47f4af326e..6745c3225d6 100644 --- a/libs/openFrameworks/graphics/ofImage.h +++ b/libs/openFrameworks/graphics/ofImage.h @@ -15,6 +15,45 @@ enum ofImageQualityType { OF_IMAGE_QUALITY_WORST }; +enum ofImageFormat { + OF_IMAGE_FORMAT_BMP = 0, + OF_IMAGE_FORMAT_ICO = 1, + OF_IMAGE_FORMAT_JPEG = 2, + OF_IMAGE_FORMAT_JNG = 3, + OF_IMAGE_FORMAT_KOALA = 4, + OF_IMAGE_FORMAT_LBM = 5, + OF_IMAGE_FORMAT_IFF = OF_IMAGE_FORMAT_LBM, + OF_IMAGE_FORMAT_MNG = 6, + OF_IMAGE_FORMAT_PBM = 7, + OF_IMAGE_FORMAT_PBMRAW = 8, + OF_IMAGE_FORMAT_PCD = 9, + OF_IMAGE_FORMAT_PCX = 10, + OF_IMAGE_FORMAT_PGM = 11, + OF_IMAGE_FORMAT_PGMRAW = 12, + OF_IMAGE_FORMAT_PNG = 13, + OF_IMAGE_FORMAT_PPM = 14, + OF_IMAGE_FORMAT_PPMRAW = 15, + OF_IMAGE_FORMAT_RAS = 16, + OF_IMAGE_FORMAT_TARGA = 17, + OF_IMAGE_FORMAT_TIFF = 18, + OF_IMAGE_FORMAT_WBMP = 19, + OF_IMAGE_FORMAT_PSD = 20, + OF_IMAGE_FORMAT_CUT = 21, + OF_IMAGE_FORMAT_XBM = 22, + OF_IMAGE_FORMAT_XPM = 23, + OF_IMAGE_FORMAT_DDS = 24, + OF_IMAGE_FORMAT_GIF = 25, + OF_IMAGE_FORMAT_HDR = 26, + OF_IMAGE_FORMAT_FAXG3 = 27, + OF_IMAGE_FORMAT_SGI = 28, + OF_IMAGE_FORMAT_EXR = 29, + OF_IMAGE_FORMAT_J2K = 30, + OF_IMAGE_FORMAT_JP2 = 31, + OF_IMAGE_FORMAT_PFM = 32, + OF_IMAGE_FORMAT_PICT = 33, + OF_IMAGE_FORMAT_RAW = 34 +}; + //---------------------------------------------------- // FreeImage based stuff: bool ofLoadImage(ofPixels & pix, string path); @@ -30,13 +69,13 @@ bool ofLoadImage(ofTexture & tex, string path); bool ofLoadImage(ofTexture & tex, const ofBuffer & buffer); void ofSaveImage(ofPixels & pix, string path, ofImageQualityType qualityLevel = OF_IMAGE_QUALITY_BEST); -void ofSaveImage(ofPixels & pix, ofBuffer & buffer, ofImageQualityType qualityLevel = OF_IMAGE_QUALITY_BEST); +void ofSaveImage(ofPixels & pix, ofBuffer & buffer, ofImageFormat format = OF_IMAGE_FORMAT_PNG, ofImageQualityType qualityLevel = OF_IMAGE_QUALITY_BEST); void ofSaveImage(ofFloatPixels & pix, string path, ofImageQualityType qualityLevel = OF_IMAGE_QUALITY_BEST); -void ofSaveImage(ofFloatPixels & pix, ofBuffer & buffer, ofImageQualityType qualityLevel = OF_IMAGE_QUALITY_BEST); +void ofSaveImage(ofFloatPixels & pix, ofBuffer & buffer, ofImageFormat format = OF_IMAGE_FORMAT_PNG, ofImageQualityType qualityLevel = OF_IMAGE_QUALITY_BEST); void ofSaveImage(ofShortPixels & pix, string path, ofImageQualityType qualityLevel = OF_IMAGE_QUALITY_BEST); -void ofSaveImage(ofShortPixels & pix, ofBuffer & buffer, ofImageQualityType qualityLevel = OF_IMAGE_QUALITY_BEST); +void ofSaveImage(ofShortPixels & pix, ofBuffer & buffer, ofImageFormat format = OF_IMAGE_FORMAT_PNG, ofImageQualityType qualityLevel = OF_IMAGE_QUALITY_BEST); // when we exit, we shut down ofImage void ofCloseFreeImage();