public VisualContext(VisualContext parent, BoxFactory factory) { this.parent = parent; this.factory = factory; rootContext = (parent == null) ? this : parent.rootContext; em = CSSUnits.medium_font; rem = em; ex = 0.6 * em; ch = 0.8 * ch; // just an initial guess, updated in updateForGraphics() dpi = org.fit.cssbox.css.CSSUnits.dpi; font = new Font(Font.SERIF, Font.PLAIN, (int) CSSUnits.medium_font); fontSize = CSSUnits.points(CSSUnits.medium_font); fontWeight = CSSProperty.FontWeight.NORMAL; fontStyle = CSSProperty.FontStyle.NORMAL; fontVariant = CSSProperty.FontVariant.NORMAL; textDecoration = new ArrayList<CSSProperty.TextDecoration>( 2); // it is not very probable to have more than two decorations color = Color.BLACK; }
/** * 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(); }