aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-04-27 08:47:35 +0200
committerLiang Qi <liang.qi@qt.io>2016-04-27 08:47:35 +0200
commitda374438be8f34f746f359aa39ae6c59fd1c4854 (patch)
tree2f3e2a2b93b39dfb825339c98580f23e824fad0e /src/quick
parent1be53f4e143d417d60cd1f9a292193dab59b5b20 (diff)
parent2e6f7f362e62c3285e7d395aca607502c8e8160e (diff)
Merge remote-tracking branch 'origin/5.6' into 5.7
Conflicts: src/quick/items/qquickimagebase.cpp src/imports/layouts/plugin.cpp Change-Id: I5f48474df4034a1347ec74795c85d369a55b6b21
Diffstat (limited to 'src/quick')
-rw-r--r--src/quick/designer/qqmldesignermetaobject.cpp17
-rw-r--r--src/quick/items/qquickanchors.cpp184
-rw-r--r--src/quick/items/qquickdrag.cpp2
-rw-r--r--src/quick/items/qquickimagebase.cpp2
-rw-r--r--src/quick/items/qquickitem.cpp14
-rw-r--r--src/quick/items/qquickitem_p.h5
-rw-r--r--src/quick/items/qquickitemgrabresult.cpp1
-rw-r--r--src/quick/items/qquickpainteditem.cpp7
-rw-r--r--src/quick/items/qquickpainteditem.h1
-rw-r--r--src/quick/items/qquickshadereffect.cpp1
-rw-r--r--src/quick/items/qquickshadereffectnode.cpp4
-rw-r--r--src/quick/items/qquickshadereffectnode_p.h1
-rw-r--r--src/quick/items/qquicktext_p.h10
-rw-r--r--src/quick/items/qquicktextinput_p.h8
-rw-r--r--src/quick/scenegraph/util/qsgatlastexture.cpp11
-rw-r--r--src/quick/scenegraph/util/qsgatlastexture_p.h2
-rw-r--r--src/quick/util/qquickpath_p.h2
17 files changed, 168 insertions, 104 deletions
diff --git a/src/quick/designer/qqmldesignermetaobject.cpp b/src/quick/designer/qqmldesignermetaobject.cpp
index 46808f978b..0bfa72e9d4 100644
--- a/src/quick/designer/qqmldesignermetaobject.cpp
+++ b/src/quick/designer/qqmldesignermetaobject.cpp
@@ -140,9 +140,13 @@ void QQmlDesignerMetaObject::init(QObject *object, QQmlEngine *engine)
QObjectPrivate *op = QObjectPrivate::get(object);
op->metaObject = this;
- //create cache
- cache = m_cache = QQmlEnginePrivate::get(engine)->cache(this);
- cache->addref();
+ m_cache = QQmlEnginePrivate::get(engine)->cache(this);
+
+ if (m_cache != cache) {
+ m_cache->addref();
+ cache->release();
+ cache = m_cache;
+ }
//If our parent is not a VMEMetaObject we just se the flag to false again
if (constructedMetaData(metaData))
@@ -166,17 +170,16 @@ QQmlDesignerMetaObject::QQmlDesignerMetaObject(QObject *object, QQmlEngine *engi
if (ddata && ddata->propertyCache) {
cache->setParent(ddata->propertyCache);
cache->invalidate(engine, this);
+ ddata->propertyCache->release();
ddata->propertyCache = m_cache;
+ m_cache->addref();
}
}
QQmlDesignerMetaObject::~QQmlDesignerMetaObject()
{
- if (cache->count() > 1) // qml is crashing because the property cache is not removed from the engine
- cache->release();
- else
- m_type->release();
+ m_type->release();
nodeInstanceMetaObjectList.remove(this);
}
diff --git a/src/quick/items/qquickanchors.cpp b/src/quick/items/qquickanchors.cpp
index 193be7c45b..df33a0cc5c 100644
--- a/src/quick/items/qquickanchors.cpp
+++ b/src/quick/items/qquickanchors.cpp
@@ -39,19 +39,48 @@
#include "qquickanchors_p_p.h"
-#include "qquickitem.h"
#include "qquickitem_p.h"
#include <qqmlinfo.h>
QT_BEGIN_NAMESPACE
+static Q_ALWAYS_INLINE QQuickItem *readParentItem(QQuickItem *item)
+{
+ return QQuickItemPrivate::get(item)->parentItem;
+}
+
+static Q_ALWAYS_INLINE qreal readX(QQuickItem *item)
+{
+ return QQuickItemPrivate::get(item)->x;
+}
+
+static Q_ALWAYS_INLINE qreal readY(QQuickItem *item)
+{
+ return QQuickItemPrivate::get(item)->y;
+}
+
+static Q_ALWAYS_INLINE qreal readWidth(QQuickItem *item)
+{
+ return QQuickItemPrivate::get(item)->width;
+}
+
+static Q_ALWAYS_INLINE qreal readHeight(QQuickItem *item)
+{
+ return QQuickItemPrivate::get(item)->height;
+}
+
+static Q_ALWAYS_INLINE qreal readBaselineOffset(QQuickItem *item)
+{
+ return QQuickItemPrivate::get(item)->baselineOffset;
+}
+
//TODO: should we cache relationships, so we don't have to check each time (parent-child or sibling)?
//TODO: support non-parent, non-sibling (need to find lowest common ancestor)
static inline qreal hcenter(QQuickItem *item)
{
- qreal width = item->width();
+ qreal width = readWidth(item);
if (QQuickAnchors *anchors = QQuickItemPrivate::get(item)->_anchors) {
if (!QQuickAnchorsPrivate::get(anchors)->centerAligned)
return width / 2;
@@ -65,7 +94,7 @@ static inline qreal hcenter(QQuickItem *item)
static inline qreal vcenter(QQuickItem *item)
{
- qreal height = item->height();
+ qreal height = readHeight(item);
if (QQuickAnchors *anchors = QQuickItemPrivate::get(item)->_anchors) {
if (!QQuickAnchorsPrivate::get(anchors)->centerAligned)
return height / 2;
@@ -84,25 +113,25 @@ static qreal position(QQuickItem *item, QQuickAnchorLine::AnchorLine anchorLine)
qreal ret = 0.0;
switch (anchorLine) {
case QQuickAnchorLine::Left:
- ret = item->x();
+ ret = readX(item);
break;
case QQuickAnchorLine::Right:
- ret = item->x() + item->width();
+ ret = readX(item) + readWidth(item);
break;
case QQuickAnchorLine::Top:
- ret = item->y();
+ ret = readY(item);
break;
case QQuickAnchorLine::Bottom:
- ret = item->y() + item->height();
+ ret = readY(item) + readHeight(item);
break;
case QQuickAnchorLine::HCenter:
- ret = item->x() + hcenter(item);
+ ret = readX(item) + hcenter(item);
break;
case QQuickAnchorLine::VCenter:
- ret = item->y() + vcenter(item);
+ ret = readY(item) + vcenter(item);
break;
case QQuickAnchorLine::Baseline:
- ret = item->y() + item->baselineOffset();
+ ret = readY(item) + readBaselineOffset(item);
break;
default:
break;
@@ -112,7 +141,7 @@ static qreal position(QQuickItem *item, QQuickAnchorLine::AnchorLine anchorLine)
}
//position when origin is 0,0
-static qreal adjustedPosition(QQuickItem *item, QQuickAnchorLine::AnchorLine anchorLine)
+static inline qreal adjustedPosition(QQuickItem *item, QQuickAnchorLine::AnchorLine anchorLine)
{
qreal ret = 0.0;
switch (anchorLine) {
@@ -120,13 +149,13 @@ static qreal adjustedPosition(QQuickItem *item, QQuickAnchorLine::AnchorLine anc
ret = 0.0;
break;
case QQuickAnchorLine::Right:
- ret = item->width();
+ ret = readWidth(item);
break;
case QQuickAnchorLine::Top:
ret = 0.0;
break;
case QQuickAnchorLine::Bottom:
- ret = item->height();
+ ret = readHeight(item);
break;
case QQuickAnchorLine::HCenter:
ret = hcenter(item);
@@ -135,7 +164,7 @@ static qreal adjustedPosition(QQuickItem *item, QQuickAnchorLine::AnchorLine anc
ret = vcenter(item);
break;
case QQuickAnchorLine::Baseline:
- ret = item->baselineOffset();
+ ret = readBaselineOffset(item);
break;
default:
break;
@@ -175,12 +204,13 @@ void QQuickAnchorsPrivate::fillChanged()
qreal horizontalMargin = q->mirrored() ? rightMargin : leftMargin;
- if (fill == item->parentItem()) { //child-parent
+ if (fill == readParentItem(item)) { //child-parent
setItemPos(QPointF(horizontalMargin, topMargin));
- } else if (fill->parentItem() == item->parentItem()) { //siblings
- setItemPos(QPointF(fill->x()+horizontalMargin, fill->y()+topMargin));
+ } else if (readParentItem(fill) == readParentItem(item)) { //siblings
+ setItemPos(QPointF(readX(fill)+horizontalMargin, readY(fill) + topMargin));
}
- setItemSize(QSizeF(fill->width()-leftMargin-rightMargin, fill->height()-topMargin-bottomMargin));
+ setItemSize(QSizeF(readWidth(fill) - leftMargin - rightMargin,
+ readHeight(fill) - topMargin - bottomMargin));
--updatingFill;
} else {
@@ -200,12 +230,12 @@ void QQuickAnchorsPrivate::centerInChanged()
++updatingCenterIn;
qreal effectiveHCenterOffset = q->mirrored() ? -hCenterOffset : hCenterOffset;
- if (centerIn == item->parentItem()) {
- QPointF p(hcenter(item->parentItem()) - hcenter(item) + effectiveHCenterOffset,
- vcenter(item->parentItem()) - vcenter(item) + vCenterOffset);
+ if (centerIn == readParentItem(item)) {
+ QPointF p(hcenter(readParentItem(item)) - hcenter(item) + effectiveHCenterOffset,
+ vcenter(readParentItem(item)) - vcenter(item) + vCenterOffset);
setItemPos(p);
- } else if (centerIn->parentItem() == item->parentItem()) {
+ } else if (readParentItem(centerIn) == readParentItem(item)) {
QPointF p(centerIn->x() + hcenter(centerIn) - hcenter(item) + effectiveHCenterOffset,
centerIn->y() + vcenter(centerIn) - vcenter(item) + vCenterOffset);
setItemPos(p);
@@ -264,7 +294,7 @@ int QQuickAnchorsPrivate::calculateDependency(QQuickItem *controlItem)
return dependency;
if (fill == controlItem) {
- if (controlItem == item->parentItem())
+ if (controlItem == readParentItem(item))
dependency |= QQuickItemPrivate::SizeChange;
else //sibling
dependency |= QQuickItemPrivate::GeometryChange;
@@ -272,7 +302,7 @@ int QQuickAnchorsPrivate::calculateDependency(QQuickItem *controlItem)
}
if (centerIn == controlItem) {
- if (controlItem == item->parentItem())
+ if (controlItem == readParentItem(item))
dependency |= QQuickItemPrivate::SizeChange;
else //sibling
dependency |= QQuickItemPrivate::GeometryChange;
@@ -282,7 +312,7 @@ int QQuickAnchorsPrivate::calculateDependency(QQuickItem *controlItem)
if ((usedAnchors & QQuickAnchors::LeftAnchor && left.item == controlItem) ||
(usedAnchors & QQuickAnchors::RightAnchor && right.item == controlItem) ||
(usedAnchors & QQuickAnchors::HCenterAnchor && hCenter.item == controlItem)) {
- if (controlItem == item->parentItem())
+ if (controlItem == readParentItem(item))
dependency |= QQuickItemPrivate::WidthChange;
else //sibling
dependency |= QFlags<QQuickItemPrivate::GeometryChangeType>(QQuickItemPrivate::XChange | QQuickItemPrivate::WidthChange);
@@ -292,7 +322,7 @@ int QQuickAnchorsPrivate::calculateDependency(QQuickItem *controlItem)
(usedAnchors & QQuickAnchors::BottomAnchor && bottom.item == controlItem) ||
(usedAnchors & QQuickAnchors::VCenterAnchor && vCenter.item == controlItem) ||
(usedAnchors & QQuickAnchors::BaselineAnchor && baseline.item == controlItem)) {
- if (controlItem == item->parentItem())
+ if (controlItem == readParentItem(item))
dependency |= QQuickItemPrivate::HeightChange;
else //sibling
dependency |= QFlags<QQuickItemPrivate::GeometryChangeType>(QQuickItemPrivate::YChange | QQuickItemPrivate::HeightChange);
@@ -448,22 +478,36 @@ void QQuickAnchorsPrivate::updateOnComplete()
void QQuickAnchorsPrivate::update()
{
- fillChanged();
- centerInChanged();
- if (usedAnchors & QQuickAnchorLine::Horizontal_Mask)
- updateHorizontalAnchors();
- if (usedAnchors & QQuickAnchorLine::Vertical_Mask)
- updateVerticalAnchors();
+ if (!isItemComplete())
+ return;
+
+ if (fill) {
+ fillChanged();
+ } else if (centerIn) {
+ centerInChanged();
+ } else {
+ if (usedAnchors & QQuickAnchorLine::Horizontal_Mask)
+ updateHorizontalAnchors();
+ if (usedAnchors & QQuickAnchorLine::Vertical_Mask)
+ updateVerticalAnchors();
+ }
}
void QQuickAnchorsPrivate::itemGeometryChanged(QQuickItem *, const QRectF &newG, const QRectF &oldG)
{
- fillChanged();
- centerInChanged();
- if ((usedAnchors & QQuickAnchorLine::Horizontal_Mask) && (newG.x() != oldG.x() || newG.width() != oldG.width()))
- updateHorizontalAnchors();
- if ((usedAnchors & QQuickAnchorLine::Vertical_Mask) && (newG.y() != oldG.y() || newG.height() != oldG.height()))
- updateVerticalAnchors();
+ if (!isItemComplete())
+ return;
+
+ if (fill) {
+ fillChanged();
+ } else if (centerIn) {
+ centerInChanged();
+ } else {
+ if ((usedAnchors & QQuickAnchorLine::Horizontal_Mask) && (newG.x() != oldG.x() || newG.width() != oldG.width()))
+ updateHorizontalAnchors();
+ if ((usedAnchors & QQuickAnchorLine::Vertical_Mask) && (newG.y() != oldG.y() || newG.height() != oldG.height()))
+ updateVerticalAnchors();
+ }
}
QQuickItem *QQuickAnchors::fill() const
@@ -485,7 +529,7 @@ void QQuickAnchors::setFill(QQuickItem *f)
emit fillChanged();
return;
}
- if (f != d->item->parentItem() && f->parentItem() != d->item->parentItem()){
+ if (f != readParentItem(d->item) && readParentItem(f) != readParentItem(d->item)){
qmlInfo(d->item) << tr("Cannot anchor to an item that isn't a parent or sibling.");
return;
}
@@ -521,7 +565,7 @@ void QQuickAnchors::setCenterIn(QQuickItem* c)
emit centerInChanged();
return;
}
- if (c != d->item->parentItem() && c->parentItem() != d->item->parentItem()){
+ if (c != readParentItem(d->item) && readParentItem(c) != readParentItem(d->item)){
qmlInfo(d->item) << tr("Cannot anchor to an item that isn't a parent or sibling.");
return;
}
@@ -545,10 +589,10 @@ bool QQuickAnchorsPrivate::calcStretch(const QQuickAnchorLine &edge1,
QQuickAnchorLine::AnchorLine line,
qreal &stretch)
{
- bool edge1IsParent = (edge1.item == item->parentItem());
- bool edge2IsParent = (edge2.item == item->parentItem());
- bool edge1IsSibling = (edge1.item->parentItem() == item->parentItem());
- bool edge2IsSibling = (edge2.item->parentItem() == item->parentItem());
+ bool edge1IsParent = (edge1.item == readParentItem(item));
+ bool edge2IsParent = (edge2.item == readParentItem(item));
+ bool edge1IsSibling = (readParentItem(edge1.item) == readParentItem(item));
+ bool edge2IsSibling = (readParentItem(edge2.item) == readParentItem(item));
bool invalid = false;
if ((edge2IsParent && edge1IsParent) || (edge2IsSibling && edge1IsSibling)) {
@@ -556,10 +600,10 @@ bool QQuickAnchorsPrivate::calcStretch(const QQuickAnchorLine &edge1,
- (position(edge1.item, edge1.anchorLine) + offset1);
} else if (edge2IsParent && edge1IsSibling) {
stretch = (position(edge2.item, edge2.anchorLine) + offset2)
- - (position(item->parentItem(), line)
+ - (position(readParentItem(item), line)
+ position(edge1.item, edge1.anchorLine) + offset1);
} else if (edge2IsSibling && edge1IsParent) {
- stretch = (position(item->parentItem(), line) + position(edge2.item, edge2.anchorLine) + offset2)
+ stretch = (position(readParentItem(item), line) + position(edge2.item, edge2.anchorLine) + offset2)
- (position(edge1.item, edge1.anchorLine) + offset1);
} else
invalid = true;
@@ -588,9 +632,9 @@ void QQuickAnchorsPrivate::updateVerticalAnchors()
setItemHeight(height);
//Handle top
- if (top.item == item->parentItem()) {
+ if (top.item == readParentItem(item)) {
setItemY(adjustedPosition(top.item, top.anchorLine) + topMargin);
- } else if (top.item->parentItem() == item->parentItem()) {
+ } else if (readParentItem(top.item) == readParentItem(item)) {
setItemY(position(top.item, top.anchorLine) + topMargin);
}
} else if (usedAnchors & QQuickAnchors::BottomAnchor) {
@@ -604,27 +648,29 @@ void QQuickAnchorsPrivate::updateVerticalAnchors()
}
//Handle bottom
- if (bottom.item == item->parentItem()) {
- setItemY(adjustedPosition(bottom.item, bottom.anchorLine) - item->height() - bottomMargin);
- } else if (bottom.item->parentItem() == item->parentItem()) {
- setItemY(position(bottom.item, bottom.anchorLine) - item->height() - bottomMargin);
+ if (bottom.item == readParentItem(item)) {
+ setItemY(adjustedPosition(bottom.item, bottom.anchorLine) - readHeight(item) - bottomMargin);
+ } else if (readParentItem(bottom.item) == readParentItem(item)) {
+ setItemY(position(bottom.item, bottom.anchorLine) - readHeight(item) - bottomMargin);
}
} else if (usedAnchors & QQuickAnchors::VCenterAnchor) {
//(stetching handled above)
//Handle vCenter
- if (vCenter.item == item->parentItem()) {
+ if (vCenter.item == readParentItem(item)) {
setItemY(adjustedPosition(vCenter.item, vCenter.anchorLine)
- vcenter(item) + vCenterOffset);
- } else if (vCenter.item->parentItem() == item->parentItem()) {
+ } else if (readParentItem(vCenter.item) == readParentItem(item)) {
setItemY(position(vCenter.item, vCenter.anchorLine) - vcenter(item) + vCenterOffset);
}
} else if (usedAnchors & QQuickAnchors::BaselineAnchor) {
//Handle baseline
- if (baseline.item == item->parentItem()) {
- setItemY(adjustedPosition(baseline.item, baseline.anchorLine) - item->baselineOffset() + baselineOffset);
- } else if (baseline.item->parentItem() == item->parentItem()) {
- setItemY(position(baseline.item, baseline.anchorLine) - item->baselineOffset() + baselineOffset);
+ if (baseline.item == readParentItem(item)) {
+ setItemY(adjustedPosition(baseline.item, baseline.anchorLine)
+ - readBaselineOffset(item) + baselineOffset);
+ } else if (readParentItem(baseline.item) == readParentItem(item)) {
+ setItemY(position(baseline.item, baseline.anchorLine)
+ - readBaselineOffset(item) + baselineOffset);
}
}
--updatingVerticalAnchor;
@@ -693,9 +739,9 @@ void QQuickAnchorsPrivate::updateHorizontalAnchors()
setItemWidth(width);
//Handle left
- if (effectiveLeft.item == item->parentItem()) {
+ if (effectiveLeft.item == readParentItem(item)) {
setItemX(adjustedPosition(effectiveLeft.item, effectiveLeft.anchorLine) + effectiveLeftMargin);
- } else if (effectiveLeft.item->parentItem() == item->parentItem()) {
+ } else if (readParentItem(effectiveLeft.item) == readParentItem(item)) {
setItemX(position(effectiveLeft.item, effectiveLeft.anchorLine) + effectiveLeftMargin);
}
} else if (usedAnchors & effectiveRightAnchor) {
@@ -709,16 +755,18 @@ void QQuickAnchorsPrivate::updateHorizontalAnchors()
}
//Handle right
- if (effectiveRight.item == item->parentItem()) {
- setItemX(adjustedPosition(effectiveRight.item, effectiveRight.anchorLine) - item->width() - effectiveRightMargin);
- } else if (effectiveRight.item->parentItem() == item->parentItem()) {
- setItemX(position(effectiveRight.item, effectiveRight.anchorLine) - item->width() - effectiveRightMargin);
+ if (effectiveRight.item == readParentItem(item)) {
+ setItemX(adjustedPosition(effectiveRight.item, effectiveRight.anchorLine)
+ - readWidth(item) - effectiveRightMargin);
+ } else if (readParentItem(effectiveRight.item) == readParentItem(item)) {
+ setItemX(position(effectiveRight.item, effectiveRight.anchorLine)
+ - readWidth(item) - effectiveRightMargin);
}
} else if (usedAnchors & QQuickAnchors::HCenterAnchor) {
//Handle hCenter
- if (effectiveHorizontalCenter.item == item->parentItem()) {
+ if (effectiveHorizontalCenter.item == readParentItem(item)) {
setItemX(adjustedPosition(effectiveHorizontalCenter.item, effectiveHorizontalCenter.anchorLine) - hcenter(item) + effectiveHorizontalCenterOffset);
- } else if (effectiveHorizontalCenter.item->parentItem() == item->parentItem()) {
+ } else if (readParentItem(effectiveHorizontalCenter.item) == readParentItem(item)) {
setItemX(position(effectiveHorizontalCenter.item, effectiveHorizontalCenter.anchorLine) - hcenter(item) + effectiveHorizontalCenterOffset);
}
}
@@ -1254,7 +1302,7 @@ bool QQuickAnchorsPrivate::checkHAnchorValid(QQuickAnchorLine anchor) const
} else if (anchor.anchorLine & QQuickAnchorLine::Vertical_Mask) {
qmlInfo(item) << QQuickAnchors::tr("Cannot anchor a horizontal edge to a vertical edge.");
return false;
- } else if (anchor.item != item->parentItem() && anchor.item->parentItem() != item->parentItem()){
+ } else if (anchor.item != readParentItem(item) && readParentItem(anchor.item) != readParentItem(item)){
qmlInfo(item) << QQuickAnchors::tr("Cannot anchor to an item that isn't a parent or sibling.");
return false;
} else if (anchor.item == item) {
@@ -1291,7 +1339,7 @@ bool QQuickAnchorsPrivate::checkVAnchorValid(QQuickAnchorLine anchor) const
} else if (anchor.anchorLine & QQuickAnchorLine::Horizontal_Mask) {
qmlInfo(item) << QQuickAnchors::tr("Cannot anchor a vertical edge to a horizontal edge.");
return false;
- } else if (anchor.item != item->parentItem() && anchor.item->parentItem() != item->parentItem()){
+ } else if (anchor.item != readParentItem(item) && readParentItem(anchor.item) != readParentItem(item)){
qmlInfo(item) << QQuickAnchors::tr("Cannot anchor to an item that isn't a parent or sibling.");
return false;
} else if (anchor.item == item){
diff --git a/src/quick/items/qquickdrag.cpp b/src/quick/items/qquickdrag.cpp
index 4aa54b71df..126737418a 100644
--- a/src/quick/items/qquickdrag.cpp
+++ b/src/quick/items/qquickdrag.cpp
@@ -311,7 +311,7 @@ void QQuickDragAttached::setActive(bool active)
else if (d->dragType == QQuickDrag::Automatic) {
// There are different semantics than start() since startDrag()
// may be called after an internal drag is already started.
- active = true;
+ d->active = true;
emit activeChanged();
d->startDrag(d->supportedActions);
}
diff --git a/src/quick/items/qquickimagebase.cpp b/src/quick/items/qquickimagebase.cpp
index 8117baa2fe..60e31631c0 100644
--- a/src/quick/items/qquickimagebase.cpp
+++ b/src/quick/items/qquickimagebase.cpp
@@ -225,7 +225,7 @@ void QQuickImageBase::load()
// sourceSize is set. If sourceSize is not set then the provider default size
// will be used, as usual.
bool setDevicePixelRatio = false;
- if (!d->sourcesize.isValid()) {
+ if (d->sourcesize.isValid()) {
if (loadUrl.scheme() == QLatin1String("image")) {
setDevicePixelRatio = true;
} else {
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
index 6f8fc2e874..7a5f1a12e8 100644
--- a/src/quick/items/qquickitem.cpp
+++ b/src/quick/items/qquickitem.cpp
@@ -3111,7 +3111,6 @@ QQuickItemPrivate::QQuickItemPrivate()
, flags(0)
, widthValid(false)
, heightValid(false)
- , baselineOffsetValid(false)
, componentComplete(true)
, keepMouse(false)
, keepTouch(false)
@@ -3185,7 +3184,7 @@ void QQuickItemPrivate::init(QQuickItem *parent)
registerAccessorProperties();
- baselineOffsetValid = false;
+ baselineOffset = 0.0;
if (parent) {
q->setParentItem(parent);
@@ -4236,11 +4235,7 @@ QQuickAnchorLine QQuickItemPrivate::baseline() const
qreal QQuickItem::baselineOffset() const
{
Q_D(const QQuickItem);
- if (d->baselineOffsetValid) {
- return d->baselineOffset;
- } else {
- return 0.0;
- }
+ return d->baselineOffset;
}
void QQuickItem::setBaselineOffset(qreal offset)
@@ -4250,7 +4245,6 @@ void QQuickItem::setBaselineOffset(qreal offset)
return;
d->baselineOffset = offset;
- d->baselineOffsetValid = true;
for (int ii = 0; ii < d->changeListeners.count(); ++ii) {
const QQuickItemPrivate::ChangeListener &change = d->changeListeners.at(ii);
@@ -6246,6 +6240,8 @@ QPointF QQuickItem::position() const
void QQuickItem::setX(qreal v)
{
Q_D(QQuickItem);
+ if (qIsNaN(v))
+ return;
if (d->x == v)
return;
@@ -6261,6 +6257,8 @@ void QQuickItem::setX(qreal v)
void QQuickItem::setY(qreal v)
{
Q_D(QQuickItem);
+ if (qIsNaN(v))
+ return;
if (d->y == v)
return;
diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h
index 5a28b202fd..ad649e5b5f 100644
--- a/src/quick/items/qquickitem_p.h
+++ b/src/quick/items/qquickitem_p.h
@@ -402,7 +402,6 @@ public:
quint32 flags:5;
bool widthValid:1;
bool heightValid:1;
- bool baselineOffsetValid:1;
bool componentComplete:1;
bool keepMouse:1;
bool keepTouch:1;
@@ -411,8 +410,8 @@ public:
bool antialiasing:1;
bool focus:1;
bool activeFocus:1;
- // Bit 16
bool notifiedFocus:1;
+ // Bit 16
bool notifiedActiveFocus:1;
bool filtersChildMouseEvents:1;
bool explicitVisible:1;
@@ -428,8 +427,8 @@ public:
bool isAccessible:1;
bool culled:1;
bool hasCursor:1;
- // Bit 32
bool hasCursorInChild:1;
+ // Bit 32
bool activeFocusOnTab:1;
bool implicitAntialiasing:1;
bool antialiasingValid:1;
diff --git a/src/quick/items/qquickitemgrabresult.cpp b/src/quick/items/qquickitemgrabresult.cpp
index 6822e4042c..d05ecc9076 100644
--- a/src/quick/items/qquickitemgrabresult.cpp
+++ b/src/quick/items/qquickitemgrabresult.cpp
@@ -58,6 +58,7 @@ class QQuickItemGrabResultPrivate : public QObjectPrivate
public:
QQuickItemGrabResultPrivate()
: cacheEntry(0)
+ , qmlEngine(0)
, texture(0)
{
}
diff --git a/src/quick/items/qquickpainteditem.cpp b/src/quick/items/qquickpainteditem.cpp
index 707214e8de..75919d0791 100644
--- a/src/quick/items/qquickpainteditem.cpp
+++ b/src/quick/items/qquickpainteditem.cpp
@@ -663,4 +663,11 @@ QSGTextureProvider *QQuickPaintedItem::textureProvider() const
return d->textureProvider;
}
+void QQuickPaintedItem::itemChange(ItemChange change, const ItemChangeData &value)
+{
+ if (change == ItemDevicePixelRatioHasChanged)
+ update();
+ QQuickItem::itemChange(change, value);
+}
+
QT_END_NAMESPACE
diff --git a/src/quick/items/qquickpainteditem.h b/src/quick/items/qquickpainteditem.h
index f9e3c91a42..e8b471ac01 100644
--- a/src/quick/items/qquickpainteditem.h
+++ b/src/quick/items/qquickpainteditem.h
@@ -121,6 +121,7 @@ protected:
QQuickPaintedItem(QQuickPaintedItemPrivate &dd, QQuickItem *parent = Q_NULLPTR);
QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) Q_DECL_OVERRIDE;
void releaseResources() Q_DECL_OVERRIDE;
+ void itemChange(ItemChange, const ItemChangeData &) Q_DECL_OVERRIDE;
private Q_SLOTS:
void invalidateSceneGraph();
diff --git a/src/quick/items/qquickshadereffect.cpp b/src/quick/items/qquickshadereffect.cpp
index 41b7ea3896..d5c0cc8180 100644
--- a/src/quick/items/qquickshadereffect.cpp
+++ b/src/quick/items/qquickshadereffect.cpp
@@ -1041,7 +1041,6 @@ QSGNode *QQuickShaderEffect::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeDa
builder.appendSourceFile(QStringLiteral(":/qt-project.org/items/shaders/shadereffect.vert"));
s.sourceCode[Key::VertexShader] = builder.source();
}
- s.className = metaObject()->className();
material->setProgramSource(s);
material->attributes = m_common.attributes;
diff --git a/src/quick/items/qquickshadereffectnode.cpp b/src/quick/items/qquickshadereffectnode.cpp
index a06fe26a9c..246a713dca 100644
--- a/src/quick/items/qquickshadereffectnode.cpp
+++ b/src/quick/items/qquickshadereffectnode.cpp
@@ -333,8 +333,6 @@ const char *QQuickCustomMaterialShader::fragmentShader() const
bool QQuickShaderEffectMaterialKey::operator == (const QQuickShaderEffectMaterialKey &other) const
{
- if (className != other.className)
- return false;
for (int shaderType = 0; shaderType < ShaderTypeCount; ++shaderType) {
if (sourceCode[shaderType] != other.sourceCode[shaderType])
return false;
@@ -349,7 +347,7 @@ bool QQuickShaderEffectMaterialKey::operator != (const QQuickShaderEffectMateria
uint qHash(const QQuickShaderEffectMaterialKey &key)
{
- uint hash = qHash((const void *)key.className);
+ uint hash = 1;
typedef QQuickShaderEffectMaterialKey Key;
for (int shaderType = 0; shaderType < Key::ShaderTypeCount; ++shaderType)
hash = hash * 31337 + qHash(key.sourceCode[shaderType]);
diff --git a/src/quick/items/qquickshadereffectnode_p.h b/src/quick/items/qquickshadereffectnode_p.h
index cc016d13a7..ff32f4e290 100644
--- a/src/quick/items/qquickshadereffectnode_p.h
+++ b/src/quick/items/qquickshadereffectnode_p.h
@@ -71,7 +71,6 @@ struct QQuickShaderEffectMaterialKey {
};
QByteArray sourceCode[ShaderTypeCount];
- const char *className;
bool operator == (const QQuickShaderEffectMaterialKey &other) const;
bool operator != (const QQuickShaderEffectMaterialKey &other) const;
diff --git a/src/quick/items/qquicktext_p.h b/src/quick/items/qquicktext_p.h
index 0b35ad5f91..40dbd51f39 100644
--- a/src/quick/items/qquicktext_p.h
+++ b/src/quick/items/qquicktext_p.h
@@ -254,16 +254,16 @@ Q_SIGNALS:
void fontChanged(const QFont &font);
void colorChanged();
void linkColorChanged();
- void styleChanged(TextStyle style);
+ void styleChanged(QQuickText::TextStyle style);
void styleColorChanged();
- void horizontalAlignmentChanged(HAlignment alignment);
- void verticalAlignmentChanged(VAlignment alignment);
+ void horizontalAlignmentChanged(QQuickText::HAlignment alignment);
+ void verticalAlignmentChanged(QQuickText::VAlignment alignment);
void wrapModeChanged();
void lineCountChanged();
void truncatedChanged();
void maximumLineCountChanged();
- void textFormatChanged(TextFormat textFormat);
- void elideModeChanged(TextElideMode mode);
+ void textFormatChanged(QQuickText::TextFormat textFormat);
+ void elideModeChanged(QQuickText::TextElideMode mode);
void contentSizeChanged();
void lineHeightChanged(qreal lineHeight);
void lineHeightModeChanged(LineHeightMode mode);
diff --git a/src/quick/items/qquicktextinput_p.h b/src/quick/items/qquicktextinput_p.h
index 06ca1acb0d..211d9146fc 100644
--- a/src/quick/items/qquicktextinput_p.h
+++ b/src/quick/items/qquicktextinput_p.h
@@ -319,8 +319,8 @@ Q_SIGNALS:
void selectionColorChanged();
void selectedTextColorChanged();
void fontChanged(const QFont &font);
- void horizontalAlignmentChanged(HAlignment alignment);
- void verticalAlignmentChanged(VAlignment alignment);
+ void horizontalAlignmentChanged(QQuickTextInput::HAlignment alignment);
+ void verticalAlignmentChanged(QQuickTextInput::VAlignment alignment);
void wrapModeChanged();
void readOnlyChanged(bool isReadOnly);
void cursorVisibleChanged(bool isCursorVisible);
@@ -328,7 +328,7 @@ Q_SIGNALS:
void maximumLengthChanged(int maximumLength);
void validatorChanged();
void inputMaskChanged(const QString &inputMask);
- void echoModeChanged(EchoMode echoMode);
+ void echoModeChanged(QQuickTextInput::EchoMode echoMode);
void passwordCharacterChanged();
Q_REVISION(3) void passwordMaskDelayChanged(int delay);
void displayTextChanged();
@@ -336,7 +336,7 @@ Q_SIGNALS:
void activeFocusOnPressChanged(bool activeFocusOnPress);
void autoScrollChanged(bool autoScroll);
void selectByMouseChanged(bool selectByMouse);
- void mouseSelectionModeChanged(SelectionMode mode);
+ void mouseSelectionModeChanged(QQuickTextInput::SelectionMode mode);
void persistentSelectionChanged();
void canPasteChanged();
void canUndoChanged();
diff --git a/src/quick/scenegraph/util/qsgatlastexture.cpp b/src/quick/scenegraph/util/qsgatlastexture.cpp
index 68dc813933..a93e7bbd30 100644
--- a/src/quick/scenegraph/util/qsgatlastexture.cpp
+++ b/src/quick/scenegraph/util/qsgatlastexture.cpp
@@ -127,6 +127,7 @@ Atlas::Atlas(const QSize &size)
: m_allocator(size)
, m_texture_id(0)
, m_size(size)
+ , m_atlas_transient_image_threshold(0)
, m_allocated(false)
{
@@ -176,6 +177,11 @@ Atlas::Atlas(const QSize &size)
m_use_bgra_fallback = qEnvironmentVariableIsSet("QSG_ATLAS_USE_BGRA_FALLBACK");
m_debug_overlay = qEnvironmentVariableIsSet("QSG_ATLAS_OVERLAY");
+
+ // images smaller than this will retain their QImage.
+ // by default no images are retained (favoring memory)
+ // set to a very large value to retain all images (allowing quick removal from the atlas)
+ m_atlas_transient_image_threshold = qt_sg_envInt("QSG_ATLAS_TRANSIENT_IMAGE_THRESHOLD", 0);
}
Atlas::~Atlas()
@@ -398,7 +404,10 @@ void Atlas::bind(QSGTexture::Filtering filtering)
} else {
upload(t);
}
- t->releaseImage();
+ const QSize textureSize = t->textureSize();
+ if (textureSize.width() > m_atlas_transient_image_threshold ||
+ textureSize.height() > m_atlas_transient_image_threshold)
+ t->releaseImage();
qCDebug(QSG_LOG_TIME_TEXTURE).nospace() << "atlastexture uploaded in: " << qsg_renderer_timer.elapsed()
<< "ms (" << t->textureSize().width() << "x"
diff --git a/src/quick/scenegraph/util/qsgatlastexture_p.h b/src/quick/scenegraph/util/qsgatlastexture_p.h
index c6f1e72a4d..d6c0109c98 100644
--- a/src/quick/scenegraph/util/qsgatlastexture_p.h
+++ b/src/quick/scenegraph/util/qsgatlastexture_p.h
@@ -116,6 +116,8 @@ private:
GLuint m_internalFormat;
GLuint m_externalFormat;
+ int m_atlas_transient_image_threshold;
+
uint m_allocated : 1;
uint m_use_bgra_fallback: 1;
diff --git a/src/quick/util/qquickpath_p.h b/src/quick/util/qquickpath_p.h
index d554e2156a..e2c99de44e 100644
--- a/src/quick/util/qquickpath_p.h
+++ b/src/quick/util/qquickpath_p.h
@@ -335,7 +335,7 @@ class Q_AUTOTEST_EXPORT QQuickPathPercent : public QQuickPathElement
Q_OBJECT
Q_PROPERTY(qreal value READ value WRITE setValue NOTIFY valueChanged)
public:
- QQuickPathPercent(QObject *parent=0) : QQuickPathElement(parent) {}
+ QQuickPathPercent(QObject *parent=0) : QQuickPathElement(parent), _value(0) {}
qreal value() const;
void setValue(qreal value);