9fans.net/go@v0.0.5/draw/readsubfont.go (about) 1 package draw 2 3 import ( 4 "fmt" 5 "io" 6 ) 7 8 func (d *Display) readSubfont(name string, fd io.Reader, ai *Image) (*subfont, error) { 9 hdr := make([]byte, 3*12+4) 10 i := ai 11 if i == nil { 12 var err error 13 i, err = d.readImage(fd) 14 if err != nil { 15 return nil, err 16 } 17 } 18 var ( 19 n int 20 p []byte 21 fc []Fontchar 22 f *subfont 23 err error 24 ) 25 // Release lock for the I/O - could take a long time. 26 if d != nil { 27 d.mu.Unlock() 28 } 29 _, err = io.ReadFull(fd, hdr[:3*12]) 30 if d != nil { 31 d.mu.Lock() 32 } 33 if err != nil { 34 err = fmt.Errorf("rdsubfontfile: header read error: %v", err) 35 goto Err 36 } 37 n = atoi(hdr) 38 p = make([]byte, 6*(n+1)) 39 if _, err = io.ReadFull(fd, p); err != nil { 40 err = fmt.Errorf("rdsubfontfile: fontchar read error: %v", err) 41 goto Err 42 } 43 fc = make([]Fontchar, n+1) 44 unpackinfo(fc, p, n) 45 f = d.allocSubfont(name, atoi(hdr[12:]), atoi(hdr[24:]), fc, i) 46 return f, nil 47 48 Err: 49 if ai == nil { 50 i.free() 51 } 52 return nil, err 53 } 54 55 // ReadSubfont reads the subfont data from the reader and returns the subfont 56 // it describes, giving it the specified name. 57 func (d *Display) _ReadSubfont(name string, r io.Reader) (*subfont, error) { 58 d.mu.Lock() 59 defer d.mu.Unlock() 60 return d.readSubfont(name, r, nil) 61 } 62 63 func unpackinfo(fc []Fontchar, p []byte, n int) { 64 for j := 0; j <= n; j++ { 65 fc[j].X = int(p[0]) | int(p[1])<<8 66 fc[j].Top = uint8(p[2]) 67 fc[j].Bottom = uint8(p[3]) 68 fc[j].Left = int8(p[4]) 69 fc[j].Width = uint8(p[5]) 70 p = p[6:] 71 } 72 }