protected override updateOffsetAndSizeFromStyle()

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