[OpenJDK 2D-Dev] Handling of premultication in the D3D & OGL pipelines

Phil Race philip.race at oracle.com
Wed Oct 2 22:23:57 UTC 2013


[I just saw Jim's reply but here's what I was going to send anyway].

On 9/30/2013 10:52 PM, Clemens Eisserer wrote:
> Hi,
>
> I am currently testing compatibility of the xrender pipeline with
> different composition operations, and I noticed for AlphaComposite.SRC
> the D3D and OGL pipelines store pre-multiplied colors in surfaces
> without an alpha-channel.
>
> For example the following code results in a black rectangle, instead
> of a red one when rendering to a BufferedImage of type INT_RGB:
>
>                  ((Graphics2D) g).setComposite(AlphaComposite.Src);
>                  g.setColor(new Color(255, 0, 0, 2));
>                  g.fillRect(10, 10, 100, 100);
>
> Is this intentional or should it be considered a bug?
>
>
> Thanks, Clemens

Do you really mean rendering to a BufferedImage ?
I can reproduce this but only rendering directly to the D3D/OGL surface.
Does my example below capture what you mean ?
It sounds wrong as if there's no alpha channel the values should be stored
non-premultiplied.

Having said that if I set the source alpha to 0, then I'd expected
the dest RGB to be 0,0,0. And that is what the h/w pipes do, but
not the s/w pipe which just stores red.

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

public class SrcComp extends Canvas {

     public void paint(Graphics g) {
         Graphics2D g2d = (Graphics2D)g;
         int w = getWidth();
         int h = getHeight();
         g2d.setColor(Color.black);
         g2d.fillRect(0, 0, w, h);
         g2d.setComposite(AlphaComposite.Src);
         g2d.setColor(new Color(255, 0, 0, 0));
         g2d.fillRect(50, 50, w/2, h/2);
     }

     public static void main(String[] args) {

         SrcComp test = new SrcComp();
         final Frame frame = new Frame();
         frame.addWindowListener(new WindowAdapter() {
             public void windowClosing(WindowEvent e) {
                 frame.dispose();
             }        });
         frame.add(test);
         frame.pack();
         frame.setSize(600, 600);
         frame.setVisible(true);
     }
}

-phil.




More information about the 2d-dev mailing list