QPrinter_Win.cpp

Simon Rutishauser simon.rutishauser at web.de
Thu Dec 16 18:14:46 CET 2004


On Thu, Dec 16, 2004 at 03:57:42PM -0000, Chris January wrote:
> > Somehow cvs diff (-u) does not seem to produce usable results for me. 
> > Bad luck.
> Exactly what problems are you having with cvs diff?
> 
> The qprinter_win.cpp file you sent has double line spacing which could be a
> clue to the problem.
> 
> We really would prefer patches in unified format since it's:
> a) easier to see what's changed
> b) easier to merge if someone else has changed the code as well
> c) no error-prone cutting and pasting between files
> 
> Cheers,
> Chris

It seems i identified (part) of the problem. qpainter_win patch should 
be ok now. As for the qprinter_win part i don't know for sure what the 
problems are (they were caused by the fact that i diffed under linux 
first but now I tried on Windows with newly installed tortoise cvs).

Simon
-------------- next part --------------
Index: src/kernel/qpainter_win.cpp
===================================================================
RCS file: /cvsroot/kde-cygwin/qt-3/src/kernel/Attic/qpainter_win.cpp,v
retrieving revision 1.1.2.15.2.20
diff -u -r1.1.2.15.2.20 qpainter_win.cpp
--- src/kernel/qpainter_win.cpp	13 Dec 2004 10:24:47 -0000	1.1.2.15.2.20
+++ src/kernel/qpainter_win.cpp	16 Dec 2004 17:01:24 -0000
@@ -4011,13 +4011,31 @@
 void QPainter::drawTextItem( int x, int y, const QTextItem & ti, int textFlags )
 {
     if ( testf( ExtDev ) ) {
-        QPDevCmdParam param[ 2 ];
-        QPoint p( x, y );
-        param[ 0 ].point = &p;
-        param[ 1 ].textItem = &ti;
-        bool retval = pdev->cmd( QPaintDevice::PdcDrawTextItem, this, param );
-        if ( !retval || !hdc )
-            return ;
+        QPDevCmdParam param[ 2 ];
+        QPoint p( x, y );
+        param[ 0 ].point = &p;
+        param[ 1 ].textItem = &ti;
+        //bool retval = pdev->cmd( QPaintDevice::PdcDrawTextItem, this, param );
+
+        //Create Pixmap and write there...
+        QTextEngine *engine = ti.engine;
+        QScriptItem *si = &engine->items[ ti.item ];
+
+        engine->shape( ti.item );
+        QFontEngine *fe = si->fontEngine;
+        assert( fe != 0 );
+
+        QPixmap pixmap = QPixmap( si->width, fe->tm.w.tmHeight );
+        pixmap.fill();
+
+        fe->draw( &QPainter( &pixmap ), si->x, si->y, engine, si, textFlags );
+        pixmap.setMask( pixmap.createHeuristicMask() );
+
+        param[ 1 ].pixmap = &pixmap;
+        bool retval = pdev->cmd( QPaintDevice::PdcDrawPixmap, this, param );
+
+        if ( !retval || !hdc )
+            return ;
     }
 
     QTextEngine *engine = ti.engine;
-------------- next part --------------
Index: src/kernel/qprinter_win.cpp
===================================================================
RCS file: /cvsroot/kde-cygwin/qt-3/src/kernel/Attic/qprinter_win.cpp,v
retrieving revision 1.1.2.6.2.12
diff -u -r1.1.2.6.2.12 qprinter_win.cpp
--- src/kernel/qprinter_win.cpp	25 Nov 2004 16:45:49 -0000	1.1.2.6.2.12
+++ src/kernel/qprinter_win.cpp	16 Dec 2004 16:58:12 -0000
@@ -1,640 +1,1231 @@
-/****************************************************************************
-** $Id: qprinter_win.cpp,v 1.1.2.6.2.12 2004/11/25 16:45:49 chehrlic Exp $
-**
-** Implementation of QPrinter class for Unix
-**
-** Created : 20030119
-**
-** Copyright (C) 2003 Holger Schroeder
-** Copyright (C) 2003 Richard L??
-** Copyright (C) 2004 Tom and Timi Cecka
-** Copyright (C) 2004 Andreas Hausladen
-** Copyright (C) 2004 Ralf Habacker
-** Copyright (C) 2004 Peter Kuemmel
-** Copyright (C) 2004 Simon Rutishauser
-**
-** This file is part of the kernel module of the Qt GUI Toolkit.
-**
-** This file may be distributed under the terms of the Q Public License
-** as defined by Trolltech AS of Norway and appearing in the file
-** LICENSE.QPL included in the packaging of this file.
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** See http://www.trolltech.com/pricing.html or email sales at trolltech.com for
-**   information about Qt Commercial License Agreements.
-** See http://www.trolltech.com/qpl/ for QPL licensing information.
-** See http://www.trolltech.com/gpl/ for GPL licensing information.
-**
-** Contact kde-cygwin at kde.org if any conditions of this licensing are
-** not clear to you.
-**
-**********************************************************************/
-
-#include "qplatformdefs.h"
-
-// POSIX Large File Support redefines open -> open64
-static inline int qt_open( const char *pathname, int flags, mode_t mode )
-{
-    return ::open( pathname, flags, mode );
-}
-#if defined(open)
-# undef open
-#endif
-
-#include "qprinter.h"
-#include "qt_windows.h"
-
-#ifndef QT_NO_PRINTER
-
-#include "qpaintdevicemetrics.h"
-#include "qapplication.h"
-
-#include <stdlib.h>
-
-
-// NOT REVISED
-
-
-class QPrinterPrivate
-{
-public:
-    uint topMargin;
-    uint leftMargin;
-    uint bottomMargin;
-    uint rightMargin;
-};
-
-/*****************************************************************************
-  QPrinter member functions
- *****************************************************************************/
-
-// QPrinter states
-
-#define PST_IDLE        0
-#define PST_ACTIVE      1
-#define PST_ERROR       2
-#define PST_ABORTED     3
-
-// Default values for QPrinter members
-
-struct PrinterDefaults
-{
-    QString printerName;
-    bool outputToFile;
-    QString outputFileName;
-    QPrinter::Orientation orientation;
-    QPrinter::PageSize pageSize;
-    QPrinter::PageOrder pageOrder;
-    QPrinter::ColorMode colorMode;
-    int numCopies;
-};
-
-static PrinterDefaults * globalPrinterDefaults = 0;
-
-/*!
-    Constructs a printer paint device with mode \a m.
- 
-    \sa QPrinter::PrinterMode
-*/
-
-QPrinter::QPrinter( PrinterMode m )
-        : QPaintDevice( QInternal::Printer | QInternal::ExternalDevice )
-{
-    viewOffsetDone = false;
-    painter = 0;
-    hdevmode = new DEVMODE();
-    hdevnames = new DEVNAMES();
-
-    orient = Portrait;
-    page_size = A4;
-    page_order = FirstPageFirst;
-    printer_name = QString();
-    color_mode = Color;
-    ncopies = 1;
-    from_pg = to_pg = min_pg = max_pg = 0;
-    state = PST_IDLE;
-    output_file = FALSE;
-    to_edge = FALSE;
-    paper_source = OnlyOne;
-    switch ( m ) {
-    case ScreenResolution:
-        //#ifdef Q_WS_QWS
-        res = 72;
-        /*#else
-        res = QPaintDevice::x11AppDpiY();
-        #endif*/
-        break;
-    case Compatible:
-    case PrinterResolution:
-        res = 72;
-        break;
-    case HighResolution:
-        res = 600;
-    }
-
-    d = new QPrinterPrivate;
-    //D->marginsSpecified = false;
-    //d->printerOptions = 0;
-    setOptionEnabled( PrintToFile, TRUE );
-    setOptionEnabled( PrintPageRange, TRUE );
-    setPrintRange( AllPages );
-}
-
-/*!
-    Destroys the printer paint device and cleans up.
-*/
-
-QPrinter::~QPrinter()
-{}
-
-
-/*!
-    Advances to a new page on the printer. Returns TRUE if successful;
-    otherwise returns FALSE.
-*/
-
-bool QPrinter::newPage()
-{
-    return FALSE;
-}
-
-
-/*!
-    Aborts the print job. Returns TRUE if successful; otherwise
-    returns FALSE.
- 
-    \sa aborted()
-*/
-
-bool QPrinter::abort()
-{
-    return state == PST_ABORTED;
-}
-
-/*!
-    Returns TRUE is the printer job was aborted; otherwise returns
-    FALSE.
- 
-    \sa abort()
-*/
-
-bool QPrinter::aborted() const
-{
-    return state == PST_ABORTED;
-}
-
-/*!
-    Sets the printer name to \a name.
- 
-    The default printer will be used if no printer name is set.
- 
-    Under X11, the \c PRINTER environment variable defines the default
-    printer.  Under any other window system, the window system defines
-    the default printer.
- 
-    \sa printerName()
-*/
-
-void QPrinter::setPrinterName( const QString &name )
-{
-    if ( state != 0 ) {
-#if defined(QT_CHECK_STATE)
-        qWarning( "QPrinter::setPrinterName: Cannot do this during printing" );
-#endif
-
-        return ;
-    }
-    printer_name = name;
-}
-
-static void deleteGlobalPrinterDefaults()
-{
-    delete globalPrinterDefaults;
-    globalPrinterDefaults = 0;
-}
-
-/*!
-    Opens a printer setup dialog, with parent \a parent, and asks the
-    user to specify which printer they wish to use and what settings
-    it should have.
- 
-    Returns TRUE if the user pressed "OK" to print, or FALSE if the
-    user cancelled the operation.
-*/
-
-bool QPrinter::setup( QWidget * parent )
-{
-    //resolution? duplex? custom paper size?
-    PRINTDLG pd;
-    pd.lStructSize = sizeof( pd );
-    pd.hwndOwner = parent->winId();
-
-    /* DEVMODE is not yet unicode (QT_WA) - able ! */
-    DEVMODE* devmode = static_cast<DEVMODE*>( hdevmode );
-
-    if ( printerName().length() != 0 )
-        QT_WA( wcsncpy( ( LPWSTR )devmode->dmDeviceName, ( LPWSTR )printerName().left( 31 ).ucs2(), 32 );,
-               strncpy( ( LPSTR ) devmode->dmDeviceName, ( LPSTR ) printerName().left( 31 ).latin1(), 32);)
-    else
-        devmode->dmDeviceName[0] = '\0';
-    devmode->dmFields = DM_ORIENTATION | DM_PAPERSIZE | DM_COPIES | DM_DEFAULTSOURCE | DM_COLOR;
-    devmode->dmOrientation = orientation() == Portrait ? DMORIENT_PORTRAIT : DMORIENT_LANDSCAPE;
-
-    switch ( pageSize() ) {
-    case Letter:
-        devmode->dmPaperSize = DMPAPER_LETTER;
-        break;
-    case Legal:
-        devmode->dmPaperSize = DMPAPER_LEGAL;
-        break;
-    case Executive:
-        devmode->dmPaperSize = DMPAPER_EXECUTIVE;
-        break;
-    case A2:
-        devmode->dmPaperSize = DMPAPER_A2;
-        break;
-    case A3:
-        devmode->dmPaperSize = DMPAPER_A3;
-        break;
-    case A4:
-        devmode->dmPaperSize = DMPAPER_A4;
-        break;
-    case A5:
-        devmode->dmPaperSize = DMPAPER_A5;
-        break;
-    case B4:
-        devmode->dmPaperSize = DMPAPER_B4;
-        break;
-    case B5:
-        devmode->dmPaperSize = DMPAPER_B5;
-        break;
-    case C5E:
-        devmode->dmPaperSize = DMPAPER_ENV_C5;
-        break;
-    case Comm10E:
-        devmode->dmPaperSize = DMPAPER_ENV_10;
-        break;
-    case DLE:
-        devmode->dmPaperSize = DMPAPER_ENV_DL;
-        break;
-    case Folio:
-        devmode->dmPaperSize = DMPAPER_FOLIO;
-        break;
-    case Ledger:
-        devmode->dmPaperSize = DMPAPER_LEDGER;
-        break;
-    case Tabloid:
-        devmode->dmPaperSize = DMPAPER_TABLOID;
-        break;
-    case Custom:
-        devmode->dmPaperSize = 0;
-        //devmode->dmPaperLength =
-        //devmode->dmPaperWidth =
-        break;
-    }
-    devmode->dmCopies = numCopies();
-    switch ( paperSource() ) {
-    case OnlyOne:
-        devmode->dmDefaultSource = DMBIN_ONLYONE;
-        break;
-    case Lower:
-        devmode->dmDefaultSource = DMBIN_LOWER;
-        break;
-    case Middle:
-        devmode->dmDefaultSource = DMBIN_MIDDLE;
-        break;
-    case Manual:
-        devmode->dmDefaultSource = DMBIN_MANUAL;
-        break;
-    case Envelope:
-        devmode->dmDefaultSource = DMBIN_ENVELOPE;
-        break;
-    case EnvelopeManual:
-        devmode->dmDefaultSource = DMBIN_ENVMANUAL;
-        break;
-    case Auto:
-        devmode->dmDefaultSource = DMBIN_AUTO;
-        break;
-    case Tractor:
-        devmode->dmDefaultSource = DMBIN_TRACTOR;
-        break;
-    case SmallFormat:
-        devmode->dmDefaultSource = DMBIN_SMALLFMT;
-        break;
-    case LargeFormat:
-        devmode->dmDefaultSource = DMBIN_LARGEFMT;
-        break;
-    case LargeCapacity:
-        devmode->dmDefaultSource = DMBIN_LARGECAPACITY;
-        break;
-    case Cassette:
-        devmode->dmDefaultSource = DMBIN_CASSETTE;
-        break;
-    case FormSource:
-        devmode->dmDefaultSource = DMBIN_FORMSOURCE;
-        break;
-    }
-    devmode->dmColor = colorMode() == Color ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME;
-
-    pd.hDevMode = hdevmode;
-    pd.hDevNames = hdevnames;
-    pd.hDC = hdc;
-
-    switch ( printRange() ) {
-    case AllPages:
-        pd.Flags = PD_ALLPAGES;
-        break;
-    case Selection:
-        pd.Flags = PD_SELECTION;
-        break;
-    case PageRange:
-        pd.Flags = PD_PAGENUMS;
-        break;
-    }
-    //pd.Flags |= PD_COLLATE;
-    pd.Flags |= PD_USEDEVMODECOPIESANDCOLLATE; //printer driver handles multipage and collation
-    if ( !isOptionEnabled( PrintToFile ) )
-        pd.Flags |= PD_HIDEPRINTTOFILE | PD_DISABLEPRINTTOFILE; //?
-    if ( !isOptionEnabled( PrintSelection ) )
-        pd.Flags |= PD_NOSELECTION;
-    if ( !isOptionEnabled( PrintPageRange ) )
-        pd.Flags |= PD_NOPAGENUMS;
-    if ( outputToFile() )
-        pd.Flags |= PD_PRINTTOFILE;
-
-    pd.nFromPage = fromPage();
-    pd.nToPage = toPage();
-    pd.nMinPage = minPage();
-    pd.nMaxPage = maxPage();
-    pd.nCopies = numCopies();
-
-    if ( !PrintDlg( &pd ) )
-        return false;
-
-    if ( hdevmode != 0 ) {
-        setPrinterName( qt_winQString( devmode->dmDeviceName ) );
-        setPrintProgram( qt_winQString( devmode->dmDeviceName ) );
-
-        if ( devmode->dmFields & DM_ORIENTATION )
-            setOrientation( devmode->dmOrientation == DMORIENT_PORTRAIT ? Portrait : Landscape );
-        if ( devmode->dmFields & DM_PAPERSIZE )
-            switch ( devmode->dmPaperSize ) {
-            case DMPAPER_LETTER:
-                setPageSize( Letter );
-                break;
-            case DMPAPER_LEGAL:
-                setPageSize( Legal );
-                break;
-            case DMPAPER_EXECUTIVE:
-                setPageSize( Executive );
-                break;
-            case DMPAPER_A2:
-                setPageSize( A2 );
-                break;
-            case DMPAPER_A3:
-                setPageSize( A3 );
-                break;
-            case DMPAPER_A4:
-                setPageSize( A4 );
-                break;
-            case DMPAPER_A5:
-                setPageSize( A5 );
-                break;
-            case DMPAPER_B4:
-                setPageSize( B4 );
-                break;
-            case DMPAPER_B5:
-                setPageSize( B5 );
-                break;
-            case DMPAPER_ENV_C5:
-                setPageSize( C5E );
-                break;
-            case DMPAPER_ENV_10:
-                setPageSize( Comm10E );
-                break;
-            case DMPAPER_ENV_DL:
-                setPageSize( DLE );
-                break;
-            case DMPAPER_FOLIO:
-                setPageSize( Folio );
-                break;
-            case DMPAPER_LEDGER:
-                setPageSize( Ledger );
-                break;
-            case DMPAPER_TABLOID:
-                setPageSize( Tabloid );
-                break;
-            default:
-                setPageSize( Custom );
-                //devmode->dmPaperLength
-                //devmode->dmPaperWidth
-                break;
-            }
-
-        if ( devmode->dmFields & DM_COPIES )
-            setNumCopies( devmode->dmCopies );
-        if ( devmode->dmFields & DM_DEFAULTSOURCE )
-            switch ( devmode->dmDefaultSource ) {
-            case DMBIN_ONLYONE:
-                setPaperSource( OnlyOne );
-                break;
-            case DMBIN_LOWER:
-                setPaperSource( Lower );
-                break;
-            case DMBIN_MIDDLE:
-                setPaperSource( Middle );
-                break;
-            case DMBIN_MANUAL:
-                setPaperSource( Manual );
-                break;
-            case DMBIN_ENVELOPE:
-                setPaperSource( Envelope );
-                break;
-            case DMBIN_ENVMANUAL:
-                setPaperSource( EnvelopeManual );
-                break;
-            case DMBIN_AUTO:
-                setPaperSource( Auto );
-                break;
-            case DMBIN_TRACTOR:
-                setPaperSource( Tractor );
-                break;
-            case DMBIN_SMALLFMT:
-                setPaperSource( SmallFormat );
-                break;
-            case DMBIN_LARGEFMT:
-                setPaperSource( LargeFormat );
-                break;
-            case DMBIN_LARGECAPACITY:
-                setPaperSource( LargeCapacity );
-                break;
-            case DMBIN_CASSETTE:
-                setPaperSource( Cassette );
-                break;
-            case DMBIN_FORMSOURCE:
-                setPaperSource( FormSource );
-                break;
-            }
-        if ( devmode->dmFields & DM_COLOR )
-            setColorMode( devmode->dmColor == DMCOLOR_COLOR ? Color : GrayScale );
-    }
-
-    if ( pd.Flags & PD_ALLPAGES )
-        setPrintRange( AllPages );
-    else if ( pd.Flags & PD_SELECTION )
-        setPrintRange( Selection );
-    else if ( pd.Flags & PD_PAGENUMS )
-        setPrintRange( PageRange );
-
-    setOutputToFile( pd.Flags & PD_PRINTTOFILE );
-    setFromTo( pd.nFromPage, pd.nToPage );
-    setMinMax( pd.nMinPage, pd.nMaxPage );
-    setNumCopies( pd.nCopies );
-}
-
-/*!
-  \internal
-  Handles painter commands to the printer.
-*/
-
-bool QPrinter::cmd( int c, QPainter *paint, QPDevCmdParam *p )
-{
-    return TRUE;
-}
-
-
-/*!
-  Internal implementation of the virtual QPaintDevice::metric() function.
- 
-  Use the QPaintDeviceMetrics class instead.
- 
-  \internal
-  Hard coded return values for PostScript under X.
-*/
-
-int QPrinter::metric( int m ) const
-{
-    return m; // sure?
-}
-
-
-/*!
-    Returns the width of the left margin and the height of the top
-    margin of the printer. On Unix, this is a best-effort guess, not
-    based on perfect knowledge.
- 
-    If you have called setFullPage( TRUE ), margins().width() may be
-    treated as the smallest sane left margin you can use, and
-    margins().height() as the smallest sane top margin you can
-    use.
- 
-    If you have called setFullPage( FALSE ) (this is the default),
-    margins() is automatically subtracted from the pageSize() by
-    QPrinter.
- 
-    \sa setFullPage() QPaintDeviceMetrics PageSize
-*/
-QSize QPrinter::margins() const
-{
-    if ( d )
-        return QSize( d->leftMargin, d->topMargin );
-
-    if ( orient == Portrait )
-        return QSize( res / 2, res / 3 );
-
-    return QSize( res / 3, res / 2 );
-}
-
-/*!
-    \overload
- 
-    Sets \a top, \a left, \a bottom and \a right to the margins of the
-    printer.  On Unix, this is a best-effort guess, not based on
-    perfect knowledge.
- 
-    If you have called setFullPage( TRUE ), the four values specify
-    the smallest sane margins you can use.
- 
-    If you have called setFullPage( FALSE ) (this is the default),
-    the margins are automatically subtracted from the pageSize() by
-    QPrinter.
- 
-    \sa setFullPage() QPaintDeviceMetrics PageSize
-*/
-void QPrinter::margins( uint *top, uint *left, uint *bottom, uint *right ) const
-{
-    if ( !d ) {
-        int x = orient == Portrait ? res / 2 : res / 3;
-        int y = orient == Portrait ? res / 3 : res / 2;
-        *top = *bottom = y;
-        *left = *right = x;
-    } else {
-        *top = d->topMargin;
-        *left = d->leftMargin;
-        *bottom = d->bottomMargin;
-        *right = d->rightMargin;
-    }
-}
-
-/*!
-  Sets the printer margins to the sizes specified in \a top, \a left,
-  \a bottom and \a right.
- 
-  This function currently only has an effect on Unix systems.
- 
-  \sa margins()
-*/
-void QPrinter::setMargins( uint top, uint left, uint bottom, uint right )
-{
-    if ( !d )
-        d = new QPrinterPrivate;
-    d->topMargin = top;
-    d->leftMargin = left;
-    d->bottomMargin = bottom;
-    d->rightMargin = right;
-}
-
-void QPrinter::reinit( void )
-{}
-
-void QPrinter::setActive( void )
-{}
-
-void QPrinter::setIdle( void )
-{}
-
-/*!
-  Windows only, using this function is not portable! Sets the windows page size
-  value that is used by the DEVMODE struct. The winPageSize value must be one of
-  the DMPAPER_ defines from wingdi.h.
-*/
-void QPrinter::setWinPageSize( short winPageSize )
-{
-    PDEVMODE dev = ( PDEVMODE ) hdevmode;
-    if ( dev != 0 )
-        dev->dmPaperSize = winPageSize;
-}
-
-/*!
-  Returns the Windows page size value as used by the DEVMODE struct
-  (Windows only). Using this function is not portable.
- 
-  Use pageSize() to get the PageSize, e.g. 'A4', 'Letter', etc.
-*/
-short QPrinter::winPageSize() const
-{
-    PDEVMODE dev = ( PDEVMODE ) hdevmode;
-    if ( dev == 0 )
-        return 0;
-    return dev->dmPaperSize;
-}
-
-
-#endif
+/****************************************************************************
+** $Id: qprinter_win.cpp,v 1.1.2.6.2.8 2004/09/25 11:53:39 atomice Exp $
+**
+** Implementation of QPrinter class for Unix
+**
+** Created : 20030119
+**
+** Copyright (C) 2003 Holger Schroeder
+** Copyright (C) 2003 Richard L??
+** Copyright (C) 2004 Tom and Timi Cecka
+** Copyright (C) 2004 Andreas Hausladen
+** Copyright (C) 2004 Ralf Habacker
+** Copyright (C) 2004 Peter Kuemmel
+** Copyright (C) 2004 Simon Rutishauser
+**
+** This file is part of the kernel module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales at trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact kde-cygwin at kde.org if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qplatformdefs.h"
+
+// POSIX Large File Support redefines open -> open64
+static inline int qt_open( const char *pathname, int flags, mode_t mode )
+{
+    return ::open( pathname, flags, mode );
+}
+#if defined(open)
+# undef open
+#endif
+
+#include "qprinter.h"
+#include "qt_windows.h"
+
+#ifndef QT_NO_PRINTER
+
+#include "qapplication.h"
+#include "qimage.h"
+#include "qpaintdevicemetrics.h"
+#include "qpen.h"
+#include "qpixmap.h"
+#include "qpointarray.h"
+
+#include "qtextengine_p.h"
+#include "qtextlayout_p.h"
+
+#include <stdlib.h>
+#include <math.h>
+
+// NOT REVISED
+
+
+class QPrinterPrivate
+{
+public:
+    bool marginsSpecified;
+    uint topMargin;
+    uint leftMargin;
+    uint bottomMargin;
+    uint rightMargin;
+};
+
+#define D ( (QPrinterPrivate*) d )
+
+
+/*****************************************************************************
+  QPrinter member functions
+ *****************************************************************************/
+
+// QPrinter states
+
+#define PST_IDLE        0
+#define PST_ACTIVE      1
+#define PST_ERROR       2
+#define PST_ABORTED     3
+
+// Default values for QPrinter members
+
+struct PrinterDefaults
+{
+    QString printerName;
+    bool outputToFile;
+    QString outputFileName;
+    QPrinter::Orientation orientation;
+    QPrinter::PageSize pageSize;
+    QPrinter::PageOrder pageOrder;
+    QPrinter::ColorMode colorMode;
+    int numCopies;
+};
+
+static PrinterDefaults * globalPrinterDefaults = 0;
+
+/*!
+    Constructs a printer paint device with mode \a m.
+
+    \sa QPrinter::PrinterMode
+*/
+
+QPrinter::QPrinter( PrinterMode m )
+        : QPaintDevice( QInternal::Printer | QInternal::ExternalDevice )
+{
+    viewOffsetDone = false;
+    painter = 0;
+    hdevmode = GlobalAlloc( GHND, sizeof( DEVMODE ) );
+    //hdevnames = GlobalAlloc(GHND,sizeof(DEVNAMES));
+
+    orient = Portrait;
+    page_size = A4;
+    page_order = FirstPageFirst;
+    printer_name = QString( "" );
+    color_mode = Color;
+    ncopies = 1;
+    from_pg = to_pg = min_pg = max_pg = 0;
+    state = PST_IDLE;
+    output_file = FALSE;
+    to_edge = FALSE;
+    paper_source = OnlyOne;
+    switch ( m ) {
+    case ScreenResolution:
+        res = 72;
+        break;
+    case Compatible:
+    case PrinterResolution:
+        res = 72;
+        break;
+    case HighResolution:
+        res = 600;
+    }
+
+    d = new QPrinterPrivate;
+    d->marginsSpecified = false;
+    //d->printerOptions = 0;
+    setOptionEnabled( PrintToFile, TRUE );
+    setOptionEnabled( PrintPageRange, TRUE );
+    setPrintRange( AllPages );
+}
+
+/*!
+    Destroys the printer paint device and cleans up.
+*/
+
+QPrinter::~QPrinter()
+{
+    GlobalFree( hdevmode );
+    //GlobalFree(hdevnames);
+    delete d;
+}
+
+
+/*!
+    Advances to a new page on the printer. Returns TRUE if successful;
+    otherwise returns FALSE.
+*/
+
+bool QPrinter::newPage()
+{
+    state = PST_ACTIVE;
+    return EndPage( hdc ) && StartPage( hdc );
+}
+
+
+/*!
+    Aborts the print job. Returns TRUE if successful; otherwise
+    returns FALSE.
+
+    \sa aborted()
+*/
+
+bool QPrinter::abort()
+{
+    bool aborted = AbortDoc( hdc );
+    if ( aborted )
+        state = PST_ABORTED;
+    return aborted;
+    //return state == PST_ABORTED;
+}
+
+/*!
+    Returns TRUE is the printer job was aborted; otherwise returns
+    FALSE.
+
+    \sa abort()
+*/
+
+bool QPrinter::aborted() const
+{
+    return state == PST_ABORTED;
+}
+
+/*!
+    Sets the printer name to \a name.
+
+    The default printer will be used if no printer name is set.
+
+    Under X11, the \c PRINTER environment variable defines the default
+    printer.  Under any other window system, the window system defines
+    the default printer.
+
+    \sa printerName()
+*/
+
+void QPrinter::setPrinterName( const QString &name )
+{
+    if ( state != 0 ) {
+#if defined(QT_CHECK_STATE)
+        qWarning( "QPrinter::setPrinterName: Cannot do this during printing" );
+#endif
+
+        return ;
+    }
+    printer_name = name;
+}
+
+static void deleteGlobalPrinterDefaults()
+{
+    delete globalPrinterDefaults;
+    globalPrinterDefaults = 0;
+}
+
+/*!
+    Opens a printer setup dialog, with parent \a parent, and asks the
+    user to specify which printer they wish to use and what settings
+    it should have.
+
+    Returns TRUE if the user pressed "OK" to print, or FALSE if the
+    user cancelled the operation.
+*/
+
+bool QPrinter::setup( QWidget * parent )
+{
+    //resolution? duplex? custom paper size?
+
+    //get default printer name in format printername
+    PRINTDLG pd;
+    memset ( ( void * ) & pd, 0, sizeof( PRINTDLG ) );
+
+    pd.lStructSize = sizeof( PRINTDLG );
+    pd.hwndOwner = parent->winId();
+    pd.hInstance = 0;
+
+    /*DEVNAMES* devnames = static_cast<DEVNAMES*>(hdevnames);
+    devnames->wDefault = 0;
+    devnames->wDeviceOffset = 0;
+    devnames->wDriverOffset = 0;
+    devnames->wOutputOffset = 0;*/
+
+    DEVMODE* devmode = static_cast<DEVMODE*>( hdevmode );
+    memset ( ( void * ) devmode, 0, sizeof( DEVMODE ) );
+
+    if ( printerName().length() != 0 )
+        QT_WA( wcsncpy( ( LPWSTR ) devmode->dmDeviceName, ( LPWSTR ) printerName().left( 31 ).ucs2(), 32 );,
+               strncpy( ( LPSTR ) devmode->dmDeviceName, ( LPSTR ) printerName().left( 31 ).latin1(), 32 ); )
+        else
+            devmode->dmDeviceName[ 0 ] = '\0';
+
+    devmode->dmSize = sizeof( DEVMODE );
+    /*devmode->dmSpecVersion = 0;
+    devmode->dmDriverVersion = 0;
+    devmode->dmDriverExtra = 0;*/
+
+    devmode->dmFields = DM_ORIENTATION | DM_PAPERSIZE | DM_COPIES | DM_DEFAULTSOURCE | DM_COLOR;
+    devmode->dmOrientation = orientation() == Portrait ? DMORIENT_PORTRAIT : DMORIENT_LANDSCAPE;
+
+    devmode->dmPaperLength = 0;
+    devmode->dmPaperWidth = 0;
+    switch ( pageSize() ) {
+    case Letter:
+        devmode->dmPaperSize = DMPAPER_LETTER;
+        break;
+    case Legal:
+        devmode->dmPaperSize = DMPAPER_LEGAL;
+        break;
+    case Executive:
+        devmode->dmPaperSize = DMPAPER_EXECUTIVE;
+        break;
+    case A2:
+        devmode->dmPaperSize = DMPAPER_A2;
+        break;
+    case A3:
+        devmode->dmPaperSize = DMPAPER_A3;
+        break;
+    case A4:
+        devmode->dmPaperSize = DMPAPER_A4;
+        break;
+    case A5:
+        devmode->dmPaperSize = DMPAPER_A5;
+        break;
+    case B4:
+        devmode->dmPaperSize = DMPAPER_B4;
+        break;
+    case B5:
+        devmode->dmPaperSize = DMPAPER_B5;
+        break;
+    case C5E:
+        devmode->dmPaperSize = DMPAPER_ENV_C5;
+        break;
+    case Comm10E:
+        devmode->dmPaperSize = DMPAPER_ENV_10;
+        break;
+    case DLE:
+        devmode->dmPaperSize = DMPAPER_ENV_DL;
+        break;
+    case Folio:
+        devmode->dmPaperSize = DMPAPER_FOLIO;
+        break;
+    case Ledger:
+        devmode->dmPaperSize = DMPAPER_LEDGER;
+        break;
+    case Tabloid:
+        devmode->dmPaperSize = DMPAPER_TABLOID;
+        break;
+    case Custom:
+        devmode->dmPaperSize = 0;
+        //devmode->dmPaperLength =
+        //devmode->dmPaperWidth =
+        break;
+    }
+
+    /*POINTL pointl;
+    pointl.x = 0;
+    pointl.y = 0;
+    devmode->dmPosition = pointl;*/
+
+    devmode->dmScale = 100;
+    devmode->dmCopies = numCopies();
+    switch ( paperSource() ) {
+    case OnlyOne:
+        devmode->dmDefaultSource = DMBIN_ONLYONE;
+        break;
+    case Lower:
+        devmode->dmDefaultSource = DMBIN_LOWER;
+        break;
+    case Middle:
+        devmode->dmDefaultSource = DMBIN_MIDDLE;
+        break;
+    case Manual:
+        devmode->dmDefaultSource = DMBIN_MANUAL;
+        break;
+    case Envelope:
+        devmode->dmDefaultSource = DMBIN_ENVELOPE;
+        break;
+    case EnvelopeManual:
+        devmode->dmDefaultSource = DMBIN_ENVMANUAL;
+        break;
+    case Auto:
+        devmode->dmDefaultSource = DMBIN_AUTO;
+        break;
+    case Tractor:
+        devmode->dmDefaultSource = DMBIN_TRACTOR;
+        break;
+    case SmallFormat:
+        devmode->dmDefaultSource = DMBIN_SMALLFMT;
+        break;
+    case LargeFormat:
+        devmode->dmDefaultSource = DMBIN_LARGEFMT;
+        break;
+    case LargeCapacity:
+        devmode->dmDefaultSource = DMBIN_LARGECAPACITY;
+        break;
+    case Cassette:
+        devmode->dmDefaultSource = DMBIN_CASSETTE;
+        break;
+    case FormSource:
+        devmode->dmDefaultSource = DMBIN_FORMSOURCE;
+        break;
+    }
+
+    /*
+    devmode->dmPrintQuality = DMRES_MEDIUM;
+    devmode->dmColor = colorMode() == Color ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME;
+    devmode->dmDuplex = DMDUP_SIMPLEX;
+    devmode->dmYResolution = 0;
+    devmode->dmTTOption = DMTT_BITMAP;
+    devmode->dmCollate = DMCOLLATE_FALSE;
+    qt_strncpy(devmode->dmFormName, QString("").ucs2(), 32);
+    devmode->dmLogPixels = 0;
+    devmode->dmBitsPerPel = 0;
+    devmode->dmPelsWidth = 0;
+    devmode->dmPelsHeight = 0;
+    devmode->dmDisplayFlags = 0;
+    devmode->dmDisplayFrequency = 0;
+    #if(WINVER >= 0x0400)
+     DWORD  dmICL_MMethod = DMICL_MMETHOD_NONE;
+     DWORD  dmICMIntent = DMICM_SATURATE;
+     DWORD  dmMediaType = DL_MMEDIA_STANDARD;
+     DWORD  dmDitherType = DMDITHER_NONE;
+     DWORD  dmReserved1 = 0;
+     DWORD  dmReserved2 = 0;
+     #if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
+      DWORD  dmPanningWidth = 0;
+      WORD  dmPanningHeight = 0;
+     #endif
+    #endif /* WINVER >= 0x0400 */
+
+    pd.hDevMode = hdevmode;
+    //pd.hDevNames = hdevnames;
+    pd.hDevNames = 0;
+    pd.hDC = hdc;
+    pd.Flags = PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE; //printer driver handles multipage and collation
+
+    switch ( printRange() ) {
+    case AllPages:
+        pd.Flags |= PD_ALLPAGES;
+        break;
+    case Selection:
+        pd.Flags |= PD_SELECTION;
+        break;
+    case PageRange:
+        pd.Flags |= PD_PAGENUMS;
+        break;
+    }
+
+    if ( !isOptionEnabled( PrintToFile ) )
+        pd.Flags |= PD_HIDEPRINTTOFILE | PD_DISABLEPRINTTOFILE; //?
+    if ( !isOptionEnabled( PrintSelection ) )
+        pd.Flags |= PD_NOSELECTION;
+    if ( !isOptionEnabled( PrintPageRange ) )
+        pd.Flags |= PD_NOPAGENUMS;
+    if ( outputToFile() )
+        pd.Flags |= PD_PRINTTOFILE;
+
+    pd.nFromPage = fromPage();
+    pd.nToPage = toPage();
+    pd.nMinPage = minPage();
+    pd.nMaxPage = maxPage();
+    pd.nCopies = numCopies();
+
+    if ( !PrintDlg( &pd ) ) {
+        return false;
+    }
+
+    if ( hdevmode != 0 ) {
+        setPrinterName( qt_winQString( devmode->dmDeviceName ) );
+        setPrintProgram( qt_winQString( devmode->dmDeviceName ) );
+
+        if ( devmode->dmFields & DM_ORIENTATION )
+            setOrientation( devmode->dmOrientation == DMORIENT_PORTRAIT ? Portrait : Landscape );
+        if ( devmode->dmFields & DM_PAPERSIZE )
+            switch ( devmode->dmPaperSize ) {
+            case DMPAPER_LETTER:
+                setPageSize( Letter );
+                break;
+            case DMPAPER_LEGAL:
+                setPageSize( Legal );
+                break;
+            case DMPAPER_EXECUTIVE:
+                setPageSize( Executive );
+                break;
+            case DMPAPER_A2:
+                setPageSize( A2 );
+                break;
+            case DMPAPER_A3:
+                setPageSize( A3 );
+                break;
+            case DMPAPER_A4:
+                setPageSize( A4 );
+                break;
+            case DMPAPER_A5:
+                setPageSize( A5 );
+                break;
+            case DMPAPER_B4:
+                setPageSize( B4 );
+                break;
+            case DMPAPER_B5:
+                setPageSize( B5 );
+                break;
+            case DMPAPER_ENV_C5:
+                setPageSize( C5E );
+                break;
+            case DMPAPER_ENV_10:
+                setPageSize( Comm10E );
+                break;
+            case DMPAPER_ENV_DL:
+                setPageSize( DLE );
+                break;
+            case DMPAPER_FOLIO:
+                setPageSize( Folio );
+                break;
+            case DMPAPER_LEDGER:
+                setPageSize( Ledger );
+                break;
+            case DMPAPER_TABLOID:
+                setPageSize( Tabloid );
+                break;
+            default:
+                setPageSize( Custom );
+                //devmode->dmPaperLength
+                //devmode->dmPaperWidth
+                break;
+            }
+
+        if ( devmode->dmFields & DM_COPIES )
+            setNumCopies( devmode->dmCopies );
+        if ( devmode->dmFields & DM_DEFAULTSOURCE )
+            switch ( devmode->dmDefaultSource ) {
+            case DMBIN_ONLYONE:
+                setPaperSource( OnlyOne );
+                break;
+            case DMBIN_LOWER:
+                setPaperSource( Lower );
+                break;
+            case DMBIN_MIDDLE:
+                setPaperSource( Middle );
+                break;
+            case DMBIN_MANUAL:
+                setPaperSource( Manual );
+                break;
+            case DMBIN_ENVELOPE:
+                setPaperSource( Envelope );
+                break;
+            case DMBIN_ENVMANUAL:
+                setPaperSource( EnvelopeManual );
+                break;
+            case DMBIN_AUTO:
+                setPaperSource( Auto );
+                break;
+            case DMBIN_TRACTOR:
+                setPaperSource( Tractor );
+                break;
+            case DMBIN_SMALLFMT:
+                setPaperSource( SmallFormat );
+                break;
+            case DMBIN_LARGEFMT:
+                setPaperSource( LargeFormat );
+                break;
+            case DMBIN_LARGECAPACITY:
+                setPaperSource( LargeCapacity );
+                break;
+            case DMBIN_CASSETTE:
+                setPaperSource( Cassette );
+                break;
+            case DMBIN_FORMSOURCE:
+                setPaperSource( FormSource );
+                break;
+            }
+        if ( devmode->dmFields & DM_COLOR )
+            setColorMode( devmode->dmColor == DMCOLOR_COLOR ? Color : GrayScale );
+
+        if ( devmode->dmFields & DM_YRESOLUTION )
+            res = devmode->dmYResolution;
+        //what about dmPrintQuality? It contains x resolution
+        //am I allowed to change res here? qprinter_unix.cpp does only within construtor
+    }
+
+    if ( pd.Flags & PD_ALLPAGES )
+        setPrintRange( AllPages );
+    else if ( pd.Flags & PD_SELECTION )
+        setPrintRange( Selection );
+    else if ( pd.Flags & PD_PAGENUMS )
+        setPrintRange( PageRange );
+
+    setOutputToFile( pd.Flags & PD_PRINTTOFILE );
+    setFromTo( pd.nFromPage, pd.nToPage );
+    setMinMax( pd.nMinPage, pd.nMaxPage );
+    setNumCopies( pd.nCopies );
+
+    if ( pd.hDC != 0 ) {
+        hdc = pd.hDC;
+        StartPage( hdc );
+    }
+    return true;
+}
+
+
+static const char * const psToStr[ QPrinter::NPageSize + 1 ] =
+    { "A4", "B5", "Letter", "Legal", "Executive",
+      "A0", "A1", "A2", "A3", "A5", "A6", "A7", "A8", "A9", "B0", "B1",
+      "B10", "B2", "B3", "B4", "B6", "B7", "B8", "B9", "C5E", "Comm10E",
+      "DLE", "Folio", "Ledger", "Tabloid", 0
+    };
+
+/*!
+  \internal
+  Handles painter commands to the printer.
+*/
+
+bool QPrinter::cmd( int c, QPainter *paint, QPDevCmdParam *p )
+{
+    static const uchar dense0_pat[] = {
+                                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+                                      };
+    static const uchar dense1_pat[] = {
+                                          0xff, 0xbb, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff
+                                      };
+    static const uchar dense2_pat[] = {
+                                          0x77, 0xff, 0xdd, 0xff, 0x77, 0xff, 0xdd, 0xff
+                                      };
+    static const uchar dense3_pat[] = {
+                                          0x55, 0xbb, 0x55, 0xee, 0x55, 0xbb, 0x55, 0xee
+                                      };
+    static const uchar dense4_pat[] = {
+                                          0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa
+                                      };
+    static const uchar dense5_pat[] = {
+                                          0xaa, 0x44, 0xaa, 0x11, 0xaa, 0x44, 0xaa, 0x11
+                                      };
+    static const uchar dense6_pat[] = {
+                                          0x88, 0x00, 0x22, 0x00, 0x88, 0x00, 0x22, 0x00
+                                      };
+    static const uchar dense7_pat[] = {
+                                          0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00
+                                      };
+
+    if ( hdc == 0 )
+        return false;
+
+    if ( c == PdcBegin && state == PST_IDLE ) {
+        DOCINFO di;
+        di.cbSize = sizeof( DOCINFO );
+        di.lpszDatatype = 0;
+        di.lpszDocName = doc_name.ucs2();
+        di.lpszOutput = output_filename.ucs2();
+        state = PST_ACTIVE;
+        if ( StartDoc( hdc, &di ) == SP_ERROR ) {
+            state = PST_ERROR;
+            qWarning( "Error when executing StartDoc()" );
+            return false;
+        }
+        return true;
+    }
+
+    if ( c == PdcEnd && state == PST_ACTIVE ) {
+        state = PST_IDLE;
+        if ( EndDoc( hdc ) == SP_ERROR ) {
+            state = PST_ERROR;
+            qWarning( "Error when executing EndDoc()" );
+            return false;
+        }
+        DeleteDC( hdc );
+        return true;
+    }
+
+    if ( state == PST_ACTIVE ) {
+        switch ( c ) {
+        case PdcDrawPoint:
+            return ( MoveToEx( hdc, p[ 0 ].point->x(), p[ 0 ].point->y(), 0 ) &&
+                     LineTo( hdc, p[ 0 ].point->x(), p[ 0 ].point->y() )
+                   );
+        case PdcMoveTo:
+            return MoveToEx( hdc, p[ 0 ].point->x(), p[ 0 ].point->y(), 0 );
+        case PdcLineTo:
+            return LineTo( hdc, p[ 0 ].point->x(), p[ 0 ].point->y() );
+        case PdcDrawLine:
+            return ( MoveToEx( hdc, p[ 0 ].point->x(), p[ 0 ].point->y(), 0 ) &&
+                     LineTo( hdc, p[ 1 ].point->x(), p[ 1 ].point->y() )
+                   );
+        case PdcDrawRect:
+            return ( Rectangle( hdc, p[ 0 ].rect->x(), p[ 0 ].rect->y(),
+                                p[ 0 ].rect->x() + p[ 0 ].rect->width(),
+                                p[ 0 ].rect->y() + p[ 0 ].rect->height() )
+                   );
+        case PdcDrawRoundRect:
+            return ( RoundRect ( hdc, p[ 0 ].rect->x(), p[ 0 ].rect->y(),
+                                 p[ 0 ].rect->x() + p[ 0 ].rect->width(),
+                                 p[ 0 ].rect->y() + p[ 0 ].rect->height(),
+                                 p[ 1 ].ival,
+                                 p[ 2 ].ival )
+                   );
+        case PdcDrawEllipse:
+            return ( Ellipse( hdc, p[ 0 ].rect->x(), p[ 0 ].rect->y(),
+                              p[ 0 ].rect->x() + p[ 0 ].rect->width(),
+                              p[ 0 ].rect->y() + p[ 0 ].rect->height() )
+                   );
+        case PdcDrawArc: {
+                const int inCircle = 16 * 360;
+                const double outCircle = 2 * 3.141591654;
+                const double factor = outCircle / inCircle;
+
+                const int centerx = p[ 0 ].rect->x() + p[ 0 ].rect->width() / 2;
+                const int centery = p[ 0 ].rect->y() + p[ 0 ].rect->height() / 2;
+                const int radius = 20000;
+
+                return ( Arc( hdc, p[ 0 ].rect->x(), p[ 0 ].rect->y(),
+                              p[ 0 ].rect->x() + p[ 0 ].rect->width(),
+                              p[ 0 ].rect->y() + p[ 0 ].rect->height(),
+                              centerx + radius * sin( factor * p[ 1 ].ival ),
+                              centery + radius * cos( factor * p[ 1 ].ival ),
+                              centerx + radius * sin( factor * p[ 2 ].ival ),
+                              centery + radius * cos( factor * p[ 2 ].ival ) )
+                       );
+            }
+        case PdcDrawPie: {
+                const int inCircle = 16 * 360;
+                const double outCircle = 2 * 3.141591654;
+                const double factor = outCircle / inCircle;
+
+                const int centerx = p[ 0 ].rect->x() + p[ 0 ].rect->width() / 2;
+                const int centery = p[ 0 ].rect->y() + p[ 0 ].rect->height() / 2;
+                const int radius = 20000;
+
+                return ( Pie( hdc, p[ 0 ].rect->x(), p[ 0 ].rect->y(),
+                              p[ 0 ].rect->x() + p[ 0 ].rect->width(),
+                              p[ 0 ].rect->y() + p[ 0 ].rect->height(),
+                              centerx + radius * sin( factor * p[ 1 ].ival ),
+                              centery + radius * cos( factor * p[ 1 ].ival ),
+                              centerx + radius * sin( factor * p[ 2 ].ival ),
+                              centery + radius * cos( factor * p[ 2 ].ival ) )
+                       );
+            }
+        case PdcDrawChord: {
+                const int inCircle = 16 * 360;
+                const double outCircle = 2 * 3.141591654;
+                const double factor = outCircle / inCircle;
+
+                const int centerx = p[ 0 ].rect->x() + p[ 0 ].rect->width() / 2;
+                const int centery = p[ 0 ].rect->y() + p[ 0 ].rect->height() / 2;
+                const int radius = 20000;
+
+                return ( Chord( hdc, p[ 0 ].rect->x(), p[ 0 ].rect->y(),
+                                p[ 0 ].rect->x() + p[ 0 ].rect->width(),
+                                p[ 0 ].rect->y() + p[ 0 ].rect->height(),
+                                centerx + radius * sin( factor * p[ 1 ].ival ),
+                                centery + radius * cos( factor * p[ 1 ].ival ),
+                                centerx + radius * sin( factor * p[ 2 ].ival ),
+                                centery + radius * cos( factor * p[ 2 ].ival ) )
+                       );
+            }
+        case PdcDrawLineSegments: {
+                int count = p[ 0 ].ptarr->size();
+                POINT* points = new POINT[ count ];
+                DWORD* polyPoints = new DWORD[ count / 2 ];
+
+                int i;
+                for ( i = 0; i < count; i++ ) {
+                    QPoint qp = p[ 0 ].ptarr->point( i );
+                    points[ i ].x = qp.x();
+                    points[ i ].y = qp.y();
+                }
+                for ( i = 0; i < count / 2; i++ ) {
+                    polyPoints[ i ] = 2;
+                }
+
+                int retval = PolyPolyline( hdc, points, polyPoints, count / 2 );
+                delete points;
+                return retval;
+            }
+        case PdcDrawPolyline: {
+                int count = p[ 0 ].ptarr->size();
+                POINT* points = new POINT[ count ];
+
+                for ( int i = 0; i < count; i++ ) {
+                    QPoint qp = p[ 0 ].ptarr->point( i );
+                    points[ i ].x = qp.x();
+                    points[ i ].y = qp.y();
+                }
+                int retval = Polyline( hdc, points, count );
+                delete points;
+                return retval;
+            }
+        case PdcDrawPolygon: {
+                int count = p[ 0 ].ptarr->size();
+                POINT* points = new POINT[ count ];
+
+                for ( int i = 0; i < count; i++ ) {
+                    QPoint qp = p[ 0 ].ptarr->point( i );
+                    points[ i ].x = qp.x();
+                    points[ i ].y = qp.y();
+                }
+                int retval = Polygon( hdc, points, count );
+                delete points;
+                return retval;
+            }
+        case PdcDrawCubicBezier: {
+                int count = p[ 0 ].ptarr->size();
+                POINT* points = new POINT[ count ];
+
+                for ( int i = 0; i < count; i++ ) {
+                    QPoint qp = p[ 0 ].ptarr->point( i );
+                    points[ i ].x = qp.x();
+                    points[ i ].y = qp.y();
+                }
+                int retval = PolyBezier( hdc, points, count );
+                delete points;
+                return retval;
+            }
+        case PdcDrawText2:
+            return true;
+        case PdcDrawText2Formatted:
+            return true;
+        case PdcDrawTextItem:
+            qWarning( "Drawing textItem is not supported." );
+            return false;
+        case PdcDrawPixmap:
+            return BitBlt( hdc, p[ 0 ].point->x(), p[ 0 ].point->y(), p[ 1 ].pixmap->width(), p[ 1 ].pixmap->height(),
+                           p[ 1 ].pixmap->handle(), 0, 0, SRCCOPY );
+        case PdcDrawImage: {
+                QPixmap pixmap;
+                if ( !pixmap.convertFromImage( p[ 1 ].image->copy(), 0 ) )
+                    return false;
+
+                return BitBlt( hdc, p[ 0 ].point->x(), p[ 0 ].point->y(), pixmap.width(), pixmap.height(),
+                               pixmap.handle(), 0, 0, SRCCOPY );
+            }
+        case PdcSetBkColor:
+            return ( SetBkColor( hdc, p[ 0 ].color->pixel() ) != CLR_INVALID );
+        case PdcSetBkMode:
+            if ( p[ 0 ].ival == Qt::TransparentMode )
+                return SetBkMode( hdc, TRANSPARENT );
+            else //Qt::OpaqueMode
+                return SetBkMode( hdc, OPAQUE );
+        case PdcSetROP: {
+                int dm;
+                switch ( p[ 0 ].ival ) {
+                case Qt::CopyROP:
+                    dm = R2_COPYPEN;
+                    break;
+                case Qt::OrROP:
+                    dm = R2_MERGEPEN;
+                    break;
+                case Qt::XorROP:
+                    dm = R2_XORPEN;
+                    break;
+                    //case Qt::EraseROP:
+                case Qt::NotAndROP:
+                    dm = R2_MASKNOTPEN;
+                    break;
+                case Qt::NotCopyROP:
+                    dm = R2_NOTCOPYPEN;
+                    break;
+                case Qt::NotOrROP:
+                    dm = R2_MERGENOTPEN;
+                    break;
+                case Qt::NotXorROP:
+                    dm = R2_NOTXORPEN;
+                    break;
+                    //case Qt::NotEraseROP:
+                case Qt::AndROP:
+                    dm = R2_MASKPEN;
+                    break;
+                case Qt::NotROP:
+                    dm = R2_NOTCOPYPEN;
+                    break;
+                case Qt::ClearROP:
+                    dm = R2_WHITE;
+                    break;
+                case Qt::SetROP:
+                    dm = R2_BLACK;
+                    break;
+                case Qt::NopROP:
+                    dm = R2_NOP;
+                    break;
+                case Qt::AndNotROP:
+                    dm = R2_MASKPENNOT;
+                    break;
+                case Qt::OrNotROP:
+                    dm = R2_MERGEPENNOT;
+                    break;
+                case Qt::NandROP:
+                    dm = R2_NOTMASKPEN;
+                    break;
+                case Qt::NorROP:
+                    dm = R2_NOTMERGEPEN;
+                    break;
+                }
+                return SetROP2( hdc, dm );
+            }
+        case PdcSetBrushOrigin:
+            return SetBrushOrgEx( hdc, p[ 0 ].point->x(), p[ 0 ].point->y(), 0 );
+        case PdcSetFont:
+            return SelectObject( hdc, p[ 0 ].font->handle() );
+        case PdcSetPen: {
+                int penStyle = 0;
+                switch ( p[ 0 ].pen->style() ) {
+                case Qt::NoPen:
+                    penStyle = PS_NULL;
+                    break;
+                case Qt::SolidLine:
+                    penStyle = PS_SOLID;
+                    break;
+                case Qt::DashLine:
+                    penStyle = PS_DASH;
+                    break;
+                case Qt::DotLine:
+                    penStyle = PS_DOT;
+                    break;
+                case Qt::DashDotLine:
+                    penStyle = PS_DASHDOT;
+                    break;
+                case Qt::DashDotDotLine:
+                    PS_DASHDOTDOT;
+                    break;
+                }
+                HPEN pen = CreatePen( penStyle, p[ 0 ].pen->width(), p[ 0 ].pen->color().pixel() );
+                DeleteObject( SelectObject( hdc, pen ) );
+                return pen;
+            }
+        case PdcSetBrush: {
+                HBRUSH brush;
+                switch ( p[ 0 ].brush->style() ) {
+                case Qt::NoBrush: {
+                        HBITMAP hbmp = CreateBitmap( 8, 8, 1, 1, ( LPBYTE ) dense0_pat );
+                        DeleteObject( SelectObject( hdc, hbmp ) );
+                        brush = CreatePatternBrush( hbmp );
+                    }
+                case Qt::Dense1Pattern: {
+                        HBITMAP hbmp = CreateBitmap( 8, 8, 1, 1, ( LPBYTE ) dense1_pat );
+                        DeleteObject( SelectObject( hdc, hbmp ) );
+                        brush = CreatePatternBrush( hbmp );
+                    }
+                case Qt::Dense2Pattern: {
+                        HBITMAP hbmp = CreateBitmap( 8, 8, 1, 1, ( LPBYTE ) dense2_pat );
+                        DeleteObject( SelectObject( hdc, hbmp ) );
+                        brush = CreatePatternBrush( hbmp );
+                    }
+                case Qt::Dense3Pattern: {
+                        HBITMAP hbmp = CreateBitmap( 8, 8, 1, 1, ( LPBYTE ) dense3_pat );
+                        DeleteObject( SelectObject( hdc, hbmp ) );
+                        brush = CreatePatternBrush( hbmp );
+                    }
+                case Qt::Dense4Pattern: {
+                        HBITMAP hbmp = CreateBitmap( 8, 8, 1, 1, ( LPBYTE ) dense4_pat );
+                        DeleteObject( SelectObject( hdc, hbmp ) );
+                        brush = CreatePatternBrush( hbmp );
+                    }
+                case Qt::Dense5Pattern: {
+                        HBITMAP hbmp = CreateBitmap( 8, 8, 1, 1, ( LPBYTE ) dense5_pat );
+                        DeleteObject( SelectObject( hdc, hbmp ) );
+                        brush = CreatePatternBrush( hbmp );
+                    }
+                case Qt::Dense6Pattern: {
+                        HBITMAP hbmp = CreateBitmap( 8, 8, 1, 1, ( LPBYTE ) dense6_pat );
+                        DeleteObject( SelectObject( hdc, hbmp ) );
+                        brush = CreatePatternBrush( hbmp );
+                    }
+                case Qt::Dense7Pattern: {
+                        HBITMAP hbmp = CreateBitmap( 8, 8, 1, 1, ( LPBYTE ) dense7_pat );
+                        DeleteObject( SelectObject( hdc, hbmp ) );
+                        brush = CreatePatternBrush( hbmp );
+                    }
+                case Qt::HorPattern:
+                    brush = CreateHatchBrush( HS_HORIZONTAL, p[ 0 ].brush->color().pixel() );
+                    break;
+                case Qt::VerPattern:
+                    brush = CreateHatchBrush( HS_VERTICAL, p[ 0 ].brush->color().pixel() );
+                    break;
+                case Qt::CrossPattern:
+                    brush = CreateHatchBrush( HS_CROSS, p[ 0 ].brush->color().pixel() );
+                    break;
+                case Qt::BDiagPattern:
+                    brush = CreateHatchBrush( HS_FDIAGONAL, p[ 0 ].brush->color().pixel() );
+                    break;
+                case Qt::FDiagPattern:    //really? Fwd in Qt ?= Bwd in Windows
+                    brush = CreateHatchBrush( HS_BDIAGONAL, p[ 0 ].brush->color().pixel() );
+                    break;
+                case Qt::DiagCrossPattern:    //really? Bwd in Qt ?= Fwd in Windows
+                    brush = CreateHatchBrush( HS_DIAGCROSS, p[ 0 ].brush->color().pixel() );
+                    break;
+                case Qt::CustomPattern:
+                    brush = CreatePatternBrush( p[ 0 ].brush->pixmap() ->hbm() );
+                    break;
+                }
+                DeleteObject( SelectObject( hdc, brush ) );
+                return true;
+            }
+        case PdcSetTabStops:
+        case PdcSetTabArray:
+            return true;
+        case PdcSetUnit:
+            return true;
+        case PdcSetVXform:
+        case PdcSetWindow:
+        case PdcSetViewport:
+        case PdcSetWXform:
+        case PdcSetWMatrix:
+        case PdcRestoreWMatrix:
+            return true;
+        case PdcSetClip:
+            return true;
+        case PdcSetClipRegion:
+            return true;
+        }
+    }
+    return true;
+}
+
+#define L_MM(n) int((n * 720 + 127) / 254)
+#define L_IN(n) int(n * 72)
+
+struct PaperSize
+{
+    int width, height;
+};
+
+static const PaperSize paperSizes[ QPrinter::NPageSize ] =
+    {
+        {
+            L_MM( 210 ), L_MM( 297 )
+        }
+        ,           // A4
+        { L_MM( 176 ), L_MM( 250 ) },           // B5
+        { L_IN( 8.5 ), L_IN( 11 ) },            // Letter
+        { L_IN( 8.5 ), L_IN( 14 ) },            // Legal
+        { L_IN( 7.5 ), L_IN( 10 ) },            // Executive
+        { L_MM( 841 ), L_MM( 1189 ) },          // A0
+        { L_MM( 594 ), L_MM( 841 ) },           // A1
+        { L_MM( 420 ), L_MM( 594 ) },           // A2
+        { L_MM( 297 ), L_MM( 420 ) },           // A3
+        { L_MM( 148 ), L_MM( 210 ) },           // A5
+        { L_MM( 105 ), L_MM( 148 ) },           // A6
+        { L_MM( 74 ), L_MM( 105 ) },             // A7
+        { L_MM( 52 ), L_MM( 74 ) },             // A8
+        { L_MM( 37 ), L_MM( 52 ) },             // A9
+        { L_MM( 1000 ), L_MM( 1414 ) },         // B0
+        { L_MM( 707 ), L_MM( 1000 ) },          // B1
+        { L_MM( 31 ), L_MM( 44 ) },             // B10
+        { L_MM( 500 ), L_MM( 707 ) },           // B2
+        { L_MM( 353 ), L_MM( 500 ) },           // B3
+        { L_MM( 250 ), L_MM( 353 ) },           // B4
+        { L_MM( 125 ), L_MM( 176 ) },           // B6
+        { L_MM( 88 ), L_MM( 125 ) },            // B7
+        { L_MM( 62 ), L_MM( 88 ) },             // B8
+        { L_MM( 44 ), L_MM( 62 ) },             // B9
+        { L_MM( 162 ), L_MM( 229 ) },        // C5E
+        { L_IN( 4.125 ), L_IN( 9.5 ) },        // Comm10E
+        { L_MM( 110 ), L_MM( 220 ) },        // DLE
+        { L_IN( 8.5 ), L_IN( 13 ) },         // Folio
+        { L_IN( 17 ), L_IN( 11 ) },         // Ledger
+        { L_IN( 11 ), L_IN( 17 ) }     // Tabloid
+    };
+
+
+/*!
+  Internal implementation of the virtual QPaintDevice::metric() function.
+
+  Use the QPaintDeviceMetrics class instead.
+
+  \internal
+  Hard coded return values for PostScript under X.
+*/
+
+int QPrinter::metric( int m ) const
+{
+    int val;
+    PageSize s = pageSize();
+
+    switch ( m ) {
+    case QPaintDeviceMetrics::PdmWidth:
+        val = ( orient == Portrait ) ? paperSizes[ s ].width : paperSizes[ s ].height;
+        if ( res != 72 )
+            val = ( val * res + 36 ) / 72;
+        if ( !fullPage() ) {
+            if ( D->marginsSpecified )
+                val -= D->leftMargin + D->rightMargin;
+            else
+                val -= 2 * margins().width();
+        }
+        break;
+    case QPaintDeviceMetrics::PdmHeight:
+        val = orient == Portrait ? paperSizes[ s ].height : paperSizes[ s ].width;
+        if ( res != 72 )
+            val = ( val * res + 36 ) / 72;
+        if ( !fullPage() ) {
+            if ( D->marginsSpecified )
+                val -= D->topMargin + D->bottomMargin;
+            else
+                val -= 2 * margins().height();
+        }
+        break;
+    case QPaintDeviceMetrics::PdmDpiX:
+        val = res;
+        break;
+    case QPaintDeviceMetrics::PdmDpiY:
+        val = res;
+        break;
+    case QPaintDeviceMetrics::PdmPhysicalDpiX:
+    case QPaintDeviceMetrics::PdmPhysicalDpiY:
+        val = 72;
+        break;
+    case QPaintDeviceMetrics::PdmWidthMM:
+        // double rounding error here.  hooray.
+        val = metric( QPaintDeviceMetrics::PdmWidth );
+        val = ( val * 254 + 5 * res ) / ( 10 * res );
+        break;
+    case QPaintDeviceMetrics::PdmHeightMM:
+        val = metric( QPaintDeviceMetrics::PdmHeight );
+        val = ( val * 254 + 5 * res ) / ( 10 * res );
+        break;
+    case QPaintDeviceMetrics::PdmNumColors:
+        val = 16777216;
+        break;
+    case QPaintDeviceMetrics::PdmDepth:
+        val = 24;
+        break;
+    default:
+        val = 0;
+    }
+    return val;
+}
+
+
+/*!
+    Returns the width of the left margin and the height of the top
+    margin of the printer. On Unix, this is a best-effort guess, not
+    based on perfect knowledge.
+
+    If you have called setFullPage( TRUE ), margins().width() may be
+    treated as the smallest sane left margin you can use, and
+    margins().height() as the smallest sane top margin you can
+    use.
+
+    If you have called setFullPage( FALSE ) (this is the default),
+    margins() is automatically subtracted from the pageSize() by
+    QPrinter.
+
+    \sa setFullPage() QPaintDeviceMetrics PageSize
+*/
+QSize QPrinter::margins() const
+{
+    if ( d )
+        return QSize( d->leftMargin, d->topMargin );
+
+    if ( orient == Portrait )
+        return QSize( res / 2, res / 3 );
+
+    return QSize( res / 3, res / 2 );
+}
+
+/*!
+    \overload
+
+    Sets \a top, \a left, \a bottom and \a right to the margins of the
+    printer.  On Unix, this is a best-effort guess, not based on
+    perfect knowledge.
+
+    If you have called setFullPage( TRUE ), the four values specify
+    the smallest sane margins you can use.
+
+    If you have called setFullPage( FALSE ) (this is the default),
+    the margins are automatically subtracted from the pageSize() by
+    QPrinter.
+
+    \sa setFullPage() QPaintDeviceMetrics PageSize
+*/
+void QPrinter::margins( uint *top, uint *left, uint *bottom, uint *right ) const
+{
+    if ( !d ) {
+        int x = orient == Portrait ? res / 2 : res / 3;
+        int y = orient == Portrait ? res / 3 : res / 2;
+        *top = *bottom = y;
+        *left = *right = x;
+    } else {
+        *top = d->topMargin;
+        *left = d->leftMargin;
+        *bottom = d->bottomMargin;
+        *right = d->rightMargin;
+    }
+}
+
+/*!
+  Sets the printer margins to the sizes specified in \a top, \a left,
+  \a bottom and \a right.
+
+  This function currently only has an effect on Unix systems.
+
+  \sa margins()
+*/
+void QPrinter::setMargins( uint top, uint left, uint bottom, uint right )
+{
+    if ( !d )
+        d = new QPrinterPrivate;
+    d->marginsSpecified = true;
+    d->topMargin = top;
+    d->leftMargin = left;
+    d->bottomMargin = bottom;
+    d->rightMargin = right;
+}
+
+void QPrinter::reinit( void )
+{
+    GlobalFree( hdevmode );
+    GlobalFree( hdevnames );
+    hdevmode = GlobalAlloc( GHND, sizeof( DEVMODE ) );
+    hdevnames = GlobalAlloc( GHND, sizeof( DEVNAMES ) );
+}
+
+void QPrinter::setActive( void )
+{
+    state = PST_ACTIVE;
+}
+
+void QPrinter::setIdle( void )
+{
+    state = PST_IDLE;
+}
+
+/*!
+  Windows only, using this function is not portable! Sets the windows page size
+  value that is used by the DEVMODE struct. The winPageSize value must be one of
+  the DMPAPER_ defines from wingdi.h.
+*/
+void QPrinter::setWinPageSize( short winPageSize )
+{
+    PDEVMODE dev = ( PDEVMODE ) hdevmode;
+    if ( dev != 0 )
+        dev->dmPaperSize = winPageSize;
+}
+
+/*!
+  Returns the Windows page size value as used by the DEVMODE struct
+  (Windows only). Using this function is not portable.
+
+  Use pageSize() to get the PageSize, e.g. 'A4', 'Letter', etc.
+*/
+short QPrinter::winPageSize() const
+{
+    PDEVMODE dev = ( PDEVMODE ) hdevmode;
+    if ( dev == 0 )
+        return 0;
+    return dev->dmPaperSize;
+}
+
+#endif


More information about the kde-cygwin mailing list