summaryrefslogtreecommitdiff
path: root/gnu/javax/swing/text/html/css/FontSize.java
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/javax/swing/text/html/css/FontSize.java')
-rw-r--r--gnu/javax/swing/text/html/css/FontSize.java129
1 files changed, 123 insertions, 6 deletions
diff --git a/gnu/javax/swing/text/html/css/FontSize.java b/gnu/javax/swing/text/html/css/FontSize.java
index 19e1d701a..7dc8d46c6 100644
--- a/gnu/javax/swing/text/html/css/FontSize.java
+++ b/gnu/javax/swing/text/html/css/FontSize.java
@@ -52,6 +52,24 @@ public class FontSize
private String value;
/**
+ * The actual font size.
+ */
+ private int size;
+
+ /**
+ * The index of one of the standard sizes that this font size maps to.
+ * This is -1 if this fontsize doesn't map to one of the standard sizes.
+ *
+ * @see #SCALE
+ */
+ private int sizeIndex;
+
+ /**
+ * True when this font size is relative.
+ */
+ private boolean isRelative;
+
+ /**
* The default size for 'medium' absolute size. The other absolute sizes
* are calculated from this.
*/
@@ -70,6 +88,27 @@ public class FontSize
public FontSize(String val)
{
value = val;
+ sizeIndex = -1;
+ isRelative = false;
+ size = mapValue();
+ }
+
+ /**
+ * Returns the font size value.
+ *
+ * @return the font size value
+ */
+ public int getValue(int p)
+ {
+ if (isRelative)
+ mapRelative(p);
+ return size;
+ }
+
+ public int getValue()
+ {
+ assert ! isRelative;
+ return size;
}
/**
@@ -77,17 +116,21 @@ public class FontSize
*
* @return the converted real value in point
*/
- public int getValue()
+ private int mapValue()
{
int intVal;
if (value.contains("pt"))
intVal = mapPoints();
else if (value.contains("px"))
intVal = mapPixels();
+ else if (value.contains("em") || value.contains("%")
+ || value.contains("larger") || value.contains("smaller"))
+ {
+ intVal = -1;
+ isRelative = true;
+ }
else
intVal = mapAbsolute();
- // FIXME: Allow relative font values, ('larger' and 'smaller'). This
- // requires knowledge about the parent element's font size.
return intVal;
}
@@ -111,10 +154,65 @@ public class FontSize
*/
private int mapPixels()
{
- int end = value.indexOf("pt");
+ int end = value.indexOf("px");
+ if (end == -1)
+ end = value.length();
String number = value.substring(0, end);
- int intVal = Integer.parseInt(number);
- return intVal;
+ try
+ {
+ int intVal = Integer.parseInt(number);
+ return intVal;
+ }
+ catch (NumberFormatException ex)
+ {
+ return DEFAULT_FONT_SIZE;
+ }
+ }
+
+ private int mapPercent(int par)
+ {
+ int end = value.indexOf("%");
+ if (end == -1)
+ end = value.length();
+ String number = value.substring(0, end);
+ try
+ {
+ int intVal = Integer.parseInt(number);
+ return intVal * par / 100;
+ }
+ catch (NumberFormatException ex)
+ {
+ System.err.println("couldn't map value: '" + value + "'");
+ return DEFAULT_FONT_SIZE;
+ }
+ }
+
+ private int mapEM(int par)
+ {
+ int end = value.indexOf("em");
+ if (end == -1)
+ end = value.length();
+ String number = value.substring(0, end);
+ try
+ {
+ float factor = Float.parseFloat(number);
+ // FIXME: Should be relative to the parent element's size.
+ return (int) (factor * par);
+ }
+ catch (NumberFormatException ex)
+ {
+ return DEFAULT_FONT_SIZE;
+ }
+ }
+
+ private int mapSmaller(int par)
+ {
+ return (int) (par * 0.9);
+ }
+
+ private int mapLarger(int par)
+ {
+ return (int) (par * 0.9);
}
/**
@@ -143,6 +241,7 @@ public class FontSize
// FIXME: Scale the real medium size of the document, rather than the
// constant here.
int intVal = (int) (scale * DEFAULT_FONT_SIZE);
+ sizeIndex = index;
return intVal;
}
@@ -153,4 +252,22 @@ public class FontSize
{
return value;
}
+
+ private int mapRelative(int par)
+ {
+ if (value.contains("%"))
+ size = mapPercent(par);
+ else if (value.contains("em"))
+ size = mapEM(par);
+ else if (value.contains("larger"))
+ size = mapLarger(par);
+ else if (value.contains("smaller"))
+ size = mapSmaller(par);
+ return size;
+ }
+
+ public boolean isRelative()
+ {
+ return isRelative;
+ }
}