Zum Inhalt springen
Painter

Die Painter-Schnittstelle

Die Primitive, mit denen jedes Widget gezeichnet wird, die optionalen Fähigkeiten, die ein Painter hinzufügen kann, und die Pixel- und Zellen-Painter.

go-widgets/painter definiert die eine Schnittstelle, über die jedes Widget zeichnet:

type Painter interface {
	FillRect(r Rect, c RGBA)
	StrokeRect(r Rect, c RGBA, lineW int)
	FillRoundRect(r Rect, radius int, c RGBA)
	StrokeRoundRect(r Rect, radius int, c RGBA, lineW int)
	PutPixel(x, y int, c RGBA)
	Text(x, y int, s string, ink RGBA)
	Size() (w, h int)
}

Der Satz ist absichtlich klein: Jedes Back-End muss ihn vollständig implementieren, und ein Terminalraster kann keine Ecke abrunden und keine Strichbreite variieren. Deshalb legt der Vertrag fest, was geschieht, wenn es das nicht kann – die Breite bei StrokeRect ist ein Hinweis, den ein Zellenraster ignoriert, und FillRoundRect fällt dort auf eine eckige Füllung zurück.

Optionale Fähigkeiten

Was nicht jede Oberfläche kann, steht nicht in der Basisschnittstelle. Ein Widget, das es braucht, macht eine Typzusicherung und zeichnet etwas Sinnvolles, wenn die Antwort Nein lautet:

SchnittstelleMethodenWofür
ClipperPushClip, PopClipein gescrolltes Kind innerhalb der Grenzen seines Elternelements halten
TranslatorPushTranslate, PopTranslateein Kind in seinen eigenen Koordinaten zeichnen
PathPainterFillPath, StrokePathKurven, Diagramme, kantengeglättete Formen
ImagePainterDrawImageIcons, Vorschaubilder, Bilder
MaskPainterDrawMaskGlyphen und andere Deckungsmasken in einer Farbe
FacePainterTextFaceText in einer bestimmten Schrift und Größe
if c, ok := p.(painter.Clipper); ok {
	c.PushClip(bounds)
	defer c.PopClip()
}

Die beiden Painter

Schreibt inDargestellt von
NewPixelPainter(buf, w, h)einen RGBA-[]byte, der dem Aufrufer gehört (NewPixelPainterBGRA für BGRA-Oberflächen)einem nativen Fenster, einem Browser-Canvas, einer Android-Oberfläche, einem PNG oder SVG
NewCellPainter(w, h)ein Zellenraster (Rune, Vordergrund, Hintergrund) mit einem 24-Bit-ANSI-Serialisierereinem Terminal, über tui

Der Puffer bleibt im Besitz des Aufrufers. Ein PixelPainter übersetzt nur Primitive in Schreibzugriffe, sodass derselbe []byte an ein Fenster-Back-End, ein <canvas> oder einen Bild-Encoder übergeben werden kann, ohne dazwischen zu kopieren.

Ausprobieren

Die Demos des Repositorys zeichnen dieselben drei Widgets über beide Painter:

go run ./cmd/wui-demo --out demo.png     # pixels, written as a PNG
go run ./cmd/tui-demo --theme dark       # cells, written as ANSI to stdout

und go-widgets.github.io/painter zeigt den Pixel-Painter in einem Browser.

Erstellt am von tannevaled

Geändert am von tannevaled