summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@nokia.com>2009-11-20 09:44:56 +0100
committerJørgen Lind <jorgen.lind@nokia.com>2009-11-25 10:56:00 +0100
commite6d223f9989ebe9805ddda007c9372143f9f1db6 (patch)
tree0d17d3a387781518cc6c1174e1bee060bb7ce119 /src/gui
parent7dea84cd015538dc327e489113919d75c8e275bb (diff)
Made the blitter api work in lighthouse
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/image/qpixmap_blitter.cpp61
-rw-r--r--src/gui/image/qpixmap_blitter_p.h11
-rw-r--r--src/gui/image/qpixmapdata_p.h1
-rw-r--r--src/gui/painting/qgraphicssystem_p.h2
-rw-r--r--src/gui/painting/qpaintengine_blitter.cpp51
-rw-r--r--src/gui/painting/qpaintengine_blitter_p.h3
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp4
7 files changed, 93 insertions, 40 deletions
diff --git a/src/gui/image/qpixmap_blitter.cpp b/src/gui/image/qpixmap_blitter.cpp
index 9730ecc7dc..5ecc01d5be 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 5e93ef4e3a..3ed2fe44d0 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 292092f9ae..a668f0adc5 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 275afc0a77..5fce93dafa 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 b134d8440c..0632ae0d98 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 &region, Qt::ClipOperation op)
{
Q_D(QBlitterPaintEngine);
+ d->lock();
d->raster->clip(region,op);
d->updateClip();
}
@@ -425,12 +427,14 @@ void QBlitterPaintEngine::clip(const QRegion &region, 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 16b7b2c961..8cd2f74e6d 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 3f33319f1c..5e3203ae78 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;
}