X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-scroller.cpp;h=c80cf7d05e2097d688ea32e81b8e76adba859071;hp=d1a5d2f911e6cf9f0063b6c2115e23a07e57ca0c;hb=6efee146b4c4e40df991b9e3425f97c66150df10;hpb=7bc9bb47cb9c552982e9144b202861190eeadc96 diff --git a/dali-toolkit/internal/text/text-scroller.cpp b/dali-toolkit/internal/text/text-scroller.cpp index d1a5d2f..c80cf7d 100644 --- a/dali-toolkit/internal/text/text-scroller.cpp +++ b/dali-toolkit/internal/text/text-scroller.cpp @@ -51,7 +51,9 @@ const char* VERTEX_SHADER_SCROLL = DALI_COMPOSE_SHADER( attribute mediump vec2 aPosition;\n varying highp vec2 vTexCoord;\n varying highp float vRatio;\n - uniform mediump mat4 uMvpMatrix;\n + uniform mediump mat4 uModelMatrix;\n + uniform mediump mat4 uViewMatrix;\n + uniform mediump mat4 uProjection;\n uniform mediump vec3 uSize;\n uniform mediump float uDelta;\n uniform mediump vec2 uTextureSize; @@ -61,25 +63,29 @@ const char* VERTEX_SHADER_SCROLL = DALI_COMPOSE_SHADER( void main()\n {\n {\n - mediump vec4 vertexPosition = vec4(aPosition*uSize.xy, 0.0, 1.0);\n + highp vec4 vertexPosition = vec4(aPosition*uSize.xy, 0.0, 1.0);\n + vertexPosition = uViewMatrix * uModelMatrix * vertexPosition ;\n + vertexPosition.x = floor( vertexPosition.x ) + 0.5; + vertexPosition.y = floor( vertexPosition.y ) + 0.5; float smallTextPadding = max(uSize.x - uTextureSize.x, 0. );\n float gap = max( uGap, smallTextPadding );\n - vTexCoord.x = ( uDelta + ( uRtl * ( uTextureSize.x - uSize.x ) ) + ( aPosition.x * uSize.x ) )/ ( uTextureSize.x+gap );\n - vTexCoord.y = aPosition.y;\n + float delta = floor ( uDelta ) + 0.5; + vTexCoord.x = ( delta + ( uRtl * ( uTextureSize.x - uSize.x ) ) + ( aPosition.x * uSize.x ) )/ ( uTextureSize.x + gap );\n + vTexCoord.y = ( 0.5 + floor( aPosition.y * uSize.y ) )/ ( uTextureSize.y ) ;\n vRatio = uTextureSize.x / ( uTextureSize.x + gap );\n - gl_Position = uMvpMatrix * vertexPosition;\n + gl_Position = uProjection * vertexPosition; }\n }\n ); const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER( - varying mediump vec2 vTexCoord;\n + varying highp vec2 vTexCoord;\n varying highp float vRatio;\n uniform sampler2D sTexture;\n \n void main()\n {\n - mediump vec2 texCoord;\n + highp vec2 texCoord;\n texCoord.y = vTexCoord.y;\n texCoord.x = fract( vTexCoord.x ) / vRatio;\n if ( texCoord.x > 1.0 )\n @@ -166,10 +172,10 @@ void CreateGeometry( Geometry& geometry ) */ void CreateRenderer( FrameBufferImage frameBufferImage, Dali::Renderer& renderer ) { - Shader shader = Shader::New( VERTEX_SHADER_SCROLL , FRAGMENT_SHADER, Shader::HINT_NONE ); + Shader shader = Shader::New( VERTEX_SHADER_SCROLL , FRAGMENT_SHADER, Shader::Hint::NONE ); Sampler sampler = Sampler::New(); - sampler.SetFilterMode(FilterMode::NEAREST, FilterMode::NEAREST ); + sampler.SetFilterMode(FilterMode::LINEAR, FilterMode::LINEAR ); TextureSet textureSet = TextureSet::New(); TextureSetImage( textureSet, 0u, frameBufferImage ); @@ -228,7 +234,23 @@ void TextScroller::SetLoopCount( int loopCount ) if ( loopCount == 0 ) // Request to stop looping { DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextScroller::SetLoopCount Single loop forced\n" ); - mScrollAnimation.SetLoopCount( 1 ); // As animation already playing this allows the current animation to finish instead of trying to stop mid-way + switch( mStopMode ) + { + case DevelTextLabel::AutoScrollStopMode::IMMEDIATE: + { + mScrollAnimation.Stop(); + break; + } + case DevelTextLabel::AutoScrollStopMode::FINISH_LOOP: + { + mScrollAnimation.SetLoopCount( 1 ); // As animation already playing this allows the current animation to finish instead of trying to stop mid-way + break; + } + default: + { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Undifined AutoScrollStopMode\n" ); + } + } } } DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextScroller::SetLoopCount [%d] Status[%s]\n", mLoopCount, (loopCount)?"looping":"stop" ); @@ -239,6 +261,27 @@ int TextScroller::GetLoopCount() const return mLoopCount; } +void TextScroller::SetLoopDelay( float delay ) +{ + mLoopDelay = delay; +} + +float TextScroller::GetLoopDelay() const +{ + return mLoopDelay; +} + +void TextScroller::SetStopMode( DevelTextLabel::AutoScrollStopMode::Type stopMode ) +{ + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextScroller::SetAutoScrollStopMode [%s]\n",(stopMode == DevelTextLabel::AutoScrollStopMode::IMMEDIATE)?"IMMEDIATE":"FINISH_LOOP" ); + mStopMode = stopMode; +} + +DevelTextLabel::AutoScrollStopMode::Type TextScroller::GetStopMode() const +{ + return mStopMode; +} + Actor TextScroller::GetSourceCamera() const { return mOffscreenCameraActor; @@ -253,7 +296,9 @@ TextScroller::TextScroller( ScrollerInterface& scrollerInterface ) : mScrollerIn mScrollDeltaIndex( Property::INVALID_INDEX ), mScrollSpeed( MINIMUM_SCROLL_SPEED ), mLoopCount( 1 ), - mWrapGap( 0.0f ) + mLoopDelay( 0.0f ), + mWrapGap( 0.0f ), + mStopMode( DevelTextLabel::AutoScrollStopMode::FINISH_LOOP ) { DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextScroller Default Constructor\n" ); } @@ -268,7 +313,14 @@ void TextScroller::SetParameters( Actor sourceActor, const Size& controlSize, co DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextScroller::SetParameters controlSize[%f,%f] offscreenSize[%f,%f] direction[%d] alignmentOffset[%f]\n", controlSize.x, controlSize.y, offScreenSize.x, offScreenSize.y, direction, alignmentOffset ); - FrameBufferImage offscreenRenderTargetForText = FrameBufferImage::New( offScreenSize.width, offScreenSize.height, Pixel::RGBA8888, Dali::Image::UNUSED ); + CleanUp(); // If already scrolling then restart with new parameters + + if ( mScrollAnimation ) + { + mScrollAnimation.Clear(); + } + + FrameBufferImage offscreenRenderTargetForText = FrameBufferImage::New( offScreenSize.width, offScreenSize.height, Pixel::RGBA8888 ); Renderer renderer; CreateCameraActor( offScreenSize, mOffscreenCameraActor ); @@ -320,7 +372,7 @@ void TextScroller::StartScrolling( float scrollAmount, float scrollDuration, int DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextScroller::StartScrolling scrollAmount[%f] scrollDuration[%f], loop[%d] speed[%d]\n", scrollAmount, scrollDuration, loopCount, mScrollSpeed ); mScrollAnimation = Animation::New( scrollDuration ); - mScrollAnimation.AnimateTo( Property( mScrollingTextActor, mScrollDeltaIndex ), scrollAmount ); + mScrollAnimation.AnimateTo( Property( mScrollingTextActor, mScrollDeltaIndex ), scrollAmount, TimePeriod( mLoopDelay, scrollDuration ) ); mScrollAnimation.SetEndAction( Animation::Discard ); mScrollAnimation.SetLoopCount( loopCount ); mScrollAnimation.FinishedSignal().Connect( this, &TextScroller::AutoScrollAnimationFinished );