/* Copyright (C) 1989, 1990 Aladdin Enterprises.  All rights reserved.
   Distributed by Free Software Foundation, Inc.

This file is part of Ghostscript.

Ghostscript is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY.  No author or distributor accepts responsibility
to anyone for the consequences of using it or for whether it serves any
particular purpose or works at all, unless he says so in writing.  Refer
to the Ghostscript General Public License for full details.

Everyone is granted permission to copy, modify and redistribute
Ghostscript, but only under the conditions described in the Ghostscript
General Public License.  A copy of this license is supposed to have been
given to you along with Ghostscript so you can know your rights and
responsibilities.  It should be in a file named COPYING.  Among other
things, the copyright notice and this notice must be preserved on all
copies.  */

/* gs.h */
/* Common definitions for GhostScript library */
#include <stdio.h>
#include "std.h"

/* Representation of a point. */
typedef struct gs_point_s {
	float x, y;
} gs_point;
typedef struct gs_int_point_s {
	int x, y;
} gs_int_point;
/* Representation of a rectangle. */
/* Note that rectangles are half-open, i.e.: their width is */
/* q.x-p.x and their height is q.y-p.y; they include the points */
/* (x,y) such that p.x<=x<q.x and p.y<=y<q.y. */
typedef struct gs_rect_s {
	gs_point p, q;			/* origin point, corner point */
} gs_rect;
typedef struct gs_int_rect_s {
	gs_int_point p, q;
} gs_int_rect;

/* So many routines use the graphics state */
/* that we may as well declare the abstract type here. */
typedef struct gs_state_s gs_state;

/* A number of interfaces involve user-specified allocation */
/* and deallocation procedures, so we define the structure here. */
typedef struct {
	proc_alloc_t alloc;
	proc_free_t free;
} gs_memory_procs;
/* We define our own versions of malloc and free that conform */
/* to the types proc_alloc_t and proc_free_t: */
char *gs_malloc(P3(uint, uint, char *));
void gs_free(P4(char *, uint, uint, char *));
