JDK-8198354 : [macOS] Corrupt Thai characters displayed in word wrapped label
  • Type: Bug
  • Component: javafx
  • Sub-Component: graphics
  • Affected Version: 8,9,10
  • Priority: P2
  • Status: Resolved
  • Resolution: Fixed
  • OS: os_x
  • CPU: generic
  • Submitted: 2018-02-16
  • Updated: 2020-01-31
  • Resolved: 2018-03-12
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 8 Other
8u192Fixed openjfx11Fixed
Related Reports
Relates :  
Description
FULL PRODUCT VERSION :
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)


ADDITIONAL OS VERSION INFORMATION :
Mac OSX Sierra Version 10.12.6

A DESCRIPTION OF THE PROBLEM :
Some thai characters are not displayed correctly when displayed in label control with word wrap enabled.







STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Display the following text in a Label or TextArea, with word wrap enabled:

������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ��������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������������������������������������������ ������������������������������������ ������������������ ��������������� ��������� ��������������������������������������� ��������������������� ������������������������������������ ��������� ��������������������� ������������ ��������������������������� ��������������������� ������������������������������������������������������ ��������������������������������������������������������������������������������� ������������������������������������������������������������������������������ ��������������������������������������� ������������������������������������������������������������������������������������������������������������ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The characters should display correctly
ACTUAL -
Some of the characters are corrupted - a set of vertical lines are shown in place instead of the expected characters

ERROR MESSAGES/STACK TRACES THAT OCCUR :
No errors or crashes

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
package test;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application
{

	@Override
	public void start(Stage stage) throws Exception 
	{
		VBox  pane = new VBox();
		String text = "������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ��������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������������������������������������������ ������������������������������������ ������������������ ��������������� ��������� ��������������������������������������� ��������������������� ������������������������������������ ��������� ��������������������� ������������ ��������������������������� ��������������������� ������������������������������������������������������ ��������������������������������������������������������������������������������� ������������������������������������������������������������������������������ ��������������������������������������� ������������������������������������������������������������������������������������������������������������ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������";
		Label label = new Label(text);
		label.setWrapText(true);
		pane.getChildren().add(label);
		Scene scene = new Scene(pane);

		stage.setWidth(500);
		stage.setHeight(500);
		stage.setScene(scene);
		
		stage.show();
	}

	public static void main(String[] arguments)
	{
		launch(arguments);
	}
}


---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
No workarounds found yet


Comments
Approved to backport to 8u-dev for 8u182.
12-03-2018

Requesting approval for 8u-dev backport. Patch submitted for fixed version - 11 applies cleanly to 8u-dev after adjusting the folder path. I have tested the patch with attached sample application with JBS and with "HelloTextArea" present in "rt/apps/toys/Hello/src/main/java/hello" with different char sets (Thai, English etc.). Unit and system test results are fine.
12-03-2018

Changeset: 8fbac224331c Author: dkumar Date: 2018-03-12 13:12 +0530 URL: http://hg.openjdk.java.net/openjfx/jfx-dev/rt/rev/8fbac224331c
12-03-2018

I don't have any comments other than the one mentioned by Murali above. +1
09-03-2018

+ 1 with nit: Regarding CTRunGetGlyphs(run, CFRangeMake(0 ,0), tempGlyphs); please remove extra space before "comma" and give one space after "comma" for CFRangeMake(0 ,0) change to CTRunGetGlyphs(run, CFRangeMake(0, 0), tempGlyphs);
09-03-2018

Thanks [~mbilla] and [~kcr]. I have incorporated the review comments and please find the updated webrev at http://cr.openjdk.java.net/~dkumar/8198354/webrev.01/ . Request you to have a look again and let me know your inputs. Kevin, As mentioned in my previous comment, I have tested the patch with attached sample application with JBS and with "HelloTextArea" present in "rt/apps/toys/Hello/src/main/java/hello" with different char sets (Thai, English, Japanese etc.). Unit and system test results are fine. Additionally I have also tested the fix today again with mixed characters (thai + english), placing characters at random places and leaving blank spaces at the start of the text. Please let me know if I need to do anymore test. We are on the same page regarding the "tempGlyphs" variable. The only reason I have chosen to use a separate variable because manual memory allocation in this part of the code has to be deallocated. But If Coretext provides the same then deallocation is not required. If I would have used preexisting variable i.e. "glyphs" then probably I need a boolean variable to distinguish who has allocated the memory plus I will have to tweak the constantness of the variable as per API's signature.
09-03-2018

I agree with most of Murali's comments. I might recommend leaving the existing check for glyphs != null on line 655, since it is preexisting code, and leaving it means it would be less likely to run into a bug in the future if the previous block were changed. It's up to you, though. As for eliminating the tempGlyphs variable, if you did that, you would need to figure out some other way to free it in the case you malloc'ed it. Seems best to leave it as coded in the .00 patch. Dipak: how much testing have you done with this?
08-03-2018

[~dkumar] Few minor nits:: 1. I think the second "if" check for glyphs (line no 655) is redundant as line no 651 ensures that glyphs is assigned a value. int i = 0; if (glyphs) { 2. You can avoid creation of tempGlyphs by directly allocating memory for "glyphs". But then we might need to remove const'ness of glyphs and need to cast away const'ness of CTRunGetGlyphsPtr as const_cast. Not sure how much worth, this effort is? 3. Please leave a space between "if" and "(" if(count == 0) { if(!glyphs) if(!tempGlyphs) { line no: 643 -> For consistency, please keep if and { in same line 4. Please correct copyright year for both files.
06-03-2018

Webrev for review - http://cr.openjdk.java.net/~mbilla/8198354/webrev.00/ I have tested the patch with attached sample application with JBS and with "HelloTextArea" present in "rt/apps/toys/Hello/src/main/java/hello" with different char sets (Thai, English, Japanese etc.). Unit and system test results are fine. Characters are shown corrupted because their glyphs are not getting updated properly. Below two files have been modified - CTGlyphLayout.java - Coretext's API "CTRunGetGlyphCount" which gives correct count of glyphs but does not update the glyph array. Instead CTRunGetGlyphs should be used which does the both. coretext.c - Usage of CTRunGetGlyphsPtr has also been corrected. As per Coretext API documentation CTRunGetGlyphsPtr may return null and it should be handled accordingly. Please refer Coretext API doc for more info - https://developer.apple.com/documentation/coretext/1509952-ctrungetglyphsptr
06-03-2018

Issue is reproducible only in macOS. High Sierra 10.13.3 - JDK results ------------------------------------------- 8u40 : Fail 8u162 : Fail 9.0.4+11 : Fail 10-ea+43 : Fail ----------------------------------------- PFA screenshot of reproducible test app. Issue is reproducible irrespective of WrapText is set true or false.
19-02-2018