From 2b281ce2a2d3358fc9798943b920193fda6e02f8 Mon Sep 17 00:00:00 2001 From: Heeyong Song Date: Tue, 29 May 2018 18:43:23 +0900 Subject: [PATCH] Added automatic premultiplication of npatch visual images Change-Id: I9d54e66470bef8465545d59b771ae501a2a44d6b --- automated-tests/resources/heartsframe.9.png | Bin 0 -> 21722 bytes .../utc-Dali-Visuals-internal.cpp | 140 +++++++ .../src/dali-toolkit/utc-Dali-VisualFactory.cpp | 416 ++++++++------------- dali-toolkit/internal/visuals/npatch-loader.cpp | 308 ++++++++++++--- dali-toolkit/internal/visuals/npatch-loader.h | 22 +- .../internal/visuals/npatch/npatch-visual.cpp | 17 +- 6 files changed, 577 insertions(+), 326 deletions(-) create mode 100644 automated-tests/resources/heartsframe.9.png diff --git a/automated-tests/resources/heartsframe.9.png b/automated-tests/resources/heartsframe.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9313d479525b5389e7ee9da32d13d45514728715 GIT binary patch literal 21722 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 Bg@6D6 literal 0 HcmV?d00001 diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Visuals-internal.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Visuals-internal.cpp index 5a215dd..7e396e1 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Visuals-internal.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Visuals-internal.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include <../dali-toolkit/dali-toolkit-test-utils/dummy-control.h> @@ -150,3 +151,142 @@ int UtcDaliVisualSetProperties(void) END_TEST; } + +int UtcDaliNPatchBufferGetRedOffsetAndMask(void) +{ + TestApplication application; + + tet_infoline("UtcDaliNPatchBufferGetRedOffsetAndMask"); + + int byteOffset = 0; + int bitMask = 0; + + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::A8, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::L8, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::LA88, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::RGB888, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0xff ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::RGB8888, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0xff ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::RGBA8888, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0xff ); + + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::BGR8888, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 2 && bitMask == 0xff ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::BGRA8888, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 2 && bitMask == 0xff ); + + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::RGB565, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0xf8 ); + + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::BGR565, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 1 && bitMask == 0x1f ); + + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::RGBA4444, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0xf0 ); + + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::BGRA4444, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 1 && bitMask == 0xf0 ); + + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::RGBA5551, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0xf8 ); + + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::BGRA5551, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 1 && bitMask == 0x1e ); + + // Compressed formats are not supported + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::INVALID, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_R11_EAC, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SIGNED_R11_EAC, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RG11_EAC, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SIGNED_RG11_EAC, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGB8_ETC2, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ETC2, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGB8_ETC1, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGB_PVRTC_4BPPV1, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA8_ETC2_EAC, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_4x4_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_5x4_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_5x5_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_6x5_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_6x6_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_8x5_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_8x6_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_8x8_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_10x5_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_10x6_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_10x8_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_10x10_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_12x10_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_RGBA_ASTC_12x12_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + + // Not supported + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::RGB16F, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + Toolkit::Internal::NPatchBuffer::GetRedOffsetAndMask( Pixel::RGB32F, byteOffset, bitMask ); + DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0 ); + + END_TEST; +} diff --git a/automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp b/automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp index 99479c3..69df067 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp @@ -19,10 +19,11 @@ #include #include #include -#include #include #include #include +#include +#include #include "dummy-control.h" using namespace Dali; @@ -30,15 +31,17 @@ using namespace Dali::Toolkit; namespace { -typedef NinePatchImage::StretchRanges StretchRanges; +typedef Toolkit::Internal::NPatchLoader::StretchRanges StretchRanges; -const char* TEST_NPATCH_FILE_NAME = TEST_RESOURCE_DIR "/demo-tile-texture-focused.9.png"; +const char* TEST_9_PATCH_FILE_NAME = TEST_RESOURCE_DIR "/demo-tile-texture-focused.9.png"; +const char* TEST_NPATCH_FILE_NAME = TEST_RESOURCE_DIR "/heartsframe.9.png"; const char* TEST_SVG_FILE_NAME = TEST_RESOURCE_DIR "/svg1.svg"; const char* TEST_OBJ_FILE_NAME = TEST_RESOURCE_DIR "/Cube.obj"; const char* TEST_MTL_FILE_NAME = TEST_RESOURCE_DIR "/ToyRobot-Metal.mtl"; const char* TEST_SIMPLE_OBJ_FILE_NAME = TEST_RESOURCE_DIR "/Cube-Points-Only.obj"; const char* TEST_SIMPLE_MTL_FILE_NAME = TEST_RESOURCE_DIR "/ToyRobot-Metal-Simple.mtl"; const char* TEST_AUX_IMAGE = TEST_RESOURCE_DIR "/folder_appicon_empty_bg.png"; +const char* TEST_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/gallery-small-1.jpg"; // resolution: 50*50, frame count: 4, frame delay: 0.2 second for each frame const char* TEST_GIF_FILE_NAME = TEST_RESOURCE_DIR "/anim.gif"; @@ -60,156 +63,13 @@ Property::Map DefaultTransform() return transformMap; } -Integration::Bitmap* CreateBitmap( unsigned int imageWidth, unsigned int imageHeight, unsigned int initialColor, Pixel::Format pixelFormat ) -{ - Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_RETAIN ); - Integration::PixelBuffer* pixbuffer = bitmap->GetPackedPixelsProfile()->ReserveBuffer( pixelFormat, imageWidth, imageHeight, imageWidth, imageHeight ); - unsigned int bytesPerPixel = GetBytesPerPixel( pixelFormat ); - - memset( pixbuffer, initialColor, imageHeight * imageWidth * bytesPerPixel ); - - return bitmap; -} - -void InitialiseRegionsToZeroAlpha( Integration::Bitmap* image, unsigned int imageWidth, unsigned int imageHeight, Pixel::Format pixelFormat ) -{ - PixelBuffer* pixbuffer = image->GetBuffer(); - unsigned int bytesPerPixel = GetBytesPerPixel( pixelFormat ); - - for( unsigned int row = 0; row < imageWidth; ++row ) - { - unsigned int pixelOffset = row * bytesPerPixel; - pixbuffer[ pixelOffset + 3 ] = 0x00; - pixelOffset += ( imageHeight - 1 ) * imageWidth * bytesPerPixel; - pixbuffer[ pixelOffset + 3 ] = 0x00; - } - - for ( unsigned int column = 0; column < imageHeight; ++column ) - { - unsigned int pixelOffset = column * imageWidth * bytesPerPixel; - pixbuffer[ pixelOffset + 3 ] = 0x00; - pixelOffset += ( imageWidth -1 ) * bytesPerPixel; - pixbuffer[ pixelOffset + 3 ] = 0x00; - } -} - -void AddStretchRegionsToImage( Integration::Bitmap* image, unsigned int imageWidth, unsigned int imageHeight, const StretchRanges& stretchRangesX, const StretchRanges& stretchRangesY, Pixel::Format pixelFormat ) -{ - PixelBuffer* pixbuffer = image->GetBuffer(); - unsigned int bytesPerPixel = GetBytesPerPixel( pixelFormat ); - - for(StretchRanges::ConstIterator it = stretchRangesX.Begin(); it != stretchRangesX.End(); ++it) - { - const Uint16Pair& range = *it; - //since the stretch range is in the cropped image space, we need to offset by 1 to get it to the uncropped image space - for( unsigned int column = range.GetX() + 1u; column < range.GetY() + 1u; ++column ) - { - unsigned int pixelOffset = column * bytesPerPixel; - pixbuffer[ pixelOffset ] = 0x00; - pixbuffer[ pixelOffset + 1 ] = 0x00; - pixbuffer[ pixelOffset + 2 ] = 0x00; - pixbuffer[ pixelOffset + 3 ] = 0xFF; - } - } - - - for(StretchRanges::ConstIterator it = stretchRangesY.Begin(); it != stretchRangesY.End(); ++it) - { - const Uint16Pair& range = *it; - //since the stretch range is in the cropped image space, we need to offset by 1 to get it to the uncropped image space - for( unsigned int row = range.GetX() + 1u; row < range.GetY() + 1u; ++row ) - { - unsigned int pixelOffset = row * imageWidth * bytesPerPixel; - pixbuffer[ pixelOffset ] = 0x00; - pixbuffer[ pixelOffset + 1 ] = 0x00; - pixbuffer[ pixelOffset + 2 ] = 0x00; - pixbuffer[ pixelOffset + 3 ] = 0xFF; - } - } -} - -void AddChildRegionsToImage( Integration::Bitmap* image, unsigned int imageWidth, unsigned int imageHeight, const Vector4& requiredChildRegion, Pixel::Format pixelFormat ) -{ - PixelBuffer* pixbuffer = image->GetBuffer(); - unsigned int bytesPerPixel = GetBytesPerPixel( pixelFormat ); - - Integration::Bitmap::PackedPixelsProfile* srcProfile = image->GetPackedPixelsProfile(); - unsigned int bufferStride = srcProfile->GetBufferStride(); - - // Add bottom child region - for( unsigned int column = requiredChildRegion.x; column < imageWidth - requiredChildRegion.z; ++column ) - { - unsigned int pixelOffset = column * bytesPerPixel; - pixelOffset += ( imageHeight - 1 ) * bufferStride; - pixbuffer[ pixelOffset ] = 0x00; - pixbuffer[ pixelOffset + 1 ] = 0x00; - pixbuffer[ pixelOffset + 2 ] = 0x00; - pixbuffer[ pixelOffset + 3 ] = 0xFF; - } - - // Add right child region - for ( unsigned int row = requiredChildRegion.y; row < imageHeight - requiredChildRegion.w; ++row ) - { - unsigned int pixelOffset = row * bufferStride + ( imageWidth - 1 ) * bytesPerPixel; - pixbuffer[ pixelOffset ] = 0x00; - pixbuffer[ pixelOffset + 1 ] = 0x00; - pixbuffer[ pixelOffset + 2 ] = 0x00; - pixbuffer[ pixelOffset + 3 ] = 0xFF; - } -} - -Integration::ResourcePointer CustomizeNinePatch( TestApplication& application, - unsigned int ninePatchImageWidth, - unsigned int ninePatchImageHeight, - const StretchRanges& stretchRangesX, - const StretchRanges& stretchRangesY, - bool addChildRegion = false, - Vector4 requiredChildRegion = Vector4::ZERO ) -{ - TestPlatformAbstraction& platform = application.GetPlatform(); - - Pixel::Format pixelFormat = Pixel::RGBA8888; - - tet_infoline("Create Bitmap"); - platform.SetClosestImageSize(Vector2( ninePatchImageWidth, ninePatchImageHeight)); - Integration::Bitmap* bitmap = CreateBitmap( ninePatchImageWidth, ninePatchImageHeight, 0xFF, pixelFormat ); - - tet_infoline("Clear border regions"); - InitialiseRegionsToZeroAlpha( bitmap, ninePatchImageWidth, ninePatchImageHeight, pixelFormat ); - - tet_infoline("Add Stretch regions to Bitmap"); - AddStretchRegionsToImage( bitmap, ninePatchImageWidth, ninePatchImageHeight, stretchRangesX, stretchRangesY, pixelFormat ); - - if( addChildRegion ) - { - tet_infoline("Add Child regions to Bitmap"); - AddChildRegionsToImage( bitmap, ninePatchImageWidth, ninePatchImageHeight, requiredChildRegion, pixelFormat ); - } - - tet_infoline("Getting resource"); - Integration::ResourcePointer resourcePtr(bitmap); - //platform.SetResourceLoaded( 0, Dali::Integration::ResourceBitmap, resourcePtr ); - platform.SetSynchronouslyLoadedResource( resourcePtr); - - return resourcePtr; -} - void TestVisualRender( ToolkitTestApplication& application, DummyControl& actor, - Visual::Base& visual, - std::size_t expectedSamplers = 0, - ImageDimensions imageDimensions = ImageDimensions(), - Integration::ResourcePointer resourcePtr = Integration::ResourcePointer()) + Visual::Base& visual ) { DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); - if( resourcePtr ) - { - // set the image size, for test case, this needs to be set before loading started - application.GetPlatform().SetClosestImageSize( Vector2(imageDimensions.GetWidth(), imageDimensions.GetHeight()) ); - } - actor.SetSize( 200.f, 200.f ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); @@ -221,13 +81,7 @@ void TestVisualRender( ToolkitTestApplication& application, application.Render(); application.SendNotification(); - if( resourcePtr ) - { - DALI_TEST_EQUALS( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceSynchronouslyFunc ), true, TEST_LOCATION); - } - DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); - } } // namespace @@ -500,7 +354,7 @@ int UtcDaliVisualFactoryGetLinearGradientVisual(void) // A lookup texture is generated and pass to shader as sampler DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u); + TestVisualRender( application, actor, visual ); END_TEST; } @@ -537,7 +391,7 @@ int UtcDaliVisualFactoryGetRadialGradientVisual(void) // A lookup texture is generated and pass to shader as sampler DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u ); + TestVisualRender( application, actor, visual ); Matrix3 alignMatrix( radius, 0.f, 0.f, 0.f, radius, 0.f, center.x, center.y, 1.f ); alignMatrix.Invert(); @@ -577,7 +431,7 @@ int UtcDaliVisualFactoryDefaultOffsetsGradientVisual(void) // A lookup texture is generated and pass to shader as sampler DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u ); + TestVisualRender( application, actor, visual ); Stage::GetCurrent().Remove( actor ); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); @@ -585,10 +439,6 @@ int UtcDaliVisualFactoryDefaultOffsetsGradientVisual(void) END_TEST; } - - - - int UtcDaliVisualFactoryGetNPatchVisual1(void) { ToolkitTestApplication application; @@ -597,33 +447,29 @@ int UtcDaliVisualFactoryGetNPatchVisual1(void) VisualFactory factory = VisualFactory::Get(); DALI_TEST_CHECK( factory ); - const unsigned int ninePatchImageHeight = 18; - const unsigned int ninePatchImageWidth = 28; - StretchRanges stretchRangesX; - stretchRangesX.PushBack( Uint16Pair( 2, 3 ) ); - StretchRanges stretchRangesY; - stretchRangesY.PushBack( Uint16Pair( 4, 5 ) ); - Integration::ResourcePointer ninePatchResource = CustomizeNinePatch( application, ninePatchImageWidth, ninePatchImageHeight, stretchRangesX, stretchRangesY ); + // Get actual size of test image + ImageDimensions imageSize = Dali::GetClosestImageSize( TEST_9_PATCH_FILE_NAME ); Property::Map propertyMap; propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH ); - propertyMap.Insert( ImageVisual::Property::URL, TEST_NPATCH_FILE_NAME ); + propertyMap.Insert( ImageVisual::Property::URL, TEST_9_PATCH_FILE_NAME ); { tet_infoline( "whole grid" ); Visual::Base visual = factory.CreateVisual( propertyMap ); DALI_TEST_CHECK( visual ); - TestGlAbstraction& gl = application.GetGlAbstraction(); TraceCallStack& textureTrace = gl.GetTextureTrace(); textureTrace.Enable(true); DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u, - ImageDimensions(ninePatchImageWidth, ninePatchImageHeight), - ninePatchResource ); + TestVisualRender( application, actor, visual ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + + Vector2 naturalSize( 0.0f, 0.0f ); + visual.GetNaturalSize( naturalSize ); + DALI_TEST_EQUALS( naturalSize, Vector2( imageSize.GetWidth() - 2.0f, imageSize.GetHeight() - 2.0f ), TEST_LOCATION ); } propertyMap.Insert( ImageVisual::Property::BORDER_ONLY, true ); @@ -637,11 +483,13 @@ int UtcDaliVisualFactoryGetNPatchVisual1(void) textureTrace.Enable(true); DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u, - ImageDimensions(ninePatchImageWidth, ninePatchImageHeight), - ninePatchResource ); + TestVisualRender( application, actor, visual ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + + Vector2 naturalSize( 0.0f, 0.0f ); + visual.GetNaturalSize( naturalSize ); + DALI_TEST_EQUALS( naturalSize, Vector2( imageSize.GetWidth() - 2.0f, imageSize.GetHeight() - 2.0f ), TEST_LOCATION ); } END_TEST; @@ -655,6 +503,9 @@ int UtcDaliVisualFactoryGetNPatchVisual2(void) VisualFactory factory = VisualFactory::Get(); DALI_TEST_CHECK( factory ); + // Get actual size of test image + ImageDimensions imageSize = Dali::GetClosestImageSize( gImage_34_RGBA ); + Property::Map propertyMap; propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH ); propertyMap.Insert( ImageVisual::Property::URL, gImage_34_RGBA ); @@ -669,9 +520,13 @@ int UtcDaliVisualFactoryGetNPatchVisual2(void) textureTrace.Enable(true); DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u ); + TestVisualRender( application, actor, visual ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + + Vector2 naturalSize( 0.0f, 0.0f ); + visual.GetNaturalSize( naturalSize ); + DALI_TEST_EQUALS( naturalSize, Vector2( imageSize.GetWidth(), imageSize.GetHeight() ), TEST_LOCATION ); } propertyMap.Insert( ImageVisual::Property::BORDER_ONLY, true ); @@ -685,9 +540,13 @@ int UtcDaliVisualFactoryGetNPatchVisual2(void) textureTrace.Enable(true); DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u ); + TestVisualRender( application, actor, visual ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + + Vector2 naturalSize( 0.0f, 0.0f ); + visual.GetNaturalSize( naturalSize ); + DALI_TEST_EQUALS( naturalSize, Vector2( imageSize.GetWidth(), imageSize.GetHeight() ), TEST_LOCATION ); } propertyMap.Clear(); @@ -704,9 +563,13 @@ int UtcDaliVisualFactoryGetNPatchVisual2(void) textureTrace.Enable(true); DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u ); + TestVisualRender( application, actor, visual ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + + Vector2 naturalSize( 0.0f, 0.0f ); + visual.GetNaturalSize( naturalSize ); + DALI_TEST_EQUALS( naturalSize, Vector2( imageSize.GetWidth(), imageSize.GetHeight() ), TEST_LOCATION ); } END_TEST; @@ -720,22 +583,12 @@ int UtcDaliVisualFactoryGetNPatchVisual3(void) VisualFactory factory = VisualFactory::Get(); DALI_TEST_CHECK( factory ); - const unsigned int ninePatchImageWidth = 18; - const unsigned int ninePatchImageHeight = 28; - StretchRanges stretchRangesX; - stretchRangesX.PushBack( Uint16Pair( 2, 3 ) ); - stretchRangesX.PushBack( Uint16Pair( 5, 7 ) ); - stretchRangesX.PushBack( Uint16Pair( 12, 15 ) ); - StretchRanges stretchRangesY; - stretchRangesY.PushBack( Uint16Pair( 4, 5 ) ); - stretchRangesY.PushBack( Uint16Pair( 8, 12 ) ); - stretchRangesY.PushBack( Uint16Pair( 15, 16 ) ); - stretchRangesY.PushBack( Uint16Pair( 25, 27 ) ); - Integration::ResourcePointer ninePatchResource = CustomizeNinePatch( application, ninePatchImageWidth, ninePatchImageHeight, stretchRangesX, stretchRangesY ); + // Get actual size of test image + ImageDimensions imageSize = Dali::GetClosestImageSize( TEST_NPATCH_FILE_NAME ); Property::Map propertyMap; propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH ); - propertyMap.Insert( ImageVisual::Property::URL, TEST_NPATCH_FILE_NAME ); + propertyMap.Insert( ImageVisual::Property::URL, TEST_NPATCH_FILE_NAME ); { Visual::Base visual = factory.CreateVisual( propertyMap ); DALI_TEST_CHECK( visual ); @@ -745,14 +598,16 @@ int UtcDaliVisualFactoryGetNPatchVisual3(void) textureTrace.Enable(true); DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u, - ImageDimensions(ninePatchImageWidth, ninePatchImageHeight), - ninePatchResource ); + TestVisualRender( application, actor, visual ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); Stage::GetCurrent().Remove( actor ); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); + + Vector2 naturalSize( 0.0f, 0.0f ); + visual.GetNaturalSize( naturalSize ); + DALI_TEST_EQUALS( naturalSize, Vector2( imageSize.GetWidth() - 2.0f, imageSize.GetHeight() - 2.0f ), TEST_LOCATION ); } propertyMap.Insert( ImageVisual::Property::BORDER_ONLY, true ); @@ -765,13 +620,14 @@ int UtcDaliVisualFactoryGetNPatchVisual3(void) TraceCallStack& textureTrace = gl.GetTextureTrace(); textureTrace.Enable(true); DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u, - ImageDimensions(ninePatchImageWidth, ninePatchImageHeight), - ninePatchResource ); - + TestVisualRender( application, actor, visual ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + Vector2 naturalSize( 0.0f, 0.0f ); + visual.GetNaturalSize( naturalSize ); + DALI_TEST_EQUALS( naturalSize, Vector2( imageSize.GetWidth() - 2.0f, imageSize.GetHeight() - 2.0f ), TEST_LOCATION ); + Stage::GetCurrent().Remove( actor ); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); } @@ -782,20 +638,15 @@ int UtcDaliVisualFactoryGetNPatchVisual3(void) int UtcDaliVisualFactoryGetNPatchVisual4(void) { ToolkitTestApplication application; - tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual3: Request 9-patch visual with an image url" ); + tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual4: Request 9-patch visual with an image url" ); + + // Get actual size of test image + ImageDimensions imageSize = Dali::GetClosestImageSize( TEST_9_PATCH_FILE_NAME ); VisualFactory factory = VisualFactory::Get(); DALI_TEST_CHECK( factory ); - const unsigned int ninePatchImageHeight = 18; - const unsigned int ninePatchImageWidth = 28; - StretchRanges stretchRangesX; - stretchRangesX.PushBack( Uint16Pair( 2, 3 ) ); - StretchRanges stretchRangesY; - stretchRangesY.PushBack( Uint16Pair( 4, 5 ) ); - Integration::ResourcePointer ninePatchResource = CustomizeNinePatch( application, ninePatchImageWidth, ninePatchImageHeight, stretchRangesX, stretchRangesY ); - - Visual::Base visual = factory.CreateVisual( TEST_NPATCH_FILE_NAME, ImageDimensions() ); + Visual::Base visual = factory.CreateVisual( TEST_9_PATCH_FILE_NAME, ImageDimensions() ); DALI_TEST_CHECK( visual ); TestGlAbstraction& gl = application.GetGlAbstraction(); @@ -803,19 +654,27 @@ int UtcDaliVisualFactoryGetNPatchVisual4(void) textureTrace.Enable(true); DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u, - ImageDimensions(ninePatchImageWidth, ninePatchImageHeight), - ninePatchResource ); + TestVisualRender( application, actor, visual ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + Vector2 naturalSize( 0.0f, 0.0f ); + visual.GetNaturalSize( naturalSize ); + DALI_TEST_EQUALS( naturalSize, Vector2( imageSize.GetWidth() - 2.0f, imageSize.GetHeight() - 2.0f ), TEST_LOCATION ); + + textureTrace.Reset(); - ResourceImage image = ResourceImage::New(TEST_NPATCH_FILE_NAME); + ResourceImage image = ResourceImage::New( TEST_9_PATCH_FILE_NAME ); Visual::Base nPatchVisual = factory.CreateVisual( image ); - Vector2 controlSize( 20.f, 30.f ), naturalSize(0,0); - nPatchVisual.SetTransformAndSize(DefaultTransform(), controlSize ); + + DummyControl actor1 = DummyControl::New(true); + TestVisualRender( application, actor1, nPatchVisual ); + + DALI_TEST_EQUALS( textureTrace.CountMethod("BindTexture"), 0, TEST_LOCATION ); // The same texture should be used with the first visual. + + naturalSize = Vector2( 0.0f, 0.0f ); nPatchVisual.GetNaturalSize( naturalSize ); - DALI_TEST_EQUALS( naturalSize, Vector2( ninePatchImageWidth-2, ninePatchImageHeight-2 ), TEST_LOCATION ); + DALI_TEST_EQUALS( naturalSize, Vector2( imageSize.GetWidth() - 2.0f, imageSize.GetHeight() - 2.0f ), TEST_LOCATION ); END_TEST; } @@ -823,28 +682,14 @@ int UtcDaliVisualFactoryGetNPatchVisual4(void) int UtcDaliVisualFactoryGetNPatchVisual5(void) { ToolkitTestApplication application; - tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual4: Request n-patch visual with an image url" ); + tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual5: Request n-patch visual with an image url" ); + + // Get actual size of test image + ImageDimensions imageSize = Dali::GetClosestImageSize( TEST_NPATCH_FILE_NAME ); VisualFactory factory = VisualFactory::Get(); DALI_TEST_CHECK( factory ); - const unsigned int ninePatchImageHeight = 18; - const unsigned int ninePatchImageWidth = 28; - StretchRanges stretchRangesX; - stretchRangesX.PushBack( Uint16Pair( 2, 3 ) ); - stretchRangesX.PushBack( Uint16Pair( 5, 7 ) ); - stretchRangesX.PushBack( Uint16Pair( 12, 15 ) ); - StretchRanges stretchRangesY; - stretchRangesY.PushBack( Uint16Pair( 4, 5 ) ); - stretchRangesY.PushBack( Uint16Pair( 8, 12 ) ); - stretchRangesY.PushBack( Uint16Pair( 15, 16 ) ); - stretchRangesY.PushBack( Uint16Pair( 25, 27 ) ); - Integration::ResourcePointer ninePatchResource = CustomizeNinePatch( application, - ninePatchImageWidth, - ninePatchImageHeight, - stretchRangesX, - stretchRangesY ); - Visual::Base visual = factory.CreateVisual( TEST_NPATCH_FILE_NAME, ImageDimensions() ); DALI_TEST_CHECK( visual ); @@ -853,15 +698,83 @@ int UtcDaliVisualFactoryGetNPatchVisual5(void) textureTrace.Enable(true); DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u, - ImageDimensions(ninePatchImageWidth, ninePatchImageHeight), - ninePatchResource ); + TestVisualRender( application, actor, visual ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + Vector2 naturalSize( 0.0f, 0.0f ); + visual.GetNaturalSize( naturalSize ); + DALI_TEST_EQUALS( naturalSize, Vector2( imageSize.GetWidth() - 2.0f, imageSize.GetHeight() - 2.0f ), TEST_LOCATION ); + END_TEST; } +int UtcDaliVisualFactoryGetNPatchVisual6(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual6: Request n-patch visual with a general image" ); + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + { + // Get actual size of test image + ImageDimensions imageSize = Dali::GetClosestImageSize( gImage_34_RGBA ); + + Property::Map propertyMap; + propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH ); + propertyMap.Insert( ImageVisual::Property::URL, gImage_34_RGBA ); + + Visual::Base visual = factory.CreateVisual( propertyMap ); + DALI_TEST_CHECK( visual ); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + + DummyControl actor = DummyControl::New(true); + TestVisualRender( application, actor, visual ); + + DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + + Vector2 naturalSize( 0.0f, 0.0f ); + visual.GetNaturalSize( naturalSize ); + DALI_TEST_EQUALS( naturalSize, Vector2( imageSize.GetWidth() - 2.0f, imageSize.GetHeight() - 2.0f ), TEST_LOCATION ); + + Stage::GetCurrent().Remove( actor ); + DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); + } + + { + // Get actual size of test image + ImageDimensions imageSize = Dali::GetClosestImageSize( TEST_IMAGE_FILE_NAME ); + + Property::Map propertyMap; + propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH ); + propertyMap.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME ); + + Visual::Base visual = factory.CreateVisual( propertyMap ); + DALI_TEST_CHECK( visual ); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + + DummyControl actor = DummyControl::New(true); + TestVisualRender( application, actor, visual ); + + DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + + Vector2 naturalSize( 0.0f, 0.0f ); + visual.GetNaturalSize( naturalSize ); + DALI_TEST_EQUALS( naturalSize, Vector2( imageSize.GetWidth() - 2.0f, imageSize.GetHeight() - 2.0f ), TEST_LOCATION ); + + Stage::GetCurrent().Remove( actor ); + DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); + } + + END_TEST; +} int UtcDaliNPatchVisualAuxiliaryImage(void) { @@ -883,22 +796,10 @@ int UtcDaliNPatchVisualAuxiliaryImage(void) properties[Visual::Property::TYPE] = Visual::IMAGE; properties[Visual::Property::MIX_COLOR] = Color::BLUE; properties[Visual::Property::SHADER]=shader; - properties[ImageVisual::Property::URL] = TEST_NPATCH_FILE_NAME; + properties[ImageVisual::Property::URL] = TEST_9_PATCH_FILE_NAME; properties[DevelImageVisual::Property::AUXILIARY_IMAGE] = TEST_AUX_IMAGE; properties[DevelImageVisual::Property::AUXILIARY_IMAGE_ALPHA] = 0.9f; - const unsigned int ninePatchImageWidth = 256; - const unsigned int ninePatchImageHeight = 256; - StretchRanges stretchRangesX; - stretchRangesX.PushBack( Uint16Pair( 10, 246 ) ); - StretchRanges stretchRangesY; - stretchRangesY.PushBack( Uint16Pair( 15, 241 ) ); - Integration::ResourcePointer ninePatchResource = CustomizeNinePatch( application, - ninePatchImageWidth, - ninePatchImageHeight, - stretchRangesX, - stretchRangesY ); - Visual::Base visual = factory.CreateVisual( properties ); // trigger creation through setting on stage @@ -916,7 +817,6 @@ int UtcDaliNPatchVisualAuxiliaryImage(void) auto textures = renderer.GetTextures(); DALI_TEST_EQUALS( textures.GetTextureCount(), 2, TEST_LOCATION ); - END_TEST; } @@ -934,18 +834,12 @@ int UtcDaliVisualFactoryGetNPatchVisualN1(void) Visual::Base visual = factory.CreateVisual( "ERROR.9.jpg", ImageDimensions() ); DALI_TEST_CHECK( visual ); - //The testkit still has to load a bitmap for the broken renderer image - Integration::Bitmap* bitmap = Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD); - bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 100, 100, 100, 100 ); - TestGlAbstraction& gl = application.GetGlAbstraction(); TraceCallStack& textureTrace = gl.GetTextureTrace(); textureTrace.Enable(true); DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u, - ImageDimensions(), - Integration::ResourcePointer(bitmap) ); + TestVisualRender( application, actor, visual ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); @@ -969,10 +863,6 @@ int UtcDaliVisualFactoryGetNPatchVisualN2(void) Visual::Base visual = factory.CreateVisual( propertyMap ); DALI_TEST_CHECK( visual ); - //The testkit still has to load a bitmap for the broken renderer image - Integration::Bitmap* bitmap = Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD); - bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 100, 100, 100, 100 ); - TestGlAbstraction& gl = application.GetGlAbstraction(); TraceCallStack& textureTrace = gl.GetTextureTrace(); textureTrace.Enable(true); @@ -980,9 +870,7 @@ int UtcDaliVisualFactoryGetNPatchVisualN2(void) drawTrace.Enable(true); DummyControl actor = DummyControl::New(true); - TestVisualRender( application, actor, visual, 1u, - ImageDimensions(), - Integration::ResourcePointer(bitmap) ); + TestVisualRender( application, actor, visual ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); diff --git a/dali-toolkit/internal/visuals/npatch-loader.cpp b/dali-toolkit/internal/visuals/npatch-loader.cpp index 8bc050f..209840b 100644 --- a/dali-toolkit/internal/visuals/npatch-loader.cpp +++ b/dali-toolkit/internal/visuals/npatch-loader.cpp @@ -19,9 +19,10 @@ #include // EXTERNAL HEADER +#include +#include #include -#include -#include +#include namespace Dali { @@ -32,6 +33,223 @@ namespace Toolkit namespace Internal { +namespace NPatchBuffer +{ + +void GetRedOffsetAndMask( Dali::Pixel::Format pixelFormat, int& byteOffset, int& bitMask ) +{ + switch( pixelFormat ) + { + case Dali::Pixel::A8: + case Dali::Pixel::L8: + case Dali::Pixel::LA88: + { + byteOffset = 0; + bitMask = 0; + break; + } + case Dali::Pixel::RGB888: + case Dali::Pixel::RGB8888: + case Dali::Pixel::RGBA8888: + { + byteOffset = 0; + bitMask = 0xFF; + break; + } + case Dali::Pixel::BGR8888: + case Dali::Pixel::BGRA8888: + { + byteOffset = 2; + bitMask = 0xff; + break; + } + case Dali::Pixel::RGB565: + { + byteOffset = 0; + bitMask = 0xf8; + break; + } + case Dali::Pixel::BGR565: + { + byteOffset = 1; + bitMask = 0x1f; + break; + } + case Dali::Pixel::RGBA4444: + { + byteOffset = 0; + bitMask = 0xf0; + break; + } + case Dali::Pixel::BGRA4444: + { + byteOffset = 1; + bitMask = 0xf0; + break; + } + case Dali::Pixel::RGBA5551: + { + byteOffset = 0; + bitMask = 0xf8; + break; + } + case Dali::Pixel::BGRA5551: + { + byteOffset = 1; + bitMask = 0x1e; + break; + } + case Dali::Pixel::INVALID: + case Dali::Pixel::COMPRESSED_R11_EAC: + case Dali::Pixel::COMPRESSED_SIGNED_R11_EAC: + case Dali::Pixel::COMPRESSED_RG11_EAC: + case Dali::Pixel::COMPRESSED_SIGNED_RG11_EAC: + case Dali::Pixel::COMPRESSED_RGB8_ETC2: + case Dali::Pixel::COMPRESSED_SRGB8_ETC2: + case Dali::Pixel::COMPRESSED_RGB8_ETC1: + case Dali::Pixel::COMPRESSED_RGB_PVRTC_4BPPV1: + case Dali::Pixel::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: + case Dali::Pixel::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: + case Dali::Pixel::COMPRESSED_RGBA8_ETC2_EAC: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_4x4_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_5x4_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_5x5_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_6x5_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_6x6_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_8x5_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_8x6_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_8x8_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_10x5_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_10x6_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_10x8_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_10x10_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_12x10_KHR: + case Dali::Pixel::COMPRESSED_RGBA_ASTC_12x12_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: + case Dali::Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: + { + DALI_LOG_ERROR("Pixel formats for compressed images are not compatible with simple masking-out of per-pixel alpha.\n"); + byteOffset=0; + bitMask=0; + break; + } + case Dali::Pixel::RGB16F: + case Dali::Pixel::RGB32F: + { + DALI_LOG_ERROR("Pixel format not compatible.\n"); + byteOffset=0; + bitMask=0; + break; + } + } +} + +Uint16Pair ParseRange( unsigned int& index, unsigned int width, unsigned char* pixel, unsigned int pixelStride, int testByte, int testBits, int testValue ) +{ + unsigned int start = 0xFFFF; + for( ; index < width; ++index, pixel += pixelStride ) + { + if( ( pixel[ testByte ] & testBits ) == testValue ) + { + start = index; + ++index; + pixel += pixelStride; + break; + } + } + + unsigned int end = width; + for( ; index < width; ++index, pixel += pixelStride ) + { + if( ( pixel[ testByte ] & testBits ) != testValue ) + { + end = index; + ++index; + pixel += pixelStride; + break; + } + } + + return Uint16Pair( start, end ); +} + +void ParseBorders( Devel::PixelBuffer& pixelBuffer, NPatchLoader::Data* data ) +{ + data->stretchPixelsX.Clear(); + data->stretchPixelsY.Clear(); + + Pixel::Format pixelFormat = pixelBuffer.GetPixelFormat(); + + int alphaByte = 0; + int alphaBits = 0; + Pixel::GetAlphaOffsetAndMask( pixelFormat, alphaByte, alphaBits ); + + int testByte = alphaByte; + int testBits = alphaBits; + int testValue = alphaBits; // Opaque == stretch + if( !alphaBits ) + { + GetRedOffsetAndMask( pixelFormat, testByte, testBits ); + testValue = 0; // Black == stretch + } + + unsigned int bytesPerPixel = Pixel::GetBytesPerPixel( pixelFormat ); + unsigned int width = pixelBuffer.GetWidth(); + unsigned int height = pixelBuffer.GetHeight(); + unsigned char* srcPixels = pixelBuffer.GetBuffer(); + unsigned int srcStride = width * bytesPerPixel; + + // TOP + unsigned char* top = srcPixels + bytesPerPixel; + unsigned int index = 0; + + for( ; index < width - 2; ) + { + Uint16Pair range = ParseRange( index, width - 2, top, bytesPerPixel, testByte, testBits, testValue ); + if( range.GetX() != 0xFFFF ) + { + data->stretchPixelsX.PushBack( range ); + } + } + + // LEFT + unsigned char* left = srcPixels + srcStride; + index = 0; + for( ; index < height - 2; ) + { + Uint16Pair range = ParseRange( index, height - 2, left, srcStride, testByte, testBits, testValue ); + if( range.GetX() != 0xFFFF ) + { + data->stretchPixelsY.PushBack( range ); + } + } + + // If there are no stretch pixels then make the entire image stretchable + if( data->stretchPixelsX.Size() == 0 ) + { + data->stretchPixelsX.PushBack( Uint16Pair( 0, width - 2 ) ); + } + if( data->stretchPixelsY.Size() == 0 ) + { + data->stretchPixelsY.PushBack( Uint16Pair( 0, height - 2 ) ); + } +} + +} // namespace NPatchBuffer + NPatchLoader::NPatchLoader() { } @@ -40,7 +258,7 @@ NPatchLoader::~NPatchLoader() { } -std::size_t NPatchLoader::Load( const std::string& url, const Rect< int >& border ) +std::size_t NPatchLoader::Load( const std::string& url, const Rect< int >& border, bool& preMultiplyOnLoad ) { std::size_t hash = CalculateHash( url ); OwnerContainer< Data* >::SizeType index = UNINITIALIZED_ID; @@ -78,10 +296,10 @@ std::size_t NPatchLoader::Load( const std::string& url, const Rect< int >& borde data->textureSet = mCache[ cachedIndex ]->textureSet; - NinePatchImage::StretchRanges stretchRangesX; + StretchRanges stretchRangesX; stretchRangesX.PushBack( Uint16Pair( border.left, ( (data->croppedWidth >= static_cast< unsigned int >( border.right )) ? data->croppedWidth - border.right : 0 ) ) ); - NinePatchImage::StretchRanges stretchRangesY; + StretchRanges stretchRangesY; stretchRangesY.PushBack( Uint16Pair( border.top, ( (data->croppedHeight >= static_cast< unsigned int >( border.bottom )) ? data->croppedHeight - border.bottom : 0 ) ) ); data->stretchPixelsX = stretchRangesX; @@ -94,62 +312,52 @@ std::size_t NPatchLoader::Load( const std::string& url, const Rect< int >& borde } // got to the end so no match, decode N patch and append new item to cache - if( border == Rect< int >( 0, 0, 0, 0 ) ) + Devel::PixelBuffer pixelBuffer = Dali::LoadImageFromFile( url, ImageDimensions(), FittingMode::DEFAULT, SamplingMode::BOX_THEN_LINEAR, true ); + if( pixelBuffer ) { - NinePatchImage ninePatch = NinePatchImage::New( url ); - if( ninePatch ) + Data* data = new Data(); + data->hash = hash; + data->url = url; + + if( border == Rect< int >( 0, 0, 0, 0 ) ) { - BufferImage croppedImage = ninePatch.CreateCroppedBufferImage(); - if( croppedImage ) - { - Data* data = new Data(); - data->hash = hash; - data->url = url; - data->textureSet = TextureSet::New(); - TextureSetImage( data->textureSet, 0u, croppedImage ); - data->croppedWidth = croppedImage.GetWidth(); - 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 - } + NPatchBuffer::ParseBorders( pixelBuffer, data ); + + data->border = Rect< int >( 0, 0, 0, 0 ); + + // Crop the image + pixelBuffer.Crop( 1, 1, pixelBuffer.GetWidth() - 2, pixelBuffer.GetHeight() - 2 ); } - } - else - { - // Load image from file - PixelData pixels = SyncImageLoader::Load( url ); - if( pixels ) + else { - Data* data = new Data(); - data->hash = hash; - data->url = url; - data->croppedWidth = pixels.GetWidth(); - data->croppedHeight = pixels.GetHeight(); + data->stretchPixelsX.PushBack( Uint16Pair( border.left, ( (pixelBuffer.GetWidth() >= static_cast< unsigned int >( border.right )) ? pixelBuffer.GetWidth() - border.right : 0 ) ) ); + data->stretchPixelsY.PushBack( Uint16Pair( border.top, ( (pixelBuffer.GetHeight() >= static_cast< unsigned int >( border.bottom )) ? pixelBuffer.GetHeight() - border.bottom : 0 ) ) ); + data->border = border; + } - Texture texture = Texture::New( TextureType::TEXTURE_2D, pixels.GetPixelFormat(), pixels.GetWidth(), pixels.GetHeight() ); - texture.Upload( pixels, 0, 0, 0, 0, pixels.GetWidth(), pixels.GetHeight() ); + data->croppedWidth = pixelBuffer.GetWidth(); + data->croppedHeight = pixelBuffer.GetHeight(); - data->textureSet = TextureSet::New(); - data->textureSet.SetTexture( 0u, texture ); + if( preMultiplyOnLoad && Pixel::HasAlpha( pixelBuffer.GetPixelFormat() ) ) + { + pixelBuffer.MultiplyColorByAlpha(); + } + else + { + preMultiplyOnLoad = false; + } - NinePatchImage::StretchRanges stretchRangesX; - stretchRangesX.PushBack( Uint16Pair( border.left, ( (data->croppedWidth >= static_cast< unsigned int >( border.right )) ? data->croppedWidth - border.right : 0 ) ) ); + PixelData pixels = Devel::PixelBuffer::Convert( pixelBuffer ); // takes ownership of buffer - NinePatchImage::StretchRanges stretchRangesY; - stretchRangesY.PushBack( Uint16Pair( border.top, ( (data->croppedHeight >= static_cast< unsigned int >( border.bottom )) ? data->croppedHeight - border.bottom : 0 ) ) ); + Texture texture = Texture::New( TextureType::TEXTURE_2D, pixels.GetPixelFormat(), pixels.GetWidth(), pixels.GetHeight() ); + texture.Upload( pixels ); - data->stretchPixelsX = stretchRangesX; - data->stretchPixelsY = stretchRangesY; - data->border = border; + data->textureSet = TextureSet::New(); + data->textureSet.SetTexture( 0u, texture ); - mCache.PushBack( data ); + mCache.PushBack( data ); - return mCache.Count(); // valid ids start from 1u - } + return mCache.Count(); // valid ids start from 1u } return 0u; diff --git a/dali-toolkit/internal/visuals/npatch-loader.h b/dali-toolkit/internal/visuals/npatch-loader.h index d1df302..8c75477 100644 --- a/dali-toolkit/internal/visuals/npatch-loader.h +++ b/dali-toolkit/internal/visuals/npatch-loader.h @@ -20,11 +20,8 @@ // EXTERNAL INCLUDES #include #include +#include #include -#include - -// INTERNAL INCLUDES -#include namespace Dali { @@ -35,6 +32,13 @@ namespace Toolkit namespace Internal { +namespace NPatchBuffer +{ + +void GetRedOffsetAndMask( Dali::Pixel::Format pixelFormat, int& byteOffset, int& bitMask ); + +} // namespace NPatchBuffer + /** * The manager for loading Npatch textures. * It caches them internally for better performance; i.e. to avoid loading and @@ -48,6 +52,8 @@ class NPatchLoader { public: + typedef Dali::Vector< Uint16Pair > StretchRanges; + enum { UNINITIALIZED_ID = 0 ///< uninitialised id, use to initialize ids @@ -57,8 +63,8 @@ public: { std::string url; ///< Url of the N-Patch TextureSet textureSet; ///< Texture containing the cropped image - NinePatchImage::StretchRanges stretchPixelsX; ///< X stretch pixels - NinePatchImage::StretchRanges stretchPixelsY; ///< Y stretch pixels + StretchRanges stretchPixelsX; ///< X stretch pixels + StretchRanges stretchPixelsY; ///< Y stretch pixels std::size_t hash; ///< Hash code for the Url uint32_t croppedWidth; ///< Width of the cropped middle part of N-patch uint32_t croppedHeight; ///< Height of the cropped middle part of N-patch @@ -82,9 +88,11 @@ public: * * @param [in] url to retrieve * @param [in] border The border size of the image + * @param [in,out] preMultiplyOnLoad True if the image color should be multiplied by it's alpha. Set to false if the + * image has no alpha channel * @return id of the texture. */ - std::size_t Load( const std::string& url, const Rect< int >& border ); + std::size_t Load( const std::string& url, const Rect< int >& border, bool& preMultiplyOnLoad ); /** * @brief Retrieve N patch data matching to an id diff --git a/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp b/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp index 618c466..dcf734e 100755 --- a/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp +++ b/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp @@ -227,13 +227,13 @@ void AddVertex( Vector< Vector2 >& vertices, unsigned int x, unsigned int y ) vertices.PushBack( Vector2( x, y ) ); } -void RegisterStretchProperties( Renderer& renderer, const char * uniformName, const NinePatchImage::StretchRanges& stretchPixels, uint16_t imageExtent) +void RegisterStretchProperties( Renderer& renderer, const char * uniformName, const NPatchLoader::StretchRanges& stretchPixels, uint16_t imageExtent) { uint16_t prevEnd = 0; uint16_t prevFix = 0; uint16_t prevStretch = 0; unsigned int i = 1; - for( NinePatchImage::StretchRanges::ConstIterator it = stretchPixels.Begin(); it != stretchPixels.End(); ++it, ++i ) + for( NPatchLoader::StretchRanges::ConstIterator it = stretchPixels.Begin(); it != stretchPixels.End(); ++it, ++i ) { uint16_t start = it->GetX(); uint16_t end = it->GetY(); @@ -291,7 +291,14 @@ void NPatchVisual::LoadImages() { if( NPatchLoader::UNINITIALIZED_ID == mId && mImageUrl.IsLocalResource() ) { - mId = mLoader.Load( mImageUrl.GetUrl(), mBorder ); + bool preMultiplyOnLoad = mFactoryCache.GetPreMultiplyOnLoad() && !mImpl->mCustomShader ? true : false; + + mId = mLoader.Load( mImageUrl.GetUrl(), mBorder, preMultiplyOnLoad ); + + if( preMultiplyOnLoad ) + { + EnablePreMultipliedAlpha( true ); + } } if( ! mAuxiliaryPixelBuffer && mAuxiliaryUrl.IsValid() && mAuxiliaryUrl.IsLocalResource() ) @@ -473,8 +480,8 @@ Shader NPatchVisual::CreateShader() const NPatchLoader::Data* data; // 0 is either no data (load failed?) or no stretch regions on image // for both cases we use the default shader - NinePatchImage::StretchRanges::SizeType xStretchCount = 0; - NinePatchImage::StretchRanges::SizeType yStretchCount = 0; + NPatchLoader::StretchRanges::SizeType xStretchCount = 0; + NPatchLoader::StretchRanges::SizeType yStretchCount = 0; auto fragmentShader = mAuxiliaryPixelBuffer ? FRAGMENT_MASK_SHADER : FRAGMENT_SHADER; -- 2.7.4