void testPNG() { RGBAImage img; img.create(100, 100); for (vector<RGBAPixel>::iterator it = img.data.begin(); it != img.data.end(); it++) { *it = ((rand() % 256) << 24) | ((rand() % 256) << 16) | ((rand() % 256) << 8) | (rand() % 256); } img.writePNG("test.png"); RGBAImage img2; img2.readPNG("test.png"); if (img2.data != img.data) cout << "images don't match after trip through PNG!" << endl; else cout << "PNG test successful" << endl; }
bool expandMap(const string& outputpath) { // read old params MapParams mp; if (!mp.readFile(outputpath)) { cerr << "pigmap.params missing or corrupt" << endl; return false; } int32_t tileSize = mp.tileSize(); // to expand a map, the following must be done: // 1. the top-left quadrant of the current zoom level 1 needs to be moved to zoom level 2, where // it will become the bottom-right quadrant of the top-left quadrant of the new zoom level 1, // so the top-level file "0.png" and subdirectory "0" must become "0/3.png" and "0/3", // respectively; and similarly for the other three quadrants // 2. new zoom level 1 tiles must be created: "0.png" is 3/4 empty, but has a shrunk version of // the old "0.png" (which is the new "0/3.png") in its bottom-right, etc. // 3. a new "base.png" must be created from the new zoom level 1 tiles // move everything at zoom 1 or higher one level deeper // ...first the subdirectories renameFile(outputpath + "/0", outputpath + "/old0"); renameFile(outputpath + "/1", outputpath + "/old1"); renameFile(outputpath + "/2", outputpath + "/old2"); renameFile(outputpath + "/3", outputpath + "/old3"); makePath(outputpath + "/0"); makePath(outputpath + "/1"); makePath(outputpath + "/2"); makePath(outputpath + "/3"); renameFile(outputpath + "/old0", outputpath + "/0/3"); renameFile(outputpath + "/old1", outputpath + "/1/2"); renameFile(outputpath + "/old2", outputpath + "/2/1"); renameFile(outputpath + "/old3", outputpath + "/3/0"); // ...now the zoom 1 files renameFile(outputpath + "/0.png", outputpath + "/0/3.png"); renameFile(outputpath + "/1.png", outputpath + "/1/2.png"); renameFile(outputpath + "/2.png", outputpath + "/2/1.png"); renameFile(outputpath + "/3.png", outputpath + "/3/0.png"); // build the new zoom 1 tiles RGBAImage old0img; bool used0 = old0img.readPNG(outputpath + "/0/3.png"); RGBAImage new0img; new0img.create(tileSize, tileSize); if (used0) { reduceHalf(new0img, ImageRect(tileSize/2, tileSize/2, tileSize/2, tileSize/2), old0img); new0img.writePNG(outputpath + "/0.png"); } RGBAImage old1img; bool used1 = old1img.readPNG(outputpath + "/1/2.png"); RGBAImage new1img; new1img.create(tileSize, tileSize); if (used1) { reduceHalf(new1img, ImageRect(0, tileSize/2, tileSize/2, tileSize/2), old1img); new1img.writePNG(outputpath + "/1.png"); } RGBAImage old2img; bool used2 = old2img.readPNG(outputpath + "/2/1.png"); RGBAImage new2img; new2img.create(tileSize, tileSize); if (used2) { reduceHalf(new2img, ImageRect(tileSize/2, 0, tileSize/2, tileSize/2), old2img); new2img.writePNG(outputpath + "/2.png"); } RGBAImage old3img; bool used3 = old3img.readPNG(outputpath + "/3/0.png"); RGBAImage new3img; new3img.create(tileSize, tileSize); if (used3) { reduceHalf(new3img, ImageRect(0, 0, tileSize/2, tileSize/2), old3img); new3img.writePNG(outputpath + "/3.png"); } // build the new base tile RGBAImage newbase; newbase.create(tileSize, tileSize); if (used0) reduceHalf(newbase, ImageRect(0, 0, tileSize/2, tileSize/2), new0img); if (used1) reduceHalf(newbase, ImageRect(tileSize/2, 0, tileSize/2, tileSize/2), new1img); if (used2) reduceHalf(newbase, ImageRect(0, tileSize/2, tileSize/2, tileSize/2), new2img); if (used3) reduceHalf(newbase, ImageRect(tileSize/2, tileSize/2, tileSize/2, tileSize/2), new3img); newbase.writePNG(outputpath + "/base.png"); // write new params (with incremented baseZoom) mp.baseZoom++; mp.writeFile(outputpath); // touch all tiles, to prevent browser cache mishaps (since many new tiles will have the same // filename as some old tile, but possibly with an earlier timestamp) system((string("find ") + outputpath + " -exec touch {} +").c_str()); return true; }