github.com/jmigpin/editor@v1.6.0/util/drawutil/drawer4/colorize.go (about) 1 package drawer4 2 3 import "image/color" 4 5 type Colorize struct { 6 d *Drawer 7 } 8 9 func (c *Colorize) Init() { 10 c.d.st.colorize.indexes = make([]int, len(c.d.Opt.Colorize.Groups)) 11 } 12 13 func (c *Colorize) Iter() { 14 c.colorize() 15 if !c.d.iterNext() { 16 return 17 } 18 } 19 20 func (c *Colorize) End() {} 21 22 //---------- 23 24 func (c *Colorize) colorize() { 25 ri := c.d.st.runeR.ri 26 for k, g := range c.d.Opt.Colorize.Groups { 27 if g == nil || g.Off { 28 continue 29 } 30 var w *ColorizeOp 31 i := &c.d.st.colorize.indexes[k] 32 for k := *i; k < len(g.Ops); k++ { 33 op := g.Ops[k] 34 if ri >= op.Offset { 35 w = op 36 *i = k 37 } else if ri < op.Offset { 38 break 39 } 40 } 41 if w != nil { 42 c.applyOp(w) 43 } 44 } 45 } 46 47 func (c *Colorize) applyOp(op *ColorizeOp) { 48 if op.Fg != nil { 49 c.d.st.curColors.fg = op.Fg 50 } else if op.SetNil { 51 c.d.st.curColors.fg = c.d.fg // default drawer color 52 } 53 if op.Bg != nil || op.SetNil { 54 c.d.st.curColors.bg = op.Bg 55 } 56 if op.ProcColor != nil { 57 st := &c.d.st.curColors 58 st.fg, st.bg = op.ProcColor(st.fg, st.bg) 59 } 60 if op.Line { 61 // run only once or will paint over runes 62 if op.Offset == c.d.st.runeR.ri { 63 c.d.st.curColors.lineBg = c.d.st.curColors.bg 64 } 65 } 66 } 67 68 //---------- 69 70 type ColorizeGroup struct { 71 Off bool 72 Ops []*ColorizeOp 73 } 74 75 type ColorizeOp struct { 76 Offset int 77 Fg, Bg color.Color 78 ProcColor func(fg, bg color.Color) (fg2, bg2 color.Color) 79 Line bool 80 SetNil bool 81 }