mirror of
https://github.com/bloeys/nterm.git
synced 2025-12-29 06:28:20 +00:00
Start supporting setting bg color from ansi code
This commit is contained in:
@ -131,6 +131,10 @@ const (
|
|||||||
AnsiCodeOptions_Unknown AnsiCodeOptions = 0
|
AnsiCodeOptions_Unknown AnsiCodeOptions = 0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func (a AnsiCodeOptions) HasOptions(opts AnsiCodeOptions) bool {
|
||||||
|
return a&opts != 0
|
||||||
|
}
|
||||||
|
|
||||||
type AnsiCodeInfo struct {
|
type AnsiCodeInfo struct {
|
||||||
Type CSIType
|
Type CSIType
|
||||||
// When type is CSIType_SGR and the code is reset info1.X=-1
|
// When type is CSIType_SGR and the code is reset info1.X=-1
|
||||||
@ -278,6 +282,8 @@ func ParseSGRArgs(info *AnsiCodeInfo, args []byte) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @TODO We can't use this setup of one info field because one ansi code can have many settings.
|
||||||
|
// For example, it can set Fg+Bg at once. So we need info per option.
|
||||||
intCode := getSgrIntCodeFromBytes(a)
|
intCode := getSgrIntCodeFromBytes(a)
|
||||||
if intCode >= 30 && intCode <= 37 || intCode >= 90 && intCode <= 97 {
|
if intCode >= 30 && intCode <= 37 || intCode >= 90 && intCode <= 97 {
|
||||||
|
|
||||||
|
|||||||
53
main.go
53
main.go
@ -35,8 +35,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Settings struct {
|
type Settings struct {
|
||||||
DefaultColor gglm.Vec4
|
DefaultFgColor gglm.Vec4
|
||||||
StringColor gglm.Vec4
|
DefaultBgColor gglm.Vec4
|
||||||
|
StringColor gglm.Vec4
|
||||||
|
|
||||||
MaxFps int
|
MaxFps int
|
||||||
LimitFps bool
|
LimitFps bool
|
||||||
@ -163,10 +164,11 @@ func main() {
|
|||||||
scrollSpd: defaultScrollSpd,
|
scrollSpd: defaultScrollSpd,
|
||||||
|
|
||||||
Settings: &Settings{
|
Settings: &Settings{
|
||||||
DefaultColor: *gglm.NewVec4(1, 1, 1, 1),
|
DefaultFgColor: *gglm.NewVec4(1, 1, 1, 1),
|
||||||
StringColor: *gglm.NewVec4(242/255.0, 244/255.0, 10/255.0, 1),
|
DefaultBgColor: *gglm.NewVec4(0, 0, 0, 0),
|
||||||
MaxFps: 120,
|
StringColor: *gglm.NewVec4(242/255.0, 244/255.0, 10/255.0, 1),
|
||||||
LimitFps: true,
|
MaxFps: 120,
|
||||||
|
LimitFps: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
firstValidLine: &Line{},
|
firstValidLine: &Line{},
|
||||||
@ -218,8 +220,8 @@ func (p *nterm) Init() {
|
|||||||
panic("Failed to create atlas from font file. Err: " + err.Error())
|
panic("Failed to create atlas from font file. Err: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
p.GlyphRend.OptValues.BgColor = gglm.NewVec4(1, 0, 0, 0.25)
|
p.GlyphRend.OptValues.BgColor = gglm.NewVec4(0, 0, 0, 0)
|
||||||
// p.GlyphRend.SetOpts(glyphs.GlyphRendOpt_BgColor)
|
p.GlyphRend.SetOpts(glyphs.GlyphRendOpt_BgColor)
|
||||||
|
|
||||||
// if consts.Mode_Debug {
|
// if consts.Mode_Debug {
|
||||||
// glyphs.SaveImgToPNG(p.GlyphRend.Atlas.Img, "./debug-atlas.png")
|
// glyphs.SaveImgToPNG(p.GlyphRend.Atlas.Img, "./debug-atlas.png")
|
||||||
@ -389,10 +391,13 @@ func (nt *nterm) ReadInputs() {
|
|||||||
|
|
||||||
func (p *nterm) DrawTextAnsiCodes(bs []byte, pos gglm.Vec3) gglm.Vec3 {
|
func (p *nterm) DrawTextAnsiCodes(bs []byte, pos gglm.Vec3) gglm.Vec3 {
|
||||||
|
|
||||||
currColor := p.Settings.DefaultColor
|
currFgColor := p.Settings.DefaultFgColor
|
||||||
|
currBgColor := p.Settings.DefaultBgColor
|
||||||
|
|
||||||
draw := func(rs []rune) {
|
draw := func(rs []rune) {
|
||||||
|
|
||||||
|
p.GlyphRend.OptValues.BgColor.Data = currBgColor.Data
|
||||||
|
|
||||||
startIndex := 0
|
startIndex := 0
|
||||||
for i := 0; i < len(rs); i++ {
|
for i := 0; i < len(rs); i++ {
|
||||||
|
|
||||||
@ -400,7 +405,7 @@ func (p *nterm) DrawTextAnsiCodes(bs []byte, pos gglm.Vec3) gglm.Vec3 {
|
|||||||
|
|
||||||
// @PERF We could probably use bytes.IndexByte here
|
// @PERF We could probably use bytes.IndexByte here
|
||||||
if r == '\n' {
|
if r == '\n' {
|
||||||
pos.Data = p.GlyphRend.DrawTextOpenGLAbsRectWithStartPos(rs[startIndex:i], &pos, gglm.NewVec3(0, 0, 0), gglm.NewVec2(float32(p.GlyphRend.ScreenWidth), 2*p.GlyphRend.Atlas.LineHeight), &currColor).Data
|
pos.Data = p.GlyphRend.DrawTextOpenGLAbsRectWithStartPos(rs[startIndex:i], &pos, gglm.NewVec3(0, 0, 0), gglm.NewVec2(float32(p.GlyphRend.ScreenWidth), 2*p.GlyphRend.Atlas.LineHeight), &currFgColor).Data
|
||||||
pos.SetX(0)
|
pos.SetX(0)
|
||||||
pos.AddY(-p.GlyphRend.Atlas.LineHeight)
|
pos.AddY(-p.GlyphRend.Atlas.LineHeight)
|
||||||
startIndex = i + 1
|
startIndex = i + 1
|
||||||
@ -409,7 +414,7 @@ func (p *nterm) DrawTextAnsiCodes(bs []byte, pos gglm.Vec3) gglm.Vec3 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if startIndex < len(rs) {
|
if startIndex < len(rs) {
|
||||||
pos.Data = p.GlyphRend.DrawTextOpenGLAbsRectWithStartPos(rs[startIndex:], &pos, gglm.NewVec3(0, 0, 0), gglm.NewVec2(float32(p.GlyphRend.ScreenWidth), 2*p.GlyphRend.Atlas.LineHeight), &currColor).Data
|
pos.Data = p.GlyphRend.DrawTextOpenGLAbsRectWithStartPos(rs[startIndex:], &pos, gglm.NewVec3(0, 0, 0), gglm.NewVec2(float32(p.GlyphRend.ScreenWidth), 2*p.GlyphRend.Atlas.LineHeight), &currFgColor).Data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -427,12 +432,20 @@ func (p *nterm) DrawTextAnsiCodes(bs []byte, pos gglm.Vec3) gglm.Vec3 {
|
|||||||
|
|
||||||
//Apply code
|
//Apply code
|
||||||
info := ansi.InfoFromAnsiCode(code)
|
info := ansi.InfoFromAnsiCode(code)
|
||||||
if info.Options&ansi.AnsiCodeOptions_ColorFg != 0 {
|
if info.Options.HasOptions(ansi.AnsiCodeOptions_ColorFg) {
|
||||||
|
|
||||||
if info.Info1.X() == -1 {
|
if info.Info1.X() == -1 {
|
||||||
currColor = p.Settings.DefaultColor
|
currFgColor = p.Settings.DefaultFgColor
|
||||||
} else {
|
} else {
|
||||||
currColor = info.Info1
|
currFgColor = info.Info1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if info.Options.HasOptions(ansi.AnsiCodeOptions_ColorBg) {
|
||||||
|
if info.Info1.X() == -1 {
|
||||||
|
currBgColor = p.Settings.DefaultBgColor
|
||||||
|
} else {
|
||||||
|
currBgColor = info.Info1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -447,7 +460,7 @@ func (p *nterm) SyntaxHighlightAndDraw(text []rune, pos gglm.Vec3) gglm.Vec3 {
|
|||||||
|
|
||||||
startIndex := 0
|
startIndex := 0
|
||||||
startPos := pos.Clone()
|
startPos := pos.Clone()
|
||||||
currColor := &p.Settings.DefaultColor
|
currColor := &p.Settings.DefaultFgColor
|
||||||
|
|
||||||
inSingleString := false
|
inSingleString := false
|
||||||
inDoubleString := false
|
inDoubleString := false
|
||||||
@ -485,7 +498,7 @@ func (p *nterm) SyntaxHighlightAndDraw(text []rune, pos gglm.Vec3) gglm.Vec3 {
|
|||||||
pos.Data = p.GlyphRend.DrawTextOpenGLAbs(text[startIndex:i+1], &pos, currColor).Data
|
pos.Data = p.GlyphRend.DrawTextOpenGLAbs(text[startIndex:i+1], &pos, currColor).Data
|
||||||
startIndex = i + 1
|
startIndex = i + 1
|
||||||
inDoubleString = false
|
inDoubleString = false
|
||||||
currColor = &p.Settings.DefaultColor
|
currColor = &p.Settings.DefaultFgColor
|
||||||
|
|
||||||
case '\'':
|
case '\'':
|
||||||
if inDoubleString {
|
if inDoubleString {
|
||||||
@ -504,7 +517,7 @@ func (p *nterm) SyntaxHighlightAndDraw(text []rune, pos gglm.Vec3) gglm.Vec3 {
|
|||||||
pos.Data = p.GlyphRend.DrawTextOpenGLAbs(text[startIndex:i+1], &pos, &p.Settings.StringColor).Data
|
pos.Data = p.GlyphRend.DrawTextOpenGLAbs(text[startIndex:i+1], &pos, &p.Settings.StringColor).Data
|
||||||
startIndex = i + 1
|
startIndex = i + 1
|
||||||
inSingleString = false
|
inSingleString = false
|
||||||
currColor = &p.Settings.DefaultColor
|
currColor = &p.Settings.DefaultFgColor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -512,7 +525,7 @@ func (p *nterm) SyntaxHighlightAndDraw(text []rune, pos gglm.Vec3) gglm.Vec3 {
|
|||||||
if inDoubleString || inSingleString {
|
if inDoubleString || inSingleString {
|
||||||
pos.Data = p.GlyphRend.DrawTextOpenGLAbs(text[startIndex:], &pos, &p.Settings.StringColor).Data
|
pos.Data = p.GlyphRend.DrawTextOpenGLAbs(text[startIndex:], &pos, &p.Settings.StringColor).Data
|
||||||
} else {
|
} else {
|
||||||
pos.Data = p.GlyphRend.DrawTextOpenGLAbs(text[startIndex:], &pos, &p.Settings.DefaultColor).Data
|
pos.Data = p.GlyphRend.DrawTextOpenGLAbs(text[startIndex:], &pos, &p.Settings.DefaultFgColor).Data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -782,12 +795,12 @@ func (p *nterm) DebugRender() {
|
|||||||
if drawManyLines {
|
if drawManyLines {
|
||||||
const charsPerFrame = 500_000
|
const charsPerFrame = 500_000
|
||||||
for i := 0; i < charsPerFrame/charCount; i++ {
|
for i := 0; i < charsPerFrame/charCount; i++ {
|
||||||
p.GlyphRend.DrawTextOpenGLAbsString(str, gglm.NewVec3(xOff, float32(p.GlyphRend.Atlas.LineHeight)*5+yOff, 0), &p.Settings.DefaultColor)
|
p.GlyphRend.DrawTextOpenGLAbsString(str, gglm.NewVec3(xOff, float32(p.GlyphRend.Atlas.LineHeight)*5+yOff, 0), &p.Settings.DefaultFgColor)
|
||||||
}
|
}
|
||||||
p.win.SDLWin.SetTitle(fmt.Sprint("FPS: ", fps, " Draws/f: ", math.Ceil(charsPerFrame/glyphs.DefaultGlyphsPerBatch), " chars/f: ", charsPerFrame, " chars/s: ", fps*charsPerFrame))
|
p.win.SDLWin.SetTitle(fmt.Sprint("FPS: ", fps, " Draws/f: ", math.Ceil(charsPerFrame/glyphs.DefaultGlyphsPerBatch), " chars/f: ", charsPerFrame, " chars/s: ", fps*charsPerFrame))
|
||||||
} else {
|
} else {
|
||||||
charsPerFrame := float64(charCount)
|
charsPerFrame := float64(charCount)
|
||||||
p.GlyphRend.DrawTextOpenGLAbsString(str, gglm.NewVec3(xOff, float32(p.GlyphRend.Atlas.LineHeight)*5+yOff, 0), &p.Settings.DefaultColor)
|
p.GlyphRend.DrawTextOpenGLAbsString(str, gglm.NewVec3(xOff, float32(p.GlyphRend.Atlas.LineHeight)*5+yOff, 0), &p.Settings.DefaultFgColor)
|
||||||
p.win.SDLWin.SetTitle(fmt.Sprint("FPS: ", fps, " Draws/f: ", math.Ceil(charsPerFrame/glyphs.DefaultGlyphsPerBatch), " chars/f: ", int(charsPerFrame), " chars/s: ", fps*int(charsPerFrame)))
|
p.win.SDLWin.SetTitle(fmt.Sprint("FPS: ", fps, " Draws/f: ", math.Ceil(charsPerFrame/glyphs.DefaultGlyphsPerBatch), " chars/f: ", int(charsPerFrame), " chars/s: ", fps*int(charsPerFrame)))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -14,7 +14,6 @@ layout(location=5) in vec2 aModelScale;
|
|||||||
out vec2 v2fUV0;
|
out vec2 v2fUV0;
|
||||||
out vec4 v2fColor;
|
out vec4 v2fColor;
|
||||||
out vec3 v2fModelPos;
|
out vec3 v2fModelPos;
|
||||||
out vec3 v2fFragPos;
|
|
||||||
|
|
||||||
uniform mat4 projViewMat;
|
uniform mat4 projViewMat;
|
||||||
|
|
||||||
@ -40,7 +39,6 @@ void main()
|
|||||||
in vec2 v2fUV0;
|
in vec2 v2fUV0;
|
||||||
in vec4 v2fColor;
|
in vec4 v2fColor;
|
||||||
in vec3 v2fModelPos;
|
in vec3 v2fModelPos;
|
||||||
in vec4 gl_FragCoord;
|
|
||||||
|
|
||||||
out vec4 fragColor;
|
out vec4 fragColor;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user