diff --git a/src/filter.cpp b/src/filter.cpp index 5824256..177ef19 100644 --- a/src/filter.cpp +++ b/src/filter.cpp @@ -43,7 +43,7 @@ void lily_png::filter_scanline(unsigned char *scanline, unsigned char *previous_ } } -void lily_png::filter(file_reader::buffer &data, file_reader::buffer &dest ,metadata &meta) +void lily_png::filter(file_reader::buffer &data, file_reader::buffer &dest , metadata &meta) { unsigned long index = 0; unsigned long index_dest = 0; diff --git a/src/lily_png.cpp b/src/lily_png.cpp index 46b58d2..1253623 100644 --- a/src/lily_png.cpp +++ b/src/lily_png.cpp @@ -3,7 +3,7 @@ std::vector palette; bool palette_found = false; -static void read_raw_data(const std::string &file_path, file_reader::buffer &data, lily_png::metadata &meta) +static std::expected read_raw_data(const std::string &file_path, file_reader::buffer &data, lily_png::metadata &meta) { std::println("Zlib version is {}", zlibVersion()); unsigned char magic[9] = {137, 80, 78, 71, 13, 10, 26, 10}; @@ -11,26 +11,30 @@ static void read_raw_data(const std::string &file_path, file_reader::buffer{0}; }); if (res.value() == 0) - throw std::runtime_error("Read failed"); + return std::unexpected(lily_png::png_error::read_failed); if (memcmp(magic, file_magic, 8) != 0) { std::println("File is not a png!"); - return ; + return std::unexpected(lily_png::png_error::file_is_not_a_png); } file_reader::buffer raw_dat{}; while (true) { std::tuple> chunk_header; std::get<1>(chunk_header).size = 4; - auto ret = reader.read_from_tuple(chunk_header); - if (!ret || ret.value() != 8) + auto ret = reader.read_from_tuple(chunk_header).or_else([](const file_reader::RESULT &res) + { + std::println("Reading header failed!"); + return std::expected{0}; + }); + if (ret.value() != 8) { std::println("Chunk incomplete!"); - return ; + return std::unexpected(lily_png::png_error::read_failed); } unsigned int size = std::get<0>(chunk_header); //std::println("Chunk type {} Size {}", std::get<1>(chunk_header).data, std::get<0>(chunk_header)); @@ -39,11 +43,15 @@ static void read_raw_data(const std::string &file_path, file_reader::buffer(chunk_header); std::tuple, unsigned> dat; std::get<0>(dat).size = std::get<0>(chunk_header); - ret = reader.read_from_tuple(dat); - if (!ret || ret.value() != raw_data.size + 4) + ret = reader.read_from_tuple(dat).or_else([](const file_reader::RESULT &res) + { + std::println("Reading data failed!"); + return std::expected{0}; + }); + if (ret.value() != raw_data.size + 4) { std::println("Chunk incomplete!"); - return ; + return std::unexpected(lily_png::png_error::read_failed); } unsigned long crc = crc32(0, reinterpret_cast(std::get<1>(chunk_header).data), 4); crc = crc32(crc, reinterpret_cast(std::get<0>(dat).data), std::get<0>(chunk_header)); @@ -65,7 +73,7 @@ static void read_raw_data(const std::string &file_path, file_reader::buffer &data, file_reader: } } -lily_png::metadata lily_png::read_png(const std::string &file_path, file_reader::buffer &data) +std::expected lily_png::read_png(const std::string &file_path, file_reader::buffer &data) { file_reader::buffer tmp_data{}; metadata meta{0}; - read_raw_data(file_path, tmp_data, meta); + auto ret = read_raw_data(file_path, tmp_data, meta); + if (!ret) + { + return std::unexpected(ret.error()); + } if (palette_found == true) { file_reader::buffer dest_palette{}; diff --git a/src/lily_png.h b/src/lily_png.h index 4fe1e2c..a14ca51 100644 --- a/src/lily_png.h +++ b/src/lily_png.h @@ -16,6 +16,13 @@ namespace lily_png unsigned char b = 0; }; + enum class png_error + { + file_doesnt_exist, + read_failed, + file_is_not_a_png + }; - metadata read_png(const std::string &file_path, file_reader::buffer &data); + + std::expected read_png(const std::string &file_path, file_reader::buffer &data); } \ No newline at end of file diff --git a/src/utils.cpp b/src/utils.cpp index 1ca060a..6354d85 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -4,6 +4,7 @@ size_t lily_png::get_pixel_bit_size(const metadata &meta) { size_t ret = 0; + std::println("Bit depth {} color {}", (int)meta.bit_depth, (int)meta.color_type); switch (meta.color_type) { case static_cast(color::grayscale): @@ -52,8 +53,9 @@ size_t lily_png::get_pixel_bit_size(const metadata &meta) return ret; } -size_t lily_png::get_uncompressed_size(const metadata meta) +size_t lily_png::get_uncompressed_size(const metadata &meta) { + std::println("metadata{{ width: {}, height: {}, bit_depth: {}, color_type: {}, compression: {}, filter: {}, interface: {} }}", meta.width, meta.height, (int)meta.bit_depth, (int)meta.color_type, (int)meta.compression, (int)meta.filter, (int)meta.interface); size_t ret = (meta.width * get_pixel_bit_size(meta) + 7)/8; //ceil() but for bytes ret = (ret + 1) * meta.height; std::println("Uncompressed size {}", ret); diff --git a/src/utils.h b/src/utils.h index 60c0b68..ae29df7 100644 --- a/src/utils.h +++ b/src/utils.h @@ -4,6 +4,6 @@ namespace lily_png { size_t get_pixel_bit_size(const metadata &meta); - size_t get_uncompressed_size(const metadata meta); + size_t get_uncompressed_size(const metadata &meta); int paeth_predict(const int a, const int b, const int c); }