From 48d275a01baaff68a0c055dd77664b5d0f22d70d Mon Sep 17 00:00:00 2001 From: Andreas Grois Date: Sat, 10 Mar 2018 00:14:46 +0100 Subject: Dump result to image.png in current folder. --- BuddhaTest/src/Helpers.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'BuddhaTest/src/Helpers.cpp') diff --git a/BuddhaTest/src/Helpers.cpp b/BuddhaTest/src/Helpers.cpp index e9caba9..69dafa3 100644 --- a/BuddhaTest/src/Helpers.cpp +++ b/BuddhaTest/src/Helpers.cpp @@ -3,6 +3,7 @@ #include #include #include +#include namespace Helpers { @@ -146,4 +147,67 @@ namespace Helpers glDeleteShader(ComputeShaderID); return ProgramID; } + void WriteOutputPNG(const std::vector& data, unsigned int width, unsigned int height) + { + png_byte ** row_pointers = static_cast(calloc(height,sizeof(void *))); + for(int i = 0; i < height ; ++i) + { + row_pointers[i] = static_cast(calloc(3*width,sizeof(png_byte))); + } + + uint32_t maxValue{UINT32_C(0)}; + for(unsigned int i = 0; i < data.size();++i) + { + maxValue = std::max(maxValue,data[i]); + } + for(unsigned int i = 0; i < data.size();++i) + { + unsigned int row = (i)/(3*width); + unsigned int col = i - 3*row*width; + row_pointers[row][col] = (255*data[i] + (maxValue/2))/maxValue; + } + + //beware, this is going to be ugly C syntax, but well, libpng... + FILE * fp = fopen("image.png", "wb"); + if(!fp) + { + return; + } + png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); + if(!png_ptr) + { + fclose(fp); + return; + } + png_infop info_ptr = png_create_info_struct(png_ptr); + if(!info_ptr) + { + png_destroy_write_struct(&png_ptr, (png_infopp)NULL); + fclose(fp); + return; + } + if(setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_write_struct(&png_ptr, &info_ptr); + fclose(fp); + return; + } + png_init_io(png_ptr, fp); + png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + + png_write_info(png_ptr, info_ptr); + //header written. + + png_write_image(png_ptr, row_pointers); + + png_write_end(png_ptr, info_ptr); + png_destroy_write_struct(&png_ptr, &info_ptr); + + for(int i = 0; i < height ; ++i) + { + free(row_pointers[i]); + } + + free(row_pointers); + } } -- cgit v1.2.3