topical media & game development

talk show tell print

lib-of-vs-libs-openFrameworks-utils-ofUtils.cpp / cpp



  include <ofUtils.h>
  include <ofImage.h>
  
  if defined(TARGET_OF_IPHONE) || defined(TARGET_OSX )
          #include "sys/time.h"
  endif
  
  ifdef TARGET_WIN32
      #include <mmsystem.h>
          #ifdef _MSC_VER
                  #include <direct.h>
          #endif
  
  endif
  
  static bool enableDataPath = true;
  static unsigned long startTime = ofGetSystemTime();   //  better at the first frame ?? (currently, there is some delay from static init, to running.
  
  //--------------------------------------
  int ofGetElapsedTimeMillis(){
          return (int)(ofGetSystemTime() - startTime);
  }
  
  //--------------------------------------
  float ofGetElapsedTimef(){
          return ((float) ((int)(ofGetSystemTime() - startTime)) / 1000.0f);
  }
  
  //--------------------------------------
  void ofResetElapsedTimeCounter(){
          startTime = ofGetSystemTime();
  }
  
  //=======================================
  // this is from freeglut, and used internally:
  /* Platform-dependent time in milliseconds, as an unsigned 32-bit integer.
   * This value wraps every 49.7 days, but integer overflows cancel
   * when subtracting an initial start time, unless the total time exceeds
   * 32-bit, where the GLUT API return value is also overflowed.
   */
  unsigned long ofGetSystemTime( ) {
          #ifndef TARGET_WIN32
                  struct timeval now;
                  gettimeofday( &now, NULL );
                  return now.tv_usec/1000 + now.tv_sec*1000;
          #else
                  #if defined(_WIN32_WCE)
                          return GetTickCount();
                  #else
                          return timeGetTime();
                  #endif
          #endif
  }
  
  //--------------------------------------------------
  int ofGetSeconds(){
          time_t         curr;
          tm                 local;
          time(&curr);
          local        =*(localtime(&curr));
          return local.tm_sec;
  }
  
  //--------------------------------------------------
  int ofGetMinutes(){
          time_t         curr;
          tm                 local;
          time(&curr);
          local        =*(localtime(&curr));
          return local.tm_min;
  }
  
  //--------------------------------------------------
  int ofGetHours(){
          time_t         curr;
          tm                 local;
          time(&curr);
          local        =*(localtime(&curr));
          return local.tm_hour;
  }
  
  //--------------------------------------------------
  int ofGetYear(){
    time_t    curr;
    tm       local;
    time(&curr);
    local   =*(localtime(&curr));
    int year = local.tm_year + 1900;
    return year;
  }
  
  //--------------------------------------------------
  int ofGetMonth(){
    time_t    curr;
    tm       local;
    time(&curr);
    local   =*(localtime(&curr));
    int month = local.tm_mon + 1;
    return month;
  }
  
  //--------------------------------------------------
  int ofGetDay(){
    time_t    curr;
    tm       local;
    time(&curr);
    local   =*(localtime(&curr));
    return local.tm_mday;
  }
  
  //--------------------------------------------------
  int ofGetWeekday(){
    time_t    curr;
    tm       local;
    time(&curr);
    local   =*(localtime(&curr));
    return local.tm_wday;
  }
  
  //--------------------------------------------------
  void ofEnableDataPath(){
          enableDataPath = true;
  }
  
  //--------------------------------------------------
  void ofDisableDataPath(){
          enableDataPath = false;
  }
  
  //use ofSetDataPathRoot() to override this
  if defined TARGET_OSX
          static string dataPathRoot = "../../../data/";
  else
          static string dataPathRoot = "data/";
  endif
  
  //--------------------------------------------------
  void ofSetDataPathRoot(string newRoot){
          dataPathRoot = newRoot;
  }
  
  //--------------------------------------------------
  string ofToDataPath(string path, bool makeAbsolute){
          if( enableDataPath ){
  
                  //check if absolute path has been passed or if data path has already been applied
                  //do we want to check for C: D: etc ?? like  substr(1, 2) == ':' ??
                  if( path.substr(0,1) != "/" && path.substr(0,dataPathRoot.length()) != dataPathRoot){
                          path = dataPathRoot+path;
                  }
  
                  if(makeAbsolute && path.substr(0,1) != "/"){
                          #ifndef TARGET_OF_IPHONE
                                  
                          #ifndef _MSC_VER 
                                  char currDir[1024];
                                  path = "/"+path;
                                  path = getcwd(currDir, 1024)+path;
                          #else
  
                                  char currDir[1024];
                                  path = "\\"+path;
                                  path = _getcwd(currDir, 1024)+path;
                                  std::replace( path.begin(), path.end(), '/', '\\' ); // fix any unixy paths...
                                  
  
                          #endif
  
                          #else
                                  //do we need iphone specific code here?
                          #endif
                  }
  
          }
          return path;
  }
  
  //--------------------------------------------------
  string ofToString(double value, int precision){
          stringstream sstr;
          sstr << fixed << setprecision(precision) << value;
          return sstr.str();
  }
  
  //--------------------------------------------------
  string ofToString(int value){
          stringstream sstr;
          sstr << value;
          return sstr.str();
  }
  
  //--------------------------------------------------
  vector<string> ofSplitString(const string& str, const string& delimiter = " "){
      vector<string> elements;
          // Skip delimiters at beginning.
      string::size_type lastPos = str.find_first_not_of(delimiter, 0);
      // Find first "non-delimiter".
      string::size_type pos     = str.find_first_of(delimiter, lastPos);
  
      while (string::npos != pos || string::npos != lastPos)
      {
          // Found a token, add it to the vector.
              elements.push_back(str.substr(lastPos, pos - lastPos));
          // Skip delimiters.  Note the "not_of"
          lastPos = str.find_first_not_of(delimiter, pos);
          // Find next "non-delimiter"
          pos = str.find_first_of(delimiter, lastPos);
      }
      return elements;
  }
  
  //--------------------------------------------------
  void ofLaunchBrowser(string url){
  
          // http://support.microsoft.com/kb/224816
  
  	//make sure it is a properly formatted url
          if(url.substr(0,7) != "http://"){
                  ofLog(OF_LOG_WARNING, "ofLaunchBrowser: url must begin http://");
                  return;
          }
  
          //----------------------------
          #ifdef TARGET_WIN32
          //----------------------------
  
                  #if (_MSC_VER)
                  // microsoft visual studio yaks about strings, wide chars, unicode, etc
                  ShellExecuteA(NULL, "open", url.c_str(),
                  NULL, NULL, SW_SHOWNORMAL);
                  #else
                  ShellExecute(NULL, "open", url.c_str(),
                  NULL, NULL, SW_SHOWNORMAL);
                  #endif
  
          //----------------------------
          #endif
          //----------------------------
  
          //--------------------------------------
          #ifdef TARGET_OSX
          //--------------------------------------
                  // ok gotta be a better way then this,
                  // this is what I found...
                  string commandStr = "open "+url;
                  system(commandStr.c_str());
          //----------------------------
          #endif
          //----------------------------
  
          //--------------------------------------
          #ifdef TARGET_LINUX
          //--------------------------------------
                  string commandStr = "xdg-open "+url;
                  system(commandStr.c_str());
          //----------------------------
          #endif
          //----------------------------
  }
  
  //--------------------------------------------------
  string ofGetVersionInfo(){
          string version;
          stringstream sstr;
          sstr << "of version: " << OF_VERSION << endl;
          return sstr.str();
  }
  
  //---- new to 006
  //from the forums http://www.openframeworks.cc/forum/viewtopic.php?t=1413
  
  //--------------------------------------------------
  void ofSaveScreen(string filename) {
     ofImage screen;
     screen.allocate(ofGetWidth(), ofGetHeight(), OF_IMAGE_COLOR);
     screen.grabScreen(0, 0, ofGetWidth(), ofGetHeight());
     screen.saveImage(filename);
  }
  
  //--------------------------------------------------
  int saveImageCounter = 0;
  void ofSaveFrame(){
     string fileName = ofToString(saveImageCounter) + ".png";
     ofSaveScreen(fileName);
     saveImageCounter++;
  }
  
  //levels are currently:
  // see ofConstants.h
  // OF_LOG_NOTICE
  // OF_LOG_WARNING
  // OF_LOG_ERROR
  // OF_LOG_FATAL_ERROR
  
  int currentLogLevel =  OF_DEFAULT_LOG_LEVEL;
  //--------------------------------------------------
  void ofSetLogLevel(int logLevel){
          currentLogLevel = logLevel;
  }
  
  //--------------------------------------------------
  void ofLog(int logLevel, string message){
          if(logLevel >= currentLogLevel){
                  if(logLevel == OF_LOG_VERBOSE){
                          printf("OF_VERBOSE: ");
                  }
                  else if(logLevel == OF_LOG_NOTICE){
                          printf("OF_NOTICE: ");
                  }
                  else if(logLevel == OF_LOG_WARNING){
                          printf("OF_WARNING: ");
                  }
                  else if(logLevel == OF_LOG_ERROR){
                          printf("OF_ERROR: ");
                  }
                  else if(logLevel == OF_LOG_FATAL_ERROR){
                          printf("OF_FATAL_ERROR: ");
                  }
                  printf("\%s\n",message.c_str());
          }
  }
  
  //--------------------------------------------------
  void ofLog(int logLevel, const char* format, ...){
          //thanks stefan!
          //http://www.ozzu.com/cpp-tutorials/tutorial-writing-custom-printf-wrapper-function-t89166.html
  
  	if(logLevel >= currentLogLevel){
                  va_list args;
                  va_start( args, format );
                  if(logLevel == OF_LOG_VERBOSE){
                          printf("OF_VERBOSE: ");
                  }
                  else if(logLevel == OF_LOG_NOTICE){
                          printf("OF_NOTICE: ");
                  }
                  else if(logLevel == OF_LOG_WARNING){
                          printf("OF_WARNING: ");
                  }
                  else if(logLevel == OF_LOG_ERROR){
                          printf("OF_ERROR: ");
                  }
                  else if(logLevel == OF_LOG_FATAL_ERROR){
                          printf("OF_FATAL_ERROR: ");
                  }
                  vprintf( format, args );
                  printf("\n");
                  va_end( args );
          }
  }
  
  //for setting console color
  //doesn't work in the xcode console - do we need this?
  //works fine on the terminal though - not much use
  
  //--------------------------------------------------
  void ofSetConsoleColor(int color){
          #ifdef TARGET_WIN32
                  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
          #else
                  printf("\033[\%im",  color);
          #endif
  }
  
  //--------------------------------------------------
  void ofRestoreConsoleColor(){
          #ifdef TARGET_WIN32
                  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), OF_CONSOLE_COLOR_RESTORE);
          #else
                  printf("\033[\%im",  OF_CONSOLE_COLOR_RESTORE);
          #endif
  }
  
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.