go-hep.org/x/hep@v0.38.1/groot/rsrv/plot.go (about) 1 // Copyright ©2018 The go-hep Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package rsrv 6 7 import ( 8 "bytes" 9 "fmt" 10 "reflect" 11 12 "go-hep.org/x/hep/groot/rtree" 13 "go-hep.org/x/hep/hplot" 14 "gonum.org/v1/plot/vg" 15 "gonum.org/v1/plot/vg/draw" 16 "gonum.org/v1/plot/vg/vgeps" 17 "gonum.org/v1/plot/vg/vgimg" 18 "gonum.org/v1/plot/vg/vgpdf" 19 "gonum.org/v1/plot/vg/vgsvg" 20 "gonum.org/v1/plot/vg/vgtex" 21 ) 22 23 func (srv *Server) render(p *hplot.Plot, opt PlotOptions) ([]byte, error) { 24 var canvas vg.CanvasWriterTo 25 26 switch opt.Type { 27 case "eps": 28 canvas = vgeps.NewTitle(opt.Width, opt.Height, p.Title.Text) 29 case "jpg", "jpeg": 30 canvas = vgimg.JpegCanvas{Canvas: vgimg.New(opt.Width, opt.Height)} 31 case "pdf": 32 canvas = vgpdf.New(opt.Width, opt.Height) 33 case "png": 34 canvas = vgimg.PngCanvas{Canvas: vgimg.New(opt.Width, opt.Height)} 35 case "svg": 36 canvas = vgsvg.New(opt.Width, opt.Height) 37 case "tex": 38 canvas = vgtex.New(opt.Width, opt.Height) 39 case "tiff": 40 canvas = vgimg.TiffCanvas{Canvas: vgimg.New(opt.Width, opt.Height)} 41 } 42 43 p.Draw(draw.New(canvas)) 44 45 out := new(bytes.Buffer) 46 _, err := canvas.WriteTo(out) 47 if err != nil { 48 return nil, fmt.Errorf("could not write canvas: %w", err) 49 } 50 51 return out.Bytes(), nil 52 } 53 54 type floats struct { 55 leaf rtree.Leaf 56 ptr any 57 vals func() []float64 58 } 59 60 func newFloats(leaf rtree.Leaf) (floats, error) { 61 fv := floats{leaf: leaf} 62 n := 1 // scalar 63 switch { 64 case leaf.LeafCount() != nil: 65 n = -1 66 case leaf.Len() > 1: 67 n = leaf.Len() 68 } 69 70 switch leaf.TypeName() { 71 case "bool": 72 switch n { 73 case 1: 74 var vv bool 75 fv.ptr = &vv 76 fv.vals = func() []float64 { 77 b := *fv.ptr.(*bool) 78 if b { 79 return []float64{1} 80 } 81 return []float64{0} 82 } 83 case -1: 84 var vv []bool 85 fv.ptr = &vv 86 fv.vals = func() []float64 { 87 bs := *fv.ptr.(*[]bool) 88 vs := make([]float64, len(bs)) 89 for i, b := range bs { 90 if b { 91 vs[i] = 1 92 } else { 93 vs[i] = 0 94 } 95 } 96 return vs 97 } 98 default: 99 vv := newArrB(n) 100 fv.ptr = vv.Interface() 101 fv.vals = func() []float64 { 102 vs := make([]float64, n) 103 for i := range vs { 104 b := vv.Elem().Index(i).Bool() 105 if b { 106 vs[i] = 1 107 } else { 108 vs[i] = 0 109 } 110 } 111 return vs 112 } 113 } 114 case "uint8", "byte": 115 switch n { 116 case 1: 117 var vv uint8 118 fv.ptr = &vv 119 fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*uint8))} } 120 case -1: 121 var vv []uint8 122 fv.ptr = &vv 123 fv.vals = func() []float64 { 124 vv := *fv.ptr.(*[]uint8) 125 vs := make([]float64, len(vv)) 126 for i, v := range vv { 127 vs[i] = float64(v) 128 } 129 return vs 130 } 131 default: 132 vv := newArrU8(n) 133 fv.ptr = vv.Interface() 134 fv.vals = func() []float64 { 135 vs := make([]float64, n) 136 for i := range vs { 137 vs[i] = float64(vv.Elem().Index(i).Int()) 138 } 139 return vs 140 } 141 } 142 case "uint16": 143 switch n { 144 case 1: 145 var vv uint16 146 fv.ptr = &vv 147 fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*uint16))} } 148 case -1: 149 var vv []uint16 150 fv.ptr = &vv 151 fv.vals = func() []float64 { 152 vv := *fv.ptr.(*[]uint16) 153 vs := make([]float64, len(vv)) 154 for i, v := range vv { 155 vs[i] = float64(v) 156 } 157 return vs 158 } 159 default: 160 vv := newArrU16(n) 161 fv.ptr = vv.Interface() 162 fv.vals = func() []float64 { 163 vs := make([]float64, n) 164 for i := range vs { 165 vs[i] = float64(vv.Elem().Index(i).Int()) 166 } 167 return vs 168 } 169 } 170 case "uint32": 171 switch n { 172 case 1: 173 var vv uint32 174 fv.ptr = &vv 175 fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*uint32))} } 176 case -1: 177 var vv []uint32 178 fv.ptr = &vv 179 fv.vals = func() []float64 { 180 vv := *fv.ptr.(*[]uint32) 181 vs := make([]float64, len(vv)) 182 for i, v := range vv { 183 vs[i] = float64(v) 184 } 185 return vs 186 } 187 default: 188 vv := newArrU32(n) 189 fv.ptr = vv.Interface() 190 fv.vals = func() []float64 { 191 vs := make([]float64, n) 192 for i := range vs { 193 vs[i] = float64(vv.Elem().Index(i).Int()) 194 } 195 return vs 196 } 197 } 198 case "uint64": 199 switch n { 200 case 1: 201 var vv uint64 202 fv.ptr = &vv 203 fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*uint64))} } 204 case -1: 205 var vv []uint64 206 fv.ptr = &vv 207 fv.vals = func() []float64 { 208 vv := *fv.ptr.(*[]uint64) 209 vs := make([]float64, len(vv)) 210 for i, v := range vv { 211 vs[i] = float64(v) 212 } 213 return vs 214 } 215 default: 216 vv := newArrU64(n) 217 fv.ptr = vv.Interface() 218 fv.vals = func() []float64 { 219 vs := make([]float64, n) 220 for i := range vs { 221 vs[i] = float64(vv.Elem().Index(i).Int()) 222 } 223 return vs 224 } 225 } 226 case "int8": 227 switch n { 228 case 1: 229 var vv int8 230 fv.ptr = &vv 231 fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*int8))} } 232 case -1: 233 var vv []int8 234 fv.ptr = &vv 235 fv.vals = func() []float64 { 236 vv := *fv.ptr.(*[]int8) 237 vs := make([]float64, len(vv)) 238 for i, v := range vv { 239 vs[i] = float64(v) 240 } 241 return vs 242 } 243 default: 244 vv := newArrI8(n) 245 fv.ptr = vv.Interface() 246 fv.vals = func() []float64 { 247 vs := make([]float64, n) 248 for i := range vs { 249 vs[i] = float64(vv.Elem().Index(i).Int()) 250 } 251 return vs 252 } 253 } 254 case "int16": 255 switch n { 256 case 1: 257 var vv int16 258 fv.ptr = &vv 259 fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*int16))} } 260 case -1: 261 var vv []int16 262 fv.ptr = &vv 263 fv.vals = func() []float64 { 264 vv := *fv.ptr.(*[]int16) 265 vs := make([]float64, len(vv)) 266 for i, v := range vv { 267 vs[i] = float64(v) 268 } 269 return vs 270 } 271 default: 272 vv := newArrI16(n) 273 fv.ptr = vv.Interface() 274 fv.vals = func() []float64 { 275 vs := make([]float64, n) 276 for i := range vs { 277 vs[i] = float64(vv.Elem().Index(i).Int()) 278 } 279 return vs 280 } 281 } 282 case "int32": 283 switch n { 284 case 1: 285 var vv int32 286 fv.ptr = &vv 287 fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*int32))} } 288 case -1: 289 var vv []int32 290 fv.ptr = &vv 291 fv.vals = func() []float64 { 292 vv := *fv.ptr.(*[]int32) 293 vs := make([]float64, len(vv)) 294 for i, v := range vv { 295 vs[i] = float64(v) 296 } 297 return vs 298 } 299 default: 300 vv := newArrI32(n) 301 fv.ptr = vv.Interface() 302 fv.vals = func() []float64 { 303 vs := make([]float64, n) 304 for i := range vs { 305 vs[i] = float64(vv.Elem().Index(i).Int()) 306 } 307 return vs 308 } 309 } 310 case "int64": 311 switch n { 312 case 1: 313 var vv int64 314 fv.ptr = &vv 315 fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*int64))} } 316 case -1: 317 var vv []int64 318 fv.ptr = &vv 319 fv.vals = func() []float64 { 320 vv := *fv.ptr.(*[]int64) 321 vs := make([]float64, len(vv)) 322 for i, v := range vv { 323 vs[i] = float64(v) 324 } 325 return vs 326 } 327 default: 328 vv := newArrI64(n) 329 fv.ptr = vv.Interface() 330 fv.vals = func() []float64 { 331 vs := make([]float64, n) 332 for i := range vs { 333 vs[i] = float64(vv.Elem().Index(i).Int()) 334 } 335 return vs 336 } 337 } 338 case "float32": 339 switch n { 340 case 1: 341 var vv float32 342 fv.ptr = &vv 343 fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*float32))} } 344 case -1: 345 var vv []float32 346 fv.ptr = &vv 347 fv.vals = func() []float64 { 348 vv := *fv.ptr.(*[]float32) 349 vs := make([]float64, len(vv)) 350 for i, v := range vv { 351 vs[i] = float64(v) 352 } 353 return vs 354 } 355 default: 356 vv := newArrF32(n) 357 fv.ptr = vv.Interface() 358 fv.vals = func() []float64 { 359 vs := make([]float64, n) 360 for i := range vs { 361 vs[i] = vv.Elem().Index(i).Float() 362 } 363 return vs 364 } 365 } 366 case "float64": 367 switch n { 368 case 1: 369 var vv float64 370 fv.ptr = &vv 371 fv.vals = func() []float64 { return []float64{*fv.ptr.(*float64)} } 372 case -1: 373 var vv []float64 374 fv.ptr = &vv 375 fv.vals = func() []float64 { return *fv.ptr.(*[]float64) } 376 default: 377 vv := newArrF64(n) 378 fv.ptr = vv.Interface() 379 fv.vals = func() []float64 { 380 vs := make([]float64, n) 381 for i := range vs { 382 vs[i] = vv.Elem().Index(i).Float() 383 } 384 return vs 385 } 386 } 387 default: 388 return fv, fmt.Errorf("unhandled value of type %q", leaf.TypeName()) 389 } 390 return fv, nil 391 } 392 393 func newArrB(n int) reflect.Value { 394 typ := reflect.ArrayOf(n, reflect.TypeOf((*bool)(nil)).Elem()) 395 return reflect.New(typ) 396 } 397 398 func newArrU8(n int) reflect.Value { 399 typ := reflect.ArrayOf(n, reflect.TypeOf((*uint8)(nil)).Elem()) 400 return reflect.New(typ) 401 } 402 403 func newArrU16(n int) reflect.Value { 404 typ := reflect.ArrayOf(n, reflect.TypeOf((*uint16)(nil)).Elem()) 405 return reflect.New(typ) 406 } 407 408 func newArrU32(n int) reflect.Value { 409 typ := reflect.ArrayOf(n, reflect.TypeOf((*uint32)(nil)).Elem()) 410 return reflect.New(typ) 411 } 412 413 func newArrU64(n int) reflect.Value { 414 typ := reflect.ArrayOf(n, reflect.TypeOf((*uint64)(nil)).Elem()) 415 return reflect.New(typ) 416 } 417 418 func newArrI8(n int) reflect.Value { 419 typ := reflect.ArrayOf(n, reflect.TypeOf((*int8)(nil)).Elem()) 420 return reflect.New(typ) 421 } 422 423 func newArrI16(n int) reflect.Value { 424 typ := reflect.ArrayOf(n, reflect.TypeOf((*int16)(nil)).Elem()) 425 return reflect.New(typ) 426 } 427 428 func newArrI32(n int) reflect.Value { 429 typ := reflect.ArrayOf(n, reflect.TypeOf((*int32)(nil)).Elem()) 430 return reflect.New(typ) 431 } 432 433 func newArrI64(n int) reflect.Value { 434 typ := reflect.ArrayOf(n, reflect.TypeOf((*int64)(nil)).Elem()) 435 return reflect.New(typ) 436 } 437 438 func newArrF32(n int) reflect.Value { 439 typ := reflect.ArrayOf(n, reflect.TypeOf((*float32)(nil)).Elem()) 440 return reflect.New(typ) 441 } 442 443 func newArrF64(n int) reflect.Value { 444 typ := reflect.ArrayOf(n, reflect.TypeOf((*float64)(nil)).Elem()) 445 return reflect.New(typ) 446 }