void CodeGenerator::writeCoreHelperClasses(const QString &fileName, ClassComponent component) const { if (!m_parser) return; QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream stream(&file); // Write the preamble writePreamble(fileName, stream); // Iterate over each OpenGL version. For each version output a private class for // core functions and a private class for deprecated functions. const QString privateRootClass = QStringLiteral("QOpenGLVersionFunctionsBackend"); Q_FOREACH (const VersionProfile &versionProfile, m_parser->versionProfiles()) { switch (component) { case Declaration: writeBackendClassDeclaration(stream, versionProfile, privateRootClass); break; case Definition: writeBackendClassImplementation(stream, versionProfile, privateRootClass); break; } } // Write the postamble writePostamble(fileName, stream); }
void CodeGenerator::writeCoreFactoryHeader(const QString &fileName) const { if (!m_parser) return; QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream stream(&file); // Write the preamble writePreamble(fileName, stream); // Write the postamble writePostamble(fileName, stream); }
void CodeGenerator::writeCoreFactoryImplementation(const QString &fileName) const { if (!m_parser) return; QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream stream(&file); // Write the preamble writePreamble(fileName, stream); // Get the set of version functions classes we need to create QList<Version> versions = m_parser->versions(); qSort(versions.begin(), versions.end(), qGreater<Version>()); // Outout the #include statements stream << QStringLiteral("#if !defined(QT_OPENGL_ES_2)") << endl; Q_FOREACH (const Version &classVersion, versions) { if (!versionHasProfiles(classVersion)) { stream << QString(QStringLiteral("#include \"qopenglfunctions_%1_%2.h\"")) .arg(classVersion.major) .arg(classVersion.minor) << endl; } else { const QList<VersionProfile::OpenGLProfile> profiles = (QList<VersionProfile::OpenGLProfile>() << VersionProfile::CoreProfile << VersionProfile::CompatibilityProfile); Q_FOREACH (const VersionProfile::OpenGLProfile profile, profiles) { const QString profileSuffix = profile == VersionProfile::CoreProfile ? QStringLiteral("core") : QStringLiteral("compatibility"); stream << QString(QStringLiteral("#include \"qopenglfunctions_%1_%2_%3.h\"")) .arg(classVersion.major) .arg(classVersion.minor) .arg(profileSuffix) << endl; } } } stream << QStringLiteral("#else") << endl; stream << QStringLiteral("#include \"qopenglfunctions_es2.h\"") << endl; stream << QStringLiteral("#endif") << endl; stream << endl; stream << QStringLiteral("QT_BEGIN_NAMESPACE") << endl << endl; stream << QStringLiteral("QAbstractOpenGLFunctions *QOpenGLVersionFunctionsFactory::create(const QOpenGLVersionProfile &versionProfile)") << endl; stream << QStringLiteral("{") << endl; stream << QStringLiteral("#if !defined(QT_OPENGL_ES_2)") << endl; stream << QStringLiteral(" const int major = versionProfile.version().first;") << endl; stream << QStringLiteral(" const int minor = versionProfile.version().second;") << endl << endl; // Iterate over classes with profiles stream << QStringLiteral(" if (versionProfile.hasProfiles()) {") << endl; stream << QStringLiteral(" switch (versionProfile.profile()) {") << endl; const QList<VersionProfile::OpenGLProfile> profiles = (QList<VersionProfile::OpenGLProfile>() << VersionProfile::CoreProfile << VersionProfile::CompatibilityProfile); Q_FOREACH (const VersionProfile::OpenGLProfile profile, profiles) { const QString caseLabel = profile == VersionProfile::CoreProfile ? QStringLiteral("QSurfaceFormat::CoreProfile") : QStringLiteral("QSurfaceFormat::CompatibilityProfile"); stream << QString(QStringLiteral(" case %1:")).arg(caseLabel) << endl; int i = 0; Q_FOREACH (const Version &classVersion, versions) { if (!versionHasProfiles(classVersion)) continue; const QString ifString = (i++ == 0) ? QStringLiteral("if") : QStringLiteral("else if"); stream << QString(QStringLiteral(" %1 (major == %2 && minor == %3)")) .arg(ifString) .arg(classVersion.major) .arg(classVersion.minor) << endl; VersionProfile v; v.version = classVersion; v.profile = profile; stream << QString(QStringLiteral(" return new %1;")) .arg(generateClassName(v)) << endl; } stream << QStringLiteral(" break;") << endl << endl; } stream << QStringLiteral(" case QSurfaceFormat::NoProfile:") << endl; stream << QStringLiteral(" default:") << endl; stream << QStringLiteral(" break;") << endl; stream << QStringLiteral(" };") << endl; stream << QStringLiteral(" } else {") << endl; // Iterate over the legacy classes (no profiles) int i = 0; Q_FOREACH (const Version &classVersion, versions) { if (versionHasProfiles(classVersion)) continue; const QString ifString = (i++ == 0) ? QStringLiteral("if") : QStringLiteral("else if"); stream << QString(QStringLiteral(" %1 (major == %2 && minor == %3)")) .arg(ifString) .arg(classVersion.major) .arg(classVersion.minor) << endl; VersionProfile v; v.version = classVersion; stream << QString(QStringLiteral(" return new %1;")) .arg(generateClassName(v)) << endl; } stream << QStringLiteral(" }") << endl; stream << QStringLiteral(" return 0;") << endl; stream << QStringLiteral("#else") << endl; stream << QStringLiteral(" Q_UNUSED(versionProfile);") << endl; stream << QStringLiteral(" return new QOpenGLFunctions_ES2;") << endl; stream << QStringLiteral("#endif") << endl; stream << QStringLiteral("}") << endl; // Write the postamble writePostamble(fileName, stream); }
void EpsWriter::close() { writePostamble(); fclose ( output ); }