antvis / G

💥 A flexible rendering engine for visualization.
https://g.antv.antgroup.com/
1.08k stars 202 forks source link

[g] 文本度量不能直接使用 DOM API 创建 <canvas> #940

Closed xiaoiver closed 2 years ago

xiaoiver commented 2 years ago

目前会尝试创建 OffscreenCanvas,如果不支持则使用 DOM API 创建 <canvas>。 但运行环境不一定支持 DOM API,例如小程序:

try {
    this.canvas = new window.OffscreenCanvas(0, 0);
    this.context = this.canvas.getContext('2d')!;
    if (!this.context || !this.context.measureText) {
      this.canvas = document.createElement('canvas');
      this.context = this.canvas.getContext('2d')!;
    }
  } catch (ex) {
    this.canvas = document.createElement('canvas');
    this.context = this.canvas.getContext('2d')!;
  }

随后度量文本流程一致,小程序下也支持 ctx.measureText 方法 https://opendocs.alipay.com/mini/api/rn2r7f

但不能使用画布初始化时传入的用于渲染的上下文,因为在度量文本时需要绘制,使用同一个上下文会造成干扰。

目前这个离屏的上下文还用在:

xiaoiver commented 2 years ago

在画布初始化参数中增加一个 offscreenCanvas 选项,例如在小程序环境中:

const canvas = new Canvas({
  // 省略其他参数
  offscreenCanvas: {
// 小程序中创建上下文方法
    getContext: () => Canvas.createContext()
  }
});