# Optimize terminal rendering when clipped by parent containers \(\#45537\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/a7ce677ac3835c0f78ef8ca8f458565dddb49daf)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: a7ce677ac3835c0f78ef8ca8f458565dddb49daf

Requested commit: a7ce677ac3835c0f78ef8ca8f458565dddb49daf

Commit: a7ce677ac3835c0f78ef8ca8f458565dddb49daf

Tree: 920a96574b73480a50c115eef710c75150f8a351

Author: Nathan Sobo

Committer: GitHub

## Message

```
Optimize terminal rendering when clipped by parent containers (#45537)

This brings the terminal element's viewport culling in line with the
editor optimization in PR #44995 and the fix in PR #45077.

## Problem

When a terminal is inside a scrollable container (e.g., the Agent Panel
thread view), it would render ALL cells during prepaint, even when the
terminal was entirely outside the viewport. This caused unnecessary CPU
usage when multiple terminal tool outputs existed in the Agent Panel.

## Solution

Calculate the intersection of the terminal's bounds with the current
content_mask (the visible viewport after all parent clipping). If the
intersection has zero area, skip all cell processing entirely.

### Three code paths

1. **Offscreen** (`intersection.size <= 0`): Early exit, process 0 cells
2. **Fully visible** (`intersection == bounds`): Fast path, stream cells
directly (no allocation)
3. **Partially clipped**: Group cells by line, skip/take visible rows
only

### Key insight: filter by screen position, not buffer coordinates

The previous approach tried to filter cells by `cell.point.line`
(terminal buffer coordinates), which breaks in Scrollable mode where
cells can have negative line numbers for scrollback history.

The new approach filters by **screen position** using
`chunk_by(line).skip(N).take(M)`, which works regardless of the actual
line numbers because we're filtering on enumerated line group index.

## Testing

Added comprehensive unit tests for:
- Screen-position filtering with positive lines (Inline mode)
- Screen-position filtering with negative lines (Scrollable mode with
scrollback)
- Edge cases (skip all, positioning math)
- Unified filtering works for both modes

Manually verified:
- Terminal fully visible (no clipping) ✓
- Terminal clipped from top/bottom ✓
- Terminal completely outside viewport ✓
- Scrollable terminals with scrollback history ✓
- Selection/interaction still works ✓

Release Notes:

- Improved Agent Panel performance when terminals are scrolled
offscreen.

/cc @as-cii
```

## Parents

- [ed67f246cb6279ff6e7c3986f1a24cf8018afb8a](https://git.cafe/gitcafe/zed/commit/ed67f246cb6279ff6e7c3986f1a24cf8018afb8a?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/a7ce677ac3835c0f78ef8ca8f458565dddb49daf?format=markdown)
