-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathextern.h
146 lines (125 loc) · 4.23 KB
/
extern.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* $Id$ */
/*
* Copyright (c) 2014, 2015 Kristaps Dzonsons <[email protected]>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, 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.
*/
#ifndef EXTERN_H
#define EXTERN_H
struct kdatahist {
double rmin; /* minimum inclusive */
double rmax; /* maximum non-inclusive */
};
struct kdatabucket {
size_t rmin; /* minimum inclusive */
size_t rmax; /* maximum non-inclusive */
};
struct kdatamean {
size_t *ns; /* number of bucket modifications */
};
struct kdatastddev {
size_t *ns; /* number of bucket modifications */
double *m1s; /* incremental mean */
double *m2s; /* incremental variance parameter */
};
struct kdatavector {
size_t stepsz; /* vector increase slush size */
size_t pairbufsz; /* allocated buffer size */
};
enum kdatatype {
KDATA_ARRAY,
KDATA_BUCKET,
KDATA_BUFFER,
KDATA_HIST,
KDATA_MEAN,
KDATA_STDDEV,
KDATA_VECTOR
};
typedef int (*ksetfunc)(struct kdata *, size_t, double, double);
/*
* A dependant tacks on to a data source and is notified (by way of
* "func") whenever the value of a bucket has changed.
*/
struct kdep {
struct kdata *dep;
ksetfunc func;
};
/*
* A data source can either be "real" (in the sense of being modified by
* the calling code) or a "dependant" (in the sense of being updated
* from another data source).
*/
struct kdata {
struct kpair *pairs; /* data pairs */
size_t pairsz; /* number of pairs */
size_t refs; /* >0 references to data */
struct kdep *deps; /* dependants */
size_t depsz; /* number of dependants */
enum kdatatype type;
union {
struct kdatahist hist;
struct kdatavector vector;
struct kdatabucket bucket;
struct kdatamean mean;
struct kdatastddev stddev;
} d;
};
struct kplotdat {
struct kdata **datas; /* referenced data */
size_t datasz; /* number of data sets */
struct kdatacfg *cfgs; /* plot configurations */
enum kplottype *types; /* plot types */
enum kplotstype stype; /* multiplot type */
enum ksmthtype smthtype; /* smoothing type */
struct ksmthcfg smth; /* smooth configuration */
double sum; /* used for KSMOOTH_CDF */
};
struct kplot {
struct kplotdat *datas; /* data sets per plot */
size_t datasz; /* number of data sets */
struct kplotcfg cfg; /* configuration */
};
struct kplotctx {
cairo_t *cr; /* cairo context */
double h; /* height of context */
double w; /* width of context */
struct kpair minv; /* minimum data point values */
struct kpair maxv; /* maximum data point values */
struct kplotcfg cfg;
/*
* When computing the plot context, we need to account for a
* margin, labels, and boundary.
* To do this, we use these "soft" offset and dimensions.
* Once we've accounted for the above, we'll use this to
* translate and resize the Cairo context for graphing.
*/
struct kpair offs;
struct kpair dims;
};
__BEGIN_DECLS
int kdata_dep_add(struct kdata *, struct kdata *, ksetfunc);
int kdata_dep_run(struct kdata *, size_t);
int kdata_set(struct kdata *, size_t, double, double);
void kplotctx_border_init(struct kplotctx *);
void kplotctx_grid_init(struct kplotctx *);
void kplotctx_margin_init(struct kplotctx *);
void kplotctx_tic_init(struct kplotctx *);
void kplotctx_label_init(struct kplotctx *);
double kplotctx_line_fix(const struct kplotctx *, double, double);
void kplotctx_font_init(struct kplotctx *, struct kplotfont *);
void kplotctx_line_init(struct kplotctx *, struct kplotline *);
void kplotctx_point_init(struct kplotctx *, struct kplotpoint *);
void kplotctx_ticln_init(struct kplotctx *, struct kplotticln *);
void kplotccfg_init_palette(struct kplotccfg *, size_t);
__END_DECLS
#endif