void QgsTextAnnotationItem::paint( QPainter * painter ) { if ( !painter || !mDocument ) { return; } drawFrame( painter ); if ( mMapPositionFixed ) { drawMarkerSymbol( painter ); } double frameWidth = mFrameBorderWidth; mDocument->setTextWidth( mFrameSize.width() ); painter->save(); painter->translate( mOffsetFromReferencePoint.x() + frameWidth / 2.0, mOffsetFromReferencePoint.y() + frameWidth / 2.0 ); QRectF clipRect = QRectF( 0, 0, mFrameSize.width() - frameWidth / 2.0, mFrameSize.height() - frameWidth / 2.0 ); if ( painter->hasClipping() ) { //QTextDocument::drawContents will draw text outside of the painter's clip region //when it is passed a clip rectangle. So, we need to intersect it with the //painter's clip region to prevent text drawn outside clipped region (eg, outside composer maps, see #10400) clipRect = clipRect.intersected( painter->clipRegion().boundingRect() ); } //draw text document mDocument->drawContents( painter, clipRect ); painter->restore(); if ( isSelected() ) { drawSelectionBoxes( painter ); } }
void QgsAnnotation::render( QgsRenderContext &context ) const { QPainter *painter = context.painter(); if ( !painter ) { return; } painter->save(); drawFrame( context ); if ( mHasFixedMapPosition ) { drawMarkerSymbol( context ); } if ( mHasFixedMapPosition ) { painter->translate( mOffsetFromReferencePoint.x() + context.convertToPainterUnits( mContentsMargins.left(), QgsUnitTypes::RenderMillimeters ), mOffsetFromReferencePoint.y() + context.convertToPainterUnits( mContentsMargins.top(), QgsUnitTypes::RenderMillimeters ) ); } else { painter->translate( context.convertToPainterUnits( mContentsMargins.left(), QgsUnitTypes::RenderMillimeters ), context.convertToPainterUnits( mContentsMargins.top(), QgsUnitTypes::RenderMillimeters ) ); } QSizeF size( mFrameSize.width() - context.convertToPainterUnits( mContentsMargins.left() + mContentsMargins.right(), QgsUnitTypes::RenderMillimeters ), mFrameSize.height() - context.convertToPainterUnits( mContentsMargins.top() + mContentsMargins.bottom(), QgsUnitTypes::RenderMillimeters ) ); renderAnnotation( context, size ); painter->restore(); }
void QgsSvgAnnotationItem::paint( QPainter* painter ) { if( !painter ) { return; } drawFrame( painter ); if ( mMapPositionFixed ) { drawMarkerSymbol( painter ); } //keep width/height ratio of svg QRect viewBox = mSvgRenderer.viewBox(); if( viewBox.isValid() ) { double widthRatio = mFrameSize.width() / viewBox.width(); double heightRatio = mFrameSize.height() / viewBox.height(); double renderWidth = 0; double renderHeight = 0; if( widthRatio <= heightRatio ) { renderWidth = mFrameSize.width(); renderHeight = viewBox.height() * mFrameSize.width() / viewBox.width() ; } else { renderHeight = mFrameSize.height(); renderWidth = viewBox.width() * mFrameSize.height() /viewBox.height() ; } mSvgRenderer.render( painter, QRectF( mOffsetFromReferencePoint.x(), mOffsetFromReferencePoint.y(), renderWidth, renderHeight ) ); } if ( isSelected() ) { drawSelectionBoxes( painter ); } }