2014-10-29 7 views
7

Mam niestandardowy Icon, który używa TexturePaint jako farby i wywołuje fillPolygon na obiekcie Graphics2D.Ikona z TexturePaint wyrzuca InternalError: Surface not cachable

Ten kod działa poprawnie na JDK6 i JDK7, ale kończy się niepowodzeniem w JDK8 z 64-bitowym systemem Linux (próbował najnowszy JDK1.8 na 64-bitowym systemie Linux). W systemie Windows działa to dobrze z JDK8.

Wynik polecenia java -version dla JDK używanego do odtworzenia problemu.

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) 

kod do odtworzenia problemu:

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); 
     } 
    }); 
    } 

} 

Prowadzenie main wyniki metoda w następujący błąd

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) 

już wyszukiwane w bazie danych błędów Java (official one i openjdk one) ale nie znalazł raportu o błędzie, który mógłby to wyjaśnić. Czy robię coś nie tak z moją niestandardową ikoną, czy natknąłem się na błąd JDK?

+1

Na twoim miejscu bym otworzyć nowy raport o błędzie – lbalazscs

+1

@lbalazscs Zrobiłem to wczoraj i jest obecnie w trakcie przeglądu. Najpierw zapytałem go, czy nie zrobiłem czegoś głupiego w moim kodzie, którego przeoczyłem – Robin

Odpowiedz

0

Jeżeli ten sam kod działa różnie w zależności od JVM musi być błąd, ponieważ jest to jedyny OS specyficzne część kodu

Powiązane problemy