-
Bug
-
Resolution: Fixed
-
P3
-
jfx11, 8, 9, 10
-
x86_64
-
windows_10
ADDITIONAL SYSTEM INFORMATION :
Also all Windows
# NOTICE
Now Windows API provide glyphIndices as UINT16.
Exsample)
https://msdn.microsoft.com/en-us/library/windows/desktop/dd316625%28v=vs.85%29.aspx
But originally, Windows API should provide as UINT32.
Because CMAP Format 8,12,13 have UINT32.
https://docs.microsoft.com/en-us/typography/opentype/spec/cmap
https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6cmap.html
A DESCRIPTION OF THE PROBLEM :
When display particular glyph (glyphID is larger than 32767 and complex char),
Java errors ArrayIndexOutOfBoundsException.
This bug occurs only when all of the following conditions are satisfied.
1. on Windows
2. font has glyphID larger than 32767 (max value of signed short)
3. font has complex character. (isComplexCharCode() return true)
Now I doing pull request.
https://github.com/javafxports/openjdk-jfx/pull/125
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Please run following BigGlyphIDTest.java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Display glyphs without errors.
https://drive.google.com/open?id=1b9xmr7dJcbI52FRY6In2BNxkqpNyfprt
ACTUAL -
java.lang.ArrayIndexOutOfBoundsException: Index 255 out of bounds for length 10
at javafx.graphics/com.sun.javafx.font.CompositeStrike.getStrikeSlot(CompositeStrike.java:120)
at javafx.graphics/com.sun.javafx.font.CompositeStrike.getGlyph(CompositeStrike.java:163)
at javafx.graphics/com.sun.prism.sw.SWGraphics.drawGlyph(SWGraphics.java:632)
at javafx.graphics/com.sun.prism.sw.SWGraphics.drawString(SWGraphics.java:617)
at javafx.graphics/com.sun.javafx.sg.prism.NGText.renderText(NGText.java:312)
at javafx.graphics/com.sun.javafx.sg.prism.NGText.renderContent2D(NGText.java:270)
at javafx.graphics/com.sun.javafx.sg.prism.NGShape.renderContent(NGShape.java:261)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:479)
at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:328)
at javafx.graphics/com.sun.javafx.tk.quantum.UploadingPainter.run(UploadingPainter.java:142)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
at javafx.graphics/com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
at java.base/java.lang.Thread.run(Thread.java:834)
---------- BEGIN SOURCE ----------
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
public class BigGlyphIDTest extends Application {
private static String OS = System.getProperty("os.name").toLowerCase();
public void start(Stage stage) {
if (OS.indexOf("win") < 0) {
System.err.println("# You need to run on Windows");
System.exit(0);
}
final String family = "Unifont";
// download GNU Unifont and install
// http://www.unifoundry.com/unifont.html
// http://unifoundry.com/pub/unifont-11.0.01/font-builds/unifont-11.0.01.ttf
Font font = Font.font(family, 48.0);
if (font == null || !family.equals(font.getFamily())) {
System.err.println("# You need to install font "+family);
System.exit(0);
}
stage.setWidth(100);
stage.setHeight(100);
Group g = new Group();
final Scene scene = new Scene(new Group());
VBox box = new VBox();
((Group)scene.getRoot()).getChildren().add(box);
stage.setScene(scene);
// Unicode(GlyphID)
Text txt = new Text("\u8002\u0362"); // U+8002(32773) + U+0362(869)
txt.setFont(font);
box.getChildren().add(txt);
stage.show();
}
}
---------- END SOURCE ----------
FREQUENCY : always
Also all Windows
# NOTICE
Now Windows API provide glyphIndices as UINT16.
Exsample)
https://msdn.microsoft.com/en-us/library/windows/desktop/dd316625%28v=vs.85%29.aspx
But originally, Windows API should provide as UINT32.
Because CMAP Format 8,12,13 have UINT32.
https://docs.microsoft.com/en-us/typography/opentype/spec/cmap
https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6cmap.html
A DESCRIPTION OF THE PROBLEM :
When display particular glyph (glyphID is larger than 32767 and complex char),
Java errors ArrayIndexOutOfBoundsException.
This bug occurs only when all of the following conditions are satisfied.
1. on Windows
2. font has glyphID larger than 32767 (max value of signed short)
3. font has complex character. (isComplexCharCode() return true)
Now I doing pull request.
https://github.com/javafxports/openjdk-jfx/pull/125
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Please run following BigGlyphIDTest.java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Display glyphs without errors.
https://drive.google.com/open?id=1b9xmr7dJcbI52FRY6In2BNxkqpNyfprt
ACTUAL -
java.lang.ArrayIndexOutOfBoundsException: Index 255 out of bounds for length 10
at javafx.graphics/com.sun.javafx.font.CompositeStrike.getStrikeSlot(CompositeStrike.java:120)
at javafx.graphics/com.sun.javafx.font.CompositeStrike.getGlyph(CompositeStrike.java:163)
at javafx.graphics/com.sun.prism.sw.SWGraphics.drawGlyph(SWGraphics.java:632)
at javafx.graphics/com.sun.prism.sw.SWGraphics.drawString(SWGraphics.java:617)
at javafx.graphics/com.sun.javafx.sg.prism.NGText.renderText(NGText.java:312)
at javafx.graphics/com.sun.javafx.sg.prism.NGText.renderContent2D(NGText.java:270)
at javafx.graphics/com.sun.javafx.sg.prism.NGShape.renderContent(NGShape.java:261)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:479)
at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:328)
at javafx.graphics/com.sun.javafx.tk.quantum.UploadingPainter.run(UploadingPainter.java:142)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
at javafx.graphics/com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
at java.base/java.lang.Thread.run(Thread.java:834)
---------- BEGIN SOURCE ----------
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
public class BigGlyphIDTest extends Application {
private static String OS = System.getProperty("os.name").toLowerCase();
public void start(Stage stage) {
if (OS.indexOf("win") < 0) {
System.err.println("# You need to run on Windows");
System.exit(0);
}
final String family = "Unifont";
// download GNU Unifont and install
// http://www.unifoundry.com/unifont.html
// http://unifoundry.com/pub/unifont-11.0.01/font-builds/unifont-11.0.01.ttf
Font font = Font.font(family, 48.0);
if (font == null || !family.equals(font.getFamily())) {
System.err.println("# You need to install font "+family);
System.exit(0);
}
stage.setWidth(100);
stage.setHeight(100);
Group g = new Group();
final Scene scene = new Scene(new Group());
VBox box = new VBox();
((Group)scene.getRoot()).getChildren().add(box);
stage.setScene(scene);
// Unicode(GlyphID)
Text txt = new Text("\u8002\u0362"); // U+8002(32773) + U+0362(869)
txt.setFont(font);
box.getChildren().add(txt);
stage.show();
}
}
---------- END SOURCE ----------
FREQUENCY : always