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  }