4 * License : The MIT License
5 * Copyright(c) 2011 MikuToga Partners
8 package jp.sourceforge.mikutoga.vmd.model.xml;
10 import java.util.Iterator;
11 import jp.sourceforge.mikutoga.vmd.model.BezierParam;
12 import jp.sourceforge.mikutoga.vmd.model.PosCurve;
13 import jp.sourceforge.mikutoga.xml.DomNsUtils;
14 import jp.sourceforge.mikutoga.xml.SiblingElemIterator;
15 import jp.sourceforge.mikutoga.xml.TogaXmlException;
16 import org.w3c.dom.Element;
20 * <p>VMDに特化したDomNsUtilsのWrapper群や共通要素の共通処理を含む。
21 * <p>要素に関する名前空間は{@link VmdXmlResources.NS_VMDXML}が暗黙で用いられる。
22 * <p>非グローバル属性に関する名前空間は{@NS_NULL}が暗黙で用いられる。
23 * @see jp.sourceforge.mikutoga.xml.DomNsUtils
28 static final String NS_NULL = null;
36 throw new AssertionError();
43 * @param localName ローカル名。
44 * @return ローカル名が一致する要素であればtrue
46 static boolean hasNsLocalNameElem(Element elem,
48 return DomNsUtils.hasNsLocalNameElem(elem,
49 VmdXmlResources.NS_VMDXML,
54 * ローカル名に合致する最初の直下子要素を返す。
56 * @param localName 子要素名
57 * @return 最初の直下子要素。見つからなければnull。
59 static Element pickChild(Element parent, String localName){
60 return DomNsUtils.pickFirstChild(parent,
61 VmdXmlResources.NS_VMDXML,
66 * ローカル名に合致する最初の直下子要素を返す。
69 * @param localName 子要素名
71 * @throws TogaXmlException 1つも見つからなかった
73 static Element getChild(Element parent, String localName)
74 throws TogaXmlException{
75 return DomNsUtils.getFirstChild(parent,
76 VmdXmlResources.NS_VMDXML,
81 * 指定された名前の子要素のforeachを返す。
83 * @param localName 子要素名
86 static Iterable<Element> eachChild(Element parent, String localName){
87 return DomNsUtils.getEachChild(parent,
88 VmdXmlResources.NS_VMDXML,
93 * 要素からxsd:string型属性値を読み取る。
97 * @throws TogaXmlException 属性値が見つからなかった。
99 static String getStringAttr(Element elem, String attrName)
100 throws TogaXmlException{
101 return DomNsUtils.getStringAttrNS(elem, NS_NULL, attrName);
105 * 要素からxsd:boolean型属性値を読み取る。
107 * @param attrName 属性名
109 * @throws TogaXmlException 属性値が見つからなかった。
111 static boolean getBooleanAttr(Element elem, String attrName)
112 throws TogaXmlException{
113 return DomNsUtils.getBooleanAttrNS(elem, NS_NULL, attrName);
117 * 要素からxsd:integer型属性値を読み取る。
119 * @param attrName 属性名
121 * @throws TogaXmlException 属性値が見つからなかった。
123 static int getIntegerAttr(Element elem, String attrName)
124 throws TogaXmlException{
125 return DomNsUtils.getIntegerAttrNS(elem, NS_NULL, attrName);
129 * 要素から符号付きbyte型整数属性値を読み取る。
131 * @param attrName 属性名
133 * @throws TogaXmlException 属性値が見つからなかった。
135 static byte getByteAttr(Element elem, String attrName)
136 throws TogaXmlException{
137 int iVal = getIntegerAttr(elem, attrName);
138 byte result = (byte) iVal;
143 * 要素からxsd:float型属性値を読み取る。
145 * @param attrName 属性名
147 * @throws TogaXmlException 属性値が見つからなかった。
149 static float getFloatAttr(Element elem, String attrName)
150 throws TogaXmlException{
151 return DomNsUtils.getFloatAttrNS(elem, NS_NULL, attrName);
155 * ベジェ曲線による補間カーブ記述を読み込む。
156 * @param elem defLinear,defEaseInOut,bezier要素のいずれか
157 * @param bezier ベジェ曲線
158 * @throws TogaXmlException 構文エラー
160 static void setBezier(Element elem, BezierParam bezier)
161 throws TogaXmlException{
167 if(hasNsLocalNameElem(elem, "defLinear")){
168 p1x = BezierParam.DEF_P1X;
169 p1y = BezierParam.DEF_P1Y;
170 p2x = BezierParam.DEF_P2X;
171 p2y = BezierParam.DEF_P2Y;
172 }else if(hasNsLocalNameElem(elem, "defEaseInOut")){
173 p1x = BezierParam.EIO_P1X;
174 p1y = BezierParam.EIO_P1Y;
175 p2x = BezierParam.EIO_P2X;
176 p2y = BezierParam.EIO_P2Y;
177 }else if(hasNsLocalNameElem(elem, "bezier")){
178 p1x = getByteAttr(elem, "p1x");
179 p1y = getByteAttr(elem, "p1y");
180 p2x = getByteAttr(elem, "p2x");
181 p2y = getByteAttr(elem, "p2y");
184 throw new AssertionError();
187 bezier.setP1(p1x, p1y);
188 bezier.setP2(p2x, p2y);
195 * @param parentElem 親要素
196 * @param bezier 補間カーブ
197 * @throws TogaXmlException 構文エラー
199 static void buildCurve(Element parentElem, BezierParam bezier)
200 throws TogaXmlException{
201 Element bezierElem = pickChild(parentElem, null);
202 if(bezierElem == null) return;
204 setBezier(bezierElem, bezier);
211 * @param positionElem 親要素
212 * @param curve 位置補間カーブ
213 * @throws TogaXmlException 構文エラー
215 static void buildPosCurve(Element positionElem, PosCurve curve)
216 throws TogaXmlException{
217 Iterator<Element> it =
218 new SiblingElemIterator(positionElem,
219 VmdXmlResources.NS_VMDXML, null);
223 Element curveElem = it.next();
224 BezierParam bz = curve.item(ct);
225 setBezier(curveElem, bz);
229 assert ct == 0 || ct == 3;