|
// |
|
// main.m |
|
// pngdump |
|
// |
|
// Created by Johnnie Walker on 17/04/2014. |
|
// Copyright (c) 2014 LateNiteSoft. All rights reserved. |
|
// |
|
|
|
#import <Foundation/Foundation.h> |
|
|
|
#include <unistd.h> |
|
#include <stdlib.h> |
|
#include <stdio.h> |
|
#include <string.h> |
|
#include <stdarg.h> |
|
|
|
#define PNG_DEBUG 3 |
|
#include <png.h> |
|
|
|
void abort_(const char * s, ...) |
|
{ |
|
va_list args; |
|
va_start(args, s); |
|
vfprintf(stderr, s, args); |
|
fprintf(stderr, "\n"); |
|
va_end(args); |
|
abort(); |
|
} |
|
|
|
int x, y; |
|
|
|
int width, height; |
|
png_byte color_type; |
|
png_byte bit_depth; |
|
|
|
png_structp png_ptr; |
|
png_infop info_ptr; |
|
int number_of_passes; |
|
png_bytep * row_pointers; |
|
size_t data_length; |
|
|
|
// thank you @gcotenc http://zarb.org/~gc/html/libpng.html |
|
void read_png_file(const char* file_name) |
|
{ |
|
png_const_bytep header[8]; // 8 is the maximum size that can be checked |
|
|
|
/* open file and test for it being a png */ |
|
FILE *fp = fopen(file_name, "rb"); |
|
if (!fp) |
|
abort_("[read_png_file] File %s could not be opened for reading", file_name); |
|
fread(header, 1, 8, fp); |
|
if (png_sig_cmp(header, 0, 8)) |
|
abort_("[read_png_file] File %s is not recognized as a PNG file", file_name); |
|
|
|
|
|
/* initialize stuff */ |
|
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); |
|
|
|
if (!png_ptr) |
|
abort_("[read_png_file] png_create_read_struct failed"); |
|
|
|
info_ptr = png_create_info_struct(png_ptr); |
|
if (!info_ptr) |
|
abort_("[read_png_file] png_create_info_struct failed"); |
|
|
|
if (setjmp(png_jmpbuf(png_ptr))) |
|
abort_("[read_png_file] Error during init_io"); |
|
|
|
png_init_io(png_ptr, fp); |
|
png_set_sig_bytes(png_ptr, 8); |
|
|
|
png_read_info(png_ptr, info_ptr); |
|
|
|
width = png_get_image_width(png_ptr, info_ptr); |
|
height = png_get_image_height(png_ptr, info_ptr); |
|
color_type = png_get_color_type(png_ptr, info_ptr); |
|
bit_depth = png_get_bit_depth(png_ptr, info_ptr); |
|
|
|
number_of_passes = png_set_interlace_handling(png_ptr); |
|
png_read_update_info(png_ptr, info_ptr); |
|
|
|
|
|
/* read file */ |
|
if (setjmp(png_jmpbuf(png_ptr))) |
|
abort_("[read_png_file] Error during read_image"); |
|
|
|
png_size_t row_bytes = png_get_rowbytes(png_ptr,info_ptr); |
|
data_length = row_bytes * height; |
|
void *data = malloc(data_length); |
|
|
|
row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height); |
|
for (y=0; y<height; y++) { |
|
row_pointers[y] = data; |
|
data += row_bytes; |
|
// row_pointers[y] = (png_byte*) malloc(png_get_rowbytes(png_ptr,info_ptr)); |
|
} |
|
|
|
png_read_image(png_ptr, row_pointers); |
|
|
|
fclose(fp); |
|
} |
|
|
|
|
|
int main(int argc, const char * argv[]) |
|
{ |
|
|
|
@autoreleasepool { |
|
const char *input = argv[1]; |
|
const char *output = argv[2]; |
|
|
|
read_png_file(input); |
|
|
|
NSData *imageData = [NSData dataWithBytesNoCopy:row_pointers[0] length:data_length freeWhenDone:YES]; |
|
[imageData writeToFile:[NSString stringWithCString:output encoding:NSUTF8StringEncoding] atomically:NO]; |
|
} |
|
return 0; |
|
} |
|
|
true