9fans.net/go@v0.0.5/draw/memdraw/openmemsubfont.go (about) 1 // #include <u.h> 2 // #include <libc.h> 3 // #include <draw.h> 4 // #include <memdraw.h> 5 6 package memdraw 7 8 import ( 9 "fmt" 10 "io" 11 "os" 12 13 "9fans.net/go/draw" 14 ) 15 16 func openmemsubfont(name string) (*subfont, error) { 17 f, err := os.Open(name) 18 if err != nil { 19 return nil, err 20 } 21 defer f.Close() 22 23 i, err := readmemimage(f) 24 if err != nil { 25 return nil, err 26 } 27 var hdr [3*12 + 4]byte 28 if _, err := io.ReadFull(f, hdr[:3*12]); err != nil { 29 Free(i) 30 return nil, fmt.Errorf("openmemsubfont: header read error: %v", err) 31 } 32 n := atoi(hdr[:1*12]) 33 p := make([]byte, 6*(n+1)) 34 if _, err := io.ReadFull(f, p[:6*(n+1)]); err != nil { 35 Free(i) 36 return nil, fmt.Errorf("openmemsubfont: fontchar read error: %v", err) 37 } 38 39 fc := make([]draw.Fontchar, n+1) 40 unpackinfo(fc, p, n) 41 sf := allocmemsubfont(name, n, atoi(hdr[1*12:2*12]), atoi(hdr[2*12:3*12]), fc, i) 42 return sf, nil 43 } 44 45 func unpackinfo(fc []draw.Fontchar, p []byte, n int) { 46 for j := 0; j <= n; j++ { 47 fc[j].X = int(p[0]) | int(p[1])<<8 48 fc[j].Top = uint8(p[2]) 49 fc[j].Bottom = uint8(p[3]) 50 fc[j].Left = int8(p[4]) 51 fc[j].Width = uint8(p[5]) 52 p = p[6:] 53 } 54 }