diff options
Diffstat (limited to 'gs/psi/zfontenum.c')
-rw-r--r-- | gs/psi/zfontenum.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/gs/psi/zfontenum.c b/gs/psi/zfontenum.c new file mode 100644 index 000000000..2f36f0ee8 --- /dev/null +++ b/gs/psi/zfontenum.c @@ -0,0 +1,133 @@ +/* Copyright (C) 2001-2006 Artifex Software, Inc. + All Rights Reserved. + + This software is provided AS-IS with no warranty, either express or + implied. + + This software is distributed under license and may not be copied, modified + or distributed except as expressly authorized under the terms of that + license. Refer to licensing information at http://www.artifex.com/ + or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. +*/ + +/* $Id$ */ + +/* this is the ps interpreter interface to the native font + enumeration code. it calls the platform-specific routines + to obtain an additional set of entries that can be added + to the Fontmap to reference fonts stored on the system. + */ + +#include "memory_.h" +#include "string_.h" +#include <stdlib.h> +#include "ghost.h" +#include "oper.h" +#include "gsstruct.h" +#include "gsmalloc.h" +#include "ialloc.h" +#include "iname.h" +#include "iutil.h" +#include "store.h" +#include "gp.h" + + +typedef struct fontenum_s { + char *fontname, *path; + struct fontenum_s *next; +} fontenum_t; + +/* .getnativefonts [ [<name> <path>] ... ] */ +static int +z_fontenum(i_ctx_t *i_ctx_p) +{ + os_ptr op = osp; + void *enum_state; + int code = 0; + int e,elements; + char *fontname, *path; + fontenum_t *r, *results; + ref array; + uint length; + byte *string; + + enum_state = gp_enumerate_fonts_init(imemory); + if (enum_state == NULL) { + /* put false on the stack and return */ + push(1); + make_bool(op, false); + return code; + } + + r = results = gs_malloc(imemory->non_gc_memory, 1, sizeof(fontenum_t), "fontenum list"); + elements = 0; + while((code = gp_enumerate_fonts_next(enum_state, &fontname, &path )) > 0) { + if (fontname == NULL || path == NULL) { + gp_enumerate_fonts_free(enum_state); + return_error(e_ioerror); + } + + length = strlen(fontname) + 1; + r->fontname = gs_malloc(imemory->non_gc_memory, length, 1, "native font name"); + memcpy(r->fontname, fontname, length); + + length = strlen(path) + 1; + r->path = gs_malloc(imemory->non_gc_memory, length, 1, "native font path"); + memcpy(r->path, path, length); + + r->next = gs_malloc(imemory->non_gc_memory, 1, sizeof(fontenum_t), "fontenum list"); + r = r->next; + elements += 1; + } + + gp_enumerate_fonts_free(enum_state); + + code = ialloc_ref_array(&array, a_all | icurrent_space, elements, "native fontmap"); + + r = results; + for (e = 0; e < elements; e++) { + ref mapping; + + code = ialloc_ref_array(&mapping, a_all | icurrent_space, 2, "native font mapping"); + + length = strlen(r->fontname); + string = ialloc_string(length, "native font name"); + if (string == NULL) + return_error(e_VMerror); + memcpy(string, r->fontname, length); + make_string(&(mapping.value.refs[0]), a_all | icurrent_space, length, string); + + length = strlen(r->path); + string = ialloc_string(length, "native font path"); + if (string == NULL) + return_error(e_VMerror); + memcpy(string, r->path, length); + make_string(&(mapping.value.refs[1]), a_all | icurrent_space, length, string); + + ref_assign(&(array.value.refs[e]), &mapping); + results = r; + r = r->next; + + gs_free(imemory->non_gc_memory, + results->fontname, strlen(results->fontname) + 1, 1, "native font name"); + gs_free(imemory->non_gc_memory, + results->path, strlen(results->path) + 1, 1, "native font path"); + gs_free(imemory->non_gc_memory, + results, 1, sizeof(fontenum_t), "fontenum list"); + } + + push(2); + ref_assign(op-1, &array); + make_bool(op, true); + + return code; +} + + +/* Match the above routines to their postscript filter names. + This is how our static routines get called externally. */ +const op_def zfontenum_op_defs[] = { + {"0.getnativefonts", z_fontenum}, + op_def_end(0) +}; |