remove LIBPNG support

This commit is contained in:
Vadim Lopatin 2014-06-11 13:37:57 +04:00
parent 566a962762
commit 358d45ea04
1 changed files with 0 additions and 116 deletions

View File

@ -20,16 +20,12 @@ Authors: Vadim Lopatin, coolreader.org@gmail.com
*/
module dlangui.graphics.images;
immutable bool USE_LIBPNG = false;
immutable bool USE_FREEIMAGE = true;
import dlangui.core.logger;
import dlangui.core.types;
import dlangui.graphics.drawbuf;
import std.stream;
static if (USE_LIBPNG) {
import libpng.png;
}
/// load and decode image from file to ColorDrawBuf, returns null if loading or decoding is failed
ColorDrawBuf loadImage(string filename) {
@ -50,8 +46,6 @@ ColorDrawBuf loadImage(InputStream stream) {
return null;
static if (USE_FREEIMAGE) {
return loadFreeImage(stream);
} else static if (USE_LIBPNG) {
return loadPngImage(stream);
}
}
@ -181,113 +175,3 @@ static if (USE_FREEIMAGE) {
}
}
static if (USE_LIBPNG) {
extern (C) void lvpng_error_func (png_structp png, png_const_charp msg)
{
string s = fromStringz(msg);
Log.d("Error while reading PNG image: ", s);
// todo: exceptions do not work inside C function
throw new ImageDecodingException("Error while decoding PNG image");
}
extern (C) void lvpng_warning_func (png_structp png, png_const_charp msg)
{
string s = fromStringz(msg);
Log.d("Warn while reading PNG image: ", s);
// todo: exceptions do not work inside C function
throw new ImageDecodingException("Error while decoding PNG image");
}
extern (C) void lvpng_read_func(png_structp png, png_bytep buf, png_size_t len)
{
InputStream stream = cast(InputStream)png_get_io_ptr(png);
ubyte[] localbuf = new ubyte[len];
if (stream.read(localbuf) != len)
throw new ImageDecodingException("Error while reading PNG image");
for (uint i = 0; i < len; i++)
buf[i] = localbuf[i];
}
/// load and decode PNG image
ColorDrawBuf loadPngImage(InputStream stream)
{
png_structp png_ptr = null;
png_infop info_ptr = null;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
cast(png_voidp)stream, &lvpng_error_func, &lvpng_warning_func);
if ( !png_ptr )
return null;
try {
//
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr)
lvpng_error_func(png_ptr, "cannot create png info struct");
png_set_read_fn(png_ptr,
cast(void*)stream, &lvpng_read_func);
png_read_info( png_ptr, info_ptr );
png_uint_32 width, height;
int bit_depth, color_type, interlace_type;
png_get_IHDR(png_ptr, info_ptr, &width, &height,
&bit_depth, &color_type, &interlace_type,
null, null);
ColorDrawBuf drawbuf = new ColorDrawBuf(width, height);
if (color_type & PNG_COLOR_MASK_PALETTE)
png_set_palette_to_rgb(png_ptr);
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
png_set_expand_gray_1_2_4_to_8(png_ptr);
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
png_set_tRNS_to_alpha(png_ptr);
if (bit_depth == 16)
png_set_strip_16(png_ptr);
png_set_invert_alpha(png_ptr);
if (bit_depth < 8)
png_set_packing(png_ptr);
png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
if (color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb(png_ptr);
int number_passes = png_set_interlace_handling(png_ptr);
png_set_bgr(png_ptr);
for (int pass = 0; pass < number_passes; pass++)
{
for (int y = 0; y < height; y++)
{
uint * row = drawbuf.scanLine(y);
png_read_rows(png_ptr, cast(ubyte **)&row, null, 1);
}
}
png_read_end(png_ptr, info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, null);
return drawbuf;
} catch (ImageDecodingException e) {
if (png_ptr)
{
png_destroy_read_struct(&png_ptr, &info_ptr, null);
}
return null;
}
}
//bool LVPngImageSource::CheckPattern( const lUInt8 * buf, int )
//{
//return( !png_sig_cmp((unsigned char *)buf, (png_size_t)0, 4) );
//}
}