blob: 7a27a8852af4d72e17deacda9d62ff62a9043253 [file] [log] [blame]
Sjoerd Mullenderc4315491992-09-23 14:53:00 +00001/***********************************************************
2Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
3Netherlands.
4
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25
26/* Cl objects */
27
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000028#include <stdarg.h>
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000029#include <cl.h>
30#include "allobjects.h"
31#include "modsupport.h" /* For getargs() etc. */
32#include "ceval.h" /* For call_object() */
33
34typedef struct {
35 OB_HEAD
36 int ob_isCompressor; /* Compressor or Decompressor */
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000037 CL_Handle ob_compressorHdl;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000038} clobject;
39
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000040static object *ClError; /* exception cl.error */
41
42static int error_handler_called = 0;
43
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000044/********************************************************************
45 Utility routines.
46********************************************************************/
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000047static void
48cl_ErrorHandler(long errnum, const char *fmt, ...)
49{
50 va_list ap;
51 char errbuf[BUFSIZ]; /* hopefully big enough */
Sjoerd Mullender384f2481992-09-29 16:43:43 +000052 char *p;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000053
Sjoerd Mullender384f2481992-09-29 16:43:43 +000054 if (err_occurred()) /* don't change existing error */
55 return;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000056 error_handler_called = 1;
57 va_start(ap, fmt);
58 vsprintf(errbuf, fmt, ap);
59 va_end(ap);
Sjoerd Mullender384f2481992-09-29 16:43:43 +000060 p = &errbuf[strlen(errbuf) - 1]; /* swat the line feed */
61 if (*p == '\n')
62 *p = 0;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000063 err_setstr(ClError, errbuf);
64}
65
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000066/*
67 * This assumes that params are always in the range 0 to some maximum.
68 * This is not very efficient.
69 */
70static int
71param_type_is_float(CL_Handle comp, long param)
72{
73 long bufferlength;
74 long *PVbuffer;
75 int ret;
76
77 error_handler_called = 0;
78 bufferlength = clQueryParams(comp, 0, 0);
79 if (error_handler_called)
80 return -1;
81
82 if (param < 0 || param >= bufferlength / 2)
83 return -1;
84
85 PVbuffer = NEW(long, bufferlength);
86 if (PVbuffer == NULL)
87 return -1;
88
89 bufferlength = clQueryParams(comp, PVbuffer, bufferlength);
90 if (error_handler_called) {
91 DEL(PVbuffer);
92 return -1;
93 }
94
95 if (PVbuffer[param*2 + 1] == CL_FLOATING_ENUM_VALUE ||
96 PVbuffer[param*2 + 1] == CL_FLOATING_RANGE_VALUE)
97 ret = 1;
98 else
99 ret = 0;
100
101 DEL(PVbuffer);
102
103 return ret;
104}
105
106/********************************************************************
107 Single image compression/decompression.
108********************************************************************/
109static object *
110cl_CompressImage(self, args)
111 object *self, *args;
112{
113 long compressionScheme, width, height, originalFormat;
114 float compressionRatio;
115 long frameBufferSize, compressedBufferSize;
116 char *frameBuffer;
117 object *compressedBuffer;
118
119 if (!getargs(args, "(iiiifs#)", &compressionScheme, &width, &height,
120 &originalFormat, &compressionRatio, &frameBuffer,
121 &frameBufferSize))
122 return NULL;
123
124 retry:
125 compressedBuffer = newsizedstringobject(NULL, frameBufferSize);
126 if (compressedBuffer == NULL)
127 return NULL;
128
129 compressedBufferSize = frameBufferSize;
130 error_handler_called = 0;
131 if (clCompressImage(compressionScheme, width, height, originalFormat,
132 compressionRatio, (void *) frameBuffer,
133 &compressedBufferSize,
134 (void *) getstringvalue(compressedBuffer))
135 == FAILURE) {
136 DECREF(compressedBuffer);
137 if (!error_handler_called)
138 err_setstr(ClError, "clCompressImage failed");
139 return NULL;
140 }
141
142 if (compressedBufferSize > frameBufferSize) {
143 frameBufferSize = compressedBufferSize;
144 DECREF(compressedBuffer);
145 goto retry;
146 }
147
148 if (compressedBufferSize < frameBufferSize)
149 if (resizestring(&compressedBuffer, compressedBufferSize))
150 return NULL;
151
152 return compressedBuffer;
153}
154
155static object *
156cl_DecompressImage(self, args)
157 object *self, *args;
158{
159 long compressionScheme, width, height, originalFormat;
160 char *compressedBuffer;
161 long compressedBufferSize, frameBufferSize;
162 object *frameBuffer;
163
164 if (!getargs(args, "(iiiis#i)", &compressionScheme, &width, &height,
165 &originalFormat, &compressedBuffer, &compressedBufferSize,
166 &frameBufferSize))
167 return NULL;
168
169 frameBuffer = newsizedstringobject(NULL, frameBufferSize);
170 if (frameBuffer == NULL)
171 return NULL;
172
173 error_handler_called = 0;
174 if (clDecompressImage(compressionScheme, width, height, originalFormat,
175 compressedBufferSize, compressedBuffer,
176 (void *) getstringvalue(frameBuffer)) == FAILURE) {
177 DECREF(frameBuffer);
178 if (!error_handler_called)
179 err_setstr(ClError, "clDecompressImage failed");
180 return NULL;
181 }
182
183 return frameBuffer;
184}
185
186/********************************************************************
187 Sequential compression/decompression.
188********************************************************************/
189extern typeobject Cltype; /* Really static, forward */
190
191#define CheckCompressor(self) if ((self)->ob_compressorHdl == NULL) { \
192 err_setstr(RuntimeError, "(de)compressor not active"); \
193 return NULL; \
194 }
195
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000196static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000197doClose(self, args, close_func)
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000198 clobject *self;
199 object *args;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000200 long (*close_func) PROTO((CL_Handle));
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000201{
202 CheckCompressor(self);
203
204 if (!getnoarg(args))
205 return NULL;
206
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000207 error_handler_called = 0;
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000208 if ((*close_func)(self->ob_compressorHdl) == FAILURE) {
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000209 if (!error_handler_called)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000210 err_setstr(ClError, "close failed");
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000211 return NULL;
212 }
213
214 self->ob_compressorHdl = NULL;
215
216 INCREF(None);
217 return None;
218}
219
220static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000221clm_CloseCompressor(self, args)
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000222 clobject *self;
223 object *args;
224{
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000225 return doClose(self, args, clCloseCompressor);
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000226}
227
228static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000229clm_CloseDecompressor(self, args)
230 clobject *self;
231 object *args;
232{
233 return doClose(self, args, clCloseDecompressor);
234}
235
236static object *
237clm_Compress(self, args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000238 clobject *self;
239 object *args;
240{
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000241 long numberOfFrames;
242 long frameBufferSize, compressedBufferSize;
243 char *frameBuffer;
244 long PVbuf[2];
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000245 object *data;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000246
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000247 CheckCompressor(self);
248
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000249 if (!getargs(args, "(is#)", &numberOfFrames, &frameBuffer, &frameBufferSize))
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000250 return NULL;
251
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000252 PVbuf[0] = CL_COMPRESSED_BUFFER_SIZE;
253 PVbuf[1] = 0;
254 error_handler_called = 0;
255 clGetParams(self->ob_compressorHdl, PVbuf, 2L);
256 if (error_handler_called)
257 return NULL;
258
259 data = newsizedstringobject(NULL, PVbuf[1]);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000260 if (data == NULL)
261 return NULL;
262
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000263 compressedBufferSize = PVbuf[1];
264
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000265 error_handler_called = 0;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000266 if (clCompress(self->ob_compressorHdl, numberOfFrames,
267 (void *) frameBuffer, &compressedBufferSize,
268 (void *) getstringvalue(data)) == FAILURE) {
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000269 DECREF(data);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000270 if (!error_handler_called)
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000271 err_setstr(ClError, "compress failed");
272 return NULL;
273 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000274
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000275 if (compressedBufferSize < PVbuf[1])
276 if (resizestring(&data, compressedBufferSize))
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000277 return NULL;
278
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000279 if (compressedBufferSize > PVbuf[1]) {
280 /* we didn't get all "compressed" data */
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000281 DECREF(data);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000282 err_setstr(ClError, "compressed data is more than fitted");
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000283 return NULL;
284 }
285
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000286 return data;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000287}
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000288
289static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000290clm_Decompress(self, args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000291 clobject *self;
292 object *args;
293{
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000294 long PVbuf[2];
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000295 object *data;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000296 long numberOfFrames;
297 char *compressedData;
298 long compressedDataSize;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000299
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000300 CheckCompressor(self);
301
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000302 if (!getargs(args, "(is#)", &numberOfFrames, &compressedData,
303 &compressedDataSize))
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000304 return NULL;
305
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000306 PVbuf[0] = CL_FRAME_BUFFER_SIZE;
307 PVbuf[1] = 0;
308 error_handler_called = 0;
309 clGetParams(self->ob_compressorHdl, PVbuf, 2L);
310 if (error_handler_called)
311 return NULL;
312
313 data = newsizedstringobject(NULL, PVbuf[1]);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000314 if (data == NULL)
315 return NULL;
316
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000317 error_handler_called = 0;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000318 if (clDecompress(self->ob_compressorHdl, numberOfFrames,
319 compressedDataSize, (void *) compressedData,
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000320 (void *) getstringvalue(data)) == FAILURE) {
321 DECREF(data);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000322 if (!error_handler_called)
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000323 err_setstr(ClError, "decompress failed");
324 return NULL;
325 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000326
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000327 return data;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000328}
329
330static object *
331doParams(self, args, func, modified)
332 clobject *self;
333 object *args;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000334 void (*func)(CL_Handle, long *, long);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000335 int modified;
336{
337 object *list, *v;
338 long *PVbuffer;
339 long length;
340 int i;
341
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000342 CheckCompressor(self);
343
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000344 if (!getargs(args, "O", &list))
345 return NULL;
346 if (!is_listobject(list)) {
347 err_badarg();
348 return NULL;
349 }
350 length = getlistsize(list);
351 PVbuffer = NEW(long, length);
352 if (PVbuffer == NULL)
353 return err_nomem();
354 for (i = 0; i < length; i++) {
355 v = getlistitem(list, i);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000356 if (is_floatobject(v))
357 PVbuffer[i] = clFloatToRatio(getfloatvalue(v));
358 else if (is_intobject(v))
359 PVbuffer[i] = getintvalue(v);
360 else {
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000361 DEL(PVbuffer);
362 err_badarg();
363 return NULL;
364 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000365 }
366
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000367 error_handler_called = 0;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000368 (*func)(self->ob_compressorHdl, PVbuffer, length);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000369 if (error_handler_called)
370 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000371
372 if (modified) {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000373 for (i = 0; i < length; i++) {
374 v = getlistitem(list, i);
375 if (is_floatobject(v))
376 v = newfloatobject(clRatioToFloat(PVbuffer[i]));
377 else
378 v = newintobject(PVbuffer[i]);
379 setlistitem(list, i, v);
380 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000381 }
382
383 DEL(PVbuffer);
384
385 INCREF(None);
386 return None;
387}
388
389static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000390clm_GetParams(self, args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000391 clobject *self;
392 object *args;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000393{
394 return doParams(self, args, clGetParams, 1);
395}
396
397static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000398clm_SetParams(self, args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000399 clobject *self;
400 object *args;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000401{
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000402 return doParams(self, args, clSetParams, 1);
403}
404
405static object *
406clm_GetParamID(self, args)
407 clobject *self;
408 object *args;
409{
410 char *name;
411 long value;
412
413 CheckCompressor(self);
414
415 if (!getargs(args, "s", &name))
416 return NULL;
417
418 error_handler_called = 0;
419 value = clGetParamID(self->ob_compressorHdl, name);
420 if (value == FAILURE) {
421 if (!error_handler_called)
422 err_setstr(ClError, "getparamid failed");
423 return NULL;
424 }
425
426 return newintobject(value);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000427}
428
429static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000430clm_QueryParams(self, args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000431 clobject *self;
432 object *args;
433{
434 long bufferlength;
435 long *PVbuffer;
436 object *list;
437 int i;
438
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000439 CheckCompressor(self);
440
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000441 if (!getnoarg(args))
442 return NULL;
443
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000444 error_handler_called = 0;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000445 bufferlength = clQueryParams(self->ob_compressorHdl, 0, 0);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000446 if (error_handler_called)
447 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000448
449 PVbuffer = NEW(long, bufferlength);
450 if (PVbuffer == NULL)
451 return err_nomem();
452
453 bufferlength = clQueryParams(self->ob_compressorHdl, PVbuffer,
454 bufferlength);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000455 if (error_handler_called) {
456 DEL(PVbuffer);
457 return NULL;
458 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000459
460 list = newlistobject(bufferlength);
461 if (list == NULL) {
462 DEL(PVbuffer);
463 return NULL;
464 }
465
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000466 for (i = 0; i < bufferlength; i++) {
467 if (i & 1)
468 setlistitem(list, i, newintobject(PVbuffer[i]));
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000469 else if (PVbuffer[i] == 0) {
470 INCREF(None);
471 setlistitem(list, i, None);
472 } else
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000473 setlistitem(list, i, newstringobject((char *) PVbuffer[i]));
474 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000475
476 DEL(PVbuffer);
477
478 return list;
479}
480
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000481static object *
482clm_GetMinMax(self, args)
483 clobject *self;
484 object *args;
485{
486 long param, min, max;
487 double fmin, fmax;
488
489 CheckCompressor(self);
490
491 if (!getargs(args, "i", &param))
492 return NULL;
493
494 clGetMinMax(self->ob_compressorHdl, param, &min, &max);
495
496 if (param_type_is_float(self->ob_compressorHdl, param) > 0) {
497 fmin = clRatioToFloat(min);
498 fmax = clRatioToFloat(max);
499 return mkvalue("(ff)", fmin, fmax);
500 }
501
502 return mkvalue("(ii)", min, max);
503}
504
505static object *
506clm_GetName(self, args)
507 clobject *self;
508 object *args;
509{
510 long param;
511 char *name;
512
513 CheckCompressor(self);
514
515 if (!getargs(args, "i", &param))
516 return NULL;
517
518 error_handler_called = 0;
519 name = clGetName(self->ob_compressorHdl, param);
520 if (name == NULL || error_handler_called) {
521 if (!error_handler_called)
522 err_setstr(ClError, "getname failed");
523 return NULL;
524 }
525
526 return newstringobject(name);
527}
528
529static object *
530clm_GetDefault(self, args)
531 clobject *self;
532 object *args;
533{
534 long param, value;
535 double fvalue;
536
537 CheckCompressor(self);
538
539 if (!getargs(args, "i", &param))
540 return NULL;
541
542 error_handler_called = 0;
543 value = clGetDefault(self->ob_compressorHdl, param);
544 if (error_handler_called)
545 return NULL;
546
547 if (param_type_is_float(self->ob_compressorHdl, param) > 0) {
548 fvalue = clRatioToFloat(value);
549 return newfloatobject(fvalue);
550 }
551
552 return newintobject(value);
553}
554
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000555static struct methodlist compressor_methods[] = {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000556 {"close", clm_CloseCompressor}, /* alias */
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000557 {"CloseCompressor", clm_CloseCompressor},
558 {"Compress", clm_Compress},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000559 {"GetDefault", clm_GetDefault},
560 {"GetMinMax", clm_GetMinMax},
561 {"GetName", clm_GetName},
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000562 {"GetParamID", clm_GetParamID},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000563 {"GetParams", clm_GetParams},
564 {"QueryParams", clm_QueryParams},
565 {"SetParams", clm_SetParams},
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000566 {NULL, NULL} /* sentinel */
567};
568
569static struct methodlist decompressor_methods[] = {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000570 {"close", clm_CloseDecompressor}, /* alias */
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000571 {"CloseDecompressor", clm_CloseDecompressor},
572 {"Decompress", clm_Decompress},
573 {"GetDefault", clm_GetDefault},
574 {"GetMinMax", clm_GetMinMax},
575 {"GetName", clm_GetName},
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000576 {"GetParamID", clm_GetParamID},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000577 {"GetParams", clm_GetParams},
578 {"QueryParams", clm_QueryParams},
579 {"SetParams", clm_SetParams},
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000580 {NULL, NULL} /* sentinel */
581};
582
583static void
584cl_dealloc(self)
585 clobject *self;
586{
587 if (self->ob_compressorHdl) {
588 if (self->ob_isCompressor)
589 clCloseCompressor(self->ob_compressorHdl);
590 else
591 clCloseDecompressor(self->ob_compressorHdl);
592 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000593 DEL(self);
594}
595
596static object *
597cl_getattr(self, name)
598 clobject *self;
599 char *name;
600{
601 if (self->ob_isCompressor)
602 return findmethod(compressor_methods, (object *)self, name);
603 else
604 return findmethod(decompressor_methods, (object *) self, name);
605}
606
607static typeobject Cltype = {
608 OB_HEAD_INIT(&Typetype)
609 0, /*ob_size*/
610 "cl", /*tp_name*/
611 sizeof(clobject), /*tp_size*/
612 0, /*tp_itemsize*/
613 /* methods */
614 cl_dealloc, /*tp_dealloc*/
615 0, /*tp_print*/
616 cl_getattr, /*tp_getattr*/
617 0, /*tp_setattr*/
618 0, /*tp_compare*/
619 0, /*tp_repr*/
620 0, /*tp_as_number*/
621 0, /*tp_as_sequence*/
622 0, /*tp_as_mapping*/
623};
624
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000625static object *
626doOpen(self, args, open_func, iscompressor)
627 object *self, *args;
628 long (*open_func) PROTO((long, CL_Handle *));
629 int iscompressor;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000630{
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000631 long scheme;
632 clobject *new;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000633
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000634 if (!getargs(args, "i", &scheme))
635 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000636
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000637 new = NEWOBJ(clobject, &Cltype);
638 if (new == NULL)
639 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000640
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000641 new->ob_compressorHdl = NULL;
642 new->ob_isCompressor = iscompressor;
643
644 error_handler_called = 0;
645 if ((*open_func)(scheme, &new->ob_compressorHdl) == FAILURE) {
646 DECREF(new);
647 if (!error_handler_called)
648 err_setstr(ClError, "Open(De)Compressor failed");
649 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000650 }
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000651 return new;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000652}
653
654static object *
655cl_OpenCompressor(self, args)
656 object *self, *args;
657{
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000658 return doOpen(self, args, clOpenCompressor, 1);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000659}
660
661static object *
662cl_OpenDecompressor(self, args)
663 object *self, *args;
664{
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000665 return doOpen(self, args, clOpenDecompressor, 0);
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000666}
667
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000668static struct methodlist cl_methods[] = {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000669 {"CompressImage", cl_CompressImage},
670 {"DecompressImage", cl_DecompressImage},
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000671 {"OpenCompressor", cl_OpenCompressor},
672 {"OpenDecompressor", cl_OpenDecompressor},
673 {NULL, NULL} /* Sentinel */
674};
675
676void
677initcl()
678{
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000679 object *m, *d;
680
681 m = initmodule("cl", cl_methods);
682 d = getmoduledict(m);
683
684 ClError = newstringobject("cl.error");
685 if (ClError == NULL || dictinsert(d, "error", ClError) != 0)
686 fatal("can't define cl.error");
687
688 (void) clSetErrorHandler(cl_ErrorHandler);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000689}