/*! \brief Render the plot to a given rectangle ( f.e QPrinter, QSvgRenderer ) \param plot Plot widget to be rendered \param painter Painter \param plotRect Bounding rectangle for the plot */ void QwtPolarRenderer::render( QwtPolarPlot *plot, QPainter *painter, const QRectF &plotRect ) const { if ( plot == NULL || painter == NULL || !painter->isActive() || !plotRect.isValid() || plot->size().isNull() ) { return; } d_data->plot = plot; /* The layout engine uses the same methods as they are used by the Qt layout system. Therefore we need to calculate the layout in screen coordinates and paint with a scaled painter. */ QTransform transform; transform.scale( double( painter->device()->logicalDpiX() ) / plot->logicalDpiX(), double( painter->device()->logicalDpiY() ) / plot->logicalDpiY() ); const QRectF layoutRect = transform.inverted().mapRect( plotRect ); QwtPolarLayout *layout = plot->plotLayout(); // All paint operations need to be scaled according to // the paint device metrics. QwtPolarLayout::Options layoutOptions = QwtPolarLayout::IgnoreScrollbars | QwtPolarLayout::IgnoreFrames; layout->activate( plot, layoutRect, layoutOptions ); painter->save(); painter->setWorldTransform( transform, true ); painter->save(); renderTitle( painter, layout->titleRect() ); painter->restore(); painter->save(); renderLegend( painter, layout->legendRect() ); painter->restore(); const QRectF &canvasRect = layout->canvasRect(); painter->save(); painter->setClipRect( canvasRect ); plot->drawCanvas( painter, canvasRect ); painter->restore(); painter->restore(); layout->invalidate(); d_data->plot = NULL; }
/*! \brief Render the plot to a given rectangle ( f.e on a QPrinter, QSvgRenderer ) \param painter Painter \param plotRect Bounding rectangle for the plot */ void QwtPolarPlot::renderTo( QPainter *painter, const QRect &plotRect ) const { if ( painter == 0 || !painter->isActive() || !plotRect.isValid() || size().isNull() ) { return; } // All paint operations need to be scaled according to // the paint device metrics. QwtPainter::setMetricsMap( this, painter->device() ); const QwtMetricsMap &metricsMap = QwtPainter::metricsMap(); int layoutOptions = QwtPolarLayout::IgnoreScrollbars | QwtPolarLayout::IgnoreFrames; (( QwtPolarPlot * )this )->plotLayout()->activate( this, QwtPainter::metricsMap().deviceToLayout( plotRect ), layoutOptions ); painter->save(); renderTitle( painter, plotLayout()->titleRect() ); painter->restore(); painter->save(); renderLegend( painter, plotLayout()->legendRect() ); painter->restore(); QRect canvasRect = plotLayout()->canvasRect(); canvasRect = metricsMap.layoutToDevice( canvasRect ); QwtPainter::setMetricsMap( painter->device(), painter->device() ); painter->save(); painter->setClipRect( canvasRect ); drawCanvas( painter, canvasRect ); painter->restore(); QwtPainter::resetMetricsMap(); (( QwtPolarPlot * )this )->plotLayout()->invalidate(); }
//-------------------------------------------------------------------------------------------------- /// Set up camera/viewport and render //-------------------------------------------------------------------------------------------------- void OverlayColorLegend::render(OpenGLContext* oglContext, const Vec2ui& position, const Vec2ui& size, bool software) { if (size.x() <= 0 || size.y() <= 0) { return; } Camera camera; camera.setViewport(position.x(), position.y(), size.x(), size.y()); camera.setProjectionAsPixelExact2D(); camera.setViewMatrix(Mat4d::IDENTITY); camera.applyOpenGL(); camera.viewport()->applyOpenGL(oglContext, Viewport::CLEAR_DEPTH); // Get layout information // Todo: Cache this between renderings. Update only when needed. OverlayColorLegendLayoutInfo layout(position, size); layoutInfo(&layout); // Set up text drawer TextDrawer textDrawer(m_font.p()); setupTextDrawer(&textDrawer, &layout); // Do the actual rendering if (software) { renderLegendImmediateMode(oglContext, &layout); textDrawer.renderSoftware(oglContext, camera); } else { const MatrixState matrixState(camera); renderLegend(oglContext, &layout, matrixState); textDrawer.render(oglContext, camera); } CVF_CHECK_OGL(oglContext); }
/*! Paint the contents of a QwtPlot instance into a given rectangle. \param plot Plot to be rendered \param painter Painter \param plotRect Bounding rectangle \sa renderDocument(), renderTo(), QwtPainter::setRoundingAlignment() */ void QwtPlotRenderer::render( QwtPlot *plot, QPainter *painter, const QRectF &plotRect ) const { int axisId; if ( painter == 0 || !painter->isActive() || !plotRect.isValid() || plot->size().isNull() ) return; if ( !( d_data->discardFlags & DiscardBackground ) ) qwtRenderBackground( painter, plotRect, plot ); /* The layout engine uses the same methods as they are used by the Qt layout system. Therefore we need to calculate the layout in screen coordinates and paint with a scaled painter. */ QTransform transform; transform.scale( double( painter->device()->logicalDpiX() ) / plot->logicalDpiX(), double( painter->device()->logicalDpiY() ) / plot->logicalDpiY() ); QRectF layoutRect = transform.inverted().mapRect( plotRect ); if ( !( d_data->discardFlags & DiscardBackground ) ) { // subtract the contents margins int left, top, right, bottom; plot->getContentsMargins( &left, &top, &right, &bottom ); layoutRect.adjust( left, top, -right, -bottom ); } int baseLineDists[QwtPlot::axisCnt]; if ( d_data->layoutFlags & FrameWithScales ) { for ( axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget ) { baseLineDists[axisId] = scaleWidget->margin(); scaleWidget->setMargin( 0 ); } if ( !plot->axisEnabled( axisId ) ) { int left = 0; int right = 0; int top = 0; int bottom = 0; // When we have a scale the frame is painted on // the position of the backbone - otherwise we // need to introduce a margin around the canvas switch( axisId ) { case QwtPlot::yLeft: layoutRect.adjust( 1, 0, 0, 0 ); break; case QwtPlot::yRight: layoutRect.adjust( 0, 0, -1, 0 ); break; case QwtPlot::xTop: layoutRect.adjust( 0, 1, 0, 0 ); break; case QwtPlot::xBottom: layoutRect.adjust( 0, 0, 0, -1 ); break; default: break; } layoutRect.adjust( left, top, right, bottom ); } } } // Calculate the layout for the document. QwtPlotLayout::Options layoutOptions = QwtPlotLayout::IgnoreScrollbars | QwtPlotLayout::IgnoreFrames; if ( d_data->discardFlags & DiscardLegend ) layoutOptions |= QwtPlotLayout::IgnoreLegend; plot->plotLayout()->activate( plot, layoutRect, layoutOptions ); // now start painting painter->save(); painter->setWorldTransform( transform, true ); // canvas QwtScaleMap maps[QwtPlot::axisCnt]; buildCanvasMaps( plot, plot->plotLayout()->canvasRect(), maps ); renderCanvas( plot, painter, plot->plotLayout()->canvasRect(), maps ); if ( !( d_data->discardFlags & DiscardTitle ) && ( !plot->titleLabel()->text().isEmpty() ) ) { renderTitle( plot, painter, plot->plotLayout()->titleRect() ); } if ( !( d_data->discardFlags & DiscardLegend ) && plot->legend() && !plot->legend()->isEmpty() ) { renderLegend( plot, painter, plot->plotLayout()->legendRect() ); } for ( axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget ) { int baseDist = scaleWidget->margin(); int startDist, endDist; scaleWidget->getBorderDistHint( startDist, endDist ); renderScale( plot, painter, axisId, startDist, endDist, baseDist, plot->plotLayout()->scaleRect( axisId ) ); } } plot->plotLayout()->invalidate(); // reset all widgets with their original attributes. if ( d_data->layoutFlags & FrameWithScales ) { // restore the previous base line dists for ( axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget ) scaleWidget->setMargin( baseLineDists[axisId] ); } } painter->restore(); }
/*! Paint the contents of a QwtPlot instance into a given rectangle. \param plot Plot to be rendered \param painter Painter \param plotRect Bounding rectangle \sa renderDocument(), renderTo(), QwtPainter::setRoundingAlignment() */ void QwtPlotRenderer::render( QwtPlot *plot, QPainter *painter, const QRectF &plotRect ) const { int axisId; if ( painter == 0 || !painter->isActive() || !plotRect.isValid() || plot->size().isNull() ) return; if ( !( d_data->discardFlags & DiscardBackground ) ) qwtRenderBackground( painter, plotRect, plot ); /* The layout engine uses the same methods as they are used by the Qt layout system. Therefore we need to calculate the layout in screen coordinates and paint with a scaled painter. */ QTransform transform; transform.scale( double( painter->device()->logicalDpiX() ) / plot->logicalDpiX(), double( painter->device()->logicalDpiY() ) / plot->logicalDpiY() ); painter->save(); int baseLineDists[QwtPlot::axisCnt]; if ( d_data->layoutFlags & FrameWithScales ) { for ( axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget ) { baseLineDists[axisId] = scaleWidget->margin(); scaleWidget->setMargin( 0 ); } } } // Calculate the layout for the print. QwtPlotLayout::Options layoutOptions = QwtPlotLayout::IgnoreScrollbars | QwtPlotLayout::IgnoreFrames; if ( d_data->discardFlags & DiscardLegend ) layoutOptions |= QwtPlotLayout::IgnoreLegend; const QRectF layoutRect = transform.inverted().mapRect( plotRect ); plot->plotLayout()->activate( plot, layoutRect, layoutOptions ); painter->setWorldTransform( transform, true ); // canvas QwtScaleMap maps[QwtPlot::axisCnt]; buildCanvasMaps( plot, plot->plotLayout()->canvasRect(), maps ); renderCanvas( plot, painter, plot->plotLayout()->canvasRect(), maps ); if ( !( d_data->discardFlags & DiscardTitle ) && ( !plot->titleLabel()->text().isEmpty() ) ) { renderTitle( plot, painter, plot->plotLayout()->titleRect() ); } if ( !( d_data->discardFlags & DiscardLegend ) && plot->legend() && !plot->legend()->isEmpty() ) { renderLegend( plot, painter, plot->plotLayout()->legendRect() ); } for ( axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget ) { int baseDist = scaleWidget->margin(); int startDist, endDist; scaleWidget->getBorderDistHint( startDist, endDist ); renderScale( plot, painter, axisId, startDist, endDist, baseDist, plot->plotLayout()->scaleRect( axisId ) ); } } plot->plotLayout()->invalidate(); // reset all widgets with their original attributes. if ( d_data->layoutFlags & FrameWithScales ) { // restore the previous base line dists for ( axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget ) scaleWidget->setMargin( baseLineDists[axisId] ); } } painter->restore(); }
void VisusTickMarks::display3D(VisusTransformation3D model_view_3D) { VisusTransformation3D local; GLint viewport[4]; // x, y, width, height int canvas_width, canvas_height; getValue<VisusSharedTransformation3D>(local); if (mParent==NULL) getValue<VisusSharedBoundingBox>(mBBox); else mParent->getValue<VisusSharedBoundingBox>(mBBox); switch (mTMAxis) { case TM_X_AXIS: mAxis.minValue(mBBox[0]); mAxis.maxValue(mBBox[3]); break; case TM_Y_AXIS: mAxis.minValue(mBBox[1]); mAxis.maxValue(mBBox[4]); break; case TM_Z_AXIS: mAxis.minValue(mBBox[2]); mAxis.maxValue(mBBox[5]); break; } //fprintf(stderr,"Axis [%f,%f] \n",mAxis.mMinValue,mAxis.mMaxValue); //fprintf(stderr,"VisusTickMarks bbox: [%f,%f,%f] x [%f,%f,%f]\n",mBBox[0],mBBox[1],mBBox[2], // mBBox[3],mBBox[4],mBBox[5]); model_view_3D *= local; // Determine Where To Draw Ticks getMostVisible(model_view_3D); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadMatrixf(model_view_3D); // Get the current viewport glGetIntegerv(GL_VIEWPORT,viewport); canvas_width = viewport[2]; canvas_height = viewport[3]; renderTickMarks(canvas_width, canvas_height); renderLegend(canvas_width,canvas_height); if (mDrawBoundingBox) displayBoundingBox(); for (CIterator it=mChildren.begin();it!=mChildren.end();it++) (*it)->display(model_view_3D); glPopMatrix(); vglerror(); }
/*! Paint the contents of a QwtPlot instance into a given rectangle. \param plot Plot to be rendered \param painter Painter \param plotRect Bounding rectangle \sa renderDocument(), renderTo(), QwtPainter::setRoundingAlignment() */ void QwtPlotRenderer::render( QwtPlot *plot, QPainter *painter, const QRectF &plotRect ) const { if ( painter == 0 || !painter->isActive() || !plotRect.isValid() || plot->size().isNull() ) { return; } if ( !( d_data->discardFlags & DiscardBackground ) ) QwtPainter::drawBackgound( painter, plotRect, plot ); /* The layout engine uses the same methods as they are used by the Qt layout system. Therefore we need to calculate the layout in screen coordinates and paint with a scaled painter. */ QTransform transform; transform.scale( double( painter->device()->logicalDpiX() ) / plot->logicalDpiX(), double( painter->device()->logicalDpiY() ) / plot->logicalDpiY() ); QRectF layoutRect = transform.inverted().mapRect( plotRect ); if ( !( d_data->discardFlags & DiscardBackground ) ) { // subtract the contents margins int left, top, right, bottom; plot->getContentsMargins( &left, &top, &right, &bottom ); layoutRect.adjust( left, top, -right, -bottom ); } QwtPlotLayout *layout = plot->plotLayout(); int baseLineDists[QwtAxis::PosCount]; int canvasMargins[QwtAxis::PosCount]; for ( int axisPos = 0; axisPos < QwtAxis::PosCount; axisPos++ ) { canvasMargins[ axisPos ] = layout->canvasMargin( axisPos ); if ( d_data->layoutFlags & FrameWithScales ) { const QwtAxisId axisId( axisPos, QWT_DUMMY_ID ); QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget ) { baseLineDists[ axisPos ] = scaleWidget->margin(); scaleWidget->setMargin( 0 ); } if ( !plot->isAxisVisible( axisId ) ) { int left = 0; int right = 0; int top = 0; int bottom = 0; // When we have a scale the frame is painted on // the position of the backbone - otherwise we // need to introduce a margin around the canvas switch( axisPos ) { case QwtAxis::yLeft: layoutRect.adjust( 1, 0, 0, 0 ); break; case QwtAxis::yRight: layoutRect.adjust( 0, 0, -1, 0 ); break; case QwtAxis::xTop: layoutRect.adjust( 0, 1, 0, 0 ); break; case QwtAxis::xBottom: layoutRect.adjust( 0, 0, 0, -1 ); break; } layoutRect.adjust( left, top, right, bottom ); } } } // Calculate the layout for the document. QwtPlotLayout::Options layoutOptions = QwtPlotLayout::IgnoreScrollbars; if ( ( d_data->layoutFlags & FrameWithScales ) || ( d_data->discardFlags & DiscardCanvasFrame ) ) { layoutOptions |= QwtPlotLayout::IgnoreFrames; } if ( d_data->discardFlags & DiscardLegend ) layoutOptions |= QwtPlotLayout::IgnoreLegend; if ( d_data->discardFlags & DiscardTitle ) layoutOptions |= QwtPlotLayout::IgnoreTitle; if ( d_data->discardFlags & DiscardFooter ) layoutOptions |= QwtPlotLayout::IgnoreFooter; layout->update( plot, layoutRect, layoutOptions ); // canvas QwtScaleMapTable mapTable = buildCanvasMaps( plot, layout->canvasRect() ); if ( updateCanvasMargins( plot, layout->canvasRect(), mapTable ) ) { // recalculate maps and layout, when the margins // have been changed layout->update( plot, layoutRect, layoutOptions ); mapTable = buildCanvasMaps( plot, layout->canvasRect() ); } // now start painting painter->save(); painter->setWorldTransform( transform, true ); renderCanvas( plot, painter, layout->canvasRect(), mapTable ); if ( !( d_data->discardFlags & DiscardTitle ) && ( !plot->titleLabel()->text().isEmpty() ) ) { renderTitle( plot, painter, layout->titleRect() ); } if ( !( d_data->discardFlags & DiscardFooter ) && ( !plot->footerLabel()->text().isEmpty() ) ) { renderFooter( plot, painter, layout->footerRect() ); } if ( !( d_data->discardFlags & DiscardLegend ) && plot->legend() && !plot->legend()->isEmpty() ) { renderLegend( plot, painter, layout->legendRect() ); } for ( int axisPos = 0; axisPos < QwtAxis::PosCount; axisPos++ ) { for ( int i = 0; i < plot->axesCount( i ); i++ ) { const QwtAxisId axisId( axisPos, i ); QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget ) { int baseDist = scaleWidget->margin(); int startDist, endDist; scaleWidget->getBorderDistHint( startDist, endDist ); renderScale( plot, painter, axisId, startDist, endDist, baseDist, layout->scaleRect( axisId ) ); } } } painter->restore(); // restore all setting to their original attributes. for ( int axisPos = 0; axisPos < QwtAxis::PosCount; axisPos++ ) { if ( d_data->layoutFlags & FrameWithScales ) { const QwtAxisId axisId( axisPos, QWT_DUMMY_ID ); QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget ) scaleWidget->setMargin( baseLineDists[axisPos] ); } layout->setCanvasMargin( canvasMargins[axisPos] ); } layout->invalidate(); }