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