oKular: Add method(s) to get the DPI of the primary screen

some generators use QX11Info to get the DPI of the display.
    Obviously this is not portable, add a getDpi? method to utils
    which can be used by generators.
    Currently only the DVI converter is converted.
    The CMakeLists.txt change assumes that non existing variables
    gets expanded to empty strings.

svn path=/trunk/playground/graphics/okular/; revision=600099
remotes/origin/KDE/4.0
Holger Freyther 20 years ago
parent a49e75edeb
commit 569e93b929
  1. 7
      CMakeLists.txt
  2. 98
      core/utils.cpp
  3. 10
      core/utils.h
  4. 3
      generators/dvi/generator_dvi.cpp

@ -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} )

@ -9,6 +9,17 @@
#include "utils.h"
#ifdef Q_WS_X11
#include <QX11Info>
#endif
#ifdef Q_WS_MAC
#include <ApplicationServices/ApplicationServices.h>
#include <IOKit/graphics/IOGraphicsLib.h>
#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

@ -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();
};
}

@ -17,7 +17,6 @@
#include "pageSize.h"
#include <qapplication.h>
#include <QX11Info>
#include <qstring.h>
#include <qurl.h>
#include <qvector.h>
@ -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;

Loading…
Cancel
Save