comparison semiconginev2/text/font.nim @ 1236:176383220123

add: first font-rendering test
author sam <sam@basx.dev>
date Sat, 20 Jul 2024 17:45:44 +0700
parents 841e12f33c47
children
comparison
equal deleted inserted replaced
1235:c70fee6568f6 1236:176383220123
18 18
19 proc ReadTrueType*(stream: Stream, name: string, codePoints: seq[Rune], lineHeightPixels: float32): Font = 19 proc ReadTrueType*(stream: Stream, name: string, codePoints: seq[Rune], lineHeightPixels: float32): Font =
20 var 20 var
21 indata = stream.readAll() 21 indata = stream.readAll()
22 fontinfo: stbtt_fontinfo 22 fontinfo: stbtt_fontinfo
23 if stbtt_InitFont(addr fontinfo, addr indata[0], 0) == 0: 23 if stbtt_InitFont(addr fontinfo, indata.ToCPointer, 0) == 0:
24 raise newException(Exception, "An error occured while loading PNG file") 24 raise newException(Exception, "An error occured while loading font file")
25 25
26 result.name = name 26 result = Font(
27 result.fontscale = float32(stbtt_ScaleForPixelHeight(addr fontinfo, cfloat(lineHeightPixels))) 27 name: name,
28 fontscale: float32(stbtt_ScaleForPixelHeight(addr fontinfo, cfloat(lineHeightPixels))),
29 )
28 30
29 var ascent, descent, lineGap: cint 31 var ascent, descent, lineGap: cint
30 stbtt_GetFontVMetrics(addr fontinfo, addr ascent, addr descent, addr lineGap) 32 stbtt_GetFontVMetrics(addr fontinfo, addr ascent, addr descent, addr lineGap)
31 33
32 result.lineHeight = float32(ascent - descent) * result.fontscale 34 result.lineHeight = float32(ascent - descent) * result.fontscale
107 addr fontinfo, 109 addr fontinfo,
108 cint(codePoint), 110 cint(codePoint),
109 cint(codePointAfter) 111 cint(codePointAfter)
110 )) * result.fontscale 112 )) * result.fontscale
111 113
114 proc LoadFont*(
115 path: string,
116 name = "",
117 lineHeightPixels = 80'f32,
118 additional_codepoints: openArray[Rune] = [],
119 charset = ASCII_CHARSET,
120 package = DEFAULT_PACKAGE
121 ): Font =
122 var thename = name
123 if thename == "":
124 thename = path.splitFile().name
125 loadResource_intern(path, package = package).ReadTrueType(thename, charset & additional_codepoints.toSeq, lineHeightPixels)
126
112 func TextWidth*(text: seq[Rune], font: FontObj): float32 = 127 func TextWidth*(text: seq[Rune], font: FontObj): float32 =
113 var currentWidth = 0'f32 128 var currentWidth = 0'f32
114 var lineWidths: seq[float32] 129 var lineWidths: seq[float32]
115 for i in 0 ..< text.len: 130 for i in 0 ..< text.len:
116 if text[i] == NEWLINE: 131 if text[i] == NEWLINE: