summaryrefslogtreecommitdiffstats
path: root/tqtinterface/qt4/src/kernel/tqpaintdevice_x11.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tqtinterface/qt4/src/kernel/tqpaintdevice_x11.cpp')
-rw-r--r--tqtinterface/qt4/src/kernel/tqpaintdevice_x11.cpp1751
1 files changed, 0 insertions, 1751 deletions
diff --git a/tqtinterface/qt4/src/kernel/tqpaintdevice_x11.cpp b/tqtinterface/qt4/src/kernel/tqpaintdevice_x11.cpp
deleted file mode 100644
index de0695f..0000000
--- a/tqtinterface/qt4/src/kernel/tqpaintdevice_x11.cpp
+++ /dev/null
@@ -1,1751 +0,0 @@
-/****************************************************************************
-**
-** Implementation of TQPaintDevice class for X11
-**
-** Created : 940721
-**
-** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA.
-**
-** This file is part of the kernel module of the TQt GUI Toolkit.
-**
-** This file may be used under the terms of the GNU General
-** Public License versions 2.0 or 3.0 as published by the Free
-** Software Foundation and appearing in the files LICENSE.GPL2
-** and LICENSE.GPL3 included in the packaging of this file.
-** Alternatively you may (at your option) use any later version
-** of the GNU General Public License if such license has been
-** publicly approved by Trolltech ASA (or its successors, if any)
-** and the KDE Free TQt Foundation.
-**
-** Please review the following information to ensure GNU General
-** Public Licensing requirements will be met:
-** http://trolltech.com/products/qt/licenses/licensing/opensource/.
-** If you are unsure which license is appropriate for your use, please
-** review the following information:
-** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
-** or contact the sales department at sales@trolltech.com.
-**
-** This file may be used under the terms of the Q Public License as
-** defined by Trolltech ASA and appearing in the file LICENSE.TQPL
-** included in the packaging of this file. Licensees holding valid TQt
-** Commercial licenses may use this file in accordance with the TQt
-** Commercial License Agreement provided with the Software.
-**
-** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
-** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
-** herein.
-**
-**********************************************************************/
-
-#include "tqpaintdevice.h"
-#include "tqpaintdevicemetrics.h"
-#include "tqpainter.h"
-#include "tqwidget.h"
-#include "tqbitmap.h"
-#include "tqapplication.h"
-#include "tqt_x11_p.h"
-
-#ifdef USE_QT4
-
-//
-// Some global variables - these are initialized by TQColor::initialize()
-//
-
-Display *TQPaintDevice::x_appdisplay = 0;
-int TQPaintDevice::x_appscreen;
-
-int TQPaintDevice::x_appdepth;
-int TQPaintDevice::x_appcells;
-TQt::HANDLE TQPaintDevice::x_approotwindow;
-TQt::HANDLE TQPaintDevice::x_appcolormap;
-bool TQPaintDevice::x_appdefcolormap;
-void *TQPaintDevice::x_appvisual;
-bool TQPaintDevice::x_appdefvisual;
-
-// ### in 4.0, remove the above, and use the below
-int *TQPaintDevice::x_appdepth_arr;
-int *TQPaintDevice::x_appcells_arr;
-TQt::HANDLE *TQPaintDevice::x_approotwindow_arr;
-TQt::HANDLE *TQPaintDevice::x_appcolormap_arr;
-bool *TQPaintDevice::x_appdefcolormap_arr;
-void **TQPaintDevice::x_appvisual_arr;
-bool *TQPaintDevice::x_appdefvisual_arr;
-
-/*!
- Constructs a paint tqdevice with internal flags \a devflags. This
- constructor can be invoked only from TQPaintDevice subclasses.
-*/
-
-TQPaintDevice::TQPaintDevice( uint devflags )
-{
- if ( !tqApp ) { // global constructor
-#if defined(TQT_CHECK_STATE)
- qFatal( "TQPaintDevice: Must construct a TQApplication before a "
- "TQPaintDevice" );
-#endif
- return;
- }
-
- // [FIXME]
- printf("[WARNING] TQPaintDevice::TQPaintDevice( uint devflags ) unimplemented\n\r");
-// devFlags = devflags;
-// painters = 0;
-// hd = 0;
-// rendhd = 0;
-// x11Data = 0;
-}
-
-/*!
- Returns the window system handle of the paint tqdevice, for
- low-level access. Using this function is not portable.
-
- The HANDLE type varies with platform; see \c tqpaintdevice.h and
- \c tqwindowdefs.h for details.
-
- \sa x11Display()
-*/
-TQt::HANDLE TQPaintDevice::handle() const
-{
-// return hd;
-
- // [FIXME]
- printf("[WARNING] TQPaintDevice::handle() const unimplemented\n\r");
- return 0;
-}
-
-/*!
- Returns the window system handle of the paint tqdevice for XRender
- support. Use of this function is not portable. This function will
- return 0 if XRender support is not compiled into TQt, if the
- XRender extension is not supported on the X11 display, or if the
- handle could not be created.
-*/
-TQt::HANDLE TQPaintDevice::x11RenderHandle() const
-{
-// #ifndef TQT_NO_XFTFREETYPE
-// return rendhd ? XftDrawPicture( (XftDraw *) rendhd ) : 0;
-// #else
-// return 0;
-// #endif // TQT_NO_XFTFREETYPE
-
- // [FIXME]
- printf("[WARNING] TQPaintDevice::x11RenderHandle() const unimplemented\n\r");
- return 0;
-}
-
-/*!
- \relates QPaintDevice
-
- Returns the QX11Info structure for the \a pd paint device. 0 is
- returned if it can't be obtained.
-*/
-const Q_GUI_EXPORT QX11Info *qt_x11Info(const QPaintDevice *pd)
-{
- if (!pd) return 0;
- if (pd->devType() == QInternal::Widget)
- return &static_cast<const QWidget *>(pd)->x11Info();
- else if (pd->devType() == QInternal::Pixmap)
- return &static_cast<const QPixmap *>(pd)->x11Info();
- return 0;
-}
-
-Display *TQPaintDevice::x11Display() const
-{
- const QX11Info *info = qt_x11Info(this);
- if (info)
- return info->display();
- return QX11Info::display();
-}
-
-int TQPaintDevice::x11Screen() const
-{
- const QX11Info *info = qt_x11Info(this);
- if (info)
- return info->screen();
- return QX11Info::appScreen();
-}
-
-void *TQPaintDevice::x11Visual() const
-{
- const QX11Info *info = qt_x11Info(this);
- if (info)
- return info->visual();
- return QX11Info::appVisual();
-}
-
-int TQPaintDevice::x11Depth() const
-{
- const QX11Info *info = qt_x11Info(this);
- if (info)
- return info->depth();
- return QX11Info::appDepth();
-}
-
-int TQPaintDevice::x11Cells() const
-{
- const QX11Info *info = qt_x11Info(this);
- if (info)
- return info->cells();
- return QX11Info::appCells();
-}
-
-Qt::HANDLE TQPaintDevice::x11Colormap() const
-{
- const QX11Info *info = qt_x11Info(this);
- if (info)
- return info->colormap();
- return QX11Info::appColormap();
-}
-
-bool TQPaintDevice::x11DefaultColormap() const
-{
- const QX11Info *info = qt_x11Info(this);
- if (info)
- return info->defaultColormap();
- return QX11Info::appDefaultColormap();
-}
-
-bool TQPaintDevice::x11DefaultVisual() const
-{
- const QX11Info *info = qt_x11Info(this);
- if (info)
- return info->defaultVisual();
- return QX11Info::appDefaultVisual();
-}
-
-void TQPaintDevice::x11SetAppDpiX(int dpi, int screen)
-{
- QX11Info::setAppDpiX(dpi, screen);
-}
-
-void TQPaintDevice::x11SetAppDpiY(int dpi, int screen)
-{
- QX11Info::setAppDpiY(dpi, screen);
-}
-
-int TQPaintDevice::x11AppDpiX(int screen)
-{
- return QX11Info::appDpiX(screen);
-}
-
-int TQPaintDevice::x11AppDpiY(int screen)
-{
- return QX11Info::appDpiY(screen);
-}
-
-/*!
- \relates TQPaintDevice
-
- Copies a block of pixels from \a src to \a dst, perhaps merging
- each pixel according to the \link TQt::RasterOp raster operation \endlink
- \a rop. \a sx, \a sy
- is the top-left pixel in \a src (0, 0) by default, \a dx, \a dy is
- the top-left position in \a dst and \a sw, \a sh is the size of
- the copied block (all of \a src by default).
-
- The most common values for \a rop are CopyROP and XorROP; the \l
- TQt::RasterOp documentation defines all the possible values.
-
- If \a ignoreMask is FALSE (the default) and \a src is a
- masked TQPixmap, the entire blit is masked by \a{src}->mask().
-
- If \a src, \a dst, \a sw or \a sh is 0, bitBlt() does nothing. If
- \a sw or \a sh is negative bitBlt() copies starting at \a sx (and
- respectively, \a sy) and ending at the right end (respectively,
- bottom) of \a src.
-
- \a src must be a TQWidget or TQPixmap. You cannot blit from a
- TQPrinter, for example. bitBlt() does nothing if you attempt to
- blit from an unsupported tqdevice.
-
- bitBlt() does nothing if \a src has a greater depth than \e dst.
- If you need to for example, draw a 24-bit pixmap on an 8-bit
- widget, you must use drawPixmap().
-*/
-
-void bitBlt( TQPaintDevice *dst, int dx, int dy,
- const TQPaintDevice *src, int sx, int sy, int sw, int sh,
- TQt::RasterOp rop, bool ignoreMask )
-{
-// [FIXME] Implement this for Qt4!
-printf("[WARNING] bitBlt( TQPaintDevice *dst, int dx, int dy, const TQPaintDevice *src, int sx, int sy, int sw, int sh, TQt::RasterOp rop, bool ignoreMask ) unimplemented\n\r");
-
-// if ( !src || !dst ) {
-// #if defined(TQT_CHECK_NULL)
-// TQ_ASSERT( src != 0 );
-// TQ_ASSERT( dst != 0 );
-// #endif
-// return;
-// }
-// if ( !src->handle() || src->isExtDev() )
-// return;
-//
-// TQPaintDevice *pdev = TQPainter::redirect( dst );
-// if ( pdev )
-// dst = pdev;
-//
-// int ts = src->devType(); // from tqdevice type
-// int td = dst->devType(); // to tqdevice type
-// Display *dpy = src->x11Display();
-//
-// if ( sw <= 0 ) { // special width
-// if ( sw < 0 )
-// sw = src->metric( TQPaintDeviceMetrics::PdmWidth ) - sx;
-// else
-// return;
-// }
-// if ( sh <= 0 ) { // special height
-// if ( sh < 0 )
-// sh = src->metric( TQPaintDeviceMetrics::PdmHeight ) - sy;
-// else
-// return;
-// }
-//
-// if ( dst->paintingActive() && dst->isExtDev() ) {
-// TQPixmap *pm; // output to picture/printer
-// bool tmp_pm = TRUE;
-// if ( ts == TQInternal::Pixmap ) {
-// pm = (TQPixmap*)src;
-// if ( sx != 0 || sy != 0 ||
-// sw != pm->width() || sh != pm->height() || ignoreMask ) {
-// TQPixmap *tmp = new TQPixmap( sw, sh, pm->depth() );
-// bitBlt( tmp, 0, 0, pm, sx, sy, sw, sh, TQt::CopyROP, TRUE );
-// if ( pm->mask() && !ignoreMask ) {
-// TQBitmap mask( sw, sh );
-// bitBlt( &mask, 0, 0, pm->mask(), sx, sy, sw, sh,
-// TQt::CopyROP, TRUE );
-// tmp->setMask( mask );
-// }
-// pm = tmp;
-// } else {
-// tmp_pm = FALSE;
-// }
-// } else if ( ts == TQInternal::Widget ) {// bitBlt to temp pixmap
-// pm = new TQPixmap( sw, sh );
-// TQ_CHECK_PTR( pm );
-// bitBlt( pm, 0, 0, src, sx, sy, sw, sh );
-// } else {
-// #if defined(TQT_CHECK_RANGE)
-// qWarning( "bitBlt: Cannot bitBlt from tqdevice" );
-// #endif
-// return;
-// }
-// TQPDevCmdParam param[3];
-// TQRect r(dx, dy, pm->width(), pm->height());
-// param[0].rect = &r;
-// param[1].pixmap = pm;
-// dst->cmd( TQPaintDevice::PdcDrawPixmap, 0, param );
-// if ( tmp_pm )
-// delete pm;
-// return;
-// }
-//
-// switch ( ts ) {
-// case TQInternal::Widget:
-// case TQInternal::Pixmap:
-// case TQInternal::System: // OK, can blt from these
-// break;
-// default:
-// #if defined(TQT_CHECK_RANGE)
-// qWarning( "bitBlt: Cannot bitBlt from tqdevice type %x", ts );
-// #endif
-// return;
-// }
-// switch ( td ) {
-// case TQInternal::Widget:
-// case TQInternal::Pixmap:
-// case TQInternal::System: // OK, can blt to these
-// break;
-// default:
-// #if defined(TQT_CHECK_RANGE)
-// qWarning( "bitBlt: Cannot bitBlt to tqdevice type %x", td );
-// #endif
-// return;
-// }
-//
-// static const short ropCodes[] = { // ROP translation table
-// GXcopy, GXor, GXxor, GXandInverted,
-// GXcopyInverted, GXorInverted, GXequiv, GXand,
-// GXinvert, GXclear, GXset, GXnoop,
-// GXandReverse, GXorReverse, GXnand, GXnor
-// };
-// if ( rop > TQt::LastROP ) {
-// #if defined(TQT_CHECK_RANGE)
-// qWarning( "bitBlt: Invalid ROP code" );
-// #endif
-// return;
-// }
-//
-// if ( dst->handle() == 0 ) {
-// #if defined(TQT_CHECK_NULL)
-// qWarning( "bitBlt: Cannot bitBlt to tqdevice" );
-// #endif
-// return;
-// }
-//
-// bool mono_src;
-// bool mono_dst;
-// bool include_inferiors = FALSE;
-// bool graphics_exposure = FALSE;
-// TQPixmap *src_pm;
-// TQBitmap *mask;
-//
-// if ( ts == TQInternal::Pixmap ) {
-// src_pm = (TQPixmap*)src;
-// if ( src_pm->x11Screen() != dst->x11Screen() )
-// src_pm->x11SetScreen( dst->x11Screen() );
-// mono_src = src_pm->depth() == 1;
-// mask = ignoreMask ? 0 : src_pm->data->mask;
-// } else {
-// src_pm = 0;
-// mono_src = FALSE;
-// mask = 0;
-// include_inferiors = ((TQWidget*)src)->testWFlags(TQt::WPaintUnclipped);
-// graphics_exposure = td == TQInternal::Widget;
-// }
-// if ( td == TQInternal::Pixmap ) {
-// if ( dst->x11Screen() != src->x11Screen() )
-// ((TQPixmap*)dst)->x11SetScreen( src->x11Screen() );
-// mono_dst = ((TQPixmap*)dst)->depth() == 1;
-// ((TQPixmap*)dst)->detach(); // changes shared pixmap
-// } else {
-// mono_dst = FALSE;
-// include_inferiors = include_inferiors ||
-// ((TQWidget*)dst)->testWFlags(TQt::WPaintUnclipped);
-// }
-//
-// if ( mono_dst && !mono_src ) { // dest is 1-bit pixmap, source is not
-// #if defined(TQT_CHECK_RANGE)
-// qWarning( "bitBlt: Incompatible destination pixmap" );
-// #endif
-// return;
-// }
-//
-// #ifndef TQT_NO_XRENDER
-// if (src_pm && !mono_src && src_pm->data->alphapm && !ignoreMask ) {
-// // use RENDER to do the blit
-// TQPixmap *alpha = src_pm->data->alphapm;
-// if (src->x11RenderHandle() &&
-// alpha->x11RenderHandle() &&
-// dst->x11RenderHandle()) {
-// XRenderPictureAttributes pattr;
-// ulong picmask = 0;
-// if (include_inferiors) {
-// pattr.subwindow_mode = IncludeInferiors;
-// picmask |= CPSubwindowMode;
-// }
-// if (graphics_exposure) {
-// pattr.graphics_exposures = TRUE;
-// picmask |= CPGraphicsExposure;
-// }
-// if (picmask)
-// XRenderChangePicture(dpy, dst->x11RenderHandle(), picmask, &pattr);
-// XRenderComposite(dpy, PictOpOver, src->x11RenderHandle(),
-// alpha->x11RenderHandle(), dst->x11RenderHandle(),
-// sx, sy, sx, sy, dx, dy, sw, sh);
-// // restore attributes
-// pattr.subwindow_mode = ClipByChildren;
-// pattr.graphics_exposures = FALSE;
-// if (picmask)
-// XRenderChangePicture(dpy, dst->x11RenderHandle(), picmask, &pattr);
-// return;
-// }
-// }
-// #endif
-//
-// GC gc;
-//
-// if ( mask && !mono_src ) { // fast masked blt
-// bool temp_gc = FALSE;
-// if ( mask->data->maskgc ) {
-// gc = (GC)mask->data->maskgc; // we have a premade mask GC
-// } else {
-// if ( FALSE && src_pm->optimization() == TQPixmap::NormalOptim ) { // #### cache disabled
-// // Compete for the global cache
-// gc = cache_mask_gc( dpy, dst->handle(),
-// mask->data->ser_no,
-// mask->handle() );
-// } else {
-// // Create a new mask GC. If BestOptim, we store the mask GC
-// // with the mask (not at the pixmap). This way, many pixmaps
-// // which have a common mask will be optimized at no extra cost.
-// gc = XCreateGC( dpy, dst->handle(), 0, 0 );
-// XSetGraphicsExposures( dpy, gc, False );
-// XSetClipMask( dpy, gc, mask->handle() );
-// if ( src_pm->optimization() == TQPixmap::BestOptim ) {
-// mask->data->maskgc = gc;
-// } else {
-// temp_gc = TRUE;
-// }
-// }
-// }
-// XSetClipOrigin( dpy, gc, dx-sx, dy-sy );
-// if ( rop != TQt::CopyROP ) // use non-default ROP code
-// XSetFunction( dpy, gc, ropCodes[rop] );
-// if ( include_inferiors ) {
-// XSetSubwindowMode( dpy, gc, IncludeInferiors );
-// XCopyArea( dpy, src->handle(), dst->handle(), gc, sx, sy, sw, sh,
-// dx, dy );
-// XSetSubwindowMode( dpy, gc, ClipByChildren );
-// } else {
-// XCopyArea( dpy, src->handle(), dst->handle(), gc, sx, sy, sw, sh,
-// dx, dy );
-// }
-//
-// if ( temp_gc ) // delete temporary GC
-// XFreeGC( dpy, gc );
-// else if ( rop != TQt::CopyROP ) // restore ROP
-// XSetFunction( dpy, gc, GXcopy );
-// return;
-// }
-//
-// gc = qt_xget_temp_gc( dst->x11Screen(), mono_dst ); // get a reusable GC
-//
-// if ( rop != TQt::CopyROP ) // use non-default ROP code
-// XSetFunction( dpy, gc, ropCodes[rop] );
-//
-// if ( mono_src && mono_dst && src == dst ) { // dst and src are the same bitmap
-// XCopyArea( dpy, src->handle(), dst->handle(), gc, sx, sy, sw, sh, dx, dy );
-// } else if ( mono_src ) { // src is bitmap
-// XGCValues gcvals;
-// ulong valmask = GCBackground | GCForeground | GCFillStyle |
-// GCStipple | GCTileStipXOrigin | GCTileStipYOrigin;
-// if ( td == TQInternal::Widget ) { // set GC colors
-// TQWidget *w = (TQWidget *)dst;
-// gcvals.background = w->backgroundColor().pixel( dst->x11Screen() );
-// gcvals.foreground = w->foregroundColor().pixel( dst->x11Screen() );
-// if ( include_inferiors ) {
-// valmask |= GCSubwindowMode;
-// gcvals.subwindow_mode = IncludeInferiors;
-// }
-// } else if ( mono_dst ) {
-// gcvals.background = 0;
-// gcvals.foreground = 1;
-// } else {
-// gcvals.background = TQt::white.pixel( dst->x11Screen() );
-// gcvals.foreground = TQt::black.pixel( dst->x11Screen() );
-// }
-//
-// gcvals.fill_style = FillOpaqueStippled;
-// gcvals.stipple = src->handle();
-// gcvals.ts_x_origin = dx - sx;
-// gcvals.ts_y_origin = dy - sy;
-//
-// bool clipmask = FALSE;
-// if ( mask ) {
-// if ( ((TQPixmap*)src)->data->selfmask ) {
-// gcvals.fill_style = FillStippled;
-// } else {
-// XSetClipMask( dpy, gc, mask->handle() );
-// XSetClipOrigin( dpy, gc, dx-sx, dy-sy );
-// clipmask = TRUE;
-// }
-// }
-//
-// XChangeGC( dpy, gc, valmask, &gcvals );
-// XFillRectangle( dpy,dst->handle(), gc, dx, dy, sw, sh );
-//
-// valmask = GCFillStyle | GCTileStipXOrigin | GCTileStipYOrigin;
-// gcvals.fill_style = FillSolid;
-// gcvals.ts_x_origin = 0;
-// gcvals.ts_y_origin = 0;
-// if ( include_inferiors ) {
-// valmask |= GCSubwindowMode;
-// gcvals.subwindow_mode = ClipByChildren;
-// }
-// XChangeGC( dpy, gc, valmask, &gcvals );
-//
-// if ( clipmask ) {
-// XSetClipOrigin( dpy, gc, 0, 0 );
-// XSetClipMask( dpy, gc, None );
-// }
-//
-// } else { // src is pixmap/widget
-//
-// if ( graphics_exposure ) // widget to widget
-// XSetGraphicsExposures( dpy, gc, True );
-// if ( include_inferiors ) {
-// XSetSubwindowMode( dpy, gc, IncludeInferiors );
-// XCopyArea( dpy, src->handle(), dst->handle(), gc, sx, sy, sw, sh,
-// dx, dy );
-// XSetSubwindowMode( dpy, gc, ClipByChildren );
-// } else {
-// XCopyArea( dpy, src->handle(), dst->handle(), gc, sx, sy, sw, sh,
-// dx, dy );
-// }
-// if ( graphics_exposure ) // reset graphics exposure
-// XSetGraphicsExposures( dpy, gc, False );
-// }
-//
-// if ( rop != TQt::CopyROP ) // restore ROP
-// XSetFunction( dpy, gc, GXcopy );
-}
-
-/*!
- Internal virtual function that interprets drawing commands from
- the painter.
-
- Implemented by subclasses that have no direct support for drawing
- graphics (external paint tqdevices, for example, TQPicture).
-*/
-
-bool TQPaintDevice::cmd( int, TQPainter *, TQPDevCmdParam * )
-{
-#if defined(TQT_CHECK_STATE)
- qWarning( "TQPaintDevice::cmd: Device has no command interface" );
-#endif
- return FALSE;
-}
-
-// Reimplemented QPaintEngine methods
-// These need to call their equivalent Qt3 cmd methods
-bool TQPaintDeviceEngineTranslator::begin(QPaintDevice* qpd) {
- printf("[WARNING] TQPaintDeviceEngineTranslator::begin() unimplemented\n\r");
-}
-
-bool TQPaintDeviceEngineTranslator::end() {
- printf("[WARNING] TQPaintDeviceEngineTranslator::end() unimplemented\n\r");
-}
-
-void TQPaintDeviceEngineTranslator::updateState(const QPaintEngineState& qpes) {
- printf("[WARNING] TQPaintDeviceEngineTranslator::updateState() unimplemented\n\r");
-}
-
-void TQPaintDeviceEngineTranslator::drawPixmap(const QRectF& rect1, const QPixmap& pixmap, const QRectF& rect2) {
- printf("[WARNING] TQPaintDeviceEngineTranslator::drawPixmap() unimplemented\n\r");
-}
-
-QPaintEngine::Type TQPaintDeviceEngineTranslator::type() const {
- printf("[WARNING] TQPaintDeviceEngineTranslator::type() unimplemented\n\r");
- return QPaintEngine::X11;
-}
-
-#else // USE_QT4
-
-/*!
- \class TQPaintDevice tqpaintdevice.h
- \brief The TQPaintDevice class is the base class of objects that
- can be painted.
-
- \ingroup graphics
- \ingroup images
-
- A paint tqdevice is an abstraction of a two-dimensional space that
- can be drawn using a TQPainter. The drawing capabilities are
- implemented by the subclasses TQWidget, TQPixmap, TQPicture and
- TQPrinter.
-
- The default coordinate system of a paint tqdevice has its origin
- located at the top-left position. X increases to the right and Y
- increases downward. The unit is one pixel. There are several ways
- to set up a user-defined coordinate system using the painter, for
- example, using TQPainter::setWorldMatrix().
-
- Example (draw on a paint tqdevice):
- \code
- void MyWidget::paintEvent( TQPaintEvent * )
- {
- TQPainter p; // our painter
- p.begin( this ); // start painting the widget
- p.setPen( red ); // red outline
- p.setBrush( yellow ); // yellow fill
- p.drawEllipse( 10, 20, 100,100 ); // 100x100 ellipse at position (10, 20)
- p.end(); // painting done
- }
- \endcode
-
- The bit block transfer is an extremely useful operation for
- copying pixels from one paint tqdevice to another (or to itself). It
- is implemented as the global function bitBlt().
-
- Example (scroll widget contents 10 pixels to the right):
- \code
- bitBlt( myWidget, 10, 0, myWidget );
- \endcode
-
- \warning TQt requires that a TQApplication object exists before
- any paint tqdevices can be created. Paint tqdevices access window
- system resources, and these resources are not initialized before
- an application object is created.
-*/
-
-
-//
-// Some global variables - these are initialized by TQColor::initialize()
-//
-
-Display *TQPaintDevice::x_appdisplay = 0;
-int TQPaintDevice::x_appscreen;
-
-int TQPaintDevice::x_appdepth;
-int TQPaintDevice::x_appcells;
-TQt::HANDLE TQPaintDevice::x_approotwindow;
-TQt::HANDLE TQPaintDevice::x_appcolormap;
-bool TQPaintDevice::x_appdefcolormap;
-void *TQPaintDevice::x_appvisual;
-bool TQPaintDevice::x_appdefvisual;
-
-// ### in 4.0, remove the above, and use the below
-int *TQPaintDevice::x_appdepth_arr;
-int *TQPaintDevice::x_appcells_arr;
-TQt::HANDLE *TQPaintDevice::x_approotwindow_arr;
-TQt::HANDLE *TQPaintDevice::x_appcolormap_arr;
-bool *TQPaintDevice::x_appdefcolormap_arr;
-void **TQPaintDevice::x_appvisual_arr;
-bool *TQPaintDevice::x_appdefvisual_arr;
-
-/*!
- \enum TQPaintDevice::PDevCmd
- \internal
-*/
-
-/*!
- Constructs a paint tqdevice with internal flags \a devflags. This
- constructor can be invoked only from TQPaintDevice subclasses.
-*/
-
-TQPaintDevice::TQPaintDevice( uint devflags )
-{
- if ( !tqApp ) { // global constructor
-#if defined(TQT_CHECK_STATE)
- qFatal( "TQPaintDevice: Must construct a TQApplication before a "
- "TQPaintDevice" );
-#endif
- return;
- }
- devFlags = devflags;
- painters = 0;
- hd = 0;
- rendhd = 0;
- x11Data = 0;
-}
-
-/*!
- Destroys the paint tqdevice and frees window system resources.
-*/
-
-TQPaintDevice::~TQPaintDevice()
-{
-#if defined(TQT_CHECK_STATE)
- if ( paintingActive() )
- qWarning( "TQPaintDevice: Cannot destroy paint tqdevice that is being "
- "painted" );
-#endif
- if ( x11Data && x11Data->deref() ) {
- delete x11Data;
- x11Data = 0;
- }
-}
-
-
-/*
- \internal
- Makes a shallow copy of the X11-specific data of \a fromDevice, if it is not
- null. Otherwise this function sets it to null.
-*/
-
-void TQPaintDevice::copyX11Data( const TQPaintDevice *fromDevice )
-{
- setX11Data( fromDevice ? fromDevice->x11Data : 0 );
-}
-
-/*
- \internal
- Makes a deep copy of the X11-specific data of \a fromDevice, if it is not
- null. Otherwise this function sets it to null.
-*/
-
-void TQPaintDevice::cloneX11Data( const TQPaintDevice *fromDevice )
-{
- if ( fromDevice && fromDevice->x11Data ) {
- TQPaintDeviceX11Data *d = new TQPaintDeviceX11Data;
- *d = *fromDevice->x11Data;
- d->count = 0;
- setX11Data( d );
- } else {
- setX11Data( 0 );
- }
-}
-
-/*
- \internal
- Makes a shallow copy of the X11-specific data \a d and assigns it to this
- class. This function increments the reference code of \a d.
-*/
-
-void TQPaintDevice::setX11Data( const TQPaintDeviceX11Data* d )
-{
- if ( x11Data && x11Data->deref() )
- delete x11Data;
- x11Data = (TQPaintDeviceX11Data*)d;
- if ( x11Data )
- x11Data->ref();
-}
-
-
-/*
- \internal
- If \a def is FALSE, returns a deep copy of the x11Data, or 0 if x11Data is 0.
- If \a def is TRUE, makes a TQPaintDeviceX11Data struct filled with the default
- values.
-
- In either case the caller is responsible for deleting the returned
- struct. But notice that the struct is a shared class, so other
- classes might also have a reference to it. The reference count of
- the returned TQPaintDeviceX11Data* is 0.
-*/
-
-TQPaintDeviceX11Data* TQPaintDevice::getX11Data( bool def ) const
-{
- TQPaintDeviceX11Data* res = 0;
- if ( def ) {
- res = new TQPaintDeviceX11Data;
- res->x_display = x11AppDisplay();
- res->x_screen = x11AppScreen();
- res->x_depth = x11AppDepth();
- res->x_cells = x11AppCells();
- res->x_colormap = x11Colormap();
- res->x_defcolormap = x11AppDefaultColormap();
- res->x_visual = x11AppVisual();
- res->x_defvisual = x11AppDefaultVisual();
- res->deref();
- } else if ( x11Data ) {
- res = new TQPaintDeviceX11Data;
- *res = *x11Data;
- res->count = 0;
- }
- return res;
-}
-
-
-/*!
- \fn int TQPaintDevice::devType() const
-
- \internal
-
- Returns the tqdevice type identifier, which is \c TQInternal::Widget
- if the tqdevice is a TQWidget, \c TQInternal::Pixmap if it's a
- TQPixmap, \c TQInternal::Printer if it's a TQPrinter, \c
- TQInternal::Picture if it's a TQPicture or \c
- TQInternal::UndefinedDevice in other cases (which should never
- happen).
-*/
-
-/*!
- \fn bool TQPaintDevice::isExtDev() const
-
- Returns TRUE if the tqdevice is an external paint tqdevice; otherwise
- returns FALSE.
-
- External paint tqdevices cannot be bitBlt()'ed from. TQPicture and
- TQPrinter are external paint tqdevices.
-*/
-
-/*!
- Returns the window system handle of the paint tqdevice, for
- low-level access. Using this function is not portable.
-
- The HANDLE type varies with platform; see \c tqpaintdevice.h and
- \c tqwindowdefs.h for details.
-
- \sa x11Display()
-*/
-TQt::HANDLE TQPaintDevice::handle() const
-{
- return hd;
-}
-
-/*!
- Returns the window system handle of the paint tqdevice for XRender
- support. Use of this function is not portable. This function will
- return 0 if XRender support is not compiled into TQt, if the
- XRender extension is not supported on the X11 display, or if the
- handle could not be created.
-*/
-TQt::HANDLE TQPaintDevice::x11RenderHandle() const
-{
-#ifndef TQT_NO_XFTFREETYPE
- return rendhd ? XftDrawPicture( (XftDraw *) rendhd ) : 0;
-#else
- return 0;
-#endif // TQT_NO_XFTFREETYPE
-}
-
-
-/*!
- \fn Display *TQPaintDevice::x11AppDisplay()
-
- Returns a pointer to the X display global to the application (X11
- only). Using this function is not portable.
-
- \sa handle()
-*/
-
-/*!
- \fn int TQPaintDevice::x11AppScreen()
-
- Returns the screen number on the X display global to the
- application (X11 only). Using this function is not portable.
-*/
-
-/*!
- \overload
- \fn int TQPaintDevice::x11AppDepth()
-
- Returns the depth for the default screen of the X display global
- to the application (X11 only). Using this function is not
- portable.
-
- \sa TQPixmap::defaultDepth()
-*/
-
-/*!
- \fn int TQPaintDevice::x11AppCells()
-
- Returns the number of entries in the colormap for the default
- screen of the X display global to the application (X11
- only). Using this function is not portable.
-
- \sa x11Colormap()
-*/
-
-/*!
- \fn HANDLE TQPaintDevice::x11AppRootWindow()
-
- Returns the root window for the default screen of the X display
- global to the applicatoin (X11 only). Using this function is not
- portable.
-*/
-
-/*!
- \fn HANDLE TQPaintDevice::x11AppColormap()
-
- Returns the colormap for the default screen of the X display
- global to the application (X11 only). Using this function is not
- portable.
-
- \sa x11Cells()
-*/
-
-/*!
- \fn bool TQPaintDevice::x11AppDefaultColormap ()
-
- Returns the default colormap for the default screen of the X
- display global to the application (X11 only). Using this function
- is not portable.
-
- \sa x11Cells()
-*/
-
-/*!
- \fn void* TQPaintDevice::x11AppVisual ()
-
- Returns the Visual for the default screen of the X display global
- to the application (X11 only). Using this function is not
- portable.
-*/
-
-/*!
- \fn bool TQPaintDevice::x11AppDefaultVisual ()
-
- Returns TRUE if the Visual used is the default for the default
- screen of the X display global to the application (X11 only);
- otherwise returns FALSE. Using this function is not portable.
-*/
-
-/*!
- \fn int TQPaintDevice::x11AppDepth( int screen )
-
- Returns the depth for screen \a screen of the X display global to
- the application (X11 only). Using this function is not portable.
-
- \sa TQPixmap::defaultDepth()
-*/
-
-/*!
- \overload
- \fn int TQPaintDevice::x11AppCells( int screen )
-
- Returns the number of entries in the colormap for screen \a screen
- of the X display global to the application (X11 only). Using this
- function is not portable.
-
- \sa x11Colormap()
-*/
-
-/*!
- \overload
- \fn HANDLE TQPaintDevice::x11AppRootWindow( int screen )
-
- Returns the root window for screen \a screen of the X display
- global to the applicatoin (X11 only). Using this function is not
- portable.
-*/
-
-/*!
- \overload
- \fn HANDLE TQPaintDevice::x11AppColormap( int screen )
-
- Returns the colormap for screen \a screen of the X display global
- to the application (X11 only). Using this function is not
- portable.
-
- \sa x11Cells()
-*/
-
-/*!
- \overload
- \fn bool TQPaintDevice::x11AppDefaultColormap( int screen )
-
- Returns the default colormap for screen \a screen of the X display
- global to the application (X11 only). Using this function is not
- portable.
-
- \sa x11Cells()
-*/
-
-/*!
- \overload
- \fn void* TQPaintDevice::x11AppVisual( int screen )
-
- Returns the Visual for screen \a screen of the X display global to
- the application (X11 only). Using this function is not portable.
-*/
-
-/*!
- \overload
- \fn bool TQPaintDevice::x11AppDefaultVisual( int screen )
-
- Returns TRUE if the Visual used is the default for screen
- \a screen of the X display global to the application (X11 only);
- otherwise returns FALSE. Using this function is not portable.
-*/
-
-
-/*!
- \fn Display *TQPaintDevice::x11Display() const
-
- Returns a pointer to the X display for the paint tqdevice (X11
- only). Using this function is not portable.
-
- \sa handle()
-*/
-
-/*!
- \fn int TQPaintDevice::x11Screen () const
-
- Returns the screen number on the X display for the paint tqdevice
- (X11 only). Using this function is not portable.
-*/
-
-/*!
- \fn int TQPaintDevice::x11Depth () const
-
- Returns the depth of the X display for the paint tqdevice (X11
- only). Using this function is not portable.
-
- \sa TQPixmap::defaultDepth()
-*/
-
-/*!
- \fn int TQPaintDevice::x11Cells () const
-
- Returns the number of entries in the colormap of the X display for
- the paint tqdevice (X11 only). Using this function is not portable.
-
- \sa x11Colormap()
-*/
-
-/*!
- \fn HANDLE TQPaintDevice::x11Colormap () const
-
- Returns the colormap of the X display for the paint tqdevice (X11
- only). Using this function is not portable.
-
- \sa x11Cells()
-*/
-
-/*!
- \fn bool TQPaintDevice::x11DefaultColormap () const
-
- Returns the default colormap of the X display for the paint tqdevice
- (X11 only). Using this function is not portable.
-
- \sa x11Cells()
-*/
-
-/*!
- \fn void* TQPaintDevice::x11Visual () const
-
- Returns the Visual of the X display for the paint tqdevice (X11
- only). Using this function is not portable.
-*/
-
-/*!
- \fn bool TQPaintDevice::x11DefaultVisual () const
-
- Returns the default Visual of the X display for the paint tqdevice
- (X11 only). Using this function is not portable.
-*/
-
-static int *dpisX=0, *dpisY=0;
-static void create_dpis()
-{
- if ( dpisX )
- return;
-
- Display *dpy = TQPaintDevice::x11AppDisplay();
- if ( ! dpy )
- return;
-
- int i, screens = ScreenCount( dpy );
- dpisX = new int[ screens ];
- dpisY = new int[ screens ];
- TQ_CHECK_PTR( dpisX );
- TQ_CHECK_PTR( dpisY );
- for ( i = 0; i < screens; i++ ) {
- if (DisplayWidthMM(dpy,i) < 1)
- dpisX[ i ] = 75; // default the dpi to 75.
- else
- dpisX[ i ] = (DisplayWidth(dpy,i) * 254 + DisplayWidthMM(dpy,i)*5)
- / (DisplayWidthMM(dpy,i)*10);
- if (DisplayHeightMM(dpy,i) < 1)
- dpisY[ i ] = 75; // default the dpi to 75.
- else
- dpisY[ i ] = (DisplayHeight(dpy,i) * 254 + DisplayHeightMM(dpy,i)*5)
- / (DisplayHeightMM(dpy,i)*10);
- }
-}
-
-/*!
- Sets the value returned by x11AppDpiX() to \a dpi for screen
- \a screen. The default is determined by the display configuration.
- Changing this value will alter the scaling of fonts and many other
- metrics and is not recommended. Using this function is not
- portable.
-
- \sa x11SetAppDpiY()
-*/
-void TQPaintDevice::x11SetAppDpiX(int dpi, int screen)
-{
- create_dpis();
- if ( ! dpisX )
- return;
- if ( screen < 0 )
- screen = TQPaintDevice::x11AppScreen();
- if ( screen > ScreenCount( TQPaintDevice::x11AppDisplay() ) )
- return;
- dpisX[ screen ] = dpi;
-}
-
-/*!
- \overload
-
- Sets the value returned by x11AppDpiX() to \a dpi for the default
- screen. The default is determined by the display configuration.
- Changing this value will alter the scaling of fonts and many other
- metrics and is not recommended. Using this function is not
- portable.
-
-*/
-// ### REMOVE 4.0
-void TQPaintDevice::x11SetAppDpiX( int dpi )
-{
- TQPaintDevice::x11SetAppDpiX( dpi, -1 );
-}
-
-/*!
- Sets the value returned by x11AppDpiY() to \a dpi for screen
- \a screen. The default is determined by the display configuration.
- Changing this value will alter the scaling of fonts and many other
- metrics and is not recommended. Using this function is not
- portable.
-
- \sa x11SetAppDpiX()
-*/
-void TQPaintDevice::x11SetAppDpiY(int dpi, int screen)
-{
- create_dpis();
- if ( ! dpisY )
- return;
- if ( screen < 0 )
- screen = TQPaintDevice::x11AppScreen();
- if ( screen > ScreenCount( TQPaintDevice::x11AppDisplay() ) )
- return;
- dpisY[ screen ] = dpi;
-}
-
-/*!
- \overload
-
- Sets the value returned by x11AppDpiY() to \a dpi for the default
- screen. The default is determined by the display configuration.
- Changing this value will alter the scaling of fonts and many other
- metrics and is not recommended. Using this function is not
- portable.
-*/
-// ### REMOVE 4.0
-void TQPaintDevice::x11SetAppDpiY( int dpi )
-{
- TQPaintDevice::x11SetAppDpiY( dpi, -1 );
-}
-
-/*!
- Returns the horizontal DPI of the X display (X11 only) for screen
- \a screen. Using this function is not portable. See
- TQPaintDeviceMetrics for portable access to related information.
- Using this function is not portable.
-
- \sa x11AppDpiY(), x11SetAppDpiX(), TQPaintDeviceMetrics::logicalDpiX()
-*/
-int TQPaintDevice::x11AppDpiX(int screen)
-{
- create_dpis();
- if ( ! dpisX )
- return 0;
- if ( screen < 0 )
- screen = TQPaintDevice::x11AppScreen();
- if ( screen > ScreenCount( TQPaintDevice::x11AppDisplay() ) )
- return 0;
- return dpisX[ screen ];
-}
-
-/*!
- \overload
-
- Returns the horizontal DPI of the X display (X11 only) for the
- default screen. Using this function is not portable. See
- TQPaintDeviceMetrics for portable access to related information.
- Using this function is not portable.
-*/
-int TQPaintDevice::x11AppDpiX()
-{
- return TQPaintDevice::x11AppDpiX( -1 );
-}
-
-/*!
- Returns the vertical DPI of the X11 display (X11 only) for screen
- \a screen. Using this function is not portable. See
- TQPaintDeviceMetrics for portable access to related information.
- Using this function is not portable.
-
- \sa x11AppDpiX(), x11SetAppDpiY(), TQPaintDeviceMetrics::logicalDpiY()
-*/
-int TQPaintDevice::x11AppDpiY( int screen )
-{
- create_dpis();
- if ( ! dpisY )
- return 0;
- if ( screen < 0 )
- screen = TQPaintDevice::x11AppScreen();
- if ( screen > ScreenCount( TQPaintDevice::x11AppDisplay() ) )
- return 0;
- return dpisY[ screen ];
-}
-
-/*!
- \overload
-
- Returns the vertical DPI of the X11 display (X11 only) for the
- default screen. Using this function is not portable. See
- TQPaintDeviceMetrics for portable access to related information.
- Using this function is not portable.
-
- \sa x11AppDpiX(), x11SetAppDpiY(), TQPaintDeviceMetrics::logicalDpiY()
-*/
-int TQPaintDevice::x11AppDpiY()
-{
- return TQPaintDevice::x11AppDpiY( -1 );
-}
-
-/*!
- \fn bool TQPaintDevice::paintingActive() const
-
- Returns TRUE if the tqdevice is being painted, i.e. someone has
- called TQPainter::begin() but not yet called TQPainter::end() for
- this tqdevice; otherwise returns FALSE.
-
- \sa TQPainter::isActive()
-*/
-
-/*!
- Internal virtual function that interprets drawing commands from
- the painter.
-
- Implemented by subclasses that have no direct support for drawing
- graphics (external paint tqdevices, for example, TQPicture).
-*/
-
-bool TQPaintDevice::cmd( int, TQPainter *, TQPDevCmdParam * )
-{
-#if defined(TQT_CHECK_STATE)
- qWarning( "TQPaintDevice::cmd: Device has no command interface" );
-#endif
- return FALSE;
-}
-
-/*!
- \internal
-
- Internal virtual function that returns paint tqdevice metrics.
-
- Please use the TQPaintDeviceMetrics class instead.
-*/
-
-int TQPaintDevice::metric( int ) const
-{
-#if defined(TQT_CHECK_STATE)
- qWarning( "TQPaintDevice::metrics: Device has no metric information" );
-#endif
- return 0;
-}
-
-/*!
- \internal
-
- Internal virtual function. Reserved for future use.
-
- Please use the TQFontMetrics class instead.
-*/
-
-int TQPaintDevice::fontMet( TQFont *, int, const char *, int ) const
-{
- return 0;
-}
-
-/*!
- \internal
-
- Internal virtual function. Reserved for future use.
-
- Please use the TQFontInfo class instead.
-*/
-
-int TQPaintDevice::fontInf( TQFont *, int ) const
-{
- return 0;
-}
-
-
-//
-// Internal functions for simple GC caching for blt'ing masked pixmaps.
-// This cache is used when the pixmap optimization is set to Normal
-// and the pixmap size doesn't exceed 128x128.
-//
-
-static bool init_mask_gc = FALSE;
-static const int max_mask_gcs = 11; // suitable for hashing
-
-struct mask_gc {
- GC gc;
- int mask_no;
-};
-
-static mask_gc gc_vec[max_mask_gcs];
-
-
-static void cleanup_mask_gc()
-{
- Display *dpy = TQPaintDevice::x11AppDisplay();
- init_mask_gc = FALSE;
- for ( int i=0; i<max_mask_gcs; i++ ) {
- if ( gc_vec[i].gc )
- XFreeGC( dpy, gc_vec[i].gc );
- }
-}
-
-static GC cache_mask_gc( Display *dpy, Drawable hd, int mask_no, Pixmap mask )
-{
- if ( !init_mask_gc ) { // first time initialization
- init_mask_gc = TRUE;
- qAddPostRoutine( cleanup_mask_gc );
- for ( int i=0; i<max_mask_gcs; i++ )
- gc_vec[i].gc = 0;
- }
- mask_gc *p = &gc_vec[mask_no % max_mask_gcs];
- if ( !p->gc || p->mask_no != mask_no ) { // not a perfect match
- if ( !p->gc ) { // no GC
- p->gc = XCreateGC( dpy, hd, 0, 0 );
- XSetGraphicsExposures( dpy, p->gc, False );
- }
- XSetClipMask( dpy, p->gc, mask );
- p->mask_no = mask_no;
- }
- return p->gc;
-}
-
-
-/*!
- \relates TQPaintDevice
-
- Copies a block of pixels from \a src to \a dst, perhaps merging
- each pixel according to the \link TQt::RasterOp raster operation \endlink
- \a rop. \a sx, \a sy
- is the top-left pixel in \a src (0, 0) by default, \a dx, \a dy is
- the top-left position in \a dst and \a sw, \a sh is the size of
- the copied block (all of \a src by default).
-
- The most common values for \a rop are CopyROP and XorROP; the \l
- TQt::RasterOp documentation defines all the possible values.
-
- If \a ignoreMask is FALSE (the default) and \a src is a
- masked TQPixmap, the entire blit is masked by \a{src}->mask().
-
- If \a src, \a dst, \a sw or \a sh is 0, bitBlt() does nothing. If
- \a sw or \a sh is negative bitBlt() copies starting at \a sx (and
- respectively, \a sy) and ending at the right end (respectively,
- bottom) of \a src.
-
- \a src must be a TQWidget or TQPixmap. You cannot blit from a
- TQPrinter, for example. bitBlt() does nothing if you attempt to
- blit from an unsupported tqdevice.
-
- bitBlt() does nothing if \a src has a greater depth than \e dst.
- If you need to for example, draw a 24-bit pixmap on an 8-bit
- widget, you must use drawPixmap().
-*/
-
-void bitBlt( TQPaintDevice *dst, int dx, int dy,
- const TQPaintDevice *src, int sx, int sy, int sw, int sh,
- TQt::RasterOp rop, bool ignoreMask )
-{
- if ( !src || !dst ) {
-#if defined(TQT_CHECK_NULL)
- TQ_ASSERT( src != 0 );
- TQ_ASSERT( dst != 0 );
-#endif
- return;
- }
- if ( !src->handle() || src->isExtDev() )
- return;
-
- TQPaintDevice *pdev = TQPainter::redirect( dst );
- if ( pdev )
- dst = pdev;
-
- int ts = src->devType(); // from tqdevice type
- int td = dst->devType(); // to tqdevice type
- Display *dpy = src->x11Display();
-
- if ( sw <= 0 ) { // special width
- if ( sw < 0 )
- sw = src->metric( TQPaintDeviceMetrics::PdmWidth ) - sx;
- else
- return;
- }
- if ( sh <= 0 ) { // special height
- if ( sh < 0 )
- sh = src->metric( TQPaintDeviceMetrics::PdmHeight ) - sy;
- else
- return;
- }
-
- if ( dst->paintingActive() && dst->isExtDev() ) {
- TQPixmap *pm; // output to picture/printer
- bool tmp_pm = TRUE;
- if ( ts == TQInternal::Pixmap ) {
- pm = (TQPixmap*)src;
- if ( sx != 0 || sy != 0 ||
- sw != pm->width() || sh != pm->height() || ignoreMask ) {
- TQPixmap *tmp = new TQPixmap( sw, sh, pm->depth() );
- bitBlt( tmp, 0, 0, pm, sx, sy, sw, sh, TQt::CopyROP, TRUE );
- if ( pm->mask() && !ignoreMask ) {
- TQBitmap mask( sw, sh );
- bitBlt( &mask, 0, 0, pm->mask(), sx, sy, sw, sh,
- TQt::CopyROP, TRUE );
- tmp->setMask( mask );
- }
- pm = tmp;
- } else {
- tmp_pm = FALSE;
- }
- } else if ( ts == TQInternal::Widget ) {// bitBlt to temp pixmap
- pm = new TQPixmap( sw, sh );
- TQ_CHECK_PTR( pm );
- bitBlt( pm, 0, 0, src, sx, sy, sw, sh );
- } else {
-#if defined(TQT_CHECK_RANGE)
- qWarning( "bitBlt: Cannot bitBlt from tqdevice" );
-#endif
- return;
- }
- TQPDevCmdParam param[3];
- TQRect r(dx, dy, pm->width(), pm->height());
- param[0].rect = &r;
- param[1].pixmap = pm;
- dst->cmd( TQPaintDevice::PdcDrawPixmap, 0, param );
- if ( tmp_pm )
- delete pm;
- return;
- }
-
- switch ( ts ) {
- case TQInternal::Widget:
- case TQInternal::Pixmap:
- case TQInternal::System: // OK, can blt from these
- break;
- default:
-#if defined(TQT_CHECK_RANGE)
- qWarning( "bitBlt: Cannot bitBlt from tqdevice type %x", ts );
-#endif
- return;
- }
- switch ( td ) {
- case TQInternal::Widget:
- case TQInternal::Pixmap:
- case TQInternal::System: // OK, can blt to these
- break;
- default:
-#if defined(TQT_CHECK_RANGE)
- qWarning( "bitBlt: Cannot bitBlt to tqdevice type %x", td );
-#endif
- return;
- }
-
- static const short ropCodes[] = { // ROP translation table
- GXcopy, GXor, GXxor, GXandInverted,
- GXcopyInverted, GXorInverted, GXequiv, GXand,
- GXinvert, GXclear, GXset, GXnoop,
- GXandReverse, GXorReverse, GXnand, GXnor
- };
- if ( rop > TQt::LastROP ) {
-#if defined(TQT_CHECK_RANGE)
- qWarning( "bitBlt: Invalid ROP code" );
-#endif
- return;
- }
-
- if ( dst->handle() == 0 ) {
-#if defined(TQT_CHECK_NULL)
- qWarning( "bitBlt: Cannot bitBlt to tqdevice" );
-#endif
- return;
- }
-
- bool mono_src;
- bool mono_dst;
- bool include_inferiors = FALSE;
- bool graphics_exposure = FALSE;
- TQPixmap *src_pm;
- TQBitmap *mask;
-
- if ( ts == TQInternal::Pixmap ) {
- src_pm = (TQPixmap*)src;
- if ( src_pm->x11Screen() != dst->x11Screen() )
- src_pm->x11SetScreen( dst->x11Screen() );
- mono_src = src_pm->depth() == 1;
- mask = ignoreMask ? 0 : src_pm->data->mask;
- } else {
- src_pm = 0;
- mono_src = FALSE;
- mask = 0;
- include_inferiors = ((TQWidget*)src)->testWFlags(TQt::WPaintUnclipped);
- graphics_exposure = td == TQInternal::Widget;
- }
- if ( td == TQInternal::Pixmap ) {
- if ( dst->x11Screen() != src->x11Screen() )
- ((TQPixmap*)dst)->x11SetScreen( src->x11Screen() );
- mono_dst = ((TQPixmap*)dst)->depth() == 1;
- ((TQPixmap*)dst)->detach(); // changes shared pixmap
- } else {
- mono_dst = FALSE;
- include_inferiors = include_inferiors ||
- ((TQWidget*)dst)->testWFlags(TQt::WPaintUnclipped);
- }
-
- if ( mono_dst && !mono_src ) { // dest is 1-bit pixmap, source is not
-#if defined(TQT_CHECK_RANGE)
- qWarning( "bitBlt: Incompatible destination pixmap" );
-#endif
- return;
- }
-
-#ifndef TQT_NO_XRENDER
- if (src_pm && !mono_src && src_pm->data->alphapm && !ignoreMask ) {
- // use RENDER to do the blit
- TQPixmap *alpha = src_pm->data->alphapm;
- if (src->x11RenderHandle() &&
- alpha->x11RenderHandle() &&
- dst->x11RenderHandle()) {
- XRenderPictureAttributes pattr;
- ulong picmask = 0;
- if (include_inferiors) {
- pattr.subwindow_mode = IncludeInferiors;
- picmask |= CPSubwindowMode;
- }
- if (graphics_exposure) {
- pattr.graphics_exposures = TRUE;
- picmask |= CPGraphicsExposure;
- }
- if (picmask)
- XRenderChangePicture(dpy, dst->x11RenderHandle(), picmask, &pattr);
- XRenderComposite(dpy, PictOpOver, src->x11RenderHandle(),
- alpha->x11RenderHandle(), dst->x11RenderHandle(),
- sx, sy, sx, sy, dx, dy, sw, sh);
- // restore attributes
- pattr.subwindow_mode = ClipByChildren;
- pattr.graphics_exposures = FALSE;
- if (picmask)
- XRenderChangePicture(dpy, dst->x11RenderHandle(), picmask, &pattr);
- return;
- }
- }
-#endif
-
- GC gc;
-
- if ( mask && !mono_src ) { // fast masked blt
- bool temp_gc = FALSE;
- if ( mask->data->maskgc ) {
- gc = (GC)mask->data->maskgc; // we have a premade mask GC
- } else {
- if ( FALSE && src_pm->optimization() == TQPixmap::NormalOptim ) { // #### cache disabled
- // Compete for the global cache
- gc = cache_mask_gc( dpy, dst->handle(),
- mask->data->ser_no,
- mask->handle() );
- } else {
- // Create a new mask GC. If BestOptim, we store the mask GC
- // with the mask (not at the pixmap). This way, many pixmaps
- // which have a common mask will be optimized at no extra cost.
- gc = XCreateGC( dpy, dst->handle(), 0, 0 );
- XSetGraphicsExposures( dpy, gc, False );
- XSetClipMask( dpy, gc, mask->handle() );
- if ( src_pm->optimization() == TQPixmap::BestOptim ) {
- mask->data->maskgc = gc;
- } else {
- temp_gc = TRUE;
- }
- }
- }
- XSetClipOrigin( dpy, gc, dx-sx, dy-sy );
- if ( rop != TQt::CopyROP ) // use non-default ROP code
- XSetFunction( dpy, gc, ropCodes[rop] );
- if ( include_inferiors ) {
- XSetSubwindowMode( dpy, gc, IncludeInferiors );
- XCopyArea( dpy, src->handle(), dst->handle(), gc, sx, sy, sw, sh,
- dx, dy );
- XSetSubwindowMode( dpy, gc, ClipByChildren );
- } else {
- XCopyArea( dpy, src->handle(), dst->handle(), gc, sx, sy, sw, sh,
- dx, dy );
- }
-
- if ( temp_gc ) // delete temporary GC
- XFreeGC( dpy, gc );
- else if ( rop != TQt::CopyROP ) // restore ROP
- XSetFunction( dpy, gc, GXcopy );
- return;
- }
-
- gc = qt_xget_temp_gc( dst->x11Screen(), mono_dst ); // get a reusable GC
-
- if ( rop != TQt::CopyROP ) // use non-default ROP code
- XSetFunction( dpy, gc, ropCodes[rop] );
-
- if ( mono_src && mono_dst && src == dst ) { // dst and src are the same bitmap
- XCopyArea( dpy, src->handle(), dst->handle(), gc, sx, sy, sw, sh, dx, dy );
- } else if ( mono_src ) { // src is bitmap
- XGCValues gcvals;
- ulong valmask = GCBackground | GCForeground | GCFillStyle |
- GCStipple | GCTileStipXOrigin | GCTileStipYOrigin;
- if ( td == TQInternal::Widget ) { // set GC colors
- TQWidget *w = (TQWidget *)dst;
- gcvals.background = w->backgroundColor().pixel( dst->x11Screen() );
- gcvals.foreground = w->foregroundColor().pixel( dst->x11Screen() );
- if ( include_inferiors ) {
- valmask |= GCSubwindowMode;
- gcvals.subwindow_mode = IncludeInferiors;
- }
- } else if ( mono_dst ) {
- gcvals.background = 0;
- gcvals.foreground = 1;
- } else {
- gcvals.background = TQt::white.pixel( dst->x11Screen() );
- gcvals.foreground = TQt::black.pixel( dst->x11Screen() );
- }
-
- gcvals.fill_style = FillOpaqueStippled;
- gcvals.stipple = src->handle();
- gcvals.ts_x_origin = dx - sx;
- gcvals.ts_y_origin = dy - sy;
-
- bool clipmask = FALSE;
- if ( mask ) {
- if ( ((TQPixmap*)src)->data->selfmask ) {
- gcvals.fill_style = FillStippled;
- } else {
- XSetClipMask( dpy, gc, mask->handle() );
- XSetClipOrigin( dpy, gc, dx-sx, dy-sy );
- clipmask = TRUE;
- }
- }
-
- XChangeGC( dpy, gc, valmask, &gcvals );
- XFillRectangle( dpy,dst->handle(), gc, dx, dy, sw, sh );
-
- valmask = GCFillStyle | GCTileStipXOrigin | GCTileStipYOrigin;
- gcvals.fill_style = FillSolid;
- gcvals.ts_x_origin = 0;
- gcvals.ts_y_origin = 0;
- if ( include_inferiors ) {
- valmask |= GCSubwindowMode;
- gcvals.subwindow_mode = ClipByChildren;
- }
- XChangeGC( dpy, gc, valmask, &gcvals );
-
- if ( clipmask ) {
- XSetClipOrigin( dpy, gc, 0, 0 );
- XSetClipMask( dpy, gc, None );
- }
-
- } else { // src is pixmap/widget
-
- if ( graphics_exposure ) // widget to widget
- XSetGraphicsExposures( dpy, gc, True );
- if ( include_inferiors ) {
- XSetSubwindowMode( dpy, gc, IncludeInferiors );
- XCopyArea( dpy, src->handle(), dst->handle(), gc, sx, sy, sw, sh,
- dx, dy );
- XSetSubwindowMode( dpy, gc, ClipByChildren );
- } else {
- XCopyArea( dpy, src->handle(), dst->handle(), gc, sx, sy, sw, sh,
- dx, dy );
- }
- if ( graphics_exposure ) // reset graphics exposure
- XSetGraphicsExposures( dpy, gc, False );
- }
-
- if ( rop != TQt::CopyROP ) // restore ROP
- XSetFunction( dpy, gc, GXcopy );
-}
-
-
-/*!
- \relates TQPaintDevice
-
- \overload void bitBlt( TQPaintDevice *dst, const TQPoint &dp, const TQPaintDevice *src, const TQRect &sr, RasterOp rop )
-
- Overloaded bitBlt() with the destination point \a dp and source
- rectangle \a sr.
-*/
-
-
-/*!
- \internal
-*/
-// makes it possible to add a setResolution as we have in TQPrinter for all
-// painttqdevices without breaking bin compatibility.
-void TQPaintDevice::setResolution( int )
-{
-}
-
-/*!\internal
-*/
-int TQPaintDevice::resolution() const
-{
- return metric( TQPaintDeviceMetrics::PdmDpiY );
-}
-
-#endif // USE_QT4 \ No newline at end of file