private static void DrawBorderInternal (Graphics graphics, float startX, float startY, float endX, float endY,
int width, Color color, ButtonBorderStyle style, Border3DSide side) {
Pen pen = null;
switch (style) {
case ButtonBorderStyle.Solid:
case ButtonBorderStyle.Inset:
case ButtonBorderStyle.Outset:
pen = ThemeEngine.Current.ResPool.GetDashPen (color, DashStyle.Solid);
break;
case ButtonBorderStyle.Dashed:
pen = ThemeEngine.Current.ResPool.GetDashPen (color, DashStyle.Dash);
break;
case ButtonBorderStyle.Dotted:
pen = ThemeEngine.Current.ResPool.GetDashPen (color, DashStyle.Dot);
break;
default:
case ButtonBorderStyle.None:
return;
}
switch(style) {
case ButtonBorderStyle.Outset: {
Color colorGrade;
int hue, brightness, saturation;
int brightnessSteps;
int brightnessDownSteps;
ControlPaint.Color2HBS(color, out hue, out brightness, out saturation);
brightnessDownSteps=brightness/width;
if (brightness>127) {
brightnessSteps=Math.Max(6, (160-brightness)/width);
} else {
brightnessSteps=(127-brightness)/width;
}
for (int i=0; i<width; i++) {
switch(side) {
case Border3DSide.Left: {
colorGrade=ControlPaint.HBS2Color(hue, Math.Min(255, brightness+brightnessSteps*(width-i)), saturation);
pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
graphics.DrawLine(pen, startX+i, startY+i, endX+i, endY-i);
break;
}
case Border3DSide.Right: {
colorGrade=ControlPaint.HBS2Color(hue, Math.Max(0, brightness-brightnessDownSteps*(width-i)), saturation);
pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
graphics.DrawLine(pen, startX-i, startY+i, endX-i, endY-i);
break;
}
case Border3DSide.Top: {
colorGrade=ControlPaint.HBS2Color(hue, Math.Min(255, brightness+brightnessSteps*(width-i)), saturation);
pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
graphics.DrawLine(pen, startX+i, startY+i, endX-i, endY+i);
break;
}
case Border3DSide.Bottom: {
colorGrade=ControlPaint.HBS2Color(hue, Math.Max(0, brightness-brightnessDownSteps*(width-i)), saturation);
pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
graphics.DrawLine(pen, startX+i, startY-i, endX-i, endY-i);
break;
}
}
}
break;
}
case ButtonBorderStyle.Inset: {
Color colorGrade;
int hue, brightness, saturation;
int brightnessSteps;
int brightnessDownSteps;
ControlPaint.Color2HBS(color, out hue, out brightness, out saturation);
brightnessDownSteps=brightness/width;
if (brightness>127) {
brightnessSteps=Math.Max(6, (160-brightness)/width);
} else {
brightnessSteps=(127-brightness)/width;
}
for (int i=0; i<width; i++) {
switch(side) {
case Border3DSide.Left: {
colorGrade=ControlPaint.HBS2Color(hue, Math.Max(0, brightness-brightnessDownSteps*(width-i)), saturation);
pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
graphics.DrawLine(pen, startX+i, startY+i, endX+i, endY-i);
break;
}
case Border3DSide.Right: {
colorGrade=ControlPaint.HBS2Color(hue, Math.Min(255, brightness+brightnessSteps*(width-i)), saturation);
pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
graphics.DrawLine(pen, startX-i, startY+i, endX-i, endY-i);
break;
}
case Border3DSide.Top: {
colorGrade=ControlPaint.HBS2Color(hue, Math.Max(0, brightness-brightnessDownSteps*(width-i)), saturation);
pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
graphics.DrawLine(pen, startX+i, startY+i, endX-i, endY+i);
break;
}
case Border3DSide.Bottom: {
colorGrade=ControlPaint.HBS2Color(hue, Math.Min(255, brightness+brightnessSteps*(width-i)), saturation);
pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
graphics.DrawLine(pen, startX+i, startY-i, endX-i, endY-i);
break;
}
}
}
break;
}
/*
I decided to have the for-loop duplicated for speed reasons;
that way we only have to switch once (as opposed to have the
for-loop around the switch)
*/
default: {
switch(side) {
case Border3DSide.Left: {
for (int i=0; i<width; i++) {
graphics.DrawLine(pen, startX+i, startY+i, endX+i, endY-i);
}
break;
}
case Border3DSide.Right: {
for (int i=0; i<width; i++) {
graphics.DrawLine(pen, startX-i, startY+i, endX-i, endY-i);
}
break;
}
case Border3DSide.Top: {
for (int i=0; i<width; i++) {
graphics.DrawLine(pen, startX+i, startY+i, endX-i, endY+i);
}
break;
}
case Border3DSide.Bottom: {
for (int i=0; i<width; i++) {
graphics.DrawLine(pen, startX+i, startY-i, endX-i, endY-i);
}
break;
}
}
break;
}
}
}