MapWidget::MapWidget(QQuickItem* parent) : QQuickPaintedItem(parent), center(0.0,0.0), angle(0.0), magnification(64), requestNewMap(true) { setOpaquePainting(true); setAcceptedMouseButtons(Qt::LeftButton); DBThread *dbThread=DBThread::GetInstance(); //setFocusPolicy(Qt::StrongFocus); connect(dbThread,SIGNAL(InitialisationFinished(DatabaseLoadedResponse)), this,SLOT(initialisationFinished(DatabaseLoadedResponse))); connect(this,SIGNAL(TriggerMapRenderingSignal()), dbThread,SLOT(TriggerMapRendering())); connect(dbThread,SIGNAL(HandleMapRenderingResult()), this,SLOT(redraw())); connect(dbThread,SIGNAL(Redraw()), this,SLOT(redraw())); }
void DBThread::TriggerMapRendering() { RenderMapRequest request; { QMutexLocker locker(&mutex); request=currentRenderRequest; if (!doRender) { return; } renderBreaker->Reset(); } if (currentImage==NULL || currentImage->width()!=(int)request.width || currentImage->height()!=(int)request.height) { delete currentImage; currentImage=new QImage(QSize(request.width,request.height),QImage::Format_RGB32); } currentLon=request.lon; currentLat=request.lat; currentAngle=request.angle; currentMagnification=request.magnification; QPainter p; if (database->IsOpen() && styleConfig) { osmscout::MapParameter drawParameter; osmscout::AreaSearchParameter searchParameter; searchParameter.SetBreaker(renderBreakerRef); searchParameter.SetMaximumAreaLevel(4); searchParameter.SetUseMultithreading(currentMagnification.GetMagnification()<=osmscout::Magnification::magCity); std::list<std::string> paths; paths.push_back(iconDirectory.toLocal8Bit().data()); drawParameter.SetIconPaths(paths); drawParameter.SetPatternPaths(paths); drawParameter.SetDebugPerformance(true); drawParameter.SetOptimizeWayNodes(osmscout::TransPolygon::quality); drawParameter.SetOptimizeAreaNodes(osmscout::TransPolygon::quality); drawParameter.SetRenderSeaLand(true); drawParameter.SetBreaker(renderBreakerRef); double fs = drawParameter.GetFontSize(); QSettings s; double fsMul = s.value("fontSize", 1).toDouble(); qDebug()<<"FontSize: "<<fs; qDebug()<<"DPI:" << dpi; fs*=(dpi/50)*fsMul; //for 100DPI, multiply by 1.5 drawParameter.SetFontSize(fs); std::cout << std::endl; osmscout::StopClock overallTimer; projection.Set(currentLon, currentLat, currentAngle, currentMagnification, dpi, request.width, request.height); osmscout::StopClock dataRetrievalTimer; mapService->GetObjects(searchParameter, styleConfig, projection, data); if (drawParameter.GetRenderSeaLand()) { mapService->GetGroundTiles(projection, data.groundTiles); } dataRetrievalTimer.Stop(); osmscout::StopClock drawTimer; p.begin(currentImage); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::TextAntialiasing); p.setRenderHint(QPainter::SmoothPixmapTransform); painter->DrawMap(projection, drawParameter, data, &p); p.end(); drawTimer.Stop(); overallTimer.Stop(); std::cout << "All: " << overallTimer << " Data: " << dataRetrievalTimer << " Draw: " << drawTimer << std::endl; } else { std::cout << "Cannot draw map: " << database->IsOpen() << " " << styleConfig.Valid() << std::endl; p.begin(currentImage); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::TextAntialiasing); p.setRenderHint(QPainter::SmoothPixmapTransform); p.fillRect(0,0,request.width,request.height, QColor::fromRgbF(0.0,0.0,0.0,1.0)); p.setPen(QColor::fromRgbF(1.0,1.0,1.0,1.0)); QString text("not initialized (yet)"); p.drawText(QRect(0,0,request.width,request.height), Qt::AlignCenter|Qt::AlignVCenter, text, NULL); p.end(); } QMutexLocker locker(&mutex); if (renderBreaker->IsAborted()) { return; } std::swap(currentImage,finishedImage); std::swap(currentLon,finishedLon); std::swap(currentLat,finishedLat); std::swap(currentAngle,finishedAngle); std::swap(currentMagnification,finishedMagnification); doRender=false; emit HandleMapRenderingResult(); }
void DBThread::TriggerMapRendering() { RenderMapRequest request; { QMutexLocker locker(&mutex); request=currentRenderRequest; if (!doRender) { return; } doRender=false; renderBreaker->Reset(); } if (currentImage==NULL || currentImage->width()!=(int)request.width || currentImage->height()!=(int)request.height) { delete currentImage; currentImage=new QImage(QSize(request.width,request.height),QImage::Format_RGB32); } currentLon=request.lon; currentLat=request.lat; currentMagnification=request.magnification; if (database->IsOpen() && styleConfig!=NULL) { osmscout::MercatorProjection projection; osmscout::MapParameter drawParameter; osmscout::AreaSearchParameter searchParameter; searchParameter.SetBreaker(renderBreakerRef); searchParameter.SetUseMultithreading(currentMagnification.GetMagnification()<=osmscout::Magnification::magCity); std::list<std::string> paths; paths.push_back(iconDirectory.toLocal8Bit().data()); drawParameter.SetDPI(settings->GetDPI()); drawParameter.SetIconPaths(paths); drawParameter.SetPatternPaths(paths); drawParameter.SetDebugPerformance(true); drawParameter.SetOptimizeWayNodes(osmscout::TransPolygon::quality); drawParameter.SetOptimizeAreaNodes(osmscout::TransPolygon::quality); drawParameter.SetRenderSeaLand(true); drawParameter.SetBreaker(renderBreakerRef); std::cout << std::endl; osmscout::StopClock overallTimer; projection.Set(currentLon, currentLat, currentMagnification, request.width, request.height); osmscout::TypeSet nodeTypes; std::vector<osmscout::TypeSet> wayTypes; osmscout::TypeSet areaTypes; styleConfig->GetNodeTypesWithMaxMag(projection.GetMagnification(), nodeTypes); styleConfig->GetWayTypesByPrioWithMaxMag(projection.GetMagnification(), wayTypes); styleConfig->GetAreaTypesWithMaxMag(projection.GetMagnification(), areaTypes); osmscout::StopClock dataRetrievalTimer; mapService->GetObjects(nodeTypes, wayTypes, areaTypes, projection.GetLonMin(), projection.GetLatMin(), projection.GetLonMax(), projection.GetLatMax(), projection.GetMagnification(), searchParameter, data.nodes, data.ways, data.areas); if (drawParameter.GetRenderSeaLand()) { mapService->GetGroundTiles(projection.GetLonMin(), projection.GetLatMin(), projection.GetLonMax(), projection.GetLatMax(), projection.GetMagnification(), data.groundTiles); } dataRetrievalTimer.Stop(); osmscout::StopClock drawTimer; QPainter p; p.begin(currentImage); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::TextAntialiasing); p.setRenderHint(QPainter::SmoothPixmapTransform); painter.DrawMap(*styleConfig, projection, drawParameter, data, &p); p.end(); drawTimer.Stop(); overallTimer.Stop(); std::cout << "All: " << overallTimer << " Data: " << dataRetrievalTimer << " Draw: " << drawTimer << std::endl; } else { std::cout << "Cannot draw map: " << database->IsOpen() << " " << (styleConfig!=NULL) << std::endl; QPainter p; p.begin(currentImage); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::TextAntialiasing); p.setRenderHint(QPainter::SmoothPixmapTransform); p.fillRect(0,0,request.width,request.height, QColor::fromRgbF(0.0,0.0,0.0,1.0)); p.setPen(QColor::fromRgbF(1.0,1.0,1.0,1.0)); QString text("not initialized (yet)"); p.drawText(QRect(0,0,request.width,request.height), Qt::AlignCenter|Qt::AlignVCenter, text, NULL); p.end(); } QMutexLocker locker(&mutex); if (renderBreaker->IsAborted()) { return; } std::swap(currentImage,finishedImage); std::swap(currentLon,finishedLon); std::swap(currentLat,finishedLat); std::swap(currentMagnification,finishedMagnification); emit HandleMapRenderingResult(); }
/** * Actual map drawing into the back buffer */ void DBThread::DrawMap() { //std::cout << "DrawMap()" << std::endl; { QMutexLocker locker(&mutex); if (currentImage==NULL || currentImage->width()!=(int)currentWidth || currentImage->height()!=(int)currentHeight) { delete currentImage; currentImage=new QImage(QSize(currentWidth, currentHeight), QImage::Format_RGB32); } osmscout::MapParameter drawParameter; std::list<std::string> paths; std::list<osmscout::TileRef> tiles; paths.push_back(iconDirectory.toLocal8Bit().data()); drawParameter.SetIconPaths(paths); drawParameter.SetPatternPaths(paths); drawParameter.SetDebugData(false); drawParameter.SetDebugPerformance(true); drawParameter.SetOptimizeWayNodes(osmscout::TransPolygon::quality); drawParameter.SetOptimizeAreaNodes(osmscout::TransPolygon::quality); drawParameter.SetRenderBackground(true); drawParameter.SetRenderSeaLand(true); // create copy of projection osmscout::MercatorProjection renderProjection; renderProjection.Set(projection.GetCenter(), projection.GetAngle(), projection.GetMagnification(), projection.GetDPI(), projection.GetWidth(), projection.GetHeight()); renderProjection.SetLinearInterpolationUsage(renderProjection.GetMagnification().GetLevel() >= 10); mapService->LookupTiles(renderProjection,tiles); mapService->ConvertTilesToMapData(tiles,data); if (drawParameter.GetRenderSeaLand()) { mapService->GetGroundTiles(renderProjection, data.groundTiles); } QPainter p; p.begin(currentImage); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::TextAntialiasing); p.setRenderHint(QPainter::SmoothPixmapTransform); bool success=painter->DrawMap(renderProjection, drawParameter, data, &p); p.end(); if (!success) { qDebug() << "*** Rendering of data has error or was interrupted"; return; } std::swap(currentImage,finishedImage); finishedCoord=currentCoord; finishedAngle=currentAngle; finishedMagnification=currentMagnification; lastRendering=QTime::currentTime(); } emit HandleMapRenderingResult(); }