internal void BroadcastRemovedFromStageEvent(DisplayObjectContainer currentTarget) { RemovedFromStage?.Invoke(this, currentTarget); var displayObjectContainer = this as DisplayObjectContainer; if (displayObjectContainer != null) { // We need to make a copy here because the Children list might be modified in an RemovedFromStage event handler List <DisplayObject> copy = new List <DisplayObject>(displayObjectContainer.Children); foreach (var child in copy) { child.BroadcastRemovedFromStageEvent(currentTarget); } } }
internal void BroadcastRemovedFromStageEvent(DisplayObjectContainer currentTarget) { if (RemovedFromStage != null) { RemovedFromStage(this, currentTarget); } var displayObjectContainer = this as DisplayObjectContainer; if (displayObjectContainer != null) { // We need to make a copy here because the Children list might be modified in an RemovedFromStage event handler List<DisplayObject> copy = new List<DisplayObject>(displayObjectContainer.Children); foreach (var child in copy) { child.BroadcastRemovedFromStageEvent(currentTarget); } } }
public static int Compile(DisplayObject displayObject, List <QuadBatch> quadBatches, int quadBatchID, Matrix transformationMatrix, float alpha, uint blendMode) { bool isRootObject = false; float objectAlpha = displayObject.Alpha; Quad quad = displayObject is Quad ? (Quad)displayObject : null; QuadBatch batch = displayObject is QuadBatch ? (QuadBatch)displayObject : null; DisplayObjectContainer container = displayObject is DisplayObjectContainer ? (DisplayObjectContainer)displayObject : null; if (quadBatchID == -1) { isRootObject = true; quadBatchID = 0; objectAlpha = 1.0f; blendMode = displayObject.BlendMode; if (quadBatches.Count == 0) { quadBatches.Add(new QuadBatch()); } else { quadBatches[0].Reset(); } } if (container != null) { Matrix childMatrix = Matrix.Create(); childMatrix.Identity(); int numChildren = container.NumChildren; for (int i = 0; i < numChildren; i++) { DisplayObject child = container.GetChild(i); if (child.HasVisibleArea) { uint childBlendMode = child.BlendMode; if (childBlendMode == Sparrow.Display.BlendMode.AUTO) { childBlendMode = blendMode; } childMatrix.CopyFromMatrix(transformationMatrix); childMatrix.PrependMatrix(child.TransformationMatrix); quadBatchID = Compile(child, quadBatches, quadBatchID, childMatrix, alpha * objectAlpha, childBlendMode); } } } else if (quad != null) { Texture texture = quad.Texture; bool tinted = quad.Tinted; bool pma = quad.PremultipliedAlpha; QuadBatch currentBatch = quadBatches[quadBatchID]; if (currentBatch.IsStateChange(tinted, texture, alpha * objectAlpha, pma, blendMode, 1)) { quadBatchID++; if (quadBatches.Count <= quadBatchID) { quadBatches.Add(new QuadBatch()); } currentBatch = quadBatches[quadBatchID]; currentBatch.Reset(); } currentBatch.AddQuad(quad, alpha * objectAlpha, blendMode, transformationMatrix); } else if (batch != null) { Texture texture = quad.Texture; bool tinted = quad.Tinted; bool pma = quad.PremultipliedAlpha; int numQuads = batch.NumQuads; QuadBatch currentBatch = quadBatches[quadBatchID]; if (currentBatch.IsStateChange(tinted, texture, alpha * objectAlpha, pma, blendMode, numQuads)) { quadBatchID++; if (quadBatches.Count <= quadBatchID) { quadBatches.Add(new QuadBatch()); } currentBatch = quadBatches[quadBatchID]; currentBatch.Reset(); } currentBatch.AddQuadBatch(batch, alpha * objectAlpha, blendMode, transformationMatrix); } else { throw new InvalidOperationException("Unsupported display object"); } if (!isRootObject) { return(quadBatchID); } // remove unused batches for (int i = quadBatches.Count - 1; i > quadBatchID; --i) { quadBatches.RemoveAt(quadBatches.Count - 1); } return(quadBatchID); }