Warning, /graphics/glaxnimate/external/potrace/doc/potracelib.tex is written in an unsupported language. File is not indexed.
0001 % Copyright (C) 2001-2019 Peter Selinger.
0002 % This file is part of Potrace. It is licensed under the GNU General
0003 % Public License. See the file COPYING for details.
0004
0005 \documentclass{article}
0006 \usepackage{times}
0007 \usepackage{graphics}
0008
0009 \title{Potrace Library API}
0010 \author{}
0011 \date{}
0012
0013 % Alphabetic labels
0014 {\makeatletter
0015 \gdef\alphalabels{\def\theenumi{\@alph\c@enumi}\def\labelenumi{(\theenumi)}}}
0016
0017 \begin{document}
0018 \maketitle
0019
0020 \noindent {\it Copyright \copyright\ 2001-2019 Peter Selinger.
0021 This file is part of Potrace. It is licensed under the GNU General
0022 Public License. See the file COPYING for details. }
0023
0024 \section{Scope}
0025
0026 The Potrace library provides:
0027
0028 \begin{itemize}
0029 \item tracing, i.e., conversion of bitmaps to a vector representation
0030 (Bezier curves and straight line segments).
0031 \end{itemize}
0032 It does not provide frontend functionality such as:
0033
0034 \begin{itemize}
0035 \item preparation of bitmaps (e.g.\ reading a bitmap from a file, preparing
0036 a bitmap by thresholding/scaling/filtering a greyscale image etc)
0037 \end{itemize}
0038 And it does not provide backend functionality such as:
0039
0040 \begin{itemize}
0041 \item post-processing of the vector representation (e.g.\ conversion to a
0042 file format such as PostScript or SVG, scaling + rotation,
0043 quantization etc).
0044 \end{itemize}
0045
0046 \section{Data representation}
0047
0048 \subsection{Bitmaps}\label{ssec-bitmap}
0049
0050 \subsubsection{Coordinate system}
0051
0052 \begin{figure}[t]
0053 \[ \includegraphics*[0in,0in][3in,1.7in]{potracelib-fig3}
0054 \]
0055 \caption{The Potrace coordinate system}\label{fig-coord}
0056 \end{figure}
0057
0058 For Potrace, a bitmap of size $w\times h$ is embedded in a cartesian
0059 coordinate system where each pixel takes up the space of one unit
0060 square. The pixels are positioned so that the {\em corners} of pixels
0061 (and not their centers) lie at points with integer coordinates, as
0062 illustrated in Figure~\ref{fig-coord}. The origin of the coordinate
0063 system is at the {\em lower left} corner of the bitmap. The four
0064 corners of the bitmaps have coordinates $(0,0)$, $(0,h)$, $(w,h)$, and
0065 $(w,0)$.
0066
0067 Sometimes we need to refer to a specific pixel (as opposed to a point
0068 in the plane). When we speak of ``pixel $[i,j]$'', we mean the pixel
0069 whose corners have coordinates $(i,j)$, $(i,j+1)$, $(i+1,j+1)$,
0070 $(i+1,j)$ in Potrace's coordinate system. Thus, pixel $[i,j]$ is the
0071 pixel whose center is at coordinates $(i+0.5, j+0.5)$. To avoid
0072 confusion, we use square brackets to refer to the pixel $[i,j]$, and
0073 round brackets to refer to the point $(i,j)$.
0074
0075 \subsubsection{Bitmap representation}
0076
0077 The Potrace library expects bitmaps in the following format, defined
0078 in potracelib.h:
0079
0080 \begin{verbatim}
0081 struct potrace_bitmap_s {
0082 int w, h; /* width and height, in pixels */
0083 int dy; /* scanline offset in words */
0084 potrace_word *map; /* pixel data, dy*h words */
0085 };
0086 typedef struct potrace_bitmap_s potrace_bitmap_t;
0087 \end{verbatim}
0088
0089 Here, \verb!potrace_word! is an unsigned integer type defined in
0090 potracelib.h. It is usually equal to a native machine word (i.e., 32
0091 bits on a 32-bit architecture). In the following explanation, we
0092 assume that the type \verb!potrace_word! holds $N$ bits.
0093
0094 A bitmap of dimensions $w\times h$ is divided, bottom to top, into $h$
0095 horizontal scanlines. Each scanline is divided, left to right, into
0096 blocks of $N$ pixels. Each such block of $N$ pixels is stored as a
0097 single \verb!potrace_word!, with the leftmost pixels of the block
0098 corresponding to the most significant bit of the word, and the
0099 rightmost pixel of the block corresponding to the least significant
0100 bit of the word.
0101
0102 Pixels that are ``on'' (or ``black'' or ``foreground'') are
0103 represented by bit value $1$. Pixels that are ``off'' (of ``white''
0104 or ``background'') are represented by bit value $0$.
0105
0106 If the number of bits in a scanline is not divisible by $N$, then the
0107 rightmost word of the scanline is padded on the right with zeros.
0108
0109 The data for scanline $0$ (the bottom-most scanline) begins at
0110 \verb!map[0]!. The data for scanline $1$ begins at \verb!map[dy]!. The
0111 data for scanline $2$ begins at \verb!map[2*dy]!, and so forth. Note
0112 that $dy$ can be either positive or negative, depending on how an
0113 application wishes to lay out the image data in memory.
0114
0115 In summary, the pixel with coordinates $[i,j]$ can be accessed by the
0116 following C formula:
0117
0118 {\small
0119 \begin{verbatim}
0120 pixel(i,j) = ((map + j*dy)[i/N] & (1 << (N-1-i%N)) ? 1 : 0.
0121 \end{verbatim}
0122 }
0123
0124 \subsubsection{Example}
0125
0126 \begin{figure}
0127 \[\includegraphics{potracelib-fig2}\]
0128 \caption{Sample bitmap}\label{fig-bitmap}
0129 \begin{verbatim}
0130 w = 36;
0131 h = 12;
0132 dy = 2;
0133 map[22] = 0xfff0fc02; map[23] = 0x00000000;
0134 map[20] = 0x7ff1fe02; map[21] = 0x00000000;
0135 map[18] = 0x3ff3ff07; map[19] = 0x00000000;
0136 map[16] = 0x1ff7ff87; map[17] = 0x00000000;
0137 map[14] = 0x0ff7cf8f; map[15] = 0x80000000;
0138 map[12] = 0x07f7878f; map[13] = 0x80000000;
0139 map[10] = 0x03f7879f; map[11] = 0xc0000000;
0140 map[8] = 0x01f7cf9f; map[9] = 0xc0000000;
0141 map[6] = 0x00f7ffbf; map[7] = 0xe0000000;
0142 map[4] = 0x0073ff3f; map[5] = 0xe0000000;
0143 map[2] = 0x0031fe7f; map[3] = 0xf0000000;
0144 map[0] = 0x0010fc7f; map[1] = 0xf0000000;
0145 \end{verbatim}
0146 \caption{Sample bitmap representation}\label{fig-bitmap-rep}
0147 \end{figure}
0148
0149 Figure~\ref{fig-bitmap} shows an example bitmap of size $36\times 12$.
0150 Shaded pixels are ``on'' and white pixels are ``off''.
0151 Figure~\ref{fig-bitmap-rep} shows a possible representation of this
0152 bitmap in the \verb!potrace_bitmap_t! data structure. Note that the
0153 data is stored in the \verb!map! array in a bottom-to-top and
0154 left-to-right fashion.
0155
0156
0157 \subsubsection{A remark on byte order}
0158
0159 It is important to keep in mind that bitmaps are stored as arrays of
0160 words, {\em not} as arrays of bytes. While this distinction makes no
0161 difference on big-endian architectures, it makes a significant
0162 difference on little-endian architectures such as the Intel-based
0163 architecture. For instance, when the integer word 0x1f80fc02 is
0164 accessed as a byte-array on a little-endian machine, then the bytes
0165 appear in reverse order 0x02, 0xfc, 0x80, 0x1f. Therefore, special
0166 care must be taken when converting a bitmap from a byte-based
0167 format to Potrace's word-based format.
0168
0169 \subsubsection{Coordinate independence}
0170
0171 The vector data that is the output of Potrace is taken with respect
0172 to the same coordinate system as the input bitmap, i.e., the
0173 coordinate system from Figure~\ref{fig-coord}. In principle, it is
0174 immaterial whether an application puts the coordinate origin in the
0175 bottom-left corner or the top-left corner of an image, as long as it
0176 interprets the output coordinates in the same way as the input
0177 coordinates.
0178
0179 However, a reversal of the coordinate system will upset the meaning of
0180 the words ``clockwise'' and ``counterclockwise'' in the specification
0181 of vector images below (see Section~\ref{sssec-vector}), and will also
0182 affect the meaning of Potrace's turnpolicies (see
0183 Section~\ref{ssec-parameters}). We therefore assume, for definiteness,
0184 that the coordinate origin is in the {\em lower} left corner.
0185 Applications that wish to follow a different convention have to
0186 compensate accordingly.
0187
0188 \subsection{Vector format}
0189
0190 \subsubsection{Points}
0191
0192 A point $(x,y)$ in the Euclidean plane is represented in Potrace by a
0193 value of type \verb!potrace_dpoint_t!.
0194
0195 \begin{verbatim}
0196 struct potrace_dpoint_s {
0197 double x, y;
0198 };
0199 typedef struct potrace_dpoint_s potrace_dpoint_t;
0200 \end{verbatim}
0201
0202 \subsubsection{Segments}
0203
0204 Curves in Potrace are composed of the following two types of segments:
0205
0206 \begin{figure}
0207 \[\begin{array}{l@{\hspace{1in}}l}
0208 (a) & (b) \\
0209 \includegraphics{potracelib-fig4a}&
0210 \includegraphics{potracelib-fig4b}
0211 \end{array}
0212 \]
0213 \caption{(a) A Bezier curve segment. (b) A corner segment}\label{fig-segment}
0214 \end{figure}
0215
0216 \begin{itemize}
0217 \item Bezier curve segments. A Bezier curve segment is given in the
0218 usual way by a starting point $a$, two control points $u$ and $w$,
0219 and an endpoint $b$, as shown in Figure~\ref{fig-segment}(a).
0220 \item Corner segments. A corner segment is given by a starting point
0221 $a$, a vertex $v$, and an endpoint $b$. A corner segment is drawn
0222 as two straight lines: one from $a$ to $v$, and one from $v$ to $b$,
0223 as shown in Figure~\ref{fig-segment}(b).
0224 \end{itemize}
0225
0226 \subsubsection{Curves}\label{sssec-curves}
0227
0228 \begin{figure}
0229 \[\includegraphics{potracelib-fig5}
0230 \]
0231 \caption{A closed curve consisting of 4 segments}\label{fig-curve}
0232 \end{figure}
0233
0234 A curve in Potrace is a sequence of segments, such that the endpoint
0235 of each segment coincides with the starting point of the next one. All
0236 curves in Potrace are closed, and therefore the endpoint of the final
0237 segment also coincides with the starting point of the first one.
0238 Figure~\ref{fig-curve} shows an example of a curve consisting of 4
0239 segments: 3 Bezier curve segments and 1 corner segment. For clarity,
0240 the start- and endpoints of segments have been marked with dots
0241 ``$\bullet$''.
0242
0243 Curves are represented as values of type \verb!potrace_curve_t!,
0244 which is defined as follows:
0245
0246 \begin{verbatim}
0247 struct potrace_curve_s {
0248 int n; /* number of segments */
0249 int *tag; /* array of segment types */
0250 potrace_dpoint_t (*c)[3]; /* array of control points. */
0251 };
0252 typedef struct potrace_curve_s potrace_curve_t;
0253 \end{verbatim}
0254
0255 Here $n\geq 1$ is the number of segments in the curve. For $i=0,\ldots,n-1$,
0256 $\verb!tag[i]!$ is the type of the $i$-th segment, which is
0257 \verb!POTRACE_CURVETO! for a Bezier curve segment and
0258 \verb!POTRACE_CORNER! for a corner segment. $c$ is an array of size
0259 $n\times 3$ that holds the control points of the curve segments in
0260 the following manner:
0261 \begin{itemize}
0262 \item If the $i$-th segment is a Bezier curve segment, then
0263 $\verb!c[i][0]! = u$ and $\verb!c[i][1]! = w$ are the two control
0264 points of that segment, and $\verb!c[i][2]! = b$ is its endpoint.
0265 \item If the $i$-th segment is a corner segment, then $\verb!c[i][0]!$
0266 is unused, $\verb!c[i][1]! = v$ is the vertex of the segment, and
0267 $\verb!c[i][2]! = b$ is its endpoint.
0268 \end{itemize}
0269
0270 Note that, since the starting point $a$ of each segment coincides with
0271 the endpoint $b$ of the preceding segment (and the starting point $a$
0272 of the first segment coincides with the endpoint $b$ of the last
0273 segment), there is no need to store the starting points $a$
0274 explicitly. Also, note that regardless of the type of segment, the
0275 endpoint of the $i$-th segment is $\verb!c[i][2]!$, and the starting point
0276 of the $i$-th segment is $\verb!c[i ? i-1 : n-1][2]!$.
0277
0278 The curve from Figure~\ref{fig-curve} is therefore represented
0279 by the following data:
0280 \[\begin{array}{llll}
0281 \verb!n = 4;!\\
0282 \verb!tag[0] = POTRACE_CURVETO;!\\
0283 \verb!c[0][0] = !u_0\verb!;!\quad\quad\quad
0284 \verb!c[0][1] = !w_0\verb!;!\quad
0285 \verb!c[0][2] = !b_0\verb! = !a_1\verb!;!\\
0286 \verb!tag[1] = POTRACE_CURVETO;!\\
0287 \verb!c[1][0] = !u_1\verb!;!\quad\quad\quad
0288 \verb!c[1][1] = !w_1\verb!;!\quad
0289 \verb!c[1][2] = !b_1\verb! = !a_2\verb!;!\\
0290 \verb!tag[2] = POTRACE_CURVETO;!\\
0291 \verb!c[2][0] = !u_2\verb!;!\quad\quad\quad
0292 \verb!c[2][1] = !w_2\verb!;!\quad
0293 \verb!c[2][2] = !b_2\verb! = !a_3\verb!;!\\
0294 \verb!tag[3] = POTRACE_CORNER;!\\
0295 \verb!c[3][0] = !{\it unused}\verb!;!\quad
0296 \verb!c[3][1] = !v_3\verb!;!\quad
0297 \verb!c[3][2] = !b_3\verb! = !a_0\verb!;!\\
0298 \end{array}
0299 \]
0300
0301 \subsubsection{Boundary decomposition of bitonal vector
0302 images}\label{sssec-boundary}
0303
0304 \begin{figure}
0305 \[\begin{array}{l@{\hspace{.25in}}l}
0306 (a) & (b) \\
0307 \includegraphics{potracelib-fig1a}&
0308 \includegraphics{potracelib-fig1b}
0309 \end{array}
0310 \]
0311 \caption{(a) A vector image. (b) Its boundary
0312 decomposition.}\label{fig-vector}
0313 \end{figure}
0314
0315 In Potrace, a bitonal (i.e. black-and-white) vector image, as in
0316 Figure~\ref{fig-vector}(a), is decomposed into a collection of closed
0317 boundary curves, shown in blue and red and labeled $A$--$I$ in
0318 Figure~\ref{fig-vector}(b).
0319
0320 We introduce some terminology. A closed curve is {\em simple} if it
0321 does not intersect itself. Each simple closed curve, taken by itself,
0322 divides the plane into two regions, called the {\em inside} and and
0323 the {\em outside} of the curve. If $C_1$ and $C_2$ are simple closed
0324 curves, we say that $C_1$ is {\em contained} in $C_2$, written $C_1 <
0325 C_2$, if $C_1$ lies entirely within the inside of $C_2$. For example,
0326 in Figure~\ref{fig-vector}(b), the curves $B$--$E$ are contained in
0327 $A$, whereas $F$--$I$ are not.
0328
0329 In a decomposition of a vector image as in Figure~\ref{fig-vector}, we
0330 say that a curve $C_1$ is a {\em child} of $C_2$ if $C_1 < C_2$ and
0331 there exists no other curve $C_3$ between $C_1$ and $C_2$ (i.e., no
0332 curve $C_3$ such that $C_1 < C_3 < C_2$). In this case, we also say
0333 that $C_1$ is a {\em parent} of $C_2$. Since boundary curves do not
0334 intersect, each curve has at most one parent. Two curves are said to
0335 be {\em siblings} if they are either both parentless, or else they
0336 have a parent in common. Note that the ``child'' relation naturally
0337 defines a tree structure on the set of curves (more precisely, it
0338 defines a ``forest'', since there can be more than one root).
0339
0340 For example, in Figure~\ref{fig-vector}(b), the curve $A$ has no
0341 parent, and has children $B$ and $E$. The curve $E$ has no children,
0342 and the curve $B$ has children $C$ and $D$. $A$ and $F$ are siblings,
0343 $B$ and $E$ are siblings, and $C$ and $D$ are siblings. The curves
0344 from Figure~\ref{fig-vector}(b) form the following forest under the
0345 ``child'' relation:
0346
0347 \begin{verbatim}
0348 A F
0349 / \ |
0350 B E G
0351 / \ |
0352 C D H
0353 |
0354 I
0355 \end{verbatim}
0356
0357 We can assign each curve a {\em sign} by calling a curve {\em
0358 positive} if it encloses a ``foreground'' region, and {\em negative}
0359 if it encloses a ``background'' region (or ``hole''). For example, in
0360 Figure~\ref{fig-vector}(b), positive curves are shown in blue and
0361 negative curves in red.
0362
0363 Since foreground and background regions alternate, it follows that the
0364 sign of curves also alternates, i.e., parentless curves are always
0365 positive, and all other curves have the opposite sign of their parent.
0366 It follows that, in the tree structure, curves that appear at even
0367 levels are positive and those that appear at odd levels are negative.
0368 In particular, siblings share a common sign.
0369
0370 \subsubsection{Representation of vector images}\label{sssec-vector}
0371
0372 In Potrace, a vector image is represented as a linked collection of
0373 zero or more structures of type \verb!potrace_path_t!, which is
0374 defined as follows:
0375
0376 \begin{verbatim}
0377 struct potrace_path_s {
0378 int area; /* enclosed area */
0379 int sign; /* '+' or '-' */
0380 potrace_curve_t curve; /* vector data */
0381
0382 struct potrace_path_s *next; /* list structure */
0383
0384 struct potrace_path_s *childlist; /* tree structure */
0385 struct potrace_path_s *sibling; /* tree structure */
0386
0387 struct potrace_privpath_s *priv; /* private state */
0388 };
0389 typedef struct potrace_path_s potrace_path_t;
0390 \end{verbatim}
0391
0392 Each such structure holds a single curve, and the structures are
0393 linked to each other via the \verb!next!, \verb!childlist!, and
0394 \verb!sibling! pointers.
0395
0396 \begin{itemize}
0397
0398 \item The \verb!sign! field holds the sign of the curve (\verb!'+'! or
0399 \verb!'-'! in ASCII).
0400
0401 \item The \verb!curve! field contains the curve's vector data as
0402 described in Section~\ref{sssec-curves}. Potrace additionally
0403 follows the convention that positive curves run counterclockwise and
0404 negative curves run clockwise; this facilitates rendering in
0405 environments (such as PostScript or PDF) that have a ``fill'' rule
0406 based on winding number.
0407
0408 \item The \verb!area! field gives the approximate magnitude of the
0409 area enclosed by the curve. (In fact, it is the precise integer area
0410 of the original untraced ``jaggy'' curve). Some clients use this
0411 information to improve interactive rendering speeds by ignoring very
0412 small areas in a first rendering pass. See also the description of
0413 the \verb!turdsize! parameter in Section~\ref{ssec-parameters} below.
0414
0415 \item The \verb!priv! field is used internally by Potrace, and is not
0416 accessible to applications.
0417
0418 \item The \verb!next! field is used to link all the curves of a given
0419 vector image into a linked list. Each member points to the next one
0420 via its \verb!next! field, and the last member of the list has
0421 \verb!next==NULL!. The order of the elements of this list is
0422 unspecified, but is guaranteed to satisfy the following constraints:
0423 \begin{enumerate}\alphalabels
0424 \item outer curves appear before inner ones, so if $C_1 < C_2$, then
0425 $C_2$ always appears sometime before $C_1$ in the linked list, and
0426 \item each positive curve is immediately followed by all of its
0427 children.
0428 \end{enumerate}
0429 These two constraints make it easy for clients to render the image
0430 by simply processing the linked list in sequential order.
0431 Constraint (a) makes it possible to fill each curve with solid black
0432 or white color, allowing later curves to paint over parts of earlier
0433 ones. Constraint (b) further allows a client to fill a positive
0434 curve, minus its negative children, in a single paint operation,
0435 leaving a ``hole'' for each of the negative children.
0436
0437 \item The \verb!childlist! and \verb!sibling! fields define a forest
0438 structure on the set of curves, which can be used independently of
0439 the linked list structure. For each curve, \verb!childlist! is a
0440 pointer to its first child, or \verb!NULL! if there are no children.
0441 Also, \verb!sibling! is a pointer to the next sibling, or
0442 \verb!NULL! if there are no further siblings. The relative order
0443 of siblings is unspecified. The root node of the tree structure
0444 always coincides with the root node of the linked list structure.
0445 \end{itemize}
0446
0447 An image consisting of zero curves is represented as a \verb!NULL! pointer.
0448
0449 \subsubsection{Intersecting curves}
0450
0451 While in the above discussion we have assumed a set of
0452 non-intersecting curves, in practice it can happen that the curves
0453 output by Potrace intersect slightly. Clients should therefore
0454 carefully choose their rendering parameters (e.g., the non-zero
0455 winding number rule is preferable to the odd winding number rule) to
0456 avoid undesirable artifacts.
0457
0458 \subsubsection{Example}
0459
0460 The image from Figure~\ref{fig-vector} can be represented by the
0461 pointer \verb!plist!, where {\tt A}--{\tt I} are structures
0462 of type \verb!potrace_path_t!, as follows. We do not show the
0463 \verb!area! and \verb!curve! fields.
0464 {\small
0465 \begin{verbatim}
0466 potrace_path_t *plist = &A;
0467
0468 A.sign = '+'; B.sign = '-'; E.sign = '-';
0469 A.next = &B; B.next = &E; E.next = &C;
0470 A.childlist = &B; B.childlist = &C; E.childlist = NULL;
0471 A.sibling = &F; B.sibling = &E; E.sibling = NULL;
0472
0473 C.sign = '+'; D.sign = '+'; F.sign = '+';
0474 C.next = &D; D.next = &F; F.next = &G;
0475 C.childlist = NULL; D.childlist = NULL; F.childlist = &G;
0476 C.sibling = &D; D.sibling = NULL; F.sibling = NULL;
0477
0478 G.sign = '-'; H.sign = '+'; I.sign = '-';
0479 G.next = &H; H.next = &I; I.next = NULL;
0480 G.childlist = &H; H.childlist = &I; I.childlist = NULL;
0481 G.sibling = NULL; H.sibling = NULL; I.sibling = NULL;
0482 \end{verbatim}
0483 }
0484
0485 \subsection{Tracing parameters}\label{ssec-parameters}
0486
0487 The tracing operation of Potrace is controlled by a small number of
0488 parameters. The parameter structure is defined in potracelib.h as:
0489
0490 \begin{verbatim}
0491 struct potrace_param_s {
0492 int turdsize;
0493 int turnpolicy;
0494 double alphamax;
0495 int opticurve;
0496 double opttolerance;
0497 potrace_progress_t progress;
0498 };
0499 typedef struct potrace_param_s potrace_param_t;
0500 \end{verbatim}
0501
0502 For most practical purposes, the default parameters give excellent
0503 results. The function \verb!potrace_param_default()! (see
0504 Section~\ref{5c}) returns the set of default parameters. Applications
0505 must always start from these default parameters before changing any
0506 parameters. This will increase backward compatibility in case
0507 additional parameters are added in the future.
0508
0509 \subsubsection{Turdsize}
0510
0511 \begin{figure}
0512 \[\begin{array}{l@{\hspace{.5in}}l}
0513 \textrm{\rm Before:} & \textrm{\rm After:}\\
0514 \includegraphics{potracelib-fig6a}&
0515 \includegraphics{potracelib-fig6b}
0516 \end{array}
0517 \]
0518 \caption{Despeckling with turdsize=3.}\label{fig-turdsize}
0519 \end{figure}
0520
0521 The \verb!turdsize! parameter can be used to ``despeckle'' the bitmap
0522 to be traced, by removing all curves whose enclosed area is below the
0523 given threshold. Figure~\ref{fig-turdsize} shows the result of
0524 applying turdsize=3 to a bitmap. The current default for the turdsize
0525 parameter is 2; its useful range is from 0 to infinity.
0526
0527 \subsubsection{Turnpolicy}
0528
0529 \begin{figure}
0530 \[\includegraphics{potracelib-fig8}\]
0531 \caption{Path decomposition}\label{fig-turns}
0532 \end{figure}
0533
0534 The turnpolicy parameter determines how to resolve ambiguities during
0535 decomposition of bitmaps into paths. The ambiguity arises in the last
0536 situation shown in Figure~\ref{fig-turns}. The possible choices for
0537 the \verb!turnpolicy! parameter are:
0538 \begin{itemize}
0539 \item \verb!POTRACE_TURNPOLICY_BLACK!: prefers to connect black
0540 (foreground) components.
0541 \item \verb!POTRACE_TURNPOLICY_WHITE!: prefers to connect white
0542 (background) components.
0543 \item \verb!POTRACE_TURNPOLICY_LEFT!: always take a left turn.
0544 \item \verb!POTRACE_TURNPOLICY_RIGHT!: always take a right turn.
0545 \item \verb!POTRACE_TURNPOLICY_MINORITY!: prefers to connect the color
0546 (black or white) that occurs least frequently in a local
0547 neighborhood of the current position.
0548 \item \verb!POTRACE_TURNPOLICY_MAJORITY!: prefers to connect the color
0549 (black or white) that occurs most frequently in a local neighborhood
0550 of the current position.
0551 \item \verb!POTRACE_TURNPOLICY_RANDOM!: choose pseudo-randomly.
0552 \end{itemize}
0553
0554 The current default policy is \verb!POTRACE_TURNPOLICY_MINORITY!, which tends
0555 to keep visual lines connected.
0556
0557 \subsubsection{Alphamax}
0558
0559 \begin{figure}
0560 \[\begin{array}{ccccc}
0561 \includegraphics{potracelib-fig7-00}&
0562 \includegraphics{potracelib-fig7-06}&
0563 \includegraphics{potracelib-fig7-10}&
0564 \includegraphics{potracelib-fig7-12}&
0565 \includegraphics{potracelib-fig7-13}\\
0566 \alpha_{max}=0.0&
0567 \alpha_{max}=0.6&
0568 \alpha_{max}=1.0&
0569 \alpha_{max}=1.2&
0570 \alpha_{max}=1.3
0571 \end{array}
0572 \]
0573 \caption{The alphamax parameter}\label{fig-alphamax}
0574 \end{figure}
0575
0576 The \verb!alphamax! parameter is a threshold for the detection of
0577 corners. It controls the smoothness of the traced curve, as shown in
0578 Figure~\ref{fig-alphamax}. The current default is 1.0. The useful range of
0579 this parameter is from 0.0 (polygon) to 1.3334 (no corners).
0580
0581 \subsubsection{Opticurve and opttolerance}
0582
0583 The \verb!opticurve! parameter is a boolean flag that controls whether
0584 Potrace will attempt to ``simplify'' the final curve by reducing the
0585 number of Bezier curve segments. Opticurve=1 turns on optimization,
0586 and opticurve=0 turns it off. The current default is on.
0587
0588 The \verb!opttolerance! parameter defines the amount of error allowed
0589 in this simplification. The current default is 0.2. Larger values tend to
0590 decrease the number of segments, at the expense of less accuracy. The
0591 useful range is from 0 to infinity, although in practice one would
0592 hardly choose values greater than 1 or so. For most purposes, the
0593 default value is a good tradeoff between space and accuracy.
0594
0595 \subsubsection{Progress reporting}
0596
0597 Since tracing a large bitmap can be time consuming, Potrace has the
0598 option of reporting progress to the calling application. This is
0599 typically used in interactive applications to implement a progress
0600 bar. Progress reporting is controlled by the \verb!progress!
0601 parameter, which is a structure of type \verb!potrace_progress_t!,
0602 defined as follows:
0603
0604 \begin{verbatim}
0605 struct potrace_progress_s {
0606 void (*callback)(double progress, void *privdata);
0607 void *data;
0608 double min, max;
0609 double epsilon;
0610 };
0611 typedef struct potrace_progress_s potrace_progress_t;
0612 \end{verbatim}
0613
0614 If \verb!callback! is not NULL, then progress reporting is enabled.
0615 In this case, \verb!callback! is the address of a function to be
0616 called for progress reports, and \verb!data! is a pointer to that
0617 function's private data. Progress reports take the form of a function
0618 call \verb!callback(d, data)!, where \verb!d! is a number representing
0619 the amount of relative progress in the range
0620 \verb!min!\ldots\verb!max!.
0621
0622 The parameter \verb!epsilon! is a hint that tells Potrace what amount of
0623 progress the application considers ``too small to report''. Whenever
0624 convenient, Potrace will feel free to suppress progress reports if the
0625 increment since the previous report has been less than \verb!epsilon!. As
0626 a special case, if $\verb!epsilon!=0$, then the maximal number of progress
0627 reports are sent. In any case, the application should handle progress
0628 reports very efficiently, as there may be a large number of reports.
0629
0630 The defaults are $\verb!callback!=\textrm{NULL}$,
0631 $\verb!data!=\textrm{NULL}$, $\verb!min!=0.0$, $\verb!max!=1.0$, and
0632 $\verb!epsilon!=0$.
0633
0634 \subsection{Potrace state}\label{4}
0635
0636 A Potrace state holds the result of a tracing operation. It is
0637 defined as follows:
0638
0639 \begin{verbatim}
0640 struct potrace_state_s {
0641 int status;
0642 potrace_path_t *plist; /* vector data */
0643
0644 struct potrace_privstate_s *priv; /* private state */
0645 };
0646 typedef struct potrace_state_s potrace_state_t;
0647 \end{verbatim}
0648
0649 The fields are as follows:
0650 \begin{itemize}
0651 \item The \verb!status! field is either \verb!POTRACE_STATUS_OK!, to
0652 indicate that the tracing operation was successful, or
0653 \verb!POTRACE_STATUS_INCOMPLETE!, to indicate that it was
0654 unsuccessful.
0655 \item In the event of success, \verb!plist! points to the
0656 representation of the bitonal traced vector image as described in
0657 Section~\ref{sssec-vector}. In the event of failure, \verb!plist!
0658 points to a data structure whose properties are undefined, except
0659 that the Potrace state can still be freed with \verb!potrace_state_free()!.
0660 \item The \verb!priv! field is used internally by Potrace, and is not
0661 accessible by applications.
0662 \end{itemize}
0663
0664 \section{API functions}\label{5}
0665
0666 There is no global or static state in potracelib; all API functions
0667 are reentrant and thread-safe.
0668
0669 \subsection{potrace\_trace}\label{5a}
0670
0671 {\small
0672 \begin{verbatim}
0673 potrace_state_t *potrace_trace(const potrace_param_t *param,
0674 const potrace_bitmap_t *bm);
0675 \end{verbatim}
0676 }
0677
0678 \noindent Inputs:
0679 \begin{itemize}
0680 \item \verb!bm!: a bitmap (see Section~\ref{ssec-bitmap}).
0681 \item \verb!param!: a set of tracing parameters (see
0682 Section~\ref{ssec-parameters}).
0683 \end{itemize}
0684
0685 \noindent Output:
0686 \begin{itemize}
0687 \item a Potrace state (see Section~\ref{4}).
0688 \end{itemize}
0689
0690 This function attempts to trace the given bitmap using the given
0691 tracing parameters. In the event of success, it returns a valid
0692 Potrace state with the \verb!status! field set to
0693 \verb!POTRACE_STATUS_OK!. In the event of failure, it sets
0694 \verb!errno! to an error number, and either returns \verb!NULL!, or
0695 else it returns an incomplete Potrace state, which by definition has
0696 the status field set to \verb!POTRACE_STATUS_INCOMPLETE!. Any Potrace
0697 state returned by \verb!potrace_trace()! (whether it is valid or
0698 invalid) can be freed using the \verb!potrace_state_free()! function
0699 below.
0700
0701 \subsection{potrace\_state\_free}\label{5b}
0702
0703 \begin{verbatim}
0704 void potrace_state_free(potrace_state_t *st);
0705 \end{verbatim}
0706
0707 \noindent Input:
0708 \begin{itemize}
0709 \item \verb!st!: a Potrace state previously returned by
0710 \verb!potrace_trace()!.
0711 \end{itemize}
0712
0713 This function frees the memory and other resources (if any) associated
0714 with the Potrace state.
0715
0716 \subsection{potrace\_param\_default}\label{5c}
0717
0718 \begin{verbatim}
0719 potrace_param_t *potrace_param_default();
0720 \end{verbatim}
0721
0722 \noindent Output:
0723 \begin{itemize}
0724 \item a set of tracing parameters (see Section~\ref{ssec-parameters}).
0725 \end{itemize}
0726
0727 This function returns a fresh set of tracing parameters, initialized
0728 to defaults. Applications must always use this function to create an
0729 object of type \verb!potrace_param_t!, and they must always start from
0730 the default parameters before modifying any parameters. This will
0731 help increase backward compatibility when additional parameters are
0732 added in the future. The parameter set returned by this function can
0733 later be freed by \verb!potrace_param_free()!.
0734
0735 \subsection{potrace\_param\_free()}\label{5d}
0736
0737 \begin{verbatim}
0738 void potrace_param_free(potrace_param_t *p);
0739 \end{verbatim}
0740
0741 \noindent Input:
0742 \begin{itemize}
0743 \item tracing parameters previously returned by
0744 \verb!potrace_param_default()!.
0745 \end{itemize}
0746
0747 This function frees the memory occupied by a set of tracing parameters
0748 as returned by \verb!potrace_param_default()!. Only the fields
0749 initialized by Potrace are freed, not any fields set by the
0750 application itself (such as \verb!progress.data!).
0751
0752 \subsection{potrace\_version()}\label{5e}
0753
0754 \begin{verbatim}
0755 const char *potrace_version();
0756 \end{verbatim}
0757
0758 This function returns a static human-readable text string identifying
0759 this version of potracelib.
0760
0761 \end{document}