//----------------------------------------------------------------------------- void CFrame::CollectInvalidRects::addRect (const CRect& rect) { #if VSTGUI_LOG_COLLECT_INVALID_RECTS numAddedRects++; #endif bool add = true; for (InvalidRects::iterator it = invalidRects.begin (), end = invalidRects.end (); it != end; ++it) { CRect r (rect); if (r.bound (*it) == rect) { add = false; break; } r = *it; if (r.bound (rect) == *it) { invalidRects.erase (it); break; } } if (add) invalidRects.push_back (rect); uint32_t now = frame->getTicks (); if (now - lastTicks > 16) { flush (); lastTicks = now; } }
//----------------------------------------------------------------------------- void CBitmap::draw (CDrawContext* context, const CRect& rect, const CPoint& offset, float alpha) { CRect clipRect; context->getClipRect (clipRect); clipRect.bound (rect); if (!clipRect.isEmpty ()) context->drawBitmap (this, rect, offset, alpha); }
//----------------------------------------------------------------------------- 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); }
//----------------------------------------------------------------------------- void CFrame::drawRect (CDrawContext* pContext, const CRect& updateRect) { if (updateRect.getWidth () <= 0 || updateRect.getHeight () <= 0 || pContext == 0) return; if (pContext) pContext->remember (); CRect oldClip; pContext->getClipRect (oldClip); CRect newClip (updateRect); newClip.bound (oldClip); pContext->setClipRect (newClip); // draw the background and the children CViewContainer::drawRect (pContext, updateRect); pContext->setClipRect (oldClip); pContext->forget (); }
//----------------------------------------------------------------------------- void CDrawContext::drawString (UTF8StringPtr _string, const CRect& _rect, const CHoriTxtAlign hAlign, bool antialias) { if (!_string || currentState.font == 0) return; IFontPainter* painter = currentState.font->getFontPainter (); if (painter == 0) return; const CString& string = getDrawString (_string); CRect rect (_rect); double capHeight = -1; IPlatformFont* platformFont = currentState.font->getPlatformFont (); if (platformFont) capHeight = platformFont->getCapHeight (); if (capHeight > 0.) rect.bottom -= (rect.height ()/2 - capHeight / 2); else rect.bottom -= (rect.height ()/2 - currentState.font->getSize () / 2) + 1; if (hAlign != kLeftText) { CCoord stringWidth = painter->getStringWidth (this, string, antialias); if (hAlign == kRightText) rect.left = rect.right - stringWidth; else rect.left = (CCoord)(rect.left + (rect.getWidth () / 2.f) - (stringWidth / 2.f)); } CRect oldClip; getClipRect (oldClip); CRect newClip (_rect); newClip.bound (oldClip); setClipRect (newClip); painter->drawString (this, string, CPoint (rect.left, rect.bottom), antialias); setClipRect (oldClip); clearDrawString (); }
//----------------------------------------------------------------------------- void CScrollContainer::setScrollOffset (CPoint newOffset, bool redraw) { newOffset.x = floor (newOffset.x + 0.5); newOffset.y = floor (newOffset.y + 0.5); if (containerSize.getWidth () >= getViewSize ().getWidth ()) { if (newOffset.x < containerSize.left - (containerSize.getWidth () - getViewSize ().getWidth ())) newOffset.x = containerSize.left - (containerSize.getWidth () - getViewSize ().getWidth ()); } else { if (newOffset.x < containerSize.left - containerSize.getWidth ()) newOffset.x = containerSize.left - containerSize.getWidth (); } if (newOffset.x > containerSize.right) newOffset.x = containerSize.right; if (newOffset.y < containerSize.top) newOffset.y = containerSize.top; if (newOffset.y > containerSize.bottom) newOffset.y = containerSize.bottom; CPoint diff ((int32_t)(newOffset.x - offset.x), (int32_t)(offset.y - newOffset.y)); if (diff.x == 0 && diff.y == 0) return; inScrolling = true; FOREACHSUBVIEW CRect r, mr; pV->getViewSize (r); pV->getMouseableArea (mr); r.offset (diff.x , diff.y); pV->setViewSize (r, false); mr.offset (diff.x , diff.y); pV->setMouseableArea (mr); ENDFOREACHSUBVIEW inScrolling = false; offset = newOffset; if (!isAttached ()) return; if (getTransparency ()) { invalid (); } else { CRect scrollRect (0, 0, getViewSize ().getWidth (), getViewSize ().getHeight ()); CPoint p; localToFrame (p); scrollRect.offset (p.x, p.y); CRect visibleRect = getVisibleSize (CRect (0, 0, getViewSize ().getWidth (), getViewSize ().getHeight ())); visibleRect.offset (p.x, p.y); scrollRect.bound (visibleRect); CPoint distance (diff.x, diff.y); if (distance.x > 0) scrollRect.right -= distance.x; else if (distance.x < 0) scrollRect.left -= distance.x; if (distance.y > 0) scrollRect.bottom -= distance.y; else if (distance.y < 0) scrollRect.top -= distance.y; getFrame ()->scrollRect (scrollRect, distance); } }