LZScene

Форк
0
/
LIBPNG.pas 
1311 строк · 57.4 Кб
1
//
2
// This unit is part of the GLScene Engine https://github.com/glscene
3
//
4
{
5
   History :  
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
11
   
12
}
13

14
unit LIBPNG;
15

16
interface
17

18
{$I GLScene.inc}
19
{$WARNINGS OFF}
20

21
uses
22
  {$IFDEF MSWINDOWS} Windows, {$ENDIF}
23
  {$IFDEF GLS_X11_SUPPORT} x, {$ENDIF}
24
  {$IFDEF UNIX} dynlibs, {$ENDIF}
25
  {$IFDEF GLS_LOGGING} GLSLog, {$ENDIF}
26
   GLSZLibExAPI,
27
  Classes, SysUtils, GLVectorGeometry, GLCrossPlatform;
28

29
const
30
{$IFDEF MSWINDOWS}
31
  LibPng13 = 'libpng13'; // Library name
32
{$ENDIF}
33
{$IFDEF LINUX}
34
  LibPng13 = 'libpng12.so'; // Library name
35
{$ENDIF}
36
{$IFDEF DARWIN}
37
  LibPng13 = '/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib'; // Library name
38
{$ENDIF}
39

40
  ZLIB_VERSION = '1.2.3';
41
  LIBPNG_VERSION = '1.4.0';
42

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;
66

67
  PNG_FLAG_CRC_CRITICAL_MASK =
68
    PNG_FLAG_CRC_CRITICAL_USE or PNG_FLAG_CRC_CRITICAL_IGNORE;
69

70
  PNG_FLAG_CRC_MASK = PNG_FLAG_CRC_ANCILLARY_MASK or PNG_FLAG_CRC_CRITICAL_MASK;
71

72
  PNG_USER_WIDTH_MAX = 1000000;
73
  PNG_USER_HEIGHT_MAX = 1000000;
74
  PNG_UINT_31_MAX = $7FFFFFFF;
75
  PNG_UINT_32_MAX = $FFFFFFFF;
76

77
  PNG_COLOR_MASK_PALETTE = 1;
78
  PNG_COLOR_MASK_COLOR = 2;
79
  PNG_COLOR_MASK_ALPHA = 4;
80

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;
86

87
  PNG_INTERLACE_NONE = 0;
88
  PNG_INTERLACE_ADAM7 = 1;
89
  PNG_INTERLACE_LAST = 2;
90

91
  PNG_COMPRESSION_TYPE_BASE = 0;
92

93
  PNG_HAVE_IHDR = $01;
94
  PNG_HAVE_PLTE = $02;
95
  PNG_HAVE_IDAT = $04;
96
  PNG_AFTER_IDAT = $08;
97
  PNG_HAVE_IEND = $10;
98
  PNG_HAVE_gAMA = $20;
99
  PNG_HAVE_cHRM = $40;
100
  PNG_HAVE_sRGB = $80;
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;
107

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;
124

125
  PNG_FILTER_TYPE_BASE = 0;
126
  PNG_INTRAPIXEL_DIFFERENCING = 64;
127

128
  PNG_FLAG_MNG_EMPTY_PLTE = $01;
129
  PNG_FLAG_MNG_FILTER_64 = $04;
130
  PNG_ALL_MNG_FEATURES = $05;
131

132
  PNG_BGR = $0001;
133
  PNG_INTERLACE = $0002;
134
  PNG_PACK = $0004;
135
  PNG_SHIFT = $0008;
136
  PNG_SWAP_BYTES = $0010;
137
  PNG_INVERT_MONO = $0020;
138
  PNG_DITHER = $0040;
139
  PNG_BACKGROUND = $0080;
140
  PNG_BACKGROUND_EXPAND = $0100;
141

142
  PNG_16_TO_8 = $0400;
143
  PNG_RGBA = $0800;
144
  PNG_EXPAND = $1000;
145
  PNG_GAMMA = $2000;
