Example #1
0
        internal void StencilStroke(IRenderable path)
        {
            var effect = Device.EffectManager.StencilStroke;

            // Setup stenciling
            _device.BlendState = Device.BlendStates.NoColor;
            _device.DepthStencilState = State.Stencils.Set;

            // Render solid mesh
            if (path.HasSolidStroke)
            {
                effect.SetSolid(State.NonScalingStroke, State.Projection.Matrix, State.PathToSurface.Matrix, State.StrokeExpand);
                effect.Apply();
                _device.MultiSampleMask = -1;
                path.BeforeRenderSolidStroke();
                path.RenderSolidStroke();
            }

            // Render radial mesh
            if (path.HasRadialStroke)
            {
                effect.SetRadial(State.NonScalingStroke, State.Projection.Matrix, State.PathToSurface.Matrix, State.StrokeExpand);
                path.BeforeRenderRadialStroke();
                if (State.Antialiasing == VGAntialiasing.None)
                {
                    effect.Apply();
                    path.RenderRadialStroke();
                }
                else
                    for (int samples = (int)State.Antialiasing - 1, MSAAMask = _msaaMasks[State.Antialiasing]; samples >= 0; samples--, MSAAMask <<= 1)
                    {
                        _device.MultiSampleMask = MSAAMask;
                        effect.SetOffset(ref Surface.MSAAPattern[samples]);
                        effect.Apply();
                        path.RenderRadialStroke();
                    }
            }
        }