Tutorials

==About==
The tutorials will guide you on how to:
# Compile different libraries from source using Visual Studio 2013
# Use the libraries and headers in a simple C++ project
==Prerequisites==
To follow the instructions in this guide the following programs should be installed first:
 1. Visual Studio 2013
 2. CMake
 3. GIT
 4. MinGW with GIT
 5. Doxygen (optional)
 6. Python (optional)
==Preparations==
 1) Launch MinGW as administrator:
 WIN > C:\MinGW\msys\1.0\msys.bat Ctrl+Shift+Enter > Alt+y
 
 2) MinGW with GIT
 Download MinGW:
 http://sourceforge.net/projects/mingw/files/
 > http://sourceforge.net/projects/mingw/files/latest/download?source=files
 
 Add GIT to MinGW
 Edit C:\MinGW\msys\1.0\etc\profile
 export PATH=$PATH:/c/Program\ Files\ \(x86\)/Git/bin
 
 Create alias:
 Edit C:\MinGW\msys\1.0\home\home\.profile
 alias subl='C:/Program\ Files/Sublime\ Text\ 3/sublime_text.exe'
 alias cmake-gui='C:/Program\ Files\ \(x86\)/CMake\ 2.8/bin/cmake-gui.exe'
 
 3) Mercurial
 http://mercurial.selenic.com/wiki/Download
 http://bitbucket.org/tortoisehg/files/downloads/tortoisehg-2.11.2-hg-2.9.2-x64.msi
==GLFW==
===GLFW: Retrieve the source===
# First time only: clone from GitHub
cd C:/dev/remotes; git clone https://github.com/glfw/glfw.git
# Update the source
rm -rf c:/dev/vsprojects/glfw
cd C:/dev/remotes/glfw; git pull origin master; wait; cp -r . c:/dev/vsprojects/glfw
===GLFW: Run CMake (Build VS Project)===
cd c:/dev/vsprojects/glfw
cmake -G"Visual Studio 12 Win64" --build .
===GLFW: Compile from Mingw===
python
import os
os.system('"C:/Program Files (x86)/MSBuild/12.0/Bin/amd64/MSBuild.exe"\
 /P:Configuration=Release INSTALL.vcxproj')
exit()
===GLFW: Copy include and lib files===
rm -rf c:/dev/bin/glfw.bin.WIN64
mkdir c:/dev/bin/glfw.bin.WIN64
cp -r c:/dev/vsprojects/glfw/include c:/dev/bin/glfw.bin.WIN64
cp -r c:/dev/vsprojects/glfw/src/Release c:/dev/bin/glfw.bin.WIN64/lib
===GLFW: Back in Visual Studio===
Ctrl+Shift+n (FILE > New Project > Win32 Console Application)
Alt+n (Name) test_glfw
Alt+l (Location) c:\dev\tests\glfw
Next > Console Application, Empty Project > Finish
Ctrl+Shift+a (Right Click on HelloWorld project, Add > New Item...), C++ File
Alt+n (Name) hello.cpp > Save
 Tutorials#Hello.cpp
 Ctrl+S (Save)
Alt+F7 (Select PROJECT > HelloWorld Properties…)
Alt+c r (Configuration: Release)
Configuration Manager
Alt+c r (Active solution configuration: Release)
Alt+p DOWN ENTER DOWN DOWN ENTER (Active solution platform: New, x64)
ENTER (Close)
C/C++ > General > Additional Include Directories:
 C:\dev\bin\glfw.bin.WIN64\include
Linker > General > Additional Library Directories:
 C:\dev\bin\glfw.bin.WIN64\lib
Linker > Input > Additional Dependencies:
 glfw3.lib;opengl32.lib;glu32.lib;
