/* EntryOperations::gfxConvert * Converts the image [entry] to [target_format], using conversion * options specified in [opt] and converting to [target_colformat] * colour format if possible. Returns false if the conversion failed, * true otherwise *******************************************************************/ bool EntryOperations::gfxConvert(ArchiveEntry* entry, string target_format, SIFormat::convert_options_t opt, int target_colformat) { // Init variables SImage image; // Get target image format SIFormat* fmt = SIFormat::getFormat(target_format); if (fmt == SIFormat::unknownFormat()) return false; // Check format and target colour type are compatible if (target_colformat >= 0 && !fmt->canWriteType((SIType)target_colformat)) { if (target_colformat == RGBA) wxLogMessage("Format \"%s\" cannot be written as RGBA data", fmt->getName()); else if (target_colformat == PALMASK) wxLogMessage("Format \"%s\" cannot be written as paletted data", fmt->getName()); return false; } // Load entry to image Misc::loadImageFromEntry(&image, entry); // Check if we can write the image to the target format int writable = fmt->canWrite(image); if (writable == SIFormat::NOTWRITABLE) { wxLogMessage("Entry \"%s\" could not be converted to target format \"%s\"", entry->getName(), fmt->getName()); return false; } else if (writable == SIFormat::CONVERTIBLE) fmt->convertWritable(image, opt); // Now we apply the target colour format (if any) if (target_colformat == PALMASK) image.convertPaletted(opt.pal_target, opt.pal_current); else if (target_colformat == RGBA) image.convertRGBA(opt.pal_current); // Finally, write new image data back to the entry fmt->saveImage(image, entry->getMCData(), opt.pal_target); return true; }
/* GfxEntryPanel::saveEntry * Saves any changes to the entry *******************************************************************/ bool GfxEntryPanel::saveEntry() { // Write new image data if modified bool ok = true; if (image_data_modified) { SImage* image = getImage(); SIFormat* format = image->getFormat(); string error = ""; ok = false; int writable = format->canWrite(*image); if (format == SIFormat::unknownFormat()) error = "Image is of unknown format"; else if (writable == SIFormat::NOTWRITABLE) error = S_FMT("Writing unsupported for format \"%s\"", format->getName()); else { // Convert image if necessary (using default options) if (writable == SIFormat::CONVERTIBLE) { format->convertWritable(*image, SIFormat::convert_options_t()); wxLogMessage("Image converted for writing"); } if (format->saveImage(*image, entry->getMCData(), gfx_canvas->getPalette())) ok = true; else error = "Error writing image"; } if (ok) { // Set modified entry->setState(1); // Re-detect type EntryType* oldtype = entry->getType(); EntryType::detectEntryType(entry); // Update extension if type changed if (oldtype != entry->getType()) entry->setExtensionByType(); } else wxMessageBox(wxString("Cannot save changes to image: ") + error, "Error", wxICON_ERROR); } // Otherwise just set offsets else EntryOperations::setGfxOffsets(entry, spin_xoffset->GetValue(), spin_yoffset->GetValue()); // Apply alPh/tRNS options if (entry->getType()->getFormat() == "img_png") { bool alph = EntryOperations::getalPhChunk(entry); bool trns = EntryOperations::gettRNSChunk(entry); if (alph != menu_custom->IsChecked(theApp->getAction("pgfx_alph")->getWxId())) EntryOperations::modifyalPhChunk(entry, !alph); if (trns != menu_custom->IsChecked(theApp->getAction("pgfx_trns")->getWxId())) EntryOperations::modifytRNSChunk(entry, !trns); } if (ok) setModified(false); return ok; }