diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/image/qpixmap_blitter.cpp | 61 | ||||
-rw-r--r-- | src/gui/image/qpixmap_blitter_p.h | 11 | ||||
-rw-r--r-- | src/gui/image/qpixmapdata_p.h | 1 | ||||
-rw-r--r-- | src/gui/painting/qgraphicssystem_p.h | 2 | ||||
-rw-r--r-- | src/gui/painting/qpaintengine_blitter.cpp | 51 | ||||
-rw-r--r-- | src/gui/painting/qpaintengine_blitter_p.h | 3 | ||||
-rw-r--r-- | src/gui/painting/qpaintengine_raster.cpp | 4 |
7 files changed, 93 insertions, 40 deletions
diff --git a/src/gui/image/qpixmap_blitter.cpp b/src/gui/image/qpixmap_blitter.cpp index 9730ecc..5ecc01d 100644 --- a/src/gui/image/qpixmap_blitter.cpp +++ b/src/gui/image/qpixmap_blitter.cpp @@ -3,8 +3,8 @@ #include <private/qapplication_p.h> #include <private/qgraphicssystem_p.h> -QBlittablePixmapData::QBlittablePixmapData(PixelType type) - : QPixmapData(type,BlitterClass), m_blittable(0), m_engine(0) +QBlittablePixmapData::QBlittablePixmapData(QPixmapData::PixelType type) + : QPixmapData(type,BlitterClass), m_engine(0), m_blittable(0) { } @@ -12,17 +12,62 @@ QBlittablePixmapData::~QBlittablePixmapData() { } +QBlittable *QBlittablePixmapData::blittable() +{ + if (!m_blittable) { + m_blittable = QApplicationPrivate::graphicsSystem()->createBlittable(QRect(0,0,w,h)); + } + + return m_blittable; +} + +void QBlittablePixmapData::setBlittable(QBlittable *blittable) +{ + if (m_blittable) + delete m_blittable; + m_blittable = blittable; +} + void QBlittablePixmapData::resize(int width, int height) { delete m_blittable; - m_blittable = QApplicationPrivate::graphicsSystem()->createBlittable(QRect(0,0,width,height)); + m_blittable = 0; + delete m_engine; m_engine = 0; + d = 32; + w = width; + h = height; +// d = image.depth(); + is_null = (w <= 0 || h <= 0); } +extern int qt_defaultDpiX(); +extern int qt_defaultDpiY(); int QBlittablePixmapData::metric(QPaintDevice::PaintDeviceMetric metric) const { - QImage *image = m_blittable->lock(); - return image->metric(metric); + switch (metric) { + case QPaintDevice::PdmWidth: + return w; + case QPaintDevice::PdmHeight: + return h; + case QPaintDevice::PdmWidthMM: + return qRound(w * 25.4 / qt_defaultDpiX()); + case QPaintDevice::PdmHeightMM: + return qRound(h * 25.4 / qt_defaultDpiY()); + case QPaintDevice::PdmDepth: + return 32; + case QPaintDevice::PdmDpiX: // fall-through + case QPaintDevice::PdmPhysicalDpiX: + return qt_defaultDpiX(); + case QPaintDevice::PdmDpiY: // fall-through + case QPaintDevice::PdmPhysicalDpiY: + return qt_defaultDpiY(); + default: + qWarning("QRasterPixmapData::metric(): Unhandled metric type %d", metric); + break; + } + + return 0; } void QBlittablePixmapData::fill(const QColor &color) @@ -38,18 +83,18 @@ QImage *QBlittablePixmapData::buffer() return m_blittable->lock(); } -QImage QBlittablePixmapData::toImage() +QImage QBlittablePixmapData::toImage() const { return m_blittable->lock()->copy(); } -bool QBlittablePixmapData::hasAlphaChannel() +bool QBlittablePixmapData::hasAlphaChannel() const { return m_blittable->lock()->hasAlphaChannel(); } void QBlittablePixmapData::fromImage(const QImage &image, - Qt::ImageConversionFlags flags) + Qt::ImageConversionFlags) { m_blittable = new QImageBlitter(image); m_engine = 0; diff --git a/src/gui/image/qpixmap_blitter_p.h b/src/gui/image/qpixmap_blitter_p.h index 5e93ef4..3ed2fe4 100644 --- a/src/gui/image/qpixmap_blitter_p.h +++ b/src/gui/image/qpixmap_blitter_p.h @@ -34,20 +34,21 @@ private: QImage image; }; -class QBlittablePixmapData : public QPixmapData +class Q_GUI_EXPORT QBlittablePixmapData : public QPixmapData { public: - QBlittablePixmapData(PixelType type); + QBlittablePixmapData(QPixmapData::PixelType type); ~QBlittablePixmapData(); - QBlittable *blittable() const { return m_blittable; } + QBlittable *blittable(); + void setBlittable(QBlittable *blittable); void resize(int width, int height); int metric(QPaintDevice::PaintDeviceMetric metric) const; void fill(const QColor &color); QImage *buffer(); - QImage toImage(); - bool hasAlphaChannel(); + QImage toImage() const; + bool hasAlphaChannel() const; void fromImage(const QImage &image, Qt::ImageConversionFlags flags); QPaintEngine *paintEngine() const; diff --git a/src/gui/image/qpixmapdata_p.h b/src/gui/image/qpixmapdata_p.h index 292092f..a668f0a 100644 --- a/src/gui/image/qpixmapdata_p.h +++ b/src/gui/image/qpixmapdata_p.h @@ -137,6 +137,7 @@ private: friend class QX11PixmapData; friend class QS60PixmapData; friend class QImagePixmapCleanupHooks; // Needs to set is_cached + friend class QBlittablPixmapData; friend class QGLTextureCache; //Needs to check the reference count friend class QExplicitlySharedDataPointer<QPixmapData>; diff --git a/src/gui/painting/qgraphicssystem_p.h b/src/gui/painting/qgraphicssystem_p.h index 275afc0..5fce93d 100644 --- a/src/gui/painting/qgraphicssystem_p.h +++ b/src/gui/painting/qgraphicssystem_p.h @@ -86,7 +86,7 @@ class Q_GUI_EXPORT QGraphicsSystem public: virtual QPixmapData *createPixmapData(QPixmapData::PixelType type) const = 0; virtual QWindowSurface *createWindowSurface(QWidget *widget) const = 0; - virtual QBlittable *createBlittable(const QRect &rect) { return 0; } + virtual QBlittable *createBlittable(const QRect &) const { return 0; } virtual ~QGraphicsSystem() = 0; diff --git a/src/gui/painting/qpaintengine_blitter.cpp b/src/gui/painting/qpaintengine_blitter.cpp index b134d84..0632ae0 100644 --- a/src/gui/painting/qpaintengine_blitter.cpp +++ b/src/gui/painting/qpaintengine_blitter.cpp @@ -2,6 +2,7 @@ #include "private/qpaintengine_raster_p.h" #include "private/qpainter_p.h" #include "private/qapplication_p.h" +#include "private/qpixmap_blitter_p.h" #define STATE_XFORM_SCALE 0x00000001 #define STATE_XFORM_COMPLEX 0x00000002 @@ -147,21 +148,16 @@ public: class QBlitterPaintEnginePrivate : public QPaintEngineExPrivate { public: - QBlitterPaintEnginePrivate(QPixmapData *p) - : QPaintEngineExPrivate(), pixmap(p), - raster(new QRasterPaintEngine(&pixmap)), isBlitterLocked(false), - capabillities(0), hasXForm(false) - { - if (QGraphicsSystem *gs = QApplicationPrivate::graphicsSystem()) { -// QBlittable *b = gs->createBlitter(p); -// if (b) { -// blitter=b; -// capabillities = new CapabilitiesToStateMask(blitter->capabilities()); -// blitter->unlock(); -// } else -// qWarning("No blitter returned from the graphics system. QBlitterPaintEngine will not work"); - } + QBlitterPaintEnginePrivate(QBlittablePixmapData *p) + : QPaintEngineExPrivate(), + isBlitterLocked(false), + hasXForm(false) + { + blitter= p->blittable(); + raster = new QRasterPaintEngine(p->buffer()); + capabillities = new CapabilitiesToStateMask(blitter->capabilities()); + lock(); } inline void lock() { @@ -179,31 +175,35 @@ public: } void fillRect(const QRectF &rect, const QColor &color) { - unlock(); + lock(); QRectF targetRect = rect; if (hasXForm) { targetRect = state->matrix.mapRect(rect); } QClipData *clipData = raster->state()->clip; if (clipData) { - if (clipData->hasRectClip) + if (clipData->hasRectClip) { + unlock(); blitter->fillRect(targetRect & clipData->clipRect, color); - else if (clipData->hasRegionClip) { + } else if (clipData->hasRegionClip) { QVector<QRect> rects = clipData->clipRegion.rects(); for ( int i = 0; i < rects.size(); i++ ) { QRect intersectRect = rects.at(i).intersected(targetRect.toRect()); if (!intersectRect.isEmpty()) { + unlock(); blitter->fillRect(intersectRect,color); } } } - }else { + } else { if (targetRect.x() >= 0 && targetRect.y() >= 0 && targetRect.width() <= raster->paintDevice()->width() - && targetRect.height() <= raster->paintDevice()->height()) + && targetRect.height() <= raster->paintDevice()->height()) { + unlock(); blitter->fillRect(targetRect,color); - else { + } else { QRectF deviceRect(0,0,raster->paintDevice()->width(), raster->paintDevice()->height()); + unlock(); blitter->fillRect(deviceRect&targetRect,color); } } @@ -247,14 +247,13 @@ public: uint hasXForm; }; -QBlitterPaintEngine::QBlitterPaintEngine(QPixmapData *p) +QBlitterPaintEngine::QBlitterPaintEngine(QBlittablePixmapData *p) : QPaintEngineEx(*(new QBlitterPaintEnginePrivate(p))) { } QBlitterPaintEngine::~QBlitterPaintEngine() { - Q_D(QBlitterPaintEngine); } QPainterState *QBlitterPaintEngine::createState(QPainterState *orig) const @@ -407,17 +406,20 @@ void QBlitterPaintEngine::stroke(const QVectorPath &path, const QPen &pen) void QBlitterPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op) { Q_D(QBlitterPaintEngine); + d->lock(); d->raster->clip(path, op); d->updateClip(); } void QBlitterPaintEngine::clip(const QRect &rect, Qt::ClipOperation op){ Q_D(QBlitterPaintEngine); + d->lock(); d->raster->clip(rect,op); d->updateClip(); } void QBlitterPaintEngine::clip(const QRegion ®ion, Qt::ClipOperation op) { Q_D(QBlitterPaintEngine); + d->lock(); d->raster->clip(region,op); d->updateClip(); } @@ -425,12 +427,14 @@ void QBlitterPaintEngine::clip(const QRegion ®ion, Qt::ClipOperation op) void QBlitterPaintEngine::clipEnabledChanged() { Q_D(QBlitterPaintEngine); + d->lock(); d->raster->clipEnabledChanged(); } void QBlitterPaintEngine::penChanged() { Q_D(QBlitterPaintEngine); + d->lock(); d->raster->penChanged(); d->capabillities->updateDrawRectBits(STATE_PEN_ENABLED,qpen_style(d->state->pen) != Qt::NoPen); } @@ -589,6 +593,7 @@ void QBlitterPaintEngine::drawTextItem(const QPointF &pos, const QTextItem &ti) void QBlitterPaintEngine::setState(QPainterState *s) { Q_D(QBlitterPaintEngine); + d->lock(); QPaintEngineEx::setState(s); d->raster->setState(s); d->state = (QRasterPaintEngineState *) s; @@ -609,7 +614,7 @@ class QBlittablePrivate { public: QBlittablePrivate(const QRect &rect, QBlittable::Capabilities caps) - : m_rect(rect), caps(caps) + : caps(caps), m_rect(rect) {} QBlittable::Capabilities caps; QRect m_rect; diff --git a/src/gui/painting/qpaintengine_blitter_p.h b/src/gui/painting/qpaintengine_blitter_p.h index 16b7b2c..8cd2f74 100644 --- a/src/gui/painting/qpaintengine_blitter_p.h +++ b/src/gui/painting/qpaintengine_blitter_p.h @@ -6,6 +6,7 @@ class QRasterPaintEngine; class QBlittablePrivate; class QBlitterPaintEnginePrivate; +class QBlittablePixmapData; // ### find name class Q_GUI_EXPORT QBlittable @@ -45,7 +46,7 @@ class Q_GUI_EXPORT QBlitterPaintEngine : public QPaintEngineEx { Q_DECLARE_PRIVATE(QBlitterPaintEngine); public: - QBlitterPaintEngine(QPixmapData *p); + QBlitterPaintEngine(QBlittablePixmapData *p); ~QBlitterPaintEngine(); virtual QPainterState *createState(QPainterState *orig) const; diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 3f33319..5e3203a 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -458,8 +458,8 @@ bool QRasterPaintEngine::begin(QPaintDevice *device) if (device->devType() == QInternal::Pixmap) { QPixmap *pixmap = static_cast<QPixmap *>(device); - if (pixmap->data->classId() == QPixmapData::RasterClass) - d->device = pixmap->data->buffer(); + if (pixmap->data->classId() == QPixmapData::RasterClass || pixmap->data->classId() == QPixmapData::BlitterClass) + d->device = pixmap->data->buffer(); } else { d->device = device; } |