コード例 #1
0
ファイル: csegmentbutton.cpp プロジェクト: UIKit0/vstgui
//-----------------------------------------------------------------------------
void CSegmentButton::drawRect (CDrawContext* pContext, const CRect& dirtyRect)
{
	bool isHorizontal = style == kHorizontal;
	SharedPointer<CGraphicsPath> path;
	if (gradient || gradientHighlighted || (getFrameWidth () > 0. && getFrameColor ().alpha != 0))
	{
		CRect r (getViewSize ());
		r.inset (getFrameWidth () / 2., getFrameWidth () / 2.);
		path = owned (pContext->createGraphicsPath ());
		path->addRoundRect (r, getRoundRadius ());
	}
	pContext->setDrawMode (kAntiAliasing);
	bool drawLines = getFrameWidth () > 0. && getFrameColor ().alpha != 0;
	if (drawLines)
	{
		pContext->setLineStyle (kLineSolid);
		pContext->setLineWidth (getFrameWidth ());
		pContext->setFrameColor (getFrameColor ());
	}
	if (gradient)
	{
		pContext->fillLinearGradient (path, *gradient, getViewSize ().getTopLeft (), getViewSize ().getBottomLeft ());
	}
	uint32_t selectedIndex = getSelectedSegment ();
	for (uint32_t index = 0; index < segments.size (); ++index)
	{
		Segment& segment = segments[index];
		if (!dirtyRect.rectOverlap (segment.rect))
			continue;
		CRect oldClip;
		pContext->getClipRect (oldClip);
		CRect clipRect (segment.rect);
		clipRect.bound (oldClip);
		pContext->setClipRect (clipRect);
		bool selected = selectedIndex == index;
		if (selected && gradientHighlighted)
			pContext->fillLinearGradient (path, *gradientHighlighted, segment.rect.getTopLeft (), segment.rect.getBottomLeft ());
		if (selected && segment.backgroundHighlighted)
			segment.backgroundHighlighted->draw (pContext, segment.rect);
		else if (segment.background)
			segment.background->draw (pContext, segment.rect);
		CDrawMethods::drawIconAndText (pContext, selected ? segment.iconHighlighted : segment.icon, segment.iconPosition, textAlignment, textMargin, segment.rect, segment.name, font, selected ? textColorHighlighted : textColor);
		pContext->setClipRect (oldClip);
		if (drawLines && index > 0 && index < segments.size ())
		{
			path->beginSubpath (segment.rect.getTopLeft ());
			path->addLine (isHorizontal ? segment.rect.getBottomLeft () : segment.rect.getTopRight ());
		}
	}
	if (drawLines)
		pContext->drawGraphicsPath (path, CDrawContext::kPathStroked);
	setDirty (false);
}
コード例 #2
0
//drawing
void AnimatedSprite::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
	if(m_sprites.size() == 0)
		return;
	states.transform *= getTransform();
	int currentFrame = getCurrentFrame();
	sf::Sprite& currentSprite = const_cast<sf::Sprite&>(getFrameSprite(currentFrame)); //this should always work
	//set the color
	//you're going to be using multiply 99% of the time
	switch(m_spriteBlendMode)
	{
	case sf::BlendAlpha:
		currentSprite.setColor(sf::Color(
			m_color.r*m_color.a + getFrameColor(currentFrame).r*(1-m_color.a), //red
			m_color.g*m_color.a + getFrameColor(currentFrame).r*(1-m_color.a), //green
			m_color.b*m_color.a + getFrameColor(currentFrame).r*(1-m_color.a), //blue
			m_color.a + getFrameColor(currentFrame).a)); //alpha
		break;
	case sf::BlendAdd:
		currentSprite.setColor(m_color + getFrameColor(currentFrame));
		break;
	case sf::BlendMultiply:
		currentSprite.setColor(m_color * getFrameColor(currentFrame));
		break;
	case sf::BlendNone:
		currentSprite.setColor(getFrameColor(currentFrame));
		break;
	}
	target.draw(currentSprite, states);
}