2
// This unit is part of the GLScene Engine https://github.com/glscene
6
30/06/11 - DaStr - Fixed compiler crash for Delphi7
7
16/02/11 - PREDATOR - Added support for Mac OS X. Tested on Mac OS X 10.6.5.
8
01/04/10 - Yar - Bugfix when Delphi not use optimization (thanks Lampogolovii)
9
15/03/10 - Yar - Fixed memory leak (thanks Lampogolovii)
10
05/03/10 - Yar - Creation
22
{$IFDEF MSWINDOWS} Windows, {$ENDIF}
23
{$IFDEF GLS_X11_SUPPORT} x, {$ENDIF}
24
{$IFDEF UNIX} dynlibs, {$ENDIF}
25
{$IFDEF GLS_LOGGING} GLSLog, {$ENDIF}
27
Classes, SysUtils, GLVectorGeometry, GLCrossPlatform;
31
LibPng13 = 'libpng13'; // Library name
34
LibPng13 = 'libpng12.so'; // Library name
37
LibPng13 = '/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib'; // Library name
40
ZLIB_VERSION = '1.2.3';
41
LIBPNG_VERSION = '1.4.0';
43
PNG_FLAG_ZLIB_CUSTOM_STRATEGY = $0001;
44
PNG_FLAG_ZLIB_CUSTOM_LEVEL = $0002;
45
PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL = $0004;
46
PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS = $0008;
47
PNG_FLAG_ZLIB_CUSTOM_METHOD = $0010;
48
PNG_FLAG_ZLIB_FINISHED = $0020;
49
PNG_FLAG_ROW_INIT = $0040;
50
PNG_FLAG_FILLER_AFTER = $0080;
51
PNG_FLAG_CRC_ANCILLARY_USE = $0100;
52
PNG_FLAG_CRC_ANCILLARY_NOWARN = $0200;
53
PNG_FLAG_CRC_CRITICAL_USE = $0400;
54
PNG_FLAG_CRC_CRITICAL_IGNORE = $0800;
55
PNG_FLAG_KEEP_UNKNOWN_CHUNKS = $8000;
56
PNG_FLAG_KEEP_UNSAFE_CHUNKS = $10000;
57
PNG_FLAG_LIBRARY_MISMATCH = $20000;
58
PNG_FLAG_STRIP_ERROR_NUMBERS = $40000;
59
PNG_FLAG_STRIP_ERROR_TEXT = $80000;
60
PNG_FLAG_MALLOC_NULL_MEM_OK = $100000;
61
PNG_FLAG_ADD_ALPHA = $200000;
62
PNG_FLAG_STRIP_ALPHA = $400000;
63
PNG_FLAG_BENIGN_ERRORS_WARN = $800000;
64
PNG_FLAG_CRC_ANCILLARY_MASK =
65
PNG_FLAG_CRC_ANCILLARY_USE or PNG_FLAG_CRC_ANCILLARY_NOWARN;
67
PNG_FLAG_CRC_CRITICAL_MASK =
68
PNG_FLAG_CRC_CRITICAL_USE or PNG_FLAG_CRC_CRITICAL_IGNORE;
70
PNG_FLAG_CRC_MASK = PNG_FLAG_CRC_ANCILLARY_MASK or PNG_FLAG_CRC_CRITICAL_MASK;
72
PNG_USER_WIDTH_MAX = 1000000;
73
PNG_USER_HEIGHT_MAX = 1000000;
74
PNG_UINT_31_MAX = $7FFFFFFF;
75
PNG_UINT_32_MAX = $FFFFFFFF;
77
PNG_COLOR_MASK_PALETTE = 1;
78
PNG_COLOR_MASK_COLOR = 2;
79
PNG_COLOR_MASK_ALPHA = 4;
81
PNG_COLOR_TYPE_GRAY = 0;
82
PNG_COLOR_TYPE_PALETTE = PNG_COLOR_MASK_COLOR or PNG_COLOR_MASK_PALETTE;
83
PNG_COLOR_TYPE_RGB = PNG_COLOR_MASK_COLOR;
84
PNG_COLOR_TYPE_RGB_ALPHA = PNG_COLOR_MASK_COLOR or PNG_COLOR_MASK_ALPHA;
85
PNG_COLOR_TYPE_GRAY_ALPHA = PNG_COLOR_MASK_ALPHA;
87
PNG_INTERLACE_NONE = 0;
88
PNG_INTERLACE_ADAM7 = 1;
89
PNG_INTERLACE_LAST = 2;
91
PNG_COMPRESSION_TYPE_BASE = 0;
101
PNG_HAVE_CHUNK_HEADER = $0100;
102
PNG_WROTE_tIME = $0200;
103
PNG_WROTE_INFO_BEFORE_PLTE = $0400;
104
PNG_BACKGROUND_IS_GRAY = $0800;
105
PNG_HAVE_PNG_SIGNATURE = $1000;
106
PNG_HAVE_CHUNK_AFTER_IDAT = $2000;
108
PNG_INFO_gAMA = $0001;
109
PNG_INFO_sBIT = $0002;
110
PNG_INFO_cHRM = $0004;
111
PNG_INFO_PLTE = $0008;
112
PNG_INFO_tRNS = $0010;
113
PNG_INFO_bKGD = $0020;
114
PNG_INFO_hIST = $0040;
115
PNG_INFO_pHYs = $0080;
116
PNG_INFO_oFFs = $0100;
117
PNG_INFO_tIME = $0200;
118
PNG_INFO_pCAL = $0400;
119
PNG_INFO_sRGB = $0800;
120
PNG_INFO_iCCP = $1000;
121
PNG_INFO_sPLT = $2000;
122
PNG_INFO_sCAL = $4000;
123
PNG_INFO_IDAT = $8000;
125
PNG_FILTER_TYPE_BASE = 0;
126
PNG_INTRAPIXEL_DIFFERENCING = 64;
128
PNG_FLAG_MNG_EMPTY_PLTE = $01;
129
PNG_FLAG_MNG_FILTER_64 = $04;
130
PNG_ALL_MNG_FEATURES = $05;
133
PNG_INTERLACE = $0002;
136
PNG_SWAP_BYTES = $0010;
137
PNG_INVERT_MONO = $0020;
139
PNG_BACKGROUND = $0080;
140
PNG_BACKGROUND_EXPAND = $0100;
146
PNG_GRAY_TO_RGB = $4000;
148
PNG_PACKSWAP = $10000;
149
PNG_SWAP_ALPHA = $20000;
150
PNG_STRIP_ALPHA = $40000;
151
PNG_INVERT_ALPHA = $80000;
152
PNG_USER_TRANSFORM = $100000;
153
PNG_RGB_TO_GRAY_ERR = $200000;
154
PNG_RGB_TO_GRAY_WARN = $400000;
155
PNG_RGB_TO_GRAY = $600000;
157
PNG_ADD_ALPHA = $1000000;
158
PNG_EXPAND_tRNS = $2000000;
160
PNG_GAMMA_THRESHOLD = 0.05;
162
PNG_BACKGROUND_GAMMA_UNKNOWN = 0;
163
PNG_BACKGROUND_GAMMA_SCREEN = 1;
164
PNG_BACKGROUND_GAMMA_FILE = 2;
165
PNG_BACKGROUND_GAMMA_UNIQUE = 3;
167
PNG_FREE_HIST = $0008;
168
PNG_FREE_ICCP = $0010;
169
PNG_FREE_SPLT = $0020;
170
PNG_FREE_ROWS = $0040;
171
PNG_FREE_PCAL = $0080;
172
PNG_FREE_SCAL = $0100;
173
PNG_FREE_UNKN = $0200;
174
PNG_FREE_LIST = $0400;
175
PNG_FREE_PLTE = $1000;
176
PNG_FREE_TRNS = $2000;
177
PNG_FREE_TEXT = $4000;
178
PNG_FREE_ALL = $7FFF;
179
PNG_FREE_MUL = $4220;
181
PNG_COMPRESSION_TYPE_DEFAULT = PNG_COMPRESSION_TYPE_BASE;
182
PNG_FILTER_TYPE_DEFAULT = PNG_FILTER_TYPE_BASE;
189
png_int_32 = longint;
191
png_int_16 = smallint;
193
ppng_uint_32 = ^png_uint_32;
194
ppng_int_32 = ^png_int_32;
195
ppng_uint_16 = ^png_uint_16;
196
ppng_int_16 = ^png_int_16;
197
ppng_byte = ^png_byte;
198
pppng_uint_32 = ^ppng_uint_32;
199
pppng_int_32 = ^ppng_int_32;
200
pppng_uint_16 = ^ppng_uint_16;
201
ppng_uint_16p = ^png_uint_16p;
202
pppng_int_16 = ^ppng_int_16;
203
pppng_byte = ^ppng_byte;
204
png_size_t = ptruint;
205
png_fixed_point = png_int_32;
206
ppng_fixed_point = ^png_fixed_point;
207
pppng_fixed_point = ^ppng_fixed_point;
209
ppng_bytep = ^png_bytep;
210
(* Const before type ignored *)
211
png_const_charp = PChar;
213
ppng_charp = ^png_charp;
214
png_fixed_point_p = Ppng_fixed_point;
217
png_doublep = Pdouble;
219
png_byte_array = array[0..MaxInt div 2 - 1] of png_byte;
220
png_bytep = ^png_byte_array;
221
png_bytep_array = array[0..MaxInt div (2 * SizeOf(png_bytep))] of png_bytep;
222
png_bytep_arrayp = ^png_bytep_array;
223
png_bytepp = ^png_bytep;
224
png_uint_32p = ^png_uint_32;
225
png_int_32p = PInteger;
226
png_uint_16p = ^png_uint_16;
227
png_uint_16pp = ^png_uint_16p;
228
png_int_16p = PShortInt;
229
png_charp_array = array[0..MaxInt div (2 * SizeOf(png_charp))] of png_charp;
230
png_charp_arrayp = ^png_charp_array;
231
png_charpp = ^png_charp;
232
ppng_charpp = ^png_charpp;
246
{ Three color definitions. The order of the red, green, and blue, (and the
247
exact size) is not important, although the size of the fields need to
248
be png_byte or png_uint_16 (as defined below). }
254
png_color_array = array[0..MaxInt div (2 * SizeOf(png_color))] of png_color;
255
png_colorp = ^png_color_array;
256
png_colorpp = ^png_colorp;
259
red: png_byte; // for use in red green blue files
262
gray: png_byte; // for use in grayscale files
263
alpha: png_byte; // for alpha channel files
265
png_color_8p = ^png_color_8;
266
png_color_8pp = ^png_color_8p;
267
ppng_color_8p = ^png_color_8p;
269
ppng_colorp = ^png_colorp;
270
png_color_16 = record
271
index: png_byte; // used for palette files
272
red: png_uint_16; // for use in red green blue files
275
gray: png_uint_16; // for use in grayscale files
277
png_color_16p = ^png_color_16;
278
png_color_16pp = ^png_color_16p;
279
ppng_color_16p = ^png_color_16p;
281
{ png_unknown_chunk is a structure to hold queued chunks for which there is
282
no specific support. The idea is that we can use this to queue
283
up private chunks for output even though the library doesn't actually
284
know about their semantics. }
286
png_unknown_chunk = record
287
Name: array[0..4] of png_byte;
291
{ libpng-using applications should NOT directly modify this byte.
292
png_byte location; mode of operation at read time }
294
png_unknown_chunk_array =
295
array[0..MaxInt div (2 * SizeOf(png_unknown_chunk))] of png_unknown_chunk;
296
png_unknown_chunk_arrayp = ^png_unknown_chunk_array;
297
png_unknown_chunkp = ^png_unknown_chunk;
298
png_unknown_chunkpp = ^png_unknown_chunkp;
306
compression: integer;
307
{ keyword, 1-79 character description of "text" }
309
{ comment, may be an empty string (ie "")
312
{ length of the text string }
313
text_length: png_size_t;
314
{ length of the itxt string }
315
itxt_length: png_size_t;
316
{ language code, 0-79 characters
319
{ keyword translated UTF-8 string, 0 or more
320
chars or a NULL pointer }
323
png_text_array = array[0..MaxInt div (2 * SizeOf(png_text))] of png_text;
324
png_text_arrayp = ^png_text_array;
325
png_textp = ^png_text;
326
png_textpp = ^png_textp;
327
ppng_textp = ^png_textp;
330
year: png_uint_16; { full year, as in, 1995 }
331
month: png_byte; { month of year, 1 - 12 }
332
day: png_byte; { day of month, 1 - 31 }
333
hour: png_byte; { hour of day, 0 - 23 }
334
minute: png_byte; { minute of hour, 0 - 59 }
335
second: png_byte; { second of minute, 0 - 60 (for leap seconds) }
337
png_timep = ^png_time;
338
png_timepp = ^png_timep;
339
ppng_timep = ^png_timep;
341
png_sPLT_entry = record
346
frequency: png_uint_16;
349
png_sPLT_entryp = ^png_sPLT_entry;
350
png_sPLT_entrypp = ^png_sPLT_entryp;
353
Name: png_charp; { palette name }
354
depth: png_byte; { depth of palette samples }
355
entries: png_sPLT_entryp; { palette entries }
356
nentries: png_int_32; { number of palette entries }
359
array[0..MaxInt div (2 * SizeOf(png_sPLT_t))] of png_sPLT_t;
360
png_sPLT_tp_arrayp = ^png_sPLT_tp_array;
361
png_sPLT_tp = ^png_sPLT_t;
362
png_sPLT_tpp = ^png_sPLT_tp;
364
png_structp = ^png_struct;
365
png_structpp = ^png_structp;
368
Width: png_uint_32; { width of image in pixels (from IHDR) }
369
Height: png_uint_32; { height of image in pixels (from IHDR) }
370
valid: png_uint_32; { valid chunk data (see PNG_INFO_ below) }
371
rowbytes: png_size_t; { bytes needed to hold an untransformed row }
372
palette: png_colorp; { array of color values (valid & PNG_INFO_PLTE) }
373
num_palette: png_uint_16; { number of color entries in "palette" (PLTE) }
374
num_trans: png_uint_16; { number of transparent palette color (tRNS) }
375
bit_depth: png_byte; { 1, 2, 4, 8, or 16 bits/channel (from IHDR) }
376
color_type: png_byte; { see PNG_COLOR_TYPE_ below (from IHDR) }
378
compression_type: png_byte; { must be PNG_COMPRESSION_TYPE_BASE (IHDR) }
379
filter_type: png_byte; { must be PNG_FILTER_TYPE_BASE (from IHDR) }
380
interlace_type: png_byte; { One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 }
382
channels: png_byte; { number of data channels per pixel (1, 2, 3, 4) }
383
pixel_depth: png_byte; { number of bits per pixel }
384
spare_byte: png_byte; { to align the data, and for future use }
385
signature: array[0..7] of png_byte;
386
{ magic bytes read by libpng from start of file }
388
gamma: single; { gamma value of image, if (valid & PNG_INFO_gAMA) }
389
srgb_intent: png_byte; { sRGB rendering intent [0, 1, 2, or 3] }
391
num_text: integer; { number of comments read/to write }
392
max_text: integer; { current size of text array }
393
Text: png_textp; { array of comments read/to write }
397
sig_bit: png_color_8; { significant bits in color channels }
399
trans_alpha: png_bytep; { alpha values for paletted image }
400
trans_color: png_color_16; { transparent color for non-palette image }
402
background: png_color_16;
404
x_offset: png_int_32; { x offset on page }
405
y_offset: png_int_32; { y offset on page }
406
offset_unit_type: png_byte; { offset units type }
408
x_pixels_per_unit: png_uint_32; { horizontal pixel density }
409
y_pixels_per_unit: png_uint_32; { vertical pixel density }
410
phys_unit_type: png_byte; { resolution type (see PNG_RESOLUTION_ below) }
423
pcal_purpose: png_charp; { pCAL chunk description string }
424
pcal_X0: png_int_32; { minimum value }
425
pcal_X1: png_int_32; { maximum value }
426
pcal_units: png_charp; { Latin-1 string giving physical units }
427
pcal_params: png_charpp; { ASCII strings containing parameter values }
428
pcal_type: png_byte; { equation type (see PNG_EQUATION_ below) }
429
pcal_nparams: png_byte; { number of parameters given in pcal_params }
431
free_me: png_uint_32; { flags items libpng is responsible for freeing }
433
unknown_chunks: png_unknown_chunkp;
434
unknown_chunks_num: png_size_t;
436
iccp_name: png_charp; { profile name }
437
iccp_profile: png_charp; { International Color Consortium profile data }
438
{ Note to maintainer: should be png_bytep }
439
iccp_proflen: png_uint_32; { ICC profile data length }
440
iccp_compression: png_byte; { Always zero }
442
splt_palettes: png_sPLT_tp;
443
splt_palettes_num: png_uint_32;
445
scal_unit: png_byte; { unit of physical scale }
446
scal_pixel_width: double; { width of one pixel }
447
scal_pixel_height: double; { height of one pixel }
448
scal_s_width: png_charp; { string containing height }
449
scal_s_height: png_charp; { string containing width }
451
row_pointers: png_bytepp; { the image bits }
453
int_gamma: png_fixed_point; { gamma of image, if (valid & PNG_INFO_gAMA) }
455
int_x_white: png_fixed_point;
456
int_y_white: png_fixed_point;
457
int_x_red: png_fixed_point;
458
int_y_red: png_fixed_point;
459
int_x_green: png_fixed_point;
460
int_y_green: png_fixed_point;
461
int_x_blue: png_fixed_point;
462
int_y_blue: png_fixed_point;
464
png_infop = ^png_info;
465
png_infopp = ^png_infop;
467
png_row_info = record
468
Width: png_uint_32; // width of row
469
rowbytes: png_uint_32; // number of bytes in row
470
color_type: png_byte; // color type of row
471
bit_depth: png_byte; // bit depth of row
472
channels: png_byte; // number of channels (1, 2, 3, or 4)
473
pixel_depth: png_byte; // bits per pixel (depth * channels)
475
png_row_infop = ^png_row_info;
477
TAlloc = function(AppData: Pointer; Items, Size: integer): Pointer; cdecl;
478
TFree = procedure(AppData, Block: Pointer); cdecl;
479
TInFunc = function(opaque: Pointer; var buf: PByte): integer; cdecl;
480
TOutFunc = function(opaque: Pointer; buf: PByte; size: integer): integer;
481
png_error_ptr = procedure(struct: png_structp; str: png_const_charp); cdecl;
482
png_rw_ptr = procedure(struct: png_structp; Data: png_bytep;
483
size: png_size_t); cdecl;
484
png_longjmp_ptr = procedure(jb: jmp_buf; i: integer); cdecl;
485
png_user_transform_ptr = procedure(struct: png_structp;
486
row_info: png_row_infop; b: png_bytep); cdecl;
487
png_flush_ptr = procedure(struct: png_structp); cdecl;
488
png_read_status_ptr = procedure(struct: png_structp; ui: png_uint_32;
490
png_write_status_ptr = procedure(struct: png_structp; ui: png_uint_32;
492
png_progressive_info_ptr = procedure(struct: png_structp; info: png_infop);
494
png_progressive_end_ptr = procedure(struct: png_structp; info: png_infop);
496
png_progressive_row_ptr = procedure(struct: png_structp; bp: png_bytep;
497
ui: png_uint_32; i: integer); cdecl;
498
png_malloc_ptr = function(struct: png_structp; size: png_size_t): png_voidp;
499
png_free_ptr = procedure(struct: png_structp; ptr: png_voidp);
500
png_user_chunk_ptr = function(struct: png_structp;
501
chunk: png_unknown_chunkp): integer;
503
// Internal structure. Ignore.
504
TZStreamRec = packed record
505
next_in: PAnsiChar; // next input byte
506
avail_in: integer; // number of bytes available at next_in
507
total_in: integer; // total nb of input bytes read so far
509
next_out: PAnsiChar; // next output byte should be put here
510
avail_out: integer; // remaining free space at next_out
511
total_out: integer; // total nb of bytes output so far
513
msg: PAnsiChar; // last error message, NULL if no error
514
internal: Pointer; // not visible by applications
516
zalloc: TAlloc; // used to allocate the internal state
517
zfree: TFree; // used to free the internal state
518
AppData: Pointer; // private data object passed to zalloc and zfree
520
data_type: integer; // best guess about the data type: ascii or binary
521
adler: integer; // adler32 value of the uncompressed data
522
reserved: integer; // reserved for future use
526
jmpbuf: jmp_buf; // used in png_error
527
longjmp_fn: png_longjmp_ptr; // setjmp non-local goto function.
528
error_fn: png_error_ptr; // function for printing errors and aborting
529
warning_fn: png_error_ptr; // function for printing warnings
530
error_ptr: png_voidp; // user supplied struct for error functions
531
write_data_fn: png_rw_ptr; // function for writing output data
532
read_data_fn: png_rw_ptr; // function for reading input data
533
io_ptr: png_voidp; // ptr to application struct for I/O functions
535
read_user_transform_fn: png_user_transform_ptr; // user read transform
536
write_user_transform_fn: png_user_transform_ptr; // user write transform
538
// These were added in libpng-1.0.2
539
user_transform_ptr: png_voidp; // user supplied struct for user transform
540
user_transform_depth: png_byte; // bit depth of user transformed pixels
541
user_transform_channels: png_byte; // channels in user transformed pixels
543
mode: png_uint_32; // tells us where we are in the PNG file
544
flags: png_uint_32; // flags indicating various things to libpng
545
transformations: png_uint_32; // which transformations to perform
547
zstream: TZStreamRec; // pointer to decompression structure (below)
548
zbuf: png_bytep; // buffer for zlib
549
zbuf_size: png_size_t; // size of zbuf
550
zlib_level: integer; // holds zlib compression level
551
zlib_method: integer; // holds zlib compression method
552
zlib_window_bits: integer; // holds zlib compression window bits
553
zlib_mem_level: integer; // holds zlib compression memory level
554
zlib_strategy: integer; // holds zlib compression strategy
556
Width: png_uint_32; // width of image in pixels
557
Height: png_uint_32; // height of image in pixels
558
num_rows: png_uint_32; // number of rows in current pass
559
usr_width: png_uint_32; // width of row at start of write
560
rowbytes: png_uint_32; // size of row in bytes
561
irowbytes: png_uint_32; // size of current interlaced row in bytes
562
iwidth: png_uint_32; // width of current interlaced row in pixels
563
row_number: png_uint_32; // current row in interlace pass
564
prev_row: png_bytep; // buffer to save previous (unfiltered) row
565
row_buf: png_bytep; // buffer to save current (unfiltered) row
566
sub_row: png_bytep; // buffer to save "sub" row when filtering
567
up_row: png_bytep; // buffer to save "up" row when filtering
568
avg_row: png_bytep; // buffer to save "avg" row when filtering
569
paeth_row: png_bytep; // buffer to save "Paeth" row when filtering
570
row_info: png_row_info; // used for transformation routines
572
idat_size: png_uint_32; // current IDAT size for read
573
crc: png_uint_32; // current chunk CRC value
574
palette: png_colorp; // palette from the input file
575
num_palette: png_uint_16; // number of color entries in palette
576
num_trans: png_uint_16; // number of transparency values
577
chunk_name: array[0..4] of png_byte; // null-terminated name of current chunk
578
compression: png_byte; // file compression type (always 0)
579
filter: png_byte; // file filter type (always 0)
580
interlaced: png_byte; // PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7
581
pass: png_byte; // current interlace pass (0 - 6)
582
do_filter: png_byte; // row filter flags (see PNG_FILTER_ below )
583
color_type: png_byte; // color type of file
584
bit_depth: png_byte; // bit depth of file
585
usr_bit_depth: png_byte; // bit depth of users row
586
pixel_depth: png_byte; // number of bits per pixel
587
channels: png_byte; // number of channels in file
588
usr_channels: png_byte; // channels at start of write
589
sig_bytes: png_byte; // magic bytes read/written from start of file
591
filler: png_uint_16; // filler bytes for pixel expansion
593
background_gamma_type: png_byte;
594
background_gamma: single;
595
background: png_color_16; // background color in screen gamma space
596
background_1: png_color_16; // background normalized to gamma 1.0
598
output_flush_fn: png_flush_ptr; // Function for flushing output
599
flush_dist: png_uint_32; // how many rows apart to flush, 0 - no flush
600
flush_rows: png_uint_32; // number of rows written since last flush
602
gamma_shift: integer; // number of "insignificant" bits 16-bit gamma
603
gamma: single; // file gamma value
604
screen_gamma: single; // screen gamma value (display_exponent)
606
gamma_table: png_bytep; // gamma table for 8-bit depth files
607
gamma_from_1: png_bytep; // converts from 1.0 to screen
608
gamma_to_1: png_bytep; // converts from file to 1.0
609
gamma_16_table: png_uint_16pp; // gamma table for 16-bit depth files
610
gamma_16_from_1: png_uint_16pp; // converts from 1.0 to screen
611
gamma_16_to_1: png_uint_16pp; // converts from file to 1.0
613
sig_bit: png_color_8; // significant bits in each available channel
615
shift: png_color_8; // shift for significant bit tranformation
617
trans: png_bytep; // transparency values for paletted files
618
trans_values: png_color_16; // transparency values for non-paletted files
620
trans_alpha: png_bytep; // alpha values for paletted files
621
trans_color: png_color_16; // transparent color for non-paletted files
623
read_row_fn: png_read_status_ptr; // called after each row is decoded
624
write_row_fn: png_write_status_ptr; // called after each row is encoded
626
info_fn: png_progressive_info_ptr; // called after header data fully read
627
row_fn: png_progressive_row_ptr; // called after each prog. row is decoded
628
end_fn: png_progressive_end_ptr; // called after image is complete
629
save_buffer_ptr: png_bytep; // current location in save_buffer
630
save_buffer: png_bytep; // buffer for previously read data
631
current_buffer_ptr: png_bytep; // current location in current_buffer
632
current_buffer: png_bytep; // buffer for recently used data
633
push_length: png_uint_32; // size of current input chunk
634
skip_length: png_uint_32; // bytes to skip in input data
635
save_buffer_size: png_size_t; // amount of data now in save_buffer
636
save_buffer_max: png_size_t; // total size of save_buffer
637
buffer_size: png_size_t; // total amount of available input data
638
current_buffer_size: png_size_t; // amount of data now in current_buffer
639
process_mode: integer; // what push library is currently doing
640
cur_palette: integer; // current push library palette index
642
current_text_size: png_size_t; // current size of text input data
643
current_text_left: png_size_t; // how much text left to read in input
644
current_text: png_charp; // current text chunk buffer
645
current_text_ptr: png_charp; // current location in current_text
647
hist: png_uint_16p; // histogram }
649
heuristic_method: png_byte; // heuristic for row filter selection }
650
num_prev_filters: png_byte; // number of weights for previous rows }
651
prev_filters: png_bytep; // filter type(s) of previous row(s) }
652
filter_weights: png_uint_16p; // weight(s) for previous line(s) }
653
inv_filter_weights: png_uint_16p; // 1/weight(s) for previous line(s) }
654
filter_costs: png_uint_16p; // relative filter calculation cost }
655
inv_filter_costs: png_uint_16p; // 1/relative filter calculation cost }
657
time_buffer: png_charp; // String to hold RFC 1123 time text
659
// New members added in libpng-1.0.6
661
free_me: png_uint_32; // flags items libpng is responsible for freeing
663
user_chunk_ptr: png_voidp;
664
read_user_chunk_fn: png_user_chunk_ptr; // user read chunk handler
666
num_chunk_list: integer;
667
chunk_list: png_bytep;
669
// New members added in libpng-1.0.3
670
rgb_to_gray_status: png_byte;
671
// These were changed from png_byte in libpng-1.0.6
672
rgb_to_gray_red_coeff: png_uint_16;
673
rgb_to_gray_green_coeff: png_uint_16;
674
rgb_to_gray_blue_coeff: png_uint_16;
676
// New member added in libpng-1.0.4 (renamed in 1.0.9)
677
// Changed from png_byte to png_uint_32 at version 1.2.0
678
mng_features_permitted: png_uint_32;
680
// New member added in libpng-1.0.7
681
int_gamma: png_fixed_point;
683
// New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0
684
filter_type: png_byte;
686
// New members added in libpng-1.2.0
688
// New members added in libpng-1.0.2 but first enabled by default in 1.2.0
689
mem_ptr: png_voidp; // user supplied struct for mem functions
690
malloc_fn: png_malloc_ptr; // function for allocating memory
691
free_fn: png_free_ptr; // function for freeing memory
693
// New member added in libpng-1.0.13 and 1.2.0
694
big_row_buf: png_bytep; // buffer to save current (unfiltered) row
696
// New members added in libpng-1.0.16 and 1.2.6
697
compression_type: png_byte;
699
// user_width_max: png_uint_32;
700
// user_height_max: png_uint_32;
701
// Added in libpng-1.4.0: Total number of sPLT, text, and unknown
702
// chunks that can be stored ( $7fffffff means unlimited).
704
// user_chunk_cache_max: png_uint_32;
706
// New member added in libpng-1.0.25 and 1.2.17
707
// Storage for unknown chunk that the library doesn't recognize.
708
unknown_chunk: png_unknown_chunk;
710
// New members added in libpng-1.2.26
711
old_big_row_buf_size: png_uint_32;
712
old_prev_row_size: png_uint_32;
714
// New member added in libpng-1.2.30
715
chunkdata: png_charp; // buffer for reading chunk data
717
// New member added in libpng-1.4.0
718
io_state: png_uint_32;
721
(* stream read/write function *)
722
procedure pngReadFn(png_ptr: png_structp; Data: png_bytep; length: png_size_t);
724
procedure pngWriteFn(png_ptr: png_structp; Data: png_bytep; length: png_size_t);
726
procedure pngErrorFn(struct: png_structp; str: png_const_charp);
728
procedure pngWarnFn(struct: png_structp; str: png_const_charp);
732
_png_access_version_number: function(): png_uint_32; cdecl;
733
_png_set_sig_bytes: procedure(png_ptr: png_structp; num_bytes: longint); cdecl;
734
_png_sig_cmp: function(sig: png_bytep; start: png_size_t;
735
num_to_check: png_size_t): longint; cdecl;
736
_png_check_sig: function(sig: png_bytep; num: longint): longint; cdecl;
737
_png_create_read_struct: function(user_png_ver: png_const_charp;
738
error_ptr: png_voidp; error_fn: png_error_ptr;
739
warn_fn: png_error_ptr): png_structp; cdecl;
740
_png_create_write_struct: function(user_png_ver: png_const_charp;
741
error_ptr: png_voidp; error_fn: png_error_ptr;
742
warn_fn: png_error_ptr): png_structp; cdecl;
743
_png_get_compression_buffer_size: function(png_ptr: png_structp): png_uint_32; cdecl;
744
_png_set_compression_buffer_size: procedure(png_ptr: png_structp;
745
size: png_uint_32); cdecl;
746
_png_reset_zstream: function(png_ptr: png_structp): longint; cdecl;
747
_png_write_chunk: procedure(png_ptr: png_structp; chunk_name: png_bytep;
748
Data: png_bytep; length: png_size_t); cdecl;
749
_png_write_chunk_start: procedure(png_ptr: png_structp; chunk_name: png_bytep;
750
length: png_uint_32); cdecl;
751
_png_write_chunk_data: procedure(png_ptr: png_structp; Data: png_bytep;
752
length: png_size_t); cdecl;
753
_png_write_chunk_end: procedure(png_ptr: png_structp); cdecl;
754
_png_create_info_struct: function(png_ptr: png_structp): png_infop; cdecl;
755
_png_info_init: procedure(info_ptr: png_infop); cdecl;
756
_png_write_info_before_PLTE: procedure(png_ptr: png_structp;
757
info_ptr: png_infop); cdecl;
758
_png_write_info: procedure(png_ptr: png_structp; info_ptr: png_infop); cdecl;
759
_png_read_info: procedure(png_ptr: png_structp; info_ptr: png_infop); cdecl;
760
_png_convert_to_rfc1123: function(png_ptr: png_structp;
761
ptime: png_timep): png_charp; cdecl;
762
_png_convert_from_struct_tm: procedure(ptime: png_timep; ttime: Pointer); cdecl;
763
_png_convert_from_time_t: procedure(ptime: png_timep; ttime: time_t); cdecl;
764
_png_set_expand: procedure(png_ptr: png_structp); cdecl;
765
_png_set_gray_1_2_4_to_8: procedure(png_ptr: png_structp); cdecl;
766
_png_set_palette_to_rgb: procedure(png_ptr: png_structp); cdecl;
767
_png_set_tRNS_to_alpha: procedure(png_ptr: png_structp); cdecl;
768
_png_set_bgr: procedure(png_ptr: png_structp); cdecl;
769
_png_set_gray_to_rgb: procedure(png_ptr: png_structp); cdecl;
770
_png_set_rgb_to_gray: procedure(png_ptr: png_structp; error_action: longint;
771
red: double; green: double); cdecl;
772
_png_set_rgb_to_gray_fixed: procedure(png_ptr: png_structp;
773
error_action: longint; red: png_fixed_point; green: png_fixed_point); cdecl;
774
_png_get_rgb_to_gray_status: function(png_ptr: png_structp): png_byte; cdecl;
775
_png_build_grayscale_palette: procedure(bit_depth: longint; palette: png_colorp); cdecl;
776
_png_set_strip_alpha: procedure(png_ptr: png_structp); cdecl;
777
_png_set_swap_alpha: procedure(png_ptr: png_structp); cdecl;
778
_png_set_invert_alpha: procedure(png_ptr: png_structp); cdecl;
779
_png_set_filler: procedure(png_ptr: png_structp; filler: png_uint_32;
780
flags: longint); cdecl;
781
_png_set_swap: procedure(png_ptr: png_structp); cdecl;
782
_png_set_packing: procedure(png_ptr: png_structp); cdecl;
783
_png_set_packswap: procedure(png_ptr: png_structp); cdecl;
784
_png_set_shift: procedure(png_ptr: png_structp; true_bits: png_color_8p); cdecl;
785
_png_set_interlace_handling: function(png_ptr: png_structp): longint; cdecl;
786
_png_set_invert_mono: procedure(png_ptr: png_structp); cdecl;
787
_png_set_background: procedure(png_ptr: png_structp; background_color: png_color_16p;
788
background_gamma_code: longint; need_expand: longint; background_gamma: double); cdecl;
789
_png_set_strip_16: procedure(png_ptr: png_structp); cdecl;
790
_png_set_dither: procedure(png_ptr: png_structp; palette: png_colorp;
791
num_palette: longint; maximum_colors: longint; histogram: png_uint_16p;
792
full_dither: longint); cdecl;
793
_png_set_gamma: procedure(png_ptr: png_structp; screen_gamma: double;
794
default_file_gamma: double); cdecl;
795
_png_permit_empty_plte: procedure(png_ptr: png_structp;
796
empty_plte_permitted: longint); cdecl;
797
_png_set_flush: procedure(png_ptr: png_structp; nrows: longint); cdecl;
798
_png_write_flush: procedure(png_ptr: png_structp); cdecl;
799
_png_start_read_image: procedure(png_ptr: png_structp); cdecl;
800
_png_read_update_info: procedure(png_ptr: png_structp; info_ptr: png_infop); cdecl;
801
_png_read_rows: procedure(png_ptr: png_structp; row: png_bytepp;
802
display_row: png_bytepp; num_rows: png_uint_32); cdecl;
803
_png_read_row: procedure(png_ptr: png_structp; row: png_bytep;
804
display_row: png_bytep); cdecl;
805
_png_read_image: procedure(png_ptr: png_structp; image: png_bytepp); cdecl;
806
_png_write_row: procedure(png_ptr: png_structp; row: png_bytep); cdecl;
807
_png_write_rows: procedure(png_ptr: png_structp; row: png_bytepp;
808
num_rows: png_uint_32); cdecl;
809
_png_write_image: procedure(png_ptr: png_structp; image: png_bytepp); cdecl;
810
_png_write_end: procedure(png_ptr: png_structp; info_ptr: png_infop); cdecl;
811
_png_read_end: procedure(png_ptr: png_structp; info_ptr: png_infop); cdecl;
812
_png_destroy_info_struct: procedure(png_ptr: png_structp;
813
info_ptr_ptr: png_infopp); cdecl;
814
_png_destroy_read_struct: procedure(png_ptr_ptr: png_structpp;
815
info_ptr_ptr: png_infopp; end_info_ptr_ptr: png_infopp); cdecl;
816
_png_read_destroy: procedure(png_ptr: png_structp; info_ptr: png_infop;
817
end_info_ptr: png_infop); cdecl;
818
_png_destroy_write_struct: procedure(png_ptr_ptr: png_structpp;
819
info_ptr_ptr: png_infopp); cdecl;
820
_png_write_destroy_info: procedure(info_ptr: png_infop); cdecl;
821
_png_write_destroy: procedure(png_ptr: png_structp); cdecl;
822
_png_set_crc_action: procedure(png_ptr: png_structp; crit_action: longint;
823
ancil_action: longint); cdecl;
824
_png_set_filter: procedure(png_ptr: png_structp; method: longint;
825
filters: longint); cdecl;
826
_png_set_filter_heuristics: procedure(png_ptr: png_structp;
827
heuristic_method: longint; num_weights: longint; filter_weights: png_doublep;
828
filter_costs: png_doublep); cdecl;
829
_png_set_compression_level: procedure(png_ptr: png_structp; level: longint); cdecl;
830
_png_set_compression_mem_level: procedure(png_ptr: png_structp;
831
mem_level: longint); cdecl;
832
_png_set_compression_strategy: procedure(png_ptr: png_structp;
833
strategy: longint); cdecl;
834
_png_set_compression_window_bits: procedure(png_ptr: png_structp;
835
window_bits: longint); cdecl;
836
_png_set_compression_method: procedure(png_ptr: png_structp; method: longint); cdecl;
837
_png_init_io: procedure(png_ptr: png_structp; fp: png_FILE_p); cdecl;
838
_png_set_error_fn: procedure(png_ptr: png_structp; error_ptr: png_voidp;
839
error_fn: png_error_ptr; warning_fn: png_error_ptr); cdecl;
840
_png_get_error_ptr: function(png_ptr: png_structp): png_voidp; cdecl;
841
_png_set_write_fn: procedure(png_ptr: png_structp; io_ptr: png_voidp;
842
write_data_fn: png_rw_ptr; output_flush_fn: png_flush_ptr); cdecl;
843
_png_set_read_fn: procedure(png_ptr: png_structp; io_ptr: png_voidp;
844
read_data_fn: png_rw_ptr); cdecl;
845
_png_get_io_ptr: function(png_ptr: png_structp): png_voidp; cdecl;
846
_png_set_read_status_fn: procedure(png_ptr: png_structp;
847
read_row_fn: png_read_status_ptr); cdecl;
848
_png_set_write_status_fn: procedure(png_ptr: png_structp;
849
write_row_fn: png_write_status_ptr); cdecl;
850
_png_set_read_user_transform_fn: procedure(png_ptr: png_structp;
851
read_user_transform_fn: png_user_transform_ptr); cdecl;
852
_png_set_write_user_transform_fn: procedure(png_ptr: png_structp;
853
write_user_transform_fn: png_user_transform_ptr); cdecl;
854
_png_set_user_transform_info: procedure(png_ptr: png_structp;
855
user_transform_ptr: png_voidp; user_transform_depth: longint;
856
user_transform_channels: longint); cdecl;
857
_png_get_user_transform_ptr: function(png_ptr: png_structp): png_voidp; cdecl;
858
_png_set_read_user_chunk_fn: procedure(png_ptr: png_structp;
859
user_chunk_ptr: png_voidp; read_user_chunk_fn: png_user_chunk_ptr); cdecl;
860
_png_get_user_chunk_ptr: function(png_ptr: png_structp): png_voidp; cdecl;
861
_png_set_progressive_read_fn: procedure(png_ptr: png_structp;
862
progressive_ptr: png_voidp; info_fn: png_progressive_info_ptr;
863
row_fn: png_progressive_row_ptr; end_fn: png_progressive_end_ptr); cdecl;
864
_png_get_progressive_ptr: function(png_ptr: png_structp): png_voidp; cdecl;
865
_png_process_data: procedure(png_ptr: png_structp; info_ptr: png_infop;
866
buffer: png_bytep; buffer_size: png_size_t); cdecl;
867
_png_progressive_combine_row: procedure(png_ptr: png_structp;
868
old_row: png_bytep; new_row: png_bytep); cdecl;
869
_png_malloc: function(png_ptr: png_structp; size: png_uint_32): png_voidp; cdecl;
870
_png_free: procedure(png_ptr: png_structp; ptr: png_voidp); cdecl;
871
_png_free_data: procedure(png_ptr: png_structp; info_ptr: png_infop;
872
free_me: png_uint_32; num: longint); cdecl;
873
_png_data_freer: procedure(png_ptr: png_structp; info_ptr: png_infop;
874
freer: longint; mask: png_uint_32); cdecl;
875
_png_memcpy_check: function(png_ptr: png_structp; s1: png_voidp;
876
s2: png_voidp; size: png_uint_32): png_voidp; cdecl;
877
_png_memset_check: function(png_ptr: png_structp; s1: png_voidp;
878
Value: longint; size: png_uint_32): png_voidp; cdecl;
879
_png_error: procedure(png_ptr: png_structp; error: png_const_charp); cdecl;
880
_png_chunk_error: procedure(png_ptr: png_structp; error: png_const_charp); cdecl;
881
_png_warning: procedure(png_ptr: png_structp; message: png_const_charp); cdecl;
882
_png_chunk_warning: procedure(png_ptr: png_structp; message: png_const_charp); cdecl;
883
_png_get_valid: function(png_ptr: png_structp; info_ptr: png_infop;
884
flag: png_uint_32): png_uint_32; cdecl;
885
_png_get_rowbytes: function(png_ptr: png_structp;
886
info_ptr: png_infop): png_uint_32; cdecl;
887
_png_get_rows: function(png_ptr: png_structp; info_ptr: png_infop): png_bytepp; cdecl;
888
_png_set_rows: procedure(png_ptr: png_structp; info_ptr: png_infop;
889
row_pointers: png_bytepp); cdecl;
890
_png_get_channels: function(png_ptr: png_structp; info_ptr: png_infop): png_byte; cdecl;
891
_png_get_image_width: function(png_ptr: png_structp;
892
info_ptr: png_infop): png_uint_32; cdecl;
893
_png_get_image_height: function(png_ptr: png_structp;
894
info_ptr: png_infop): png_uint_32; cdecl;
895
_png_get_bit_depth: function(png_ptr: png_structp;
896
info_ptr: png_infop): png_byte; cdecl;
897
_png_get_color_type: function(png_ptr: png_structp;
898
info_ptr: png_infop): png_byte; cdecl;
899
_png_get_filter_type: function(png_ptr: png_structp;
900
info_ptr: png_infop): png_byte; cdecl;
901
_png_get_interlace_type: function(png_ptr: png_structp;
902
info_ptr: png_infop): png_byte; cdecl;
903
_png_get_compression_type: function(png_ptr: png_structp;
904
info_ptr: png_infop): png_byte; cdecl;
905
_png_get_pixels_per_meter: function(png_ptr: png_structp;
906
info_ptr: png_infop): png_uint_32; cdecl;
907
_png_get_x_pixels_per_meter: function(png_ptr: png_structp;
908
info_ptr: png_infop): png_uint_32; cdecl;
909
_png_get_y_pixels_per_meter: function(png_ptr: png_structp;
910
info_ptr: png_infop): png_uint_32; cdecl;
911
_png_get_pixel_aspect_ratio: function(png_ptr: png_structp;
912
info_ptr: png_infop): double; cdecl;
913
_png_get_x_offset_pixels: function(png_ptr: png_structp;
914
info_ptr: png_infop): png_int_32; cdecl;
915
_png_get_y_offset_pixels: function(png_ptr: png_structp;
916
info_ptr: png_infop): png_int_32; cdecl;
917
_png_get_x_offset_microns: function(png_ptr: png_structp;
918
info_ptr: png_infop): png_int_32; cdecl;
919
_png_get_y_offset_microns: function(png_ptr: png_structp;
920
info_ptr: png_infop): png_int_32; cdecl;
921
_png_get_signature: function(png_ptr: png_structp;
922
info_ptr: png_infop): png_bytep; cdecl;
923
_png_get_bKGD: function(png_ptr: png_structp; info_ptr: png_infop;
924
background: Ppng_color_16p): png_uint_32; cdecl;
925
_png_set_bKGD: procedure(png_ptr: png_structp; info_ptr: png_infop;
926
background: png_color_16p); cdecl;
927
_png_get_cHRM: function(png_ptr: png_structp; info_ptr: png_infop;
928
white_x: Pdouble; white_y: Pdouble; red_x: Pdouble; red_y: Pdouble;
929
green_x: Pdouble; green_y: Pdouble; blue_x: Pdouble;
930
blue_y: Pdouble): png_uint_32; cdecl;
931
_png_get_cHRM_fixed: function(png_ptr: png_structp; info_ptr: png_infop;
932
int_white_x: Ppng_fixed_point; int_white_y: Ppng_fixed_point;
933
int_red_x: Ppng_fixed_point; int_red_y: Ppng_fixed_point;
934
int_green_x: Ppng_fixed_point; int_green_y: Ppng_fixed_point;
935
int_blue_x: Ppng_fixed_point; int_blue_y: Ppng_fixed_point): png_uint_32; cdecl;
936
_png_set_cHRM: procedure(png_ptr: png_structp; info_ptr: png_infop;
937
white_x: double; white_y: double; red_x: double; red_y: double;
938
green_x: double; green_y: double; blue_x: double; blue_y: double); cdecl;
939
_png_set_cHRM_fixed: procedure(png_ptr: png_structp; info_ptr: png_infop;
940
int_white_x: png_fixed_point; int_white_y: png_fixed_point;
941
int_red_x: png_fixed_point; int_red_y: png_fixed_point;
942
int_green_x: png_fixed_point; int_green_y: png_fixed_point;
943
int_blue_x: png_fixed_point; int_blue_y: png_fixed_point); cdecl;
944
_png_get_gAMA: function(png_ptr: png_structp; info_ptr: png_infop;
945
file_gamma: Pdouble): png_uint_32; cdecl;
946
_png_get_gAMA_fixed: function(png_ptr: png_structp; info_ptr: png_infop;
947
int_file_gamma: Ppng_fixed_point): png_uint_32; cdecl;
948
_png_set_gAMA: procedure(png_ptr: png_structp; info_ptr: png_infop;
949
file_gamma: double); cdecl;
950
_png_set_gAMA_fixed: procedure(png_ptr: png_structp; info_ptr: png_infop;
951
int_file_gamma: png_fixed_point); cdecl;
952
_png_get_hIST: function(png_ptr: png_structp; info_ptr: png_infop;
953
hist: Ppng_uint_16p): png_uint_32; cdecl;
954
_png_set_hIST: procedure(png_ptr: png_structp; info_ptr: png_infop;
955
hist: png_uint_16p); cdecl;
956
_png_get_IHDR: function(png_ptr: png_structp; info_ptr: png_infop;
957
Width: Ppng_uint_32; Height: Ppng_uint_32; bit_depth: Plongint;
958
color_type: Plongint; interlace_type: Plongint; compression_type: Plongint;
959
filter_type: Plongint): png_uint_32; cdecl;
960
_png_set_IHDR: procedure(png_ptr: png_structp; info_ptr: png_infop;
961
Width: png_uint_32; Height: png_uint_32; bit_depth: longint;
962
color_type: longint; interlace_type: longint; compression_type: longint;
963
filter_type: longint); cdecl;
964
_png_get_oFFs: function(png_ptr: png_structp; info_ptr: png_infop;
965
offset_x: Ppng_int_32; offset_y: Ppng_int_32; unit_type: Plongint): png_uint_32; cdecl;
966
_png_set_oFFs: procedure(png_ptr: png_structp; info_ptr: png_infop;
967
offset_x: png_int_32; offset_y: png_int_32; unit_type: longint); cdecl;
968
_png_get_pCAL: function(png_ptr: png_structp; info_ptr: png_infop;
969
purpose: Ppng_charp; X0: Ppng_int_32; X1: Ppng_int_32; atype: Plongint;
970
nparams: Plongint; units: Ppng_charp; params: Ppng_charpp): png_uint_32; cdecl;
971
_png_set_pCAL: procedure(png_ptr: png_structp; info_ptr: png_infop;
972
purpose: png_charp; X0: png_int_32; X1: png_int_32; atype: longint;
973
nparams: longint; units: png_charp; params: png_charpp); cdecl;
974
_png_get_pHYs: function(png_ptr: png_structp; info_ptr: png_infop;
975
res_x: Ppng_uint_32; res_y: Ppng_uint_32; unit_type: Plongint): png_uint_32; cdecl;
976
_png_set_pHYs: procedure(png_ptr: png_structp; info_ptr: png_infop;
977
res_x: png_uint_32; res_y: png_uint_32; unit_type: longint); cdecl;
978
_png_get_PLTE: function(png_ptr: png_structp; info_ptr: png_infop;
979
palette: Ppng_colorp; num_palette: Plongint): png_uint_32; cdecl;
980
_png_set_PLTE: procedure(png_ptr: png_structp; info_ptr: png_infop;
981
palette: png_colorp; num_palette: longint); cdecl;
982
_png_get_sBIT: function(png_ptr: png_structp; info_ptr: png_infop;
983
sig_bit: Ppng_color_8p): png_uint_32; cdecl;
984
_png_set_sBIT: procedure(png_ptr: png_structp; info_ptr: png_infop;
985
sig_bit: png_color_8p); cdecl;
986
_png_get_sRGB: function(png_ptr: png_structp; info_ptr: png_infop;
987
intent: Plongint): png_uint_32; cdecl;
988
_png_set_sRGB: procedure(png_ptr: png_structp; info_ptr: png_infop;
989
intent: longint); cdecl;
990
_png_set_sRGB_gAMA_and_cHRM: procedure(png_ptr: png_structp;
991
info_ptr: png_infop; intent: longint); cdecl;
992
_png_get_iCCP: function(png_ptr: png_structp; info_ptr: png_infop;
993
Name: png_charpp; compression_type: Plongint; profile: png_charpp;
994
proflen: Ppng_uint_32): png_uint_32; cdecl;
995
_png_set_iCCP: procedure(png_ptr: png_structp; info_ptr: png_infop;
996
Name: png_charp; compression_type: longint; profile: png_charp;
997
proflen: png_uint_32); cdecl;
998
_png_get_sPLT: function(png_ptr: png_structp; info_ptr: png_infop;
999
entries: png_sPLT_tpp): png_uint_32; cdecl;
1000
_png_set_sPLT: procedure(png_ptr: png_structp; info_ptr: png_infop;
1001
entries: png_sPLT_tp; nentries: longint); cdecl;
1002
_png_get_text: function(png_ptr: png_structp; info_ptr: png_infop;
1003
text_ptr: Ppng_textp; num_text: Plongint): png_uint_32; cdecl;
1004
_png_set_text: procedure(png_ptr: png_structp; info_ptr: png_infop;
1005
text_ptr: png_textp; num_text: longint); cdecl;
1006
_png_get_tIME: function(png_ptr: png_structp; info_ptr: png_infop;
1007
mod_time: Ppng_timep): png_uint_32; cdecl;
1008
_png_set_tIME: procedure(png_ptr: png_structp; info_ptr: png_infop;
1009
mod_time: png_timep); cdecl;
1010
_png_get_tRNS: function(png_ptr: png_structp; info_ptr: png_infop;
1011
trans: Ppng_bytep; num_trans: Plongint;
1012
trans_values: Ppng_color_16p): png_uint_32; cdecl;
1013
_png_set_tRNS: procedure(png_ptr: png_structp; info_ptr: png_infop;
1014
trans: png_bytep; num_trans: longint; trans_values: png_color_16p); cdecl;
1015
_png_get_sCAL: function(png_ptr: png_structp; info_ptr: png_infop;
1016
aunit: Plongint; Width: Pdouble; Height: Pdouble): png_uint_32; cdecl;
1017
_png_set_sCAL: procedure(png_ptr: png_structp; info_ptr: png_infop;
1018
aunit: longint; Width: double; Height: double); cdecl;
1019
_png_set_sCAL_s: procedure(png_ptr: png_structp; info_ptr: png_infop;
1020
aunit: longint; swidth: png_charp; sheight: png_charp); cdecl;
1021
_png_set_keep_unknown_chunks: procedure(png_ptr: png_structp;
1022
keep: longint; chunk_list: png_bytep; num_chunks: longint); cdecl;
1023
_png_set_unknown_chunks: procedure(png_ptr: png_structp; info_ptr: png_infop;
1024
unknowns: png_unknown_chunkp; num_unknowns: longint); cdecl;
1025
_png_set_unknown_chunk_location: procedure(png_ptr: png_structp;
1026
info_ptr: png_infop; chunk: longint; location: longint); cdecl;
1027
_png_get_unknown_chunks: function(png_ptr: png_structp; info_ptr: png_infop;
1028
entries: png_unknown_chunkpp): png_uint_32; cdecl;
1029
_png_set_invalid: procedure(png_ptr: png_structp; info_ptr: png_infop;
1030
mask: longint); cdecl;
1031
_png_read_png: procedure(png_ptr: png_structp; info_ptr: png_infop;
1032
transforms: longint; params: Pointer); cdecl;
1033
_png_write_png: procedure(png_ptr: png_structp; info_ptr: png_infop;
1034
transforms: longint; params: Pointer); cdecl;
1035
_png_get_header_ver: function(png_ptr: png_structp): png_charp; cdecl;
1036
_png_get_header_version: function(png_ptr: png_structp): png_charp; cdecl;
1037
_png_get_libpng_ver: function(png_ptr: png_structp): png_charp; cdecl;
1044
INVALID_MODULEHANDLE = 0;
1051
vzHandle: TLibHandle = 0;
1055
function Loadlibpng13: boolean;
1058
if (vzHandle = INVALID_MODULEHANDLE) then
1061
vzHandle := LoadLibrary(PChar(LibPng13));
1062
if (vzHandle <> INVALID_MODULEHANDLE) then
1066
if vzHandle <> INVALID_MODULEHANDLE then
1067
FreeLibrary(vzHandle);
1068
{$IFDEF GLS_GLS_LOGGING}
1069
GLSLogger.Log('LIBPNG.pas: libpng13 library not loaded');
1077
procedure Unloadlibpng13;
1079
if vzHandle <> INVALID_MODULEHANDLE then
1081
FreeLibrary(vzHandle);
1082
vzHandle := INVALID_MODULEHANDLE;
1086
function GetAddress(ProcName: PChar):Pointer;
1088
result := GetProcAddress(vzHandle, ProcName);
1091
procedure ReadEntryPoints;
1093
_png_access_version_number := GetAddress('png_access_version_number');
1094
_png_set_sig_bytes := GetAddress('png_set_sig_bytes');
1095
_png_sig_cmp := GetAddress('png_sig_cmp');
1096
_png_check_sig := GetAddress('png_check_sig');
1097
_png_create_read_struct := GetAddress('png_create_read_struct');
1098
_png_create_write_struct := GetAddress('png_create_write_struct');
1099
_png_get_compression_buffer_size := GetAddress('png_get_compression_buffer_size');
1100
_png_set_compression_buffer_size := GetAddress('png_set_compression_buffer_size');
1101
_png_reset_zstream := GetAddress('png_reset_zstream');
1102
_png_write_chunk := GetAddress('png_write_chunk');
1103
_png_write_chunk_start := GetAddress('png_write_chunk_start');
1104
_png_write_chunk_data := GetAddress('png_write_chunk_data');
1105
_png_write_chunk_end := GetAddress('png_write_chunk_end');
1106
_png_create_info_struct := GetAddress('png_create_info_struct');
1107
_png_info_init := GetAddress('png_info_init');
1108
_png_write_info_before_PLTE := GetAddress('png_write_info_before_PLTE');
1109
_png_write_info := GetAddress('png_write_info');
1110
_png_read_info := GetAddress('png_read_info');
1111
_png_convert_to_rfc1123 := GetAddress('png_convert_to_rfc1123');
1112
_png_convert_from_struct_tm := GetAddress('png_convert_from_struct_tm');
1113
_png_convert_from_time_t := GetAddress('png_convert_from_time_t');
1114
_png_set_expand := GetAddress('png_set_expand');
1115
_png_set_gray_1_2_4_to_8 := GetAddress('png_set_gray_1_2_4_to_8');
1116
_png_set_palette_to_rgb := GetAddress('png_set_palette_to_rgb');
1117
_png_set_tRNS_to_alpha := GetAddress('png_set_tRNS_to_alpha');
1118
_png_set_bgr := GetAddress('png_set_bgr');
1119
_png_set_gray_to_rgb := GetAddress('png_set_gray_to_rgb');
1120
_png_set_rgb_to_gray := GetAddress('png_set_rgb_to_gray');
1121
_png_set_rgb_to_gray_fixed := GetAddress('png_set_rgb_to_gray_fixed');
1122
_png_get_rgb_to_gray_status := GetAddress('png_get_rgb_to_gray_status');
1123
_png_build_grayscale_palette := GetAddress('png_build_grayscale_palette');
1124
_png_set_strip_alpha := GetAddress('png_set_strip_alpha');
1125
_png_set_swap_alpha := GetAddress('png_set_swap_alpha');
1126
_png_set_invert_alpha := GetAddress('png_set_invert_alpha');
1127
_png_set_filler := GetAddress('png_set_filler');
1128
_png_set_swap := GetAddress('png_set_swap');
1129
_png_set_packing := GetAddress('png_set_packing');
1130
_png_set_packswap := GetAddress('png_set_packswap');
1131
_png_set_shift := GetAddress('png_set_shift');
1132
_png_set_interlace_handling := GetAddress('png_set_interlace_handling');
1133
_png_set_invert_mono := GetAddress('png_set_invert_mono');
1134
_png_set_background := GetAddress('png_set_background');
1135
_png_set_strip_16 := GetAddress('png_set_strip_16');
1136
_png_set_dither := GetAddress('png_set_dither');
1137
_png_set_gamma := GetAddress('png_set_gamma');
1138
_png_permit_empty_plte := GetAddress('png_permit_empty_plte');
1139
_png_set_flush := GetAddress('png_set_flush');
1140
_png_write_flush := GetAddress('png_write_flush');
1141
_png_start_read_image := GetAddress('png_start_read_image');
1142
_png_read_update_info := GetAddress('png_read_update_info');
1143
_png_read_rows := GetAddress('png_read_rows');
1144
_png_read_row := GetAddress('png_read_row');
1145
_png_read_image := GetAddress('png_read_image');
1146
_png_write_row := GetAddress('png_write_row');
1147
_png_write_rows := GetAddress('png_write_rows');
1148
_png_write_image := GetAddress('png_write_image');
1149
_png_write_end := GetAddress('png_write_end');
1150
_png_read_end := GetAddress('png_read_end');
1151
_png_destroy_info_struct := GetAddress('png_destroy_info_struct');
1152
_png_destroy_read_struct := GetAddress('png_destroy_read_struct');
1153
_png_read_destroy := GetAddress('png_read_destroy');
1154
_png_destroy_write_struct := GetAddress('png_destroy_write_struct');
1155
_png_write_destroy_info := GetAddress('png_write_destroy_info');
1156
_png_write_destroy := GetAddress('png_write_destroy');
1157
_png_set_crc_action := GetAddress('png_set_crc_action');
1158
_png_set_filter := GetAddress('png_set_filter');
1159
_png_set_filter_heuristics := GetAddress('png_set_filter_heuristics');
1160
_png_set_compression_level := GetAddress('png_set_compression_level');
1161
_png_set_compression_mem_level := GetAddress('png_set_compression_mem_level');
1162
_png_set_compression_strategy := GetAddress('png_set_compression_strategy');
1163
_png_set_compression_window_bits := GetAddress('png_set_compression_window_bits');
1164
_png_set_compression_method := GetAddress('png_set_compression_method');
1165
_png_init_io := GetAddress('png_init_io');
1166
_png_set_error_fn := GetAddress('png_set_error_fn');
1167
_png_get_error_ptr := GetAddress('png_get_error_ptr');
1168
_png_set_write_fn := GetAddress('png_set_write_fn');
1169
_png_set_read_fn := GetAddress('png_set_read_fn');
1170
_png_get_io_ptr := GetAddress('png_get_io_ptr');
1171
_png_set_read_status_fn := GetAddress('png_set_read_status_fn');
1172
_png_set_write_status_fn := GetAddress('png_set_write_status_fn');
1173
_png_set_read_user_transform_fn := GetAddress('png_set_read_user_transform_fn');
1174
_png_set_write_user_transform_fn := GetAddress('png_set_write_user_transform_fn');
1175
_png_set_user_transform_info := GetAddress('png_set_user_transform_info');
1176
_png_get_user_transform_ptr := GetAddress('png_get_user_transform_ptr');
1177
_png_set_read_user_chunk_fn := GetAddress('png_set_read_user_chunk_fn');
1178
_png_get_user_chunk_ptr := GetAddress('png_get_user_chunk_ptr');
1179
_png_set_progressive_read_fn := GetAddress('png_set_progressive_read_fn');
1180
_png_get_progressive_ptr := GetAddress('png_get_progressive_ptr');
1181
_png_process_data := GetAddress('png_process_data');
1182
_png_progressive_combine_row := GetAddress('png_progressive_combine_row');
1183
_png_malloc := GetAddress('png_malloc');
1184
_png_free := GetAddress('png_free');
1185
_png_free_data := GetAddress('png_free_data');
1186
_png_data_freer := GetAddress('png_data_freer');
1187
_png_memcpy_check := GetAddress('png_memcpy_check');
1188
_png_memset_check := GetAddress('png_memset_check');
1189
_png_error := GetAddress('png_error');
1190
_png_chunk_error := GetAddress('png_chunk_error');
1191
_png_warning := GetAddress('png_warning');
1192
_png_chunk_warning := GetAddress('png_chunk_warning');
1193
_png_get_valid := GetAddress('png_get_valid');
1194
_png_get_rowbytes := GetAddress('png_get_rowbytes');
1195
_png_get_rows := GetAddress('png_get_rows');
1196
_png_set_rows := GetAddress('png_set_rows');
1197
_png_get_channels := GetAddress('png_get_channels');
1198
_png_get_image_width := GetAddress('png_get_image_width');
1199
_png_get_image_height := GetAddress('png_get_image_height');
1200
_png_get_bit_depth := GetAddress('png_get_bit_depth');
1201
_png_get_color_type := GetAddress('png_get_color_type');
1202
_png_get_filter_type := GetAddress('png_get_filter_type');
1203
_png_get_interlace_type := GetAddress('png_get_interlace_type');
1204
_png_get_compression_type := GetAddress('png_get_compression_type');
1205
_png_get_pixels_per_meter := GetAddress('png_get_pixels_per_meter');
1206
_png_get_x_pixels_per_meter := GetAddress('png_get_x_pixels_per_meter');
1207
_png_get_y_pixels_per_meter := GetAddress('png_get_y_pixels_per_meter');
1208
_png_get_pixel_aspect_ratio := GetAddress('png_get_pixel_aspect_ratio');
1209
_png_get_x_offset_pixels := GetAddress('png_get_x_offset_pixels');
1210
_png_get_y_offset_pixels := GetAddress('png_get_y_offset_pixels');
1211
_png_get_x_offset_microns := GetAddress('png_get_x_offset_microns');
1212
_png_get_y_offset_microns := GetAddress('png_get_y_offset_microns');
1213
_png_get_signature := GetAddress('png_get_signature');
1214
_png_get_bKGD := GetAddress('png_get_bKGD');
1215
_png_set_bKGD := GetAddress('png_set_bKGD');
1216
_png_get_cHRM := GetAddress('png_get_cHRM');
1217
_png_get_cHRM_fixed := GetAddress('png_get_cHRM_fixed');
1218
_png_set_cHRM := GetAddress('png_set_cHRM');
1219
_png_set_cHRM_fixed := GetAddress('png_set_cHRM_fixed');
1221
_png_get_gAMA := GetAddress('png_get_gAMA');
1222
_png_get_gAMA_fixed := GetAddress('png_get_gAMA_fixed');
1223
_png_set_gAMA := GetAddress('png_set_gAMA');
1224
_png_set_gAMA_fixed := GetAddress('png_set_gAMA_fixed');
1225
_png_get_hIST := GetAddress('png_get_hIST');
1226
_png_set_hIST := GetAddress('png_set_hIST');
1227
_png_get_IHDR := GetAddress('png_get_IHDR');
1228
_png_set_IHDR := GetAddress('png_set_IHDR');
1229
_png_get_oFFs := GetAddress('png_get_oFFs');
1230
_png_set_oFFs := GetAddress('png_set_oFFs');
1231
_png_get_pCAL := GetAddress('png_get_pCAL');
1232
_png_set_pCAL := GetAddress('png_set_pCAL');
1233
_png_get_pHYs := GetAddress('png_get_pHYs');
1234
_png_set_pHYs := GetAddress('png_set_pHYs');
1235
_png_get_PLTE := GetAddress('png_get_PLTE');
1236
_png_set_PLTE := GetAddress('png_set_PLTE');
1237
_png_get_sBIT := GetAddress('png_get_sBIT');
1238
_png_set_sBIT := GetAddress('png_set_sBIT');
1239
_png_get_sRGB := GetAddress('png_get_sRGB');
1240
_png_set_sRGB := GetAddress('png_set_sRGB');
1241
_png_set_sRGB_gAMA_and_cHRM := GetAddress('png_set_sRGB_gAMA_and_cHRM');
1242
_png_get_iCCP := GetAddress('png_get_iCCP');
1243
_png_set_iCCP := GetAddress('png_set_iCCP');
1244
_png_get_sPLT := GetAddress('png_get_sPLT');
1245
_png_set_sPLT := GetAddress('png_set_sPLT');
1246
_png_get_text := GetAddress('png_get_text');
1247
_png_set_text := GetAddress('png_set_text');
1248
_png_get_tIME := GetAddress('png_get_tIME');
1249
_png_set_tIME := GetAddress('png_set_tIME');
1250
_png_get_tRNS := GetAddress('png_get_tRNS');
1251
_png_set_tRNS := GetAddress('png_set_tRNS');
1252
_png_get_sCAL := GetAddress('png_get_sCAL');
1253
_png_set_sCAL := GetAddress('png_set_sCAL');
1254
_png_set_sCAL_s := GetAddress('png_set_sCAL_s');
1255
_png_set_keep_unknown_chunks := GetAddress('png_set_keep_unknown_chunks');
1256
_png_set_unknown_chunks := GetAddress('png_set_unknown_chunks');
1257
_png_set_unknown_chunk_location := GetAddress('png_set_unknown_chunk_location');
1258
_png_get_unknown_chunks := GetAddress('png_get_unknown_chunks');
1259
_png_set_invalid := GetAddress('png_set_invalid');
1260
_png_read_png := GetAddress('png_read_png');
1261
_png_write_png := GetAddress('png_write_png');
1262
_png_get_header_ver := GetAddress('png_get_header_ver');
1263
_png_get_header_version := GetAddress('png_get_header_version');
1264
_png_get_libpng_ver := GetAddress('png_get_libpng_ver');
1268
procedure pngReadFn(png_ptr: png_structp; Data: png_bytep; length: png_size_t);
1272
fs := TStream(_png_get_io_ptr(png_ptr));
1273
Assert(Assigned(Data), 'Attempt to read from null file pointer');
1274
fs.Read(Data^, length);
1277
procedure pngWriteFn(png_ptr: png_structp; Data: png_bytep; length: png_size_t);
1281
fs := TStream(_png_get_io_ptr(png_ptr));
1282
Assert(Assigned(Data), 'Attempt to write to null file pointer');
1283
fs.Write(Data^, length);
1286
procedure pngErrorFn(struct: png_structp; str: png_const_charp); cdecl;
1289
GLSLogger.Log(string(str), lkError);
1293
procedure pngWarnFn(struct: png_structp; str: png_const_charp); cdecl;
1296
GLSLogger.Log(string(str), lkWarning);
1303
if Loadlibpng13 then ReadEntryPoints;