/** * Scans a list of font definitions and chooses the first one that is available * * @param list of terms obtained from the font-family property * @return a font name string according to java.awt.Font */ public String getFontName(TermList list) { String avail[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); for (Term<?> term : list) { Object value = term.getValue(); if (value instanceof CSSProperty.FontFamily) return ((CSSProperty.FontFamily) value).getAWTValue(); else { String name = fontAvailable(value.toString(), avail); if (name != null) return name; } } // nothing found, use Serif return java.awt.Font.SERIF; }
/** * Updates the context according to the given element style. The properties that are not defined * in the style are left unchanged. * * @param style the style data */ public void update(NodeData style) { // setup the font String family = null; CSSProperty.FontFamily ff = style.getProperty("font-family"); if (ff == null) family = font.getFamily(); // use current else if (ff == FontFamily.list_values) { TermList fmlspec = style.getValue(TermList.class, "font-family"); if (fmlspec == null) family = font.getFamily(); else family = getFontName(fmlspec); } else { if (factory != null) family = factory .getConfig() .getDefaultFont(ff.getAWTValue()); // try to translate to physical font if (family == null) family = ff.getAWTValue(); // could not translate - use as is } double size; double psize = (parent == null) ? CSSUnits.medium_font : parent.getEm(); CSSProperty.FontSize fsize = style.getProperty("font-size"); if (fsize == null) size = em; else if (fsize == CSSProperty.FontSize.length || fsize == CSSProperty.FontSize.percentage) { TermLengthOrPercent lenspec = style.getValue(TermLengthOrPercent.class, "font-size"); if (lenspec != null) { em = psize; size = pxLength(lenspec, psize); // pixels are ok here (java is fixed to 72 dpi for font sizes) } else size = em; } else size = CSSUnits.convertFontSize(psize, fsize); fontSize = CSSUnits.points(size); if (rootContext != null) rem = rootContext.getEm(); else rem = em; // we don't have a root context? CSSProperty.FontWeight weight = style.getProperty("font-weight"); if (weight != null) fontWeight = weight; CSSProperty.FontStyle fstyle = style.getProperty("font-style"); if (fstyle != null) fontStyle = fstyle; int fs = Font.PLAIN; if (representsBold(fontWeight)) fs = Font.BOLD; if (fontStyle == CSSProperty.FontStyle.ITALIC || fontStyle == CSSProperty.FontStyle.OBLIQUE) fs = fs | Font.ITALIC; font = new Font(family, fs, (int) Math.round(size)); em = size; CSSProperty.FontVariant variant = style.getProperty("font-variant"); if (variant != null) fontVariant = variant; CSSProperty.TextDecoration decor = style.getProperty("text-decoration"); textDecoration.clear(); if (decor != null) { if (decor == TextDecoration.list_values) { TermList list = style.getValue(TermList.class, "text-decoration"); for (Term<?> t : list) { if (t.getValue() instanceof CSSProperty.TextDecoration) textDecoration.add((CSSProperty.TextDecoration) t.getValue()); } } else if (decor != TextDecoration.NONE) textDecoration.add(decor); } // color TermColor clr = style.getValue(TermColor.class, "color"); if (clr != null) color = clr.getValue(); }