123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- package dao
- import (
- "image"
- "image/draw"
- "io/ioutil"
- "math"
- "unicode/utf8"
- "go-common/library/log"
- "github.com/golang/freetype"
- "golang.org/x/image/font"
- "golang.org/x/image/math/fixed"
- )
- // TextImgConf text img conf.
- type TextImgConf struct {
- Fontsize int
- Length int
- Ansfontsize int
- Spacing float64
- Ansspacing float64
- }
- // QueConf question img conf.
- func (d *Dao) QueConf(mobile bool) (c *TextImgConf) {
- if mobile {
- // Mobile
- c = &TextImgConf{
- Fontsize: 16, // mobile font size in points
- Length: 11, // mobile question length
- Ansfontsize: 12, // mobile ans font size in points
- }
- } else {
- // PC
- c = &TextImgConf{
- Fontsize: 12, //font size in points
- Length: 36, //question length
- Ansfontsize: 10, //ans font size in points
- }
- }
- c.Spacing = 2 // line spacing (e.g. 2 means double spaced)
- c.Ansspacing = 2 // line ansspacing (e.g. 2 means double spaced)
- return
- }
- // DrawQue draw question title.
- func (d *Dao) DrawQue(c *freetype.Context, s string, conf *TextImgConf, pt *fixed.Point26_6) {
- c.SetFontSize(float64(conf.Fontsize))
- srune := []rune(s)
- var end = conf.Length
- for len(srune) > 0 {
- if conf.Length > len(srune) {
- end = len(srune)
- }
- d.text(c, string(srune[:end]), pt, conf.Fontsize, conf.Spacing)
- srune = srune[end:]
- }
- }
- // DrawAns draw ans
- func (d *Dao) DrawAns(c *freetype.Context, conf *TextImgConf, anss [2]string, pt *fixed.Point26_6) {
- c.SetFontSize(float64(conf.Ansfontsize))
- arr := [4]string{"A.", "B."}
- for i, a := range anss {
- d.text(c, arr[i]+a, pt, conf.Ansfontsize, conf.Ansspacing)
- }
- }
- // Board init draw board.
- func (d *Dao) Board(h int) (r *image.Gray) {
- bg := image.White
- r = image.NewGray(image.Rect(0, 0, 600, h))
- draw.Draw(r, r.Bounds(), bg, image.ZP, draw.Src)
- return
- }
- //Height get img height
- func (d *Dao) Height(c *TextImgConf, que string, anslen int) (h int) {
- len := utf8.RuneCountInString(que)
- line := math.Ceil(float64(len) / float64(c.Length))
- h = int(math.Ceil(c.Spacing*line*float64(c.Fontsize))) + int(math.Ceil(c.Ansspacing*float64(anslen)*float64(c.Ansfontsize)))
- return
- }
- // text Draw text.
- func (d *Dao) text(c *freetype.Context, s string, pt *fixed.Point26_6, size int, spacing float64) (err error) {
- _, err = c.DrawString(s, *pt)
- if err != nil {
- log.Error("c.DrawString() error:%+v", err)
- return
- }
- pt.Y += fixed.Int26_6(int(float64(size)*spacing) << 6)
- return
- }
- var (
- dpi = float64(72) // screen resolution in Dots Per Inch
- hinting = "none" // none | full
- )
- // Context freetype init context.
- func (d *Dao) Context(r *image.Gray, fileStr string) (c *freetype.Context) {
- fg := image.Black
- // Read the font data.
- fontBytes, err := ioutil.ReadFile(fileStr)
- if err != nil {
- log.Error("ioutil.ReadFile(%s) error:%+v", fileStr, err)
- return
- }
- f, err := freetype.ParseFont(fontBytes)
- if err != nil {
- log.Error("freetype.ParseFont(%s) error:%+v", fileStr, err)
- return
- }
- c = freetype.NewContext()
- c.SetDPI(dpi)
- c.SetFont(f)
- c.SetClip(r.Bounds())
- c.SetDst(r)
- c.SetSrc(fg)
- switch hinting {
- default:
- c.SetHinting(font.HintingNone)
- case "full":
- c.SetHinting(font.HintingFull)
- }
- return
- }
|