1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#include <string>
#include <stdio.h>
#include <string.h>
#include "libpng_wrapper.hpp"
using namespace std;
png::png(string filename, uint32_t width, uint32_t height) {
//have to use the old C way to access files for libPNGs sake
output_fp = fopen(filename.c_str(), "wb");
if(!output_fp) throw PNG_FILE_ERROR;
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if(!png_ptr) throw PNG_LIBPNG_ERROR;
png_info_ptr = png_create_info_struct(png_ptr);
if(!png_info_ptr) throw PNG_LIBPNG_ERROR;
png_init_io(png_ptr, output_fp);
png_set_IHDR(png_ptr, png_info_ptr, width, height, DEFAULT_BIT_DEPTH, DEFAULT_COLOR_TYPE,
(DEFAULT_INTERLACE) ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
row_pointers = new png_bytep[height * sizeof(png_bytep)];
for(size_t row = 0; row < height; row++)
row_pointers[row] = new png_byte[png_get_rowbytes(png_ptr, png_info_ptr)];
}
png::~png() {
png_write_info(png_ptr, png_info_ptr);
png_write_image(png_ptr, row_pointers);
png_write_end(png_ptr, NULL);
png_destroy_write_struct(&png_ptr, &png_info_ptr);
fclose(output_fp);
}
void png::set_pixel(uint32_t x, uint32_t y, png_byte r, png_byte g, png_byte b) {
row_pointers[y][x * 3] = r;
row_pointers[y][(x * 3) + 1] = g;
row_pointers[y][(x * 3) + 2] = b;
}
uint32_t png::width() { return png_get_image_width(png_ptr, png_info_ptr); }
uint32_t png::height() { return png_get_image_height(png_ptr, png_info_ptr); }
|