]> source.dussan.org Git - poi.git/commitdiff
[bug-64605] add support for non-integer font sizes on character runs (use double...
authorPJ Fanning <fanningpj@apache.org>
Thu, 16 Jul 2020 12:50:40 +0000 (12:50 +0000)
committerPJ Fanning <fanningpj@apache.org>
Thu, 16 Jul 2020 12:50:40 +0000 (12:50 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1879950 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/wp/usermodel/CharacterRun.java
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDefaultRunStyle.java
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java
src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFStyles.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/CharacterRun.java

index 81117c2bd214800aaecfe2f816408a8c4859a39a..28dc89016eaf901989c6cfdb1a933584d71c35f8 100644 (file)
@@ -48,9 +48,9 @@ public interface CharacterRun {
     void setImprinted(boolean imprint);
 
     int getFontSize();
-    float getFontSizeAsFloat();
+    Double getFontSizeAsDouble();
     void setFontSize(int halfPoints);
-    void setFontSize(float halfPoints);
+    void setFontSize(double halfPoints);
 
     int getCharacterSpacing();
     void setCharacterSpacing(int twips);
index 60c2f272dcea942ac5ebbe24b1339661d2a1ffa3..884949d6d7c581defd9cb66fc203a4ea56fd6b29 100644 (file)
@@ -19,6 +19,9 @@ package org.apache.poi.xwpf.usermodel;
 
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
 /**
  * Default Character Run style, from which other styles will override
  * TODO Share logic with {@link XWPFRun} which also uses CTRPr
@@ -35,8 +38,18 @@ public class XWPFDefaultRunStyle {
     }
 
     public int getFontSize() {
-        if (rpr.isSetSz())
-            return rpr.getSz().getVal().intValue() / 2;
-        return -1;
+        BigDecimal bd = getFontSizeAsBigDecimal(0);
+        return bd == null ? -1 : bd.intValue();
+    }
+
+    public Double getFontSizeAsDouble() {
+        BigDecimal bd = getFontSizeAsBigDecimal(1);
+        return bd == null ? null : bd.doubleValue();
+    }
+
+    private BigDecimal getFontSizeAsBigDecimal(int scale) {
+        return (rpr != null && rpr.isSetSz()) ?
+                new BigDecimal(rpr.getSz().getVal()).divide(BigDecimal.valueOf(2)).setScale(scale, RoundingMode.HALF_UP) :
+                null;
     }
 }
index 7ff89ee11c7c8cf4da728359311e5c73ed1e76db..b35f9a3105223c166e96bd75236e750d71c55cae 100644 (file)
@@ -868,13 +868,14 @@ public class XWPFRun implements ISDTContents, IRunElement, CharacterRun {
      * characters in the contents of this run when displayed.
      *
      * @return value representing the font size (non-integer size will be rounded with half rounding up)
-     * @deprecated use {@link #getFontSizeAsFloat()}
+     * @deprecated use {@link #getFontSizeAsDouble()}
      */
     @Deprecated
     @Removal(version = "6.0.0")
     @Override
     public int getFontSize() {
-        return getFontSizeAsBigDecimal(0).intValue();
+        BigDecimal bd = getFontSizeAsBigDecimal(0);
+        return bd == null ? -1 : bd.intValue();
     }
 
     /**
@@ -885,15 +886,16 @@ public class XWPFRun implements ISDTContents, IRunElement, CharacterRun {
      * @since POI 5.0.0
      */
     @Override
-    public float getFontSizeAsFloat() {
-        return getFontSizeAsBigDecimal(1).floatValue();
+    public Double getFontSizeAsDouble() {
+        BigDecimal bd = getFontSizeAsBigDecimal(1);
+        return bd == null ? null : bd.doubleValue();
     }
 
     private BigDecimal getFontSizeAsBigDecimal(int scale) {
         CTRPr pr = getRunProperties(false);
         return (pr != null && pr.isSetSz()) ?
                 new BigDecimal(pr.getSz().getVal()).divide(BigDecimal.valueOf(2)).setScale(scale, RoundingMode.HALF_UP) :
-                BigDecimal.valueOf(-1);
+                null;
     }
 
     /**
@@ -930,7 +932,7 @@ public class XWPFRun implements ISDTContents, IRunElement, CharacterRun {
      * @since POI 5.0.0
      */
     @Override
-    public void setFontSize(float size) {
+    public void setFontSize(double size) {
         BigDecimal bd = BigDecimal.valueOf(size);
         CTRPr pr = getRunProperties(true);
         CTHpsMeasure ctSize = pr.isSetSz() ? pr.getSz() : pr.addNewSz();
index c361b5337cc5497a7c26695ae85c4ef625f1cac3..b91e0a58916c403f91c91b04e713210b25bb49a0 100644 (file)
@@ -183,7 +183,7 @@ public class TestXWPFRun {
 
         XWPFRun run = new XWPFRun(ctRun, irb);
         assertEquals(7, run.getFontSize());
-        assertEquals(7.0f, run.getFontSizeAsFloat(), 0.01);
+        assertEquals(7.0, run.getFontSizeAsDouble(), 0.01);
 
         run.setFontSize(24);
         assertEquals(48, rpr.getSz().getVal().longValue());
@@ -191,7 +191,7 @@ public class TestXWPFRun {
         run.setFontSize(24.5f);
         assertEquals(49, rpr.getSz().getVal().longValue());
         assertEquals(25, run.getFontSize());
-        assertEquals(24.5f, run.getFontSizeAsFloat(), 0.01);
+        assertEquals(24.5, run.getFontSizeAsDouble(), 0.01);
     }
 
     @Test
index d03a13b958ee6ab3a62b9fe1d840c2e8ae8abcc4..c429c7434e0c4413d0add6d1d08c85d0b54a00a1 100644 (file)
@@ -202,6 +202,7 @@ public final class TestXWPFStyles {
             assertNotNull(styles.getDefaultParagraphStyle());
 
             assertEquals(11, styles.getDefaultRunStyle().getFontSize());
+            assertEquals(11.0, styles.getDefaultRunStyle().getFontSizeAsDouble(), 0.01);
             assertEquals(200, styles.getDefaultParagraphStyle().getSpacingAfter());
         }
     }
index 530196eb26d231d7ca2dae21e1a12b55b4a8cad1..4e51c747de46909f7640df68d65b8d55c537e50a 100644 (file)
@@ -352,9 +352,9 @@ public final class CharacterRun extends Range implements Duplicatable, org.apach
     return _props.getHps();
   }
 
-  public float getFontSizeAsFloat()
+  public Double getFontSizeAsDouble()
   {
-    return (float)getFontSize();
+    return (double)getFontSize();
   }
 
   public void setFontSize(int halfPoints)
@@ -365,7 +365,7 @@ public final class CharacterRun extends Range implements Duplicatable, org.apach
 
   }
 
-  public void setFontSize(float halfPoints)
+  public void setFontSize(double halfPoints)
   {
     setFontSize(BigDecimal.valueOf(halfPoints).setScale(0, RoundingMode.HALF_UP).intValue());
   }