146
  PNG_GRAY_TO_RGB = $4000;
147
  PNG_FILLER = $8000;
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;
156

157
  PNG_ADD_ALPHA = $1000000;
158
  PNG_EXPAND_tRNS = $2000000;
159

160
  PNG_GAMMA_THRESHOLD = 0.05;
161

162
  PNG_BACKGROUND_GAMMA_UNKNOWN = 0;
163
  PNG_BACKGROUND_GAMMA_SCREEN = 1;
164
  PNG_BACKGROUND_GAMMA_FILE = 2;
165
  PNG_BACKGROUND_GAMMA_UNIQUE = 3;
166

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;
180

181
  PNG_COMPRESSION_TYPE_DEFAULT = PNG_COMPRESSION_TYPE_BASE;
182
  PNG_FILTER_TYPE_DEFAULT = PNG_FILTER_TYPE_BASE;
183

184
type
185
  time_t = longint;
186
  int = longint;
187

188
  png_uint_32 = dword;
189
  png_int_32 = longint;
190
  png_uint_16 = word;
191
  png_int_16 = smallint;
192
  png_byte = byte;
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;
208
  png_voidp = pointer;
209
  ppng_bytep = ^png_bytep;
210
  (* Const before type ignored *)
211
  png_const_charp = PChar;
212
  png_charp = PChar;
213
  ppng_charp = ^png_charp;
214
  png_fixed_point_p = Ppng_fixed_point;
215
  TFile = Pointer;
216
  png_FILE_p = ^file;
217
  png_doublep = Pdouble;
218

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;
233

234
  jmp_buf = record
235
    j_ebp,
236
    j_ebx,
237
    j_edi,
238
    j_esi,
239
    j_esp,
240
    j_ret,
241
    j_excep,
242
    j_context: cardinal;
243
  end;
244
  jmp_bufp = ^jmp_buf;
245

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). }
249
  png_color = record
250
    red: png_byte;
251
    green: png_byte;
252
    blue: png_byte;
253
  end;
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;
257

258
  png_color_8 = record
259
    red: png_byte; // for use in red green blue files
260
    green: png_byte;
261
    blue: png_byte;
262
    gray: png_byte; // for use in grayscale files
263
    alpha: png_byte; // for alpha channel files
264
  end;
265
  png_color_8p = ^png_color_8;
266
  png_color_8pp = ^png_color_8p;
267
  ppng_color_8p = ^png_color_8p;
268

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
273
    green: png_uint_16;
274
    blue: png_uint_16;
275
    gray: png_uint_16; // for use in grayscale files
276
  end;
277
  png_color_16p = ^png_color_16;
278
  png_color_16pp = ^png_color_16p;
279
  ppng_color_16p = ^png_color_16p;
280

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. }
285

286
  png_unknown_chunk = record
287
    Name: array[0..4] of png_byte;
288
    Data: png_bytep;
289
    size: png_size_t;
290

291
    { libpng-using applications should NOT directly modify this byte.
292
       png_byte location;  mode of operation at read time }
293
  end;
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;
299

300
  png_text = record
301
    { compression value:
302
       -1: tEXt, none
303
        0: zTXt, deflate
304
        1: iTXt, none
305
        2: iTXt, deflate  }
306
    compression: integer;
307
    { keyword, 1-79 character description of "text" }
308
    key: png_charp;
309
    { comment, may be an empty string (ie "")
310
       or a NULL pointer }
311
    Text: png_charp;
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
317
       or a NULL pointer }
318
    lang: png_charp;
319
    { keyword translated UTF-8 string, 0 or more
320
       chars or a NULL pointer }
321
    lang_key: png_charp;
322
  end;
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;
328

329
  png_time = record
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) }
336
  end;
337
  png_timep = ^png_time;
338
  png_timepp = ^png_timep;
339
  ppng_timep = ^png_timep;
340

341
  png_sPLT_entry = record
342
    red: png_uint_16;
