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 }