Add animated vector image visual
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / visual-url.cpp
index c3c675d..731ed20 100644 (file)
@@ -30,54 +30,59 @@ namespace Internal
 namespace
 {
 
-VisualUrl::Location ResolveLocation( const std::string& url)
+VisualUrl::ProtocolType ResolveLocation( const std::string& url )
 {
-  const char FTP[] = { 'f', 't', 'p', ':', '/', '/' };
-  const char SSH[] = { 's', 's', 'h', ':', '/', '/' };
-  const char HTTP[] = { 'h', 't', 't', 'p', ':', '/', '/' };
-  const char HTTPS[] = { 'h', 't', 't', 'p', 's', ':', '/', '/' };
-
-  const int MATCH_FTP = 0x01;
-  const int MATCH_SSH = 0x02;
-  const int MATCH_HTTP = 0x04;
-  const int MATCH_HTTPS = 0x08;
-
   const char* urlCStr = url.c_str();
-  if( url.size() > 6 )
+  const uint32_t length = url.size();
+  if( ( length > 7 ) && urlCStr[5] == ':' && urlCStr[6] == '/' && urlCStr[7] == '/' )
+  {
+    // https://
+    if( ( 'h' == tolower( urlCStr[0] ) )&&
+        ( 't' == tolower( urlCStr[1] ) )&&
+        ( 't' == tolower( urlCStr[2] ) )&&
+        ( 'p' == tolower( urlCStr[3] ) )&&
+        ( 's' == tolower( urlCStr[4] ) ) )
+    {
+      return VisualUrl::REMOTE;
+    }
+  }
+  else if( ( length > 6 ) && urlCStr[4] == ':' && urlCStr[5] == '/' && urlCStr[6] == '/' )
+  {
+    // http:// or dali://
+    const char hOrd = tolower( urlCStr[0] );
+    const char tOra = tolower( urlCStr[1] );
+    const char tOrl = tolower( urlCStr[2] );
+    const char pOri = tolower( urlCStr[3] );
+    if( ( 'h' == hOrd )&&
+        ( 't' == tOra )&&
+        ( 't' == tOrl )&&
+        ( 'p' == pOri ) )
+    {
+      return VisualUrl::REMOTE;
+    }
+    if( ( 'd' == hOrd )&&
+        ( 'a' == tOra )&&
+        ( 'l' == tOrl )&&
+        ( 'i' == pOri ) )
+    {
+      return VisualUrl::TEXTURE;
+    }
+  }
+  else if( ( length > 5 ) && urlCStr[3] == ':' && urlCStr[4] == '/' && urlCStr[5] == '/' )
   {
-    if( urlCStr[3] == ':' || urlCStr[4] == ':' || urlCStr[5] == ':' )
+    // ftp:// or ssh://
+    const char fOrS = tolower( urlCStr[0] );
+    if( ( 'f' == fOrS )||( 's' == fOrS ) )
     {
-      int flags = 0x0F;
-      for( unsigned int i=0; i < sizeof(HTTPS); ++i )
+      const char tOrs = tolower( urlCStr[1] );
+      if( ( 't' == tOrs )||( 's' == tOrs ) )
       {
-        char c = tolower( urlCStr[i] );
-        if( i < sizeof(FTP) && (flags & MATCH_FTP) && c != FTP[i] )
-        {
-          flags &= ~MATCH_FTP;
-        }
-        if( i < sizeof(SSH) && (flags & MATCH_SSH) && c != SSH[i] )
-        {
-          flags &= ~MATCH_SSH;
-        }
-        if( i < sizeof(HTTP) && (flags & MATCH_HTTP) && c != HTTP[i] )
-        {
-          flags &= ~MATCH_HTTP;
-        }
-        if( i < sizeof(HTTPS) && (flags & MATCH_HTTPS) && c != HTTPS[i] )
-        {
-          flags &= ~MATCH_HTTPS;
-        }
-
-        if( (flags & (MATCH_FTP | MATCH_SSH | MATCH_HTTP | MATCH_HTTPS )) == 0 )
+        const char pOrh = tolower( urlCStr[2] );
+        if( ( 'p' == pOrh )||( 'h' == pOrh ) )
         {
-          break;
+          return VisualUrl::REMOTE;
         }
       }
-
-      if( flags )
-      {
-        return VisualUrl::REMOTE;
-      }
     }
   }
   return VisualUrl::LOCAL;
@@ -94,14 +99,16 @@ VisualUrl::Type ResolveType( const std::string& url )
     enum { SUFFIX, HASH, HASH_DOT } state = SUFFIX;
     char SVG[ 4 ] = { 'g', 'v', 's', '.' };
     char GIF[ 4 ] = { 'f', 'i', 'g', '.' };
+    char JSON[ 5 ] = { 'n', 'o', 's', 'j', '.' };
     unsigned int svgScore = 0;
     unsigned int gifScore = 0;
+    unsigned int jsonScore = 0;
     int index = count;
     while( --index >= 0 )
     {
-      const char currentChar = url[ index ];
+      const char currentChar = tolower( url[ index ] );
       const std::size_t offsetFromEnd = count - index - 1u;
-      if( ( offsetFromEnd < sizeof(SVG) )&&( tolower( currentChar ) == SVG[ offsetFromEnd ] ) )
+      if( ( offsetFromEnd < sizeof(SVG) )&&( currentChar == SVG[ offsetFromEnd ] ) )
       {
         // early out if SVG as can't be used in N patch for now
         if( ++svgScore == sizeof(SVG) )
@@ -109,14 +116,22 @@ VisualUrl::Type ResolveType( const std::string& url )
           return VisualUrl::SVG;
         }
       }
-      if( ( offsetFromEnd < sizeof(GIF) )&&( tolower( currentChar ) == GIF[ offsetFromEnd ] ) )
+      if( ( offsetFromEnd < sizeof(GIF) )&&( currentChar == GIF[ offsetFromEnd ] ) )
       {
-        // early out if GIF
+        // early out if GIF as can't be used in N patch for now
         if( ++gifScore == sizeof(GIF) )
         {
           return VisualUrl::GIF;
         }
       }
+      if( ( offsetFromEnd < sizeof(JSON) )&&( currentChar == JSON[ offsetFromEnd ] ) )
+      {
+        // early out if JSON as can't be used in N patch for now
+        if( ++jsonScore == sizeof(JSON) )
+        {
+          return VisualUrl::JSON;
+        }
+      }
       switch( state )
       {
         case SUFFIX:
@@ -178,7 +193,11 @@ VisualUrl::VisualUrl( const std::string& url )
   if( ! url.empty() )
   {
     mLocation = ResolveLocation( url );
-    mType = ResolveType( url );
+    if( VisualUrl::TEXTURE != mLocation )
+    {
+      // TEXTURE location url doesn't need type resolving, REGULAR_IMAGE is fine
+      mType = ResolveType( url );
+    }
   }
 }
 
@@ -210,7 +229,7 @@ VisualUrl::Type VisualUrl::GetType() const
   return mType;
 }
 
-VisualUrl::Location VisualUrl::GetLocation() const
+VisualUrl::ProtocolType VisualUrl::GetProtocolType() const
 {
   return mLocation;
 }
@@ -220,13 +239,28 @@ bool VisualUrl::IsValid() const
   return mUrl.size() > 0u;
 }
 
-bool VisualUrl::IsLocal() const
+bool VisualUrl::IsLocalResource() const
 {
   return mLocation == VisualUrl::LOCAL;
 }
 
+std::string VisualUrl::GetLocation() const
+{
+  const auto location = mUrl.find( "://" );
+  if( std::string::npos != location )
+  {
+    return mUrl.substr( location + 3u ); // 3 characters forwards from the start of ://
+  }
+  return mUrl;
+}
 
+std::string VisualUrl::CreateTextureUrl( const std::string& location )
+{
+  return "dali://" + location;
+}
 
 } // Internal
+
 } // Toolkit
+
 } // Dali