void QgsComposerPolygon::_draw( QPainter *painter ) { //setup painter scaling to dots so that raster symbology is drawn to scale const double dotsPerMM = painter->device()->logicalDpiX() / 25.4; QgsMapSettings ms = mComposition->mapSettings(); ms.setOutputDpi( painter->device()->logicalDpiX() ); QgsRenderContext context = QgsRenderContext::fromMapSettings( ms ); context.setPainter( painter ); context.setForceVectorOutput( true ); QScopedPointer<QgsExpressionContext> expressionContext; expressionContext.reset( createExpressionContext() ); context.setExpressionContext( *expressionContext.data() ); painter->scale( 1 / dotsPerMM, 1 / dotsPerMM ); // scale painter from mm to dots QTransform t = QTransform::fromScale( dotsPerMM, dotsPerMM ); QList<QPolygonF> rings; //empty QPainterPath polygonPath; polygonPath.addPolygon( mPolygon ); mPolygonStyleSymbol->startRender( context ); mPolygonStyleSymbol->renderPolygon( polygonPath.toFillPolygon( t ), &rings, nullptr, context ); mPolygonStyleSymbol->stopRender( context ); painter->scale( dotsPerMM, dotsPerMM ); }
void QgsComposerNodesItem::drawSelectedNode( QPainter *painter ) const { double rectSize = 3.0 / horizontalViewScaleFactor(); QgsStringMap properties; properties.insert( QStringLiteral( "name" ), QStringLiteral( "square" ) ); properties.insert( QStringLiteral( "color" ), QStringLiteral( "0, 0, 0, 0" ) ); properties.insert( QStringLiteral( "color_border" ), QStringLiteral( "blue" ) ); properties.insert( QStringLiteral( "width_border" ), QStringLiteral( "4" ) ); QScopedPointer<QgsMarkerSymbol> symbol; symbol.reset( QgsMarkerSymbol::createSimple( properties ) ); symbol.data()->setSize( rectSize ); QgsMapSettings ms = mComposition->mapSettings(); ms.setOutputDpi( painter->device()->logicalDpiX() ); QgsRenderContext context = QgsRenderContext::fromMapSettings( ms ); context.setPainter( painter ); context.setForceVectorOutput( true ); QgsExpressionContext expressionContext = createExpressionContext(); context.setExpressionContext( expressionContext ); symbol.data()->startRender( context ); symbol.data()->renderPoint( mPolygon.at( mSelectedNode ), nullptr, context ); symbol.data()->stopRender( context ); }
void QgsComposerArrow::drawLine( QPainter *painter ) { if ( ! mLineSymbol || ! mComposition ) { return; } QPaintDevice* thePaintDevice = painter->device(); painter->save(); //setup painter scaling to dots so that raster symbology is drawn to scale double dotsPerMM = thePaintDevice->logicalDpiX() / 25.4; painter->scale( 1 / dotsPerMM, 1 / dotsPerMM ); //scale painter from mm to dots //setup render context QgsMapSettings ms = mComposition->mapSettings(); //context units should be in dots ms.setOutputDpi( painter->device()->logicalDpiX() ); QgsRenderContext context = QgsRenderContext::fromMapSettings( ms ); context.setForceVectorOutput( true ); context.setPainter( painter ); QgsExpressionContext* expressionContext = createExpressionContext(); context.setExpressionContext( *expressionContext ); delete expressionContext; //line scaled to dots QPolygonF line; line << QPointF( mStartPoint.x() - pos().x(), mStartPoint.y() - pos().y() ) * dotsPerMM << QPointF( mStopPoint.x() - pos().x(), mStopPoint.y() - pos().y() ) * dotsPerMM; mLineSymbol->startRender( context ); mLineSymbol->renderPolyline( line, 0, context ); mLineSymbol->stopRender( context ); painter->restore(); }
void QgsPaperItem::paint( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle, QWidget* pWidget ) { Q_UNUSED( itemStyle ); Q_UNUSED( pWidget ); if ( !painter || !mComposition || !mComposition->pagesVisible() ) { return; } //setup painter scaling to dots so that raster symbology is drawn to scale double dotsPerMM = painter->device()->logicalDpiX() / 25.4; //setup render context QgsMapSettings ms = mComposition->mapSettings(); //context units should be in dots ms.setOutputDpi( painter->device()->logicalDpiX() ); QgsRenderContext context = QgsRenderContext::fromMapSettings( ms ); context.setPainter( painter ); context.setForceVectorOutput( true ); QgsExpressionContext* expressionContext = createExpressionContext(); context.setExpressionContext( *expressionContext ); delete expressionContext; painter->save(); if ( mComposition->plotStyle() == QgsComposition::Preview ) { //if in preview mode, draw page border and shadow so that it's //still possible to tell where pages with a transparent style begin and end painter->setRenderHint( QPainter::Antialiasing, false ); //shadow painter->setBrush( QBrush( QColor( 150, 150, 150 ) ) ); painter->setPen( Qt::NoPen ); painter->drawRect( QRectF( 1, 1, rect().width() + 1, rect().height() + 1 ) ); //page area painter->setBrush( QColor( 215, 215, 215 ) ); painter->setPen( QPen( QColor( 100, 100, 100 ) ) ); painter->drawRect( QRectF( 0, 0, rect().width(), rect().height() ) ); } painter->scale( 1 / dotsPerMM, 1 / dotsPerMM ); // scale painter from mm to dots painter->setRenderHint( QPainter::Antialiasing ); mComposition->pageStyleSymbol()->startRender( context ); calculatePageMargin(); QPolygonF pagePolygon = QPolygonF( QRectF( mPageMargin * dotsPerMM, mPageMargin * dotsPerMM, ( rect().width() - 2 * mPageMargin ) * dotsPerMM, ( rect().height() - 2 * mPageMargin ) * dotsPerMM ) ); QList<QPolygonF> rings; //empty list mComposition->pageStyleSymbol()->renderPolygon( pagePolygon, &rings, nullptr, context ); mComposition->pageStyleSymbol()->stopRender( context ); painter->restore(); }
QgsMapSettings QgsGlobeTileImage::createSettings( int dpi, const QList<QgsMapLayer *> &layers ) const { QgsMapSettings settings; settings.setBackgroundColor( QColor( Qt::transparent ) ); settings.setDestinationCrs( QgsCoordinateReferenceSystem::fromOgcWmsCrs( GEO_EPSG_CRS_AUTHID ) ); settings.setExtent( mTileExtent ); settings.setLayers( layers ); settings.setFlag( QgsMapSettings::DrawEditingInfo, false ); settings.setFlag( QgsMapSettings::DrawLabeling, false ); settings.setFlag( QgsMapSettings::DrawSelection, false ); settings.setOutputSize( QSize( mTileSize, mTileSize ) ); settings.setOutputImageFormat( QImage::Format_ARGB32_Premultiplied ); settings.setOutputDpi( dpi ); settings.setCustomRenderFlags( "globe" ); return settings; }
void QgsMeshCalcUtils::updateMesh() const { if ( ! mMeshLayer->nativeMesh() ) { // we do not care about triangles, // we just want transformed coordinates // of the native mesh. So create // some dummy triangular mesh. QgsMapSettings mapSettings; mapSettings.setExtent( mMeshLayer->extent() ); mapSettings.setDestinationCrs( mMeshLayer->crs() ); mapSettings.setOutputDpi( 96 ); QgsRenderContext context = QgsRenderContext::fromMapSettings( mapSettings ); mMeshLayer->createMapRenderer( context ); } }
void QgsComposerLegend::paint( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle, QWidget* pWidget ) { Q_UNUSED( itemStyle ); Q_UNUSED( pWidget ); if ( !painter ) return; int dpi = painter->device()->logicalDpiX(); double dotsPerMM = dpi / 25.4; if ( mComposition ) { mSettings.setUseAdvancedEffects( mComposition->useAdvancedEffects() ); mSettings.setDpi( dpi ); } if ( mComposerMap ) { mSettings.setMmPerMapUnit( mComposerMap->mapUnitsToMM() ); // use a temporary QgsMapSettings to find out real map scale QgsMapSettings ms = mComposerMap->composition()->mapSettings(); ms.setOutputSize( QSizeF( mComposerMap->rect().width() * dotsPerMM, mComposerMap->rect().height() * dotsPerMM ).toSize() ); ms.setExtent( *mComposerMap->currentMapExtent() ); ms.setOutputDpi( dpi ); mSettings.setMapScale( ms.scale() ); } drawBackground( painter ); painter->save(); //antialiasing on painter->setRenderHint( QPainter::Antialiasing, true ); painter->setPen( QPen( QColor( 0, 0, 0 ) ) ); QgsLegendRenderer legendRenderer( mLegendModel2, mSettings ); legendRenderer.setLegendSize( rect().size() ); legendRenderer.drawLegend( painter ); painter->restore(); //draw frame and selection boxes if necessary drawFrame( painter ); if ( isSelected() ) { drawSelectionBoxes( painter ); } }
QgsMapSettings QgsGlobeTileImage::createSettings( int dpi , const QStringList &layerSet ) const { QgsMapSettings settings; settings.setBackgroundColor( QColor( Qt::transparent ) ); settings.setDestinationCrs( QgsCRSCache::instance()->crsByAuthId( GEO_EPSG_CRS_AUTHID ) ); settings.setCrsTransformEnabled( true ); settings.setExtent( mTileExtent ); settings.setLayers( layerSet ); settings.setFlag( QgsMapSettings::DrawEditingInfo, false ); settings.setFlag( QgsMapSettings::DrawLabeling, false ); settings.setFlag( QgsMapSettings::DrawSelection, false ); settings.setMapUnits( QGis::Degrees ); settings.setOutputSize( QSize( mTileSize, mTileSize ) ); settings.setOutputImageFormat( QImage::Format_ARGB32_Premultiplied ); settings.setOutputDpi( dpi ); settings.setCustomRenderFlags( "globe" ); return settings; }
void QgsComposerPolyline::_draw( QPainter *painter ) { double dotsPerMM = painter->device()->logicalDpiX() / 25.4; QgsMapSettings ms = mComposition->mapSettings(); ms.setOutputDpi( painter->device()->logicalDpiX() ); QgsRenderContext context = QgsRenderContext::fromMapSettings( ms ); context.setPainter( painter ); context.setForceVectorOutput( true ); QgsExpressionContext expressionContext = createExpressionContext(); context.setExpressionContext( expressionContext ); painter->scale( 1 / dotsPerMM, 1 / dotsPerMM ); // scale painter from mm to dots QTransform t = QTransform::fromScale( dotsPerMM, dotsPerMM ); mPolylineStyleSymbol->startRender( context ); mPolylineStyleSymbol->renderPolyline( t.map( mPolygon ), nullptr, context ); mPolylineStyleSymbol->stopRender( context ); painter->scale( dotsPerMM, dotsPerMM ); }
void QgsComposerShape::drawShapeUsingSymbol( QPainter* p ) { p->save(); p->setRenderHint( QPainter::Antialiasing ); //setup painter scaling to dots so that raster symbology is drawn to scale double dotsPerMM = p->device()->logicalDpiX() / 25.4; //setup render context QgsMapSettings ms = mComposition->mapSettings(); //context units should be in dots ms.setOutputDpi( p->device()->logicalDpiX() ); QgsRenderContext context = QgsRenderContext::fromMapSettings( ms ); context.setPainter( p ); context.setForceVectorOutput( true ); QgsExpressionContext* expressionContext = createExpressionContext(); context.setExpressionContext( *expressionContext ); delete expressionContext; p->scale( 1 / dotsPerMM, 1 / dotsPerMM ); // scale painter from mm to dots //generate polygon to draw QList<QPolygonF> rings; //empty list QPolygonF shapePolygon; //shapes with curves must be enlarged before conversion to QPolygonF, or //the curves are approximated too much and appear jaggy QTransform t = QTransform::fromScale( 100, 100 ); //inverse transform used to scale created polygons back to expected size QTransform ti = t.inverted(); switch ( mShape ) { case Ellipse: { //create an ellipse QPainterPath ellipsePath; ellipsePath.addEllipse( QRectF( 0, 0, rect().width() * dotsPerMM, rect().height() * dotsPerMM ) ); QPolygonF ellipsePoly = ellipsePath.toFillPolygon( t ); shapePolygon = ti.map( ellipsePoly ); break; } case Rectangle: { //if corner radius set, then draw a rounded rectangle if ( mCornerRadius > 0 ) { QPainterPath roundedRectPath; roundedRectPath.addRoundedRect( QRectF( 0, 0, rect().width() * dotsPerMM, rect().height() * dotsPerMM ), mCornerRadius * dotsPerMM, mCornerRadius * dotsPerMM ); QPolygonF roundedPoly = roundedRectPath.toFillPolygon( t ); shapePolygon = ti.map( roundedPoly ); } else { shapePolygon = QPolygonF( QRectF( 0, 0, rect().width() * dotsPerMM, rect().height() * dotsPerMM ) ); } break; } case Triangle: { shapePolygon << QPointF( 0, rect().height() * dotsPerMM ); shapePolygon << QPointF( rect().width() * dotsPerMM, rect().height() * dotsPerMM ); shapePolygon << QPointF( rect().width() / 2.0 * dotsPerMM, 0 ); shapePolygon << QPointF( 0, rect().height() * dotsPerMM ); break; } } mShapeStyleSymbol->startRender( context ); mShapeStyleSymbol->renderPolygon( shapePolygon, &rings, nullptr, context ); mShapeStyleSymbol->stopRender( context ); p->restore(); }
void QgsComposerMapOverview::draw( QPainter *painter ) { if ( !mEnabled || mFrameMapId == -1 || !mComposerMap || !mComposerMap->composition() ) { return; } if ( !painter ) { return; } const QgsComposerMap* overviewFrameMap = mComposerMap->composition()->getComposerMapById( mFrameMapId ); if ( !overviewFrameMap ) { return; } //get polygon for other overview frame map's extent (use visibleExtentPolygon as it accounts for map rotation) QPolygonF otherExtent = overviewFrameMap->visibleExtentPolygon(); //get current map's extent as a QPolygonF QPolygonF thisExtent = mComposerMap->visibleExtentPolygon(); //intersect the two QPolygonF intersectExtent = thisExtent.intersected( otherExtent ); //setup painter scaling to dots so that raster symbology is drawn to scale double dotsPerMM = painter->device()->logicalDpiX() / 25.4; //setup render context QgsMapSettings ms = mComposerMap->composition()->mapSettings(); //context units should be in dots ms.setOutputSize( QSizeF( mComposerMap->rect().width() * dotsPerMM, mComposerMap->rect().height() * dotsPerMM ).toSize() ); ms.setExtent( *mComposerMap->currentMapExtent() ); ms.setOutputDpi( painter->device()->logicalDpiX() ); QgsRenderContext context = QgsRenderContext::fromMapSettings( ms ); context.setForceVectorOutput( true ); context.setPainter( painter ); QgsExpressionContext* expressionContext = createExpressionContext(); context.setExpressionContext( *expressionContext ); delete expressionContext; painter->save(); painter->setCompositionMode( mBlendMode ); painter->translate( mComposerMap->mXOffset, mComposerMap->mYOffset ); painter->scale( 1 / dotsPerMM, 1 / dotsPerMM ); // scale painter from mm to dots painter->setRenderHint( QPainter::Antialiasing ); mFrameSymbol->startRender( context ); //construct a polygon corresponding to the intersecting map extent //need to scale line to dots, rather then mm, since the painter has been scaled to dots QTransform mapTransform; QPolygonF thisRectPoly = QPolygonF( QRectF( 0, 0, dotsPerMM * mComposerMap->rect().width(), dotsPerMM * mComposerMap->rect().height() ) ); //workaround QT Bug #21329 thisRectPoly.pop_back(); thisExtent.pop_back(); //create transform from map coordinates to painter coordinates QTransform::quadToQuad( thisExtent, thisRectPoly, mapTransform ); QPolygonF intersectPolygon; intersectPolygon = mapTransform.map( intersectExtent ); QList<QPolygonF> rings; //empty list if ( !mInverted ) { //Render the intersecting map extent mFrameSymbol->renderPolygon( intersectPolygon, &rings, nullptr, context ); } else { //We are inverting the overview frame (ie, shading outside the intersecting extent) //Construct a polygon corresponding to the overview map extent QPolygonF outerPolygon; outerPolygon << QPointF( 0, 0 ) << QPointF( mComposerMap->rect().width() * dotsPerMM, 0 ) << QPointF( mComposerMap->rect().width() * dotsPerMM, mComposerMap->rect().height() * dotsPerMM ) << QPointF( 0, mComposerMap->rect().height() * dotsPerMM ) << QPointF( 0, 0 ); //Intersecting extent is an inner ring for the shaded area rings.append( intersectPolygon ); mFrameSymbol->renderPolygon( outerPolygon, &rings, nullptr, context ); } mFrameSymbol->stopRender( context ); painter->restore(); }
void QgsComposerLegend::paint( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle, QWidget* pWidget ) { Q_UNUSED( itemStyle ); Q_UNUSED( pWidget ); if ( !painter ) return; if ( !shouldDrawItem() ) { return; } if ( mFilterAskedForUpdate ) { mFilterAskedForUpdate = false; doUpdateFilterByMap(); } int dpi = painter->device()->logicalDpiX(); double dotsPerMM = dpi / 25.4; if ( mComposition ) { mSettings.setUseAdvancedEffects( mComposition->useAdvancedEffects() ); mSettings.setDpi( dpi ); } if ( mComposerMap ) { mSettings.setMmPerMapUnit( mComposerMap->mapUnitsToMM() ); // use a temporary QgsMapSettings to find out real map scale QgsMapSettings ms = mComposerMap->composition()->mapSettings(); ms.setOutputSize( QSizeF( mComposerMap->rect().width() * dotsPerMM, mComposerMap->rect().height() * dotsPerMM ).toSize() ); ms.setExtent( *mComposerMap->currentMapExtent() ); ms.setOutputDpi( dpi ); mSettings.setMapScale( ms.scale() ); } drawBackground( painter ); painter->save(); //antialiasing on painter->setRenderHint( QPainter::Antialiasing, true ); painter->setPen( QPen( QColor( 0, 0, 0 ) ) ); QgsLegendRenderer legendRenderer( mLegendModel2, mSettings ); legendRenderer.setLegendSize( rect().size() ); //adjust box if width or height is too small QSizeF size = legendRenderer.minimumSize(); if ( size.height() > rect().height() || size.width() > rect().width() ) { //need to resize box QRectF targetRect = QRectF( pos().x(), pos().y(), rect().width(), rect().height() ); if ( size.height() > targetRect.height() ) targetRect.setHeight( size.height() ); if ( size.width() > rect().width() ) targetRect.setWidth( size.width() ); //set new rect, respecting position mode and data defined size/position setSceneRect( evalItemRect( targetRect, true ) ); } legendRenderer.drawLegend( painter ); painter->restore(); //draw frame and selection boxes if necessary drawFrame( painter ); if ( isSelected() ) { drawSelectionBoxes( painter ); } }