X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fnpatch-loader.cpp;h=f23f1cabc3236305d9c9086f87afdd91fe8b0cb7;hp=5da7bd1f5b74bdd97da8c36f03ecf1d0d3607d2f;hb=9c1520c7e421a8866e8d7481a2a2965e5b26c89e;hpb=6186bc00f41913660f342671d97d0d2973864ce3 diff --git a/dali-toolkit/internal/visuals/npatch-loader.cpp b/dali-toolkit/internal/visuals/npatch-loader.cpp index 5da7bd1..f23f1ca 100644 --- a/dali-toolkit/internal/visuals/npatch-loader.cpp +++ b/dali-toolkit/internal/visuals/npatch-loader.cpp @@ -45,6 +45,8 @@ std::size_t NPatchLoader::Load( const std::string& url, const Rect< int >& borde std::size_t hash = CalculateHash( url ); OwnerContainer< Data* >::SizeType index = UNINITIALIZED_ID; const OwnerContainer< Data* >::SizeType count = mCache.Count(); + int cachedIndex = -1; + for( ; index < count; ++index ) { if( mCache[ index ]->hash == hash ) @@ -52,10 +54,45 @@ std::size_t NPatchLoader::Load( const std::string& url, const Rect< int >& borde // hash match, check url as well in case of hash collision if( mCache[ index ]->url == url ) { - return index+1u; // valid indices are from 1 onwards + // Use cached data + if( mCache[ index ]->border == border ) + { + return index+1u; // valid indices are from 1 onwards + } + else + { + cachedIndex = index; + } } } } + + if( cachedIndex != -1 ) + { + // Same url but border is different - use the existing texture + Data* data = new Data(); + data->hash = hash; + data->url = url; + data->croppedWidth = mCache[ cachedIndex ]->croppedWidth; + data->croppedHeight = mCache[ cachedIndex ]->croppedHeight; + + data->textureSet = mCache[ cachedIndex ]->textureSet; + + NinePatchImage::StretchRanges stretchRangesX; + stretchRangesX.PushBack( Uint16Pair( border.left, data->croppedWidth - border.right ) ); + + NinePatchImage::StretchRanges stretchRangesY; + stretchRangesY.PushBack( Uint16Pair( border.top, data->croppedHeight - border.bottom ) ); + + data->stretchPixelsX = stretchRangesX; + data->stretchPixelsY = stretchRangesY; + data->border = border; + + mCache.PushBack( data ); + + return mCache.Count(); // valid ids start from 1u + } + // got to the end so no match, decode N patch and append new item to cache if( border == Rect< int >( 0, 0, 0, 0 ) ) { @@ -74,6 +111,7 @@ std::size_t NPatchLoader::Load( const std::string& url, const Rect< int >& borde data->croppedHeight = croppedImage.GetHeight(); data->stretchPixelsX = ninePatch.GetStretchPixelsX(); data->stretchPixelsY = ninePatch.GetStretchPixelsY(); + data->border = Rect< int >( 0, 0, 0, 0 ); mCache.PushBack( data ); return mCache.Count(); // valid ids start from 1u @@ -106,6 +144,7 @@ std::size_t NPatchLoader::Load( const std::string& url, const Rect< int >& borde data->stretchPixelsX = stretchRangesX; data->stretchPixelsY = stretchRangesY; + data->border = border; mCache.PushBack( data );