gvsig-raster / libjni-potrace / trunk / libjni-potrace / src / main / native / jpotrace / potracelib.c @ 1780
History | View | Annotate | Download (3.02 KB)
1 |
/* Copyright (C) 2001-2007 Peter Selinger.
|
---|---|
2 |
This file is part of Potrace. It is free software and it is covered
|
3 |
by the GNU General Public License. See the file COPYING for details. */
|
4 |
|
5 |
#include <stdlib.h> |
6 |
#include <string.h> |
7 |
|
8 |
#include "potracelib.h" |
9 |
#include "curve.h" |
10 |
#include "decompose.h" |
11 |
#include "trace.h" |
12 |
#include "progress.h" |
13 |
|
14 |
#ifdef HAVE_CONFIG_H
|
15 |
#include "config.h" |
16 |
#endif
|
17 |
|
18 |
/* default parameters */
|
19 |
static const potrace_param_t param_default = { |
20 |
2, /* turdsize */ |
21 |
POTRACE_TURNPOLICY_MINORITY, /* turnpolicy */
|
22 |
1.0, /* alphamax */ |
23 |
1, /* opticurve */ |
24 |
0.2, /* opttolerance */ |
25 |
{ |
26 |
NULL, /* callback function */ |
27 |
NULL, /* callback data */ |
28 |
0.0, 1.0, /* progress range */ |
29 |
0.0, /* granularity */ |
30 |
}, |
31 |
}; |
32 |
|
33 |
/* Return a fresh copy of the set of default parameters, or NULL on
|
34 |
failure with errno set. */
|
35 |
potrace_param_t *potrace_param_default(void) {
|
36 |
potrace_param_t *p; |
37 |
|
38 |
p = (potrace_param_t *) malloc(sizeof(potrace_param_t));
|
39 |
if (!p) {
|
40 |
return NULL; |
41 |
} |
42 |
memcpy(p, ¶m_default, sizeof(potrace_param_t));
|
43 |
return p;
|
44 |
} |
45 |
|
46 |
/* On success, returns a Potrace state st with st->status ==
|
47 |
POTRACE_STATUS_OK. On failure, returns NULL if no Potrace state
|
48 |
could be created (with errno set), or returns an incomplete Potrace
|
49 |
state (with st->status == POTRACE_STATUS_INCOMPLETE). Complete or
|
50 |
incomplete Potrace state can be freed with potrace_state_free(). */
|
51 |
potrace_state_t *potrace_trace(const potrace_param_t *param, const potrace_bitmap_t *bm) { |
52 |
int r;
|
53 |
path_t *plist = NULL;
|
54 |
potrace_state_t *st; |
55 |
progress_t prog; |
56 |
progress_t subprog; |
57 |
|
58 |
/* prepare private progress bar state */
|
59 |
prog.callback = param->progress.callback; |
60 |
prog.data = param->progress.data; |
61 |
prog.min = param->progress.min; |
62 |
prog.max = param->progress.max; |
63 |
prog.epsilon = param->progress.epsilon; |
64 |
prog.d_prev = param->progress.min; |
65 |
|
66 |
/* allocate state object */
|
67 |
st = (potrace_state_t *)malloc(sizeof(potrace_state_t));
|
68 |
if (!st) {
|
69 |
return NULL; |
70 |
} |
71 |
|
72 |
progress_subrange_start(0.0, 0.1, &prog, &subprog); |
73 |
|
74 |
/* process the image */
|
75 |
r = bm_to_pathlist(bm, &plist, param, &subprog); |
76 |
if (r) {
|
77 |
free(st); |
78 |
return NULL; |
79 |
} |
80 |
|
81 |
st->status = POTRACE_STATUS_OK; |
82 |
st->plist = plist; |
83 |
st->priv = NULL; /* private state currently unused */ |
84 |
|
85 |
progress_subrange_end(&prog, &subprog); |
86 |
|
87 |
progress_subrange_start(0.1, 1.0, &prog, &subprog); |
88 |
|
89 |
/* partial success. */
|
90 |
r = process_path(plist, param, &subprog); |
91 |
if (r) {
|
92 |
st->status = POTRACE_STATUS_INCOMPLETE; |
93 |
} |
94 |
|
95 |
progress_subrange_end(&prog, &subprog); |
96 |
|
97 |
return st;
|
98 |
} |
99 |
|
100 |
/* free a Potrace state, without disturbing errno. */
|
101 |
void potrace_state_free(potrace_state_t *st) {
|
102 |
pathlist_free(st->plist); |
103 |
free(st); |
104 |
} |
105 |
|
106 |
/* free a parameter list, without disturbing errno. */
|
107 |
void potrace_param_free(potrace_param_t *p) {
|
108 |
free(p); |
109 |
} |
110 |
|
111 |
char *potrace_version(void) { |
112 |
return "potracelib \"VERSION\""; |
113 |
} |