2014-10-29 27 views
7

Ho una custom Icon che utilizza uno TexturePaint come paint e chiama fillPolygon su un oggetto Graphics2D.L'icona con TexturePaint genera InternalError: Surface not cachable

Questo codice funziona bene su JDK6 e JDK7, ma non funziona con JDK8 con 64 bit Linux (provato JDK1.8 più recente su 64 bit Linux). Su Windows, questo funziona perfettamente con JDK8.

Output del comando java -version per il JDK utilizzato per riprodurre il problema.

java version "1.8.0_25" 
Java(TM) SE Runtime Environment (build 1.8.0_25-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode) 

codice per riprodurre il problema:

import java.awt.*; 
import java.awt.image.*; 
import javax.swing.*; 

public class TexturePaintIconTest { 

    private static class CustomIcon implements Icon{ 

    private static final int[] sXArray = new int[]{2, 5, 7, 12, 12, 4, 1, 1, 2}; 
    private static final int[] sYArray = new int[]{4, 4, 2, 2, 11, 11, 8, 5, 4}; 
    private static final int sNumberOfPoints = 9; 

    @Override 
    public void paintIcon(Component c, Graphics g, int x, int y) { 
     g.translate(x,y); 

     Graphics2D g2d = (Graphics2D) g; 
     Color fillColor = new Color(140, 25, 25, 35); 
     g2d.setPaint(createPatternPaint(fillColor)); 
     g2d.fillPolygon(sXArray, sYArray, sNumberOfPoints); 

     g.translate(-x, -y); 
    } 

    private Paint createPatternPaint(Color color){ 
     int[] colors = new int[]{color.getRGB(), 0}; 
     IndexColorModel colorModel = new IndexColorModel(1, 2, colors, 0, true, -1, DataBuffer.TYPE_BYTE); 
     BufferedImage image = new BufferedImage(2, 2, BufferedImage.TYPE_BYTE_INDEXED, colorModel); 
     DataBufferByte dataBuffer = (DataBufferByte) image.getRaster().getDataBuffer(); 
     byte[] data = dataBuffer.getData(); 
     data[0] = 0; 
     data[1] = 1; 
     data[2] = 1; 
     data[3] = 0; 
     return new TexturePaint(image, new Rectangle(2, 2)); 
    } 

    @Override 
    public int getIconWidth() { 
     return 16; 
    } 

    @Override 
    public int getIconHeight() { 
     return 16; 
    } 
    } 

    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     JFrame testFrame = new JFrame("TestFrame"); 

     JLabel label = new JLabel("Label with icon", new CustomIcon(), SwingConstants.LEFT); 
     testFrame.add(label); 

     testFrame.pack(); 
     testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     testFrame.setVisible(true); 
     } 
    }); 
    } 

} 

Esecuzione dei main risultati del metodo nella seguente errore

Exception in thread "AWT-EventQueue-0" java.lang.InternalError: Surface not cachable 
    at sun.java2d.xr.XRPaints$XRTexture.getAccSrcSurface(XRPaints.java:211) 
    at sun.java2d.xr.XRPaints$XRTexture.isPaintValid(XRPaints.java:224) 
    at sun.java2d.xr.XRPaints.isValid(XRPaints.java:75) 
    at sun.java2d.xr.XRSurfaceData.getMaskFill(XRSurfaceData.java:205) 
    at sun.java2d.SurfaceData.validatePipe(SurfaceData.java:675) 
    at sun.java2d.xr.XRSurfaceData.validatePipe(XRSurfaceData.java:123) 
    at sun.java2d.SunGraphics2D.validatePipe(SunGraphics2D.java:446) 
    at sun.java2d.pipe.ValidatePipe.validate(ValidatePipe.java:55) 
    at sun.java2d.pipe.ValidatePipe.fillPolygon(ValidatePipe.java:147) 
    at sun.java2d.SunGraphics2D.fillPolygon(SunGraphics2D.java:2389) 
    at com.luciad.internal.lucy.map.TexturePaintIconTest$CustomIcon.paintIcon(TexturePaintIconTest.java:22) 

ho già cercato nel database Java bug (official one e la openjdk one) ma non ho trovato alcuna segnalazione di bug che potesse spiegare questo. Sto facendo qualcosa di sbagliato con la mia icona personalizzata, o mi sono imbattuto in un bug JDK?

+1

Al tuo posto avrei aprire un nuovo bug report – lbalazscs

+1

@lbalazscs ho fatto ieri ed è attualmente in fase di revisione. Ho appena chiesto qui prima di vedere se non ho semplicemente fatto qualcosa di stupido nel mio codice che ho trascurato – Robin

risposta

0

Se lo stesso codice funziona in modo diverso a seconda del JVM deve essere un errore, dal momento che è l'unica parte del sistema operativo specifico del codice