Alt+a (Apply), ENTER (OK)
OK
F7 (Build)
# Run the test application:
cd c:dev/tests/glfw/test_glfw/x64/Release
test_glfw.exe
==Zlib==
===Zlib: Retrieve the source===
# First time only: clone from GitHub
cd c:/dev/remotes; git clone https://github.com/madler/zlib.git
# Update the source
rm -rf c:/dev/vsprojects/zlib
cd c:/dev/remotes/zlib; git pull origin master; wait; cp -r . C:/dev/vsprojects/zlib
===Zlib: Run CMake (Build VS Project)===
cd c:/dev/vsprojects/glfw
cmake -G"Visual Studio 12 Win64" --build .
===Zlib: Compile from Mingw===
python
import os
os.system('"C:/Program Files (x86)/MSBuild/12.0/Bin/amd64/MSBuild.exe"\
 /P:Configuration=Release INSTALL.vcxproj')
exit()
===Zlib: Copy include and lib files===
rm -rf c:/dev/bin/zlib.bin.WIN64
mkdir c:/dev/bin/zlib.bin.WIN64
mkdir c:/dev/bin/zlib.bin.WIN64/include
cp c:/dev/vsprojects/zlib/*.h c:/dev/bin/zlib.bin.WIN64/include
cp -r c:/dev/vsprojects/zlib/Release c:/dev/bin/zlib.bin.WIN64/lib
===Zlib: Back in Visual Studio===
 Ctrl+Shift+n (FILE > New Project > Win32 Console Application)
 Alt+n (Name) test_zlib
 Alt+l (Location) C:\dev\tests\zlib
 OK
 Next > Console Application, Empty Project > Finish
 Ctrl+Shift+a (Right Click on project, Add > New Item...), C++ File
 Alt+n (Name) zpipe.cpp ENTER (Add)
 Copy paste: Tutorials#zpipe.c
 Ctrl+s (Save)
 Alt+F7 (Select PROJECT > zpipe Properties…)
 Alt+c r (Configuration: Release)
 Configuration Manager
 Alt+c r (Active solution configuration: Release)
 Alt+p DOWN ENTER DOWN DOWN ENTER (Active solution platform: New, x64)
 ENTER (Close)
 C/C++ > General > Additional Include Directories:
 C:\dev\bin\zlib.bin.WIN64\include
 Linker > General > Additional Library Directories:
 C:\dev\bin\zlib.bin.WIN64\lib
 Linker > Input > Additional Dependencies:
 zlib.lib;
 Alt+a (Apply), ENTER (OK)
 OK
 F7 (Build)
 Alt+f c (Close Project)
 Alt+F4 (Close Visual Studio)
# Test zpipe
cd c:/dev/tests/zlib/test_zlib/x64/Release
cp c:/dev/bin/zlib.bin.WIN64/lib/zlib.dll .
cp c:/dev/tests/zlib/test_zlib/test_zlib/zpipe.cpp .
mv test_zlib.exe zpipe.exe
zpipe < zpipe.cpp > zpipe.z
zpipe -d < zpipe.z > zpipe.txt
diff zpipe.cpp zpipe.txt
==Libpng==
http://libpng.org
http://libpng.org/pub/png/libpng.html
===Libpng: Retrieve the source===
# First time only: cd C:/dev/remotes; git clone git://git.code.sf.net/p/libpng/code libpng
rm -rf c:/dev/vsprojects/libpng
cd C:/dev/remotes/libpng; git pull origin master; wait; cp -r . C:/dev/vsprojects/libpng
===Libpng: Add external library: zlib===
 # Copy zlib bins to lpng
 cd c:/dev/vsprojects/libpng; mkdir external
 cp -r c:/dev/bin/zlib.bin.WIN64 external
===Libpng: Modify CMakeLists.txt===
printf "if(COMMAND cmake_policy)\n\
 cmake_policy(SET CMP0003 NEW)\n\
endif(COMMAND cmake_policy)\n\
set(ZLIB_INCLUDE_DIR external/zlib.bin.WIN64/include)\n\
set(ZLIB_LIBRARY external/zlib.bin.WIN64/lib/zlib)\n\
\n\
" > temp.txt
csplit CMakeLists.txt "/project(libpng C)/"
cat xx00 temp.txt xx01 > CMakeLists.txt
rm xx00; rm xx01; rm temp.txt
===Libpng: Run CMake (Build VS Project)===
cmake -G"Visual Studio 12 Win64" --build .
===Libpng: Compile from Mingw===
python
import os
os.system('"C:/Program Files (x86)/MSBuild/12.0/Bin/amd64/MSBuild.exe"\
 /P:Configuration=Release INSTALL.vcxproj')
exit()
===Libpng: Run companion applications===
# To run included testapps, copy dynamic zlib library:
cp C:/dev/bin/zlib.bin.WIN64/lib/zlib.dll C:/dev/vsprojects/libpng/Release
cp c:/dev/resources/libpng/pngtest.png c:/dev/vsprojects/libpng/Release/pngtest.png
cd C:/dev/vsprojects/libpng/Release
pngstest #todo: check what this does
pngtest
pngvalid
===Libpng: Copy include and lib files===
rm -rf c:/dev/bin/libpng.bin.WIN64
mkdir c:/dev/bin/libpng.bin.WIN64
mkdir c:/dev/bin/libpng.bin.WIN64/include
mkdir c:/dev/bin/libpng.bin.WIN64/lib
cp c:/dev/vsprojects/libpng/*.h c:/dev/bin/libpng.bin.WIN64/include
cp c:/dev/vsprojects/libpng/Release/* c:/dev/bin/libpng.bin.WIN64/lib
===Libpng: Back in Visual Studio (Test)===
Ctrl+Shift+n (FILE > New Project > Win32 Console Application)
Alt+n (Name) test_libpng
Alt+l (Location) C:\dev\tests\libpng
OK
Next > Console Application, Empty Project > Finish
Ctrl+Shift+a (Right Click on project, Add > New Item...), C++ File
Alt+n (Name) pngtest.cpp ENTER (Add)
 Copy-paste: Tutorials#pngtest.cpp
 Ctrl+s (Save)
Alt+F7 (Select PROJECT > pngtest Properties…)
Alt+c r (Configuration: Release)
Configuration Manager
Alt+c r (Active solution configuration: Release)
Alt+p DOWN ENTER DOWN DOWN ENTER (Active solution platform: New, x64)
ENTER (Close)
C/C++ > General > Additional Include Directories:
 C:\dev\bin\libpng.bin.WIN64\include
Linker > General > Additional Library Directories:
 C:\dev\bin\libpng.bin.WIN64\lib
Linker > Input > Additional Dependencies:
 libpng16.lib;
Alt+a (Apply), ENTER (OK)
OK
F7 (Build)
Alt+f t (Close Solution)
Alt+F4 (Close Visual Studio)
<pre>
# Test pngtest
cd c:/dev/tests/libpng/test_libpng/x64/Release
cp c:/dev/resources/libpng/pngfish.png .
cp c:/dev/bin/libpng.bin.WIN64/lib/libpng16.dll .
cp c:/dev/bin/zlib.bin.WIN64/lib/zlib.dll .
mv test_libpng.exe pngfilter.exe
pngfilter pngfish.png outfish.png > output.txt
python
import os; os.system('mspaint outfish.png'); os.system('mspaint pngfish.png')
[Alt+f+x]
[Alt+f+x]
exit()
==Libzip==
 http://www.nih.at/libzip/
===Libzip: Retrieve the source===
# (WIN > C:\MinGW\msys\1.0\msys.bat Ctrl+Shift+Enter > Alt+y)
# First time only cd c:/dev/remotes; hg clone http://hg.nih.at/libzip
rm -rf c:/dev/vsprojects/libzip
cd c:/dev/remotes/libzip; hg pull http://hg.nih.at/libzip; wait; hg update
cp -r . C:/dev/vsprojects/libzip
===Libzip: Add external library: zlib===
 # Copy zlib bins to libzip
 cd c:/dev/vsprojects/libzip; mkdir external; cp -r C:/dev/bin/zlib.bin.WIN64 external
===Libzip: Modify CMakeLists.txt===
printf "if(COMMAND cmake_policy)\n\
 cmake_policy(SET CMP0003 NEW)\n\
endif(COMMAND cmake_policy)\n\
set(ZLIB_INCLUDE_DIR external/zlib.bin.WIN64/include)\n\
set(ZLIB_LIBRARY c:/dev/libzip/external/zlib.bin.WIN64/lib/zlib.lib)\n\
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)\n\
\n\
" > temp.txt
csplit CMakeLists.txt "/PROJECT(libzip C)/"
cat xx00 temp.txt xx01 > CMakeLists.txt
rm xx00; rm xx01; rm temp.txt
# Quick fix for incorrect version check. Improved fix in stackoverflow.
# http://stackoverflow.com/questions/10507893/libzip-with-visual-studio-2010
# Also contains interesting info on how to use Visual Studio cmd prompt
sed -i 's/FATAL_ERROR/WARNING/' CMakeLists.txt
===Libzip: Run CMake (Build VS Project)===
cmake -G"Visual Studio 12 Win64" --build .
===Libzip: Compile from Mingw===
python
import os
os.system('"C:/Program Files (x86)/MSBuild/12.0/Bin/amd64/MSBuild.exe"\
 /P:Configuration=Release INSTALL.vcxproj')
exit()
===Libzip: Copy include and lib files===
rm -rf c:/dev/bin/libzip.bin.WIN64
mkdir c:/dev/bin/libzip.bin.WIN64
mkdir c:/dev/bin/libzip.bin.WIN64/include
mkdir c:/dev/bin/libzip.bin.WIN64/lib
cp *.h c:/dev/bin/libzip.bin.WIN64/include
cp lib/*.h c:/dev/bin/libzip.bin.WIN64/include
cp lib/Release/* c:/dev/bin/libzip.bin.WIN64/lib
===Libzip: Back in Visual Studio (Test)===
Ctrl+Shift+n (FILE > New Project > Win32 Console Application)
Alt+n (Name) test_libzip
Alt+l (Location) C:\dev\tests\test_libzip
OK
Next > Console Application, Empty Project > Finish
 Ctrl+Shift+a (Right Click on project, Add > New Item...), C++ File
 Alt+n (Name) libziptest.cpp .cpp ENTER (Add)
 Copy-paste: Tutorials#libziptest.cpp
 Ctrl+s (Save)
Alt+F7 (Select PROJECT > libziptest Properties…)
Alt+c r (Configuration: Release)
Configuration Manager
Alt+c r (Active solution configuration: Release)
Alt+p DOWN ENTER DOWN DOWN ENTER (Active solution platform: New, x64)
ENTER (Close)
C/C++ > General > Additional Include Directories:
 C:\dev\bin\libzip.bin.WIN64\include
Linker > General > Additional Library Directories:
 C:\dev\bin\libzip.bin.WIN64\lib
Linker > Input > Additional Dependencies:
 zip.lib;
Alt+a (Apply), ENTER (OK)
OK
F7 (Build)
Alt+f+t (Close Solution)
Alt+F4 (Close Visual Studio)
# Test pngtest
cd C:/dev/tests/libzip/test_libzip/x64/Release
echo "HelloWorld" > file.txt
# todo add 7z to path
C:/Program\ Files/7-Zip/7z a -tzip foo.zip file.txt
cp C:/dev/bin/zlib.bin.WIN64/lib/zlib.dll .
cp C:/dev/bin/libzip.bin.WIN64/lib/zip.dll .
mv test_libzip.exe libziptest.exe
libziptest
== Links ==
http://www.opengl-tutorial.org/beginners-tutorials/tutorial-1-opening-a-window/
==Hello.cpp==
// http://www.glfw.org/documentation.html#example_code
#include <GLFW/glfw3.h>
int main(void)
{
 GLFWwindow* window;
 /* Initialize the library */
 if (!glfwInit())
 return -1;
 /* Create a windowed mode window and its OpenGL context */
 window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
 if (!window)
 {
 glfwTerminate();
 return -1;
 }
 /* Make the window's context current */
 glfwMakeContextCurrent(window);
 /* Loop until the user closes the window */
 while (!glfwWindowShouldClose(window))
 {
 /* Render here */
 /* Swap front and back buffers */
 glfwSwapBuffers(window);
 /* Poll for and process events */
 glfwPollEvents();
 }
 glfwTerminate();
 return 0;
}
==zpipe.c==
// http://www.zlib.net/zpipe.c
// Ctrl+h Replace setmode to _setmode and fileno to _fileno
// ESC (Close find replace)
/* zpipe.c: example of proper use of zlib's inflate() and deflate()
 Not copyrighted -- provided to the public domain
 Version 1.4 11 December 2005 Mark Adler */
