github.com/Kintar/etxt@v0.0.0-20221224033739-2fc69f000137/helpers.go (about)

     1  package etxt
     2  
     3  import "strconv"
     4  import "image"
     5  
     6  import "golang.org/x/image/math/fixed"
     7  import "golang.org/x/image/font/sfnt"
     8  
     9  import "github.com/Kintar/etxt/ecache"
    10  
    11  // This file contains many helper types, wrappers, aliases and
    12  // other minor elements required to make this whole package work.
    13  
    14  // An alias for sfnt.Font so you don't need to import sfnt yourself
    15  // when working with etxt.
    16  type Font = sfnt.Font
    17  
    18  // Glyph indices are used to specify which font glyph are we working
    19  // with. Glyph indices are a low level construct that most users of
    20  // etxt dont't have to deal with, but they are important as they can
    21  // be used to reference font glyphs that don't have any direct mapping
    22  // to unicode code points.
    23  //
    24  // Support for glyph indices (and not only runes), therefore, is important
    25  // in order to make renderers usable with [text shapers] and complex scripts.
    26  //
    27  // [text shapers]: https://github.com/Kintar/etxt/blob/main/docs/shaping.md
    28  type GlyphIndex = sfnt.GlyphIndex
    29  
    30  // Text alignment types.
    31  
    32  type VertAlign int8
    33  type HorzAlign int8
    34  
    35  // Vertical align constants for renderer operations. See
    36  // [Renderer.SetAlign]() for additional details.
    37  const (
    38  	Top      VertAlign = 0
    39  	YCenter  VertAlign = 1
    40  	Baseline VertAlign = 2
    41  	Bottom   VertAlign = 3
    42  )
    43  
    44  // Horizontal align constants for renderer operations. See
    45  // [Renderer.SetAlign] for additional details.
    46  const (
    47  	Left    HorzAlign = 0
    48  	XCenter HorzAlign = 1
    49  	Right   HorzAlign = 2
    50  )
    51  
    52  // Renderers can have their text direction configured as
    53  // left-to-right or right-to-left.
    54  //
    55  // Directions can be casted directly to [unicode/bidi] directions:
    56  //
    57  //	bidi.Direction(etxt.LeftToRight).
    58  //
    59  // [unicode/bidi]: https://pkg.go.dev/golang.org/x/text/unicode/bidi
    60  type Direction int8
    61  
    62  const (
    63  	LeftToRight Direction = iota
    64  	RightToLeft
    65  )
    66  
    67  // Creates a new cache for font glyphs. For more details on how to use
    68  // this new cache with renderers, see [Renderer.SetCacheHandler]() .
    69  //
    70  // This function will panic if maxBytes < 1024 or crypto/rand fails. If
    71  // you need to handle those errors, see [ecache.NewDefaultCache]() instead.
    72  func NewDefaultCache(maxBytes int) *ecache.DefaultCache {
    73  	cache, err := ecache.NewDefaultCache(maxBytes)
    74  	if err != nil {
    75  		panic(err)
    76  	}
    77  	return cache
    78  }
    79  
    80  // RectSize objects are used to store the results of text sizing operations.
    81  // If you need to use the fixed.Int26_6 values directly and would like more
    82  // context on them, read [this document]. Otherwise, you can obtain RectSize
    83  // dimensions as int values like this:
    84  //
    85  //	rect   := txtRenderer.SelectionRect(text)
    86  //	width  := rect.Width.Ceil()
    87  //	height := rect.Height.Ceil()
    88  //
    89  // [this document]: https://github.com/Kintar/etxt/blob/main/docs/fixed-26-6.md
    90  type RectSize struct {
    91  	Width  fixed.Int26_6
    92  	Height fixed.Int26_6
    93  }
    94  
    95  // Returns the RectSize as an image.Rectangle with origin at (0, 0).
    96  //
    97  // Ebitengine and other projects often expect image.Rectangle objects
    98  // as arguments in their API calls, so this method is offered as a
    99  // handy conversion shortcut.
   100  func (self RectSize) ImageRect() image.Rectangle {
   101  	return image.Rect(0, 0, self.Width.Ceil(), self.Height.Ceil())
   102  }
   103  
   104  // --- misc helpers ---
   105  
   106  func runeToUnicodeCode(r rune) string {
   107  	return "\\u" + strconv.FormatInt(int64(r), 16)
   108  }