Saltar al contenido

La costura del painter

Las primitivas con las que se dibuja cada widget, las capacidades opcionales que un painter puede añadir, y los painters de píxeles y de celdas.

go-widgets/painter define la única interfaz a través de la cual dibuja cada widget:

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)
}

El conjunto es pequeño a propósito: cada backend debe implementarlo entero, y una cuadrícula de terminal no puede redondear una esquina ni variar el grosor de un trazo. Por eso el contrato dice qué ocurre cuando no puede: el grosor de StrokeRect es una indicación que una cuadrícula de celdas ignora, y FillRoundRect recurre allí a un relleno cuadrado.

Capacidades opcionales

Lo que no todas las superficies pueden hacer no está en la interfaz base. Un widget que lo necesita hace una aserción de tipo, y dibuja algo razonable cuando la respuesta es no:

InterfazMétodosSe usa para
ClipperPushClip, PopClipmantener un hijo desplazado dentro de los límites de su padre
TranslatorPushTranslate, PopTranslatedibujar un hijo en sus propias coordenadas
PathPainterFillPath, StrokePathcurvas, gráficos, formas con antialiasing
ImagePainterDrawImageiconos, miniaturas, imágenes
MaskPainterDrawMaskglifos y otras máscaras de cobertura en un solo color
FacePainterTextFacetexto en una tipografía y un tamaño concretos
if c, ok := p.(painter.Clipper); ok {
	c.PushClip(bounds)
	defer c.PopClip()
}

Los dos painters

Escribe enLo presenta
NewPixelPainter(buf, w, h)un []byte RGBA propiedad del llamante (NewPixelPainterBGRA para superficies BGRA)una ventana nativa, un canvas de navegador, una superficie Android, un PNG o un SVG
NewCellPainter(w, h)una cuadrícula de celdas (runa, primer plano, fondo) con un serializador ANSI de 24 bitsun terminal, a través de tui

El búfer sigue perteneciendo al llamante. Un PixelPainter solo traduce primitivas en escrituras, de modo que el mismo []byte puede entregarse a un backend de ventana, a un <canvas> o a un codificador de imágenes sin ninguna copia intermedia.

Probarlo

Las demos del propio repositorio dibujan los mismos tres widgets a través de ambos painters:

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

y go-widgets.github.io/painter muestra el painter de píxeles en un navegador.

Creada el por tannevaled

Modificada el por tannevaled