[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: koffice/kexi
From: Jarosław Staniek <staniek () kde ! org>
Date: 2010-05-08 9:11:19
Message-ID: 20100508091119.0D3F9AC8B0 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1124236 by staniek:
Table View
*Optimize display of scaled image entries in table grid by caching, table was \
previously unusable for 10+ rows BUG:234347
M +39 -8 kexiutils/utils.cpp
M +10 -2 kexiutils/utils.h
M +35 -3 widget/tableview/kexiblobtableedit.cpp
--- trunk/koffice/kexi/kexiutils/utils.cpp #1124235:1124236
@@ -386,8 +386,10 @@
string[i] = QChar(string[i].unicode() - 47 - i);
}
-void KexiUtils::drawPixmap(QPainter& p, const WidgetMargins& margins, const QRect& \
rect,
- const QPixmap& pixmap, Qt::Alignment alignment, bool \
scaledContents, bool keepAspectRatio) +static void \
drawOrScalePixmapInternal(QPainter* p, const WidgetMargins& margins, const QRect& \
rect, + QPixmap& pixmap, QPoint &pos, \
Qt::Alignment alignment, + bool scaledContents, \
bool keepAspectRatio, + Qt::TransformationMode \
transformMode = Qt::FastTransformation) {
if (pixmap.isNull())
return;
@@ -401,7 +403,7 @@
// QPainter p2;
QPainter *target;
// if (fast) {
- target = &p;
+ target = p;
// } else {
//moved pixmapBuffer.resize(rect.size()-QSize(lineWidth, lineWidth));
//moved p2.begin(&pm, p.device());
@@ -410,11 +412,10 @@
//! @todo only create buffered pixmap of the minimum size and then do not fillRect()
// target->fillRect(0,0,rect.width(),rect.height(), backgroundColor);
- QPoint pos;
if (scaledContents) {
if (keepAspectRatio) {
QImage img(pixmap.toImage());
- img = img.scaled(w, h, Qt::KeepAspectRatio);
+ img = img.scaled(w, h, Qt::KeepAspectRatio, transformMode);
pos = rect.topLeft();
if (img.width() < w) {
// int hAlign = QApplication::horizontalAlignment(alignment);
@@ -437,15 +438,24 @@
else {
// target->drawPixmap(pos, pixmapBuffer);
}
- p.drawImage(pos, img);
+ if (p) {
+ p->drawImage(pos, img);
+ }
+ else {
+ pixmap = QPixmap::fromImage(img);
+ }
} else {
if (!fast) {
// pixmapBuffer = QPixmap(rect.size() - QSize(margins.right, \
margins.bottom)); // p2.begin(&pixmapBuffer);
//, p.device());
// p2.drawPixmap(QRect(rect.x(), rect.y(), w, h), pixmap);
- p.drawPixmap(QRect(rect.x(), rect.y(), w, h), pixmap);
+ pos = rect.topLeft();
+ pixmap = pixmap.scaled(w, h, Qt::IgnoreAspectRatio, transformMode);
+ if (p) {
+ p->drawPixmap(pos, pixmap);
}
+ }
else {
// target->drawPixmap(QRect(rect.x() + margins.left, rect.y() + \
margins.top, w, h), pixmap); }
@@ -469,8 +479,11 @@
// target->drawPixmap(pos, pixmap);
// if (!fast)
// p2.begin(&pixmapBuffer, p.device());
- p.drawPixmap(margins.left + pos.x(), margins.top + pos.y(), pixmap);
+ pos += QPoint(margins.left, margins.top);
+ if (p) {
+ p->drawPixmap(pos, pixmap);
}
+ }
/* if (scaledContents && !fast && p.isActive()) {
p2.end();
p.drawPixmap(
@@ -481,6 +494,24 @@
}*/
}
+void KexiUtils::drawPixmap(QPainter& p, const WidgetMargins& margins, const QRect& \
rect, + const QPixmap& pixmap, Qt::Alignment alignment, \
bool scaledContents, bool keepAspectRatio, + \
Qt::TransformationMode transformMode) +{
+ QPixmap px(pixmap);
+ QPoint pos;
+ drawOrScalePixmapInternal(&p, margins, rect, px, pos, alignment, scaledContents, \
keepAspectRatio, transformMode); +}
+
+QPixmap KexiUtils::scaledPixmap(const WidgetMargins& margins, const QRect& rect,
+ const QPixmap& pixmap, QPoint& pos, Qt::Alignment \
alignment, + bool scaledContents, bool \
keepAspectRatio, Qt::TransformationMode transformMode) +{
+ QPixmap px(pixmap);
+ drawOrScalePixmapInternal(0, margins, rect, px, pos, alignment, scaledContents, \
keepAspectRatio, transformMode); + return px;
+}
+
QString KexiUtils::ptrToStringInternal(void* ptr, uint size)
{
QString str;
--- trunk/koffice/kexi/kexiutils/utils.h #1124235:1124236
@@ -338,11 +338,19 @@
//! \return the sum of \a margins1 and \a margins1; each component is added \
separately. const WidgetMargins operator+ (const WidgetMargins& margins1, const \
WidgetMargins& margins2);
-//! Draws pixmap on painter \a p using predefined parameters.
+//! Draws pixmap @a pixmap on painter @a p using predefined parameters.
//! Used in KexiDBImageBox and KexiBlobTableEdit.
KEXIUTILS_EXPORT void drawPixmap(QPainter& p, const WidgetMargins& margins, const \
QRect& rect,
- const QPixmap& pixmap, Qt::Alignment alignment, \
bool scaledContents, bool keepAspectRatio); + const \
QPixmap& pixmap, Qt::Alignment alignment, bool scaledContents, bool keepAspectRatio, \
+ Qt::TransformationMode transformMode = \
Qt::FastTransformation);
+//! Scales pixmap @a pixmap on painter @a p using predefined parameters.
+//! Used in KexiDBImageBox and KexiBlobTableEdit.
+KEXIUTILS_EXPORT QPixmap scaledPixmap(const WidgetMargins& margins, const QRect& \
rect, + const QPixmap& pixmap, QPoint& pos, \
Qt::Alignment alignment, + bool scaledContents, \
bool keepAspectRatio, + Qt::TransformationMode \
transformMode = Qt::FastTransformation); +
//! A helper for automatic deleting of contents of containers.
template <typename Container>
class KEXIUTILS_EXPORT ContainerDeleter
--- trunk/koffice/kexi/widget/tableview/kexiblobtableedit.cpp #1124235:1124236
@@ -52,6 +52,11 @@
#include <widget/utils/kexidropdownbutton.h>
#include <widget/utils/kexicontextmenuutils.h>
+struct PixmapAndPos {
+ QPixmap pixmap;
+ QPoint pos;
+};
+
//! @internal
class KexiBlobTableEdit::Private
{
@@ -68,6 +73,7 @@
KexiImageContextMenu *menu;
bool readOnly; //!< cached for slotUpdateActionsAvailabilityRequested()
bool setValueInternalEnabled; //!< used to disable \
KexiBlobTableEdit::setValueInternal() + QCache<qulonglong, PixmapAndPos> \
cachedPixmaps; };
//======================================================
@@ -210,16 +216,42 @@
Q_UNUSED(txt);
Q_UNUSED(align);
-//! @todo optimize: load to m_pixmap, downsize
- QPixmap pixmap;
+ QPoint pos;
+ PixmapAndPos *pp = 0;
x = 0;
w -= 1; //a place for border
h -= 1; //a place for border
- if (p && val.canConvert(QVariant::ByteArray) && \
pixmap.loadFromData(val.toByteArray())) { + if (p) {
+ const QByteArray array(val.toByteArray());
+//! @todo optimize: keep this checksum in context of data
+//! @todo optimize: for now 100 items are cached; set proper cache size, e.g. based \
on the number of blob items visible on screen + // the key is unique for this \
tuple: (checksum, w, h) + qulonglong \
sum((((qulonglong(qChecksum(array.constData(), array.length())) << 32) + w) << 16) + \
h); + pp = d->cachedPixmaps.object(sum);
+ if (!pp) {
+ QPixmap pixmap;
+ if (val.canConvert(QVariant::ByteArray) && \
pixmap.loadFromData(val.toByteArray())) { +#if 0
KexiUtils::drawPixmap(*p, KexiUtils::WidgetMargins()/*lineWidth*/, QRect(x, \
y_offset, w, h),
pixmap, Qt::AlignCenter, true/*scaledContents*/, \
true/*keepAspectRatio*/); +#endif
+ QPoint pos;
+ pixmap = \
KexiUtils::scaledPixmap(KexiUtils::WidgetMargins()/*lineWidth*/, QRect(x, y_offset, \
w, h), + pixmap, pos, Qt::AlignCenter, \
true/*scaledContents*/, true/*keepAspectRatio*/, + \
Qt::SmoothTransformation); + if (!pixmap.isNull()) {
+ pp = new PixmapAndPos;
+ pp->pixmap = pixmap;
+ pp->pos = pos;
+ d->cachedPixmaps.insert(sum, pp);
}
}
+ }
+ if (pp) {
+ p->drawPixmap(pp->pos, pp->pixmap);
+ }
+ }
+}
bool KexiBlobTableEdit::cursorAtStart()
{
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic