private XmlElement MakeBoneRefNode(XmlDocument scml, Animation.Frame frame, Element element, int frameId,
                                           SpriteIdProvider spriteIdProvider, SymbolIdProvider symbolIdProvider)
        {
            var boneRef = scml.CreateElement(string.Empty, "bone_ref", string.Empty);
            var id      = symbolIdProvider.GetId(frame, element);

            boneRef.SetAttribute("id", id.ToString());
            boneRef.SetAttribute("timeline", (id + spriteIdProvider.IdMap.Count).ToString());
            boneRef.SetAttribute("key", frameId.ToString());
            return(boneRef);
        }
        private XmlElement MakeObjectRefNode(XmlDocument scml, Animation.Frame frame, Element element, int frameId,
                                             int elementId, SpriteIdProvider spriteIdProvider, SymbolIdProvider symbolIdProvider)
        {
            var objectRef = scml.CreateElement(string.Empty, "object_ref", string.Empty);
            var id        = spriteIdProvider.GetId(frame, element).ToString();

            objectRef.SetAttribute("id", id);
            objectRef.SetAttribute("parent", symbolIdProvider.GetId(frame, element).ToString());
            objectRef.SetAttribute("timeline", id);
            objectRef.SetAttribute("key", frameId.ToString());
            objectRef.SetAttribute("z_index", (frame.ElementCount - elementId).ToString());
            return(objectRef);
        }
        private XmlElement MakeMainlineKeyNode(XmlDocument scml, Animation.Frame frame, int frameId, int rate,
                                               SpriteIdProvider spriteIdProvider, SymbolIdProvider symbolIdProvider)
        {
            var key = scml.CreateElement(string.Empty, "key", string.Empty);

            key.SetAttribute("id", frameId.ToString());
            key.SetAttribute("time", (frameId * rate).ToString());
            var elementId = 0;

            foreach (var element in frame.ElementsList)
            {
                key.AppendChild(MakeBoneRefNode(scml, frame, element, frameId, spriteIdProvider, symbolIdProvider));
                key.AppendChild(MakeObjectRefNode(scml, frame, element, frameId, elementId++, spriteIdProvider,
                                                  symbolIdProvider));
            }

            return(key);
        }