2 |
- |
1 |
/* Copyright (C) 1997, 2000 Aladdin Enterprises. All rights reserved.
|
|
|
2 |
|
|
|
3 |
This software is provided AS-IS with no warranty, either express or
|
|
|
4 |
implied.
|
|
|
5 |
|
|
|
6 |
This software is distributed under license and may not be copied,
|
|
|
7 |
modified or distributed except as expressly authorized under the terms
|
|
|
8 |
of the license contained in the file LICENSE in this distribution.
|
|
|
9 |
|
|
|
10 |
For more information about licensing, please refer to
|
|
|
11 |
http://www.ghostscript.com/licensing/. For information on
|
|
|
12 |
commercial licensing, go to http://www.artifex.com/licensing/ or
|
|
|
13 |
contact Artifex Software, Inc., 101 Lucas Valley Road #110,
|
|
|
14 |
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
|
|
|
15 |
*/
|
|
|
16 |
|
|
|
17 |
/* $Id: zfunc0.c,v 1.6 2002/02/21 22:24:54 giles Exp $ */
|
|
|
18 |
/* PostScript language interface to FunctionType 0 (Sampled) Functions */
|
|
|
19 |
#include "memory_.h"
|
|
|
20 |
#include "ghost.h"
|
|
|
21 |
#include "oper.h"
|
|
|
22 |
#include "gsdsrc.h"
|
|
|
23 |
#include "gsfunc.h"
|
|
|
24 |
#include "gsfunc0.h"
|
|
|
25 |
#include "stream.h" /* for files.h */
|
|
|
26 |
#include "files.h"
|
|
|
27 |
#include "ialloc.h"
|
|
|
28 |
#include "idict.h"
|
|
|
29 |
#include "idparam.h"
|
|
|
30 |
#include "ifunc.h"
|
|
|
31 |
|
|
|
32 |
/* Check prototype */
|
|
|
33 |
build_function_proc(gs_build_function_0);
|
|
|
34 |
|
|
|
35 |
/* Finish building a FunctionType 0 (Sampled) function. */
|
|
|
36 |
int
|
|
|
37 |
gs_build_function_0(i_ctx_t *i_ctx_p, const ref *op, const gs_function_params_t * mnDR,
|
|
|
38 |
int depth, gs_function_t ** ppfn, gs_memory_t *mem)
|
|
|
39 |
{
|
|
|
40 |
gs_function_Sd_params_t params;
|
|
|
41 |
ref *pDataSource;
|
|
|
42 |
int code;
|
|
|
43 |
|
|
|
44 |
*(gs_function_params_t *) & params = *mnDR;
|
|
|
45 |
params.Encode = 0;
|
|
|
46 |
params.Decode = 0;
|
|
|
47 |
params.Size = 0;
|
|
|
48 |
if ((code = dict_find_string(op, "DataSource", &pDataSource)) <= 0)
|
|
|
49 |
return (code < 0 ? code : gs_note_error(e_rangecheck));
|
|
|
50 |
switch (r_type(pDataSource)) {
|
|
|
51 |
case t_string:
|
|
|
52 |
data_source_init_string2(¶ms.DataSource,
|
|
|
53 |
pDataSource->value.const_bytes,
|
|
|
54 |
r_size(pDataSource));
|
|
|
55 |
break;
|
|
|
56 |
case t_file: {
|
|
|
57 |
stream *s;
|
|
|
58 |
|
|
|
59 |
check_read_known_file_else(s, pDataSource, return_error,
|
|
|
60 |
return_error(e_invalidfileaccess));
|
|
|
61 |
if (!(s->modes & s_mode_seek))
|
|
|
62 |
return_error(e_ioerror);
|
|
|
63 |
data_source_init_stream(¶ms.DataSource, s);
|
|
|
64 |
break;
|
|
|
65 |
}
|
|
|
66 |
default:
|
|
|
67 |
return_error(e_rangecheck);
|
|
|
68 |
}
|
|
|
69 |
if ((code = dict_int_param(op, "Order", 1, 3, 1, ¶ms.Order)) < 0 ||
|
|
|
70 |
(code = dict_int_param(op, "BitsPerSample", 1, 32, 0,
|
|
|
71 |
¶ms.BitsPerSample)) < 0 ||
|
|
|
72 |
((code = fn_build_float_array(op, "Encode", false, true, ¶ms.Encode, mem)) != 2 * params.m && (code != 0 || params.Encode != 0)) ||
|
|
|
73 |
((code = fn_build_float_array(op, "Decode", false, true, ¶ms.Decode, mem)) != 2 * params.n && (code != 0 || params.Decode != 0))
|
|
|
74 |
) {
|
|
|
75 |
goto fail;
|
|
|
76 |
} {
|
|
|
77 |
int *ptr = (int *)
|
|
|
78 |
gs_alloc_byte_array(mem, params.m, sizeof(int), "Size");
|
|
|
79 |
|
|
|
80 |
if (ptr == 0) {
|
|
|
81 |
code = gs_note_error(e_VMerror);
|
|
|
82 |
goto fail;
|
|
|
83 |
}
|
|
|
84 |
params.Size = ptr;
|
|
|
85 |
code = dict_ints_param(op, "Size", params.m, ptr);
|
|
|
86 |
if (code != params.m)
|
|
|
87 |
goto fail;
|
|
|
88 |
}
|
|
|
89 |
code = gs_function_Sd_init(ppfn, ¶ms, mem);
|
|
|
90 |
if (code >= 0)
|
|
|
91 |
return 0;
|
|
|
92 |
fail:
|
|
|
93 |
gs_function_Sd_free_params(¶ms, mem);
|
|
|
94 |
return (code < 0 ? code : gs_note_error(e_rangecheck));
|
|
|
95 |
}
|