void QMeeGoPixmapData::fromEGLSharedImage(Qt::HANDLE handle, const QImage &si) { if (si.isNull()) qFatal("Trying to build pixmap with an empty/null softimage!"); QGLShareContextScope ctx(qt_gl_share_widget()->context()); QMeeGoExtensions::ensureInitialized(); bool textureIsBound = false; GLuint newTextureId; GLint newWidth, newHeight; glGenTextures(1, &newTextureId); glBindTexture(GL_TEXTURE_2D, newTextureId); glFinish(); EGLImageKHR image = QEgl::eglCreateImageKHR(QEgl::display(), EGL_NO_CONTEXT, EGL_SHARED_IMAGE_NOK, (EGLClientBuffer)handle, preserved_image_attribs); if (image != EGL_NO_IMAGE_KHR) { glFinish(); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image); GLint err = glGetError(); if (err == GL_NO_ERROR) textureIsBound = true; QMeeGoExtensions::eglQueryImageNOK(QEgl::display(), image, EGL_WIDTH, &newWidth); QMeeGoExtensions::eglQueryImageNOK(QEgl::display(), image, EGL_HEIGHT, &newHeight); QEgl::eglDestroyImageKHR(QEgl::display(), image); glFinish(); } if (textureIsBound) { // FIXME Remove this ugly hasAlphaChannel check when Qt lands the NoOpaqueCheck flag fix // for QGLPixmapData. fromTexture(newTextureId, newWidth, newHeight, (si.hasAlphaChannel() && const_cast<QImage &>(si).data_ptr()->checkForAlphaPixels())); softImage = si; QMeeGoPixmapData::registerSharedImage(handle, softImage); } else { qWarning("Failed to create a texture from a shared image!"); glDeleteTextures(1, &newTextureId); } }
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); } }