-
Bug
-
Resolution: Unresolved
-
P3
-
8, 9, 10, 11
-
x86_64
-
linux_ubuntu
ADDITIONAL SYSTEM INFORMATION :
Os : Ubuntu 16.04 LTS
CPU: x86_32
#uname -a
Linux mypc 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:34:19 UTC 2016 i686 i686 i686 GNU/Linux
JDK versionï¼Â
Openjdk8u40
A DESCRIPTION OF THE PROBLEM :
When you filled the texture with the zoomed picture, an internal exception occurred.
There is a similar bug in the bug Database, which has been closed because the sample couldn't reproduce. https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8072618
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Generate demo.jar from the project, and place any Image 1.jpg to the same level directory of TextureComponent1.class
2. java -jar demo.jar
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
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:631)
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.fill(ValidatePipe.java:159)
at sun.java2d.SunGraphics2D.fill(SunGraphics2D.java:2527)
at demo1.TextureComponent1.paintComponent(TextureComponent1.java:56)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5226)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:290)
at javax.swing.RepaintManager.paint(RepaintManager.java:1265)
at javax.swing.JComponent.paint(JComponent.java:1042)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116)
at java.awt.Container.paint(Container.java:1973)
at java.awt.Window.paint(Window.java:3912)
at javax.swing.RepaintManager$4.run(RepaintManager.java:835)
at javax.swing.RepaintManager$4.run(RepaintManager.java:807)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
at javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:749)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:719)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
---------- BEGIN SOURCE ----------
package demo1;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.TexturePaint;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class TextureComponent1 extends JComponent {
private static final long serialVersionUID = 8449129204443799561L;
protected Dimension defaultComponentSize = new Dimension(61, 52);
private BufferedImage bufferedImage;
/**
* æÂÂé å¨.
*/
TextureComponent1() {
}
/**
* ç»Âå¶纹çÂÂ.
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);
try {
Graphics2D g2d = (Graphics2D) g;
g2d.clip(new Rectangle(0, 0, 500, 400));
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.translate(300, 300);
g2d.scale(11.1, 31.1);
Rectangle r = new Rectangle(0, 0, 400, 400);
int w = 500;
int h = 500;
java.awt.RenderingHints oh = g2d.getRenderingHints();
URL url = TextureComponent1.class.getResource("1.jpg");
bufferedImage = ImageIO.read(url.openStream());
bufferedImage = analysisImage(bufferedImage, w, h);
Paint p = new TexturePaint(bufferedImage, new Rectangle(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight()));
g2d.setPaint(p);
g2d.fill(r);
g2d.setRenderingHints(oh);
g2d.setPaint(Color.black);
g2d.drawRect(-1, -1, 399, 399);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static BufferedImage analysisImage(BufferedImage image, int destWidth, int destHeight)
{
int width = image.getWidth();
int height = image.getHeight();
if (destWidth == -1 || destHeight == -1)
{
return image;
}
boolean hasAlpha = image.getColorModel().hasAlpha();
byte[] byteBuffer = ((DataBufferByte)(image.getRaster().getDataBuffer())).getData();
int[][] pixel = new int[4][];
for(int i = 0; i < 4; i++)
{
pixel[i] = new int[hasAlpha ? 4 : 3];
}
BufferedImage target = new BufferedImage(destWidth, destHeight, hasAlpha
? BufferedImage.TYPE_4BYTE_ABGR : BufferedImage.TYPE_3BYTE_BGR);
float su = (float)width / destWidth;
float sv = (float)height / destHeight;
int ww = width - 1;
int hh = height - 1;
float x = 0, y = 0, d = 0, n = 0;
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
WritableRaster targetRaster = target.getRaster();
byte[] dataBuffer = ((DataBufferByte)targetRaster.getDataBuffer()).getData();
int destIndex = 0;
int dw = destWidth - 1;
pixel[0] = getPixel(byteBuffer, pixel[0], 0, 0, width, height, hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
for (int i = 1; i < dw; i++)
{
x = i * su;
x1 = (int)x;
x2 = x1 + 1;
d = x2 - x;
pixel[0] = getPixel(byteBuffer, pixel[0], x1, 0, width, height, hasAlpha);
pixel[1] = getPixel(byteBuffer, pixel[1], x2, 0, width, height, hasAlpha);
pixel[0] = mixedColors(d, pixel[0], pixel[1], hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
}
pixel[0] = getPixel(byteBuffer, pixel[0], ww, 0, width, height, hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
int dH = destHeight - 1;
for (int j = 1; j < dH; j++)
{
y = j * sv;
y1 = (int)y;
y2 = y1 + 1;
n = y2 - y;
pixel[0] = getPixel(byteBuffer, pixel[0], 0, y1, width, height, hasAlpha);
pixel[1] = getPixel(byteBuffer, pixel[1], 0, y2, width, height, hasAlpha);
pixel[0] = mixedColors(n, pixel[0], pixel[1], hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
y1 = (int)(y + 0.5f);
for (int i = 1; i < dw; i++)
{
x = i * su;
x1 = (int)x;
x2 = x1 + 1;
d = x2 - x;
pixel[0] = getPixel(byteBuffer, pixel[0], x1, y1, width, height, hasAlpha);
pixel[1] = getPixel(byteBuffer, pixel[1], x2, y1, width, height, hasAlpha);
pixel[2] = getPixel(byteBuffer, pixel[2], x1, y2, width, height, hasAlpha);
pixel[3] = getPixel(byteBuffer, pixel[3], x2, y2, width, height, hasAlpha);
pixel[0] = mixedColors_4(pixel, d, n, hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
}
y1 = y2 - 1;
pixel[0] = getPixel(byteBuffer, pixel[0], ww, y1, width, height, hasAlpha);
pixel[1] = getPixel(byteBuffer, pixel[1], ww, y2, width, height, hasAlpha);
pixel[0] = mixedColors(n, pixel[0], pixel[1], hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
}
pixel[0] = getPixel(byteBuffer, pixel[0], 0, hh, width, height, hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
for (int i = 1; i < dw; i++)
{
x = i * su;
x1 = (int)x;
x2 = x1 + 1;
d = x2 - x;
pixel[0] = getPixel(byteBuffer, pixel[0], x1, hh, width, height, hasAlpha);
pixel[1] = getPixel(byteBuffer, pixel[1], x2, hh, width, height, hasAlpha);
pixel[0] = mixedColors(d, pixel[0], pixel[1], hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
}
pixel[0] = getPixel(byteBuffer, pixel[0], ww, hh, width, height, hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
return target;
}
protected static final int[] getPixel(byte[] byteBuffer, int[] pixel, int x, int y, int w,
int h, boolean hasAlpha)
{
if (x < 0)
{
x = 0;
}
if (y < 0)
{
y = 0;
}
if (x >= w)
{
x = w - 1;
}
if (y >= h)
{
y = h - 1;
}
if (pixel == null)
{
pixel = new int[hasAlpha ? 4 : 3];
}
if (hasAlpha)
{
int index = 4 * (y * w + x);
pixel[3] = byteBuffer[index++] & 0xFF;
if(pixel[3] == 0)
{
pixel[2] = pixel[1] = pixel[0] = 255;
index += 3;
}
else
{
pixel[2] = byteBuffer[index++] & 0xFF;
pixel[1] = byteBuffer[index++] & 0xFF;
pixel[0] = byteBuffer[index++] & 0xFF;
}
}
else
{
int index = (y * w + x) * 3;
pixel[2] = byteBuffer[index++] & 0xFF;
pixel[1] = byteBuffer[index++] & 0xFF;
pixel[0] = byteBuffer[index++] & 0xFF;
}
return pixel;
}
protected static final int[] getPixel(int[] intBuffer, int[] pixel, int x, int y, int w,
int h, boolean hasAlpha)
{
if (x < 0)
{
x = 0;
}
if (y < 0)
{
y = 0;
}
if (x >= w)
{
x = w - 1;
}
if (y >= h)
{
y = h - 1;
}
if (pixel == null)
{
pixel = new int[hasAlpha ? 4 : 3];
}
int index = y * w + x;
pixel[2] = (intBuffer[index] >> 16) & 0xFF;
pixel[1] = (intBuffer[index] >> 8) & 0xFF;
pixel[0] = intBuffer[index] & 0xFF;
if(hasAlpha)
{
pixel[3] = (intBuffer[index] >> 24) & 0xFF;
if (pixel[3] == 0)
{
pixel[2] = pixel[1] = pixel[0] = -1;
}
}
return pixel;
}
protected static final int setPixel(byte[] dataBuffer, int[] pixel, int index, boolean hasAlpha)
{
if (hasAlpha)
{
dataBuffer[index++] = (byte)pixel[3];
}
dataBuffer[index++] = (byte)pixel[2];
dataBuffer[index++] = (byte)pixel[1];
dataBuffer[index++] = (byte)pixel[0];
return index;
}
private final static int[] mixedColors(float d, int[] pixel1, int[] pixel2, boolean hasAlpha)
{
float b = 1 - d;
if (hasAlpha)
{
pixel1[3] = (int)(pixel1[3] * d + pixel2[3] * b);
}
pixel1[0] = (int)(pixel1[0] * d + pixel2[0] * b);
pixel1[1] = (int)(pixel1[1] * d + pixel2[1] * b);
pixel1[2] = (int)(pixel1[2] * d + pixel2[2] * b);
return pixel1;
}
private final static int[] mixedColors_4(int[][] pixel, float d, float n, boolean hasAlpha)
{
float ds = 1 - d;
float ns = 1 - n;
pixel[0][0] = (int)(pixel[0][0] * d * n + pixel[1][0] * ds * n + pixel[2][0] * d * ns + pixel[3][0]
* ns * ds);
pixel[0][1] = (int)(pixel[0][1] * d * n + pixel[1][1] * ds * n + pixel[2][1] * d * ns + pixel[3][1]
* ns * ds);
pixel[0][2] = (int)(pixel[0][2] * d * n + pixel[1][2] * ds * n + pixel[2][2] * d * ns + pixel[3][2]
* ns * ds);
if (hasAlpha)
{
pixel[0][3] = (int)(pixel[0][3] * n * d + pixel[1][3] * ds * n + pixel[2][3] * d * ns + pixel[3][3]
* ns * ds);
}
return pixel[0];
}
public static void main(String[] args) throws IOException {
TextureComponent1 tc = new TextureComponent1();
JFrame jf = new JFrame("test");
jf.setSize(500, 500);
jf.add(tc);
jf.setVisible(true);
}
}
---------- END SOURCE ----------
FREQUENCY : always
Os : Ubuntu 16.04 LTS
CPU: x86_32
#uname -a
Linux mypc 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:34:19 UTC 2016 i686 i686 i686 GNU/Linux
JDK versionï¼Â
Openjdk8u40
A DESCRIPTION OF THE PROBLEM :
When you filled the texture with the zoomed picture, an internal exception occurred.
There is a similar bug in the bug Database, which has been closed because the sample couldn't reproduce. https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8072618
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Generate demo.jar from the project, and place any Image 1.jpg to the same level directory of TextureComponent1.class
2. java -jar demo.jar
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
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:631)
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.fill(ValidatePipe.java:159)
at sun.java2d.SunGraphics2D.fill(SunGraphics2D.java:2527)
at demo1.TextureComponent1.paintComponent(TextureComponent1.java:56)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5226)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:290)
at javax.swing.RepaintManager.paint(RepaintManager.java:1265)
at javax.swing.JComponent.paint(JComponent.java:1042)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116)
at java.awt.Container.paint(Container.java:1973)
at java.awt.Window.paint(Window.java:3912)
at javax.swing.RepaintManager$4.run(RepaintManager.java:835)
at javax.swing.RepaintManager$4.run(RepaintManager.java:807)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
at javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:749)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:719)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
---------- BEGIN SOURCE ----------
package demo1;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.TexturePaint;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class TextureComponent1 extends JComponent {
private static final long serialVersionUID = 8449129204443799561L;
protected Dimension defaultComponentSize = new Dimension(61, 52);
private BufferedImage bufferedImage;
/**
* æÂÂé å¨.
*/
TextureComponent1() {
}
/**
* ç»Âå¶纹çÂÂ.
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);
try {
Graphics2D g2d = (Graphics2D) g;
g2d.clip(new Rectangle(0, 0, 500, 400));
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.translate(300, 300);
g2d.scale(11.1, 31.1);
Rectangle r = new Rectangle(0, 0, 400, 400);
int w = 500;
int h = 500;
java.awt.RenderingHints oh = g2d.getRenderingHints();
URL url = TextureComponent1.class.getResource("1.jpg");
bufferedImage = ImageIO.read(url.openStream());
bufferedImage = analysisImage(bufferedImage, w, h);
Paint p = new TexturePaint(bufferedImage, new Rectangle(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight()));
g2d.setPaint(p);
g2d.fill(r);
g2d.setRenderingHints(oh);
g2d.setPaint(Color.black);
g2d.drawRect(-1, -1, 399, 399);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static BufferedImage analysisImage(BufferedImage image, int destWidth, int destHeight)
{
int width = image.getWidth();
int height = image.getHeight();
if (destWidth == -1 || destHeight == -1)
{
return image;
}
boolean hasAlpha = image.getColorModel().hasAlpha();
byte[] byteBuffer = ((DataBufferByte)(image.getRaster().getDataBuffer())).getData();
int[][] pixel = new int[4][];
for(int i = 0; i < 4; i++)
{
pixel[i] = new int[hasAlpha ? 4 : 3];
}
BufferedImage target = new BufferedImage(destWidth, destHeight, hasAlpha
? BufferedImage.TYPE_4BYTE_ABGR : BufferedImage.TYPE_3BYTE_BGR);
float su = (float)width / destWidth;
float sv = (float)height / destHeight;
int ww = width - 1;
int hh = height - 1;
float x = 0, y = 0, d = 0, n = 0;
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
WritableRaster targetRaster = target.getRaster();
byte[] dataBuffer = ((DataBufferByte)targetRaster.getDataBuffer()).getData();
int destIndex = 0;
int dw = destWidth - 1;
pixel[0] = getPixel(byteBuffer, pixel[0], 0, 0, width, height, hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
for (int i = 1; i < dw; i++)
{
x = i * su;
x1 = (int)x;
x2 = x1 + 1;
d = x2 - x;
pixel[0] = getPixel(byteBuffer, pixel[0], x1, 0, width, height, hasAlpha);
pixel[1] = getPixel(byteBuffer, pixel[1], x2, 0, width, height, hasAlpha);
pixel[0] = mixedColors(d, pixel[0], pixel[1], hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
}
pixel[0] = getPixel(byteBuffer, pixel[0], ww, 0, width, height, hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
int dH = destHeight - 1;
for (int j = 1; j < dH; j++)
{
y = j * sv;
y1 = (int)y;
y2 = y1 + 1;
n = y2 - y;
pixel[0] = getPixel(byteBuffer, pixel[0], 0, y1, width, height, hasAlpha);
pixel[1] = getPixel(byteBuffer, pixel[1], 0, y2, width, height, hasAlpha);
pixel[0] = mixedColors(n, pixel[0], pixel[1], hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
y1 = (int)(y + 0.5f);
for (int i = 1; i < dw; i++)
{
x = i * su;
x1 = (int)x;
x2 = x1 + 1;
d = x2 - x;
pixel[0] = getPixel(byteBuffer, pixel[0], x1, y1, width, height, hasAlpha);
pixel[1] = getPixel(byteBuffer, pixel[1], x2, y1, width, height, hasAlpha);
pixel[2] = getPixel(byteBuffer, pixel[2], x1, y2, width, height, hasAlpha);
pixel[3] = getPixel(byteBuffer, pixel[3], x2, y2, width, height, hasAlpha);
pixel[0] = mixedColors_4(pixel, d, n, hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
}
y1 = y2 - 1;
pixel[0] = getPixel(byteBuffer, pixel[0], ww, y1, width, height, hasAlpha);
pixel[1] = getPixel(byteBuffer, pixel[1], ww, y2, width, height, hasAlpha);
pixel[0] = mixedColors(n, pixel[0], pixel[1], hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
}
pixel[0] = getPixel(byteBuffer, pixel[0], 0, hh, width, height, hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
for (int i = 1; i < dw; i++)
{
x = i * su;
x1 = (int)x;
x2 = x1 + 1;
d = x2 - x;
pixel[0] = getPixel(byteBuffer, pixel[0], x1, hh, width, height, hasAlpha);
pixel[1] = getPixel(byteBuffer, pixel[1], x2, hh, width, height, hasAlpha);
pixel[0] = mixedColors(d, pixel[0], pixel[1], hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
}
pixel[0] = getPixel(byteBuffer, pixel[0], ww, hh, width, height, hasAlpha);
destIndex = setPixel(dataBuffer, pixel[0], destIndex, hasAlpha);
return target;
}
protected static final int[] getPixel(byte[] byteBuffer, int[] pixel, int x, int y, int w,
int h, boolean hasAlpha)
{
if (x < 0)
{
x = 0;
}
if (y < 0)
{
y = 0;
}
if (x >= w)
{
x = w - 1;
}
if (y >= h)
{
y = h - 1;
}
if (pixel == null)
{
pixel = new int[hasAlpha ? 4 : 3];
}
if (hasAlpha)
{
int index = 4 * (y * w + x);
pixel[3] = byteBuffer[index++] & 0xFF;
if(pixel[3] == 0)
{
pixel[2] = pixel[1] = pixel[0] = 255;
index += 3;
}
else
{
pixel[2] = byteBuffer[index++] & 0xFF;
pixel[1] = byteBuffer[index++] & 0xFF;
pixel[0] = byteBuffer[index++] & 0xFF;
}
}
else
{
int index = (y * w + x) * 3;
pixel[2] = byteBuffer[index++] & 0xFF;
pixel[1] = byteBuffer[index++] & 0xFF;
pixel[0] = byteBuffer[index++] & 0xFF;
}
return pixel;
}
protected static final int[] getPixel(int[] intBuffer, int[] pixel, int x, int y, int w,
int h, boolean hasAlpha)
{
if (x < 0)
{
x = 0;
}
if (y < 0)
{
y = 0;
}
if (x >= w)
{
x = w - 1;
}
if (y >= h)
{
y = h - 1;
}
if (pixel == null)
{
pixel = new int[hasAlpha ? 4 : 3];
}
int index = y * w + x;
pixel[2] = (intBuffer[index] >> 16) & 0xFF;
pixel[1] = (intBuffer[index] >> 8) & 0xFF;
pixel[0] = intBuffer[index] & 0xFF;
if(hasAlpha)
{
pixel[3] = (intBuffer[index] >> 24) & 0xFF;
if (pixel[3] == 0)
{
pixel[2] = pixel[1] = pixel[0] = -1;
}
}
return pixel;
}
protected static final int setPixel(byte[] dataBuffer, int[] pixel, int index, boolean hasAlpha)
{
if (hasAlpha)
{
dataBuffer[index++] = (byte)pixel[3];
}
dataBuffer[index++] = (byte)pixel[2];
dataBuffer[index++] = (byte)pixel[1];
dataBuffer[index++] = (byte)pixel[0];
return index;
}
private final static int[] mixedColors(float d, int[] pixel1, int[] pixel2, boolean hasAlpha)
{
float b = 1 - d;
if (hasAlpha)
{
pixel1[3] = (int)(pixel1[3] * d + pixel2[3] * b);
}
pixel1[0] = (int)(pixel1[0] * d + pixel2[0] * b);
pixel1[1] = (int)(pixel1[1] * d + pixel2[1] * b);
pixel1[2] = (int)(pixel1[2] * d + pixel2[2] * b);
return pixel1;
}
private final static int[] mixedColors_4(int[][] pixel, float d, float n, boolean hasAlpha)
{
float ds = 1 - d;
float ns = 1 - n;
pixel[0][0] = (int)(pixel[0][0] * d * n + pixel[1][0] * ds * n + pixel[2][0] * d * ns + pixel[3][0]
* ns * ds);
pixel[0][1] = (int)(pixel[0][1] * d * n + pixel[1][1] * ds * n + pixel[2][1] * d * ns + pixel[3][1]
* ns * ds);
pixel[0][2] = (int)(pixel[0][2] * d * n + pixel[1][2] * ds * n + pixel[2][2] * d * ns + pixel[3][2]
* ns * ds);
if (hasAlpha)
{
pixel[0][3] = (int)(pixel[0][3] * n * d + pixel[1][3] * ds * n + pixel[2][3] * d * ns + pixel[3][3]
* ns * ds);
}
return pixel[0];
}
public static void main(String[] args) throws IOException {
TextureComponent1 tc = new TextureComponent1();
JFrame jf = new JFrame("test");
jf.setSize(500, 500);
jf.add(tc);
jf.setVisible(true);
}
}
---------- END SOURCE ----------
FREQUENCY : always
- relates to
-
JDK-8072618 Icon with TexturePaint throws InternalErrro: Surface not cachable
-
- Closed
-