package opentype
import (
"encoding/binary"
"math"
)
type Table struct {
Content []byte
Tag Tag
}
func WriteTTF (tables []Table ) []byte {
introLength := uint32 (otfHeaderSize + len (tables )*otfEntrySize )
buffer := make ([]byte , introLength )
writeTTFHeader (len (tables ), buffer )
tableOffset := introLength
for i , table := range tables {
cs := checksum (table .Content )
tableLength := uint32 (len (table .Content ))
slice := buffer [otfHeaderSize +i *otfEntrySize :]
binary .BigEndian .PutUint32 (slice , uint32 (table .Tag ))
binary .BigEndian .PutUint32 (slice [4 :], cs )
binary .BigEndian .PutUint32 (slice [8 :], tableOffset )
binary .BigEndian .PutUint32 (slice [12 :], tableLength )
tableOffset = tableOffset + tableLength
}
buffer = append (buffer , make ([]byte , tableOffset -introLength )...)
tableOffset = introLength
for _ , table := range tables {
copy (buffer [tableOffset :], table .Content )
tableOffset = tableOffset + uint32 (len (table .Content ))
}
return buffer
}
func writeTTFHeader(nTables int , out []byte ) {
log2 := math .Floor (math .Log2 (float64 (nTables )))
searchRange := math .Pow (2 , log2 ) * 16
entrySelector := log2
rangeShift := nTables *16 - int (searchRange )
binary .BigEndian .PutUint32 (out [:], uint32 (TrueType ))
binary .BigEndian .PutUint16 (out [4 :], uint16 (nTables ))
binary .BigEndian .PutUint16 (out [6 :], uint16 (searchRange ))
binary .BigEndian .PutUint16 (out [8 :], uint16 (entrySelector ))
binary .BigEndian .PutUint16 (out [10 :], uint16 (rangeShift ))
}
func checksum(table []byte ) uint32 {
if r := len (table ) % 4 ; r != 0 {
table = append (table , make ([]byte , r )...)
}
var sum uint32
for i := 0 ; i < len (table )/4 ; i ++ {
sum += binary .BigEndian .Uint32 (table [i *4 :])
}
return sum
}
The pages are generated with Golds v0.8.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .