· 渲染器是如何工作的
SWT/Draw2D Java 2D 渲染器的工作过程如下:
在可以使用渲染器之前,必须以至少与要绘制的区域一样的尺寸初始化其屏外图像和缓冲区。这是通过调用方法 prepareRendering(...) 完成的。根据是在 SWT 还是 Draw2D 图形上下文中进行渲染,这个方法以一个 SWT GC 或者一个 Draw2D Graphics 对象作为参数。
接下来,prepareRendering 从图形上下文中提取剪裁矩形(clip rectangle)—— 剪裁矩形,是可以修改其中像素的最大矩形区域。然后调用 private 方法 prepareRendering(int clipX, int clipY, int clipW, int clipH) 准备要渲染的屏外图像。这个方法独立于所使用的图形上下文的类型,它可以是 SWT 或者 Draw2D。prepareRendering() 方法的工作过程如下:
它首先检查 AWT 和 SWT 屏外图像已实例化并足以包含要绘制的区域,这是由方法 checkOffScreenImages(clipW, clipH) 完成的。如果屏外图像已经实例化,但是不够大,就会放弃它并以所需要大小重新创建一个。如果屏外图像大于要绘制的区域,那么就会重复使用它,并只修改相应于要绘制的区域的那一部分。
完成这种检查后,用为透明度信道保留的颜色 TRANSPARENT_COLOR 填充绘制区域。这个图像就可以用来进行 Java 2D 操作了。当渲染器准备好进行剪裁区域中的 Java 2D 绘制操作后,可以从 BufferedImage AWT 获得 Java 2D Graphics2D 上下文。这个图形上下文将用于所有 Java 2D 绘制例程。每一次绘制操作修改 AWT 屏外图像。
当所有 Java 2D 绘制操作都完成后,绘制区域的像素必须从 AWT 转换为 SWT 屏外图像,然后绘制到 SWT 或者 Draw2D 图形上下文中。这个操作是由方法 render(GC) 或者 render(Graphics) 完成的。这两个方法都在内部调用 private 方法 transferPixels(...),该方法将像素从 AWT 转换为 SWT。
如果不再需要渲染器了或者必须释放资源,可以调用 dispose() 方法,以清除渲染器所使用的屏外图像和缓冲区。这会释放资源,但是在再次需要渲染器时要花时间重新创建缓冲区。需要根据组件重新绘制的频度以及重新绘制区域应有多大来判断应当什么时候调用 dispose()。
清单 2 显示如何用渲染器在 SWT Canvas 上绘制一些旋转文字。
清单 2. 在 SWT Canvas 上的使用示例
Canvas canvas = new Canvas(shell, SWT.NO_BACKGROUND); final Graphics2DRenderer renderer = new Graphics2DRenderer(); canvas.addPaintListener(new PaintListener() { GC gc = e.gc; // gets the SWT graphics context from the event renderer.prepareRendering(gc); // prepares the Graphics2D renderer // gets the Graphics2D context and switch on the antialiasing // paints the background with a color gradient // draws rotated text g2d.translate(controlSize.x / 2, controlSize.y / 2); // now that we are done with Java 2D, renders Graphics2D operation // now we can continue with pure SWT paint operations
|