Initial release
This commit is contained in:
@@ -0,0 +1,171 @@
|
||||
// This file is part of VSTGUI. It is subject to the license terms
|
||||
// in the LICENSE file found in the top-level directory of this
|
||||
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
|
||||
|
||||
#include "cgradientview.h"
|
||||
#include "cdrawcontext.h"
|
||||
#include "cgraphicspath.h"
|
||||
|
||||
namespace VSTGUI {
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
CGradientView::CGradientView (const CRect& size)
|
||||
: CView (size)
|
||||
{
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
void CGradientView::attributeChanged ()
|
||||
{
|
||||
invalid ();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CGradientView::setGradientStyle (GradientStyle style)
|
||||
{
|
||||
if (gradientStyle != style)
|
||||
{
|
||||
gradientStyle = style;
|
||||
attributeChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
void CGradientView::setGradient (CGradient* newGradient)
|
||||
{
|
||||
if (gradient != newGradient)
|
||||
{
|
||||
gradient = newGradient;
|
||||
attributeChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CGradientView::setFrameColor (const CColor& newColor)
|
||||
{
|
||||
if (newColor != frameColor)
|
||||
{
|
||||
frameColor = newColor;
|
||||
attributeChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CGradientView::setGradientAngle (double angle)
|
||||
{
|
||||
if (angle != gradientAngle)
|
||||
{
|
||||
gradientAngle = angle;
|
||||
attributeChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CGradientView::setRoundRectRadius (CCoord radius)
|
||||
{
|
||||
if (radius != roundRectRadius)
|
||||
{
|
||||
roundRectRadius = radius;
|
||||
path = nullptr;
|
||||
attributeChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CGradientView::setFrameWidth (CCoord width)
|
||||
{
|
||||
if (width != frameWidth)
|
||||
{
|
||||
frameWidth = width;
|
||||
path = nullptr;
|
||||
attributeChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CGradientView::setDrawAntialiased (bool state)
|
||||
{
|
||||
if (state != drawAntialiased)
|
||||
{
|
||||
drawAntialiased = state;
|
||||
attributeChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CGradientView::setRadialCenter (const CPoint& center)
|
||||
{
|
||||
if (radialCenter != center)
|
||||
{
|
||||
radialCenter = center;
|
||||
attributeChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CGradientView::setRadialRadius (CCoord radius)
|
||||
{
|
||||
if (radialRadius != radius)
|
||||
{
|
||||
radialRadius = radius;
|
||||
attributeChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CGradientView::setViewSize (const CRect& rect, bool invalid)
|
||||
{
|
||||
if (rect != getViewSize ())
|
||||
{
|
||||
CView::setViewSize (rect, invalid);
|
||||
path = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CGradientView::draw (CDrawContext* context)
|
||||
{
|
||||
auto lineWidth = getFrameWidth ();
|
||||
if (lineWidth < 0.)
|
||||
lineWidth = context->getHairlineSize ();
|
||||
if (path == nullptr)
|
||||
{
|
||||
CRect r = getViewSize ();
|
||||
r.inset (lineWidth / 2., lineWidth / 2.);
|
||||
path = owned (context->createRoundRectGraphicsPath (r, roundRectRadius));
|
||||
}
|
||||
if (path && gradient)
|
||||
{
|
||||
context->setDrawMode (drawAntialiased ? kAntiAliasing : kAliasing);
|
||||
|
||||
if (gradientStyle == kLinearGradient)
|
||||
{
|
||||
CPoint colorStartPoint (0, 0);
|
||||
colorStartPoint.x = getViewSize ().left + getViewSize ().getWidth () / 2 + cos (radians (gradientAngle-90)) * getViewSize ().getWidth () / 2;
|
||||
colorStartPoint.y = getViewSize ().top + getViewSize ().getHeight () / 2 + sin (radians (gradientAngle-90)) * getViewSize ().getHeight () / 2;
|
||||
CPoint colorEndPoint (0, getViewSize ().getHeight ());
|
||||
colorEndPoint.x = getViewSize ().left + getViewSize ().getWidth () / 2 + cos (radians (gradientAngle+90)) * getViewSize ().getWidth () / 2;
|
||||
colorEndPoint.y = getViewSize ().top + getViewSize ().getHeight () / 2 + sin (radians (gradientAngle+90)) * getViewSize ().getHeight () / 2;
|
||||
context->fillLinearGradient (path, *gradient, colorStartPoint, colorEndPoint, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
CPoint center (radialCenter);
|
||||
center.x *= getViewSize ().getWidth ();
|
||||
center.y *= getViewSize ().getHeight ();
|
||||
center.offset (getViewSize ().left, getViewSize ().top);
|
||||
context->fillRadialGradient (path, *gradient, center, radialRadius * std::max (getViewSize ().getWidth (), getViewSize ().getHeight ()));
|
||||
}
|
||||
|
||||
if (frameColor.alpha != 0 && lineWidth > 0.)
|
||||
{
|
||||
context->setDrawMode (drawAntialiased ? kAntiAliasing : kAliasing);
|
||||
context->setFrameColor (frameColor);
|
||||
context->setLineWidth (lineWidth);
|
||||
context->setLineStyle (kLineSolid);
|
||||
context->drawGraphicsPath (path, CDrawContext::kPathStroked);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // VSTGUI
|
||||
Reference in New Issue
Block a user