Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

130 lines
3.5 KiB

#include "stdafx.h"
#include "RenderUtil.h"
namespace DUser
{
namespace RenderUtil
{
//------------------------------------------------------------------------------
void
ComputeBorder(
IN Gdiplus::Pen * pgppen,
IN const Gdiplus::RectF * prcGadgetPxl,
IN EBorderAlignment ba,
OUT Gdiplus::RectF * prcBorderPxl)
{
float flPenThickness = pgppen->GetWidth();
BOOL fEven = fabs(fmod(flPenThickness, 2.0f)) < 0.0001f;
float flOffset, flSize;
switch (ba) {
case baOutside:
flOffset = (flPenThickness + (fEven ? 0.0f : 1.0f)) / 2.0f + (fEven ? 0.5f : 0.0f);
flSize = flPenThickness;
break;
case baCenter:
flOffset = (fEven ? 0.5f : 0.0f);
flSize = (fEven ? 1.0f : 0.0f);
break;
case baInside:
// Inside is opposite of outside
flOffset = -((flPenThickness + (fEven ? 0.0f : 1.0f)) / 2.0f + (fEven ? 0.5f : 0.0f));
flSize = -flPenThickness;
break;
default:
AssertMsg(0, "Unknown alignment");
return;
}
prcBorderPxl->X = prcGadgetPxl->X - flOffset;
prcBorderPxl->Y = prcGadgetPxl->Y - flOffset;
prcBorderPxl->Width = prcGadgetPxl->Width + flSize;
prcBorderPxl->Height = prcGadgetPxl->Height + flSize;
}
//------------------------------------------------------------------------------
void
ComputeRoundRect(
IN const Gdiplus::RectF * prc,
IN const Gdiplus::SizeF sizeCorner,
IN OUT Gdiplus::GraphicsPath * pgppath)
{
float W = (prc->Width > (sizeCorner.Width * 2)) ? sizeCorner.Width : prc->Width / 2.0f;
float H = (prc->Height > (sizeCorner.Height * 2)) ? sizeCorner.Width : prc->Height / 2.0f;
float W2 = W * 2.0f;
float H2 = H * 2.0f;
float LX1 = prc->X;
float LY1 = prc->Y;
float LX2 = prc->X + prc->Width;
float LY2 = prc->Y + prc->Height;
float RX1 = prc->X + W;
float RY1 = prc->Y + H;
float RX2 = prc->X + prc->Width - W;
float RY2 = prc->Y + prc->Height - H;
pgppath->AddLine(RX1, LY1, RX2, LY1);
pgppath->AddArc(RX2-W, RY1-H, W2, H2, 270.0f, 90.0f);
pgppath->AddLine(LX2, RY1, LX2, RY2);
pgppath->AddArc(RX2-W, RY2-H, W2, H2, 0.0f, 90.0f);
pgppath->AddLine(RX2, LY2, RX1, LY2);
pgppath->AddArc(RX1-W, RY2-H, W2, H2, 90.0f, 90.0f);
pgppath->AddLine(LX1, RY2, LX1, RY1);
pgppath->AddArc(RX1-W, RY1-H, W2, H2, 180.0f, 90.0f);
pgppath->CloseFigure();
}
//------------------------------------------------------------------------------
void
DrawRoundRect(
IN Gdiplus::Graphics * pgpgr,
IN Gdiplus::Pen * pgppenBorder,
IN const Gdiplus::RectF & rc,
IN const Gdiplus::SizeF sizeCorner,
IN EBorderAlignment ba)
{
Assert(pgppenBorder != NULL);
Gdiplus::RectF rcUse;
ComputeBorder(pgppenBorder, &rc, ba, &rcUse);
Gdiplus::GraphicsPath gppath;
ComputeRoundRect(&rcUse, sizeCorner, &gppath);
pgpgr->DrawPath(pgppenBorder, &gppath);
}
//------------------------------------------------------------------------------
void
FillRoundRect(
IN Gdiplus::Graphics * pgpgr,
IN Gdiplus::Brush * pgpbrFill,
IN const Gdiplus::RectF & rc,
IN const Gdiplus::SizeF sizeCorner)
{
Assert(pgpbrFill != NULL);
Gdiplus::GraphicsPath gppath;
ComputeRoundRect(&rc, sizeCorner, &gppath);
pgpgr->FillPath(pgpbrFill, &gppath);
}
} // namespace DUser
} // namespace RenderUtil