int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QCoreApplication::setApplicationName("Vincent Tim"); QCoreApplication::setApplicationVersion("1.2"); #ifdef Q_OS_WIN QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM 850")); #endif #ifdef TESTS_ENABLED qDebug() << "Running tests..."; Collect c("tests/tim/files"); c.textureData("tim"); #endif Arguments args; if (args.help() || args.paths().isEmpty()) { args.showHelp(); } else { foreach (const QString &path, args.paths()) { TextureFile *texture; if (args.inputFormat(path) == args.outputFormat()) { qWarning() << "Error: input and output formats are not different"; a.exit(1); } QFile f(path); if (f.open(QIODevice::ReadOnly)) { if (!args.analysis()) { texture = TextureFile::factory(args.inputFormat(path)); if (texture->open(f.readAll())) { if (TextureFile::supportedTextureFormats().contains(args.outputFormat(), Qt::CaseInsensitive)) { if (!toTexture(texture, path, args)) { break; } } else if (TextureFile::supportedTextureFormats().contains(args.inputFormat(path), Qt::CaseInsensitive)) { fromTexture(texture, path, args); } else { qWarning() << "Error: input format or output format must be a supported texture format" << TextureFile::supportedTextureFormats(); a.exit(1); } } else { qWarning() << "Error: Cannot open Texture file"; a.exit(1); } f.close(); delete texture; } else { // Search tim files QList<PosSize> positions = TimFile::findTims(&f); int num = 0; foreach (const PosSize &pos, positions) { texture = new TimFile(); f.seek(pos.first); if (texture->open(f.read(pos.second))) { if (args.outputFormat().compare("tim", Qt::CaseInsensitive) == 0) { if (!texture->saveToFile(args.destination(path, num))) { qWarning() << "Error: Cannot save Texture file from" << QDir::toNativeSeparators(path) << "to" << args.destination(path, num); continue; } else { printf("%s\n", qPrintable(QDir::toNativeSeparators(args.destination(path, num)))); } } else { fromTexture(texture, path, args, num); } num++; } else { qWarning() << "Error: Cannot open Texture file from" << QDir::toNativeSeparators(path); a.exit(1); } delete texture; } } } else { qWarning() << "Error: cannot open file" << QDir::toNativeSeparators(path) << f.errorString(); a.exit(1); } }
bool toTexture(TextureFile *texture, const QString &path, const Arguments &args, int num = -1) { QString pathMeta = args.inputPathMeta(path), pathPalette = args.inputPathPalette(path); if (pathMeta.isEmpty()) { qWarning() << "Error: Please set the input path meta"; return false; } TextureFile *tex; QString destPath; if (args.outputFormat().compare("tex", Qt::CaseInsensitive) == 0) { tex = new TexFile(*texture); } else if (args.outputFormat().compare("tim", Qt::CaseInsensitive) == 0) { tex = new TimFile(*texture); } else { qWarning() << "toTexture: output format not supported"; return false; } ExtraData meta; if (!meta.open(pathMeta)) { qWarning() << "Meta data not found!" << QDir::toNativeSeparators(pathMeta); goto toTextureError; } tex->setExtraData(meta); // Not texture to texture if (args.outputFormat().compare(args.inputFormat(path), Qt::CaseInsensitive) != 0 && tex->depth() < 16) { // Do not use isPaletted for that! if (pathPalette.isEmpty()) { qWarning() << "Error: Please set the input path palette"; goto toTextureError; } QImage paletteImage; if (paletteImage.load(pathPalette)) { if (!tex->setPalette(paletteImage)) { qWarning() << "Error: Please set the depth in the meta file"; goto toTextureError; } if (args.palette() < 0 || args.palette() >= tex->colorTableCount()) { qWarning() << "Error: Please set a valid number of palette"; goto toTextureError; } tex->convertToIndexedFormat(args.palette()); } else { qWarning() << "Error: Cannot open the input palette"; goto toTextureError; } } destPath = args.destination(path, num); if (!tex->saveToFile(destPath)) { goto toTextureError; } printf("%s\n", qPrintable(QDir::toNativeSeparators(destPath))); delete tex; return true; toTextureError: delete tex; return false; }