diff --git a/CMakeLists.txt b/CMakeLists.txt index 67bc133ac..c3a387447 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,7 +62,12 @@ kde4_automoc(${okularcore_SRCS}) kde4_add_library(okularcore SHARED ${okularcore_SRCS}) -target_link_libraries(okularcore ${KDE4_KPARTS_LIBS} ${QT_QTCORE_LIBRARY} ${KDE4_KDEUI_LIBS} ${QT_QTGUI_LIBRARY} m ) +# Special handling for linking okularcore on OSX/Apple +IF(APPLE) + SET(OKULAR_IOKIT "-framework IOKit" CACHE STRING "Apple IOKit framework") +ENDIF(APPLE) + +target_link_libraries(okularcore ${OKULAR_IOKIT} ${KDE4_KPARTS_LIBS} ${QT_QTCORE_LIBRARY} ${KDE4_KDEUI_LIBS} ${QT_QTGUI_LIBRARY} m ) install(TARGETS okularcore DESTINATION ${LIB_INSTALL_DIR} ) diff --git a/core/utils.cpp b/core/utils.cpp index eafff8019..99b903e71 100644 --- a/core/utils.cpp +++ b/core/utils.cpp @@ -9,6 +9,17 @@ #include "utils.h" +#ifdef Q_WS_X11 +#include +#endif + +#ifdef Q_WS_MAC +#include +#include +#endif + + + using namespace Okular; QRect Utils::rotateRect( const QRect & source, int width, int height, int orientation ) @@ -37,3 +48,90 @@ QRect Utils::rotateRect( const QRect & source, int width, int height, int orient return ret; } + +#if defined(Q_WS_X11) +double Utils::getDpiX() { + return QX11Info::appDpiX(); +} + +double Utils::getDpiY() { + return QX11Info::appDpiY(); +} +#elif defined(Q_WS_MAC) + /* + * Code copied from http://developer.apple.com/qa/qa2001/qa1217.html + */ + // Handy utility function for retrieving an int from a CFDictionaryRef + static int GetIntFromDictionaryForKey( CFDictionaryRef desc, CFStringRef key ) + { + CFNumberRef value; + int num = 0; + if ( (value = (CFNumberRef)CFDictionaryGetValue(desc, key)) == NULL || CFGetTypeID(value) != CFNumberGetTypeID()) + return 0; + CFNumberGetValue(value, kCFNumberIntType, &num); + return num; + } + + CGDisplayErr GetDisplayDPI( + CFDictionaryRef displayModeDict, + CGDirectDisplayID displayID, + double *horizontalDPI, double *verticalDPI ) + { + CGDisplayErr err = kCGErrorFailure; + io_connect_t displayPort; + CFDictionaryRef displayDict; + + // Grab a connection to IOKit for the requested display + displayPort = CGDisplayIOServicePort( displayID ); + if ( displayPort != MACH_PORT_NULL ) + { + // Find out what IOKit knows about this display + displayDict = IODisplayCreateInfoDictionary(displayPort, 0); + if ( displayDict != NULL ) + { + const double mmPerInch = 25.4; + double horizontalSizeInInches = + (double)GetIntFromDictionaryForKey(displayDict, + CFSTR(kDisplayHorizontalImageSize)) / mmPerInch; + double verticalSizeInInches = + (double)GetIntFromDictionaryForKey(displayDict, + CFSTR(kDisplayVerticalImageSize)) / mmPerInch; + + // Make sure to release the dictionary we got from IOKit + CFRelease(displayDict); + + // Now we can calculate the actual DPI + // with information from the displayModeDict + *horizontalDPI = + (double)GetIntFromDictionaryForKey( displayModeDict, kCGDisplayWidth ) + / horizontalSizeInInches; + *verticalDPI = (double)GetIntFromDictionaryForKey( displayModeDict, + kCGDisplayHeight ) / verticalSizeInInches; + err = CGDisplayNoErr; + } + } + return err; + } + +double Utils::getDpiX() { + double x,y; + CGDisplayErr err = GetDisplayDPI( CGDisplayCurrentMode(kCGDirectMainDisplay), + kCGDirectMainDisplay, + &x, &y ); + + return err == CGDisplayNoErr ? x : 72.0; +} + +double Utils::getDpiY() { + double x,y; + CGDisplayErr err = GetDisplayDPI( CGDisplayCurrentMode(kCGDirectMainDisplay), + kCGDirectMainDisplay, + &x, &y ); + + return err == CGDisplayNoErr ? y : 72.0; +} +#else +#error "Not yet contributed" +#endif + + diff --git a/core/utils.h b/core/utils.h index 7aee183b1..dd94f3b52 100644 --- a/core/utils.h +++ b/core/utils.h @@ -28,6 +28,16 @@ class OKULAR_EXPORT Utils * specified \p orientation . */ static QRect rotateRect( const QRect & source, int width, int height, int orientation ); + + /** + * Return the horizontal DPI of the main display + */ + static double getDpiX(); + + /** + * Return the vertical DPI of the main display + */ + static double getDpiY(); }; } diff --git a/generators/dvi/generator_dvi.cpp b/generators/dvi/generator_dvi.cpp index 10f0f05f5..a9316c54b 100644 --- a/generators/dvi/generator_dvi.cpp +++ b/generators/dvi/generator_dvi.cpp @@ -17,7 +17,6 @@ #include "pageSize.h" #include -#include #include #include #include @@ -45,7 +44,7 @@ bool DviGenerator::loadDocument( const QString & fileName, QVector< Okular::Page kDebug() << "# of pages: " << m_dviRenderer->dviFile->total_pages << endl; - m_resolution = QX11Info::appDpiY(); + m_resolution = Okular::Utils::getDpiY(); loadPages( pagesVector, 0 ); ready = true;