You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: cursor.go
    path of file: ./repos/darktile/internal/app/darktile/gui/render
    
    the code of the file until where you have to start completion: package render

import (
	"github.com/hajimehoshi/ebiten/v2"
	"github.com/hajimehoshi/ebiten/v2/ebitenutil"
	"github.com/hajimehoshi/ebiten/v2/text"
	"github.com/liamg/darktile/internal/app/darktile/termutil"
)

func (r *Render) drawCursor() {
	//draw cursor
	if !r.buffer.IsCursorVisible() {
		return
	}

	pixelX := float64(int(r.buffer.CursorColumn()) * r.font.CellSize.X)
	pixelY := float64(int(r.buffer.CursorLine()) * r.font.CellSize.Y)
	cell := r.buffer.GetCell(r.buffer.CursorColumn(), r.buffer.CursorLine())

	useFace := r.font.Regular
	if cell != nil {
		if cell.Bold() && cell.Italic() {
			useFace = r.font.BoldItalic
		} else if cell.Bold() {
			useFace = r.font.Bold
		} else if cell.Italic() {
			useFace = r.font.Italic
		}
	}

	pixelW, pixelH := float64(r.font.CellSize.X), float64(r.font.CellSize.Y)

	// empty rect without focus
	if !ebiten.I
    
func (r *Render) drawCursor() {
	//draw cursor
	if !r.buffer.IsCursorVisible() {
		return
	}

	pixelX := float64(int(r.buffer.CursorColumn()) * r.font.CellSize.X)
	pixelY := float64(int(r.buffer.CursorLine()) * r.font.CellSize.Y)
	cell := r.buffer.GetCell(r.buffer.CursorColumn(), r.buffer.CursorLine())

	useFace := r.font.Regular
	if cell != nil {
		if cell.Bold() && cell.Italic() {
			useFace = r.font.BoldItalic
		} else if cell.Bold() {
			useFace = r.font.Bold
		} else if cell.Italic() {
			useFace = r.font.Italic
		}
	}

	pixelW, pixelH := float64(r.font.CellSize.X), float64(r.font.CellSize.Y)

	// empty rect without focus
	if !ebiten.IsFocused() {
		ebitenutil.DrawRect(r.frame, pixelX, pixelY, pixelW, pixelH, r.theme.CursorBackground())
		ebitenutil.DrawRect(r.frame, pixelX+1, pixelY+1, pixelW-2, pixelH-2, r.theme.CursorForeground())
		return
	}

	// draw the cursor shape
	switch r.buffer.GetCursorShape() {
	case termutil.CursorShapeBlinkingBar, termutil.CursorShapeSteadyBar:
		ebitenutil.DrawRect(r.frame, pixelX, pixelY, 2, pixelH, r.theme.CursorBackground())
	case termutil.CursorShapeBlinkingUnderline, termutil.CursorShapeSteadyUnderline:
		ebitenutil.DrawRect(r.frame, pixelX, pixelY+pixelH-2, pixelW, 2, r.theme.CursorBackground())
	default:
		// draw a custom cursor if we have one and there are no characters in the way
		if r.cursorImage != nil && (cell == nil || cell.Rune().Rune == 0) {
			opt := &ebiten.DrawImageOptions{}
			_, h := r.cursorImage.Size()
			ratio := 1 / (float64(h) / float64(r.font.CellSize.Y))
			actualHeight := float64(h) * ratio
			offsetY := (float64(r.font.CellSize.Y) - actualHeight) / 2
			opt.GeoM.Scale(ratio, ratio)
			opt.GeoM.Translate(pixelX, pixelY+offsetY)
			r.frame.DrawImage(r.cursorImage, opt)
			return
		}

		ebitenutil.DrawRect(r.frame, pixelX, pixelY, pixelW, pixelH, r.theme.CursorBackground())

		// we've drawn over the cell contents, so we need to draw it again in the cursor colours
		if cell != nil && cell.Rune().Rune > 0 {
			text.Draw(r.frame, string(cell.Rune().Rune), useFace, int(pixelX), int(pixelY)+r.font.DotDepth, r.theme.CursorForeground())
		}
	}
}