Package: openjdk-7-jre
Version: 7~b147-2.0-1
Severity: normal

Dear Maintainer,

OpenJDK returns incorrect TrueType font height (greater than real value)
under some conditions, this makes JasperReports (Java reporting library)
not to work correctly on OpenJDK 6/7.


Problem
=======

On OpenJDK JRE and using some TrueType font, JasperReports does not
display text element which height is just the same as the font size
eg. { height="8", size="8", font="IPA mincho" }.

JasperReports checks the text size before drawing the text elements.
If (ascent + descent) of text is greater than the height of text
element, this text is not drawn.

In above case, Sun Java returns the same height (ascent + descent =
fontsize), but OpenJDK returns the text height greater than font size,
so not drawn.


Sample code (includes Japanese char)
===================================

import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
public class JavaApplication1 {
    public static void main(String[] args) throws Exception {
        Font f = new Font("IPA明朝",Font.PLAIN, 8);
        TextLayout layout = new TextLayout("IPA明朝", f,
                new FontRenderContext(null, true, true));
        System.out.println("Ascent:  " + layout.getAscent());
        System.out.println("Descent: " + layout.getDescent());
    }
}


Result of this code
===================

Sun Java 6 (sun-java6-jre 6.26-0squeeze1)
> Ascent:  7.0390625
> Descent: 0.9609375

OpenJDK 6 (openjdk-6-jre 6b24~pre2-1)
> Ascent:  7.046875
> Descent: 0.96875

OpenJDK 7 (openjdk-7-jre 7~b147-2.0-1)
> Ascent:  7.046875
> Descent: 0.96875

Sun Java returns correct height, but OpenJDK returns greater value
than Sun's.


Analysis of Source code
=======================

In OpenJDK6/7 native method sun.font.FreetypeFontScaler.getFontMetricsNative():

jdk/src/share/native/sun/font/freetypeScaler.c
>JNIEXPORT jobject JNICALL
>Java_sun_font_FreetypeFontScaler_getFontMetricsNative(
>        JNIEnv *env, jobject scaler, jobject font2D,
>        jlong pScalerContext, jlong pScaler) {
(snip)
>    /* ascent */
>    ax = 0;
>    ay = -(jfloat) FT26Dot6ToFloat(FT_MulFix(
>                       ((jlong) scalerInfo->face->ascender + bmodifier/2),
>                       (jlong) scalerInfo->face->size->metrics.y_scale));
>    /* descent */
>    dx = 0;
>    dy = -(jfloat) FT26Dot6ToFloat(FT_MulFix(
>                       ((jlong) scalerInfo->face->descender + bmodifier/2),
>                       (jlong) scalerInfo->face->size->metrics.y_scale));
(snip)
>    metrics = (*env)->NewObject(env,
>                                sunFontIDs.strikeMetricsClass,
>                                sunFontIDs.strikeMetricsCtr,
>                                ax, ay, dx, dy, bx, by, lx, ly, mx, my);
>
>    return metrics;
>}

This code uses FT_MulFix to convert size. But FT_MulFix sometimes rounds
up and loses precision.

In FreeType2's FT_MulFix:

freetype-2.4.8/src/base/ftcalc.c
>   c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 );

If both ascent and descent are rounded up, (ascent + descent) is greater
than original height.

In the sample case (IPA mincho font),
  bmodifier = 0
  scalerInfo->face->ascender = 1802L
  scalerInfo->face->descender = -246L
  scalerInfo->face->size->metrics.y_scale = 16384L

In this case, 1802 mod 4 = 2 and 246 mod 4 = 2, so both are rounded up.
This causes (ay + dy) > font-size.

(Note: (Sun) 1802.0/256.0 = 7.0390625, (OpenJDK) 1804.0/256.0 = 7.046875)


Suggested fix
=============

 Fix to keep the precision in the font metrics conversion in
 Java_sun_font_FreetypeFontScaler_getFontMetricsNative().


Version of packages
===================

OpenJDK:
  see below.

JasperReports:
  upstream 4.1.3 jar.

IPA TrueType fonts:
  ii  fonts-ipafont          00303-5
  ii  fonts-ipafont-gothic   00303-5
  ii  fonts-ipafont-mincho   00303-5


Reportbug output
================

-- System Information:
Debian Release: wheezy/sid
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'testing'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 3.1.0-1-amd64 (SMP w/4 CPU cores)
Locale: LANG=ja_JP.UTF-8, LC_CTYPE=ja_JP.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages openjdk-7-jre depends on:
ii  libaccess-bridge-java-jni  1.26.2-8
ii  libasound2                 1.0.24.1-4
ii  libatk1.0-0                2.2.0-2
ii  libc6                      2.13-24
ii  libcairo2                  1.10.2-6.2
ii  libcups2                   1.5.0-13
ii  libfontconfig1             2.8.0-3
ii  libfreetype6               2.4.8-1
ii  libgdk-pixbuf2.0-0         2.24.0-2
ii  libgif4                    4.1.6-9
ii  libglib2.0-0               2.30.2-4
ii  libgtk2.0-0                2.24.8-3
ii  libjpeg8                   8c-2
ii  libpango1.0-0              1.29.4-2
ii  libpng12-0                 1.2.46-4
ii  libpulse0                  1.0-4
ii  libx11-6                   2:1.4.4-4
ii  libxext6                   2:1.3.0-3
ii  libxi6                     2:1.4.5-1
ii  libxrender1                1:0.9.6-2
ii  libxtst6                   2:1.2.0-4
ii  openjdk-7-jre-headless     7~b147-2.0-1
ii  zlib1g                     1:1.2.3.4.dfsg-3

Versions of packages openjdk-7-jre recommends:
ii  ttf-dejavu-extra  2.33-2

Versions of packages openjdk-7-jre suggests:
pn  icedtea6-plugin  <none>

-- no debconf information



-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to