X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Fimages%2Fimage-impl.cpp;h=156f364ea376eaaf1ea86f33b504ca78652aac1d;hb=a2c0fdc1aa8f9d3a11e61236f6aa123dffde348f;hp=5b4f7c6c1416e01845601fd356075665bd361563;hpb=e4b4fbeed764f3252f8e99d59e12bdc85f05c5e5;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/images/image-impl.cpp b/dali/internal/event/images/image-impl.cpp index 5b4f7c6..156f364 100644 --- a/dali/internal/event/images/image-impl.cpp +++ b/dali/internal/event/images/image-impl.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include using namespace Dali::Integration; @@ -53,31 +54,39 @@ Image* Image::New() 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 ) @@ -230,6 +239,11 @@ unsigned int Image::GetHeight() const } } +Vector2 Image::GetNaturalSize() const +{ + return Vector2( mWidth, mHeight ); +} + void Image::Connect() { ++mConnectionCount; @@ -285,6 +299,60 @@ void Image::SetTicket( ResourceTicket* ticket ) } } +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