343
    green: png_uint_16;
344
    blue: png_uint_16;
345
    alpha: png_uint_16;
346
    frequency: png_uint_16;
347
  end;
348

349
  png_sPLT_entryp = ^png_sPLT_entry;
350
  png_sPLT_entrypp = ^png_sPLT_entryp;
351

352
  png_sPLT_t = record
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 }
357
  end;
358
  png_sPLT_tp_array =
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;
363

364
  png_structp = ^png_struct;
365
  png_structpp = ^png_structp;
366

367
  png_info = record
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) }
377

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 }
381

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 }
387

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] }
390

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 }
394

395
    mod_time: png_time;
396

397
    sig_bit: png_color_8; { significant bits in color channels }
398

399
    trans_alpha: png_bytep; { alpha values for paletted image }
400
    trans_color: png_color_16; { transparent color for non-palette image }
401

402
    background: png_color_16;
403

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 }
407

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) }
411

412
    hist: png_uint_16p;
413

414
    x_white: single;
415
    y_white: single;
416
    x_red: single;
417
    y_red: single;
418
    x_green: single;
419
    y_green: single;
420
    x_blue: single;
421
    y_blue: single;
422

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 }
430

431
    free_me: png_uint_32; { flags items libpng is responsible for freeing }
432

433
    unknown_chunks: png_unknown_chunkp;
434
    unknown_chunks_num: png_size_t;
435

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 }
441

442
    splt_palettes: png_sPLT_tp;
443
    splt_palettes_num: png_uint_32;
444

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 }
450

451
    row_pointers: png_bytepp; { the image bits }
452

453
    int_gamma: png_fixed_point; { gamma of image, if (valid & PNG_INFO_gAMA) }
454

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;
463
  end;
464
  png_infop = ^png_info;
465
  png_infopp = ^png_infop;
466

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)
474
  end;
475
  png_row_infop = ^png_row_info;
476

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;
489
    i: integer); cdecl;
490
  png_write_status_ptr = procedure(struct: png_structp; ui: png_uint_32;
491
    i: integer); cdecl;
492
  png_progressive_info_ptr = procedure(struct: png_structp; info: png_infop);
493
    cdecl;
494
  png_progressive_end_ptr = procedure(struct: png_structp; info: png_infop);
495
    cdecl;
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;
502

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
508

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
512

513
    msg: PAnsiChar; // last error message, NULL if no error
514
    internal: Pointer; // not visible by applications
515

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
519

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
523
  end;
524

525
  png_struct = record
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
534

535
    read_user_transform_fn: png_user_transform_ptr; // user read transform
536
    write_user_transform_fn: png_user_transform_ptr; // user write transform
537

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
542

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
546

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
555

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
571

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
590

591
    filler: png_uint_16; // filler bytes for pixel expansion
592

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
597

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
601

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)
605

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
612

613
    sig_bit: png_color_8; // significant bits in each available channel
614

615
    shift: png_color_8; // shift for significant bit tranformation
616

617
    trans: png_bytep; // transparency values for paletted files
618
    trans_values: png_color_16; // transparency values for non-paletted files
619

620
    trans_alpha: png_bytep; // alpha values for paletted files
621
    trans_color: png_color_16; // transparent color for non-paletted files
622

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
625

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
641

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
646

647
    hist: png_uint_16p; // histogram }
648

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 }
656

657
    time_buffer: png_charp; // String to hold RFC 1123 time text
658

659
    // New members added in libpng-1.0.6
660

661
    free_me: png_uint_32; // flags items libpng is responsible for freeing
662

663
    user_chunk_ptr: png_voidp;
664
    read_user_chunk_fn: png_user_chunk_ptr; // user read chunk handler
665

666
    num_chunk_list: integer;
667
    chunk_list: png_bytep;
668

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;
675

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;
679

680
    // New member added in libpng-1.0.7
681
    int_gamma: png_fixed_point;
682

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;
685

686
    // New members added in libpng-1.2.0
