///|
/// 将文本渲染为 RGBA 位图(内置 5×7 点阵字体)。
///
/// - `color`:字形颜色,打包 RGBA `0xRRGGBBAA`;字形像素不透明时 alpha 取 255。
/// - `scale`(可选,默认 1):点阵放大倍数,用最近邻放大。
/// - 字符间距 1 像素;不支持的字形渲染为空白。
/// - 空文本返回 0×0 图像。
pub fn render_text(text : String, color : Int, scale? : Int) -> RgbaImage {
  let s = match scale {
    Some(v) => if v > 0 { v } else { 1 }
    None => 1
  }
  let n = text.length()
  if n == 0 {
    return RgbaImage::new(0, 0, 0)
  }
  let w = n * 6 * s - s
  let h = 7 * s
  let img = RgbaImage::new(w, h, 0x0000_0000)
  for i, c in text.iter2() {
    match glyph(c) {
      Some(g) => {
        for row in 0..<7 {
          let bits = g[row].to_int()
          for col in 0..<5 {
            if ((bits >> (4 - col)) & 1) == 1 {
              for sy in 0.. ()
    }
  }
  img
}

///|
/// 在图像指定位置叠加文本水印(原地修改并返回同一图像)。
///
/// 位置由 `TextConfig.x / y` 指定(水印左上角);透明度仅由
/// `opacity` 控制(字形像素不透明);越界部分自动裁剪。
pub fn RgbaImage::embed_text(self : RgbaImage, cfg : TextConfig) -> RgbaImage {
  let wm = render_text(cfg.text, cfg.color, scale = cfg.font_size)
  let alpha = clamp_opacity(cfg.opacity)
  if alpha == 0 {
    return self
  }
  overlay_at(self, wm, cfg.x, cfg.y, alpha)
  self
}

///|
/// 将 0.0~1.0 的不透明度转换为 0~255,越界值钳制。
fn clamp_opacity(opacity : Double) -> Int {
  let v = (opacity * 255.0).to_int()
  if v < 0 {
    0
  } else if v > 255 {
    255
  } else {
    v
  }
}