コード例 #1
0
ファイル: EmbossEffect.cs プロジェクト: ywscr/GUI-Painter
        public override void Render(Graphics gr, GraphicsPath path)
        {
            var color1 = Color;
            var color2 = ColorShadow;
            var light  = Direction.Normalized();

            var flatten = (GraphicsPath)path.Clone();

            flatten.Flatten();

            //get points from the path
            var points = flatten.PathPoints;
            var types  = flatten.PathTypes;
            var pen    = new Pen(Color.Black, Distance + 1);

            pen.StartCap = pen.EndCap = LineCap.Flat;
            //

            void Render(int from, int to)
            {
                for (int i = from; i <= to; i++)
                {
                    var p1  = points[i];
                    var p2  = i == to ? points[from] : points[i + 1];
                    var dir = p2.Sub(p1).Normalized();
                    var n   = new PointF(-dir.Y, dir.X);
                    var dot = n.DotScalar(light);
                    var c   = GraphicsHelper.Lerp(ColorShadow, Color, (dot + 1) / 2f);
                    pen.Color = c;
                    gr.DrawLine(pen, p1, p2);
                }
            }

            var start = 0;

            for (int i = 1; i < points.Length; i++)
            {
                if ((types[i] == 0xa1 || types[i] == 0xa3 || types[i] == 129))//end of figure
                {
                    if (start >= 0)
                    {
                        Render(start, i);
                    }
                    start = i + 1;
                }
            }

            if (start < points.Length)
            {
                Render(start, points.Length - 1);
            }

            pen.Dispose();
        }