v0.2.1 7e79979

frame.go RawHistoryFolder

1package ports
2
3import "fmt"
4
5const (
6	BytesPerPixel = 4
7	MaxDimension  = 16384
8	MaxFrameBytes = 256 << 20
9	MaxFPS        = 120
10)
11
12// Validate bounds all arithmetic before adapters map or consume shared storage.
13func (f Frame) Validate() error {
14	if f.Width < 1 || f.Height < 1 || f.Width > MaxDimension || f.Height > MaxDimension {
15		return fmt.Errorf("invalid frame dimensions %dx%d", f.Width, f.Height)
16	}
17	if f.Stride < f.Width*BytesPerPixel || f.Stride%BytesPerPixel != 0 || f.Stride > MaxFrameBytes/f.Height {
18		return fmt.Errorf("invalid frame stride %d", f.Stride)
19	}
20	if f.Format != XRGB8888 && f.Format != ARGB8888 {
21		return fmt.Errorf("%w: %d", ErrUnsupportedFormat, f.Format)
22	}
23	// The last row needs only its pixels: a cropped frame borrows a window of
24	// a larger buffer, with no stride padding after its final row.
25	if len(f.Pixels) < (f.Height-1)*f.Stride+f.Width*BytesPerPixel {
26		return fmt.Errorf("short frame storage: got %d bytes", len(f.Pixels))
27	}
28	return nil
29}
30
31// Row returns a packed view in top-to-bottom order, excluding stride padding.
32// Call Validate before using Row. The returned slice borrows frame storage.
33func (f Frame) Row(y int) []byte {
34	offset := y * f.Stride
35	return f.Pixels[offset : offset+f.Width*BytesPerPixel]
36}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 9

↑↓ moveenter openesc close