1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#include "qpixmap_blitter_p.h"
#include <qpainter.h>
#include <private/qapplication_p.h>
#include <private/qgraphicssystem_p.h>
QBlittablePixmapData::QBlittablePixmapData(QPixmapData::PixelType type)
: QPixmapData(type,BlitterClass), m_engine(0), m_blittable(0)
{
}
QBlittablePixmapData::~QBlittablePixmapData()
{
delete m_blittable;
delete m_engine;
}
QBlittable *QBlittablePixmapData::blittable() const
{
if (!m_blittable) {
QBlittablePixmapData *that = const_cast<QBlittablePixmapData *>(this);
that->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 = 0;
delete m_engine;
m_engine = 0;
d = QApplicationPrivate::graphicsSystem()->screens().at(0)->depth();
w = width;
h = height;
is_null = (w <= 0 || h <= 0);
}
extern int qt_defaultDpiX();
extern int qt_defaultDpiY();
int QBlittablePixmapData::metric(QPaintDevice::PaintDeviceMetric metric) const
{
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)
{
if (blittable()->capabilities() & QBlittable::SolidRectCapability)
blittable()->fillRect(m_blittable->rect(),color);
else
blittable()->lock()->fill(color.rgb());
}
QImage *QBlittablePixmapData::buffer()
{
return blittable()->lock();
}
QImage QBlittablePixmapData::toImage() const
{
return blittable()->lock()->copy();
}
bool QBlittablePixmapData::hasAlphaChannel() const
{
return blittable()->lock()->hasAlphaChannel();
}
void QBlittablePixmapData::fromImage(const QImage &image,
Qt::ImageConversionFlags flags)
{
resize(image.width(),image.height());
QImage *thisImg = blittable()->lock();
QPainter p(thisImg);
p.drawImage(0,0,image,flags);
}
QPaintEngine *QBlittablePixmapData::paintEngine() const
{
if (!m_engine) {
QBlittablePixmapData *that = const_cast<QBlittablePixmapData *>(this);
that->m_engine = new QBlitterPaintEngine(that);
}
return m_engine;
}
|