KiCad PCB EDA Suite
auxiliary.h
Go to the documentation of this file.
1 /* Copyright (C) 2001-2015 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 /* This header file collects some general-purpose macros (and static
6  * inline functions) that are used in various places. */
7 
8 #ifndef AUXILIARY_H
9 #define AUXILIARY_H
10 
11 #ifdef HAVE_CONFIG_H
12 #include <config.h>
13 #endif
14 
15 #include <stdlib.h>
16 
17 /* ---------------------------------------------------------------------- */
18 /* point arithmetic */
19 
20 #include "potracelib.h"
21 
22 struct point_s
23 {
24  long x;
25  long y;
26 };
27 typedef struct point_s point_t;
28 
30 
31 /* convert point_t to dpoint_t */
32 static inline dpoint_t dpoint( point_t p )
33 {
34  dpoint_t res;
35 
36  res.x = p.x;
37  res.y = p.y;
38  return res;
39 }
40 
41 
42 /* range over the straight line segment [a,b] when lambda ranges over [0,1] */
43 static inline dpoint_t interval( double lambda, dpoint_t a, dpoint_t b )
44 {
45  dpoint_t res;
46 
47  res.x = a.x + lambda * (b.x - a.x);
48  res.y = a.y + lambda * (b.y - a.y);
49  return res;
50 }
51 
52 
53 /* ---------------------------------------------------------------------- */
54 /* some useful macros. Note: the "mod" macro works correctly for
55  * negative a. Also note that the test for a>=n, while redundant,
56  * speeds up the mod function by 70% in the average case (significant
57  * since the program spends about 16% of its time here - or 40%
58  * without the test). The "floordiv" macro returns the largest integer
59  * <= a/n, and again this works correctly for negative a, as long as
60  * a,n are integers and n>0. */
61 
62 /* integer arithmetic */
63 
64 static inline int mod( int a, int n )
65 {
66  return a>=n ? a % n : a>=0 ? a : n - 1 - (-1 - a) % n;
67 }
68 
69 
70 static inline int floordiv( int a, int n )
71 {
72  return a>=0 ? a / n : -1 - (-1 - a) / n;
73 }
74 
75 
76 /* Note: the following work for integers and other numeric types. */
77 #undef sign
78 #undef abs
79 #undef min
80 #undef max
81 #undef sq
82 #undef cu
83 #define sign( x ) ( (x)>0 ? 1 : (x)<0 ? -1 : 0 )
84 #define abs( a ) ( (a)>0 ? (a) : -(a) )
85 #define min( a, b ) ( (a)<(b) ? (a) : (b) )
86 #define max( a, b ) ( (a)>(b) ? (a) : (b) )
87 #define sq( a ) ( (a) * (a) )
88 #define cu( a ) ( (a) * (a) * (a) )
89 
90 #endif /* AUXILIARY_H */
long y
Definition: auxiliary.h:25
static int mod(int a, int n)
Definition: auxiliary.h:64
static dpoint_t dpoint(point_t p)
Definition: auxiliary.h:32
potrace_dpoint_t dpoint_t
Definition: auxiliary.h:29
long x
Definition: auxiliary.h:24
static dpoint_t interval(double lambda, dpoint_t a, dpoint_t b)
Definition: auxiliary.h:43
static int floordiv(int a, int n)
Definition: auxiliary.h:70