ComponentFactory.Krypton.Toolkit.RenderGlassHelpers.DrawBackGlassBasic C# (CSharp) Method

DrawBackGlassBasic() private static method

private static DrawBackGlassBasic ( RectangleF drawRect, Color color1, Color color2, Color glassColor1, Color glassColor2, float factorX, float factorY, VisualOrientation orientation, Graphics g, float glassPercent, IDisposable &memento ) : RectangleF
drawRect System.Drawing.RectangleF
color1 Color
color2 Color
glassColor1 Color
glassColor2 Color
factorX float
factorY float
orientation VisualOrientation
g System.Drawing.Graphics
glassPercent float
memento IDisposable
return System.Drawing.RectangleF
        private static RectangleF DrawBackGlassBasic(RectangleF drawRect,
                                                     Color color1,
                                                     Color color2,
                                                     Color glassColor1,
                                                     Color glassColor2,
                                                     float factorX,
                                                     float factorY,
                                                     VisualOrientation orientation,
                                                     Graphics g,
                                                     float glassPercent,
                                                     ref IDisposable memento)
        {
            // Cannot draw a zero length rectangle
            if ((drawRect.Width > 0) && (drawRect.Height > 0))
            {
                bool generate = true;
                MementoBackGlassBasic cache;

                // Access a cache instance and decide if cache resources need generating
                if ((memento == null) || !(memento is MementoBackGlassBasic))
                {
                    if (memento != null)
                        memento.Dispose();

                    cache = new MementoBackGlassBasic(drawRect, color1, color2,
                                                      glassColor1, glassColor2,
                                                      factorX, factorY,
                                                      orientation, glassPercent);
                    memento = cache;
                }
                else
                {
                    cache = (MementoBackGlassBasic)memento;
                    generate = !cache.UseCachedValues(drawRect, color1, color2,
                                                      glassColor1, glassColor2,
                                                      factorX, factorY,
                                                      orientation, glassPercent);
                }

                // Do we need to generate the contents of the cache?
                if (generate)
                {
                    // Dispose of existing values
                    cache.Dispose();

                    // Draw entire area in a solid color
                    cache.totalBrush = new SolidBrush(color1);

                    int length;

                    if (VerticalOrientation(orientation))
                        length = (int)(drawRect.Height * glassPercent);
                    else
                        length = (int)(drawRect.Width * glassPercent);

                    RectangleF glassRect;

                    // Create rectangles that covers the glassy area
                    switch (orientation)
                    {
                        case VisualOrientation.Left:
                            glassRect = new RectangleF(drawRect.X, drawRect.Y, length, drawRect.Height);
                            break;
                        case VisualOrientation.Right:
                            glassRect = new RectangleF(drawRect.Right - length, drawRect.Y, length, drawRect.Height);
                            break;
                        case VisualOrientation.Bottom:
                            glassRect = new RectangleF(drawRect.X, drawRect.Bottom - length, drawRect.Width, length);
                            break;
                        case VisualOrientation.Top:
                        default:
                            glassRect = new RectangleF(drawRect.X, drawRect.Y, drawRect.Width, length);
                            break;
                    }

                    // Gradient rectangle is always a little bigger to prevent tiling at edges
                    RectangleF glassGradientRect = new RectangleF(glassRect.X - 1, glassRect.Y - 1, glassRect.Width + 2, glassRect.Height + 2);

                    // Cannot draw a zero length rectangle
                    if ((glassGradientRect.Width > 0) && (glassGradientRect.Height > 0))
                    {
                        cache.glassBrush = new LinearGradientBrush(glassGradientRect, glassColor1, glassColor2, AngleFromOrientation(orientation));
                        cache.glassRect = glassRect;
                    }
                }

                g.FillRectangle(cache.totalBrush, drawRect);

                if (cache.glassBrush != null)
                {
                    g.FillRectangle(cache.glassBrush, cache.glassRect);
                    return cache.glassRect;
                }
            }

            return RectangleF.Empty;
        }