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;
}