Blame


1 a0d146ed 2005-07-12 devnull #include "stdinc.h"
2 a0d146ed 2005-07-12 devnull #include "dat.h"
3 a0d146ed 2005-07-12 devnull #include "fns.h"
4 a0d146ed 2005-07-12 devnull
5 a0d146ed 2005-07-12 devnull enum
6 a0d146ed 2005-07-12 devnull {
7 a0d146ed 2005-07-12 devnull Top = 1,
8 a0d146ed 2005-07-12 devnull Bottom = 1,
9 a0d146ed 2005-07-12 devnull Left = 40,
10 a0d146ed 2005-07-12 devnull Right = 0,
11 a0d146ed 2005-07-12 devnull MinWidth = Left+Right+2,
12 a0d146ed 2005-07-12 devnull MinHeight = Top+Bottom+2,
13 a0d146ed 2005-07-12 devnull DefaultWidth = Left+Right+500,
14 a0d146ed 2005-07-12 devnull DefaultHeight = Top+Bottom+40
15 a0d146ed 2005-07-12 devnull };
16 a0d146ed 2005-07-12 devnull
17 a0d146ed 2005-07-12 devnull QLock memdrawlock;
18 a0d146ed 2005-07-12 devnull static Memsubfont *smallfont;
19 a0d146ed 2005-07-12 devnull static Memimage *black;
20 a0d146ed 2005-07-12 devnull static Memimage *blue;
21 a0d146ed 2005-07-12 devnull static Memimage *red;
22 a0d146ed 2005-07-12 devnull static Memimage *lofill[6];
23 a0d146ed 2005-07-12 devnull static Memimage *hifill[6];
24 a0d146ed 2005-07-12 devnull static Memimage *grid;
25 a0d146ed 2005-07-12 devnull
26 a0d146ed 2005-07-12 devnull static ulong fill[] = {
27 a0d146ed 2005-07-12 devnull 0xFFAAAAFF, 0xBB5D5DFF, /* peach */
28 a0d146ed 2005-07-12 devnull DPalegreygreen, DPurpleblue, /* aqua */
29 a0d146ed 2005-07-12 devnull DDarkyellow, DYellowgreen, /* yellow */
30 a0d146ed 2005-07-12 devnull DMedgreen, DDarkgreen, /* green */
31 a0d146ed 2005-07-12 devnull 0x00AAFFFF, 0x0088CCFF, /* blue */
32 a0d146ed 2005-07-12 devnull 0xCCCCCCFF, 0x888888FF, /* grey */
33 a0d146ed 2005-07-12 devnull };
34 a0d146ed 2005-07-12 devnull
35 a0d146ed 2005-07-12 devnull Memimage*
36 a0d146ed 2005-07-12 devnull allocrepl(ulong color)
37 a0d146ed 2005-07-12 devnull {
38 a0d146ed 2005-07-12 devnull Memimage *m;
39 fa325e9b 2020-01-10 cross
40 a0d146ed 2005-07-12 devnull m = allocmemimage(Rect(0,0,1,1), RGB24);
41 a0d146ed 2005-07-12 devnull memfillcolor(m, color);
42 a0d146ed 2005-07-12 devnull m->flags |= Frepl;
43 a0d146ed 2005-07-12 devnull m->clipr = Rect(-1000000, -1000000, 1000000, 1000000);
44 a0d146ed 2005-07-12 devnull return m;
45 a0d146ed 2005-07-12 devnull }
46 a0d146ed 2005-07-12 devnull
47 a0d146ed 2005-07-12 devnull static void
48 a0d146ed 2005-07-12 devnull ginit(void)
49 a0d146ed 2005-07-12 devnull {
50 a0d146ed 2005-07-12 devnull static int first = 1;
51 a0d146ed 2005-07-12 devnull int i;
52 fa325e9b 2020-01-10 cross
53 a0d146ed 2005-07-12 devnull if(!first)
54 a0d146ed 2005-07-12 devnull return;
55 fa325e9b 2020-01-10 cross
56 a0d146ed 2005-07-12 devnull first = 0;
57 a0d146ed 2005-07-12 devnull memimageinit();
58 28b49df3 2006-07-18 devnull #ifdef PLAN9PORT
59 4590ad02 2006-03-19 devnull smallfont = openmemsubfont(unsharp("#9/font/lucsans/lstr.10"));
60 28b49df3 2006-07-18 devnull #else
61 28b49df3 2006-07-18 devnull smallfont = openmemsubfont("/lib/font/bit/lucidasans/lstr.10");
62 28b49df3 2006-07-18 devnull #endif
63 a0d146ed 2005-07-12 devnull black = memblack;
64 a0d146ed 2005-07-12 devnull blue = allocrepl(DBlue);
65 a0d146ed 2005-07-12 devnull red = allocrepl(DRed);
66 a0d146ed 2005-07-12 devnull grid = allocrepl(0x77777777);
67 a0d146ed 2005-07-12 devnull for(i=0; i<nelem(fill)/2 && i<nelem(lofill) && i<nelem(hifill); i++){
68 a0d146ed 2005-07-12 devnull lofill[i] = allocrepl(fill[2*i]);
69 a0d146ed 2005-07-12 devnull hifill[i] = allocrepl(fill[2*i+1]);
70 a0d146ed 2005-07-12 devnull }
71 a0d146ed 2005-07-12 devnull }
72 a0d146ed 2005-07-12 devnull
73 a0d146ed 2005-07-12 devnull static void
74 a0d146ed 2005-07-12 devnull mklabel(char *str, int v)
75 a0d146ed 2005-07-12 devnull {
76 a0d146ed 2005-07-12 devnull if(v < 0){
77 a0d146ed 2005-07-12 devnull v = -v;
78 a0d146ed 2005-07-12 devnull *str++ = '-';
79 a0d146ed 2005-07-12 devnull }
80 a0d146ed 2005-07-12 devnull if(v < 10000)
81 a0d146ed 2005-07-12 devnull sprint(str, "%d", v);
82 a0d146ed 2005-07-12 devnull else if(v < 10000000)
83 a0d146ed 2005-07-12 devnull sprint(str, "%dk", v/1000);
84 a0d146ed 2005-07-12 devnull else
85 a0d146ed 2005-07-12 devnull sprint(str, "%dM", v/1000000);
86 a0d146ed 2005-07-12 devnull }
87 a0d146ed 2005-07-12 devnull
88 a0d146ed 2005-07-12 devnull static void
89 a0d146ed 2005-07-12 devnull drawlabel(Memimage *m, Point p, int n)
90 a0d146ed 2005-07-12 devnull {
91 a0d146ed 2005-07-12 devnull char buf[30];
92 a0d146ed 2005-07-12 devnull Point w;
93 fa325e9b 2020-01-10 cross
94 a0d146ed 2005-07-12 devnull mklabel(buf, n);
95 a0d146ed 2005-07-12 devnull w = memsubfontwidth(smallfont, buf);
96 a0d146ed 2005-07-12 devnull memimagestring(m, Pt(p.x-5-w.x, p.y), memblack, ZP, smallfont, buf);
97 a0d146ed 2005-07-12 devnull }
98 a0d146ed 2005-07-12 devnull
99 a0d146ed 2005-07-12 devnull static int
100 a0d146ed 2005-07-12 devnull scalept(int val, int valmin, int valmax, int ptmin, int ptmax)
101 a0d146ed 2005-07-12 devnull {
102 a0d146ed 2005-07-12 devnull if(val <= valmin)
103 a0d146ed 2005-07-12 devnull val = valmin;
104 a0d146ed 2005-07-12 devnull if(val >= valmax)
105 a0d146ed 2005-07-12 devnull val = valmax;
106 a0d146ed 2005-07-12 devnull if(valmax == valmin)
107 a0d146ed 2005-07-12 devnull valmax++;
108 a0d146ed 2005-07-12 devnull return ptmin + (vlong)(val-valmin)*(ptmax-ptmin)/(valmax-valmin);
109 a0d146ed 2005-07-12 devnull }
110 a0d146ed 2005-07-12 devnull
111 a0d146ed 2005-07-12 devnull Memimage*
112 a0d146ed 2005-07-12 devnull statgraph(Graph *g)
113 a0d146ed 2005-07-12 devnull {
114 27d28098 2007-04-21 devnull int i, nbin, x, lo, hi, min, max, first;
115 a0d146ed 2005-07-12 devnull Memimage *m;
116 a0d146ed 2005-07-12 devnull Rectangle r;
117 a0d146ed 2005-07-12 devnull Statbin *b, bin[2000]; /* 32 kB, but whack is worse */
118 a0d146ed 2005-07-12 devnull
119 a0d146ed 2005-07-12 devnull needstack(8192); /* double check that bin didn't kill us */
120 fa325e9b 2020-01-10 cross
121 a0d146ed 2005-07-12 devnull if(g->wid <= MinWidth)
122 a0d146ed 2005-07-12 devnull g->wid = DefaultWidth;
123 a0d146ed 2005-07-12 devnull if(g->ht <= MinHeight)
124 a0d146ed 2005-07-12 devnull g->ht = DefaultHeight;
125 a0d146ed 2005-07-12 devnull if(g->wid > nelem(bin))
126 a0d146ed 2005-07-12 devnull g->wid = nelem(bin);
127 a0d146ed 2005-07-12 devnull if(g->fill < 0)
128 e6b0276e 2006-11-06 devnull g->fill = ((uint)(uintptr)g->arg>>8)%nelem(lofill);
129 a0d146ed 2005-07-12 devnull if(g->fill > nelem(lofill))
130 a0d146ed 2005-07-12 devnull g->fill %= nelem(lofill);
131 fa325e9b 2020-01-10 cross
132 a0d146ed 2005-07-12 devnull nbin = g->wid - (Left+Right);
133 a0d146ed 2005-07-12 devnull binstats(g->fn, g->arg, g->t0, g->t1, bin, nbin);
134 a0d146ed 2005-07-12 devnull
135 a0d146ed 2005-07-12 devnull /*
136 a0d146ed 2005-07-12 devnull * compute bounds
137 a0d146ed 2005-07-12 devnull */
138 a0d146ed 2005-07-12 devnull min = g->min;
139 a0d146ed 2005-07-12 devnull max = g->max;
140 a0d146ed 2005-07-12 devnull if(min < 0 || max <= min){
141 a0d146ed 2005-07-12 devnull min = max = 0;
142 a0d146ed 2005-07-12 devnull first = 1;
143 a0d146ed 2005-07-12 devnull for(i=0; i<nbin; i++){
144 a0d146ed 2005-07-12 devnull b = &bin[i];
145 a0d146ed 2005-07-12 devnull if(b->nsamp == 0)
146 a0d146ed 2005-07-12 devnull continue;
147 a0d146ed 2005-07-12 devnull if(first || b->min < min)
148 a0d146ed 2005-07-12 devnull min = b->min;
149 a0d146ed 2005-07-12 devnull if(first || b->max > max)
150 a0d146ed 2005-07-12 devnull max = b->max;
151 a0d146ed 2005-07-12 devnull first = 0;
152 a0d146ed 2005-07-12 devnull }
153 a0d146ed 2005-07-12 devnull }
154 a0d146ed 2005-07-12 devnull
155 a0d146ed 2005-07-12 devnull qlock(&memdrawlock);
156 a0d146ed 2005-07-12 devnull ginit();
157 310ae033 2017-01-06 rsc if(smallfont==nil || black==nil || blue==nil || red==nil || hifill[0]==nil || lofill[0]==nil){
158 28b49df3 2006-07-18 devnull werrstr("graphics initialization failed: %r");
159 a0d146ed 2005-07-12 devnull qunlock(&memdrawlock);
160 a0d146ed 2005-07-12 devnull return nil;
161 a0d146ed 2005-07-12 devnull }
162 a0d146ed 2005-07-12 devnull
163 a0d146ed 2005-07-12 devnull /* fresh image */
164 a0d146ed 2005-07-12 devnull m = allocmemimage(Rect(0,0,g->wid,g->ht), ABGR32);
165 a0d146ed 2005-07-12 devnull if(m == nil){
166 a0d146ed 2005-07-12 devnull qunlock(&memdrawlock);
167 a0d146ed 2005-07-12 devnull return nil;
168 a0d146ed 2005-07-12 devnull }
169 a0d146ed 2005-07-12 devnull r = Rect(Left, Top, g->wid-Right, g->ht-Bottom);
170 a0d146ed 2005-07-12 devnull memfillcolor(m, DTransparent);
171 fa325e9b 2020-01-10 cross
172 a0d146ed 2005-07-12 devnull /* x axis */
173 a0d146ed 2005-07-12 devnull memimagedraw(m, Rect(r.min.x, r.max.y, r.max.x, r.max.y+1), black, ZP, memopaque, ZP, S);
174 a0d146ed 2005-07-12 devnull
175 a0d146ed 2005-07-12 devnull /* y labels */
176 a0d146ed 2005-07-12 devnull drawlabel(m, r.min, max);
177 a0d146ed 2005-07-12 devnull if(min != 0)
178 a0d146ed 2005-07-12 devnull drawlabel(m, Pt(r.min.x, r.max.y-smallfont->height), min);
179 fa325e9b 2020-01-10 cross
180 a0d146ed 2005-07-12 devnull /* actual data */
181 a0d146ed 2005-07-12 devnull for(i=0; i<nbin; i++){
182 a0d146ed 2005-07-12 devnull b = &bin[i];
183 a0d146ed 2005-07-12 devnull if(b->nsamp == 0)
184 a0d146ed 2005-07-12 devnull continue;
185 a0d146ed 2005-07-12 devnull lo = scalept(b->min, min, max, r.max.y, r.min.y);
186 a0d146ed 2005-07-12 devnull hi = scalept(b->max, min, max, r.max.y, r.min.y);
187 a0d146ed 2005-07-12 devnull x = r.min.x+i;
188 a0d146ed 2005-07-12 devnull hi-=2;
189 28b49df3 2006-07-18 devnull memimagedraw(m, Rect(x, hi, x+1,lo), hifill[g->fill%nelem(hifill)], ZP, memopaque, ZP, S);
190 28b49df3 2006-07-18 devnull memimagedraw(m, Rect(x, lo, x+1, r.max.y), lofill[g->fill%nelem(lofill)], ZP, memopaque, ZP, S);
191 a0d146ed 2005-07-12 devnull }
192 a0d146ed 2005-07-12 devnull
193 a0d146ed 2005-07-12 devnull if(bin[nbin-1].nsamp)
194 a0d146ed 2005-07-12 devnull drawlabel(m, Pt(r.max.x, r.min.y+(Dy(r)-smallfont->height)/2), bin[nbin-1].avg);
195 a0d146ed 2005-07-12 devnull qunlock(&memdrawlock);
196 a0d146ed 2005-07-12 devnull return m;
197 a0d146ed 2005-07-12 devnull }