github.com/jmigpin/editor@v1.6.0/util/drawutil/drawer4/drawrune.go (about)

     1  package drawer4
     2  
     3  import (
     4  	"image"
     5  	"image/color"
     6  	"image/draw"
     7  
     8  	"github.com/jmigpin/editor/util/fontutil"
     9  	"github.com/jmigpin/editor/util/imageutil"
    10  )
    11  
    12  type DrawRune struct {
    13  	d *Drawer
    14  }
    15  
    16  func (dr *DrawRune) Init() {}
    17  
    18  func (dr *DrawRune) Iter() {
    19  	dr.draw()
    20  	if !dr.d.iterNext() {
    21  		return
    22  	}
    23  }
    24  
    25  func (dr *DrawRune) End() {}
    26  
    27  //----------
    28  
    29  func (dr *DrawRune) draw() {
    30  	st := &dr.d.st.drawR
    31  
    32  	pen := dr.d.iters.runeR.penBoundsRect().Min
    33  
    34  	// draw now
    35  	//dr.draw2(dr.d.st.runeR.fface, pen, dr.d.st.runeR.ru, dr.d.st.curColors.fg)
    36  	//return
    37  
    38  	// delayed draw
    39  	if st.delay != nil {
    40  		dr.draw2(st.delay.fface, st.delay.pen, st.delay.ru, st.delay.fg)
    41  	}
    42  
    43  	// delay drawing by one rune to allow drawing the kern bg correctly. The last position is also drawn because the runereader emits a final ru=0 at the end
    44  	st.delay = &DrawRuneDelay{
    45  		pen:   pen,
    46  		ru:    dr.d.st.runeR.ru,
    47  		fg:    dr.d.st.curColors.fg,
    48  		fface: dr.d.st.runeR.fface,
    49  	}
    50  }
    51  
    52  func (dr *DrawRune) draw2(fface *fontutil.FontFace, pen image.Point, ru rune, fg color.Color) {
    53  	// skip draw
    54  	if ru < 0 {
    55  		return
    56  	}
    57  
    58  	//fmt.Printf("draw at %v \"%c\"\n", pen, ru)
    59  
    60  	bline := fface.BaseLine()
    61  	gr, mask, maskp, _, ok := fface.Face.Glyph(bline, ru)
    62  	if !ok {
    63  		return
    64  	}
    65  
    66  	// clip
    67  	b := dr.d.Bounds()
    68  	gr = gr.Add(pen)
    69  	if gr.Min.X < b.Min.X {
    70  		maskp.X += b.Min.X - gr.Min.X
    71  	}
    72  	if gr.Min.Y < b.Min.Y {
    73  		maskp.Y += b.Min.Y - gr.Min.Y
    74  	}
    75  	gr = gr.Intersect(b)
    76  
    77  	imageutil.DrawUniformMask(dr.d.st.drawR.img, gr, fg, mask, maskp, draw.Over)
    78  }
    79  
    80  //----------
    81  
    82  type DrawRuneDelay struct {
    83  	pen   image.Point
    84  	ru    rune
    85  	fg    color.Color
    86  	fface *fontutil.FontFace
    87  }