#include <dali/internal/event/common/thread-local-storage.h>
#include <dali/internal/event/resources/resource-client.h>
#include <dali/internal/event/images/image-factory.h>
+#include <dali/internal/event/images/nine-patch-image-impl.h>
#include <dali/internal/event/common/stage-impl.h>
using namespace Dali::Integration;
Image* Image::New( const std::string& filename, const Dali::ImageAttributes& attributes, LoadPolicy loadPol, ReleasePolicy releasePol )
{
- Image* image = new Image( loadPol, releasePol );
-
- if( ! filename.empty() )
+ if( IsNinePatchFileName(filename) )
{
- Vector2 closestSize;
-
- Internal::ThreadLocalStorage::Get().GetPlatformAbstraction().GetClosestImageSize( filename, attributes, closestSize );
- image->mWidth = closestSize.width;
- image->mHeight = closestSize.height;
+ NinePatchImage* image = new NinePatchImage( filename, attributes, loadPol, releasePol );
+ return image;
}
+ else
+ {
+ Image* image = new Image( loadPol, releasePol );
- image->mRequest = image->mImageFactory.RegisterRequest( filename, &attributes );
+ if( ! filename.empty() )
+ {
+ Vector2 closestSize;
- if( Dali::Image::Immediate == loadPol )
- {
- // Trigger loading of the image on a seperate resource thread as soon as it
- // can be scheduled:
- image->mTicket = image->mImageFactory.Load( image->mRequest.Get() );
- image->mTicket->AddObserver( *image );
- }
- // else lazily load image data later, only when it is needed to draw something:
+ Internal::ThreadLocalStorage::Get().GetPlatformAbstraction().GetClosestImageSize( filename, attributes, closestSize );
+ image->mWidth = closestSize.width;
+ image->mHeight = closestSize.height;
+ }
- DALI_LOG_SET_OBJECT_STRING( image, filename );
+ image->mRequest = image->mImageFactory.RegisterRequest( filename, &attributes );
- return image;
+ if( Dali::Image::Immediate == loadPol )
+ {
+ // Trigger loading of the image on a seperate resource thread as soon as it
+ // can be scheduled:
+ image->mTicket = image->mImageFactory.Load( image->mRequest.Get() );
+ image->mTicket->AddObserver( *image );
+ }
+ // else lazily load image data later, only when it is needed to draw something:
+
+ DALI_LOG_SET_OBJECT_STRING( image, filename );
+
+ return image;
+ }
}
Image* Image::New( NativeImage& nativeImg, LoadPolicy loadPol, ReleasePolicy releasePol )
}
}
+Vector2 Image::GetNaturalSize() const
+{
+ return Vector2( mWidth, mHeight );
+}
+
void Image::Connect()
{
++mConnectionCount;
}
}
+bool Image::IsNinePatchFileName( std::string filename )
+{
+ bool match = false;
+
+ std::string::const_reverse_iterator iter = filename.rbegin();
+ enum { SUFFIX, HASH, HASH_DOT, DONE } state = SUFFIX;
+ while(iter < filename.rend() && state != DONE)
+ {
+ switch(state)
+ {
+ case SUFFIX:
+ {
+ if(*iter == '.')
+ {
+ state = HASH;
+ }
+ else if(!isalnum(*iter))
+ {
+ state = DONE;
+ }
+ }
+ break;
+ case HASH:
+ {
+ if( *iter == '#' || *iter == '9' )
+ {
+ state = HASH_DOT;
+ }
+ else
+ {
+ state = DONE;
+ }
+ }
+ break;
+ case HASH_DOT:
+ {
+ if(*iter == '.')
+ {
+ match = true;
+ }
+ state = DONE; // Stop testing characters
+ }
+ break;
+ case DONE:
+ {
+ }
+ break;
+ }
+ iter++;
+ }
+ return match;
+}
+
+
} // namespace Internal
} // namespace Dali