improvement but uncompress is broken
This commit is contained in:
parent
a1f2a6d1af
commit
4150eec1d6
1 changed files with 71 additions and 6 deletions
77
lily_png.cpp
77
lily_png.cpp
|
@ -21,6 +21,63 @@ static metadata parse_metadata(buffer &data)
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t get_uncompressed_size(const metadata meta)
|
||||||
|
{
|
||||||
|
size_t ret = 0;
|
||||||
|
switch (meta.color_type)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
if (meta.bit_depth == 1 || meta.bit_depth == 2 || meta.bit_depth == 4 || meta.bit_depth == 8 || meta.bit_depth == 16)
|
||||||
|
{
|
||||||
|
size_t size_per_row = ceil((meta.width * (meta.bit_depth))/8) + 1;
|
||||||
|
ret = size_per_row * meta.height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw std::runtime_error("Invalid bit depht");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (meta.bit_depth == 8 || meta.bit_depth == 16)
|
||||||
|
{
|
||||||
|
size_t size_per_row = ceil((meta.width * (meta.bit_depth * 3))/8) + 1;
|
||||||
|
ret = size_per_row * meta.height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw std::runtime_error("Invalid bit depht");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (meta.bit_depth == 1 || meta.bit_depth == 2 || meta.bit_depth == 4 || meta.bit_depth == 8)
|
||||||
|
{
|
||||||
|
size_t size_per_row = ceil((meta.width * (meta.bit_depth))/8) + 1;
|
||||||
|
ret = size_per_row * meta.height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw std::runtime_error("Invalid bit depht");
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if (meta.bit_depth == 8 || meta.bit_depth == 16)
|
||||||
|
{
|
||||||
|
size_t size_per_row = ceil((meta.width * (meta.bit_depth * 2))/8) + 1;
|
||||||
|
ret = size_per_row * meta.height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw std::runtime_error("Invalid bit depht");
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
if (meta.bit_depth == 8 || meta.bit_depth == 16)
|
||||||
|
{
|
||||||
|
size_t size_per_row = ceil((meta.width * (meta.bit_depth * 4))/8) + 1;
|
||||||
|
ret = size_per_row * meta.height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw std::runtime_error("Invalid bit depht");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw std::runtime_error("Invalid color type");
|
||||||
|
}
|
||||||
|
std::println("Uncompressed size {}", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
buffer_unsigned read_png(const std::string &file_path)
|
buffer_unsigned read_png(const std::string &file_path)
|
||||||
{
|
{
|
||||||
unsigned char magic[9] = {137, 80, 78, 71, 13, 10, 26, 10};
|
unsigned char magic[9] = {137, 80, 78, 71, 13, 10, 26, 10};
|
||||||
|
@ -69,8 +126,16 @@ buffer_unsigned read_png(const std::string &file_path)
|
||||||
std::println("Image data size {}", image_data_concat.size);
|
std::println("Image data size {}", image_data_concat.size);
|
||||||
std::println("Image data allocated {}", image_data_concat.allocated);
|
std::println("Image data allocated {}", image_data_concat.allocated);
|
||||||
std::println("Allocations {}", image_data_concat.allocations);
|
std::println("Allocations {}", image_data_concat.allocations);
|
||||||
image_data.allocate(image_data_concat.allocated);
|
image_data.allocate(get_uncompressed_size(meta));
|
||||||
uncompress(image_data.data, &image_data.allocated, image_data_concat.data, image_data_concat.size);
|
size_t prev_allocated = image_data.allocated;
|
||||||
|
int r = uncompress(image_data.data, &prev_allocated, image_data_concat.data, image_data_concat.size);
|
||||||
|
if (r != Z_OK)
|
||||||
|
{
|
||||||
|
std::println("Uncompress failed {}", r);
|
||||||
|
throw std::runtime_error("Uncompress fail");
|
||||||
|
}
|
||||||
|
image_data.size = prev_allocated;
|
||||||
|
std::println("Raw size {}", image_data.size);
|
||||||
std::println("Filter {}", (int)meta.filter);
|
std::println("Filter {}", (int)meta.filter);
|
||||||
|
|
||||||
switch (meta.filter)
|
switch (meta.filter)
|
||||||
|
@ -78,16 +143,16 @@ buffer_unsigned read_png(const std::string &file_path)
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
std::println("sub filter now implemented");
|
std::println("sub filter not implemented");
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
std::println("up filter now implemented");
|
std::println("up filter not implemented");
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
std::println("average filter now implemented");
|
std::println("average filter not implemented");
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
std::println("paeth filter now implemented");
|
std::println("paeth filter not implemented");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
std::println("Filter not recognised");
|
std::println("Filter not recognised");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue