X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Frenderers%2Fnpatch%2Fnpatch-renderer.cpp;h=e13e85d97f3ed961534fb5e59385063409b570b3;hb=refs%2Fchanges%2F31%2F49931%2F33;hp=cd2346641b4ececa083b467c755e51ff49952c8b;hpb=4bb73208b381ac496ea18f79700d41038b4e7c12;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.cpp b/dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.cpp index cd23466..e13e85d 100644 --- a/dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.cpp +++ b/dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.cpp @@ -41,11 +41,11 @@ namespace Internal namespace { -const char * const RENDERER_TYPE("renderer-type"); -const char * const RENDERER_TYPE_VALUE("n-patch-renderer"); +const char * const RENDERER_TYPE("rendererType"); +const char * const RENDERER_TYPE_VALUE("nPatchRenderer"); -const char * const IMAGE_URL_NAME("image-url"); -const char * const BORDER_ONLY("border-only"); +const char * const IMAGE_URL_NAME("imageUrl"); +const char * const BORDER_ONLY("borderOnly"); std::string TEXTURE_UNIFORM_NAME = "sTexture"; @@ -172,7 +172,7 @@ void AddVertex( Vector< Vector2 >& vertices, unsigned int x, unsigned int y ) vertices.PushBack( Vector2( x, y ) ); } -void RegisterStretchProperties( Sampler& sampler, const char * uniformName, const NinePatchImage::StretchRanges& stretchPixels, uint16_t imageExtent) +void RegisterStretchProperties( Material& material, const char * uniformName, const NinePatchImage::StretchRanges& stretchPixels, uint16_t imageExtent) { uint16_t prevEnd = 0; uint16_t prevFix = 0; @@ -188,7 +188,7 @@ void RegisterStretchProperties( Sampler& sampler, const char * uniformName, cons std::stringstream uniform; uniform << uniformName << "[" << i << "]"; - sampler.RegisterProperty( uniform.str(), Vector2( fix, stretch ) ); + material.RegisterProperty( uniform.str(), Vector2( fix, stretch ) ); prevEnd = end; prevFix = fix; @@ -199,7 +199,7 @@ void RegisterStretchProperties( Sampler& sampler, const char * uniformName, cons prevFix += imageExtent - prevEnd; std::stringstream uniform; uniform << uniformName << "[" << i << "]"; - sampler.RegisterProperty( uniform.str(), Vector2( prevFix, prevStretch ) ); + material.RegisterProperty( uniform.str(), Vector2( prevFix, prevStretch ) ); } } @@ -217,12 +217,12 @@ NPatchRenderer::~NPatchRenderer() { } -void NPatchRenderer::DoInitialize( const Property::Map& propertyMap ) +void NPatchRenderer::DoInitialize( Actor& actor, const Property::Map& propertyMap ) { Property::Value* imageURLValue = propertyMap.Find( IMAGE_URL_NAME ); if( imageURLValue ) { - //Read the border-only property first since InitialiseFromImage relies on mBorderOnly to be properly set + //Read the borderOnly property first since InitialiseFromImage relies on mBorderOnly to be properly set Property::Value* borderOnlyValue = propertyMap.Find( BORDER_ONLY ); if( borderOnlyValue ) { @@ -232,11 +232,11 @@ void NPatchRenderer::DoInitialize( const Property::Map& propertyMap ) if( imageURLValue->Get( mImageUrl ) ) { NinePatchImage nPatch = NinePatchImage::New( mImageUrl ); - InitialiseFromImage( nPatch ); + InitializeFromImage( nPatch ); } else { - CreateErrorImage(); + InitializeFromBrokenImage(); DALI_LOG_ERROR( "The property '%s' is not a string\n", IMAGE_URL_NAME ); } } @@ -248,17 +248,17 @@ void NPatchRenderer::GetNaturalSize( Vector2& naturalSize ) const { naturalSize.x = mImage.GetWidth(); naturalSize.y = mImage.GetHeight(); - return; } else if( !mImageUrl.empty() ) { ImageDimensions dimentions = ResourceImage::GetImageSize( mImageUrl ); naturalSize.x = dimentions.GetWidth(); naturalSize.y = dimentions.GetHeight(); - return; } - - naturalSize = Vector2::ZERO; + else + { + naturalSize = Vector2::ZERO; + } } void NPatchRenderer::SetClipRect( const Rect& clipRect ) @@ -272,10 +272,9 @@ void NPatchRenderer::SetOffset( const Vector2& offset ) //ToDo: renderer applies the offset } -void NPatchRenderer::InitializeRenderer( Renderer& renderer ) +Geometry NPatchRenderer::CreateGeometry() { Geometry geometry; - Shader shader; if( mStretchPixelsX.Size() == 1 && mStretchPixelsY.Size() == 1 ) { if( !mBorderOnly ) @@ -296,7 +295,21 @@ void NPatchRenderer::InitializeRenderer( Renderer& renderer ) mFactoryCache.SaveGeometry( RendererFactoryCache::NINE_PATCH_BORDER_GEOMETRY, geometry ); } } + } + else if( mStretchPixelsX.Size() > 0 || mStretchPixelsY.Size() > 0) + { + Uint16Pair gridSize( 2 * mStretchPixelsX.Size() + 1, 2 * mStretchPixelsY.Size() + 1 ); + geometry = !mBorderOnly ? CreateGeometry( gridSize ) : CreateGeometryBorder( gridSize ); + } + + return geometry; +} +Shader NPatchRenderer::CreateShader() +{ + Shader shader; + if( mStretchPixelsX.Size() == 1 && mStretchPixelsY.Size() == 1 ) + { shader = mFactoryCache.GetShader( RendererFactoryCache::NINE_PATCH_SHADER ); if( !shader ) { @@ -306,9 +319,6 @@ void NPatchRenderer::InitializeRenderer( Renderer& renderer ) } else if( mStretchPixelsX.Size() > 0 || mStretchPixelsY.Size() > 0) { - Uint16Pair gridSize( 2 * mStretchPixelsX.Size() + 1, 2 * mStretchPixelsY.Size() + 1 ); - geometry = !mBorderOnly ? CreateGeometry( gridSize ) : CreateGeometryBorder( gridSize ); - std::stringstream vertexShader; vertexShader << "#define FACTOR_SIZE_X " << mStretchPixelsX.Size() + 2 << "\n" << "#define FACTOR_SIZE_Y " << mStretchPixelsY.Size() + 2 << "\n" @@ -316,28 +326,25 @@ void NPatchRenderer::InitializeRenderer( Renderer& renderer ) shader = Shader::New( vertexShader.str(), FRAGMENT_SHADER ); } - else + return shader; +} + +void NPatchRenderer::InitializeRenderer() +{ + Geometry geometry = CreateGeometry(); + Shader shader = CreateShader(); + + if( !geometry || !shader ) { DALI_LOG_ERROR("The 9 patch image '%s' doesn't have any valid stretch borders and so is not a valid 9 patch image\n", mImageUrl.c_str() ); - CreateErrorImage(); + InitializeFromBrokenImage(); } - if( !renderer ) - { - Material material = Material::New( shader ); - renderer = Renderer::New( geometry, material ); - } - else - { - mImpl->mRenderer.SetGeometry( geometry ); - Material material = mImpl->mRenderer.GetMaterial(); - if( material ) - { - material.SetShader( shader ); - } - } + Material material = Material::New( shader ); + mImpl->mRenderer = Renderer::New( geometry, material ); } + void NPatchRenderer::DoSetOnStage( Actor& actor ) { if( !mCroppedImage ) @@ -345,16 +352,17 @@ void NPatchRenderer::DoSetOnStage( Actor& actor ) if( !mImageUrl.empty() ) { NinePatchImage nPatch = NinePatchImage::New( mImageUrl ); - InitialiseFromImage( nPatch ); + InitializeFromImage( nPatch ); } else if( mImage ) { - InitialiseFromImage( mImage ); + InitializeFromImage( mImage ); } - - InitializeRenderer( mImpl->mRenderer ); } + //initialize the renderer after initializing from the image since we need to know the grid size from the image before creating the geometry + InitializeRenderer(); + if( mCroppedImage ) { ApplyImageToSampler(); @@ -364,6 +372,8 @@ void NPatchRenderer::DoSetOnStage( Actor& actor ) void NPatchRenderer::DoSetOffStage( Actor& actor ) { mCroppedImage.Reset(); + actor.RemoveRenderer( mImpl->mRenderer ); + mImpl->mRenderer.Reset(); } void NPatchRenderer::DoCreatePropertyMap( Property::Map& map ) const @@ -381,8 +391,52 @@ void NPatchRenderer::DoCreatePropertyMap( Property::Map& map ) const map.Insert( BORDER_ONLY, mBorderOnly ); } +void NPatchRenderer::ChangeRenderer( bool oldBorderOnly, size_t oldGridX, size_t oldGridY ) +{ + //check to see if the border style has changed + + bool borderOnlyChanged = oldBorderOnly != mBorderOnly; + bool gridChanged = oldGridX != mStretchPixelsX.Size() || oldGridY != mStretchPixelsY.Size(); + + if( borderOnlyChanged || gridChanged ) + { + Geometry geometry = CreateGeometry(); + if( geometry ) + { + mImpl->mRenderer.SetGeometry( geometry ); + } + else + { + InitializeFromBrokenImage(); + } + } + + if( gridChanged ) + { + Shader shader = CreateShader(); + Material material; + if( shader ) + { + material = mImpl->mRenderer.GetMaterial(); + if( material ) + { + material.SetShader( shader ); + } + } + + if( !material ) + { + InitializeFromBrokenImage(); + } + } +} + void NPatchRenderer::SetImage( const std::string& imageUrl, bool borderOnly ) { + bool oldBorderOnly = mBorderOnly; + size_t oldGridX = mStretchPixelsX.Size(); + size_t oldGridY = mStretchPixelsY.Size(); + mBorderOnly = borderOnly; mImage.Reset(); if( mImageUrl == imageUrl ) @@ -391,17 +445,26 @@ void NPatchRenderer::SetImage( const std::string& imageUrl, bool borderOnly ) } mImageUrl = imageUrl; - NinePatchImage nPatch = NinePatchImage::New( mImageUrl ); - InitialiseFromImage( nPatch ); - - if( mCroppedImage && mImpl->mIsOnStage ) + if( mImpl->mRenderer ) { - ApplyImageToSampler(); + NinePatchImage nPatch = NinePatchImage::New( mImageUrl ); + InitializeFromImage( nPatch ); + + ChangeRenderer( oldBorderOnly, oldGridX, oldGridY ); + + if( mCroppedImage ) + { + ApplyImageToSampler(); + } } } void NPatchRenderer::SetImage( NinePatchImage image, bool borderOnly ) { + bool oldBorderOnly = mBorderOnly; + size_t oldGridX = mStretchPixelsX.Size(); + size_t oldGridY = mStretchPixelsY.Size(); + mBorderOnly = borderOnly; mImageUrl.empty(); if( mImage == image ) @@ -410,21 +473,25 @@ void NPatchRenderer::SetImage( NinePatchImage image, bool borderOnly ) } mImage = image; - InitialiseFromImage( mImage ); - - if( mCroppedImage && mImpl->mIsOnStage ) + if( mImpl->mRenderer ) { - ApplyImageToSampler(); + InitializeFromImage( mImage ); + ChangeRenderer( oldBorderOnly, oldGridX, oldGridY ); + + if( mCroppedImage ) + { + ApplyImageToSampler(); + } } } -void NPatchRenderer::InitialiseFromImage( NinePatchImage nPatch ) +void NPatchRenderer::InitializeFromImage( NinePatchImage nPatch ) { mCroppedImage = nPatch.CreateCroppedBufferImage(); if( !mCroppedImage ) { DALI_LOG_ERROR("'%s' specify a valid 9 patch image\n", mImageUrl.c_str() ); - CreateErrorImage(); + InitializeFromBrokenImage(); return; } @@ -434,27 +501,15 @@ void NPatchRenderer::InitialiseFromImage( NinePatchImage nPatch ) mStretchPixelsY = nPatch.GetStretchPixelsY(); } -void NPatchRenderer::CreateErrorImage() +void NPatchRenderer::InitializeFromBrokenImage() { - mImageSize = ImageDimensions( 1, 1 ); - - BufferImage bufferImage = BufferImage::New( mImageSize.GetWidth(), mImageSize.GetHeight(), Pixel::RGBA8888 ); - mCroppedImage = bufferImage; - PixelBuffer* pixbuf = bufferImage.GetBuffer(); - - for( size_t i = 0; i < mImageSize.GetWidth() * mImageSize.GetHeight() * 4u; ) - { - pixbuf[ i++ ] = 0; - pixbuf[ i++ ] = 0; - pixbuf[ i++ ] = 0; - pixbuf[ i++ ] = 255; - } + mCroppedImage = RendererFactory::GetBrokenRendererImage(); + mImageSize = ImageDimensions( mCroppedImage.GetWidth(), mCroppedImage.GetHeight() ); mStretchPixelsX.Clear(); mStretchPixelsX.PushBack( Uint16Pair( 0, mImageSize.GetWidth() ) ); mStretchPixelsY.Clear(); mStretchPixelsY.PushBack( Uint16Pair( 0, mImageSize.GetHeight() ) ); - } void NPatchRenderer::ApplyImageToSampler() @@ -462,20 +517,14 @@ void NPatchRenderer::ApplyImageToSampler() Material material = mImpl->mRenderer.GetMaterial(); if( material ) { - Sampler sampler; - for( std::size_t i = 0; i < material.GetNumberOfSamplers(); ++i ) + int index = material.GetTextureIndex( TEXTURE_UNIFORM_NAME ); + if( index > -1 ) { - sampler = material.GetSamplerAt( i ); - if( sampler.GetUniformName() == TEXTURE_UNIFORM_NAME ) - { - sampler.SetImage( mCroppedImage ); - break; - } + material.SetTextureImage( index, mCroppedImage ); } - if( !sampler ) + else { - sampler = Sampler::New( mCroppedImage, TEXTURE_UNIFORM_NAME ); - material.AddSampler( sampler ); + material.AddTexture( mCroppedImage, TEXTURE_UNIFORM_NAME ); } if( mStretchPixelsX.Size() == 1 && mStretchPixelsY.Size() == 1 ) @@ -487,18 +536,18 @@ void NPatchRenderer::ApplyImageToSampler() uint16_t stretchWidth = stretchX.GetY() - stretchX.GetX(); uint16_t stretchHeight = stretchY.GetY() - stretchY.GetX(); - sampler.RegisterProperty( "uFixed[0]", Vector2::ZERO ); - sampler.RegisterProperty( "uFixed[1]", Vector2( stretchX.GetX(), stretchY.GetX()) ); - sampler.RegisterProperty( "uFixed[2]", Vector2( mImageSize.GetWidth() - stretchWidth, mImageSize.GetHeight() - stretchHeight ) ); - sampler.RegisterProperty( "uStretchTotal", Vector2( stretchWidth, stretchHeight ) ); + material.RegisterProperty( "uFixed[0]", Vector2::ZERO ); + material.RegisterProperty( "uFixed[1]", Vector2( stretchX.GetX(), stretchY.GetX()) ); + material.RegisterProperty( "uFixed[2]", Vector2( mImageSize.GetWidth() - stretchWidth, mImageSize.GetHeight() - stretchHeight ) ); + material.RegisterProperty( "uStretchTotal", Vector2( stretchWidth, stretchHeight ) ); } else { - sampler.RegisterProperty( "uNinePatchFactorsX[0]", Vector2::ZERO ); - sampler.RegisterProperty( "uNinePatchFactorsY[0]", Vector2::ZERO ); + material.RegisterProperty( "uNinePatchFactorsX[0]", Vector2::ZERO ); + material.RegisterProperty( "uNinePatchFactorsY[0]", Vector2::ZERO ); - RegisterStretchProperties( sampler, "uNinePatchFactorsX", mStretchPixelsX, mImageSize.GetWidth() ); - RegisterStretchProperties( sampler, "uNinePatchFactorsY", mStretchPixelsY, mImageSize.GetHeight() ); + RegisterStretchProperties( material, "uNinePatchFactorsX", mStretchPixelsX, mImageSize.GetWidth() ); + RegisterStretchProperties( material, "uNinePatchFactorsY", mStretchPixelsY, mImageSize.GetHeight() ); } } }