687

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
692

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
695

696
    // New members added in libpng-1.0.16 and 1.2.6
697
    compression_type: png_byte;
698

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).
703

704
    //    user_chunk_cache_max: png_uint_32;
705

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;
709

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;
713

714
    // New member added in libpng-1.2.30
715
    chunkdata: png_charp; // buffer for reading chunk data
716

717
    // New member added in libpng-1.4.0
718
    io_state: png_uint_32;
719
  end;
720

721
(* stream read/write function *)
722
procedure pngReadFn(png_ptr: png_structp; Data: png_bytep; length: png_size_t);
723
  cdecl;
724
procedure pngWriteFn(png_ptr: png_structp; Data: png_bytep; length: png_size_t);
725
  cdecl;
726
procedure pngErrorFn(struct: png_structp; str: png_const_charp);
727
  cdecl;
728
procedure pngWarnFn(struct: png_structp; str: png_const_charp);
729
  cdecl;
730

731
var
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;
1038

1039
implementation
1040

1041

1042

1043
const
1044
  INVALID_MODULEHANDLE = 0;
1045

1046
var
1047
   {$IFDEF MSWINDOWS}
1048
  vzHandle: HINST;
1049
   {$ENDIF}
1050
   {$IFDEF UNIX}
1051
  vzHandle: TLibHandle = 0;
1052

1053
   {$ENDIF}
1054

1055
function Loadlibpng13: boolean;
1056
begin
1057
  Result := False;
1058
  if (vzHandle = INVALID_MODULEHANDLE) then
1059
  begin
1060
    Closezlib;
1061
    vzHandle := LoadLibrary(PChar(LibPng13));
1062
    if (vzHandle <> INVALID_MODULEHANDLE) then
1063
      Result := True
1064
    else
1065
    begin
1066
      if vzHandle <> INVALID_MODULEHANDLE then
1067
        FreeLibrary(vzHandle);
1068
      {$IFDEF GLS_GLS_LOGGING}
1069
      GLSLogger.Log('LIBPNG.pas: libpng13 library not loaded');
1070
      {$ENDIF}
1071
    end;
1072
  end
1073
  else
1074
    Result := True;
1075
end;
1076

1077
procedure Unloadlibpng13;
1078
begin
1079
  if vzHandle <> INVALID_MODULEHANDLE then
1080
  begin
1081
    FreeLibrary(vzHandle);
1082
    vzHandle := INVALID_MODULEHANDLE;
1083
  end;
1084
end;
1085

1086
function GetAddress(ProcName: PChar):Pointer;
1087
begin
1088
  result := GetProcAddress(vzHandle, ProcName);
1089
end;
1090

1091
procedure ReadEntryPoints;
1092
begin
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');
1220

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');
1265
end;
1266

1267

1268
procedure pngReadFn(png_ptr: png_structp; Data: png_bytep; length: png_size_t);
1269
var
1270
  fs: TStream;
1271
begin
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);
1275
end;
1276

1277
procedure pngWriteFn(png_ptr: png_structp; Data: png_bytep; length: png_size_t);
1278
var
1279
  fs: TStream;
1280
begin
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);
1284
end;
1285

1286
procedure pngErrorFn(struct: png_structp; str: png_const_charp); cdecl;
1287
begin
1288
{$IFDEF GLS_LOGGING}
1289
  GLSLogger.Log(string(str), lkError);
1290
{$ENDIF}
1291
end;
1292

1293
procedure pngWarnFn(struct: png_structp; str: png_const_charp); cdecl;
1294
begin
1295
{$IFDEF GLS_LOGGING}
1296
  GLSLogger.Log(string(str), lkWarning);
1297
{$ENDIF}
1298
end;
1299

1300
initialization
1301

1302

1303
  if Loadlibpng13 then ReadEntryPoints;
1304

1305

1306
finalization
1307

1308
  Unloadlibpng13;
1309

1310

1311
end.
1312

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.