コード例 #1
0
        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;
        }
コード例 #2
0
        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;
                    }
                }
            }
        }