/* Version history:
 1.0 30 Oct 2004 First version
 1.1 8 Nov 2004 Add void casting for unused return values
 Use switch statement for inflate() return values
 1.2 9 Nov 2004 Add assertions to document zlib guarantees
 1.3 6 Apr 2005 Remove incorrect assertion in inf()
 1.4 11 Dec 2005 Add hack to avoid MSDOS end-of-line conversions
 Avoid some compiler warnings for input and output buffers
 */
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "zlib.h"
#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
# include <fcntl.h>
# include <io.h>
# define SET_BINARY_MODE(file) _setmode(_fileno(file), O_BINARY)
#else
# define SET_BINARY_MODE(file)
#endif
#define CHUNK 16384
/* Compress from file source to file dest until EOF on source.
 def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
 allocated for processing, Z_STREAM_ERROR if an invalid compression
 level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
 version of the library linked do not match, or Z_ERRNO if there is
 an error reading or writing the files. */
int def(FILE *source, FILE *dest, int level)
{
 int ret, flush;
 unsigned have;
 z_stream strm;
 unsigned char in[CHUNK];
 unsigned char out[CHUNK];
 /* allocate deflate state */
 strm.zalloc = Z_NULL;
 strm.zfree = Z_NULL;
 strm.opaque = Z_NULL;
 ret = deflateInit(&strm, level);
 if (ret != Z_OK)
 return ret;
 /* compress until end of file */
 do {
 strm.avail_in = fread(in, 1, CHUNK, source);
 if (ferror(source)) {
 (void)deflateEnd(&strm);
 return Z_ERRNO;
 }
 flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
 strm.next_in = in;
 /* run deflate() on input until output buffer not full, finish
 compression if all of source has been read in */
 do {
 strm.avail_out = CHUNK;
 strm.next_out = out;
 ret = deflate(&strm, flush); /* no bad return value */
 assert(ret != Z_STREAM_ERROR); /* state not clobbered */
 have = CHUNK - strm.avail_out;
 if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
 (void)deflateEnd(&strm);
 return Z_ERRNO;
 }
 } while (strm.avail_out == 0);
 assert(strm.avail_in == 0); /* all input will be used */
 /* done when last data in file processed */
 } while (flush != Z_FINISH);
 assert(ret == Z_STREAM_END); /* stream will be complete */
 /* clean up and return */
 (void)deflateEnd(&strm);
 return Z_OK;
}
/* Decompress from file source to file dest until stream ends or EOF.
 inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be
 allocated for processing, Z_DATA_ERROR if the deflate data is
 invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and
 the version of the library linked do not match, or Z_ERRNO if there
 is an error reading or writing the files. */
