2002-06-11 04:02:23 +00:00
|
|
|
|
/*
|
|
|
|
|
|
* $XFree86: $
|
|
|
|
|
|
*
|
|
|
|
|
|
* Copyright <EFBFBD> 2002 University of Southern California
|
|
|
|
|
|
*
|
|
|
|
|
|
* Permission to use, copy, modify, distribute, and sell this software
|
|
|
|
|
|
* and its documentation for any purpose is hereby granted without
|
|
|
|
|
|
* fee, provided that the above copyright notice appear in all copies
|
|
|
|
|
|
* and that both that copyright notice and this permission notice
|
|
|
|
|
|
* appear in supporting documentation, and that the name of University
|
|
|
|
|
|
* of Southern California not be used in advertising or publicity
|
|
|
|
|
|
* pertaining to distribution of the software without specific,
|
|
|
|
|
|
* written prior permission. University of Southern California makes
|
|
|
|
|
|
* no representations about the suitability of this software for any
|
|
|
|
|
|
* purpose. It is provided "as is" without express or implied
|
|
|
|
|
|
* warranty.
|
|
|
|
|
|
*
|
|
|
|
|
|
* UNIVERSITY OF SOUTHERN CALIFORNIA DISCLAIMS ALL WARRANTIES WITH
|
|
|
|
|
|
* REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
|
|
* MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL UNIVERSITY OF
|
|
|
|
|
|
* SOUTHERN CALIFORNIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
|
|
|
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
|
|
|
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
|
|
|
|
|
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
|
|
|
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
|
*
|
|
|
|
|
|
* Author: Carl Worth, USC, Information Sciences Institute */
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
#include "xrint.h"
|
|
|
|
|
|
|
|
|
|
|
|
/* private functions */
|
|
|
|
|
|
static void
|
|
|
|
|
|
_XrPathAddSubPath(XrPath *path, XrSubPath *subpath);
|
|
|
|
|
|
|
|
|
|
|
|
XrPath *
|
|
|
|
|
|
XrPathCreate(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
XrPath *path;
|
|
|
|
|
|
|
|
|
|
|
|
path = malloc(sizeof(XrPath));
|
|
|
|
|
|
return path;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
XrPathInit(XrPath *path)
|
|
|
|
|
|
{
|
|
|
|
|
|
path->head = NULL;
|
|
|
|
|
|
path->tail = NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
XrPathInitCopy(XrPath *path, XrPath *other)
|
|
|
|
|
|
{
|
|
|
|
|
|
XrSubPath *subpath, *othersub;
|
|
|
|
|
|
|
|
|
|
|
|
XrPathInit(path);
|
|
|
|
|
|
|
|
|
|
|
|
for (othersub = other->head; othersub; othersub = othersub->next) {
|
|
|
|
|
|
subpath = XrSubPathClone(othersub);
|
|
|
|
|
|
_XrPathAddSubPath(path, subpath);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
XrPathDeinit(XrPath *path)
|
|
|
|
|
|
{
|
|
|
|
|
|
XrSubPath *subpath;
|
|
|
|
|
|
|
|
|
|
|
|
while (path->head) {
|
|
|
|
|
|
subpath = path->head;
|
|
|
|
|
|
path->head = subpath->next;
|
|
|
|
|
|
XrSubPathDestroy(subpath);
|
|
|
|
|
|
}
|
|
|
|
|
|
path->tail = NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
XrPathDestroy(XrPath *path)
|
|
|
|
|
|
{
|
|
|
|
|
|
free(path);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
XrPath *
|
|
|
|
|
|
XrPathClone(XrPath *path)
|
|
|
|
|
|
{
|
|
|
|
|
|
XrPath *clone;
|
|
|
|
|
|
|
|
|
|
|
|
clone = XrPathCreate();
|
|
|
|
|
|
XrPathInitCopy(clone, path);
|
|
|
|
|
|
return clone;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
XrPathGetCurrentPoint(XrPath *path, XPointDouble *pt)
|
|
|
|
|
|
{
|
|
|
|
|
|
XrSubPathGetCurrentPoint(path->tail, pt);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
|
XrPathNumSubPaths(XrPath *path)
|
|
|
|
|
|
{
|
|
|
|
|
|
XrSubPath *subpath;
|
|
|
|
|
|
int num_subpaths;
|
|
|
|
|
|
|
|
|
|
|
|
num_subpaths = 0;
|
|
|
|
|
|
for (subpath = path->head; subpath; subpath = subpath->next) {
|
|
|
|
|
|
num_subpaths++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return num_subpaths;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
_XrPathAddSubPath(XrPath *path, XrSubPath *subpath)
|
|
|
|
|
|
{
|
|
|
|
|
|
subpath->next = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
if (path->tail) {
|
|
|
|
|
|
path->tail->next = subpath;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
path->head = subpath;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
path->tail = subpath;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
XrPathNewSubPath(XrPath *path)
|
|
|
|
|
|
{
|
|
|
|
|
|
XrSubPath *subpath;
|
|
|
|
|
|
|
|
|
|
|
|
subpath = XrSubPathCreate();
|
|
|
|
|
|
_XrPathAddSubPath(path, subpath);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
XrPathAddPoint(XrPath *path, const XPointDouble *pt)
|
|
|
|
|
|
{
|
|
|
|
|
|
XrSubPathAddPoint(path->tail, pt);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
XrPathMoveTo(XrPath *path, const XPointDouble *pt)
|
|
|
|
|
|
{
|
|
|
|
|
|
XrSubPath *subpath;
|
|
|
|
|
|
|
|
|
|
|
|
subpath = path->tail;
|
|
|
|
|
|
|
|
|
|
|
|
if (subpath == NULL || subpath->num_pts > 1) {
|
|
|
|
|
|
XrPathNewSubPath(path);
|
|
|
|
|
|
XrPathAddPoint(path, pt);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
XrSubPathSetCurrentPoint(subpath, pt);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
XrPathLineTo(XrPath *path, const XPointDouble *pt)
|
|
|
|
|
|
{
|
2002-07-23 07:22:23 +00:00
|
|
|
|
if (path->tail == NULL) {
|
|
|
|
|
|
XrPathMoveTo(path, pt);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
XrPathAddPoint(path, pt);
|
|
|
|
|
|
}
|
2002-06-11 04:02:23 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
XrPathClose(XrPath *path)
|
|
|
|
|
|
{
|
2002-08-12 11:43:56 +00:00
|
|
|
|
if (path->tail) {
|
|
|
|
|
|
XrSubPathClose(path->tail);
|
|
|
|
|
|
XrPathNewSubPath(path);
|
|
|
|
|
|
}
|
2002-06-11 04:02:23 +00:00
|
|
|
|
}
|