2
// This unit is part of the GLScene Engine https://github.com/glscene
6
16/02/11 - PREDATOR - Added support for Mac OS X. Tested on Mac OS X 10.6.5.
7
18/05/10 - Yar - Changed to dynamic library loading for FPC (by Predator)
8
06/05/10 - Yar - Added to GLScene (contributed by oleg matrozov)
11
******************************************************************************
14
* copyright (c) 2000-2010 base2 technologies *
15
* copyright (c) 1995-2002 Borland Software Corporation *
18
* 2010.04.20 updated to zlib version 1.2.5 *
19
* 2010.04.15 updated to zlib version 1.2.4 *
20
* 2005.07.25 updated to zlib version 1.2.3 *
21
* 2005.01.11 updated to zlib version 1.2.2 *
22
* 2004.01.06 updated to zlib version 1.2.1 *
23
* 2002.03.15 updated to zlib version 1.1.4 *
27
* 2002.03.15 informing me about the zlib 1.1.4 update *
28
* 2004.01.06 informing me about the zlib 1.2.1 update *
30
* vicente sanchez-alarcos *
31
* 2005.01.11 informing me about the zlib 1.2.2 update *
34
* 2005.07.25 informing me about the zlib 1.2.3 update *
35
*****************************************************************************}
45
{** version ids ***********************************************************}
49
{** compression methods ***************************************************}
53
{** information flags *****************************************************}
55
Z_INFO_FLAG_SIZE = $1;
57
Z_INFO_FLAG_ADLER = $4;
60
Z_INFO_DEFAULT = Z_INFO_FLAG_SIZE or Z_INFO_FLAG_CRC;
62
{** flush constants *******************************************************}
72
{** return codes **********************************************************}
78
Z_STREAM_ERROR = (-2);
82
Z_VERSION_ERROR = (-6);
84
{** compression levels ****************************************************}
88
Z_BEST_COMPRESSION = 9;
89
Z_DEFAULT_COMPRESSION = (-1);
91
{** compression strategies ************************************************}
97
Z_DEFAULT_STRATEGY = 0;
99
{** data types ************************************************************}
106
{** return code messages **************************************************}
108
_z_errmsg: Array [0..9] of String = (
109
'Need dictionary', // Z_NEED_DICT (2)
110
'Stream end', // Z_STREAM_END (1)
112
'File error', // Z_ERRNO (-1)
113
'Stream error', // Z_STREAM_ERROR (-2)
114
'Data error', // Z_DATA_ERROR (-3)
115
'Insufficient memory', // Z_MEM_ERROR (-4)
116
'Buffer error', // Z_BUF_ERROR (-5)
117
'Incompatible version', // Z_VERSION_ERROR (-6)
122
TZAlloc = function (opaque: Pointer; items, size: Integer): Pointer;
123
TZFree = procedure (opaque, block: Pointer);
125
{** TZStreamRec ***********************************************************}
127
TZStreamRec = packed record
128
next_in : Pointer; // next input byte
129
avail_in : Longint; // number of bytes available at next_in
130
total_in : Longint; // total nb of input bytes read so far
132
next_out : Pointer; // next output byte should be put here
133
avail_out: Longint; // remaining free space at next_out
134
total_out: Longint; // total nb of bytes output so far
136
msg : Pointer; // last error message, NULL if no error
137
state : Pointer; // not visible by applications
139
zalloc : TZAlloc; // used to allocate the internal state
140
zfree : TZFree; // used to free the internal state
141
opaque : Pointer; // private data object passed to zalloc and zfree
143
data_type: Integer; // best guess about the data type: ascii or binary
144
adler : Longint; // adler32 value of the uncompressed data
145
reserved : Longint; // reserved for future use
148
{** macros ******************************************************************}
150
function deflateInit(var strm: TZStreamRec; level: Integer): Integer;
151
{$ifdef Version2005Plus} inline; {$endif}
153
function deflateInit2(var strm: TZStreamRec; level, method, windowBits,
154
memLevel, strategy: Integer): Integer;
155
{$ifdef Version2005Plus} inline; {$endif}
157
function inflateInit(var strm: TZStreamRec): Integer;
158
{$ifdef Version2005Plus} inline; {$endif}
160
function inflateInit2(var strm: TZStreamRec; windowBits: Integer): Integer;
161
{$ifdef Version2005Plus} inline; {$endif}
169
libz = '/usr/lib/libz.dylib';
171
{$ifdef netware} {zlib.nlm comes with netware6}
175
//Note that this is the official ZLIB1 .DLL from the http://www.zlib.net/
180
{** external routines *******************************************************}
182
function Initzlib : Boolean;
184
procedure ReadEntryPoints;
185
function zlibVersion(): string;
186
function ZLIB_VERSION(): PChar;
187
function zGetProcAddress(ProcName: PChar): Pointer;
191
zlibVersionpchar: function(): pchar; cdecl;
192
zErrorpchar: function (err: integer): pchar; cdecl;
193
inflateSyncPoint: function (z: TZstreamRec): integer; cdecl;
194
get_crc_table: function (): pointer; cdecl;
196
deflateInit_: function (var strm: TZStreamRec; level: Integer;
197
version: PAnsiChar; recsize: Integer): Integer; cdecl;
198
deflateInit2_: function (var strm: TZStreamRec; level, method, windowBits,
199
memLevel, strategy: Integer; version: PAnsiChar; recsize: Integer): Integer;
201
deflate: function (var strm: TZStreamRec; flush: Integer): Integer; cdecl;
202
deflateEnd: function (var strm: TZStreamRec): Integer; cdecl;
203
deflateReset: function (var strm: TZStreamRec): Integer; cdecl;
205
inflateInit_: function (var strm: TZStreamRec; version: PAnsiChar;
206
recsize: Integer): Integer; cdecl;
208
inflateInit2_: function (var strm: TZStreamRec; windowBits: Integer;
209
version: PAnsiChar; recsize: Integer): Integer ;cdecl;
211
inflate: function (var strm: TZStreamRec; flush: Integer): Integer; cdecl;
213
inflateEnd: function (var strm: TZStreamRec): Integer; cdecl;
215
inflateReset: function (var strm: TZStreamRec): Integer; cdecl;
217
adler32: function (adler: Longint; const buf; len: Integer): Longint;cdecl;
219
crc32: function (crc: Longint; const buf; len: Integer): Longint; cdecl;
226
{$IFDEF GLS_LOGGING} GLSLog, {$ENDIF}
227
{$IFDEF MSWINDOWS} Windows; {$ENDIF}
228
{$IFDEF GLS_X11_SUPPORT} x, {$ENDIF}
229
{$IFDEF UNIX} dynlibs; {$ENDIF}
231
{*****************************************************************************
235
* -c -O2 -Ve -X -pr -a8 -b -d -k- -vi -tWM *
237
* note: do not reorder the following -- doing so will result in external *
238
* functions being undefined *
239
*****************************************************************************}
242
{** macros ******************************************************************}
244
function deflateInit(var strm: TZStreamRec; level: Integer): Integer;
246
result := deflateInit_(strm, level, ZLIB_VERSION, SizeOf(TZStreamRec));
249
function deflateInit2(var strm: TZStreamRec; level, method, windowBits,
250
memLevel, strategy: Integer): Integer;
252
result := deflateInit2_(strm, level, method, windowBits,
253
memLevel, strategy, ZLIB_VERSION, SizeOf(TZStreamRec));
256
function inflateInit(var strm: TZStreamRec): Integer;
258
result := inflateInit_(strm, ZLIB_VERSION, SizeOf(TZStreamRec));
261
function inflateInit2(var strm: TZStreamRec; windowBits: Integer): Integer;
263
result := inflateInit2_(strm, windowBits, ZLIB_VERSION,
264
SizeOf(TZStreamRec));
267
{** external routines *******************************************************}
271
INVALID_MODULEHANDLE = 0;
275
vzHandle: HINST;//Pointer;
278
vzHandle: TLibHandle = 0;//Pointer;
281
function Initzlib: Boolean;
284
if (vzHandle=INVALID_MODULEHANDLE) then
287
vzHandle := LoadLibrary(PChar(libz));
288
if (vzHandle <> INVALID_MODULEHANDLE) then
291
if vzHandle <> INVALID_MODULEHANDLE then
292
FreeLibrary(vzHandle);
293
{$IFDEF GLS_GLS_LOGGING}
294
GLSLogger.Log('ZLibEx.pas: Zlib library not loaded');
303
if vzHandle<>INVALID_MODULEHANDLE then begin
304
FreeLibrary(vzHandle);
305
vzHandle:=INVALID_MODULEHANDLE;
309
procedure ReadEntryPoints;
311
zlibVersionpchar := zGetProcAddress('zlibVersion');
312
zErrorpchar := zGetProcAddress('zError');
313
inflateSyncPoint := zGetProcAddress('inflateSyncPoint');
314
get_crc_table := zGetProcAddress('get_crc_table');
315
deflateInit_:= zGetProcAddress('deflateInit_');
316
deflateInit2_:= zGetProcAddress('inflateInit2_');
317
deflate:= zGetProcAddress('deflate');
318
deflateEnd:= zGetProcAddress('deflateEnd');
319
deflateReset:= zGetProcAddress('deflateReset');
320
inflateInit_:= zGetProcAddress('inflateInit_');
321
inflateInit2_:= zGetProcAddress('inflateInit2_');
322
inflate:= zGetProcAddress('inflate');
323
inflateEnd:= zGetProcAddress('inflateEnd');
324
inflateReset:= zGetProcAddress('inflateReset');
325
adler32:= zGetProcAddress('adler32');
326
crc32:= zGetProcAddress('crc32');
329
function zlibversion(): string;
331
zlibversion := string(zlibversionpchar);
334
function ZLIB_VERSION(): PChar;
336
ZLIB_VERSION := zlibversionpchar;
339
function zGetProcAddress(ProcName: PChar):Pointer;
341
result := GetProcAddress(vzHandle, ProcName);
344
{** zlib function implementations *******************************************}
346
function zcalloc(opaque: Pointer; items, size: Integer): Pointer;
348
GetMem(result,items * size);
351
procedure zcfree(opaque, block: Pointer);
356
{** c function implementations **********************************************}
358
procedure _memset(p: Pointer; b: Byte; count: Integer); cdecl;
360
FillChar(p^,count,b);
363
procedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
365
Move(source^,dest^,count);
371
if Initzlib then ReadEntryPoints;