package com.xenoage.zong.io.musicxml.in.readers;
import static com.xenoage.utils.collections.CList.ilist;
import java.util.List;
import lombok.RequiredArgsConstructor;
import com.xenoage.utils.annotations.MaybeNull;
import com.xenoage.utils.collections.IList;
import com.xenoage.utils.font.FontInfo;
import com.xenoage.utils.font.FontStyle;
import com.xenoage.zong.musicxml.types.attributes.MxlFont;
import com.xenoage.zong.musicxml.types.attributes.MxlFontSize;
import com.xenoage.zong.musicxml.types.attributes.MxlPrintStyle;
import com.xenoage.zong.musicxml.types.enums.MxlCSSFontSize;
import com.xenoage.zong.musicxml.types.enums.MxlFontStyle;
import com.xenoage.zong.musicxml.types.enums.MxlFontWeight;
import com.xenoage.zong.musicxml.types.util.MxlPrintStyleContent;
/**
* This class reads elements containing a font-group into
* {@link FontInfo} objects.
*
* @author Andreas Wenger
*/
@RequiredArgsConstructor
public class FontInfoReader {
private final MxlFont mxlFont;
private final FontInfo defaultFont;
/**
* Reads the font from the given element, if it is a {@link MxlPrintStyleContent} element
* and contains font information. The returned font is based on the given default font.
*/
@MaybeNull public static FontInfo read(Object printStyleElement, FontInfo defaultFont) {
if (false == printStyleElement instanceof MxlPrintStyleContent)
return null;
MxlPrintStyle mxlPrintStyle = ((MxlPrintStyleContent) printStyleElement).getPrintStyle();
MxlFont mxlFont = mxlPrintStyle.getFont();
return new FontInfoReader(mxlFont, defaultFont).read();
}
@MaybeNull public FontInfo read() {
IList<String> families = readFamilies();
Float size = readSize();
FontStyle style = readStyle();
return new FontInfo(families, size, style);
}
private FontStyle readStyle() {
FontStyle style = defaultFont.getStyleOrNull();
//font style
MxlFontStyle mxlStyle = mxlFont.getFontStyle();
if (mxlStyle != MxlFontStyle.Unknown) {
boolean isItalic = mxlStyle == MxlFontStyle.Italic;
style = style.with(FontStyle.Italic, isItalic);
}
//font weight
MxlFontWeight mxlWeight = mxlFont.getFontWeight();
if (mxlWeight != null) {
boolean isBold = mxlWeight == MxlFontWeight.Bold;
style = style.with(FontStyle.Bold, isBold);
}
return style;
}
private IList<String> readFamilies() {
List<String> mxlFamilies = mxlFont.getFontFamily();
IList<String> families = null;
if (mxlFamilies.size() == 0)
mxlFamilies = defaultFont.getFamiliesOrNull();
if (mxlFamilies != null)
families = ilist(mxlFamilies);
return families;
}
private Float readSize() {
MxlFontSize mxlSize = mxlFont.getFontSize();
if (mxlSize.getValuePt() != null)
return mxlSize.getValuePt();
else if (mxlSize.getValueCSS() != null)
return readCSSFontSize(mxlSize.getValueCSS());
else
return defaultFont.getSizeOrNull();
}
private float readCSSFontSize(MxlCSSFontSize mxlCSSSize) {
switch (mxlCSSSize) {
case XXSmall:
return 6f;
case XSmall:
return 8f;
case Small:
return 10f;
case Medium:
return 12f;
case Large:
return 16f;
case XLarge:
return 20f;
case XXLarge:
return 28f;
}
throw new IllegalArgumentException("Unknown font-size: " + mxlCSSSize);
}
}