PGraphics2D 应该实现可克隆但抛出异常

PGraphics2D should implement cloneable but throws exception

使用 Java 处理,我正在尝试制作 PGraphics2D 对象的深层副本

PGraphics2D pg_render;
pg_render = (PGraphics2D) createGraphics(width, height, P2D);
PGraphics2D pg_postprocd = (PGraphics2D)pg_render.clone();

抛出 CloneNotSupportedException:

Unhandled exception type CloneNotSupportedException

但阅读 the doc 似乎实施了克隆。

我需要有两个 PGraphics2D 对象的实例,这样我就可以对一个应用 post 处理效果,并保持另一个干净,以便分析运动矢量等。

异常

PGraphics class 本身并不实现 Clonable。相反,它扩展了 PImage,这是实际实现 Cloneable 接口的 class。

这就是您对 pg_render.clone() 的调用抛出 CloneNotSupportedException 的原因,因为 PGraphics 实际上并不支持克隆(但碰巧扩展了支持克隆的 class)。

解决方案

下面的静态方法 returns 是输入 PGraphics 对象的 克隆。它使用 createGraphics() 创建一个新的 PGraphics 对象,克隆样式(样式包括当前填充颜色等内容),最后克隆像素缓冲区。

代码

static PGraphics clonePGraphics(PGraphics source) {

  final String renderer;
  switch (source.parent.sketchRenderer()) {
    case "processing.opengl.PGraphics2D" :
      renderer = PConstants.P2D;
      break;
    case "processing.opengl.PGraphics3D" :
      renderer = PConstants.P3D;
      break;
    default : // secondary sketches cannot use FX2D
      renderer = PConstants.JAVA2D;
  }

  PGraphics clone = source.parent.createGraphics(source.width, source.height, renderer);
  
  clone.beginDraw();
  clone.style(source.getStyle()); // copy style (fillColor, etc.)
  source.loadPixels(); // graphics buffer -> int[] buffer
  clone.pixels = source.pixels.clone(); // in's int[] buffer -> clone's int[] buffer
  clone.updatePixels(); // int[] buffer -> graphics buffer
  clone.endDraw();
  
  return clone;
}