int inf(FILE *source, FILE *dest)
{
 int ret;
 unsigned have;
 z_stream strm;
 unsigned char in[CHUNK];
 unsigned char out[CHUNK];
 /* allocate inflate state */
 strm.zalloc = Z_NULL;
 strm.zfree = Z_NULL;
 strm.opaque = Z_NULL;
 strm.avail_in = 0;
 strm.next_in = Z_NULL;
 ret = inflateInit(&strm);
 if (ret != Z_OK)
 return ret;
 /* decompress until deflate stream ends or end of file */
 do {
 strm.avail_in = fread(in, 1, CHUNK, source);
 if (ferror(source)) {
 (void)inflateEnd(&strm);
 return Z_ERRNO;
 }
 if (strm.avail_in == 0)
 break;
 strm.next_in = in;
 /* run inflate() on input until output buffer not full */
 do {
 strm.avail_out = CHUNK;
 strm.next_out = out;
 ret = inflate(&strm, Z_NO_FLUSH);
 assert(ret != Z_STREAM_ERROR); /* state not clobbered */
 switch (ret) {
 case Z_NEED_DICT:
 ret = Z_DATA_ERROR; /* and fall through */
 case Z_DATA_ERROR:
 case Z_MEM_ERROR:
 (void)inflateEnd(&strm);
 return ret;
 }
 have = CHUNK - strm.avail_out;
 if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
 (void)inflateEnd(&strm);
 return Z_ERRNO;
 }
 } while (strm.avail_out == 0);
 /* done when inflate() says it's done */
 } while (ret != Z_STREAM_END);
 /* clean up and return */
 (void)inflateEnd(&strm);
 return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}
