void MapRenderer::render( QPainter* P, QMap<RenderPriority, QSet <Feature*> > theFeatures, const RendererOptions& options, MapView* aView ) { #ifndef NDEBUG QTime Start(QTime::currentTime()); #endif theView = aView; theOptions = options; QMap<RenderPriority, QSet<Feature*> >::const_iterator itm; QSet<Feature*>::const_iterator it; bool bgLayerVisible = TEST_RFLAGS(RendererOptions::BackgroundVisible); bool fgLayerVisible = TEST_RFLAGS(RendererOptions::ForegroundVisible); bool tchpLayerVisible = TEST_RFLAGS(RendererOptions::TouchupVisible); bool lblLayerVisible = TEST_RFLAGS(RendererOptions::NamesVisible); Way * R = NULL; Node * Pt = NULL; Relation * RR = NULL; QPixmap pix(theView->size()); thePainter = new QPainter(); itm = theFeatures.constBegin(); while (itm != theFeatures.constEnd()) { pix.fill(Qt::transparent); thePainter->begin(&pix); if (M_PREFS->getUseAntiAlias()) thePainter->setRenderHint(QPainter::Antialiasing); int curLayer = (itm.key()).layer(); while (itm != theFeatures.constEnd() && (itm.key()).layer() == curLayer) { for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { qreal alpha = (*it)->getAlpha(); thePainter->setOpacity(alpha); R = NULL; Pt = NULL; RR = NULL; if (!(R = CAST_WAY(*it))) if (!(Pt = CAST_NODE(*it))) RR = CAST_RELATION(*it); if (R) { // If there is painter at the relation level, don't paint at the way level bool draw = true; for (int i=0; i<R->sizeParents(); ++i) { if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(PixelPerM)) draw = false; } if (!draw) continue; } if (!Pt) { if (bgLayerVisible) { thePainter->save(); if (R && R->area() == 0) thePainter->setCompositionMode(QPainter::CompositionMode_DestinationOver); if (R) bglayer.draw(R); else if (Pt) bglayer.draw(Pt); else if (RR) bglayer.draw(RR); thePainter->restore(); } if (fgLayerVisible) { thePainter->save(); if (R) fglayer.draw(R); else if (Pt) fglayer.draw(Pt); else if (RR) fglayer.draw(RR); thePainter->restore(); } } if (tchpLayerVisible) { thePainter->save(); if (R) tchuplayer.draw(R); else if (Pt) tchuplayer.draw(Pt); else if (RR) tchuplayer.draw(RR); thePainter->restore(); } if (lblLayerVisible) { thePainter->save(); if (R) lbllayer.draw(R); else if (Pt) lbllayer.draw(Pt); else if (RR) lbllayer.draw(RR); thePainter->restore(); } (*it)->draw(*thePainter, aView); } ++itm; } thePainter->end(); P->drawPixmap(0, 0, pix); #ifndef NDEBUG QTime Stop(QTime::currentTime()); qDebug() << Start.msecsTo(Stop) << "ms"; #endif } }
void MapRenderer::render( QPainter* P, const QMap<RenderPriority, QSet <Feature*> >& theFeatures, const QRectF& pViewport, const QRect& screen, const qreal pixelPerM, const RendererOptions& options ) { theViewport = pViewport; theScreen = screen; thePixelPerM = pixelPerM; qreal Aspect = (double)screen.width() / screen.height(); qreal pAspect = fabs(pViewport.width() / pViewport.height()); qreal wv, hv; if (pAspect > Aspect) { wv = fabs(pViewport.width()); hv = fabs(pViewport.height() * pAspect / Aspect); } else { wv = fabs(pViewport.width() * Aspect / pAspect); hv = fabs(pViewport.height()); } qreal ScaleLon = screen.width() / wv; qreal ScaleLat = screen.height() / hv; theTransform.reset(); theTransform.scale(ScaleLon, -ScaleLat); theTransform.translate(-pViewport.topLeft().x(), -pViewport.topLeft().y()); theOptions = options; theGlobalPainter = M_STYLE->getGlobalPainter(); if (theGlobalPainter.DrawNodes) { NodeWidth = thePixelPerM*theGlobalPainter.NodesProportional+theGlobalPainter.NodesFixed; } else { NodeWidth = thePixelPerM * M_PREFS->getNodeSize(); if (NodeWidth > M_PREFS->getNodeSize()) NodeWidth = M_PREFS->getNodeSize(); } bool bgLayerVisible = TEST_RFLAGS(RendererOptions::BackgroundVisible); bool fgLayerVisible = TEST_RFLAGS(RendererOptions::ForegroundVisible); bool tchpLayerVisible = TEST_RFLAGS(RendererOptions::TouchupVisible); bool lblLayerVisible = TEST_RFLAGS(RendererOptions::NamesVisible); QMap<RenderPriority, QSet<Feature*> >::const_iterator itm; QMap<RenderPriority, QSet<Feature*> >::const_iterator itmCur; QSet<Feature*>::const_iterator it; thePainter = P; thePainter->save(); thePainter->translate(screen.left(), screen.top()); itm = theFeatures.constBegin(); while (itm != theFeatures.constEnd()) { int curLayer = (itm.key()).layer(); itmCur = itm; while (itm != theFeatures.constEnd() && (itm.key()).layer() == curLayer) { if (bgLayerVisible) { for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { qreal alpha = (*it)->getAlpha(); if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) alpha /= 2.0; if (alpha != 1.) { P->save(); P->setOpacity(alpha); } if (CHECK_WAY(*it)) { Way * R = STATIC_CAST_WAY(*it); for (int i=0; i<R->sizeParents(); ++i) if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(thePixelPerM)) continue; bglayer.draw(R); } else if (CHECK_NODE(*it)) bglayer.draw(STATIC_CAST_NODE(*it)); else if (CHECK_RELATION(*it)) bglayer.draw(STATIC_CAST_RELATION(*it)); if (alpha != 1.) { P->restore(); } } } ++itm; } itm = itmCur; while (itm != theFeatures.constEnd() && (itm.key()).layer() == curLayer) { if (fgLayerVisible) { for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { qreal alpha = (*it)->getAlpha(); if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) alpha /= 2.0; if (alpha != 1.) { P->save(); P->setOpacity(alpha); } if (CHECK_WAY(*it)) { Way * R = STATIC_CAST_WAY(*it); for (int i=0; i<R->sizeParents(); ++i) if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(thePixelPerM)) continue; fglayer.draw(R); } else if (CHECK_NODE(*it)) fglayer.draw(STATIC_CAST_NODE(*it)); else if (CHECK_RELATION(*it)) fglayer.draw(STATIC_CAST_RELATION(*it)); if (alpha != 1.) { P->restore(); } } } ++itm; } } if (tchpLayerVisible) { for (itm = theFeatures.constBegin() ;itm != theFeatures.constEnd(); ++itm) { for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { qreal alpha = (*it)->getAlpha(); if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) alpha /= 2.0; if (alpha != 1.) { P->save(); P->setOpacity(alpha); } if (CHECK_WAY(*it)) { Way * R = STATIC_CAST_WAY(*it); for (int i=0; i<R->sizeParents(); ++i) if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(thePixelPerM)) continue; tchuplayer.draw(R); } else if (CHECK_NODE(*it)) tchuplayer.draw(STATIC_CAST_NODE(*it)); else if (CHECK_RELATION(*it)) tchuplayer.draw(STATIC_CAST_RELATION(*it)); if (alpha != 1.) { P->restore(); } } } } if (lblLayerVisible) { for (itm = theFeatures.constBegin() ;itm != theFeatures.constEnd(); ++itm) { for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { P->save(); qreal alpha = (*it)->getAlpha(); if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) alpha /= 2.0; P->setOpacity(alpha); if (CHECK_WAY(*it)) { Way * R = STATIC_CAST_WAY(*it); for (int i=0; i<R->sizeParents(); ++i) if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(thePixelPerM)) continue; lbllayer.draw(R); } else if (CHECK_NODE(*it)) lbllayer.draw(STATIC_CAST_NODE(*it)); else if (CHECK_RELATION(*it)) lbllayer.draw(STATIC_CAST_RELATION(*it)); P->restore(); } } } thePainter->restore(); }
void MapRenderer::render( QPainter* P, const QMap<RenderPriority, QSet <Feature*> >& theFeatures, const RendererOptions& options, MapView* aView ) { // #ifndef NDEBUG // QTime Start(QTime::currentTime()); // #endif theView = aView; theOptions = options; theGlobalPainter = M_STYLE->getGlobalPainter(); bool bgLayerVisible = TEST_RFLAGS(RendererOptions::BackgroundVisible); bool fgLayerVisible = TEST_RFLAGS(RendererOptions::ForegroundVisible); bool tchpLayerVisible = TEST_RFLAGS(RendererOptions::TouchupVisible); bool lblLayerVisible = TEST_RFLAGS(RendererOptions::NamesVisible); QMap<RenderPriority, QSet<Feature*> >::const_iterator itm; QMap<RenderPriority, QSet<Feature*> >::const_iterator itmCur; QSet<Feature*>::const_iterator it; thePainter = P; itm = theFeatures.constBegin(); while (itm != theFeatures.constEnd()) { int curLayer = (itm.key()).layer(); itmCur = itm; while (itm != theFeatures.constEnd() && (itm.key()).layer() == curLayer) { if (bgLayerVisible) { for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { qreal alpha = (*it)->getAlpha(); if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) alpha /= 2.0; if (alpha != 1.) { P->save(); P->setOpacity(alpha); } if (CHECK_WAY(*it)) { Way * R = STATIC_CAST_WAY(*it); for (int i=0; i<R->sizeParents(); ++i) if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(theView->pixelPerM())) continue; bglayer.draw(R); } else if (CHECK_NODE(*it)) bglayer.draw(STATIC_CAST_NODE(*it)); else if (CHECK_RELATION(*it)) bglayer.draw(STATIC_CAST_RELATION(*it)); if (alpha != 1.) { P->restore(); } } } ++itm; } itm = itmCur; while (itm != theFeatures.constEnd() && (itm.key()).layer() == curLayer) { if (fgLayerVisible) { for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { qreal alpha = (*it)->getAlpha(); if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) alpha /= 2.0; if (alpha != 1.) { P->save(); P->setOpacity(alpha); } if (CHECK_WAY(*it)) { Way * R = STATIC_CAST_WAY(*it); for (int i=0; i<R->sizeParents(); ++i) if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(theView->pixelPerM())) continue; fglayer.draw(R); } else if (CHECK_NODE(*it)) fglayer.draw(STATIC_CAST_NODE(*it)); else if (CHECK_RELATION(*it)) fglayer.draw(STATIC_CAST_RELATION(*it)); if (alpha != 1.) { P->restore(); } } } ++itm; } } if (tchpLayerVisible) { for (itm = theFeatures.constBegin() ;itm != theFeatures.constEnd(); ++itm) { for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { qreal alpha = (*it)->getAlpha(); if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) alpha /= 2.0; if (alpha != 1.) { P->save(); P->setOpacity(alpha); } if (CHECK_WAY(*it)) { Way * R = STATIC_CAST_WAY(*it); for (int i=0; i<R->sizeParents(); ++i) if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(theView->pixelPerM())) continue; tchuplayer.draw(R); } else if (CHECK_NODE(*it)) tchuplayer.draw(STATIC_CAST_NODE(*it)); else if (CHECK_RELATION(*it)) tchuplayer.draw(STATIC_CAST_RELATION(*it)); if (alpha != 1.) { P->restore(); } } } } for (itm = theFeatures.constBegin() ;itm != theFeatures.constEnd(); ++itm) { for (it = itm.value().constBegin() ;it != itm.value().constEnd(); ++it) { qreal alpha = (*it)->getAlpha(); if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) alpha /= 2.0; if (alpha != 1.) P->setOpacity(alpha); (*it)->draw(*P, aView); } } if (lblLayerVisible) { for (itm = theFeatures.constBegin() ;itm != theFeatures.constEnd(); ++itm) { for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { P->save(); qreal alpha = (*it)->getAlpha(); if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) alpha /= 2.0; P->setOpacity(alpha); if (CHECK_WAY(*it)) { Way * R = STATIC_CAST_WAY(*it); for (int i=0; i<R->sizeParents(); ++i) if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(theView->pixelPerM())) continue; lbllayer.draw(R); } else if (CHECK_NODE(*it)) lbllayer.draw(STATIC_CAST_NODE(*it)); else if (CHECK_RELATION(*it)) lbllayer.draw(STATIC_CAST_RELATION(*it)); P->restore(); } } } // #ifndef NDEBUG // QTime Stop(QTime::currentTime()); // qDebug() << Start.msecsTo(Stop) << "ms"; // #endif }