public void PostExec(bool progressing) { m_hasButton = false; if (!m_active) { return; } m_execedFrame = -1; bool postExeced = m_postExecCount == m_lwf.execCount; if (progressing && m_playing && !m_jumped && !postExeced) { ++m_currentFrameInternal; } for (;;) { if (m_currentFrameInternal < 0 || m_currentFrameInternal >= m_totalFrames) { m_currentFrameInternal = 0; } if (m_currentFrameInternal == m_execedFrame) { break; } m_currentFrameCurrent = m_currentFrameInternal; m_execedFrame = m_currentFrameCurrent; Data data = m_lwf.data; Format.Frame frame = data.frames[ m_data.frameOffset + m_currentFrameCurrent]; int controlAnimationOffset; IObject instance; if (m_lastControlOffset == frame.controlOffset && m_lastControls == frame.controls) { controlAnimationOffset = m_lastControlAnimationOffset; if (m_skipped) { instance = m_instanceHead; while (instance != null) { if (instance.IsMovie()) { Movie movie = (Movie)instance; movie.m_attachMovieExeced = false; movie.m_attachMoviePostExeced = false; } else if (instance.IsButton()) { ((Button)instance).EnterFrame(); } instance = instance.linkInstance; } m_hasButton = m_lastHasButton; } else { for (int dlDepth = 0; dlDepth < m_data.depths; ++dlDepth) { Object obj = m_displayList[dlDepth]; if (obj != null) { if (!postExeced) { obj.matrixIdChanged = false; obj.colorTransformIdChanged = false; } if (obj.IsMovie()) { Movie movie = (Movie)obj; movie.m_attachMovieExeced = false; movie.m_attachMoviePostExeced = false; } else if (obj.IsButton()) { ((Button)obj).EnterFrame(); m_hasButton = true; } } } m_lastHasButton = m_hasButton; m_skipped = true; } } else { ++m_movieExecCount; m_instanceHead = null; m_instanceTail = null; m_lastControlOffset = frame.controlOffset; m_lastControls = frame.controls; controlAnimationOffset = -1; for (int i = 0; i < frame.controls; ++i) { Format.Control control = data.controls[frame.controlOffset + i]; switch ((Format.Control.Type)control.controlType) { case Format.Control.Type.MOVE: { Format.Place p = data.places[control.controlId]; ExecObject(p.depth, p.objectId, p.matrixId, 0, p.instanceId); } break; case Format.Control.Type.MOVEM: { Format.ControlMoveM ctrl = data.controlMoveMs[control.controlId]; Format.Place p = data.places[ctrl.placeId]; ExecObject(p.depth, p.objectId, ctrl.matrixId, 0, p.instanceId); } break; case Format.Control.Type.MOVEC: { Format.ControlMoveC ctrl = data.controlMoveCs[control.controlId]; Format.Place p = data.places[ctrl.placeId]; ExecObject(p.depth, p.objectId, p.matrixId, ctrl.colorTransformId, p.instanceId); } break; case Format.Control.Type.MOVEMC: { Format.ControlMoveMC ctrl = data.controlMoveMCs[control.controlId]; Format.Place p = data.places[ctrl.placeId]; ExecObject(p.depth, p.objectId, ctrl.matrixId, ctrl.colorTransformId, p.instanceId); } break; case Format.Control.Type.ANIMATION: if (controlAnimationOffset == -1) { controlAnimationOffset = i; } break; } } m_lastControlAnimationOffset = controlAnimationOffset; m_lastHasButton = m_hasButton; for (int dlDepth = 0; dlDepth < m_data.depths; ++dlDepth) { Object obj = m_displayList[dlDepth]; if (obj != null && obj.execCount != m_movieExecCount) { if (m_texts != null && obj.IsText()) { EraseText(obj.objectId); } obj.Destroy(); m_displayList[dlDepth] = null; } } } m_attachMovieExeced = true; if (m_attachedMovies != null) { foreach (Movie movie in m_attachedMovieList.Values) { if (movie != null) { movie.Exec(); } } } m_attachMoviePostExeced = true; instance = m_instanceHead; while (instance != null) { if (instance.IsMovie()) { Movie movie = (Movie)instance; movie.PostExec(progressing); if (!m_hasButton && movie.m_hasButton) { m_hasButton = true; } } instance = instance.linkInstance; } if (m_attachedMovies != null) { foreach (KeyValuePair <string, bool> kvp in m_detachedMovies) { string attachName = kvp.Key; Movie movie; if (m_attachedMovies.TryGetValue(attachName, out movie)) { DeleteAttachedMovie(this, movie, true, false); } } m_detachedMovies.Clear(); foreach (Movie movie in m_attachedMovieList.Values) { if (movie != null) { movie.PostExec(progressing); if (!m_hasButton && movie.m_hasButton) { m_hasButton = true; } } } } if (m_attachedLWFs != null) { m_hasButton = true; } if (!m_postLoaded) { m_postLoaded = true; if (!m_handler.Empty()) { m_handler.Call(EventType.POSTLOAD, this); } } if (controlAnimationOffset != -1 && m_execedFrame == m_currentFrameInternal) { bool animationPlayed = m_animationPlayedFrame == m_currentFrameCurrent && !m_jumped; if (!animationPlayed) { for (int i = controlAnimationOffset; i < frame.controls; ++i) { Format.Control control = data.controls[frame.controlOffset + i]; m_lwf.PlayAnimation(control.controlId, this); } } } m_animationPlayedFrame = m_currentFrameCurrent; if (m_currentFrameCurrent == m_currentFrameInternal) { m_jumped = false; } } PlayAnimation(ClipEvent.ENTERFRAME); if (!m_handler.Empty()) { m_handler.Call(EventType.ENTERFRAME, this); } m_postExecCount = m_lwf.execCount; }
public Data(byte[] bytes) { if (bytes.Length < (int)Format.Constant.HEADER_SIZE) { return; } Stream s = new MemoryStream(bytes); BinaryReader br = new BinaryReader(s); header = new Format.Header(br); if (!Check()) { return; } byte[] stringByteData = br.ReadBytes((int)header.stringBytes.length); byte[] animationByteData = br.ReadBytes((int)header.animationBytes.length); translates = new Translate[header.translate.length]; for (int i = 0; i < translates.Length; ++i) { translates[i] = new Translate(br); } matrices = new Matrix[header.matrix.length]; for (int i = 0; i < matrices.Length; ++i) { matrices[i] = new Matrix(br); } colors = new Color[header.color.length]; for (int i = 0; i < colors.Length; ++i) { colors[i] = new Color(br); } alphaTransforms = new AlphaTransform[header.alphaTransform.length]; for (int i = 0; i < alphaTransforms.Length; ++i) { alphaTransforms[i] = new AlphaTransform(br); } colorTransforms = new ColorTransform[header.colorTransform.length]; for (int i = 0; i < colorTransforms.Length; ++i) { colorTransforms[i] = new ColorTransform(br); } objects = new Format.Object[header.objectData.length]; for (int i = 0; i < objects.Length; ++i) { objects[i] = new Format.Object(br); } textures = new Format.Texture[header.texture.length]; for (int i = 0; i < textures.Length; ++i) { textures[i] = new Format.Texture(br); } textureFragments = new Format.TextureFragment[header.textureFragment.length]; for (int i = 0; i < textureFragments.Length; ++i) { textureFragments[i] = new Format.TextureFragment(br); } bitmaps = new Format.Bitmap[header.bitmap.length]; for (int i = 0; i < bitmaps.Length; ++i) { bitmaps[i] = new Format.Bitmap(br); } bitmapExs = new Format.BitmapEx[header.bitmapEx.length]; for (int i = 0; i < bitmapExs.Length; ++i) { bitmapExs[i] = new Format.BitmapEx(br); } fonts = new Format.Font[header.font.length]; for (int i = 0; i < fonts.Length; ++i) { fonts[i] = new Format.Font(br); } textProperties = new Format.TextProperty[header.textProperty.length]; for (int i = 0; i < textProperties.Length; ++i) { textProperties[i] = new Format.TextProperty(br); } texts = new Format.Text[header.text.length]; for (int i = 0; i < texts.Length; ++i) { texts[i] = new Format.Text(br); } particleDatas = new Format.ParticleData[header.particleData.length]; for (int i = 0; i < particleDatas.Length; ++i) { particleDatas[i] = new Format.ParticleData(br); } particles = new Format.Particle[header.particle.length]; for (int i = 0; i < particles.Length; ++i) { particles[i] = new Format.Particle(br); } programObjects = new Format.ProgramObject[header.programObject.length]; for (int i = 0; i < programObjects.Length; ++i) { programObjects[i] = new Format.ProgramObject(br); } graphicObjects = new Format.GraphicObject[header.graphicObject.length]; for (int i = 0; i < graphicObjects.Length; ++i) { graphicObjects[i] = new Format.GraphicObject(br); } graphics = new Format.Graphic[header.graphic.length]; for (int i = 0; i < graphics.Length; ++i) { graphics[i] = new Format.Graphic(br); } Format.Animation[] animationData = new Format.Animation[header.animation.length]; for (int i = 0; i < animationData.Length; ++i) { animationData[i] = new Format.Animation(br); } buttonConditions = new Format.ButtonCondition[header.buttonCondition.length]; for (int i = 0; i < buttonConditions.Length; ++i) { buttonConditions[i] = new Format.ButtonCondition(br); } buttons = new Format.Button[header.button.length]; for (int i = 0; i < buttons.Length; ++i) { buttons[i] = new Format.Button(br); } labels = new Format.Label[header.label.length]; for (int i = 0; i < labels.Length; ++i) { labels[i] = new Format.Label(br); } instanceNames = new Format.InstanceName[header.instanceName.length]; for (int i = 0; i < instanceNames.Length; ++i) { instanceNames[i] = new Format.InstanceName(br); } events = new Format.Event[header.eventData.length]; for (int i = 0; i < events.Length; ++i) { events[i] = new Format.Event(br); } places = new Format.Place[header.place.length]; for (int i = 0; i < places.Length; ++i) { places[i] = new Format.Place(br); } controlMoveMs = new Format.ControlMoveM[header.controlMoveM.length]; for (int i = 0; i < controlMoveMs.Length; ++i) { controlMoveMs[i] = new Format.ControlMoveM(br); } controlMoveCs = new Format.ControlMoveC[header.controlMoveC.length]; for (int i = 0; i < controlMoveCs.Length; ++i) { controlMoveCs[i] = new Format.ControlMoveC(br); } controlMoveMCs = new Format.ControlMoveMC[header.controlMoveMC.length]; for (int i = 0; i < controlMoveMCs.Length; ++i) { controlMoveMCs[i] = new Format.ControlMoveMC(br); } controls = new Format.Control[header.control.length]; for (int i = 0; i < controls.Length; ++i) { controls[i] = new Format.Control(br); } frames = new Format.Frame[header.frame.length]; for (int i = 0; i < frames.Length; ++i) { frames[i] = new Format.Frame(br); } movieClipEvents = new Format.MovieClipEvent[header.movieClipEvent.length]; for (int i = 0; i < movieClipEvents.Length; ++i) { movieClipEvents[i] = new Format.MovieClipEvent(br); } movies = new Format.Movie[header.movie.length]; for (int i = 0; i < movies.Length; ++i) { movies[i] = new Format.Movie(br); } movieLinkages = new Format.MovieLinkage[header.movieLinkage.length]; for (int i = 0; i < movieLinkages.Length; ++i) { movieLinkages[i] = new Format.MovieLinkage(br); } Format.String[] stringData = new Format.String[header.stringData.length]; for (int i = 0; i < stringData.Length; ++i) { stringData[i] = new Format.String(br); } animations = new int[animationData.Length][]; for (int i = 0; i < animationData.Length; ++i) { animations[i] = ReadAnimation(animationByteData, (int)animationData[i].animationOffset, (int)animationData[i].animationLength); } strings = new string[stringData.Length]; for (int i = 0; i < stringData.Length; ++i) { strings[i] = System.Text.Encoding.UTF8.GetString(stringByteData, (int)stringData[i].stringOffset, (int)stringData[i].stringLength); } stringMap = new Dictionary <string, int>(); for (int i = 0; i < strings.Length; ++i) { stringMap[strings[i]] = i; } instanceNameMap = new Dictionary <int, int>(); for (int i = 0; i < instanceNames.Length; ++i) { instanceNameMap[instanceNames[i].stringId] = i; } eventMap = new Dictionary <int, int>(); for (int i = 0; i < events.Length; ++i) { eventMap[events[i].stringId] = i; } movieLinkageMap = new Dictionary <int, int>(); movieLinkageNameMap = new Dictionary <int, int>(); for (int i = 0; i < movieLinkages.Length; ++i) { movieLinkageMap[movieLinkages[i].stringId] = i; movieLinkageNameMap[movieLinkages[i].movieId] = movieLinkages[i].stringId; } programObjectMap = new Dictionary <int, int>(); for (int i = 0; i < programObjects.Length; ++i) { programObjectMap[programObjects[i].stringId] = i; } labelMap = new Dictionary <int, int> [movies.Length]; for (int i = 0; i < movies.Length; ++i) { Format.Movie m = movies[i]; int o = m.labelOffset; Dictionary <int, int> map = new Dictionary <int, int>(); for (int j = 0; j < m.labels; ++j) { Format.Label l = labels[o + j]; map[l.stringId] = l.frameNo; } labelMap[i] = map; } for (int i = 0; i < textures.Length; ++i) { textures[i].SetFilename(this); } bitmapMap = new Dictionary <string, int>(); var bitmapList = new List <Format.Bitmap>(bitmaps); for (int i = 0; i < textureFragments.Length; ++i) { textureFragments[i].SetFilename(this); bitmapMap[textureFragments[i].filename] = bitmapList.Count; bitmapList.Add( new Format.Bitmap { matrixId = 0, textureFragmentId = i }); } bitmaps = bitmapList.ToArray(); }
public Data(byte[] bytes) { if (bytes.Length < (int)Format.Constant.HEADER_SIZE) return; Stream s = new MemoryStream(bytes); BinaryReader br = new BinaryReader(s); header = new Format.Header(br); if (!Check()) return; byte[] stringByteData = br.ReadBytes((int)header.stringBytes.length); byte[] animationByteData = br.ReadBytes((int)header.animationBytes.length); translates = new Translate[header.translate.length]; for (int i = 0; i < translates.Length; ++i) translates[i] = new Translate(br); matrices = new Matrix[header.matrix.length]; for (int i = 0; i < matrices.Length; ++i) matrices[i] = new Matrix(br); colors = new Color[header.color.length]; for (int i = 0; i < colors.Length; ++i) colors[i] = new Color(br); alphaTransforms = new AlphaTransform[header.alphaTransform.length]; for (int i = 0; i < alphaTransforms.Length; ++i) alphaTransforms[i] = new AlphaTransform(br); colorTransforms = new ColorTransform[header.colorTransform.length]; for (int i = 0; i < colorTransforms.Length; ++i) colorTransforms[i] = new ColorTransform(br); objects = new Format.Object[header.objectData.length]; for (int i = 0; i < objects.Length; ++i) objects[i] = new Format.Object(br); textures = new Format.Texture[header.texture.length]; for (int i = 0; i < textures.Length; ++i) textures[i] = new Format.Texture(br); textureFragments = new Format.TextureFragment[header.textureFragment.length]; for (int i = 0; i < textureFragments.Length; ++i) textureFragments[i] = new Format.TextureFragment(br); bitmaps = new Format.Bitmap[header.bitmap.length]; for (int i = 0; i < bitmaps.Length; ++i) bitmaps[i] = new Format.Bitmap(br); bitmapExs = new Format.BitmapEx[header.bitmapEx.length]; for (int i = 0; i < bitmapExs.Length; ++i) bitmapExs[i] = new Format.BitmapEx(br); fonts = new Format.Font[header.font.length]; for (int i = 0; i < fonts.Length; ++i) fonts[i] = new Format.Font(br); textProperties = new Format.TextProperty[header.textProperty.length]; for (int i = 0; i < textProperties.Length; ++i) textProperties[i] = new Format.TextProperty(br); texts = new Format.Text[header.text.length]; for (int i = 0; i < texts.Length; ++i) texts[i] = new Format.Text(br); particleDatas = new Format.ParticleData[header.particleData.length]; for (int i = 0; i < particleDatas.Length; ++i) particleDatas[i] = new Format.ParticleData(br); particles = new Format.Particle[header.particle.length]; for (int i = 0; i < particles.Length; ++i) particles[i] = new Format.Particle(br); programObjects = new Format.ProgramObject[header.programObject.length]; for (int i = 0; i < programObjects.Length; ++i) programObjects[i] = new Format.ProgramObject(br); graphicObjects = new Format.GraphicObject[header.graphicObject.length]; for (int i = 0; i < graphicObjects.Length; ++i) graphicObjects[i] = new Format.GraphicObject(br); graphics = new Format.Graphic[header.graphic.length]; for (int i = 0; i < graphics.Length; ++i) graphics[i] = new Format.Graphic(br); Format.Animation[] animationData = new Format.Animation[header.animation.length]; for (int i = 0; i < animationData.Length; ++i) animationData[i] = new Format.Animation(br); buttonConditions = new Format.ButtonCondition[header.buttonCondition.length]; for (int i = 0; i < buttonConditions.Length; ++i) buttonConditions[i] = new Format.ButtonCondition(br); buttons = new Format.Button[header.button.length]; for (int i = 0; i < buttons.Length; ++i) buttons[i] = new Format.Button(br); labels = new Format.Label[header.label.length]; for (int i = 0; i < labels.Length; ++i) labels[i] = new Format.Label(br); instanceNames = new Format.InstanceName[header.instanceName.length]; for (int i = 0; i < instanceNames.Length; ++i) instanceNames[i] = new Format.InstanceName(br); events = new Format.Event[header.eventData.length]; for (int i = 0; i < events.Length; ++i) events[i] = new Format.Event(br); places = new Format.Place[header.place.length]; for (int i = 0; i < places.Length; ++i) places[i] = new Format.Place(br); controlMoveMs = new Format.ControlMoveM[header.controlMoveM.length]; for (int i = 0; i < controlMoveMs.Length; ++i) controlMoveMs[i] = new Format.ControlMoveM(br); controlMoveCs = new Format.ControlMoveC[header.controlMoveC.length]; for (int i = 0; i < controlMoveCs.Length; ++i) controlMoveCs[i] = new Format.ControlMoveC(br); controlMoveMCs = new Format.ControlMoveMC[header.controlMoveMC.length]; for (int i = 0; i < controlMoveMCs.Length; ++i) controlMoveMCs[i] = new Format.ControlMoveMC(br); controls = new Format.Control[header.control.length]; for (int i = 0; i < controls.Length; ++i) controls[i] = new Format.Control(br); frames = new Format.Frame[header.frame.length]; for (int i = 0; i < frames.Length; ++i) frames[i] = new Format.Frame(br); movieClipEvents = new Format.MovieClipEvent[header.movieClipEvent.length]; for (int i = 0; i < movieClipEvents.Length; ++i) movieClipEvents[i] = new Format.MovieClipEvent(br); movies = new Format.Movie[header.movie.length]; for (int i = 0; i < movies.Length; ++i) movies[i] = new Format.Movie(br); movieLinkages = new Format.MovieLinkage[header.movieLinkage.length]; for (int i = 0; i < movieLinkages.Length; ++i) movieLinkages[i] = new Format.MovieLinkage(br); Format.String[] stringData = new Format.String[header.stringData.length]; for (int i = 0; i < stringData.Length; ++i) stringData[i] = new Format.String(br); animations = new int[animationData.Length][]; for (int i = 0; i < animationData.Length; ++i) { animations[i] = ReadAnimation(animationByteData, (int)animationData[i].animationOffset, (int)animationData[i].animationLength); } strings = new string[stringData.Length]; for (int i = 0; i < stringData.Length; ++i) { strings[i] = System.Text.Encoding.UTF8.GetString(stringByteData, (int)stringData[i].stringOffset, (int)stringData[i].stringLength); } stringMap = new Dictionary<string, int>(); for (int i = 0; i < strings.Length; ++i) stringMap[strings[i]] = i; instanceNameMap = new Dictionary<int, int>(); for (int i = 0; i < instanceNames.Length; ++i) instanceNameMap[instanceNames[i].stringId] = i; eventMap = new Dictionary<int, int>(); for (int i = 0; i < events.Length; ++i) eventMap[events[i].stringId] = i; movieLinkageMap = new Dictionary<int, int>(); movieLinkageNameMap = new Dictionary<int, int>(); for (int i = 0; i < movieLinkages.Length; ++i) { movieLinkageMap[movieLinkages[i].stringId] = i; movieLinkageNameMap[movieLinkages[i].movieId] = movieLinkages[i].stringId; } programObjectMap = new Dictionary<int, int>(); for (int i = 0; i < programObjects.Length; ++i) programObjectMap[programObjects[i].stringId] = i; labelMap = new Dictionary<int, int>[movies.Length]; for (int i = 0; i < movies.Length; ++i) { Format.Movie m = movies[i]; int o = m.labelOffset; Dictionary<int, int> map = new Dictionary<int, int>(); for (int j = 0; j < m.labels; ++j) { Format.Label l = labels[o + j]; map[l.stringId] = l.frameNo; } labelMap[i] = map; } for (int i = 0; i < textures.Length; ++i) textures[i].SetFilename(this); bitmapMap = new Dictionary<string, int>(); var bitmapList = new List<Format.Bitmap>(bitmaps); for (int i = 0; i < textureFragments.Length; ++i) { textureFragments[i].SetFilename(this); bitmapMap[textureFragments[i].filename] = bitmapList.Count; bitmapList.Add( new Format.Bitmap{matrixId = 0, textureFragmentId = i}); } bitmaps = bitmapList.ToArray(); }