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  }