void TileDownloader::downloadPicture(unsigned int index) { const PictureInfo& info = mPictures[index]; //Downloading all tiles in parallel { boost::threadpool::pool tp(info.tiles.size()); for (unsigned int i=0; i<info.tiles.size(); ++i) tp.schedule(boost::bind(&TileDownloader::downloadPictureTile, this, index, i)); } //compose all tiles on the canvas unsigned int width = info.width; unsigned int height = info.height; Ogre::Canvas::Context* ctx = new Ogre::Canvas::Context(width, height, false); for (unsigned int i=0; i<info.tiles.size(); ++i) { const TileInfo& tileInfo = info.tiles[i]; Ogre::Image img; std::stringstream filename; filename << tileInfo.j << "_" << tileInfo.i << ".jpg"; img.load(filename.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); float x = (tileInfo.i == 0) ? 0 : 509.0f + (tileInfo.i-1)*510.0f; float y = (tileInfo.j == 0) ? 0 : 509.0f + (tileInfo.j-1)*510.0f; ctx->drawImage(img, x, y); } //save canvas to jpeg ctx->saveToFile(info.filePath); delete ctx; }