1 (*
2  * Hedgewars, a free turn based strategy game
3  * Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; version 2 of the License
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  *)
18 
19 {$INCLUDE "options.inc"}
20 
21 unit PNGh;
22 interface
23 
24 uses png;
25 
26 
27 {$IFDEF DARWIN}
28     {$linklib png}
29 {$ENDIF}
30 
31 const
32     // Constants for libpng, they are not defined in png unit.
33     // We actually do not need all of them.
34 
35     // These describe the color_type field in png_info.
36     // color type masks
37     PNG_COLOR_MASK_PALETTE = 1;
38     PNG_COLOR_MASK_COLOR   = 2;
39     PNG_COLOR_MASK_ALPHA   = 4;
40 
41     // color types.  Note that not all combinations are legal
42     PNG_COLOR_TYPE_GRAY       = 0;
43     PNG_COLOR_TYPE_PALETTE    = PNG_COLOR_MASK_COLOR or PNG_COLOR_MASK_PALETTE;
44     PNG_COLOR_TYPE_RGB        = PNG_COLOR_MASK_COLOR;
45     PNG_COLOR_TYPE_RGB_ALPHA  = PNG_COLOR_MASK_COLOR or PNG_COLOR_MASK_ALPHA;
46     PNG_COLOR_TYPE_GRAY_ALPHA = PNG_COLOR_MASK_ALPHA;
47 
48     // aliases
49     PNG_COLOR_TYPE_RGBA = PNG_COLOR_TYPE_RGB_ALPHA;
50     PNG_COLOR_TYPE_GA   = PNG_COLOR_TYPE_GRAY_ALPHA;
51 
52     // This is for compression type. PNG 1.0-1.2 only define the single type.
53     PNG_COMPRESSION_TYPE_BASE    = 0; // Deflate method 8, 32K window
54     PNG_COMPRESSION_TYPE_DEFAULT = PNG_COMPRESSION_TYPE_BASE;
55 
56     // This is for filter type. PNG 1.0-1.2 only define the single type.
57     PNG_FILTER_TYPE_BASE        = 0;  // Single row per-byte filtering
58     PNG_INTRAPIXEL_DIFFERENCING = 64; // Used only in MNG datastreams
59     PNG_FILTER_TYPE_DEFAULT     = PNG_FILTER_TYPE_BASE;
60 
61     // These are for the interlacing type.  These values should NOT be changed.
62     PNG_INTERLACE_NONE  = 0; // Non-interlaced image
63     PNG_INTERLACE_ADAM7 = 1; // Adam7 interlacing
64     PNG_INTERLACE_LAST  = 2; // Not a valid value
65 
66 type
67     // where is better place for this definition?
68     PFile = ^file;
69 
70 procedure png_init_pascal_io(png_ptr: png_structp; pf : PFile);
71 
72 implementation
73 
74 // We cannot get c-style FILE* pointer to pass it to libpng, so we implement our own writing functions
75 procedure PngWriteData(png_ptr: png_structp; p: PByte; len: png_size_t); cdecl;
76 begin
77     BlockWrite( PFile(png_get_io_ptr(png_ptr))^, p^, len);
78 end;
79 
80 procedure PngFlushData(png_ptr: png_structp); cdecl;
81 begin
82     png_ptr:= png_ptr;
83 end;
84 
85 procedure png_init_pascal_io(png_ptr: png_structp; pf : PFile);
86 begin
87     png_set_write_fn(png_ptr, pf, @PngWriteData, @PngFlushData);
88 end;
89 
90 end.
91