in packages/core/src/rendering/render-text.ts [186:238]
protected override updateOffsetAndSizeFromStyle() {
const {
width,
maxWidth,
height,
left,
top,
paddingLeft = 0,
paddingTop = 0,
paddingRight = 0,
paddingBottom = 0,
} = this.style
assert(typeof width !== 'string', 'Percent unit is not supported')
assert(typeof height !== 'string', 'Percent unit is not supported')
assert(typeof left !== 'string', 'Percent unit is not supported')
assert(typeof top !== 'string', 'Percent unit is not supported')
assert(typeof paddingLeft === 'number', `paddingLeft 仅支持 number`)
assert(typeof paddingTop === 'number', `paddingTop 仅支持 number`)
assert(typeof paddingRight === 'number', `paddingRight 仅支持 number`)
assert(typeof paddingBottom === 'number', `paddingBottom 仅支持 number`)
// 段落的布局
this.paragraph.layout(
typeof width === 'number'
? width - paddingLeft - paddingRight
: typeof maxWidth === 'number'
? maxWidth - paddingLeft - paddingRight
: Number.MAX_SAFE_INTEGER
)
let size: Mut<Size>
// 更新 size
if (typeof width === 'number' && typeof height === 'number') {
// 同时设置了 width 和 height,则使用用户设置的值
size = Size.fromWH(width, height)
} else if (typeof width === 'number') {
// 仅设置了 width,则最 height 由段落 height 决定
size = Size.fromWH(width, this.paragraph.size.height)
} else if (typeof height === 'number') {
// 仅设置了 height,则最终 width 由段落 width 决定
size = Size.fromWH(this.paragraph.size.width, height)
} else {
// 否则直接使用段落的 size
size = Size.clone(this.paragraph.size)
}
size.width += paddingLeft + paddingRight
size.height += paddingTop + paddingBottom
this.size = size
this.offset = Point.fromXY(left ?? 0, top ?? 0)
}