From 7ed83b6c6666eb8b6b104c211ae7e52907350372 Mon Sep 17 00:00:00 2001 From: craig Date: Sun, 1 Jan 2012 11:40:09 +0000 Subject: Branch 1.3.5 tree to 1.4.x tree, goodbye 1.3.x git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17163 11d20701-8431-0410-a711-e3c959e3b870 --- scribus/scribuscore.cpp | 557 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 557 insertions(+) create mode 100644 scribus/scribuscore.cpp (limited to 'scribus/scribuscore.cpp') diff --git a/scribus/scribuscore.cpp b/scribus/scribuscore.cpp new file mode 100644 index 0000000..83fbb65 --- /dev/null +++ b/scribus/scribuscore.cpp @@ -0,0 +1,557 @@ +/* +For general Scribus (>=1.3.2) copyright and licensing information please refer +to the COPYING file provided with the program. Following this notice may exist +a copyright and/or license notice that predates the release of Scribus 1.3.2 +for which a new license (GPL+exception) is in place. +*/ +/*************************************************************************** + pageitem.h - description + ------------------- + copyright : Scribus Team + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include + +#include "colormgmt/sccolormgmtengine.h" +#include "commonstrings.h" +#include "filewatcher.h" +#include "pluginmanager.h" +#include "prefsmanager.h" +#include "scpaths.h" +#include "scribusapp.h" +#include "scribuscore.h" +#include "splash.h" +#include "undomanager.h" +#include "util.h" +#include "util_icon.h" +#include "util_ghostscript.h" + + +extern ScribusQApp* ScQApp; + +#include "cmserrorhandling.h" + +ScribusCore::ScribusCore() : QObject() +{ + m_ScribusInitialized=false; + m_SplashScreen=0; + m_UseGUI=false; + m_HaveCMS=false; +// m_PaletteParent=0; + m_currScMW=0; + + defaultRGBProfile = NULL; + defaultCMYKProfile = NULL; + defaultRGBToScreenSolidTrans = NULL; + defaultRGBToScreenImageTrans = NULL; + defaultCMYKToScreenImageTrans = NULL; + defaultRGBToCMYKTrans = NULL; + defaultCMYKToRGBTrans = NULL; +} + + + +ScribusCore::~ScribusCore() +{ + TermDefaultColorTransforms(); +// delete m_PaletteParent; +} + +#ifndef NDEBUG +static void abort_on_error(QtMsgType t, const char * m) +{ + std::cerr << m << "\n"; + if(t==QtFatalMsg) assert(false); +// if(t!=QtDebugMsg) assert(false); +} +#endif + + +int ScribusCore::init(bool useGUI, bool swapDialogButtonOrder, const QList& filesToUse) +{ + m_UseGUI=useGUI; + m_Files=filesToUse; + m_SwapDialogButtonOrder=swapDialogButtonOrder; +#if !defined(NDEBUG) && !defined(_WIN32) + qInstallMsgHandler( & abort_on_error ); +#endif + + return 0; +} + +const QString& ScribusCore::getGuiLanguage() const +{ + return ScQApp->currGUILanguage(); +} + +int ScribusCore::startGUI(bool showSplash, bool showFontInfo, bool showProfileInfo, const QString newGuiLanguage, const QString prefsUserFile) +{ +// m_PaletteParent=new QWidget(0); +// Q_CHECK_PTR(m_PaletteParent); + ScribusMainWindow* scribus = new ScribusMainWindow(); + Q_CHECK_PTR(scribus); + if (!scribus) + return(EXIT_FAILURE); + ScMWList.append(scribus); + m_currScMW=0; +// ScMW=scribus; + int retVal=initScribusCore(showSplash, showFontInfo, showProfileInfo,newGuiLanguage, prefsUserFile); + if (retVal == 1) + return(EXIT_FAILURE); + + retVal = scribus->initScMW(true); + if (retVal == 1) + return(EXIT_FAILURE); + + closeSplash(); + m_ScribusInitialized=true; +// ScQApp->setMainWidget(scribus); + connect(ScQApp, SIGNAL(lastWindowClosed()), ScQApp, SLOT(quit())); + + scribus->show(); + int subsRet=scribus->ShowSubs(); + if (subsRet==0) + { + if (!m_Files.isEmpty()) + { + for (int i = 0; i < m_Files.size(); ++i) + scribus->loadDoc(m_Files.at(i)); + } + else + { + if (PrefsManager::instance()->appPrefs.showStartupDialog) + scribus->startUpDialog(); + else + scribus->setFocus(); + } + } + else if (subsRet==QMessageBox::Help) + { + scribus->slotRaiseOnlineHelp(); + } + + qApp->setOverrideCursor(QCursor(Qt::ArrowCursor)); + + // A hook for plugins and scripts to trigger on. Some plugins and scripts + // require the app to be fully set up (in particular, the main window to be + // built and shown) before running their setup. + emit appStarted(); + + return EXIT_SUCCESS; +} + +int ScribusCore::initScribusCore(bool showSplash, bool showFontInfo, bool showProfileInfo, + const QString newGuiLanguage, const QString prefsUserFile) +{ + CommonStrings::languageChange(); + int retVal=0; +//FIXME ExternalApp = 0; + initSplash(showSplash); + prefsManager = PrefsManager::instance(); + prefsManager->setup(); + //CB #4428 Get fonts before prefs are set to default + bool haveFonts=false; +//#ifdef Q_OS_MAC +// haveFonts=ScCore->initFonts(true); +//#else + haveFonts=ScCore->initFonts(showFontInfo); +//#endif + if (!haveFonts) + return 1; + prefsManager->initDefaults(); + prefsManager->initDefaultGUIFont(qApp->font()); + prefsManager->initArrowStyles(); + undoManager = UndoManager::instance(); + fileWatcher = new FileWatcher(this); + pluginManager = new PluginManager(); + setSplashStatus( tr("Initializing Plugins") ); + pluginManager->initPlugs(); +/* #4428, remove block later if ok + bool haveFonts=false; +#ifdef Q_OS_MAC + haveFonts=ScCore->initFonts(true); +#else + haveFonts=ScCore->initFonts(showFontInfo); +#endif + if (!haveFonts) + return 1; +*/ + setSplashStatus( tr("Initializing Keyboard Shortcuts") ); + prefsManager->initDefaultActionKeys(); + setSplashStatus( tr("Reading Preferences") ); + if (prefsUserFile.isNull()) + prefsManager->ReadPrefs(); + else + prefsManager->ReadPrefs(prefsUserFile); +// setSplashStatus( tr("Applying User Shortcuts") ); +// prefsManager->applyLoadedShortCuts(); + + m_HaveGS = testGSAvailability(); + m_HavePngAlpha = testGSDeviceAvailability("pngalpha"); + m_HaveTiffSep = testGSDeviceAvailability("tiffsep"); + + ScCore->setSplashStatus( tr("Reading Color Profiles") ); + m_HaveCMS = false; + getCMSProfiles(showProfileInfo); + initCMS(); + + return retVal; +} + + +void ScribusCore::initSplash(bool showSplash) +{ + if (showSplash) + { + QPixmap pix = loadIcon("Splash.png", true); + m_SplashScreen = new SplashScreen(pix, Qt::WindowStaysOnTopHint); + if (m_SplashScreen != NULL) + m_SplashScreen->show(); + if (m_SplashScreen != NULL && m_SplashScreen->isVisible()) + setSplashStatus(QObject::tr("Initializing...")); + } + else + m_SplashScreen = NULL; +} + +void ScribusCore::setSplashStatus(const QString& newText) +{ + if (m_SplashScreen != NULL) + m_SplashScreen->setStatus( newText ); +} + +void ScribusCore::showSplash(bool shown) +{ + if (m_SplashScreen!=NULL && shown!=m_SplashScreen->isVisible()) + m_SplashScreen->setVisible(shown); +} + +bool ScribusCore::splashShowing() const +{ + if (m_SplashScreen != NULL) + return m_SplashScreen->isVisible(); + return false; +} + +void ScribusCore::closeSplash() +{ + if (m_SplashScreen!=NULL) + { + m_SplashScreen->close(); + delete m_SplashScreen; + m_SplashScreen = NULL; + } +} + +bool ScribusCore::usingGUI() const +{ + return m_UseGUI; +} + +bool ScribusCore::isMacGUI() const +{ + // Do it statically for now +#if defined(Q_WS_MAC) + return true; +#else + return false; +#endif +} + +bool ScribusCore::isWinGUI() const +{ + // Do it statically for now +#if defined(_WIN32) + return true; +#else + return false; +#endif +} + +bool ScribusCore::reverseDialogButtons() const +{ + if (m_SwapDialogButtonOrder) + return true; + //Win32 - dont switch + #if defined(_WIN32) + return false; + //Mac Aqua - switch + #elif defined(Q_WS_MAC) + return true; + #else + //Gnome - switch + QString gnomesession= ::getenv("GNOME_DESKTOP_SESSION_ID"); + if (!gnomesession.isEmpty()) + return true; + + //KDE/KDE Aqua - dont switch + //Best guess for now if we are running under KDE + QString kdesession= ::getenv("KDE_FULL_SESSION"); + if (!kdesession.isEmpty()) + return false; + #endif + return false; +} + +//Returns false when there are no fonts +bool ScribusCore::initFonts(bool showFontInfo) +{ + setSplashStatus( tr("Searching for Fonts") ); + bool haveFonts=prefsManager->GetAllFonts(showFontInfo); + if (!haveFonts) + { + closeSplash(); + QString mess = tr("There are no fonts found on your system."); + mess += "\n" + tr("Exiting now."); + QMessageBox::critical(0, tr("Fatal Error"), mess, 1, 0, 0); + } + else + setSplashStatus( tr("Font System Initialized") ); + return haveFonts; +} + + +void ScribusCore::getCMSProfiles(bool showInfo) +{ + QString profDir; + QStringList profDirs; + MonitorProfiles.clear(); + PrinterProfiles.clear(); + InputProfiles.clear(); + InputProfilesCMYK.clear(); + QString pfad = ScPaths::instance().libDir(); + pfad += "profiles/"; + profDirs = ScPaths::getSystemProfilesDirs(); + profDirs.prepend( prefsManager->appPrefs.ProfileDir ); + profDirs.prepend( pfad ); + for(int i = 0; i < profDirs.count(); i++) + { + profDir = profDirs[i]; + if(!profDir.isEmpty()) + { + if(profDir.right(1) != "/") + profDir += "/"; + getCMSProfilesDir(profDir, showInfo, true); + } + } + if ((!PrinterProfiles.isEmpty()) && (!InputProfiles.isEmpty()) && (!MonitorProfiles.isEmpty())) + m_HaveCMS = true; + else + m_HaveCMS = false; +} + +void ScribusCore::getCMSProfilesDir(QString pfad, bool showInfo, bool recursive) +{ + QString profileName; + QList profileInfos = ScColorMgmtEngine::getAvailableProfileInfo(pfad, recursive); + for (int i = 0; i < profileInfos.count(); ++i) + { + const ScColorProfileInfo& profInfo = profileInfos.at(i); + profileName = profInfo.description; + if (profileName.isEmpty()) + { + if (showInfo) + sDebug(QString("Color profile %1 is broken : no valid description").arg(profInfo.file)); + continue; + } + if (!profInfo.debug.isEmpty()) + { + if (showInfo) + sDebug(profInfo.debug); + continue; + } + switch (static_cast(profInfo.deviceClass)) + { + case Class_Input: + if (profInfo.colorSpace == ColorSpace_Rgb) + { + if (!InputProfiles.contains(profileName)) + InputProfiles.insert(profileName, profInfo.file); + } + break; + case Class_ColorSpace: + if (profInfo.colorSpace == ColorSpace_Rgb) + { + if (!InputProfiles.contains(profileName)) + InputProfiles.insert(profileName, profInfo.file); + } + if (profInfo.colorSpace == ColorSpace_Cmyk) + { + if (!InputProfilesCMYK.contains(profileName)) + InputProfilesCMYK.insert(profileName, profInfo.file); + } + break; + case Class_Display: + if (profInfo.colorSpace == ColorSpace_Rgb) + { + if (!MonitorProfiles.contains(profileName)) + MonitorProfiles.insert(profileName, profInfo.file); + if (!InputProfiles.contains(profileName)) + InputProfiles.insert(profileName, profInfo.file); + } + if (profInfo.colorSpace == ColorSpace_Cmyk) + { + if (!InputProfilesCMYK.contains(profileName)) + InputProfilesCMYK.insert(profileName, profInfo.file); + } + break; + case Class_Output: + // Disable rgb printer profile detection until effective support + // PrinterProfiles.insert(nam, pfad + d[dc], false); + if (profInfo.colorSpace == ColorSpace_Cmyk) + { + if (!PDFXProfiles.contains(profileName)) + PDFXProfiles.insert(profileName, profInfo.file); + if (!InputProfilesCMYK.contains(profileName)) + InputProfilesCMYK.insert(profileName, profInfo.file); + if (!PrinterProfiles.contains(profileName)) + PrinterProfiles.insert(profileName, profInfo.file); + } + break; + } + if (showInfo) + sDebug( QString("Color profile %1 loaded from %2").arg(profileName).arg(profInfo.file) ); + } +} + +void ScribusCore::InitDefaultColorTransforms(void) +{ + TermDefaultColorTransforms(); + + // Ouvre le profile RGB par d�fault + if (InputProfiles.contains("sRGB IEC61966-2.1")) + defaultRGBProfile = ScColorMgmtEngine::openProfileFromFile(InputProfiles["sRGB IEC61966-2.1"]); + else + defaultRGBProfile = ScColorMgmtEngine::createProfile_sRGB(); + + // Ouvre le profile CMYK par d�faut + if (InputProfilesCMYK.contains("Fogra27L CMYK Coated Press")) + { + defaultCMYKProfile = ScColorMgmtEngine::openProfileFromFile(InputProfilesCMYK["Fogra27L CMYK Coated Press"]); + } + + if (!defaultRGBProfile || !defaultCMYKProfile) + { + TermDefaultColorTransforms(); + return; + } + + int dcmsFlags = Ctf_BlackPointCompensation | Ctf_LowResPrecalc; + eRenderIntent intent = Intent_Relative_Colorimetric; + + defaultRGBToScreenSolidTrans = ScColorMgmtEngine::createTransform(defaultRGBProfile, Format_RGB_16, + defaultRGBProfile, Format_RGB_16, intent, Ctf_NullTransform); + defaultRGBToScreenImageTrans = ScColorMgmtEngine::createTransform(defaultRGBProfile, Format_RGBA_8, + defaultRGBProfile, Format_RGBA_8, intent, Ctf_NullTransform); + defaultCMYKToScreenImageTrans = ScColorMgmtEngine::createTransform(defaultCMYKProfile, Format_CMYK_8, + defaultRGBProfile, Format_RGBA_8, intent, dcmsFlags); + defaultRGBToCMYKTrans = ScColorMgmtEngine::createTransform(defaultRGBProfile, Format_RGB_16, + defaultCMYKProfile, Format_CMYK_16, intent, dcmsFlags); + defaultCMYKToRGBTrans = ScColorMgmtEngine::createTransform(defaultCMYKProfile, Format_CMYK_16, + defaultRGBProfile, Format_RGB_16, intent, dcmsFlags); + if (!defaultRGBToScreenSolidTrans || !defaultRGBToScreenImageTrans || + !defaultCMYKToScreenImageTrans || !defaultRGBToCMYKTrans || + !defaultCMYKToRGBTrans ) + { + TermDefaultColorTransforms(); + } +} + +void ScribusCore::TermDefaultColorTransforms(void) +{ + defaultRGBProfile = ScColorProfile(); + defaultCMYKProfile = ScColorProfile(); + defaultRGBToScreenSolidTrans = ScColorTransform(); + defaultRGBToScreenImageTrans = ScColorTransform(); + defaultCMYKToScreenImageTrans = ScColorTransform(); + defaultRGBToCMYKTrans = ScColorTransform(); + defaultCMYKToRGBTrans = ScColorTransform(); +} + +void ScribusCore::initCMS() +{ + if (m_HaveCMS) + { + ProfilesL::Iterator ip; + if ((prefsManager->appPrefs.DCMSset.DefaultImageRGBProfile.isEmpty()) || (!InputProfiles.contains(prefsManager->appPrefs.DCMSset.DefaultImageRGBProfile))) + { + ip = InputProfiles.find("sRGB IEC61966-2.1"); + if (ip == InputProfiles.end()) + ip = InputProfiles.begin(); + prefsManager->appPrefs.DCMSset.DefaultImageRGBProfile = ip.key(); + } + if ((prefsManager->appPrefs.DCMSset.DefaultImageCMYKProfile.isEmpty()) || (!InputProfilesCMYK.contains(prefsManager->appPrefs.DCMSset.DefaultImageCMYKProfile))) + { + ip = InputProfilesCMYK.find("Fogra27L CMYK Coated Press"); + if (ip == InputProfilesCMYK.end()) + ip = InputProfilesCMYK.begin(); + prefsManager->appPrefs.DCMSset.DefaultImageCMYKProfile = ip.key(); + } + if ((prefsManager->appPrefs.DCMSset.DefaultSolidColorRGBProfile.isEmpty()) || (!InputProfiles.contains(prefsManager->appPrefs.DCMSset.DefaultSolidColorRGBProfile))) + { + ip = InputProfiles.find("sRGB IEC61966-2.1"); + if (ip == InputProfiles.end()) + ip = InputProfiles.begin(); + prefsManager->appPrefs.DCMSset.DefaultSolidColorRGBProfile = ip.key(); + } + if ((prefsManager->appPrefs.DCMSset.DefaultSolidColorCMYKProfile.isEmpty()) || (!InputProfilesCMYK.contains(prefsManager->appPrefs.DCMSset.DefaultSolidColorCMYKProfile))) + { + ip = InputProfilesCMYK.find("Fogra27L CMYK Coated Press"); + if (ip == InputProfilesCMYK.end()) + ip = InputProfilesCMYK.begin(); + prefsManager->appPrefs.DCMSset.DefaultSolidColorCMYKProfile = ip.key(); + } + if ((prefsManager->appPrefs.DCMSset.DefaultMonitorProfile.isEmpty()) || (!MonitorProfiles.contains(prefsManager->appPrefs.DCMSset.DefaultMonitorProfile))) + { + ip = MonitorProfiles.find("sRGB IEC61966-2.1"); + if (ip == MonitorProfiles.end()) + ip = MonitorProfiles.begin(); + prefsManager->appPrefs.DCMSset.DefaultMonitorProfile = ip.key(); + } + if ((prefsManager->appPrefs.DCMSset.DefaultPrinterProfile.isEmpty()) || (!PrinterProfiles.contains(prefsManager->appPrefs.DCMSset.DefaultPrinterProfile))) + { + ip = PrinterProfiles.find("Fogra27L CMYK Coated Press"); + if (ip == PrinterProfiles.end()) + ip = PrinterProfiles.begin(); + prefsManager->appPrefs.DCMSset.DefaultPrinterProfile = ip.key(); + } + InitDefaultColorTransforms(); + } +} + +ScribusMainWindow * ScribusCore::primaryMainWindow( ) +{ + if (ScMWList.count() == 0 || m_currScMW > ScMWList.count()) + return 0; + ScribusMainWindow* mw=ScMWList.at(m_currScMW); + if (!mw) + return 0; + return mw; +} + +void ScribusCore::recheckGS() +{ + m_HaveGS = testGSAvailability(); + m_HavePngAlpha = testGSDeviceAvailability("pngalpha"); + m_HaveTiffSep = testGSDeviceAvailability("tiffsep"); +} + +bool ScribusCore::fileWatcherActive() const +{ + if (fileWatcher!=NULL) + return fileWatcher->isActive(); + return false; +} -- cgit