void test_prealloc() { value1 = 0; ctx::default_stack alloc; ctx::stack_context sctx( alloc.allocate() ); void * sp = static_cast< char * >( sctx.sp) - 10; std::size_t size = sctx.size - 10; ctx::captured_context ctx( std::allocator_arg, ctx::preallocated( sp, size, sctx), alloc, fn1, 7); ctx(); BOOST_CHECK_EQUAL( 7, value1); }
void QgsDxfExport::writeEntitiesSymbolLevels( QgsVectorLayer* layer ) { if ( !layer ) { return; } QgsFeatureRendererV2* renderer = layer->rendererV2(); if ( !renderer ) { //return error } QHash< QgsSymbolV2*, QList<QgsFeature> > features; QgsRenderContext ctx = renderContext(); QgsSymbolV2RenderContext sctx( ctx, QgsSymbolV2::MM , 1.0, false, 0, 0 ); renderer->startRender( ctx, layer->pendingFields() ); //get iterator QgsFeatureRequest req; if ( layer->wkbType() == QGis::WKBNoGeometry ) { req.setFlags( QgsFeatureRequest::NoGeometry ); } req.setSubsetOfAttributes( QStringList( renderer->usedAttributes() ), layer->pendingFields() ); if ( !mExtent.isEmpty() ) { req.setFilterRect( mExtent ); } QgsFeatureIterator fit = layer->getFeatures( req ); //fetch features QgsFeature fet; QgsSymbolV2* featureSymbol = 0; while ( fit.nextFeature( fet ) ) { featureSymbol = renderer->symbolForFeature( fet ); if ( !featureSymbol ) { continue; } QHash< QgsSymbolV2*, QList<QgsFeature> >::iterator it = features.find( featureSymbol ); if ( it == features.end() ) { it = features.insert( featureSymbol, QList<QgsFeature>() ); } it.value().append( fet ); } //find out order QgsSymbolV2LevelOrder levels; QgsSymbolV2List symbols = renderer->symbols(); for ( int i = 0; i < symbols.count(); i++ ) { QgsSymbolV2* 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; QgsSymbolV2LevelItem item( sym, j ); while ( level >= levels.count() ) // append new empty levels levels.append( QgsSymbolV2Level() ); levels[level].append( item ); } } //export symbol layers and symbology for ( int l = 0; l < levels.count(); l++ ) { QgsSymbolV2Level& level = levels[l]; for ( int i = 0; i < level.count(); i++ ) { QgsSymbolV2LevelItem& item = level[i]; QHash< QgsSymbolV2*, QList<QgsFeature> >::iterator levelIt = features.find( item.symbol() ); int llayer = item.layer(); QList<QgsFeature>& featureList = levelIt.value(); QList<QgsFeature>::iterator featureIt = featureList.begin(); for ( ; featureIt != featureList.end(); ++featureIt ) { addFeature( sctx, layer->name(), levelIt.key()->symbolLayer( llayer ), levelIt.key() ); } } } renderer->stopRender( ctx ); }
void QgsDxfExport::writeEntities() { startSection(); writeGroup( 2, "ENTITIES" ); //label engine QgsDxfPalLabeling labelEngine( this, mExtent.isEmpty() ? dxfExtent() : mExtent, mSymbologyScaleDenominator, mMapUnits ); QgsRenderContext& ctx = labelEngine.renderContext(); //iterate through the maplayers QList< QgsMapLayer* >::iterator layerIt = mLayers.begin(); for ( ; layerIt != mLayers.end(); ++layerIt ) { QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( *layerIt ); if ( !vl || !layerIsScaleBasedVisible( vl ) ) { continue; } QgsSymbolV2RenderContext sctx( ctx, QgsSymbolV2::MM , 1.0, false, 0, 0 ); QgsFeatureRendererV2* renderer = vl->rendererV2(); renderer->startRender( ctx, vl->pendingFields() ); QStringList attributes = renderer->usedAttributes(); bool labelLayer = ( labelEngine.prepareLayer( vl, attributes, ctx ) != 0 ); if ( mSymbologyExport == QgsDxfExport::SymbolLayerSymbology && ( renderer->capabilities() & QgsFeatureRendererV2::SymbolLevels ) && renderer->usingSymbolLevels() ) { writeEntitiesSymbolLevels( vl ); renderer->stopRender( ctx ); continue; } QgsFeatureRequest freq = QgsFeatureRequest().setSubsetOfAttributes( attributes, vl->pendingFields() ); if ( !mExtent.isEmpty() ) { freq.setFilterRect( mExtent ); } QgsFeatureIterator featureIt = vl->getFeatures( freq ); QgsFeature fet; while ( featureIt.nextFeature( fet ) ) { sctx.setFeature( &fet ); if ( mSymbologyExport == NoSymbology ) { addFeature( sctx, dxfLayerName( vl->name() ), 0, 0 ); //no symbology at all } else { if ( !renderer ) { continue; } QgsSymbolV2List symbolList = renderer->symbolsForFeature( fet ); if ( symbolList.size() < 1 ) { continue; } if ( mSymbologyExport == QgsDxfExport::SymbolLayerSymbology ) //symbol layer symbology, but layer does not use symbol levels { QgsSymbolV2List::iterator symbolIt = symbolList.begin(); for ( ; symbolIt != symbolList.end(); ++symbolIt ) { int nSymbolLayers = ( *symbolIt )->symbolLayerCount(); for ( int i = 0; i < nSymbolLayers; ++i ) { addFeature( sctx, dxfLayerName( vl->name() ), ( *symbolIt )->symbolLayer( i ), *symbolIt ); } } } else { //take first symbollayer from first symbol QgsSymbolV2* s = symbolList.first(); if ( !s || s->symbolLayerCount() < 1 ) { continue; } addFeature( sctx, dxfLayerName( vl->name() ), s->symbolLayer( 0 ), s ); } if ( labelLayer ) { labelEngine.registerFeature( vl->id(), fet, ctx ); } } } renderer->stopRender( ctx ); } labelEngine.drawLabeling( ctx ); endSection(); }