bool QGstreamerGLTextureRenderer::processBusMessage(const QGstreamerMessage &message) { GstMessage* gm = message.rawMessage(); #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO << GST_MESSAGE_TYPE_NAME(gm); #endif if (GST_MESSAGE_TYPE(gm) == GST_MESSAGE_STATE_CHANGED && GST_MESSAGE_SRC(gm) == GST_OBJECT_CAST(m_videoSink)) { GstState oldState; GstState newState; gst_message_parse_state_changed(gm, &oldState, &newState, 0); #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO << "State changed:" << oldState << newState; #endif if (newState == GST_STATE_READY || newState == GST_STATE_NULL) { stopRenderer(); } if (oldState == GST_STATE_READY && newState == GST_STATE_PAUSED) { updateNativeVideoSize(); } } return false; }
MainWindow::MainWindow(CuteDesigner::Core *core) : QMainWindow(), ui(new Ui::MainWindow), m_core(core) { ui->setupUi(this); // defaultPageActions = ui->menuPage->actions(); // foreach (QAction * action, defaultPageActions) // action->setParent(this); ui->actionExport->setEnabled(m_core->reportCore()->exportModules().size()); // Initialise the global search widget StyleHelper::setBaseColor(palette().color(QPalette::Highlight).darker()); // ui->tabs->SetBackgroundPixmap(QPixmap(":/images/sidebar_background.png")); connect(ui->actionRender, SIGNAL(triggered()), core, SLOT(render()), Qt::QueuedConnection); connect(ui->actionRenderStop, SIGNAL(triggered()), core, SLOT(stopRenderer()), Qt::QueuedConnection); connect(ui->tabs, SIGNAL(CurrentChanged(int)), this, SLOT(slotTabsSwitched(int))); connect(ui->actionAbout, SIGNAL(triggered()), this, SLOT(slotAbout())); connect(ui->actionOptions, SIGNAL(triggered()), this, SLOT(slotOptions())); connect(ui->actionQuit, SIGNAL(triggered()), this, SLOT(close())); connect(m_core, SIGNAL(newReport_after(CuteReport::ReportInterface*)), this, SLOT(slotNewReport_after(CuteReport::ReportInterface*)), Qt::QueuedConnection); connect(m_core, SIGNAL(newPage_after(CuteReport::PageInterface*)), this, SLOT(slotNewPage_after(CuteReport::PageInterface*)), Qt::QueuedConnection); connect(m_core, SIGNAL(loadReport_after(CuteReport::ReportInterface*)), this, SLOT(slotLoadReport_after(CuteReport::ReportInterface*)), Qt::QueuedConnection); // connect(m_core, SIGNAL(newPageActions(QList<CuteReport::PageAction*>)), this, SLOT(slotNewPageActions(QList<CuteReport::PageAction*>)), Qt::QueuedConnection); connect(CuteReport::Log::instance(), SIGNAL(logMessage(CuteReport::LogLevel,QString,QString,QString)), ui->message, SLOT(pushMessage(CuteReport::LogLevel,QString,QString,QString))); connect(m_core->reportCore(), SIGNAL(rendererStarted(CuteReport::ReportInterface*)), ui->message, SLOT(clear())); // reloadSettings(); ui->geometryLabel->hide(); ui->coordinateLabel->hide(); m_updateTabTimer.setInterval(10); m_updateTabTimer.setSingleShot(true); connect(&m_updateTabTimer, SIGNAL(timeout()), this, SLOT(slotUpdateTabs())); }
void QGstreamerGLTextureRenderer::handleBusMessage(GstMessage* gm) { #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO << GST_MESSAGE_TYPE_NAME(gm); #endif if (GST_MESSAGE_TYPE(gm) == GST_MESSAGE_STATE_CHANGED) { GstState oldState; GstState newState; gst_message_parse_state_changed(gm, &oldState, &newState, 0); #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO << "State changed:" << oldState << newState; #endif if (newState == GST_STATE_READY || newState == GST_STATE_NULL) { stopRenderer(); } if (oldState == GST_STATE_READY && newState == GST_STATE_PAUSED) { updateNativeVideoSize(); } } }
void QGstreamerGLTextureRenderer::renderGLFrame(int frame) { #if defined(GL_TEXTURE_SINK_DEBUG) && GL_TEXTURE_SINK_DEBUG > 1 qDebug() << Q_FUNC_INFO << "frame:" << frame << "surface active:" << m_surface->isActive(); #endif QMutexLocker locker(&m_mutex); if (!m_surface || !m_glEnabled) { m_renderCondition.wakeAll(); return; } MeegoGstVideoTexture *textureSink = MEEGO_GST_VIDEO_TEXTURE(m_videoSink); if (m_context) m_context->makeCurrent(); //don't try to render the frame if state is changed to NULL or READY GstState pendingState = GST_STATE_NULL; GstState newState = GST_STATE_NULL; GstStateChangeReturn res = gst_element_get_state(m_videoSink, &newState, &pendingState, 0);//don't block and return immediately if (res == GST_STATE_CHANGE_FAILURE || newState == GST_STATE_NULL || pendingState == GST_STATE_NULL) { stopRenderer(); m_renderCondition.wakeAll(); return; } if (m_surface->isActive() && m_surface->surfaceFormat().handleType() != EGLImageTextureHandle) m_surface->stop(); if (!m_surface->isActive()) { //find the native video size GstPad *pad = gst_element_get_static_pad(m_videoSink,"sink"); GstCaps *caps = gst_pad_get_negotiated_caps(pad); if (caps) { QSize newNativeSize = QGstUtils::capsCorrectedResolution(caps); if (m_nativeSize != newNativeSize) { m_nativeSize = newNativeSize; emit nativeSizeChanged(); } gst_caps_unref(caps); } //start the surface... QVideoSurfaceFormat format(m_nativeSize, QVideoFrame::Format_RGB32, EGLImageTextureHandle); if (!m_surface->start(format)) { qWarning() << Q_FUNC_INFO << "failed to start video surface" << format; m_renderCondition.wakeAll(); return; } } QGStreamerGLTextureBuffer *buffer = new QGStreamerGLTextureBuffer(textureSink, frame); QVideoFrame videoFrame(buffer, m_surface->surfaceFormat().frameSize(), m_surface->surfaceFormat().pixelFormat()); m_surface->present(videoFrame); m_renderCondition.wakeAll(); }
void QgsVectorLayerRenderer::drawRendererLevels( QgsFeatureIterator &fit ) { QHash< QgsSymbol *, QList<QgsFeature> > features; // key = symbol, value = array of features QgsSingleSymbolRenderer *selRenderer = nullptr; if ( !mSelectedFeatureIds.isEmpty() ) { selRenderer = new QgsSingleSymbolRenderer( QgsSymbol::defaultSymbol( mGeometryType ) ); selRenderer->symbol()->setColor( mContext.selectionColor() ); selRenderer->setVertexMarkerAppearance( mVertexMarkerStyle, mVertexMarkerSize ); selRenderer->startRender( mContext, mFields ); } QgsExpressionContextScope *symbolScope = QgsExpressionContextUtils::updateSymbolScope( nullptr, new QgsExpressionContextScope() ); mContext.expressionContext().appendScope( symbolScope ); // 1. fetch features QgsFeature fet; while ( fit.nextFeature( fet ) ) { if ( mContext.renderingStopped() ) { qDebug( "rendering stop!" ); stopRenderer( selRenderer ); delete mContext.expressionContext().popScope(); return; } if ( !fet.hasGeometry() ) continue; // skip features without geometry mContext.expressionContext().setFeature( fet ); QgsSymbol *sym = mRenderer->symbolForFeature( fet, mContext ); if ( !sym ) { continue; } if ( !features.contains( sym ) ) { features.insert( sym, QList<QgsFeature>() ); } features[sym].append( fet ); // new labeling engine if ( mContext.labelingEngine() ) { QgsGeometry obstacleGeometry; QgsSymbolList symbols = mRenderer->originalSymbolsForFeature( fet, mContext ); if ( !symbols.isEmpty() && fet.geometry().type() == QgsWkbTypes::PointGeometry ) { obstacleGeometry = QgsVectorLayerLabelProvider::getPointObstacleGeometry( fet, mContext, symbols ); } if ( !symbols.isEmpty() ) { QgsExpressionContextUtils::updateSymbolScope( symbols.at( 0 ), symbolScope ); } if ( mLabelProvider ) { mLabelProvider->registerFeature( fet, mContext, obstacleGeometry ); } if ( mDiagramProvider ) { mDiagramProvider->registerFeature( fet, mContext, obstacleGeometry ); } } } delete mContext.expressionContext().popScope(); if ( features.empty() ) { // nothing to draw stopRenderer( selRenderer ); return; } // find out the order QgsSymbolLevelOrder levels; QgsSymbolList symbols = mRenderer->symbols( mContext ); for ( int i = 0; i < symbols.count(); i++ ) { QgsSymbol *sym = symbols[i]; for ( int j = 0; j < sym->symbolLayerCount(); j++ ) { int level = sym->symbolLayer( j )->renderingPass(); if ( level < 0 || level >= 1000 ) // ignore invalid levels continue; QgsSymbolLevelItem item( sym, j ); while ( level >= levels.count() ) // append new empty levels levels.append( QgsSymbolLevel() ); levels[level].append( item ); } } // 2. draw features in correct order for ( int l = 0; l < levels.count(); l++ ) { QgsSymbolLevel &level = levels[l]; for ( int i = 0; i < level.count(); i++ ) { QgsSymbolLevelItem &item = level[i]; if ( !features.contains( item.symbol() ) ) { QgsDebugMsg( QStringLiteral( "level item's symbol not found!" ) ); continue; } int layer = item.layer(); QList<QgsFeature> &lst = features[item.symbol()]; QList<QgsFeature>::iterator fit; for ( fit = lst.begin(); fit != lst.end(); ++fit ) { if ( mContext.renderingStopped() ) { stopRenderer( selRenderer ); return; } bool sel = mContext.showSelection() && mSelectedFeatureIds.contains( fit->id() ); // maybe vertex markers should be drawn only during the last pass... bool drawMarker = ( mDrawVertexMarkers && mContext.drawEditingInformation() && ( !mVertexMarkerOnlyForSelection || sel ) ); mContext.expressionContext().setFeature( *fit ); try { mRenderer->renderFeature( *fit, mContext, layer, sel, drawMarker ); } catch ( const QgsCsException &cse ) { Q_UNUSED( cse ); QgsDebugMsg( QStringLiteral( "Failed to transform a point while drawing a feature with ID '%1'. Ignoring this feature. %2" ) .arg( fet.id() ).arg( cse.what() ) ); } } } } stopRenderer( selRenderer ); }
void QgsVectorLayerRenderer::drawRenderer( QgsFeatureIterator &fit ) { QgsExpressionContextScope *symbolScope = QgsExpressionContextUtils::updateSymbolScope( nullptr, new QgsExpressionContextScope() ); mContext.expressionContext().appendScope( symbolScope ); QgsFeature fet; while ( fit.nextFeature( fet ) ) { try { if ( mContext.renderingStopped() ) { QgsDebugMsg( QStringLiteral( "Drawing of vector layer %1 canceled." ).arg( layerId() ) ); break; } if ( !fet.hasGeometry() || fet.geometry().isEmpty() ) continue; // skip features without geometry mContext.expressionContext().setFeature( fet ); bool sel = mContext.showSelection() && mSelectedFeatureIds.contains( fet.id() ); bool drawMarker = ( mDrawVertexMarkers && mContext.drawEditingInformation() && ( !mVertexMarkerOnlyForSelection || sel ) ); // render feature bool rendered = mRenderer->renderFeature( fet, mContext, -1, sel, drawMarker ); // labeling - register feature if ( rendered ) { // new labeling engine if ( mContext.labelingEngine() && ( mLabelProvider || mDiagramProvider ) ) { QgsGeometry obstacleGeometry; QgsSymbolList symbols = mRenderer->originalSymbolsForFeature( fet, mContext ); if ( !symbols.isEmpty() && fet.geometry().type() == QgsWkbTypes::PointGeometry ) { obstacleGeometry = QgsVectorLayerLabelProvider::getPointObstacleGeometry( fet, mContext, symbols ); } if ( !symbols.isEmpty() ) { QgsExpressionContextUtils::updateSymbolScope( symbols.at( 0 ), symbolScope ); } if ( mLabelProvider ) { mLabelProvider->registerFeature( fet, mContext, obstacleGeometry ); } if ( mDiagramProvider ) { mDiagramProvider->registerFeature( fet, mContext, obstacleGeometry ); } } } } catch ( const QgsCsException &cse ) { Q_UNUSED( cse ); QgsDebugMsg( QStringLiteral( "Failed to transform a point while drawing a feature with ID '%1'. Ignoring this feature. %2" ) .arg( fet.id() ).arg( cse.what() ) ); } } delete mContext.expressionContext().popScope(); stopRenderer( nullptr ); }