/* TextureXPanel::exportTexture * Create standalone image entries of any selected textures *******************************************************************/ void TextureXPanel::exportTexture() { // Get selected textures vector<long> selec_num = list_textures->getSelection(); vector<CTexture*> selection; if (!tx_entry) return; //saveTEXTUREX(); Archive* archive = tx_entry->getParent(); bool force_rgba = texture_editor->getBlendRGBA(); // Go through selection for (unsigned a = 0; a < selec_num.size(); ++a) { selection.push_back(texturex.getTexture(selec_num[a])); } // Create gfx conversion dialog GfxConvDialog gcd(this); // Send selection to the gcd gcd.openTextures(selection, texture_editor->getPalette(), archive, force_rgba); // Run the gcd gcd.ShowModal(); // Show splash window theSplashWindow->show("Writing converted image data...", true); // Write any changes for (unsigned a = 0; a < selection.size(); a++) { // Update splash window theSplashWindow->setProgressMessage(selection[a]->getName()); theSplashWindow->setProgress((float)a / (float)selection.size()); // Skip if the image wasn't converted if (!gcd.itemModified(a)) continue; // Get image and conversion info SImage* image = gcd.getItemImage(a); SIFormat* format = gcd.getItemFormat(a); // Write converted image back to entry MemChunk mc; format->saveImage(*image, mc, force_rgba ? NULL : gcd.getItemPalette(a)); ArchiveEntry* lump = new ArchiveEntry; lump->importMemChunk(mc); lump->rename(selection[a]->getName()); archive->addEntry(lump, "textures"); EntryType::detectEntryType(lump); lump->setExtensionByType(); } // Hide splash window theSplashWindow->hide(); }
bool createEntry() { // Get parent dir ArchiveTreeNode* dir = archive->getDir(path); if (dir) { archive->addEntry(entry_copy, index, dir, true); return true; } else return false; }
/* EntryOperations::addToPatchTable * Adds all [entries] to their parent archive's patch table, if it * exists. If not, the user is prompted to create or import texturex * entries *******************************************************************/ bool EntryOperations::addToPatchTable(vector<ArchiveEntry*> entries) { // Check any entries were given if (entries.size() == 0) return true; // Get parent archive Archive* parent = entries[0]->getParent(); if (parent == NULL) return true; // Find patch table in parent archive Archive::search_options_t opt; opt.match_type = EntryType::getType("pnames"); ArchiveEntry* pnames = parent->findLast(opt); // Check it exists if (!pnames) { // Create texture entries if (!TextureXEditor::setupTextureEntries(parent)) return false; pnames = parent->findLast(opt); // If the archive already has ZDoom TEXTURES, it might still // not have a PNAMES lump; so create an empty one. if (!pnames) { pnames = new ArchiveEntry("PNAMES.lmp", 4); uint32_t nada = 0; pnames->write(&nada, 4); pnames->seek(0, SEEK_SET); parent->addEntry(pnames); } } // Check it isn't locked (texturex editor open or iwad) if (pnames->isLocked()) { if (parent->isReadOnly()) wxMessageBox("Cannot perform this action on an IWAD", "Error", wxICON_ERROR); else wxMessageBox("Cannot perform this action because one or more texture related entries is locked. Please close the archive's texture editor if it is open.", "Error", wxICON_ERROR); return false; } // Load to patch table PatchTable ptable; ptable.loadPNAMES(pnames); // Add entry names to patch table for (unsigned a = 0; a < entries.size(); a++) { // Check entry type if (!(entries[a]->getType()->extraProps().propertyExists("image"))) { wxLogMessage("Entry %s is not a valid image", entries[a]->getName()); continue; } // Check entry name if (entries[a]->getName(true).Length() > 8) { wxLogMessage("Entry %s has too long a name to add to the patch table (name must be 8 characters max)", entries[a]->getName()); continue; } ptable.addPatch(entries[a]->getName(true)); } // Write patch table data back to pnames entry return ptable.writePNAMES(pnames); }
/* MapEditorWindow::saveMap * Saves the current map to its archive, or opens the 'save as' * dialog if it doesn't currently belong to one *******************************************************************/ bool MapEditorWindow::saveMap() { // Check for newly created map if (!mdesc_current.head) return saveMapAs(); // Write map to temp wad WadArchive* wad = writeMap(); if (!wad) return false; // Check for map archive Archive* tempwad = NULL; Archive::mapdesc_t map = mdesc_current; if (mdesc_current.archive && mdesc_current.head) { tempwad = new WadArchive(); tempwad->open(mdesc_current.head); vector<Archive::mapdesc_t> amaps = tempwad->detectMaps(); if (amaps.size() > 0) map = amaps[0]; else return false; } // Unlock current map entries lockMapEntries(false); // Delete current map entries ArchiveEntry* entry = map.end; Archive* archive = map.head->getParent(); while (entry && entry != map.head) { ArchiveEntry* prev = entry->prevEntry(); archive->removeEntry(entry); entry = prev; } // Create backup if (!backup_manager->writeBackup(map_data, map.head->getTopParent()->getFilename(false), map.head->getName(true))) LOG_MESSAGE(1, "Warning: Failed to backup map data"); // Add new map entries for (unsigned a = 1; a < wad->numEntries(); a++) entry = archive->addEntry(wad->getEntry(a), archive->entryIndex(map.head) + a, NULL, true); // Clean up delete wad; if (tempwad) { tempwad->save(); delete tempwad; } else { // Update map description mdesc_current.end = entry; } // Finish lockMapEntries(); editor.getMap().setOpenedTime(); return true; }