Home  >  Article  >  Backend Development  >  The code must load the font file, how to embed it into the built binary

The code must load the font file, how to embed it into the built binary

WBOY
WBOYforward
2024-02-09 17:27:08413browse

The code must load the font file, how to embed it into the built binary

In PHP development, loading font files is a common requirement. However, to ensure the availability and convenience of the font files, we might consider embedding the font files into the built binary. In this way, we no longer need to rely on external font files, but use embedded fonts directly in the code. So, how to embed font files? This article will give you detailed answers.

Question content

I have this code in my go package. It must load the cmr10.ttf font file. Therefore, the font files must be located next to every executable file that uses this package.

import (
    "github.com/deadsy/sdfx/sdf"
)

func Text(txt string, height, thickness, roundness float32) (sdf.SDF3, error) {
    f, err := sdf.LoadFont("cmr10.ttf")
    if err != nil {
        return nil, err
    }

    t := sdf.NewText(txt)

    s2d, err := sdf.TextSDF2(f, t, float64(height))
    if err != nil {
        return nil, err
    }

    // Extrude the 2D SDF to a 3D SDF.
    return sdf.ExtrudeRounded3D(s2d, float64(thickness), float64(roundness))
}

question

Is there a way to avoid using this package to copy the cmr10.ttf font file next to any executable?

For example, embed font files into the built binary. If possible, how exactly?

Are there any other ideas to try?

Solution

Starting from go 1.16, the go tool supports embedding static files directly into executable binaries. You can embed binary data of a font file using the //go:embed directive:

import (
    _ "embed"
)

//go:embed cmr10.ttf
var cmr10fontdata []byte
The contents of

cmr10.ttf will be inserted into the cmr10fontdata variable by the compiler. For other options, see What is the best way to bundle static resources in a go program?

Now since github.com/deadsy/sdfx/sdf only provides the sdf.loadfont(fname) helper function, you must use github.com/golang/freetype/truetype Parse font data. Note that sdf.loadfont() also uses this method behind the scenes, calling truetype.parse() with the binary data of the font file:

f, err := truetype.Parse(cmr10FontData)
// Check error
// use f if no error

The above is the detailed content of The code must load the font file, how to embed it into the built binary. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete