int UtcDaliImageActorGetCurrentImageSize03(void) { TestApplication application; tet_infoline("Positive test for Dali::ImageActor::GetCurrentImageSize - Test that using an image resource with a requested size sets the actor size with it's nearest size immediately rather than on load"); Vector2 closestImageSize( 80, 45); application.GetPlatform().SetClosestImageSize(closestImageSize); ImageAttributes attrs; attrs.SetSize(40, 30); Image image = Image::New("image.jpg", attrs); ImageActor actor = ImageActor::New( image ); Stage::GetCurrent().Add(actor); application.SendNotification(); // Flush update messages application.Render(); // Process resource request application.SendNotification(); // Flush update messages application.Render(); // Process resource request DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION ); // Now complete the image load Integration::ResourceRequest* req = application.GetPlatform().GetRequest(); Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false ); bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, closestImageSize.width, closestImageSize.height, closestImageSize.width, closestImageSize.height ); Integration::ResourcePointer resourcePtr(bitmap); // reference it application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr); application.Render(); // Process LoadComplete application.SendNotification(); // Process event messages application.GetPlatform().DiscardRequest(); // Ensure load request is discarded application.GetPlatform().ClearReadyResources(); // DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION ); // Test that setting a size on the actor can be 'undone' with SetNaturalSize() Vector2 size(200.0f, 200.0f); actor.SetSize(size); // flush the queue and render once application.SendNotification(); application.Render(); DALI_TEST_EQUALS( actor.GetCurrentImageSize(), size, TEST_LOCATION ); actor.SetToNaturalSize(); application.SendNotification(); application.Render(); DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION ); END_TEST; }
bool LoadBitmapFromPng( const ResourceLoadingClient& client, const ImageLoader::Input& input, Integration::Bitmap& bitmap ) { png_structp png = NULL; png_infop info = NULL; auto_png autoPng(png, info); /// @todo: consider parameters unsigned int y; unsigned int width, height; unsigned char *pixels; png_bytep *rows; unsigned int bpp = 0; // bytes per pixel bool valid = false; // Load info from the header if( !LoadPngHeader( input.file, width, height, png, info ) ) { return false; } Pixel::Format pixelFormat = Pixel::RGBA8888; // decide pixel format unsigned int colordepth = png_get_bit_depth(png, info); // Ask PNGLib to convert high precision images into something we can use: if (colordepth == 16) { png_set_strip_16(png); colordepth = 8; } png_byte colortype = png_get_color_type(png, info); if(colortype == PNG_COLOR_TYPE_GRAY) { switch( colordepth ) { case 8: { pixelFormat = Pixel::L8; valid = true; break; } default: { break; } } } else if(colortype == PNG_COLOR_TYPE_GRAY_ALPHA) { switch(colordepth) { case 8: { pixelFormat = Pixel::LA88; valid = true; break; } default: { break; } } } else if(colortype == PNG_COLOR_TYPE_RGB ) { switch(colordepth) { case 8: { pixelFormat = Pixel::RGB888; valid = true; break; } case 5: /// @todo is this correct for RGB16 5-6-5 ? { pixelFormat = Pixel::RGB565; valid = true; break; } default: { break; } } } else if(colortype == PNG_COLOR_TYPE_RGBA) { switch(colordepth) { case 8: { pixelFormat = Pixel::RGBA8888; valid = true; break; } default: { break; } } } else if(colortype == PNG_COLOR_TYPE_PALETTE) { switch(colordepth) { case 2: case 4: case 8: { /* Expand paletted or RGB images with transparency to full alpha channels * so the data will be available as RGBA quartets. PNG_INFO_tRNS = 0x10 */ if(png_get_valid(png, info, PNG_INFO_tRNS) == 0x10) { pixelFormat = Pixel::RGBA8888; valid = true; } else { pixelFormat = Pixel::RGB888; png_set_packing(png); png_set_packswap(png); png_set_palette_to_rgb(png); valid = true; } break; } default: { break; } } } if( !valid ) { DALI_LOG_WARNING( "Unsupported png format\n" ); return false; } // bytes per pixel bpp = Pixel::GetBytesPerPixel(pixelFormat); png_read_update_info(png, info); if(setjmp(png_jmpbuf(png))) { DALI_LOG_WARNING("error during png_read_image\n"); return false; } unsigned int rowBytes = png_get_rowbytes(png, info); unsigned int bufferWidth = GetTextureDimension(width); unsigned int bufferHeight = GetTextureDimension(height); unsigned int stride = bufferWidth*bpp; // not sure if this ever happens if( rowBytes > stride ) { stride = GetTextureDimension(rowBytes); bufferWidth = stride / bpp; } // decode the whole image into bitmap buffer pixels = bitmap.GetPackedPixelsProfile()->ReserveBuffer(pixelFormat, width, height, bufferWidth, bufferHeight); DALI_ASSERT_DEBUG(pixels); rows = (png_bytep*) malloc(sizeof(png_bytep) * height); for(y=0; y<height; y++) { rows[y] = (png_byte*) (pixels + y * stride); } // decode image png_read_image(png, rows); free(rows); return true; }
int UtcDaliImageActorNaturalPixelAreaSize02(void) { TestApplication application; tet_infoline("Positive test for Dali::ImageActor::GetCurrentImageSize - check a new image doens't change actor size until load complete"); //If an image is loaded without setting size, then the actor gets the natural size of the image //Setting the pixel area will change the actor size to match the pixel area //Setting the actor size will not change pixel area, and will cause the partial image to stretch //to the new size. //Clearing the pixel area will not change actor size, and the actor will show the whole image. Vector2 closestImageSize( 80, 45); application.GetPlatform().SetClosestImageSize(closestImageSize); ImageAttributes attrs; attrs.SetSize(40, 30); // Request a really small size we won't get. Image image = Image::New("image.jpg", attrs); ImageActor actor = ImageActor::New( image ); Stage::GetCurrent().Add(actor); application.SendNotification(); // Flush update messages application.Render(); // Process resource request DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION ); DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), closestImageSize, TEST_LOCATION ); // Now complete the image load Integration::ResourceRequest* req = application.GetPlatform().GetRequest(); Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false ); bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, closestImageSize.width, closestImageSize.height, closestImageSize.width, closestImageSize.height ); Integration::ResourcePointer resourcePtr(bitmap); // reference it application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr); application.Render(); // Process LoadComplete application.SendNotification(); // Process event messages application.GetPlatform().DiscardRequest(); // Ensure load request is discarded application.GetPlatform().ClearReadyResources(); // DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION ); DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), closestImageSize, TEST_LOCATION ); // Set a pixel area on a naturally sized actor - expect the actor to take the // pixel area as size actor.SetPixelArea(ImageActor::PixelArea(0, 0, 30, 30)); application.SendNotification(); // Process event messages application.Render(); // Process LoadComplete DALI_TEST_EQUALS( actor.GetCurrentImageSize(), Vector2(30, 30), TEST_LOCATION ); DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), Vector2(30, 30), TEST_LOCATION ); // Clear the pixel area. Expect the whole image to be shown, changing actor size actor.ClearPixelArea(); application.SendNotification(); // Process event messages application.Render(); // Process LoadComplete DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION ); DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), closestImageSize, TEST_LOCATION ); // Set a size. Expect the partial image to stretch to fill the new size actor.SetSize(100, 100); application.SendNotification(); // Process event messages application.Render(); // Process LoadComplete DALI_TEST_EQUALS( actor.GetCurrentImageSize(), Vector2(100, 100), TEST_LOCATION ); DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), Vector2(100, 100), TEST_LOCATION ); // Set a pixel area, don't expect size to change actor.SetPixelArea(ImageActor::PixelArea(0, 0, 40, 40)); application.SendNotification(); // Process event messages application.Render(); // Process LoadComplete DALI_TEST_EQUALS( actor.GetCurrentImageSize(), Vector2(40, 40), TEST_LOCATION ); DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), Vector2(100, 100), TEST_LOCATION ); // Use natural size - expect actor to change to pixel area actor.SetToNaturalSize(); application.SendNotification(); // Process event messages application.Render(); // Process LoadComplete DALI_TEST_EQUALS( actor.GetCurrentImageSize(), Vector2(40, 40), TEST_LOCATION ); DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), Vector2(40, 40), TEST_LOCATION ); // Clearing pixel area should change actor size to image size actor.ClearPixelArea(); application.SendNotification(); // Process event messages application.Render(); // Process LoadComplete DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION ); DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), closestImageSize, TEST_LOCATION ); END_TEST; }
int UtcDaliImageActorGetCurrentImageSize05(void) { TestApplication application; tet_infoline("Positive test for Dali::ImageActor::GetCurrentImageSize - check a new image doens't change actor size until load complete"); Vector2 closestImageSize( 80, 45); application.GetPlatform().SetClosestImageSize(closestImageSize); ImageAttributes attrs; attrs.SetSize(40, 30); // Request a really small size we won't get. Image image = Image::New("image.jpg", attrs); ImageActor actor = ImageActor::New( image ); Stage::GetCurrent().Add(actor); application.SendNotification(); // Flush update messages application.Render(); // Process resource request DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION ); // Now complete the image load Integration::ResourceRequest* req = application.GetPlatform().GetRequest(); Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false ); bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, closestImageSize.width, closestImageSize.height, closestImageSize.width, closestImageSize.height ); Integration::ResourcePointer resourcePtr(bitmap); // reference it application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr); application.Render(); // Process LoadComplete application.SendNotification(); // Process event messages application.GetPlatform().DiscardRequest(); // Ensure load request is discarded application.GetPlatform().ClearReadyResources(); // DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION ); // Load a different image Vector2 image2ClosestSize = Vector2(240, 150); application.GetPlatform().SetClosestImageSize(image2ClosestSize); attrs.SetSize(100, 100); Image image2 = Image::New("image2.jpg", attrs); actor.SetImage(image2); application.SendNotification(); // Flush update messages application.Render(); // Process resource request application.SendNotification(); // Flush update messages application.Render(); // Process resource request // Ensure the actor size is kept DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION ); // Now complete the image load req = application.GetPlatform().GetRequest(); Integration::Bitmap* bitmap2 = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false ); bitmap2->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, image2ClosestSize.width, image2ClosestSize.height, image2ClosestSize.width, image2ClosestSize.height ); Integration::ResourcePointer resourcePtr2(bitmap2); // reference it application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr2); application.Render(); // Process LoadComplete application.SendNotification(); // Process event messages application.GetPlatform().DiscardRequest(); // Ensure load request is discarded application.GetPlatform().ClearReadyResources(); // application.SendNotification(); // Process event messages application.Render(); // Process LoadComplete // Ensure the actor size gets the new image's natural size DALI_TEST_EQUALS( actor.GetCurrentImageSize(), image2ClosestSize, TEST_LOCATION ); END_TEST; }