/* report a zlib or i/o error */
void zerr(int ret)
{
 fputs("zpipe: ", stderr);
 switch (ret) {
 case Z_ERRNO:
 if (ferror(stdin))
 fputs("error reading stdin\n", stderr);
 if (ferror(stdout))
 fputs("error writing stdout\n", stderr);
 break;
 case Z_STREAM_ERROR:
 fputs("invalid compression level\n", stderr);
 break;
 case Z_DATA_ERROR:
 fputs("invalid or incomplete deflate data\n", stderr);
 break;
 case Z_MEM_ERROR:
 fputs("out of memory\n", stderr);
 break;
 case Z_VERSION_ERROR:
 fputs("zlib version mismatch!\n", stderr);
 }
}
/* compress or decompress from stdin to stdout */
int main(int argc, char **argv)
{
 int ret;
 /* avoid end-of-line conversions */
 SET_BINARY_MODE(stdin);
 SET_BINARY_MODE(stdout);
 /* do compression if no arguments */
 if (argc == 1) {
 ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);
 if (ret != Z_OK)
 zerr(ret);
 return ret;
 }
 /* do decompression if -d specified */
 else if (argc == 2 && strcmp(argv[1], "-d") == 0) {
 ret = inf(stdin, stdout);
 if (ret != Z_OK)
 zerr(ret);
 return ret;
 }
 /* otherwise, report usage */
 else {
 fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr);
 return 1;
 }
}
==pngtest.cpp==
/* Copy example from http://zarb.org/~gc/resource/libpng-short-example.c
 Modify source:
 Ctrl+h <unistd> TAB <io.h> ENTER ENTER ESC (Close find replace)
 TOP #define _CRT_SECURE_NO_WARNINGS
 Comment all blocks containing setjmp, png_set_strip_16, png_set_expand
 // Move [*]/ in /[*] perform whatever ... [*]/ to the end of the top line
*/
/*
 * Copyright 2002-2011 Guillaume Cottenceau and contributors.
 *
 * This software may be freely redistributed under the terms
 * of the X11 license.
 *
 */
