#include "loader-png.h"
#include <cstring>
-#include <cstdlib>
#include <zlib.h>
#include <png.h>
-#include <dali/integration-api/bitmap.h>
#include <dali/integration-api/debug.h>
#include <dali/public-api/images/image.h>
-#include "dali/public-api/math/math-utils.h"
-#include "dali/public-api/math/vector2.h"
#include "platform-capabilities.h"
+#include <adaptors/devel-api/adaptor-framework/pixel-buffer.h>
namespace Dali
{
-
-using Integration::Bitmap;
-using Dali::Integration::PixelBuffer;
-
namespace TizenPlatform
{
return success;
}
-bool LoadBitmapFromPng( const ImageLoader::Input& input, Integration::Bitmap& bitmap )
+bool LoadBitmapFromPng( const ImageLoader::Input& input, Dali::Devel::PixelBuffer& bitmap )
{
png_structp png = NULL;
png_infop info = NULL;
/// @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;
png_byte colortype = png_get_color_type(png, info);
- if(colortype == PNG_COLOR_TYPE_GRAY)
+ if( colortype == PNG_COLOR_TYPE_GRAY ||
+ colortype == PNG_COLOR_TYPE_GRAY_ALPHA )
{
- switch( colordepth )
+ if( colortype == PNG_COLOR_TYPE_GRAY )
{
- case 8:
- {
- pixelFormat = Pixel::L8;
- valid = true;
- break;
- }
- default:
+ pixelFormat = Pixel::L8;
+ if( png_get_valid(png, info, PNG_INFO_tRNS) )
{
- break;
+ colortype = PNG_COLOR_TYPE_GRAY_ALPHA;
+ /* expand transparency entry -> alpha channel if present */
+ png_set_tRNS_to_alpha(png);
+ pixelFormat = Pixel::LA88;
}
}
- }
- else if(colortype == PNG_COLOR_TYPE_GRAY_ALPHA)
- {
- switch(colordepth)
+ else
{
- case 8:
- {
- pixelFormat = Pixel::LA88;
- valid = true;
- break;
- }
- default:
- {
- break;
- }
+ pixelFormat = Pixel::LA88;
}
+
+ if( colordepth < 8 )
+ {
+ /* expand gray (w/reduced bits) -> 8-bit RGB if necessary */
+ png_set_expand_gray_1_2_4_to_8(png);
+ /* pack all pixels to byte boundaries */
+ png_set_packing(png);
+ }
+ valid = true;
}
else if(colortype == PNG_COLOR_TYPE_RGB )
{
if( rowBytes > stride )
{
stride = GetTextureDimension(rowBytes);
- bufferWidth = stride / bpp;
+
+ bpp = stride / bufferWidth;
+ switch(bpp)
+ {
+ case 3:
+ pixelFormat = Pixel::RGB888;
+ break;
+ case 4:
+ pixelFormat = Pixel::RGBA8888;
+ break;
+ default:
+ break;
+ }
+
}
// decode the whole image into bitmap buffer
- pixels = bitmap.GetPackedPixelsProfile()->ReserveBuffer(pixelFormat, width, height, bufferWidth, bufferHeight);
+ auto pixels = (bitmap = Dali::Devel::PixelBuffer::New(bufferWidth, bufferHeight, pixelFormat)).GetBuffer();
DALI_ASSERT_DEBUG(pixels);
rows = reinterpret_cast< png_bytep* >( malloc(sizeof(png_bytep) * height) );