Untitled

 avatar
unknown
golang
2 months ago
1.4 kB
3
Indexable
func CompositeANSITransparent(fg, bg string, xPos, yPos lipgloss.Position, xOff, yOff int) string {
	fgLines := strings.Split(fg, "\n")
	bgLines := strings.Split(bg, "\n")

	fgHeight := len(fgLines)
	fgWidth := 0
	for _, line := range fgLines {
		if w := ansi.StringWidth(line); w > fgWidth {
			fgWidth = w
		}
	}
	bgHeight := len(bgLines)
	bgWidth := 0
	for _, line := range bgLines {
		if w := ansi.StringWidth(line); w > bgWidth {
			bgWidth = w
		}
	}

	x, y := offsets(fg, bg, xPos, yPos, xOff, yOff)
	x = clamp(x, 0, bgWidth-fgWidth)
	y = clamp(y, 0, bgHeight-fgHeight)

	bgCells := make([][]string, len(bgLines))
	for i, line := range bgLines {
		bgCells[i] = parseANSIIntoCells(line)
	}
	fgCells := make([][]string, len(fgLines))
	for i, line := range fgLines {
		fgCells[i] = parseANSIIntoCells(line)
	}

	for i := 0; i < len(fgCells); i++ {
		bgRowIdx := i + y
		if bgRowIdx >= len(bgCells) {
			break
		}
		fgRow := fgCells[i]
		bgRow := bgCells[bgRowIdx]
		for j := 0; j < len(fgRow); j++ {
			bgColIdx := j + x
			if bgColIdx >= len(bgRow) {
				break
			}
			fgCell := fgRow[j]
			if strings.TrimSpace(stripANSI(fgCell)) != "" {
				bgRow[bgColIdx] = fgCell
			}
		}
	}

	var sb strings.Builder
	for i, row := range bgCells {
		for _, cell := range row {
			sb.WriteString(cell)
		}
		if i < len(bgCells)-1 {
			sb.WriteRune('\n')
		}
	}
	return sb.String()
}
Editor is loading...
Leave a Comment