Source: openjdk-8
Severity: normal
Tags: patch

Dear Maintainer,

Problem
=======

java.awt.Font#deriveFont(int style) tries to create new Font instance
that has the same font size. But it uses rounded font size wrongly.
So derived font has different font size.
(openjdk-7 has a same problem.)


Sample code
===========

import java.awt.Font;

public class DeriveFontProblem {
    public static void main(String[] args) {
        Font fontBase = new Font("Helvetica", Font.PLAIN, 1);
        Font font105 = fontBase.deriveFont(10.5f);
        System.out.println("font105     : size=" + font105.getSize2D());
        Font font105Plain = font105.deriveFont(Font.PLAIN);
        System.out.println("font105Plain: size=" + font105Plain.getSize2D());
    }
}


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

Actual
>font105     : size=10.5
>font105Plain: size=11.0

Expected
>font105     : size=10.5
>font105Plain: size=10.5


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

Font#deriveFont(int style) should use (float) "pointSize", not (int) "size".
Here is a patch to fix:

--- java/awt/Font.java.orig    2016-08-12 01:03:10.703646834 +0900
+++ java/awt/Font.java    2016-08-12 01:02:43.091646225 +0900
@@ -1933,7 +1933,7 @@
      */
     public Font deriveFont(int style){
         if (values == null) {
-           return new Font(name, style, size, createdFont, font2DHandle);
+           return new Font(name, style, pointSize, createdFont, font2DHandle);
         }
         AttributeValues newValues = getAttributeValues().clone();
         int oldStyle = (this.style != style) ? this.style : -1;


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

-- System Information:
Debian Release: stretch/sid
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'oldstable-updates'), (500,
'unstable'), (500, 'oldstable')
Architecture: amd64 (x86_64)

Kernel: Linux 3.14-2-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
Init: unable to detect

Reply via email to