/// Display pair wises matches as an Adjacency matrix in svg format void PairWiseMatchingToAdjacencyMatrixSVG(const size_t NbImages, const matching::PairWiseMatches & map_Matches, const std::string & sOutName) { if ( !map_Matches.empty()) { float scaleFactor = 5.0f; svgDrawer svgStream((NbImages+3)*5, (NbImages+3)*5); // Go along all possible pair for (size_t I = 0; I < NbImages; ++I) { for (size_t J = 0; J < NbImages; ++J) { // If the pair have matches display a blue boxes at I,J position. matching::PairWiseMatches::const_iterator iterSearch = map_Matches.find(std::make_pair(I,J)); if (iterSearch != map_Matches.end() && !iterSearch->second.empty()) { // Display as a tooltip: (IndexI, IndexJ NbMatches) std::ostringstream os; os << "(" << J << "," << I << " " << iterSearch->second.size() <<")"; svgStream.drawSquare(J*scaleFactor, I*scaleFactor, scaleFactor/2.0f, svgStyle().fill("blue").noStroke()); } // HINT : THINK ABOUT OPACITY [0.4 -> 1.0] TO EXPRESS MATCH COUNT } } // Display axes with 0 -> NbImages annotation : _| std::ostringstream osNbImages; osNbImages << NbImages; svgStream.drawText((NbImages+1)*scaleFactor, scaleFactor, scaleFactor, "0", "black"); svgStream.drawText((NbImages+1)*scaleFactor, (NbImages)*scaleFactor - scaleFactor, scaleFactor, osNbImages.str(), "black"); svgStream.drawLine((NbImages+1)*scaleFactor, 2*scaleFactor, (NbImages+1)*scaleFactor, (NbImages)*scaleFactor - 2*scaleFactor, svgStyle().stroke("black", 1.0)); svgStream.drawText(scaleFactor, (NbImages+1)*scaleFactor, scaleFactor, "0", "black"); svgStream.drawText((NbImages)*scaleFactor - scaleFactor, (NbImages+1)*scaleFactor, scaleFactor, osNbImages.str(), "black"); svgStream.drawLine(2*scaleFactor, (NbImages+1)*scaleFactor, (NbImages)*scaleFactor - 2*scaleFactor, (NbImages+1)*scaleFactor, svgStyle().stroke("black", 1.0)); std::ofstream svgFileStream( sOutName.c_str()); svgFileStream << svgStream.closeSvgFile().str(); } }
bool SvgWriter::save(QIODevice &outputDevice) { if (m_toplevelShapes.isEmpty()) return false; QTextStream svgStream(&outputDevice); // standard header: svgStream << "<?xml version=\"1.0\" standalone=\"no\"?>" << endl; svgStream << "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\" "; svgStream << "\"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">" << endl; // add some PR. one line is more than enough. svgStream << "<!-- Created using Karbon, part of Calligra: http://www.calligra.org/karbon -->" << endl; svgStream << "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\""; svgStream << " width=\"" << m_pageSize.width() << "pt\""; svgStream << " height=\"" << m_pageSize.height() << "pt\">" << endl; { SvgSavingContext savingContext(outputDevice, m_writeInlineImages); // top level shapes Q_FOREACH (KoShape *shape, m_toplevelShapes) { KoShapeLayer *layer = dynamic_cast<KoShapeLayer*>(shape); if(layer) { saveLayer(layer, savingContext); } else { KoShapeGroup *group = dynamic_cast<KoShapeGroup*>(shape); if (group) saveGroup(group, savingContext); else saveShape(shape, savingContext); } } }