70 lines
1.5 KiB
Odin
70 lines
1.5 KiB
Odin
package game
|
|
|
|
import "core:slice"
|
|
import rl "vendor:raylib"
|
|
|
|
Texture :: rl.Texture
|
|
Color :: rl.Color
|
|
|
|
texture_rect :: proc(tex: Texture, flip_x: bool) -> Rect {
|
|
return(
|
|
{
|
|
x = 0,
|
|
y = 0,
|
|
width = flip_x ? -f32(tex.width) : f32(tex.width),
|
|
height = f32(tex.height),
|
|
} \
|
|
)
|
|
}
|
|
|
|
load_premultiplied_alpha_ttf_from_memory :: proc(file_data: []byte, font_size: int) -> rl.Font {
|
|
font := rl.Font {
|
|
baseSize = i32(font_size),
|
|
glyphCount = 95,
|
|
}
|
|
|
|
font.glyphs = rl.LoadFontData(
|
|
&file_data[0],
|
|
i32(len(file_data)),
|
|
font.baseSize,
|
|
{},
|
|
font.glyphCount,
|
|
.DEFAULT,
|
|
)
|
|
|
|
if font.glyphs != nil {
|
|
font.glyphPadding = 4
|
|
|
|
atlas := rl.GenImageFontAtlas(
|
|
font.glyphs,
|
|
&font.recs,
|
|
font.glyphCount,
|
|
font.baseSize,
|
|
font.glyphPadding,
|
|
0,
|
|
)
|
|
atlas_u8 := slice.from_ptr((^u8)(atlas.data), int(atlas.width * atlas.height * 2))
|
|
|
|
for i in 0 ..< atlas.width * atlas.height {
|
|
a := atlas_u8[i * 2 + 1]
|
|
v := atlas_u8[i * 2]
|
|
atlas_u8[i * 2] = u8(f32(v) * (f32(a) / 255))
|
|
}
|
|
|
|
font.texture = rl.LoadTextureFromImage(atlas)
|
|
rl.SetTextureFilter(font.texture, .BILINEAR)
|
|
|
|
// Update glyphs[i].image to use alpha, required to be used on ImageDrawText()
|
|
for i in 0 ..< font.glyphCount {
|
|
rl.UnloadImage(font.glyphs[i].image)
|
|
font.glyphs[i].image = rl.ImageFromImage(atlas, font.recs[i])
|
|
}
|
|
//TRACELOG(LOG_INFO, "FONT: Data loaded successfully (%i pixel size | %i glyphs)", font.baseSize, font.glyphCount);
|
|
|
|
rl.UnloadImage(atlas)
|
|
} else {
|
|
font = rl.GetFontDefault()
|
|
}
|
|
|
|
return font
|
|
}
|