X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-ImageAtlas.cpp;h=17b44322bc1c1c48e5f736c60eb273b9a85f9392;hb=a3b69d118ee5f918a827b23ea76813a7aefad845;hp=a94585017bc211bcb257895d6bfced4502e664b3;hpb=bd75dc4cad4ce62cc9206abf19280b40825b9726;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ImageAtlas.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ImageAtlas.cpp index a945850..17b4432 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ImageAtlas.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ImageAtlas.cpp @@ -40,14 +40,35 @@ static const char* gImageNonExist = "non-exist.jpg"; const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS) +PixelData CreatePixelData( unsigned int width, unsigned int height ) +{ + unsigned int bufferSize = width*height*Pixel::GetBytesPerPixel( Pixel::RGBA8888 ); + + unsigned char* buffer= reinterpret_cast( malloc( bufferSize ) ); + PixelData pixelData = PixelData::New( buffer, bufferSize, width, height, Pixel::RGBA8888, PixelData::FREE ); + + return pixelData; +} + Rect TextureCoordinateToPixelArea( const Vector4& textureCoordinate, float size ) { Vector4 temp = textureCoordinate * size; Rect pixelArea; pixelArea.x = static_cast( temp.x ); pixelArea.y = static_cast( temp.y ); - pixelArea.width = static_cast( temp.z-temp.x+1.f ); - pixelArea.height = static_cast( temp.w-temp.y+1.f ); + pixelArea.width = static_cast( temp.z-temp.x+1.01f ); + pixelArea.height = static_cast( temp.w-temp.y+1.01f ); + + return pixelArea; +} + +Rect TextureCoordinateToPixelArea( const Vector4& textureCoordinate, float width, float height ) +{ + Rect pixelArea; + pixelArea.x = static_cast( textureCoordinate.x*width ); + pixelArea.y = static_cast( textureCoordinate.y*height); + pixelArea.width = static_cast( (textureCoordinate.z-textureCoordinate.x)*width+1.01f ); + pixelArea.height = static_cast( (textureCoordinate.w-textureCoordinate.y)*height+1.01f ); return pixelArea; } @@ -60,6 +81,22 @@ bool IsOverlap( Rect rect1, Rect rect2 ) && rect2.y < rect1.y+rect1.height; } +static unsigned int gCountOfTestFuncCall; +class TestUploadObserver : public AtlasUploadObserver +{ +public: + TestUploadObserver() + {} + + virtual ~TestUploadObserver() + {} + + void UploadCompleted() + { + gCountOfTestFuncCall++; + } +}; + } // anonymous namespace void dali_image_atlas_startup(void) @@ -191,12 +228,7 @@ int UtcDaliImageAtlasUploadP(void) Vector4 textureRect3; atlas.Upload( textureRect3, gImage_128_RGB, ImageDimensions(128, 128) ); - EventThreadCallback* eventTrigger = EventThreadCallback::Get(); - CallbackBase* callback = eventTrigger->GetCallback(); - - eventTrigger->WaitingForTrigger( 3 );// waiting until all three images are loaded - - CallbackBase::Execute( *callback ); + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 3 ), true, TEST_LOCATION ); application.SendNotification(); application.Render(RENDER_FRAME_INTERVAL); @@ -241,6 +273,94 @@ int UtcDaliImageAtlasUploadP(void) END_TEST; } +int UtcDaliImageAtlasUploadWithObserver01(void) +{ + TestApplication application; + ImageAtlas atlas = ImageAtlas::New( 200, 200 ); + + + gCountOfTestFuncCall = 0; + TestUploadObserver uploadObserver; + + Vector4 textureRect1; + atlas.Upload( textureRect1, gImage_34_RGBA, ImageDimensions(34, 34), FittingMode::DEFAULT, true, &uploadObserver ); + Vector4 textureRect2; + atlas.Upload( textureRect2, gImage_50_RGBA, ImageDimensions(50, 50), FittingMode::DEFAULT, true, NULL ); + Vector4 textureRect3; + atlas.Upload( textureRect3, gImage_128_RGB, ImageDimensions(128, 128), FittingMode::DEFAULT, true, &uploadObserver ); + + // waiting until all three images are loaded and uploaded to atlas + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 3 ), true, TEST_LOCATION ); + application.SendNotification(); + application.Render(RENDER_FRAME_INTERVAL); + + // Check that TestFunc is called twice + DALI_TEST_EQUALS( gCountOfTestFuncCall, 2, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliImageAtlasUploadWithObserver02(void) +{ + TestApplication application; + ImageAtlas atlas = ImageAtlas::New( 200, 200 ); + + gCountOfTestFuncCall = 0; + TestUploadObserver* uploadObserver = new TestUploadObserver; + + Vector4 textureRect1; + atlas.Upload( textureRect1, gImage_34_RGBA, ImageDimensions(34, 34), FittingMode::DEFAULT, true, uploadObserver ); + Vector4 textureRect2; + atlas.Upload( textureRect2, gImage_50_RGBA, ImageDimensions(50, 50), FittingMode::DEFAULT, true, uploadObserver ); + Vector4 textureRect3; + atlas.Upload( textureRect3, gImage_128_RGB, ImageDimensions(128, 128), FittingMode::DEFAULT, true, uploadObserver ); + + // destroy the object. + delete uploadObserver; + + // waiting until all three images are loaded and uploaded to atlas + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 3 ), true, TEST_LOCATION ); + + application.Render(RENDER_FRAME_INTERVAL); + application.SendNotification(); + + // Check that TestFunc is called twice + DALI_TEST_EQUALS( gCountOfTestFuncCall, 0, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliImageAtlasUploadWithObserver03(void) +{ + TestApplication application; + + gCountOfTestFuncCall = 0; + TestUploadObserver* uploadObserver = new TestUploadObserver; + + { + ImageAtlas atlas = ImageAtlas::New( 200, 200 ); + + Vector4 textureRect1; + atlas.Upload( textureRect1, gImage_34_RGBA, ImageDimensions(34, 34), FittingMode::DEFAULT, true, uploadObserver ); + Vector4 textureRect2; + atlas.Upload( textureRect2, gImage_50_RGBA, ImageDimensions(50, 50), FittingMode::DEFAULT, true, uploadObserver ); + Vector4 textureRect3; + atlas.Upload( textureRect3, gImage_128_RGB, ImageDimensions(128, 128), FittingMode::DEFAULT, true, uploadObserver ); + } + + //ImageAtlas is out of scope, so it will get destroyed + + application.Render(RENDER_FRAME_INTERVAL); + application.SendNotification(); + application.SendNotification(); + application.Render(RENDER_FRAME_INTERVAL); + + // Check that TestFunc is called twice + DALI_TEST_EQUALS( gCountOfTestFuncCall, 0, TEST_LOCATION ); + + END_TEST; +} + int UtcDaliImageAtlasRemove(void) { TestApplication application; @@ -272,20 +392,19 @@ int UtcDaliImageAtlasImageView(void) ImageView imageView1 = ImageView::New( gImage_34_RGBA, ImageDimensions(34, 34) ); ImageView imageView2 = ImageView::New( gImage_50_RGBA, ImageDimensions(50, 50) ); - Stage::GetCurrent().Add( imageView1 ); - Stage::GetCurrent().Add( imageView2 ); - EventThreadCallback* eventTrigger = EventThreadCallback::Get(); - while( eventTrigger == NULL) // waiting uintil the ImageAtlas is created by ImageAtlasManager - { - usleep(10); - eventTrigger = EventThreadCallback::Get(); - } - CallbackBase* callback = eventTrigger->GetCallback(); + // ImageView doesn't do size negotiation properly: it only listens to OnSizeSet: + imageView1.SetSize( 100, 100 ); + imageView2.SetSize( 100, 100 ); + imageView1.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); + imageView2.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); - eventTrigger->WaitingForTrigger( 2 );// waiting until both images are loaded + application.GetPlatform().SetClosestImageSize( Vector2(34, 34) ); + Stage::GetCurrent().Add( imageView1 ); + application.GetPlatform().SetClosestImageSize( Vector2(50, 50) ); + Stage::GetCurrent().Add( imageView2 ); - CallbackBase::Execute( *callback ); + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION ); application.SendNotification(); application.Render(RENDER_FRAME_INTERVAL); @@ -316,10 +435,10 @@ int UtcDaliImageAtlasImageView(void) application.SendNotification(); application.Render(RENDER_FRAME_INTERVAL); ImageView imageView3 = ImageView::New( gImage_128_RGB, ImageDimensions(100, 100) ); + application.GetPlatform().SetClosestImageSize( Vector2(100, 100) ); Stage::GetCurrent().Add( imageView3 ); - eventTrigger->WaitingForTrigger( 3 ); // waiting for the third image loaded - CallbackBase::Execute( *callback ); + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 3 ), true, TEST_LOCATION ); application.SendNotification(); application.Render(RENDER_FRAME_INTERVAL); @@ -336,3 +455,56 @@ int UtcDaliImageAtlasImageView(void) END_TEST; } + +int UtcDaliImageAtlasPackToAtlas(void) +{ + ToolkitTestApplication application; + + std::vector pixelDataContainer; + pixelDataContainer.push_back( CreatePixelData( 20, 30 ) ); + pixelDataContainer.push_back( CreatePixelData( 10, 10 ) ); + pixelDataContainer.push_back( CreatePixelData( 45, 30 ) ); + pixelDataContainer.push_back( CreatePixelData( 20, 20 ) ); + + Dali::Vector textureRects; + Texture texture = ImageAtlas::PackToAtlas( pixelDataContainer, textureRects ); + + // -------------- + // | | + // | 45*30 | +// | | +// -------------- +// | 20 | | 20*20 +// | * |____| +// | 30 | | 10*10 +// -------- + + DALI_TEST_EQUALS( texture.GetWidth(), 45, TEST_LOCATION ); + DALI_TEST_EQUALS( texture.GetHeight(), 60, TEST_LOCATION ); + + Rect pixelArea = TextureCoordinateToPixelArea(textureRects[0], texture.GetWidth(), texture.GetHeight()); + DALI_TEST_EQUALS( pixelArea.x, 0, TEST_LOCATION ); + DALI_TEST_EQUALS( pixelArea.y, 30, TEST_LOCATION ); + DALI_TEST_EQUALS( pixelArea.width, 20, TEST_LOCATION ); + DALI_TEST_EQUALS( pixelArea.height, 30, TEST_LOCATION ); + + pixelArea = TextureCoordinateToPixelArea(textureRects[1], texture.GetWidth(), texture.GetHeight()); + DALI_TEST_EQUALS( pixelArea.x, 20, TEST_LOCATION ); + DALI_TEST_EQUALS( pixelArea.y, 50, TEST_LOCATION ); + DALI_TEST_EQUALS( pixelArea.width, 10, TEST_LOCATION ); + DALI_TEST_EQUALS( pixelArea.height, 10, TEST_LOCATION ); + + pixelArea = TextureCoordinateToPixelArea(textureRects[2], texture.GetWidth(), texture.GetHeight()); + DALI_TEST_EQUALS( pixelArea.x, 0, TEST_LOCATION ); + DALI_TEST_EQUALS( pixelArea.y, 0, TEST_LOCATION ); + DALI_TEST_EQUALS( pixelArea.width, 45, TEST_LOCATION ); + DALI_TEST_EQUALS( pixelArea.height, 30, TEST_LOCATION ); + + pixelArea = TextureCoordinateToPixelArea(textureRects[3], texture.GetWidth(), texture.GetHeight()); + DALI_TEST_EQUALS( pixelArea.x, 20, TEST_LOCATION ); + DALI_TEST_EQUALS( pixelArea.y, 30, TEST_LOCATION ); + DALI_TEST_EQUALS( pixelArea.width, 20, TEST_LOCATION ); + DALI_TEST_EQUALS( pixelArea.height, 20, TEST_LOCATION ); + + END_TEST; +}