private void Render(DisplayObject obj, Matrix2D matrix = null, float alpha = 1.0f) { Painter painter = SparrowSharp.Painter; RenderState state = painter.State; bool wasCacheEnabled = painter.CacheEnabled; FragmentFilter filter = obj.Filter; DisplayObject mask = obj.Mask; painter.CacheEnabled = false; painter.PushState(); state.Alpha = obj.Alpha * alpha; state.SetModelviewMatricesToIdentity(); state.BlendMode = obj.BlendMode == BlendMode.AUTO ? BlendMode.NORMAL : obj.BlendMode; if (matrix != null) { state.TransformModelviewMatrix(matrix); } else { state.TransformModelviewMatrix(obj.TransformationMatrix); } // OpenGL calculates y coordinates from the bottom, invert them here state.ModelviewMatrix.Scale(1, -1); state.ModelviewMatrix.Translate(0, Height); if (mask != null) { painter.DrawMask(mask); } if (filter != null) { filter.Render(painter); } else { obj.Render(painter); } if (mask != null) { painter.EraseMask(mask); } painter.PopState(); painter.CacheEnabled = wasCacheEnabled; }
public override void Render(Painter painter) { int numChildren = _children.Count; uint frameId = painter.FrameId; bool cacheEnabled = frameId != 0; bool selfOrParentChanged = _lastParentOrSelfChangeFrameID == frameId; for (int i = 0; i < numChildren; ++i) { DisplayObject child = _children[i]; if (child._hasVisibleArea) { if (selfOrParentChanged) { child._lastParentOrSelfChangeFrameID = frameId; } if (child._lastParentOrSelfChangeFrameID != frameId && child._lastChildChangeFrameID != frameId && child._tokenFrameID == frameId - 1 && cacheEnabled) { painter.PushState(SCacheToken); painter.DrawFromCache(child._pushToken, child._popToken); painter.PopState(child._popToken); child._pushToken.CopyFrom(SCacheToken); } else { BatchToken pushToken = cacheEnabled ? child._pushToken : null; BatchToken popToken = cacheEnabled ? child._popToken : null; FragmentFilter filter = child._filter; DisplayObject mask = child._mask; painter.PushState(pushToken); painter.SetStateTo(child.TransformationMatrix, child.Alpha, child.BlendMode); if (mask != null) { painter.DrawMask(mask, child); } if (filter != null) { filter.Render(painter); } else { child.Render(painter); } if (mask != null) { painter.EraseMask(mask, child); } painter.PopState(popToken); } if (cacheEnabled) { child._tokenFrameID = frameId; } } } }