12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /* Copyright (C) 1997, 2000 Aladdin Enterprises. All rights reserved.
-
- This file is part of AFPL Ghostscript.
-
- AFPL Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author or
- distributor accepts any responsibility for the consequences of using it, or
- for whether it serves any particular purpose or works at all, unless he or
- she says so in writing. Refer to the Aladdin Free Public License (the
- "License") for full details.
-
- Every copy of AFPL Ghostscript must include a copy of the License, normally
- in a plain ASCII text file named PUBLIC. The License grants you the right
- to copy, modify and redistribute AFPL Ghostscript, but only under certain
- conditions described in the License. Among other things, the License
- requires that the copyright notice and this notice be preserved on all
- copies.
- */
- /*$Id: zfunc0.c,v 1.3.6.1 2002/01/17 02:59:35 dancoby Exp $ */
- /* PostScript language interface to FunctionType 0 (Sampled) Functions */
- #include "memory_.h"
- #include "ghost.h"
- #include "oper.h"
- #include "gsdsrc.h"
- #include "gsfunc.h"
- #include "gsfunc0.h"
- #include "stream.h" /* for files.h */
- #include "files.h"
- #include "ialloc.h"
- #include "idict.h"
- #include "idparam.h"
- #include "ifunc.h"
- /* Check prototype */
- build_function_proc(gs_build_function_0);
- /* Finish building a FunctionType 0 (Sampled) function. */
- int
- gs_build_function_0(i_ctx_t *i_ctx_p, const ref *op, const gs_function_params_t * mnDR,
- int depth, gs_function_t ** ppfn, gs_memory_t *mem)
- {
- gs_function_Sd_params_t params;
- ref *pDataSource;
- int code;
- *(gs_function_params_t *) & params = *mnDR;
- params.Encode = 0;
- params.Decode = 0;
- params.Size = 0;
- if ((code = dict_find_string(op, "DataSource", &pDataSource)) <= 0)
- return (code < 0 ? code : gs_note_error(e_rangecheck));
- switch (r_type(pDataSource)) {
- case t_string:
- data_source_init_string2(¶ms.DataSource,
- pDataSource->value.const_bytes,
- r_size(pDataSource));
- break;
- case t_file: {
- stream *s;
- check_read_known_file_else(s, pDataSource, return_error,
- return_error(e_invalidfileaccess));
- if (!(s->modes & s_mode_seek))
- return_error(e_ioerror);
- data_source_init_stream(¶ms.DataSource, s);
- break;
- }
- default:
- return_error(e_rangecheck);
- }
- if ((code = dict_int_param(op, "Order", 1, 3, 1, ¶ms.Order)) < 0 ||
- (code = dict_int_param(op, "BitsPerSample", 1, 32, 0,
- ¶ms.BitsPerSample)) < 0 ||
- ((code = fn_build_float_array(op, "Encode", false, true, ¶ms.Encode, mem)) != 2 * params.m && (code != 0 || params.Encode != 0)) ||
- ((code = fn_build_float_array(op, "Decode", false, true, ¶ms.Decode, mem)) != 2 * params.n && (code != 0 || params.Decode != 0))
- ) {
- goto fail;
- } {
- int *ptr = (int *)
- gs_alloc_byte_array(mem, params.m, sizeof(int), "Size");
- if (ptr == 0) {
- code = gs_note_error(e_VMerror);
- goto fail;
- }
- params.Size = ptr;
- code = dict_ints_param(op, "Size", params.m, ptr);
- if (code != params.m)
- goto fail;
- }
- code = gs_function_Sd_init(ppfn, ¶ms, mem);
- if (code >= 0)
- return 0;
- fail:
- gs_function_Sd_free_params(¶ms, mem);
- return (code < 0 ? code : gs_note_error(e_rangecheck));
- }
|