gfx¶
pkg.go.dev · import "github.com/chhongzh/lilt/gfx"
绘图层:驱动要实现的 Screen 接口,以及在它之上加了裁剪、平移和图形的 Canvas。
屏幕¶
| 签名 | 说明 | 详见 |
|---|---|---|
type Screen interface { Size; SetPixel; FillRect; Flush } |
驱动要提供的四个方法;超出屏幕的坐标要忽略 | 屏幕接口 |
Size() (w, h int16) |
屏幕像素尺寸 | 屏幕接口 |
SetPixel(x, y int16, c Color) |
画一个点 | 屏幕接口 |
FillRect(x, y, w, h int16, c Color) |
填充矩形 | 屏幕接口 |
Flush() error |
一帧画完后把画面推到屏上 | 屏幕接口 |
type Inverter interface { InvertRect(x, y, w, h int16) } |
可选:能反色的屏幕上,光标反色绘制 | 反色光标 |
type Displayer interface { Size; SetPixel; Display } |
与 tinygo.org/x/drivers 的 Displayer 同签名,不 import 它 |
tinygo 驱动 |
func FromDisplayer(d Displayer) Screen |
包装任意 tinygo 驱动;有 FillRectangle 时用它填充,否则逐点画 |
接入硬件 |
颜色¶
| 签名 | 说明 | 详见 |
|---|---|---|
type Color = color.RGBA |
普通 RGBA,单色屏和彩色屏共用一套 API | 屏幕接口 |
var Black、var White |
不透明的黑和白 | 主题 |
func IsLit(c Color) bool |
单色屏上 c 是否点亮:按 3:6:1 加权的亮度不低于一半 |
屏幕接口 |
画布¶
Canvas 是值类型,Translate、Clip、Absolute 返回新画布。坐标都是 int16 像素。
| 签名 | 说明 | 详见 |
|---|---|---|
type Canvas struct |
屏幕的一个平移、裁剪过的视图 | 画布 |
func NewCanvas(s Screen) Canvas |
覆盖整块屏幕的画布;帧循环自己创建,组件在 Draw 里收到 |
画布 |
func (c Canvas) Translate(dx, dy int16) Canvas |
原点移动 | 画布 |
func (c Canvas) Clip(r Rect) Canvas |
只允许画在 r(本地坐标)以内 |
画布 |
func (c Canvas) Absolute() Canvas |
原点回到屏幕左上角,保留裁剪 | 画布 |
func (c Canvas) Origin() (x, y int16) |
本地原点的屏幕坐标 | 画布 |
func (c Canvas) Bounds() Rect |
裁剪区,本地坐标 | 画布 |
func (c Canvas) Visible(r Rect) bool |
r 是否有一部分在裁剪区内 |
画布 |
func (c Canvas) CanInvert() bool |
屏幕是否实现了 Inverter |
画布 |
func (c Canvas) Pixel(x, y int16, col Color) |
一个点 | 画布 |
func (c Canvas) HLine(x, y, w int16, col Color) |
横线 | 画布 |
func (c Canvas) VLine(x, y, h int16, col Color) |
竖线 | 画布 |
func (c Canvas) Line(x0, y0, x1, y1 int16, col Color) |
任意方向的直线(Bresenham) | 画布 |
func (c Canvas) FillRect(r Rect, col Color) |
实心矩形 | 画布 |
func (c Canvas) StrokeRect(r Rect, col Color) |
一像素边框 | 画布 |
func (c Canvas) FillRoundRect(r Rect, radius int16, col Color) |
实心圆角矩形,按行填充 | 画布 |
func (c Canvas) StrokeRoundRect(r Rect, radius int16, col Color) |
圆角边框 | 画布 |
func (c Canvas) FillCircle(cx, cy, r int16, col Color) |
实心圆 | 画布 |
func (c Canvas) StrokeCircle(cx, cy, r int16, col Color) |
圆周 | 画布 |
func (c Canvas) InvertRect(r Rect) |
区域反色,屏幕不能反色时什么也不做 | 反色光标 |
func (c Canvas) InvertRoundRect(r Rect, radius int16) |
圆角区域反色 | 反色光标 |
func (c Canvas) Text(f *Font, x, y int16, s string, col Color) int16 |
画一行字,y 是基线,返回末尾的 x |
画布 |
矩形¶
| 签名 | 说明 | 详见 |
|---|---|---|
type Rect struct { X, Y, W, H int16 } |
像素矩形;布局用的是 float32 的 ui.Rect,用 Pixels() 转过来 |
测量与绘制 |
func (r Rect) Empty() bool |
宽或高不大于 0 | 画布 |
func (r Rect) Right() int16、Bottom() int16 |
右边、下边(不含) | 画布 |
func (r Rect) Contains(x, y int16) bool |
点是否在内 | 画布 |
func (r Rect) Offset(dx, dy int16) Rect |
平移 | 画布 |
func (r Rect) Inset(d int16) Rect |
四边各缩进 d,负数为扩大 |
画布 |
func (r Rect) Intersect(o Rect) Rect |
交集,不相交时为空矩形 | 画布 |
func (r Rect) Overlaps(o Rect) bool |
是否相交 | 画布 |
字体¶
| 签名 | 说明 | 详见 |
|---|---|---|
type Font = tinyfont.Font |
tinyfont 位图字体,字形需按 rune 排序(tinyfont 生成器就是这样输出的) | 主题 |
func Ascent(f *Font) int16 |
最高字形顶部到基线的距离 | 画布 |
func LineHeight(f *Font) int16 |
一行字占的高度;ui.Unit() 由它算出 |
单位 |
func TextWidth(f *Font, s string) int16 |
文字的前进宽度 | 画布 |