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  }