diff options
Diffstat (limited to 'src/gui/painting/qwindowsurface_raster.cpp')
-rw-r--r-- | src/gui/painting/qwindowsurface_raster.cpp | 487 |
1 files changed, 0 insertions, 487 deletions
diff --git a/src/gui/painting/qwindowsurface_raster.cpp b/src/gui/painting/qwindowsurface_raster.cpp deleted file mode 100644 index d97238427b..0000000000 --- a/src/gui/painting/qwindowsurface_raster.cpp +++ /dev/null @@ -1,487 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <qdebug.h> - -#include <qglobal.h> // for Q_WS_WIN define (non-PCH) -#ifdef Q_WS_WIN -#include <qlibrary.h> -#include <qt_windows.h> -#endif - -#include <QtGui/qpaintdevice.h> -#include <QtGui/qwidget.h> - -#include "private/qwindowsurface_raster_p.h" -#include "private/qnativeimage_p.h" -#include "private/qwidget_p.h" - -#ifdef Q_WS_X11 -#include "private/qpixmap_x11_p.h" -#include "private/qt_x11_p.h" -#include "private/qwidget_p.h" -#include "qx11info_x11.h" -#endif -#include "private/qdrawhelper_p.h" - -#ifdef Q_WS_MAC -#include <private/qt_cocoa_helpers_mac_p.h> -#include <QMainWindow> -#include <private/qmainwindowlayout_p.h> -#include <QToolBar> -#endif - -QT_BEGIN_NAMESPACE - -class QRasterWindowSurfacePrivate -{ -public: - QNativeImage *image; - -#ifdef Q_WS_X11 - GC gc; -#ifndef QT_NO_MITSHM - uint needsSync : 1; -#endif -#ifndef QT_NO_XRENDER - uint translucentBackground : 1; -#endif -#endif - uint inSetGeometry : 1; -}; - -QRasterWindowSurface::QRasterWindowSurface(QWidget *window, bool setDefaultSurface) - : QWindowSurface(window, setDefaultSurface), d_ptr(new QRasterWindowSurfacePrivate) -{ -#ifdef Q_WS_X11 - d_ptr->gc = XCreateGC(X11->display, window->handle(), 0, 0); -#ifndef QT_NO_XRENDER - d_ptr->translucentBackground = X11->use_xrender - && window->x11Info().depth() == 32; -#endif -#ifndef QT_NO_MITHSM - d_ptr->needsSync = false; -#endif -#endif - d_ptr->image = 0; - d_ptr->inSetGeometry = false; - -#ifdef QT_MAC_USE_COCOA - needsFlush = false; - regionToFlush = QRegion(); -#endif // QT_MAC_USE_COCOA -} - - -QRasterWindowSurface::~QRasterWindowSurface() -{ -#ifdef Q_WS_X11 - XFreeGC(X11->display, d_ptr->gc); -#endif - if (d_ptr->image) - delete d_ptr->image; -} - - -QPaintDevice *QRasterWindowSurface::paintDevice() -{ - return &d_ptr->image->image; -} - -#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM) -void QRasterWindowSurface::syncX() -{ - // delay writing to the backbuffer until we know for sure X is done reading from it - if (d_ptr->needsSync) { - XSync(X11->display, false); - d_ptr->needsSync = false; - } -} -#endif - -void QRasterWindowSurface::beginPaint(const QRegion &rgn) -{ -#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM) - syncX(); -#endif - -#if (defined(Q_WS_X11) && !defined(QT_NO_XRENDER)) || (defined(Q_WS_WIN) && !defined(Q_WS_WINCE)) - if (!qt_widget_private(window())->isOpaque && window()->testAttribute(Qt::WA_TranslucentBackground)) { -#if defined(Q_WS_WIN) && !defined(Q_WS_WINCE) - if (d_ptr->image->image.format() != QImage::Format_ARGB32_Premultiplied) - prepareBuffer(QImage::Format_ARGB32_Premultiplied, window()); -#endif - QPainter p(&d_ptr->image->image); - p.setCompositionMode(QPainter::CompositionMode_Source); - const QVector<QRect> rects = rgn.rects(); - const QColor blank = Qt::transparent; - for (QVector<QRect>::const_iterator it = rects.begin(); it != rects.end(); ++it) { - p.fillRect(*it, blank); - } - } -#else - Q_UNUSED(rgn); -#endif -} - -void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint &offset) -{ - Q_D(QRasterWindowSurface); - - // Not ready for painting yet, bail out. This can happen in - // QWidget::create_sys() - if (!d->image || rgn.rectCount() == 0) - return; - -#ifdef Q_WS_WIN - QRect br = rgn.boundingRect(); - -#ifndef Q_WS_WINCE - if (!qt_widget_private(window())->isOpaque - && window()->testAttribute(Qt::WA_TranslucentBackground) - && (qt_widget_private(window())->data.window_flags & Qt::FramelessWindowHint)) - { - QRect r = window()->frameGeometry(); - QPoint frameOffset = qt_widget_private(window())->frameStrut().topLeft(); - QRect dirtyRect = br.translated(offset + frameOffset); - - SIZE size = {r.width(), r.height()}; - POINT ptDst = {r.x(), r.y()}; - POINT ptSrc = {0, 0}; - BLENDFUNCTION blend = {AC_SRC_OVER, 0, (int)(255.0 * window()->windowOpacity()), Q_AC_SRC_ALPHA}; - RECT dirty = {dirtyRect.x(), dirtyRect.y(), - dirtyRect.x() + dirtyRect.width(), dirtyRect.y() + dirtyRect.height()}; - Q_UPDATELAYEREDWINDOWINFO info = {sizeof(info), NULL, &ptDst, &size, d->image->hdc, &ptSrc, 0, &blend, Q_ULW_ALPHA, &dirty}; - ptrUpdateLayeredWindowIndirect(window()->internalWinId(), &info); - } else -#endif - { - QPoint wOffset = qt_qwidget_data(widget)->wrect.topLeft(); - - HDC widget_dc = widget->getDC(); - - QRect wbr = br.translated(-wOffset); - BitBlt(widget_dc, wbr.x(), wbr.y(), wbr.width(), wbr.height(), - d->image->hdc, br.x() + offset.x(), br.y() + offset.y(), SRCCOPY); - widget->releaseDC(widget_dc); - } - -#ifndef QT_NO_DEBUG - static bool flush = !qgetenv("QT_FLUSH_WINDOWSURFACE").isEmpty(); - if (flush) { - SelectObject(qt_win_display_dc(), GetStockObject(BLACK_BRUSH)); - Rectangle(qt_win_display_dc(), 0, 0, d->image->width() + 2, d->image->height() + 2); - BitBlt(qt_win_display_dc(), 1, 1, d->image->width(), d->image->height(), - d->image->hdc, 0, 0, SRCCOPY); - } -#endif - -#endif - -#ifdef Q_WS_X11 - extern void *qt_getClipRects(const QRegion &r, int &num); // in qpaintengine_x11.cpp - extern QWidgetData* qt_widget_data(QWidget *); - QPoint wOffset = qt_qwidget_data(widget)->wrect.topLeft(); - - if (widget->window() != window()) { - XFreeGC(X11->display, d_ptr->gc); - d_ptr->gc = XCreateGC(X11->display, widget->handle(), 0, 0); - } - - QRegion wrgn(rgn); - if (!wOffset.isNull()) - wrgn.translate(-wOffset); - QRect wbr = wrgn.boundingRect(); - - if (wrgn.rectCount() != 1) { - int num; - XRectangle *rects = (XRectangle *)qt_getClipRects(wrgn, num); - XSetClipRectangles(X11->display, d_ptr->gc, 0, 0, rects, num, YXBanded); - } - - QRect br = rgn.boundingRect().translated(offset); -#ifndef QT_NO_MITSHM - if (d_ptr->image->xshmpm) { - XCopyArea(X11->display, d_ptr->image->xshmpm, widget->handle(), d_ptr->gc, - br.x(), br.y(), br.width(), br.height(), wbr.x(), wbr.y()); - d_ptr->needsSync = true; - } else if (d_ptr->image->xshmimg) { - const QImage &src = d->image->image; - br = br.intersected(src.rect()); - XShmPutImage(X11->display, widget->handle(), d_ptr->gc, d_ptr->image->xshmimg, - br.x(), br.y(), wbr.x(), wbr.y(), br.width(), br.height(), False); - d_ptr->needsSync = true; - } else -#endif - { - const QImage &src = d->image->image; - br = br.intersected(src.rect()); - if (src.format() != QImage::Format_RGB32 || widget->x11Info().depth() < 24) { - Q_ASSERT(src.depth() >= 16); - const QImage sub_src(src.scanLine(br.y()) + br.x() * (uint(src.depth()) / 8), - br.width(), br.height(), src.bytesPerLine(), src.format()); - QX11PixmapData *data = new QX11PixmapData(QPixmapData::PixmapType); - data->xinfo = widget->x11Info(); - data->fromImage(sub_src, Qt::NoOpaqueDetection); - QPixmap pm = QPixmap(data); - XCopyArea(X11->display, pm.handle(), widget->handle(), d_ptr->gc, 0 , 0 , br.width(), br.height(), wbr.x(), wbr.y()); - } else { - // qpaintengine_x11.cpp - extern void qt_x11_drawImage(const QRect &rect, const QPoint &pos, const QImage &image, Drawable hd, GC gc, Display *dpy, Visual *visual, int depth); - qt_x11_drawImage(br, wbr.topLeft(), src, widget->handle(), d_ptr->gc, X11->display, (Visual *)widget->x11Info().visual(), widget->x11Info().depth()); - } - } - - if (wrgn.rectCount() != 1) - XSetClipMask(X11->display, d_ptr->gc, XNone); -#endif // FALCON - -#ifdef Q_WS_MAC - - Q_UNUSED(offset); - - // This is mainly done for native components like native "open file" dialog. - if (widget->testAttribute(Qt::WA_DontShowOnScreen)) { - return; - } - -#ifdef QT_MAC_USE_COCOA - - this->needsFlush = true; - this->regionToFlush += rgn; - - // The actual flushing will be processed in [view drawRect:rect] - qt_mac_setNeedsDisplay(widget); - -#else - // Get a context for the widget. - CGContextRef context; - CGrafPtr port = GetWindowPort(qt_mac_window_for(widget)); - QDBeginCGContext(port, &context); - CGContextRetain(context); - CGContextSaveGState(context); - - // Flip context. - CGContextTranslateCTM(context, 0, widget->height()); - CGContextScaleCTM(context, 1, -1); - - // Clip to region. - const QVector<QRect> &rects = rgn.rects(); - for (int i = 0; i < rects.size(); ++i) { - const QRect &rect = rects.at(i); - CGContextAddRect(context, CGRectMake(rect.x(), rect.y(), rect.width(), rect.height())); - } - CGContextClip(context); - - QRect r = rgn.boundingRect(); - const CGRect area = CGRectMake(r.x(), r.y(), r.width(), r.height()); - CGImageRef image = CGBitmapContextCreateImage(d->image->cg); - CGImageRef subImage = CGImageCreateWithImageInRect(image, area); - - qt_mac_drawCGImage(context, &area, subImage); - - CGImageRelease(subImage); - CGImageRelease(image); - - QDEndCGContext(port, &context); - - // Restore context. - CGContextRestoreGState(context); - CGContextRelease(context); -#endif // QT_MAC_USE_COCOA - -#endif // Q_WS_MAC - -#ifdef Q_OS_SYMBIAN - Q_UNUSED(widget); - Q_UNUSED(rgn); - Q_UNUSED(offset); -#endif -} - -void QRasterWindowSurface::setGeometry(const QRect &rect) -{ - QWindowSurface::setGeometry(rect); - Q_D(QRasterWindowSurface); - d->inSetGeometry = true; - if (d->image == 0 || d->image->width() < rect.width() || d->image->height() < rect.height()) { -#if (defined(Q_WS_X11) && !defined(QT_NO_XRENDER)) || (defined(Q_WS_WIN) && !defined(Q_WS_WINCE)) -#ifndef Q_WS_WIN - if (d_ptr->translucentBackground) -#else - if (!qt_widget_private(window())->isOpaque) -#endif - prepareBuffer(QImage::Format_ARGB32_Premultiplied, window()); - else -#endif - prepareBuffer(QNativeImage::systemFormat(), window()); - } - d->inSetGeometry = false; - -#if defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA) - QMainWindow* mWindow = qobject_cast<QMainWindow*>(window()); - if (mWindow) { - QMainWindowLayout *mLayout = qobject_cast<QMainWindowLayout*>(mWindow->layout()); - QList<QToolBar *> toolbarList = mLayout->qtoolbarsInUnifiedToolbarList; - - for (int i = 0; i < toolbarList.size(); ++i) { - QToolBar* toolbar = toolbarList.at(i); - if (mLayout->toolBarArea(toolbar) == Qt::TopToolBarArea) { - QWidget* tbWidget = (QWidget*) toolbar; - if (tbWidget->d_func()->unifiedSurface) { - tbWidget->d_func()->unifiedSurface->setGeometry(rect); - } - } - } - } -#endif // Q_WS_MAC && QT_MAC_USE_COCOA - -} - -// from qwindowsurface.cpp -extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset); - -bool QRasterWindowSurface::scroll(const QRegion &area, int dx, int dy) -{ -#ifdef Q_WS_WIN - Q_D(QRasterWindowSurface); - - if (!d->image || !d->image->hdc) - return false; - - QRect rect = area.boundingRect(); - BitBlt(d->image->hdc, rect.x()+dx, rect.y()+dy, rect.width(), rect.height(), - d->image->hdc, rect.x(), rect.y(), SRCCOPY); - - return true; -#else - Q_D(QRasterWindowSurface); - - if (!d->image || d->image->image.isNull()) - return false; - -#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM) - syncX(); -#endif - - const QVector<QRect> rects = area.rects(); - for (int i = 0; i < rects.size(); ++i) - qt_scrollRectInImage(d->image->image, rects.at(i), QPoint(dx, dy)); - - return true; -#endif -} - -QWindowSurface::WindowSurfaceFeatures QRasterWindowSurface::features() const -{ - return QWindowSurface::AllFeatures; -} - -void QRasterWindowSurface::prepareBuffer(QImage::Format format, QWidget *widget) -{ - Q_D(QRasterWindowSurface); - - int width = window()->width(); - int height = window()->height(); - if (d->image) { - width = qMax(d->image->width(), width); - height = qMax(d->image->height(), height); - } - - if (width == 0 || height == 0) { - delete d->image; - d->image = 0; - return; - } - - QNativeImage *oldImage = d->image; - - d->image = new QNativeImage(width, height, format, false, widget); - - if (oldImage && d->inSetGeometry && hasStaticContents()) { - // Make sure we use the const version of bits() (no detach). - const uchar *src = const_cast<const QImage &>(oldImage->image).bits(); - uchar *dst = d->image->image.bits(); - - const int srcBytesPerLine = oldImage->image.bytesPerLine(); - const int dstBytesPerLine = d->image->image.bytesPerLine(); - const int bytesPerPixel = oldImage->image.depth() >> 3; - - QRegion staticRegion(staticContents()); - // Make sure we're inside the boundaries of the old image. - staticRegion &= QRect(0, 0, oldImage->image.width(), oldImage->image.height()); - const QVector<QRect> &rects = staticRegion.rects(); - const QRect *srcRect = rects.constData(); - - // Copy the static content of the old image into the new one. - int numRectsLeft = rects.size(); - do { - const int bytesOffset = srcRect->x() * bytesPerPixel; - const int dy = srcRect->y(); - - // Adjust src and dst to point to the right offset. - const uchar *s = src + dy * srcBytesPerLine + bytesOffset; - uchar *d = dst + dy * dstBytesPerLine + bytesOffset; - const int numBytes = srcRect->width() * bytesPerPixel; - - int numScanLinesLeft = srcRect->height(); - do { - ::memcpy(d, s, numBytes); - d += dstBytesPerLine; - s += srcBytesPerLine; - } while (--numScanLinesLeft); - - ++srcRect; - } while (--numRectsLeft); - } - - delete oldImage; -} - -#ifdef QT_MAC_USE_COCOA -CGContextRef QRasterWindowSurface::imageContext() -{ - Q_D(QRasterWindowSurface); - return d->image->cg; -} -#endif // QT_MAC_USE_COCOA - -QT_END_NAMESPACE |