#define _CRT_SECURE_NO_WARNINGS
#include <io.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, rowbytes;
png_byte color_type;
png_byte bit_depth;
png_structp png_ptr;
png_infop info_ptr;
int number_of_passes;
png_bytep * row_pointers;
void read_png_file(char* file_name)
{
 unsigned char 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");
 */
 row_pointers = (png_bytep*)malloc(sizeof(png_bytep)* height);
 if (bit_depth == 16)
 rowbytes = width * 8;
 else
 rowbytes = width * 4;
 for (y = 0; y<height; y++)
 row_pointers[y] = (png_byte*)malloc(rowbytes);
 png_read_image(png_ptr, row_pointers);
 fclose(fp);
}
void write_png_file(char* file_name)
{
 /* create file */
 FILE *fp = fopen(file_name, "wb");
 if (!fp)
 abort_("[write_png_file] File %s could not be opened for writing", file_name);
 /* initialize stuff */
 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
 if (!png_ptr)
 abort_("[write_png_file] png_create_write_struct failed");
 info_ptr = png_create_info_struct(png_ptr);
 if (!info_ptr)
 abort_("[write_png_file] png_create_info_struct failed");
 /*
 if (setjmp(png_jmpbuf(png_ptr)))
 abort_("[write_png_file] Error during init_io");
 */
 png_init_io(png_ptr, fp);
 /* write header */
 /*
 if (setjmp(png_jmpbuf(png_ptr)))
 abort_("[write_png_file] Error during writing header");
 */
 png_set_IHDR(png_ptr, info_ptr, width, height,
 8, 6, PNG_INTERLACE_NONE,
 PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
 png_write_info(png_ptr, info_ptr);
 /* write bytes */
 /*
 if (setjmp(png_jmpbuf(png_ptr)))
 abort_("[write_png_file] Error during writing bytes");
 */
 png_write_image(png_ptr, row_pointers);
 /* end write */
 /*
 if (setjmp(png_jmpbuf(png_ptr)))
 abort_("[write_png_file] Error during end of write");
 */
 png_write_end(png_ptr, NULL);
 /* cleanup heap allocation */
 for (y = 0; y<height; y++)
 free(row_pointers[y]);
 free(row_pointers);
 fclose(fp);
}
void process_file(void)
{
 /* Expand any grayscale, RGB, or palette images to RGBA */
 //png_set_expand(png_ptr);
 /* Reduce any 16-bits-per-sample images to 8-bits-per-sample */
 //png_set_strip_16(png_ptr);
 for (y = 0; y<height; y++) {
 png_byte* row = row_pointers[y];
 for (x = 0; x<width; x++) {
 png_byte* ptr = &(row[x * 4]);
 printf("Pixel at position [ %d - %d ] has RGBA values: %d - %d - %d - %d\n",
 x, y, ptr[0], ptr[1], ptr[2], ptr[3]);
 /* perform whatever modifications needed, for example to set red value to 0 and green value to the blue one: */
 ptr[0] = 0;
 ptr[1] = ptr[2];
 }
 }
}
int main(int argc, char **argv)
{
 if (argc != 3)
 abort_("Usage: program_name <file_in> <file_out>");
 read_png_file(argv[1]);
 process_file();
 write_png_file(argv[2]);
 return 0;
}
==libziptest.cpp==
// Source
// http://stackoverflow.com/questions/10440113/simple-way-to-unzip-a-zip-file-using-zlib
#include <zip.h>
int main()
{
 //Open the ZIP archive
 int err = 0;
 zip *z = zip_open("foo.zip", 0, &err);
 //Search for the file of given name
 const char *name = "file.txt";
 struct zip_stat st;
 zip_stat_init(&st);
 zip_stat(z, name, 0, &st);
 //Alloc memory for its uncompressed contents
 char *contents = new char[st.size];
 //Read the compressed file
 zip_file *f = zip_fopen(z, "file.txt", 0);
 zip_fread(f, contents, st.size);
 zip_fclose(f);
 //And close the archive
 zip_close(z);
 printf("contents:\n%s", contents);
}