example_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // Copyright 2017 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package sfnt_test
  5. import (
  6. "image"
  7. "image/draw"
  8. "log"
  9. "os"
  10. "golang.org/x/image/font/gofont/goregular"
  11. "golang.org/x/image/font/sfnt"
  12. "golang.org/x/image/math/fixed"
  13. "golang.org/x/image/vector"
  14. )
  15. func ExampleRasterizeGlyph() {
  16. const (
  17. ppem = 32
  18. width = 24
  19. height = 36
  20. originX = 0
  21. originY = 32
  22. )
  23. f, err := sfnt.Parse(goregular.TTF)
  24. if err != nil {
  25. log.Fatalf("Parse: %v", err)
  26. }
  27. var b sfnt.Buffer
  28. x, err := f.GlyphIndex(&b, 'Ġ')
  29. if err != nil {
  30. log.Fatalf("GlyphIndex: %v", err)
  31. }
  32. if x == 0 {
  33. log.Fatalf("GlyphIndex: no glyph index found for the rune 'Ġ'")
  34. }
  35. segments, err := f.LoadGlyph(&b, x, fixed.I(ppem), nil)
  36. if err != nil {
  37. log.Fatalf("LoadGlyph: %v", err)
  38. }
  39. r := vector.NewRasterizer(width, height)
  40. r.DrawOp = draw.Src
  41. for _, seg := range segments {
  42. // The divisions by 64 below is because the seg.Args values have type
  43. // fixed.Int26_6, a 26.6 fixed point number, and 1<<6 == 64.
  44. switch seg.Op {
  45. case sfnt.SegmentOpMoveTo:
  46. r.MoveTo(
  47. originX+float32(seg.Args[0].X)/64,
  48. originY+float32(seg.Args[0].Y)/64,
  49. )
  50. case sfnt.SegmentOpLineTo:
  51. r.LineTo(
  52. originX+float32(seg.Args[0].X)/64,
  53. originY+float32(seg.Args[0].Y)/64,
  54. )
  55. case sfnt.SegmentOpQuadTo:
  56. r.QuadTo(
  57. originX+float32(seg.Args[0].X)/64,
  58. originY+float32(seg.Args[0].Y)/64,
  59. originX+float32(seg.Args[1].X)/64,
  60. originY+float32(seg.Args[1].Y)/64,
  61. )
  62. case sfnt.SegmentOpCubeTo:
  63. r.CubeTo(
  64. originX+float32(seg.Args[0].X)/64,
  65. originY+float32(seg.Args[0].Y)/64,
  66. originX+float32(seg.Args[1].X)/64,
  67. originY+float32(seg.Args[1].Y)/64,
  68. originX+float32(seg.Args[2].X)/64,
  69. originY+float32(seg.Args[2].Y)/64,
  70. )
  71. }
  72. }
  73. dst := image.NewAlpha(image.Rect(0, 0, width, height))
  74. r.Draw(dst, dst.Bounds(), image.Opaque, image.Point{})
  75. const asciiArt = ".++8"
  76. buf := make([]byte, 0, height*(width+1))
  77. for y := 0; y < height; y++ {
  78. for x := 0; x < width; x++ {
  79. a := dst.AlphaAt(x, y).A
  80. buf = append(buf, asciiArt[a>>6])
  81. }
  82. buf = append(buf, '\n')
  83. }
  84. os.Stdout.Write(buf)
  85. // Output:
  86. // ........................
  87. // ........................
  88. // ........................
  89. // ............888.........
  90. // ............888.........
  91. // ............888.........
  92. // ............+++.........
  93. // ........................
  94. // ..........+++++++++.....
  95. // .......+8888888888888+..
  96. // ......8888888888888888..
  97. // ....+8888+........++88..
  98. // ....8888................
  99. // ...8888.................
  100. // ..+888+.................
  101. // ..+888..................
  102. // ..888+..................
  103. // .+888+..................
  104. // .+888...................
  105. // .+888...................
  106. // .+888...................
  107. // .+888..........+++++++..
  108. // .+888..........8888888..
  109. // .+888+.........+++8888..
  110. // ..888+............+888..
  111. // ..8888............+888..
  112. // ..+888+...........+888..
  113. // ...8888+..........+888..
  114. // ...+8888+.........+888..
  115. // ....+88888+.......+888..
  116. // .....+8888888888888888..
  117. // .......+888888888888++..
  118. // ..........++++++++......
  119. // ........................
  120. // ........................
  121. // ........................
  122. }