source: trunk/poppler/mypoppler/goo/PNGWriter.cc @ 470

Last change on this file since 470 was 470, checked in by Silvan Scherrer, 11 years ago

poppler, jpeg, freetype lib updates

  • Property svn:eol-style set to native
File size: 2.7 KB
Line 
1//========================================================================
2//
3// PNGWriter.cc
4//
5// This file is licensed under the GPLv2 or later
6//
7// Copyright (C) 2009 Warren Toomey <wkt@tuhs.org>
8// Copyright (C) 2009 Shen Liang <shenzhuxi@gmail.com>
9// Copyright (C) 2009 Albert Astals Cid <aacid@kde.org>
10// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
11// Copyright (C) 2010 Adrian Johnson <ajohnson@redneon.com>
12// Copyright (C) 2011 Thomas Klausner <wiz@danbala.tuwien.ac.at>
13//
14//========================================================================
15
16#include "PNGWriter.h"
17
18#ifdef ENABLE_LIBPNG
19
20#include <zlib.h>
21
22#include "poppler/Error.h"
23
24PNGWriter::PNGWriter()
25{
26}
27
28PNGWriter::~PNGWriter()
29{
30        /* cleanup heap allocation */
31        png_destroy_write_struct(&png_ptr, &info_ptr);
32}
33
34bool PNGWriter::init(FILE *f, int width, int height, int hDPI, int vDPI)
35{
36        /* initialize stuff */
37        png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
38        if (!png_ptr) {
39                error(-1, "png_create_write_struct failed");
40                return false;
41        }
42
43        info_ptr = png_create_info_struct(png_ptr);
44        if (!info_ptr) {
45                error(-1, "png_create_info_struct failed");
46                return false;
47        }
48
49        if (setjmp(png_jmpbuf(png_ptr))) {
50                error(-1, "png_jmpbuf failed");
51                return false;
52        }
53
54        /* write header */
55        png_init_io(png_ptr, f);
56        if (setjmp(png_jmpbuf(png_ptr))) {
57                error(-1, "Error during writing header");
58                return false;
59        }
60       
61        // Set up the type of PNG image and the compression level
62        png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
63
64        png_byte bit_depth = 8;
65        png_byte color_type = PNG_COLOR_TYPE_RGB;
66        png_byte interlace_type = PNG_INTERLACE_NONE;
67
68        png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, interlace_type, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
69
70        // PNG_RESOLUTION_UNKNOWN means dots per inch
71        png_set_pHYs(png_ptr, info_ptr, hDPI, vDPI, PNG_RESOLUTION_UNKNOWN);
72
73        png_write_info(png_ptr, info_ptr);
74        if (setjmp(png_jmpbuf(png_ptr))) {
75                error(-1, "error during writing png info bytes");
76                return false;
77        }
78       
79        return true;
80}
81
82bool PNGWriter::writePointers(unsigned char **rowPointers, int rowCount)
83{
84        png_write_image(png_ptr, rowPointers);
85        /* write bytes */
86        if (setjmp(png_jmpbuf(png_ptr))) {
87                error(-1, "Error during writing bytes");
88                return false;
89        }
90       
91        return true;
92}
93
94bool PNGWriter::writeRow(unsigned char **row)
95{
96        // Write the row to the file
97        png_write_rows(png_ptr, row, 1);
98        if (setjmp(png_jmpbuf(png_ptr))) {
99                error(-1, "error during png row write");
100                return false;
101        }
102       
103        return true;
104}
105
106bool PNGWriter::close()
107{
108        /* end write */
109        png_write_end(png_ptr, info_ptr);
110        if (setjmp(png_jmpbuf(png_ptr))) {
111                error(-1, "Error during end of write");
112                return false;
113        }
114       
115        return true;
116}
117
118#endif
Note: See TracBrowser for help on using the repository browser.