diff options
Diffstat (limited to 'src/quick')
332 files changed, 2717 insertions, 1054 deletions
diff --git a/src/quick/designer/designersupport.cpp b/src/quick/designer/designersupport.cpp index 4ffd3fedff..a5ddc6dcc7 100644 --- a/src/quick/designer/designersupport.cpp +++ b/src/quick/designer/designersupport.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/designer/designersupport.h b/src/quick/designer/designersupport.h index 69463fdbe0..25ea8372ce 100644 --- a/src/quick/designer/designersupport.h +++ b/src/quick/designer/designersupport.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/checksync.pl b/src/quick/items/checksync.pl index 94855fcadf..42065b5400 100755 --- a/src/quick/items/checksync.pl +++ b/src/quick/items/checksync.pl @@ -3,7 +3,7 @@ ## ## Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ## All rights reserved. -## Contact: Nokia Corporation (qt-info@nokia.com) +## Contact: http://www.qt-project.org/ ## ## This file is part of the Declarative module of the Qt Toolkit. ## diff --git a/src/quick/items/context2d/qquickcanvasitem.cpp b/src/quick/items/context2d/qquickcanvasitem.cpp index e8decdc4ed..c8f9553129 100644 --- a/src/quick/items/context2d/qquickcanvasitem.cpp +++ b/src/quick/items/context2d/qquickcanvasitem.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcanvasitem_p.h b/src/quick/items/context2d/qquickcanvasitem_p.h index 70ca475c96..de303d4e7e 100644 --- a/src/quick/items/context2d/qquickcanvasitem_p.h +++ b/src/quick/items/context2d/qquickcanvasitem_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2d.cpp b/src/quick/items/context2d/qquickcontext2d.cpp index d5d57132bf..5493ba9331 100644 --- a/src/quick/items/context2d/qquickcontext2d.cpp +++ b/src/quick/items/context2d/qquickcontext2d.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2d_p.h b/src/quick/items/context2d/qquickcontext2d_p.h index 0f320d9a7f..2f3b3309d3 100644 --- a/src/quick/items/context2d/qquickcontext2d_p.h +++ b/src/quick/items/context2d/qquickcontext2d_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp b/src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp index 476e7e2cf8..c77ff236be 100644 --- a/src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp +++ b/src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h b/src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h index 2029198648..b9cf03081d 100644 --- a/src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h +++ b/src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dnode.cpp b/src/quick/items/context2d/qquickcontext2dnode.cpp index 445cde8964..d2508bd996 100644 --- a/src/quick/items/context2d/qquickcontext2dnode.cpp +++ b/src/quick/items/context2d/qquickcontext2dnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dnode_p.h b/src/quick/items/context2d/qquickcontext2dnode_p.h index a00c939896..c98077cff2 100644 --- a/src/quick/items/context2d/qquickcontext2dnode_p.h +++ b/src/quick/items/context2d/qquickcontext2dnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dtexture.cpp b/src/quick/items/context2d/qquickcontext2dtexture.cpp index bcbb9b7c29..1b3b13dd48 100644 --- a/src/quick/items/context2d/qquickcontext2dtexture.cpp +++ b/src/quick/items/context2d/qquickcontext2dtexture.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dtexture_p.h b/src/quick/items/context2d/qquickcontext2dtexture_p.h index d055db7c06..fdcac0f2d9 100644 --- a/src/quick/items/context2d/qquickcontext2dtexture_p.h +++ b/src/quick/items/context2d/qquickcontext2dtexture_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dtile.cpp b/src/quick/items/context2d/qquickcontext2dtile.cpp index 6217c66094..a04f00591b 100644 --- a/src/quick/items/context2d/qquickcontext2dtile.cpp +++ b/src/quick/items/context2d/qquickcontext2dtile.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/context2d/qquickcontext2dtile_p.h b/src/quick/items/context2d/qquickcontext2dtile_p.h index a38384d3c7..75c2558db0 100644 --- a/src/quick/items/context2d/qquickcontext2dtile_p.h +++ b/src/quick/items/context2d/qquickcontext2dtile_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickaccessibleattached.cpp b/src/quick/items/qquickaccessibleattached.cpp index 6b83dbc5b2..b328583676 100644 --- a/src/quick/items/qquickaccessibleattached.cpp +++ b/src/quick/items/qquickaccessibleattached.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickaccessibleattached_p.h b/src/quick/items/qquickaccessibleattached_p.h index cb9892b34c..d87cdfc238 100644 --- a/src/quick/items/qquickaccessibleattached_p.h +++ b/src/quick/items/qquickaccessibleattached_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -56,7 +56,6 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -QT_MODULE(Declarative) class Q_QUICK_PRIVATE_EXPORT QQuickAccessibleAttached : public QObject { diff --git a/src/quick/items/qquickanchors.cpp b/src/quick/items/qquickanchors.cpp index 36369ba262..f139821d92 100644 --- a/src/quick/items/qquickanchors.cpp +++ b/src/quick/items/qquickanchors.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanchors_p.h b/src/quick/items/qquickanchors_p.h index fb9dccd4cc..0a1d899fd9 100644 --- a/src/quick/items/qquickanchors_p.h +++ b/src/quick/items/qquickanchors_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanchors_p_p.h b/src/quick/items/qquickanchors_p_p.h index 1373aecd60..dbd6bac931 100644 --- a/src/quick/items/qquickanchors_p_p.h +++ b/src/quick/items/qquickanchors_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanimatedimage.cpp b/src/quick/items/qquickanimatedimage.cpp index b07106d4f1..753dd01acf 100644 --- a/src/quick/items/qquickanimatedimage.cpp +++ b/src/quick/items/qquickanimatedimage.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanimatedimage_p.h b/src/quick/items/qquickanimatedimage_p.h index d4160605aa..485c3026f2 100644 --- a/src/quick/items/qquickanimatedimage_p.h +++ b/src/quick/items/qquickanimatedimage_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanimatedimage_p_p.h b/src/quick/items/qquickanimatedimage_p_p.h index 2f9ba6a7f1..335ff9ad89 100644 --- a/src/quick/items/qquickanimatedimage_p_p.h +++ b/src/quick/items/qquickanimatedimage_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanimation.cpp b/src/quick/items/qquickanimation.cpp index 0aa0acdc0a..517b504640 100644 --- a/src/quick/items/qquickanimation.cpp +++ b/src/quick/items/qquickanimation.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanimation_p.h b/src/quick/items/qquickanimation_p.h index cf2e41f7bb..f6de6da9fb 100644 --- a/src/quick/items/qquickanimation_p.h +++ b/src/quick/items/qquickanimation_p.h @@ -1,9 +1,9 @@ // Commit: e39a2e39451bf106a9845f8a60fc571faaa4dde5 /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickanimation_p_p.h b/src/quick/items/qquickanimation_p_p.h index c15dce91fe..6bab7780db 100644 --- a/src/quick/items/qquickanimation_p_p.h +++ b/src/quick/items/qquickanimation_p_p.h @@ -1,9 +1,9 @@ // Commit: 0ade09152067324f74678f2de4d447b6e0280600 /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickborderimage.cpp b/src/quick/items/qquickborderimage.cpp index c867f90763..72457a3fc4 100644 --- a/src/quick/items/qquickborderimage.cpp +++ b/src/quick/items/qquickborderimage.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickborderimage_p.h b/src/quick/items/qquickborderimage_p.h index 88fb28081d..d7a48333a2 100644 --- a/src/quick/items/qquickborderimage_p.h +++ b/src/quick/items/qquickborderimage_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickborderimage_p_p.h b/src/quick/items/qquickborderimage_p_p.h index d2fa799a24..e551cd2d9d 100644 --- a/src/quick/items/qquickborderimage_p_p.h +++ b/src/quick/items/qquickborderimage_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickcanvas.cpp b/src/quick/items/qquickcanvas.cpp index 9967e853ea..8866ec5436 100644 --- a/src/quick/items/qquickcanvas.cpp +++ b/src/quick/items/qquickcanvas.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -718,9 +718,8 @@ bool QQuickCanvas::event(QEvent *e) QTouchEvent *touch = static_cast<QTouchEvent *>(e); d->translateTouchEvent(touch); d->deliverTouchEvent(touch); - if (!touch->isAccepted()) - return false; - break; + + return touch->isAccepted(); } case QEvent::Leave: d->clearHover(); diff --git a/src/quick/items/qquickcanvas.h b/src/quick/items/qquickcanvas.h index de82e8386e..46d2702dc4 100644 --- a/src/quick/items/qquickcanvas.h +++ b/src/quick/items/qquickcanvas.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickcanvas_p.h b/src/quick/items/qquickcanvas_p.h index 6632324380..b75e5c92c8 100644 --- a/src/quick/items/qquickcanvas_p.h +++ b/src/quick/items/qquickcanvas_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickclipnode.cpp b/src/quick/items/qquickclipnode.cpp index 4aeb2dcf69..29d05ef05c 100644 --- a/src/quick/items/qquickclipnode.cpp +++ b/src/quick/items/qquickclipnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickclipnode_p.h b/src/quick/items/qquickclipnode_p.h index ee85409c9d..fa5e47b253 100644 --- a/src/quick/items/qquickclipnode_p.h +++ b/src/quick/items/qquickclipnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickdrag.cpp b/src/quick/items/qquickdrag.cpp index b80a8fb6fa..507ae4b489 100644 --- a/src/quick/items/qquickdrag.cpp +++ b/src/quick/items/qquickdrag.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickdrag_p.h b/src/quick/items/qquickdrag_p.h index 1971de827f..cfcba51064 100644 --- a/src/quick/items/qquickdrag_p.h +++ b/src/quick/items/qquickdrag_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickdroparea.cpp b/src/quick/items/qquickdroparea.cpp index d45d85a889..a811d01865 100644 --- a/src/quick/items/qquickdroparea.cpp +++ b/src/quick/items/qquickdroparea.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickdroparea_p.h b/src/quick/items/qquickdroparea_p.h index 066329958d..3572f13c5d 100644 --- a/src/quick/items/qquickdroparea_p.h +++ b/src/quick/items/qquickdroparea_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickevents.cpp b/src/quick/items/qquickevents.cpp index 4b39855a53..469409eeed 100644 --- a/src/quick/items/qquickevents.cpp +++ b/src/quick/items/qquickevents.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickevents_p_p.h b/src/quick/items/qquickevents_p_p.h index 3d1e4826d5..c54d5c7eff 100644 --- a/src/quick/items/qquickevents_p_p.h +++ b/src/quick/items/qquickevents_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index 6df84f3d97..5ac189889c 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickflickable_p.h b/src/quick/items/qquickflickable_p.h index 2c8e24365a..e215e4d118 100644 --- a/src/quick/items/qquickflickable_p.h +++ b/src/quick/items/qquickflickable_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickflickable_p_p.h b/src/quick/items/qquickflickable_p_p.h index b1375ddc69..d5f410786d 100644 --- a/src/quick/items/qquickflickable_p_p.h +++ b/src/quick/items/qquickflickable_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickflipable.cpp b/src/quick/items/qquickflipable.cpp index b2e5da1218..c48f358392 100644 --- a/src/quick/items/qquickflipable.cpp +++ b/src/quick/items/qquickflipable.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickflipable_p.h b/src/quick/items/qquickflipable_p.h index 7fa616ca9f..0c392e0466 100644 --- a/src/quick/items/qquickflipable_p.h +++ b/src/quick/items/qquickflipable_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickfocusscope.cpp b/src/quick/items/qquickfocusscope.cpp index 0c2678d6c2..8cf1750c24 100644 --- a/src/quick/items/qquickfocusscope.cpp +++ b/src/quick/items/qquickfocusscope.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickfocusscope_p.h b/src/quick/items/qquickfocusscope_p.h index 7910c2be35..c69bd420c2 100644 --- a/src/quick/items/qquickfocusscope_p.h +++ b/src/quick/items/qquickfocusscope_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index 0484c60a9d..f25f2f8196 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -59,6 +59,8 @@ QT_BEGIN_NAMESPACE #define QML_FLICK_SNAPONETHRESHOLD 30 #endif +//#define DEBUG_DELEGATE_LIFECYCLE + //---------------------------------------------------------------------------- class FxGridItemSG : public FxViewItem @@ -171,17 +173,16 @@ public: virtual FxViewItem *newViewItem(int index, QQuickItem *item); virtual void repositionPackageItemAt(QQuickItem *item, int index); - virtual void resetItemPosition(FxViewItem *item, FxViewItem *toItem); - virtual void resetFirstItemPosition(); - virtual void adjustFirstItem(qreal forwards, qreal backwards); + virtual void resetFirstItemPosition(qreal pos = 0.0); + virtual void adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible); virtual void createHighlight(); virtual void updateHighlight(); virtual void resetHighlightPosition(); virtual void setPosition(qreal pos); - virtual void layoutVisibleItems(); - virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems); + virtual void layoutVisibleItems(int fromModelIndex = 0); + virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, QList<FxViewItem *> *addedItems); virtual bool needsRefillForAddedOrRemovedIndex(int index) const; virtual qreal headerSize() const; @@ -195,7 +196,6 @@ public: virtual void initializeCurrentItem(); virtual void updateViewport(); - virtual void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry); virtual void fixupPosition(); virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent); virtual void flick(QQuickItemViewPrivate::AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, @@ -449,7 +449,9 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d bool changed = false; while (modelIndex < model->count() && rowPos <= fillTo + rowSize()*(columns - colNum)/(columns+1)) { -// qDebug() << "refill: append item" << modelIndex << colPos << rowPos; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: append item" << modelIndex << colPos << rowPos; +#endif if (!(item = static_cast<FxGridItemSG*>(createItem(modelIndex, doBuffer)))) break; item->setPosition(colPos, rowPos); @@ -464,6 +466,9 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d changed = true; } + if (doBuffer && requestedIndex != -1) // already waiting for an item + return changed; + // Find first column if (visibleItems.count()) { FxGridItemSG *firstItem = static_cast<FxGridItemSG*>(visibleItems.first()); @@ -480,7 +485,9 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d // Prepend colPos = colNum * colSize(); while (visibleIndex > 0 && rowPos + rowSize() - 1 >= fillFrom - rowSize()*(colNum+1)/(columns+1)){ -// qDebug() << "refill: prepend item" << visibleIndex-1 << "top pos" << rowPos << colPos; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: prepend item" << visibleIndex-1 << "top pos" << rowPos << colPos; +#endif if (!(item = static_cast<FxGridItemSG*>(createItem(visibleIndex-1, doBuffer)))) break; --visibleIndex; @@ -508,7 +515,9 @@ bool QQuickGridViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer && item->rowPos()+rowSize()-1 < bufferFrom - rowSize()*(item->colPos()/colSize()+1)/(columns+1)) { if (item->attached->delayRemove()) break; -// qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endRowPos(); +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endRowPos(); +#endif if (item->index != -1) visibleIndex++; visibleItems.removeFirst(); @@ -520,7 +529,9 @@ bool QQuickGridViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer && item->rowPos() > bufferTo + rowSize()*(columns - item->colPos()/colSize())/(columns+1)) { if (item->attached->delayRemove()) break; -// qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1; +#endif visibleItems.removeLast(); releaseItem(item); changed = true; @@ -544,7 +555,7 @@ void QQuickGridViewPrivate::updateViewport() QQuickItemViewPrivate::updateViewport(); } -void QQuickGridViewPrivate::layoutVisibleItems() +void QQuickGridViewPrivate::layoutVisibleItems(int fromModelIndex) { if (visibleItems.count()) { const qreal from = isContentFlowReversed() ? -position() - size() : position(); @@ -566,8 +577,10 @@ void QQuickGridViewPrivate::layoutVisibleItems() rowPos += rowSize(); } colPos = col * colSize(); - item->setPosition(colPos, rowPos); - item->item->setVisible(rowPos + rowSize() >= from && rowPos <= to); + if (item->index >= fromModelIndex) { + item->setPosition(colPos, rowPos); + item->item->setVisible(rowPos + rowSize() >= from && rowPos <= to); + } } } } @@ -589,26 +602,21 @@ void QQuickGridViewPrivate::repositionPackageItemAt(QQuickItem *item, int index) } } -void QQuickGridViewPrivate::resetItemPosition(FxViewItem *item, FxViewItem *toItem) -{ - if (item == toItem) - return; - FxGridItemSG *toGridItem = static_cast<FxGridItemSG*>(toItem); - static_cast<FxGridItemSG*>(item)->setPosition(toGridItem->colPos(), toGridItem->rowPos()); -} - -void QQuickGridViewPrivate::resetFirstItemPosition() +void QQuickGridViewPrivate::resetFirstItemPosition(qreal pos) { FxGridItemSG *item = static_cast<FxGridItemSG*>(visibleItems.first()); - item->setPosition(0, 0); + item->setPosition(0, pos); } -void QQuickGridViewPrivate::adjustFirstItem(qreal forwards, qreal backwards) +void QQuickGridViewPrivate::adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible) { if (!visibleItems.count()) return; - int moveCount = (forwards / rowSize()) - (backwards / rowSize()); + int moveCount = (forwards - backwards) / rowSize(); + + if (changeBeforeVisible) + moveCount += (changeBeforeVisible%columns) - (columns - 1); FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(visibleItems.first()); gridItem->setPosition(gridItem->colPos(), gridItem->rowPos() + ((moveCount / columns) * rowSize())); @@ -795,21 +803,6 @@ void QQuickGridViewPrivate::initializeCurrentItem() } } -void QQuickGridViewPrivate::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) -{ - Q_Q(QQuickGridView); - QQuickItemViewPrivate::itemGeometryChanged(item, newGeometry, oldGeometry); - if (!q->isComponentComplete()) - return; - if (item == q) { - if (newGeometry.height() != oldGeometry.height() || newGeometry.width() != oldGeometry.width()) { - updateViewport(); - forceLayout = true; - q->polish(); - } - } -} - void QQuickGridViewPrivate::fixupPosition() { moveReason = Other; @@ -1447,7 +1440,7 @@ void QQuickGridView::setCellWidth(qreal cellWidth) d->updateViewport(); emit cellWidthChanged(); d->forceLayout = true; - d->layout(); + polish(); } } @@ -1465,7 +1458,7 @@ void QQuickGridView::setCellHeight(qreal cellHeight) d->updateViewport(); emit cellHeightChanged(); d->forceLayout = true; - d->layout(); + polish(); } } /*! @@ -1549,14 +1542,6 @@ void QQuickGridView::viewportMoved() return; d->inViewportMoved = true; - // Set visibility of items to eliminate cost of items outside the visible area. - qreal from = d->isContentFlowReversed() ? -d->position()-d->size() : d->position(); - qreal to = d->isContentFlowReversed() ? -d->position() : d->position()+d->size(); - for (int i = 0; i < d->visibleItems.count(); ++i) { - FxGridItemSG *item = static_cast<FxGridItemSG*>(d->visibleItems.at(i)); - item->item->setVisible(item->rowPos() + d->rowSize() >= from && item->rowPos() <= to); - } - if (yflick()) d->bufferMode = d->vData.smoothVelocity < 0 ? QQuickItemViewPrivate::BufferBefore : QQuickItemViewPrivate::BufferAfter; else if (d->isRightToLeftTopToBottom()) @@ -1565,6 +1550,15 @@ void QQuickGridView::viewportMoved() d->bufferMode = d->hData.smoothVelocity < 0 ? QQuickItemViewPrivate::BufferBefore : QQuickItemViewPrivate::BufferAfter; d->refill(); + + // Set visibility of items to eliminate cost of items outside the visible area. + qreal from = d->isContentFlowReversed() ? -d->position()-d->size() : d->position(); + qreal to = d->isContentFlowReversed() ? -d->position() : d->position()+d->size(); + for (int i = 0; i < d->visibleItems.count(); ++i) { + FxGridItemSG *item = static_cast<FxGridItemSG*>(d->visibleItems.at(i)); + item->item->setVisible(item->rowPos() + d->rowSize() >= from && item->rowPos() <= to); + } + if (d->hData.flicking || d->vData.flicking || d->hData.moving || d->vData.moving) d->moveReason = QQuickGridViewPrivate::Mouse; if (d->moveReason != QQuickGridViewPrivate::SetIndex) { @@ -1775,7 +1769,7 @@ void QQuickGridView::moveCurrentIndexRight() } } -bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, ChangeResult *insertResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems) +bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, ChangeResult *insertResult, QList<FxViewItem *> *addedItems) { Q_Q(QQuickGridView); @@ -1845,7 +1839,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In while (i >= 0) { if (rowPos > from && insertionIdx < visibleIndex) { // item won't be visible, just note the size for repositioning - insertResult->sizeChangesBeforeVisiblePos += rowSize(); + insertResult->changeBeforeVisible++; } else { // item is before first visible e.g. in cache buffer FxViewItem *item = 0; @@ -1874,7 +1868,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In } else { int i = 0; int to = buffer+tempPos+size()-1; - while (i < count && rowPos <= to + rowSize()*(columns - (colPos/colSize()))/qreal(columns)) { + while (i < count && rowPos <= to + rowSize()*(columns - colNum)/qreal(columns+1)) { FxViewItem *item = 0; if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i)))) item->index = modelIndex + i; @@ -1886,7 +1880,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In item->item->setVisible(true); visibleItems.insert(index, item); if (index == 0) - *newVisibleItemsFirst = true; + insertResult->changedFirstItem = true; if (!change.isMove()) addedItems->append(item); insertResult->sizeChangesAfterVisiblePos += rowSize(); diff --git a/src/quick/items/qquickgridview_p.h b/src/quick/items/qquickgridview_p.h index c9b2f66829..0f86acf3ea 100644 --- a/src/quick/items/qquickgridview_p.h +++ b/src/quick/items/qquickgridview_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimage.cpp b/src/quick/items/qquickimage.cpp index 37a99a93b6..71712ec616 100644 --- a/src/quick/items/qquickimage.cpp +++ b/src/quick/items/qquickimage.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimage_p.h b/src/quick/items/qquickimage_p.h index e6d6a72020..98bafadf3f 100644 --- a/src/quick/items/qquickimage_p.h +++ b/src/quick/items/qquickimage_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimage_p_p.h b/src/quick/items/qquickimage_p_p.h index 98c68b939f..5fae36a53b 100644 --- a/src/quick/items/qquickimage_p_p.h +++ b/src/quick/items/qquickimage_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimagebase.cpp b/src/quick/items/qquickimagebase.cpp index 1d303b870b..1f12dc5a7e 100644 --- a/src/quick/items/qquickimagebase.cpp +++ b/src/quick/items/qquickimagebase.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimagebase_p.h b/src/quick/items/qquickimagebase_p.h index 5ccb3f904d..e8f00844a6 100644 --- a/src/quick/items/qquickimagebase_p.h +++ b/src/quick/items/qquickimagebase_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimagebase_p_p.h b/src/quick/items/qquickimagebase_p_p.h index 972fefae0b..e629ee5322 100644 --- a/src/quick/items/qquickimagebase_p_p.h +++ b/src/quick/items/qquickimagebase_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimplicitsizeitem.cpp b/src/quick/items/qquickimplicitsizeitem.cpp index 15604decf3..d70ddfc752 100644 --- a/src/quick/items/qquickimplicitsizeitem.cpp +++ b/src/quick/items/qquickimplicitsizeitem.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimplicitsizeitem_p.h b/src/quick/items/qquickimplicitsizeitem_p.h index 2e254a18ba..1cad5823a1 100644 --- a/src/quick/items/qquickimplicitsizeitem_p.h +++ b/src/quick/items/qquickimplicitsizeitem_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickimplicitsizeitem_p_p.h b/src/quick/items/qquickimplicitsizeitem_p_p.h index 214fb28bf4..1dc0114ac3 100644 --- a/src/quick/items/qquickimplicitsizeitem_p_p.h +++ b/src/quick/items/qquickimplicitsizeitem_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index ebdb980f30..49084639d5 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -2919,7 +2919,6 @@ void QQuickItem::updatePolish() void QQuickItem::sendAccessibilityUpdate() { - Q_D(QQuickItem); } void QQuickItemPrivate::removeItemChangeListener(QQuickItemChangeListener *listener, ChangeTypes types) @@ -5654,6 +5653,7 @@ void QQuickItemLayer::setWrapMode(QQuickShaderEffectSource::WrapMode mode) void QQuickItemLayer::itemOpacityChanged(QQuickItem *item) { + Q_UNUSED(item) updateOpacity(); } @@ -5664,6 +5664,7 @@ void QQuickItemLayer::itemGeometryChanged(QQuickItem *, const QRectF &, const QR void QQuickItemLayer::itemParentChanged(QQuickItem *item, QQuickItem *parent) { + Q_UNUSED(item) if (parent == m_effectSource || parent == m_effect) return; diff --git a/src/quick/items/qquickitem.h b/src/quick/items/qquickitem.h index 0f68910c18..0dd896af3d 100644 --- a/src/quick/items/qquickitem.h +++ b/src/quick/items/qquickitem.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h index 50a9bb97d2..f0b1a9f4d9 100644 --- a/src/quick/items/qquickitem_p.h +++ b/src/quick/items/qquickitem_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitemchangelistener_p.h b/src/quick/items/qquickitemchangelistener_p.h index d83f446092..0ca9a2681a 100644 --- a/src/quick/items/qquickitemchangelistener_p.h +++ b/src/quick/items/qquickitemchangelistener_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitemsmodule.cpp b/src/quick/items/qquickitemsmodule.cpp index 0d7f1e1b1f..b82a90d6f5 100644 --- a/src/quick/items/qquickitemsmodule.cpp +++ b/src/quick/items/qquickitemsmodule.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitemsmodule_p.h b/src/quick/items/qquickitemsmodule_p.h index 08c05806e8..b3b64cfd59 100644 --- a/src/quick/items/qquickitemsmodule_p.h +++ b/src/quick/items/qquickitemsmodule_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 8f46661078..ce4cb9ffaf 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -775,7 +775,7 @@ void QQuickItemView::destroyRemoved() // Correct the positioning of the items d->updateSections(); d->forceLayout = true; - d->layout(); + polish(); } void QQuickItemView::modelUpdated(const QDeclarativeChangeSet &changeSet, bool reset) @@ -878,6 +878,10 @@ void QQuickItemView::geometryChanged(const QRectF &newGeometry, const QRectF &ol { Q_D(QQuickItemView); d->markExtentsDirty(); + if (isComponentComplete() && d->isValid()) { + d->forceLayout = true; + polish(); + } QQuickFlickable::geometryChanged(newGeometry, oldGeometry); } @@ -1110,7 +1114,7 @@ QQuickItemViewPrivate::QQuickItemViewPrivate() , highlightMoveDuration(150) , headerComponent(0), header(0), footerComponent(0), footer(0) , minExtent(0), maxExtent(0) - , ownModel(false), wrap(false), deferredRelease(false) + , ownModel(false), wrap(false) , inApplyModelChanges(false), inViewportMoved(false), forceLayout(false), currentIndexCleared(false) , haveHighlightRange(false), autoHighlight(true), highlightRangeStartValid(false), highlightRangeEndValid(false) , fillCacheBuffer(false), inRequest(false), requestedAsync(false) @@ -1212,7 +1216,6 @@ void QQuickItemViewPrivate::init() Q_Q(QQuickItemView); QQuickItemPrivate::get(contentItem)->childrenDoNotOverlap = true; q->setFlag(QQuickItem::ItemIsFocusScope); - addItemChangeListener(this, Geometry); QObject::connect(q, SIGNAL(movementEnded()), q, SLOT(animStopped())); q->setFlickableDirection(QQuickFlickable::VerticalFlick); } @@ -1291,13 +1294,14 @@ void QQuickItemViewPrivate::mirrorChange() void QQuickItemViewPrivate::refill() { + qreal s = qMax(size(), qreal(0.)); if (isContentFlowReversed()) - refill(-position()-size(), -position()); + refill(-position()-s, -position()); else - refill(position(), position()+size()); + refill(position(), position()+s); } -void QQuickItemViewPrivate::refill(qreal from, qreal to, bool doBuffer) +void QQuickItemViewPrivate::refill(qreal from, qreal to) { Q_Q(QQuickItemView); if (!isValid() || !q->isComponentComplete()) @@ -1311,35 +1315,22 @@ void QQuickItemViewPrivate::refill(qreal from, qreal to, bool doBuffer) qreal bufferTo = to + buffer; qreal fillFrom = from; qreal fillTo = to; - if (doBuffer && (bufferMode & BufferAfter)) - fillTo = bufferTo; - if (doBuffer && (bufferMode & BufferBefore)) - fillFrom = bufferFrom; - // Item creation and release is staggered in order to avoid - // creating/releasing multiple items in one frame - // while flicking (as much as possible). + bool added = addVisibleItems(fillFrom, fillTo, false); + bool removed = removeNonVisibleItems(bufferFrom, bufferTo); - bool changed = addVisibleItems(fillFrom, fillTo, doBuffer); - - if (!changed || deferredRelease) { // avoid destroying items in the same frame that we create - if (removeNonVisibleItems(bufferFrom, bufferTo)) - changed = true; - deferredRelease = false; - } else { - deferredRelease = true; + if (buffer && bufferMode != NoBuffer) { + if (bufferMode & BufferAfter) + fillTo = bufferTo; + if (bufferMode & BufferBefore) + fillFrom = bufferFrom; + added |= addVisibleItems(fillFrom, fillTo, true); } - if (changed) { + if (added || removed) { markExtentsDirty(); + updateBeginningEnd(); visibleItemsChanged(); - } else if (!doBuffer && buffer && bufferMode != NoBuffer) { - refill(from, to, true); - } - - if (!q->isMoving() && changed) { - fillCacheBuffer = true; - q->polish(); } if (prevCount != itemCount) @@ -1389,8 +1380,10 @@ void QQuickItemViewPrivate::layout() } if (!applyModelChanges() && !forceLayout) { - if (fillCacheBuffer) + if (fillCacheBuffer) { + fillCacheBuffer = false; refill(); + } return; } forceLayout = false; @@ -1432,12 +1425,16 @@ bool QQuickItemViewPrivate::applyModelChanges() || !currentChanges.pendingChanges.inserts().isEmpty(); FxViewItem *prevFirstVisible = firstVisibleItem(); - QDeclarativeNullableValue<qreal> prevFirstVisiblePos; + QDeclarativeNullableValue<qreal> prevViewPos; if (prevFirstVisible) - prevFirstVisiblePos = prevFirstVisible->position(); + prevViewPos = prevFirstVisible->position(); + qreal prevVisibleItemsFirstPos = visibleItems.count() ? visibleItems.first()->position() : 0.0; const QVector<QDeclarativeChangeSet::Remove> &removals = currentChanges.pendingChanges.removes(); - ChangeResult removalResult(prevFirstVisiblePos); + const QVector<QDeclarativeChangeSet::Insert> &insertions = currentChanges.pendingChanges.inserts(); + ChangeResult removalResult(prevViewPos); + ChangeResult insertionResult(prevViewPos); + int removedCount = 0; for (int i=0; i<removals.count(); i++) { itemCount -= removals[i].count; @@ -1446,53 +1443,40 @@ bool QQuickItemViewPrivate::applyModelChanges() if (!visibleAffected && needsRefillForAddedOrRemovedIndex(removals[i].index)) visibleAffected = true; } - if (!removals.isEmpty()) + if (!removals.isEmpty()) { updateVisibleIndex(); - const QVector<QDeclarativeChangeSet::Insert> &insertions = currentChanges.pendingChanges.inserts(); - ChangeResult insertionResult(prevFirstVisiblePos); - bool newVisibleItemsFirst = false; + // set positions correctly for the next insertion + if (!insertions.isEmpty()) { + repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstVisible, &insertionResult, &removalResult); + layoutVisibleItems(removals.first().index); + } + } + QList<FxViewItem *> newItems; for (int i=0; i<insertions.count(); i++) { bool wasEmpty = visibleItems.isEmpty(); - if (applyInsertionChange(insertions[i], &insertionResult, &newVisibleItemsFirst, &newItems)) + if (applyInsertionChange(insertions[i], &insertionResult, &newItems)) visibleAffected = true; if (!visibleAffected && needsRefillForAddedOrRemovedIndex(insertions[i].index)) visibleAffected = true; if (wasEmpty && !visibleItems.isEmpty()) resetFirstItemPosition(); + + // set positions correctly for the next insertion + if (i < insertions.count() - 1) { + repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstVisible, &insertionResult, &removalResult); + layoutVisibleItems(insertions[i].index); + } + itemCount += insertions[i].count; } for (int i=0; i<newItems.count(); i++) newItems.at(i)->attached->emitAdd(); // reposition visibleItems.first() correctly so that the content y doesn't jump - if (visibleItems.count() && removedCount != prevVisibleItemsCount) { - if (newVisibleItemsFirst && prevVisibleItemsFirst) - resetItemPosition(visibleItems.first(), prevVisibleItemsFirst); - - if (prevFirstVisible && prevVisibleItemsFirst == prevFirstVisible - && prevFirstVisible != visibleItems.first()) { - // the previous visibleItems.first() was also the first visible item, and it has been - // moved/removed, so move the new visibleItems.first() to the pos of the previous one - if (!newVisibleItemsFirst) - resetItemPosition(visibleItems.first(), prevFirstVisible); - - } else if (prevFirstVisiblePos.isValid()) { - qreal moveForwardsBy = 0; - qreal moveBackwardsBy = 0; - - // shift visibleItems.first() relative to the number of added/removed items - if (visibleItems.first()->position() > prevFirstVisiblePos) { - moveForwardsBy = insertionResult.sizeChangesAfterVisiblePos; - moveBackwardsBy = removalResult.sizeChangesAfterVisiblePos; - } else if (visibleItems.first()->position() < prevFirstVisiblePos) { - moveForwardsBy = removalResult.sizeChangesBeforeVisiblePos; - moveBackwardsBy = insertionResult.sizeChangesBeforeVisiblePos; - } - adjustFirstItem(moveForwardsBy, moveBackwardsBy); - } - } + if (removedCount != prevVisibleItemsCount) + repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstVisible, &insertionResult, &removalResult); // Whatever removed/moved items remain are no longer visible items. for (QHash<QDeclarativeChangeSet::MoveKey, FxViewItem *>::Iterator it = currentChanges.removedItems.begin(); @@ -1525,7 +1509,7 @@ bool QQuickItemViewPrivate::applyModelChanges() return visibleAffected; } -bool QQuickItemViewPrivate::applyRemovalChange(const QDeclarativeChangeSet::Remove &removal, ChangeResult *insertResult, int *removedCount) +bool QQuickItemViewPrivate::applyRemovalChange(const QDeclarativeChangeSet::Remove &removal, ChangeResult *removeResult, int *removedCount) { Q_Q(QQuickItemView); bool visibleAffected = false; @@ -1553,15 +1537,11 @@ bool QQuickItemViewPrivate::applyRemovalChange(const QDeclarativeChangeSet::Remo QObject::connect(item->attached, SIGNAL(delayRemoveChanged()), q, SLOT(destroyRemoved()), Qt::QueuedConnection); ++it; } else { - if (insertResult->visiblePos.isValid()) { - if (item->position() < insertResult->visiblePos) { - // sizeRemovedBeforeFirstVisible measures the size between the visibleItems.first() - // and the firstVisible, so don't count it if removing visibleItems.first() - if (item != visibleItems.first()) - insertResult->sizeChangesBeforeVisiblePos += item->size(); - } else { - insertResult->sizeChangesAfterVisiblePos += item->size(); - } + if (removeResult->visiblePos.isValid()) { + if (item->position() < removeResult->visiblePos) + removeResult->sizeChangesBeforeVisiblePos += item->size(); + else + removeResult->sizeChangesAfterVisiblePos += item->size(); } if (removal.isMove()) { currentChanges.removedItems.insert(removal.moveKey(item->index), item); @@ -1570,13 +1550,58 @@ bool QQuickItemViewPrivate::applyRemovalChange(const QDeclarativeChangeSet::Remo currentChanges.removedItems.insertMulti(QDeclarativeChangeSet::MoveKey(), item); (*removedCount)++; } + if (!removeResult->changedFirstItem && item == visibleItems.first()) + removeResult->changedFirstItem = true; it = visibleItems.erase(it); } } } + + if (removal.index + removal.count < visibleIndex) + removeResult->changeBeforeVisible -= removal.count; + return visibleAffected; } +void QQuickItemViewPrivate::repositionFirstItem(FxViewItem *prevVisibleItemsFirst, + qreal prevVisibleItemsFirstPos, + FxViewItem *prevFirstVisible, + ChangeResult *insertionResult, + ChangeResult *removalResult) +{ + const QDeclarativeNullableValue<qreal> prevViewPos = insertionResult->visiblePos; + + // reposition visibleItems.first() correctly so that the content y doesn't jump + if (visibleItems.count()) { + if (prevVisibleItemsFirst && insertionResult->changedFirstItem) + resetFirstItemPosition(prevVisibleItemsFirstPos); + + if (prevFirstVisible && prevVisibleItemsFirst == prevFirstVisible + && prevFirstVisible != *visibleItems.constBegin()) { + // the previous visibleItems.first() was also the first visible item, and it has been + // moved/removed, so move the new visibleItems.first() to the pos of the previous one + if (!insertionResult->changedFirstItem) + resetFirstItemPosition(prevVisibleItemsFirstPos); + + } else if (prevViewPos.isValid()) { + qreal moveForwardsBy = 0; + qreal moveBackwardsBy = 0; + + // shift visibleItems.first() relative to the number of added/removed items + if (visibleItems.first()->position() > prevViewPos) { + moveForwardsBy = insertionResult->sizeChangesAfterVisiblePos; + moveBackwardsBy = removalResult->sizeChangesAfterVisiblePos; + } else if (visibleItems.first()->position() < prevViewPos) { + moveForwardsBy = removalResult->sizeChangesBeforeVisiblePos; + moveBackwardsBy = insertionResult->sizeChangesBeforeVisiblePos; + } + adjustFirstItem(moveForwardsBy, moveBackwardsBy, insertionResult->changeBeforeVisible + removalResult->changeBeforeVisible); + } + insertionResult->reset(); + removalResult->reset(); + } +} + /* This may return 0 if the item is being created asynchronously. When the item becomes available, refill() will be called and the item @@ -1589,6 +1614,8 @@ FxViewItem *QQuickItemViewPrivate::createItem(int modelIndex, bool asynchronous) return 0; if (requestedIndex != -1 && requestedIndex != modelIndex) { + if (requestedItem && requestedItem->item) + requestedItem->item->setParentItem(0); delete requestedItem; requestedItem = 0; } @@ -1601,7 +1628,6 @@ FxViewItem *QQuickItemViewPrivate::createItem(int modelIndex, bool asynchronous) item->setParentItem(q->contentItem()); QDeclarative_setParent_noEvent(item, q->contentItem()); requestedIndex = -1; - fillCacheBuffer = false; FxViewItem *viewItem = requestedItem; if (!viewItem) viewItem = newViewItem(modelIndex, item); // already in cache, so viewItem not initialized in initItem() @@ -1635,9 +1661,6 @@ void QQuickItemView::createdItem(int index, QQuickItem *item) if (index == d->currentIndex) d->updateCurrent(index); d->refill(); - } else { - d->fillCacheBuffer = true; - polish(); } } } diff --git a/src/quick/items/qquickitemview_p.h b/src/quick/items/qquickitemview_p.h index c659893091..f426f0dcdf 100644 --- a/src/quick/items/qquickitemview_p.h +++ b/src/quick/items/qquickitemview_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index a81aa6f54d..4883ee0fc3 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -103,9 +103,19 @@ public: QDeclarativeNullableValue<qreal> visiblePos; qreal sizeChangesBeforeVisiblePos; qreal sizeChangesAfterVisiblePos; + bool changedFirstItem; + int changeBeforeVisible; ChangeResult(const QDeclarativeNullableValue<qreal> &p) - : visiblePos(p), sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0) {} + : visiblePos(p), sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0), + changedFirstItem(false), changeBeforeVisible(0) {} + + void reset() { + sizeChangesBeforeVisiblePos = 0.0; + sizeChangesAfterVisiblePos = 0.0; + changedFirstItem = false; + changeBeforeVisible = 0; + } }; enum BufferMode { NoBuffer = 0x00, BufferBefore = 0x01, BufferAfter = 0x02 }; @@ -129,7 +139,7 @@ public: void regenerate(); void layout(); void refill(); - void refill(qreal from, qreal to, bool doBuffer = false); + void refill(qreal from, qreal to); void mirrorChange(); FxViewItem *createItem(int modelIndex, bool asynchronous = false); @@ -147,6 +157,8 @@ public: void applyPendingChanges(); bool applyModelChanges(); bool applyRemovalChange(const QDeclarativeChangeSet::Remove &removal, ChangeResult *changeResult, int *removedCount); + void repositionFirstItem(FxViewItem *prevVisibleItemsFirst, qreal prevVisibleItemsFirstPos, + FxViewItem *prevFirstVisible, ChangeResult *insertionResult, ChangeResult *removalResult); void checkVisible() const; @@ -194,7 +206,6 @@ public: bool ownModel : 1; bool wrap : 1; - bool deferredRelease : 1; bool inApplyModelChanges : 1; bool inViewportMoved : 1; bool forceLayout : 1; @@ -236,13 +247,12 @@ protected: virtual FxViewItem *newViewItem(int index, QQuickItem *item) = 0; virtual void repositionPackageItemAt(QQuickItem *item, int index) = 0; - virtual void resetItemPosition(FxViewItem *item, FxViewItem *toItem) = 0; - virtual void resetFirstItemPosition() = 0; - virtual void adjustFirstItem(qreal forwards, qreal backwards) = 0; + virtual void resetFirstItemPosition(qreal pos = 0.0) = 0; + virtual void adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible) = 0; - virtual void layoutVisibleItems() = 0; + virtual void layoutVisibleItems(int fromModelIndex = 0) = 0; virtual void changedVisibleIndex(int newIndex) = 0; - virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *newItems) = 0; + virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, QList<FxViewItem *> *newItems) = 0; virtual bool needsRefillForAddedOrRemovedIndex(int) const { return false; } diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 8852b4195f..38b157b07b 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -60,6 +60,8 @@ QT_BEGIN_NAMESPACE #define QML_FLICK_SNAPONETHRESHOLD 30 #endif +//#define DEBUG_DELEGATE_LIFECYCLE + class FxListItemSG; class QQuickListViewPrivate : public QQuickItemViewPrivate @@ -93,17 +95,16 @@ public: virtual void initializeViewItem(FxViewItem *item); virtual void releaseItem(FxViewItem *item); virtual void repositionPackageItemAt(QQuickItem *item, int index); - virtual void resetItemPosition(FxViewItem *item, FxViewItem *toItem); - virtual void resetFirstItemPosition(); - virtual void adjustFirstItem(qreal forwards, qreal backwards); + virtual void resetFirstItemPosition(qreal pos = 0.0); + virtual void adjustFirstItem(qreal forwards, qreal backwards, int); virtual void createHighlight(); virtual void updateHighlight(); virtual void resetHighlightPosition(); virtual void setPosition(qreal pos); - virtual void layoutVisibleItems(); - virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems); + virtual void layoutVisibleItems(int fromModelIndex = 0); + virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, QList<FxViewItem *> *addedItems); virtual void updateSections(); QQuickItem *getSectionItem(const QString §ion); @@ -606,7 +607,9 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d FxListItemSG *item = 0; qreal pos = itemEnd; while (modelIndex < model->count() && pos <= fillTo) { -// qDebug() << "refill: append item" << modelIndex << "pos" << pos; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: append item" << modelIndex << "pos" << pos; +#endif if (!(item = static_cast<FxListItemSG*>(createItem(modelIndex, doBuffer)))) break; item->setPosition(pos); @@ -616,8 +619,14 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d ++modelIndex; changed = true; } + + if (doBuffer && requestedIndex != -1) // already waiting for an item + return changed; + while (visibleIndex > 0 && visibleIndex <= model->count() && visiblePos > fillFrom) { -// qDebug() << "refill: prepend item" << visibleIndex-1 << "current top pos" << visiblePos; +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: prepend item" << visibleIndex-1 << "current top pos" << visiblePos; +#endif if (!(item = static_cast<FxListItemSG*>(createItem(visibleIndex-1, doBuffer)))) break; --visibleIndex; @@ -646,8 +655,9 @@ bool QQuickListViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer if (item->attached->delayRemove()) break; if (item->size() > 0) { -// qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endPosition(); - +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endPosition(); +#endif // remove this item and all zero-sized items before it while (item) { if (item->index != -1) @@ -667,7 +677,9 @@ bool QQuickListViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer while (visibleItems.count() > 1 && (item = visibleItems.last()) && item->position() > bufferTo) { if (item->attached->delayRemove()) break; -// qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1 << item->position(); +#ifdef DEBUG_DELEGATE_LIFECYCLE + qDebug() << "refill: remove last" << visibleIndex+visibleItems.count()-1 << item->position(); +#endif visibleItems.removeLast(); releaseItem(item); changed = true; @@ -693,7 +705,7 @@ void QQuickListViewPrivate::visibleItemsChanged() updateUnrequestedPositions(); } -void QQuickListViewPrivate::layoutVisibleItems() +void QQuickListViewPrivate::layoutVisibleItems(int fromModelIndex) { if (!visibleItems.isEmpty()) { const qreal from = isContentFlowReversed() ? -position() - size() : position(); @@ -706,8 +718,10 @@ void QQuickListViewPrivate::layoutVisibleItems() firstItem->item->setVisible(firstItem->endPosition() >= from && firstItem->position() <= to); for (int i=1; i < visibleItems.count(); ++i) { FxListItemSG *item = static_cast<FxListItemSG*>(visibleItems.at(i)); - item->setPosition(pos); - item->item->setVisible(item->endPosition() >= from && item->position() <= to); + if (item->index >= fromModelIndex) { + item->setPosition(pos); + item->item->setVisible(item->endPosition() >= from && item->position() <= to); + } pos += item->size() + spacing; sum += item->size(); fixedCurrent = fixedCurrent || (currentItem && item->item == currentItem->item); @@ -738,20 +752,13 @@ void QQuickListViewPrivate::repositionPackageItemAt(QQuickItem *item, int index) } } -void QQuickListViewPrivate::resetItemPosition(FxViewItem *item, FxViewItem *toItem) -{ - if (item == toItem) - return; - static_cast<FxListItemSG*>(item)->setPosition(toItem->position()); -} - -void QQuickListViewPrivate::resetFirstItemPosition() +void QQuickListViewPrivate::resetFirstItemPosition(qreal pos) { FxListItemSG *item = static_cast<FxListItemSG*>(visibleItems.first()); - item->setPosition(0); + item->setPosition(pos); } -void QQuickListViewPrivate::adjustFirstItem(qreal forwards, qreal backwards) +void QQuickListViewPrivate::adjustFirstItem(qreal forwards, qreal backwards, int) { if (!visibleItems.count()) return; @@ -1832,7 +1839,7 @@ void QQuickListView::setSpacing(qreal spacing) if (spacing != d->spacing) { d->spacing = spacing; d->forceLayout = true; - d->layout(); + polish(); emit spacingChanged(); } } @@ -2198,14 +2205,6 @@ void QQuickListView::viewportMoved() return; d->inViewportMoved = true; - // Set visibility of items to eliminate cost of items outside the visible area. - qreal from = d->isContentFlowReversed() ? -d->position()-d->size() : d->position(); - qreal to = d->isContentFlowReversed() ? -d->position() : d->position()+d->size(); - for (int i = 0; i < d->visibleItems.count(); ++i) { - FxViewItem *item = static_cast<FxListItemSG*>(d->visibleItems.at(i)); - item->item->setVisible(item->endPosition() >= from && item->position() <= to); - } - if (yflick()) d->bufferMode = d->vData.smoothVelocity < 0 ? QQuickListViewPrivate::BufferBefore : QQuickListViewPrivate::BufferAfter; else if (d->isRightToLeft()) @@ -2214,6 +2213,15 @@ void QQuickListView::viewportMoved() d->bufferMode = d->hData.smoothVelocity < 0 ? QQuickListViewPrivate::BufferBefore : QQuickListViewPrivate::BufferAfter; d->refill(); + + // Set visibility of items to eliminate cost of items outside the visible area. + qreal from = d->isContentFlowReversed() ? -d->position()-d->size() : d->position(); + qreal to = d->isContentFlowReversed() ? -d->position() : d->position()+d->size(); + for (int i = 0; i < d->visibleItems.count(); ++i) { + FxViewItem *item = static_cast<FxListItemSG*>(d->visibleItems.at(i)); + item->item->setVisible(item->endPosition() >= from && item->position() <= to); + } + if (d->hData.flicking || d->vData.flicking || d->hData.moving || d->vData.moving) d->moveReason = QQuickListViewPrivate::Mouse; if (d->moveReason != QQuickListViewPrivate::SetIndex) { @@ -2375,12 +2383,12 @@ void QQuickListView::updateSections() d->updateSections(); if (d->itemCount) { d->forceLayout = true; - d->layout(); + polish(); } } } -bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, ChangeResult *insertResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems) +bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, ChangeResult *insertResult, QList<FxViewItem *> *addedItems) { int modelIndex = change.index; int count = change.count; @@ -2444,7 +2452,7 @@ bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In visibleItems.insert(insertionIdx, item); if (insertionIdx == 0) - *newVisibleItemsFirst = true; + insertResult->changedFirstItem = true; if (!change.isMove()) addedItems->append(item); insertResult->sizeChangesBeforeVisiblePos += item->size() + spacing; @@ -2466,7 +2474,7 @@ bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In visibleItems.insert(index, item); if (index == 0) - *newVisibleItemsFirst = true; + insertResult->changedFirstItem = true; if (!change.isMove()) addedItems->append(item); insertResult->sizeChangesAfterVisiblePos += item->size() + spacing; diff --git a/src/quick/items/qquicklistview_p.h b/src/quick/items/qquicklistview_p.h index 984506eeaa..6802b49e88 100644 --- a/src/quick/items/qquicklistview_p.h +++ b/src/quick/items/qquicklistview_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickloader.cpp b/src/quick/items/qquickloader.cpp index 197420c301..f203f57473 100644 --- a/src/quick/items/qquickloader.cpp +++ b/src/quick/items/qquickloader.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickloader_p.h b/src/quick/items/qquickloader_p.h index 0c6036e48a..508197dabd 100644 --- a/src/quick/items/qquickloader_p.h +++ b/src/quick/items/qquickloader_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickloader_p_p.h b/src/quick/items/qquickloader_p_p.h index c67d9a17a5..4cc5dc8889 100644 --- a/src/quick/items/qquickloader_p_p.h +++ b/src/quick/items/qquickloader_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp index 6bedadc052..ac0eae4384 100644 --- a/src/quick/items/qquickmousearea.cpp +++ b/src/quick/items/qquickmousearea.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickmousearea_p.h b/src/quick/items/qquickmousearea_p.h index d45f8aa722..710ec7d382 100644 --- a/src/quick/items/qquickmousearea_p.h +++ b/src/quick/items/qquickmousearea_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickmousearea_p_p.h b/src/quick/items/qquickmousearea_p_p.h index aca9ad5ad2..15098c4aee 100644 --- a/src/quick/items/qquickmousearea_p_p.h +++ b/src/quick/items/qquickmousearea_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickmultipointtoucharea.cpp b/src/quick/items/qquickmultipointtoucharea.cpp index d712a89f31..c702c95a94 100644 --- a/src/quick/items/qquickmultipointtoucharea.cpp +++ b/src/quick/items/qquickmultipointtoucharea.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickmultipointtoucharea_p.h b/src/quick/items/qquickmultipointtoucharea_p.h index 3a2e9c75ac..306f01f68b 100644 --- a/src/quick/items/qquickmultipointtoucharea_p.h +++ b/src/quick/items/qquickmultipointtoucharea_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickninepatchnode.cpp b/src/quick/items/qquickninepatchnode.cpp index 9724d8330e..577fcb8bb5 100644 --- a/src/quick/items/qquickninepatchnode.cpp +++ b/src/quick/items/qquickninepatchnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickninepatchnode_p.h b/src/quick/items/qquickninepatchnode_p.h index 0cb1c87d54..41fc06f062 100644 --- a/src/quick/items/qquickninepatchnode_p.h +++ b/src/quick/items/qquickninepatchnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpainteditem.cpp b/src/quick/items/qquickpainteditem.cpp index cddc04f045..740417a0af 100644 --- a/src/quick/items/qquickpainteditem.cpp +++ b/src/quick/items/qquickpainteditem.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpainteditem.h b/src/quick/items/qquickpainteditem.h index 6d7bb4a3ac..86c40a99d3 100644 --- a/src/quick/items/qquickpainteditem.h +++ b/src/quick/items/qquickpainteditem.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpainteditem_p.h b/src/quick/items/qquickpainteditem_p.h index 8a99dec07c..8152e740af 100644 --- a/src/quick/items/qquickpainteditem_p.h +++ b/src/quick/items/qquickpainteditem_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpathview.cpp b/src/quick/items/qquickpathview.cpp index ebb96a2556..ec31731bfc 100644 --- a/src/quick/items/qquickpathview.cpp +++ b/src/quick/items/qquickpathview.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpathview_p.h b/src/quick/items/qquickpathview_p.h index 293a14f751..47ce66873c 100644 --- a/src/quick/items/qquickpathview_p.h +++ b/src/quick/items/qquickpathview_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpathview_p_p.h b/src/quick/items/qquickpathview_p_p.h index 46114cf5b5..9caea98499 100644 --- a/src/quick/items/qquickpathview_p_p.h +++ b/src/quick/items/qquickpathview_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpincharea.cpp b/src/quick/items/qquickpincharea.cpp index b815101961..1ea909e13a 100644 --- a/src/quick/items/qquickpincharea.cpp +++ b/src/quick/items/qquickpincharea.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtSG module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpincharea_p.h b/src/quick/items/qquickpincharea_p.h index 0aca353b43..bb9cb163ea 100644 --- a/src/quick/items/qquickpincharea_p.h +++ b/src/quick/items/qquickpincharea_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtSG module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpincharea_p_p.h b/src/quick/items/qquickpincharea_p_p.h index 0b1ba877cb..3c7be77e44 100644 --- a/src/quick/items/qquickpincharea_p_p.h +++ b/src/quick/items/qquickpincharea_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtSG module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpositioners.cpp b/src/quick/items/qquickpositioners.cpp index 321ff7fd3c..48ec90d402 100644 --- a/src/quick/items/qquickpositioners.cpp +++ b/src/quick/items/qquickpositioners.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -172,7 +172,6 @@ void QQuickBasePositioner::componentComplete() QQuickItem::componentComplete(); positionedItems.reserve(childItems().count()); prePositioning(); - reportConflictingAnchors(); } void QQuickBasePositioner::itemChange(ItemChange change, const ItemChangeData &value) @@ -239,8 +238,11 @@ void QQuickBasePositioner::prePositioning() } } QSizeF contentSize(0,0); - doPositioning(&contentSize); - updateAttachedProperties(); + reportConflictingAnchors(); + if (!d->anchorConflict) { + doPositioning(&contentSize); + updateAttachedProperties(); + } if (!d->addActions.isEmpty() || !d->moveActions.isEmpty()) finishApplyTransitions(); d->doingPositioning = false; @@ -574,7 +576,8 @@ void QQuickColumn::reportConflictingAnchors() } } if (d->anchorConflict) { - qmlInfo(this) << "Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column"; + qmlInfo(this) << "Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column." + << " Column will not function."; } } /*! @@ -800,7 +803,8 @@ void QQuickRow::reportConflictingAnchors() } } if (d->anchorConflict) - qmlInfo(this) << "Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row"; + qmlInfo(this) << "Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row." + << " Row will not function."; } /*! @@ -1234,7 +1238,7 @@ void QQuickGrid::reportConflictingAnchors() } } if (d->anchorConflict) - qmlInfo(this) << "Cannot specify anchors for items inside Grid"; + qmlInfo(this) << "Cannot specify anchors for items inside Grid." << " Grid will not function."; } /*! @@ -1526,7 +1530,7 @@ void QQuickFlow::reportConflictingAnchors() } } if (d->anchorConflict) - qmlInfo(this) << "Cannot specify anchors for items inside Flow"; + qmlInfo(this) << "Cannot specify anchors for items inside Flow." << " Flow will not function."; } QT_END_NAMESPACE diff --git a/src/quick/items/qquickpositioners_p.h b/src/quick/items/qquickpositioners_p.h index ef2930e6f3..8b23857b70 100644 --- a/src/quick/items/qquickpositioners_p.h +++ b/src/quick/items/qquickpositioners_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickpositioners_p_p.h b/src/quick/items/qquickpositioners_p_p.h index e7b88ad7e9..a99ac3c632 100644 --- a/src/quick/items/qquickpositioners_p_p.h +++ b/src/quick/items/qquickpositioners_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickrectangle.cpp b/src/quick/items/qquickrectangle.cpp index 74349238fe..ab4bd979f8 100644 --- a/src/quick/items/qquickrectangle.cpp +++ b/src/quick/items/qquickrectangle.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickrectangle_p.h b/src/quick/items/qquickrectangle_p.h index 67f895a9ef..90d2f304b4 100644 --- a/src/quick/items/qquickrectangle_p.h +++ b/src/quick/items/qquickrectangle_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickrectangle_p_p.h b/src/quick/items/qquickrectangle_p_p.h index 9bfcec8958..8abc0121be 100644 --- a/src/quick/items/qquickrectangle_p_p.h +++ b/src/quick/items/qquickrectangle_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickrepeater.cpp b/src/quick/items/qquickrepeater.cpp index b03ac6eb16..e808aa77be 100644 --- a/src/quick/items/qquickrepeater.cpp +++ b/src/quick/items/qquickrepeater.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickrepeater_p.h b/src/quick/items/qquickrepeater_p.h index 21c399d299..58deebced4 100644 --- a/src/quick/items/qquickrepeater_p.h +++ b/src/quick/items/qquickrepeater_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickrepeater_p_p.h b/src/quick/items/qquickrepeater_p_p.h index c01d4bdc89..954a64c272 100644 --- a/src/quick/items/qquickrepeater_p_p.h +++ b/src/quick/items/qquickrepeater_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickscalegrid.cpp b/src/quick/items/qquickscalegrid.cpp index c5e386bff4..3366d878f8 100644 --- a/src/quick/items/qquickscalegrid.cpp +++ b/src/quick/items/qquickscalegrid.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickscalegrid_p_p.h b/src/quick/items/qquickscalegrid_p_p.h index cbc23601db..298105aeb7 100644 --- a/src/quick/items/qquickscalegrid_p_p.h +++ b/src/quick/items/qquickscalegrid_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickscreen.cpp b/src/quick/items/qquickscreen.cpp index 2145aef486..3769f4e809 100644 --- a/src/quick/items/qquickscreen.cpp +++ b/src/quick/items/qquickscreen.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -74,10 +74,10 @@ QT_BEGIN_NAMESPACE \qmlattachedproperty Qt::ScreenOrientation QtQuickWindow2::Screen::primaryOrientation \readonly - This contains the primary orientation of the screen. This can only change if the screen changes. + This contains the primary orientation of the screen. */ /*! - \qmlattachedproperty Qt::ScreenOrientation QtQuickWindow2::Screen::currentOrientation + \qmlattachedproperty Qt::ScreenOrientation QtQuickWindow2::Screen::orientation \readonly This contains the current orientation of the screen. @@ -119,20 +119,20 @@ int QQuickScreenAttached::height() const Qt::ScreenOrientation QQuickScreenAttached::primaryOrientation() const { if (!m_screen) - return Qt::UnknownOrientation; + return Qt::PrimaryOrientation; return m_screen->primaryOrientation(); } -Qt::ScreenOrientation QQuickScreenAttached::currentOrientation() const +Qt::ScreenOrientation QQuickScreenAttached::orientation() const { if (!m_screen) - return Qt::UnknownOrientation; - return m_screen->currentOrientation(); + return Qt::PrimaryOrientation; + return m_screen->orientation(); } int QQuickScreenAttached::angleBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation b) { - return QScreen::angleBetween(a,b); + return m_screen->angleBetween(a,b); } void QQuickScreenAttached::canvasChanged(QQuickCanvas* c)//Called by QQuickItemPrivate::initCanvas @@ -147,8 +147,10 @@ void QQuickScreenAttached::canvasChanged(QQuickCanvas* c)//Called by QQuickItemP this, SIGNAL(widthChanged())); disconnect(oldScreen, SIGNAL(sizeChanged(QSize)), this, SIGNAL(heightChanged())); - disconnect(oldScreen, SIGNAL(currentOrientationChanged(Qt::ScreenOrientation)), - this, SIGNAL(currentOrientationChanged())); + disconnect(oldScreen, SIGNAL(orientationChanged(Qt::ScreenOrientation)), + this, SIGNAL(orientationChanged())); + disconnect(oldScreen, SIGNAL(primaryOrientationChanged(Qt::ScreenOrientation)), + this, SIGNAL(primaryOrientationChanged())); } if (!screen) @@ -158,8 +160,9 @@ void QQuickScreenAttached::canvasChanged(QQuickCanvas* c)//Called by QQuickItemP emit widthChanged(); emit heightChanged(); } - if (!oldScreen || screen->currentOrientation() != oldScreen->currentOrientation()) - emit currentOrientationChanged(); + + if (!oldScreen || screen->orientation() != oldScreen->orientation()) + emit orientationChanged(); if (!oldScreen || screen->primaryOrientation() != oldScreen->primaryOrientation()) emit primaryOrientationChanged(); @@ -168,8 +171,10 @@ void QQuickScreenAttached::canvasChanged(QQuickCanvas* c)//Called by QQuickItemP this, SIGNAL(widthChanged())); connect(screen, SIGNAL(sizeChanged(QSize)), this, SIGNAL(heightChanged())); - connect(screen, SIGNAL(currentOrientationChanged(Qt::ScreenOrientation)), - this, SIGNAL(currentOrientationChanged())); + connect(screen, SIGNAL(orientationChanged(Qt::ScreenOrientation)), + this, SIGNAL(orientationChanged())); + connect(screen, SIGNAL(primaryOrientationChanged(Qt::ScreenOrientation)), + this, SIGNAL(primaryOrientationChanged())); } } diff --git a/src/quick/items/qquickscreen_p.h b/src/quick/items/qquickscreen_p.h index b90508a092..672607f7f5 100644 --- a/src/quick/items/qquickscreen_p.h +++ b/src/quick/items/qquickscreen_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -51,7 +51,6 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -QT_MODULE(Declarative) class QQuickItem; class QQuickCanvas; @@ -64,7 +63,7 @@ class Q_AUTOTEST_EXPORT QQuickScreenAttached : public QObject Q_PROPERTY(int width READ width NOTIFY widthChanged) Q_PROPERTY(int height READ height NOTIFY heightChanged) Q_PROPERTY(Qt::ScreenOrientation primaryOrientation READ primaryOrientation NOTIFY primaryOrientationChanged) - Q_PROPERTY(Qt::ScreenOrientation currentOrientation READ currentOrientation NOTIFY currentOrientationChanged) + Q_PROPERTY(Qt::ScreenOrientation orientation READ orientation NOTIFY orientationChanged) public: QQuickScreenAttached(QObject* attachee); @@ -72,7 +71,7 @@ public: int width() const; int height() const; Qt::ScreenOrientation primaryOrientation() const; - Qt::ScreenOrientation currentOrientation() const; + Qt::ScreenOrientation orientation() const; Q_INVOKABLE int angleBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation b); @@ -82,7 +81,7 @@ Q_SIGNALS: void widthChanged(); void heightChanged(); void primaryOrientationChanged(); - void currentOrientationChanged(); + void orientationChanged(); private: QScreen* m_screen; diff --git a/src/quick/items/qquickshadereffect.cpp b/src/quick/items/qquickshadereffect.cpp index be01338c1b..1c82b64163 100644 --- a/src/quick/items/qquickshadereffect.cpp +++ b/src/quick/items/qquickshadereffect.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -185,6 +185,7 @@ QQuickShaderEffect::QQuickShaderEffect(QQuickItem *parent) , m_meshResolution(1, 1) , m_mesh(0) , m_cullMode(NoCulling) + , m_status(Uncompiled) , m_blending(true) , m_dirtyData(true) , m_programDirty(true) @@ -215,6 +216,10 @@ void QQuickShaderEffect::setFragmentShader(const QByteArray &code) m_source.fragmentCode = code; update(); m_complete = false; + if (m_status != Uncompiled) { + m_status = Uncompiled; + emit statusChanged(); + } emit fragmentShaderChanged(); } @@ -234,6 +239,10 @@ void QQuickShaderEffect::setVertexShader(const QByteArray &code) m_source.vertexCode = code; update(); m_complete = false; + if (m_status != Uncompiled) { + m_status = Uncompiled; + emit statusChanged(); + } emit vertexShaderChanged(); } @@ -334,6 +343,34 @@ void QQuickShaderEffect::setCullMode(CullMode face) emit cullModeChanged(); } +/*! + \qmlproperty enumeration QtQuick2::ShaderEffect::status + + This property tells the current status of the OpenGL shader program. + + \list + \o ShaderEffect.Compiled - the shader program was successfully compiled and linked. + \o ShaderEffect.Uncompiled - the shader program has not yet been compiled. + \o ShaderEffect.Error - the shader program failed to compile or link. + \endlist + + When setting the fragment or vertex shader source code, the status will become Uncompiled. + The first time the ShaderEffect is rendered with new shader source code, the shaders are + compiled and linked, and the status is updated to Compiled or Error. + + \sa log +*/ + +/*! + \qmlproperty string QtQuick2::ShaderEffect::log + + This property holds a log of warnings and errors from the latest attempt at compiling and + linking the OpenGL shader program. It is updated at the same time \l status is set to Compiled + or Error. + + \sa status +*/ + void QQuickShaderEffect::changeSource(int index) { Q_ASSERT(index >= 0 && index < m_sources.size()); @@ -353,6 +390,14 @@ void QQuickShaderEffect::updateGeometry() update(); } +void QQuickShaderEffect::updateLogAndStatus(const QString &log, int status) +{ + m_log = m_parseLog + log; + m_status = Status(status); + emit logChanged(); + emit statusChanged(); +} + void QQuickShaderEffect::setSource(const QVariant &var, int index) { Q_ASSERT(index >= 0 && index < m_sources.size()); @@ -467,7 +512,8 @@ void QQuickShaderEffect::reset() delete source.mapper; } m_sources.clear(); - + m_log.clear(); + m_parseLog.clear(); m_programDirty = true; m_dirtyMesh = true; } @@ -494,14 +540,22 @@ void QQuickShaderEffect::updateProperties() lookThroughShaderCode(m_source.fragmentCode); } - if (!m_mesh && !m_source.attributeNames.contains(qt_position_attribute_name)) - qWarning("QQuickShaderEffect: Missing reference to \'%s\'.", qt_position_attribute_name); - if (!m_mesh && !m_source.attributeNames.contains(qt_texcoord_attribute_name)) - qWarning("QQuickShaderEffect: Missing reference to \'%s\'.", qt_texcoord_attribute_name); - if (!m_source.respectsMatrix) - qWarning("QQuickShaderEffect: Missing reference to \'qt_Matrix\'."); - if (!m_source.respectsOpacity) - qWarning("QQuickShaderEffect: Missing reference to \'qt_Opacity\'."); + if (!m_mesh && !m_source.attributeNames.contains(qt_position_attribute_name)) { + m_parseLog += QLatin1String("Warning: Missing reference to \'"); + m_parseLog += QLatin1String(qt_position_attribute_name); + m_parseLog += QLatin1String("\'.\n"); + } + if (!m_mesh && !m_source.attributeNames.contains(qt_texcoord_attribute_name)) { + m_parseLog += QLatin1String("Warning: Missing reference to \'"); + m_parseLog += QLatin1String(qt_texcoord_attribute_name); + m_parseLog += QLatin1String("\'.\n"); + } + if (!m_source.respectsMatrix) { + m_parseLog += QLatin1String("Warning: Missing reference to \'qt_Matrix\'.\n"); + } + if (!m_source.respectsOpacity) { + m_parseLog += QLatin1String("Warning: Missing reference to \'qt_Opacity\'.\n"); + } for (int i = 0; i < m_sources.size(); ++i) { QVariant v = property(m_sources.at(i).name); @@ -688,6 +742,7 @@ QSGNode *QQuickShaderEffect::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeDa m_programDirty = true; m_dirtyData = true; m_dirtyGeometry = true; + connect(node, SIGNAL(logAndStatusChanged(QString,int)), this, SLOT(updateLogAndStatus(QString,int))); } QQuickShaderEffectMaterial *material = node->shaderMaterial(); @@ -706,6 +761,15 @@ QSGNode *QQuickShaderEffect::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeDa geometry = mesh->updateGeometry(geometry, m_source.attributeNames, rect); if (!geometry) { + QString log = mesh->log(); + if (!log.isNull()) { + m_log = m_parseLog; + m_log += QLatin1String("*** Mesh ***\n"); + m_log += log; + m_status = Error; + emit logChanged(); + emit statusChanged(); + } delete node; return 0; } diff --git a/src/quick/items/qquickshadereffect_p.h b/src/quick/items/qquickshadereffect_p.h index 7536b42a73..46882217e6 100644 --- a/src/quick/items/qquickshadereffect_p.h +++ b/src/quick/items/qquickshadereffect_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -70,7 +70,10 @@ class Q_AUTOTEST_EXPORT QQuickShaderEffect : public QQuickItem Q_PROPERTY(bool blending READ blending WRITE setBlending NOTIFY blendingChanged) Q_PROPERTY(QVariant mesh READ mesh WRITE setMesh NOTIFY meshChanged) Q_PROPERTY(CullMode culling READ cullMode WRITE setCullMode NOTIFY cullModeChanged) + Q_PROPERTY(QString log READ log NOTIFY logChanged) + Q_PROPERTY(Status status READ status NOTIFY statusChanged) Q_ENUMS(CullMode) + Q_ENUMS(Status) public: enum CullMode @@ -80,6 +83,13 @@ public: FrontFaceCulling = QQuickShaderEffectMaterial::FrontFaceCulling }; + enum Status + { + Compiled, + Uncompiled, + Error + }; + QQuickShaderEffect(QQuickItem *parent = 0); ~QQuickShaderEffect(); @@ -98,7 +108,11 @@ public: CullMode cullMode() const { return m_cullMode; } void setCullMode(CullMode face); + QString log() const { return m_log; } + Status status() const { return m_status; } + void ensureCompleted(); + QString parseLog() { return m_parseLog; } Q_SIGNALS: void fragmentShaderChanged(); @@ -106,6 +120,8 @@ Q_SIGNALS: void blendingChanged(); void meshChanged(); void cullModeChanged(); + void logChanged(); + void statusChanged(); protected: virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); @@ -116,6 +132,7 @@ private Q_SLOTS: void changeSource(int index); void updateData(); void updateGeometry(); + void updateLogAndStatus(const QString &log, int status); private: friend class QQuickCustomMaterialShader; @@ -133,6 +150,8 @@ private: QQuickShaderEffectMesh *m_mesh; QQuickGridMesh m_defaultMesh; CullMode m_cullMode; + QString m_log; + Status m_status; struct SourceData { @@ -141,6 +160,7 @@ private: QByteArray name; }; QVector<SourceData> m_sources; + QString m_parseLog; uint m_blending : 1; uint m_dirtyData : 1; diff --git a/src/quick/items/qquickshadereffectmesh.cpp b/src/quick/items/qquickshadereffectmesh.cpp index 3154ac7cfd..e170a61d99 100644 --- a/src/quick/items/qquickshadereffectmesh.cpp +++ b/src/quick/items/qquickshadereffectmesh.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -68,40 +68,47 @@ QQuickGridMesh::QQuickGridMesh(QObject *parent) connect(this, SIGNAL(resolutionChanged()), this, SIGNAL(geometryChanged())); } -QSGGeometry *QQuickGridMesh::updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &dstRect) const +QSGGeometry *QQuickGridMesh::updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &dstRect) { int vmesh = m_resolution.height(); int hmesh = m_resolution.width(); int attrCount = attributes.count(); + int positionIndex = attributes.indexOf(qtPositionAttributeName()); + int texCoordIndex = attributes.indexOf(qtTexCoordAttributeName()); + if (!geometry) { - bool error = true; - Q_UNUSED(error) switch (attrCount) { case 0: - qWarning("QQuickGridMesh:: No attributes specified."); - break; + m_log = QLatin1String("Error: No attributes specified."); + return 0; case 1: - if (attributes.at(0) == qtPositionAttributeName()) { - error = false; - break; + if (positionIndex != 0) { + m_log = QLatin1String("Error: Missing \'"); + m_log += QLatin1String(qtPositionAttributeName()); + m_log += QLatin1String("\' attribute.\n"); + return 0; } - qWarning("QQuickGridMesh:: Missing \'%s\' attribute.", - qtPositionAttributeName()); break; case 2: - if (attributes.contains(qtPositionAttributeName()) - && attributes.contains(qtTexCoordAttributeName())) - { - error = false; - break; + if (positionIndex == -1 || texCoordIndex == -1) { + m_log.clear(); + if (positionIndex == -1) { + m_log = QLatin1String("Error: Missing \'"); + m_log += QLatin1String(qtPositionAttributeName()); + m_log += QLatin1String("\' attribute.\n"); + } + if (texCoordIndex == -1) { + m_log += QLatin1String("Error: Missing \'"); + m_log += QLatin1String(qtTexCoordAttributeName()); + m_log += QLatin1String("\' attribute.\n"); + } + return 0; } - qWarning("QQuickGridMesh:: Missing \'%s\' or \'%s\' attribute.", - qtPositionAttributeName(), qtTexCoordAttributeName()); break; default: - qWarning("QQuickGridMesh:: Too many attributes specified."); - break; + m_log = QLatin1String("Error: Too many attributes specified."); + return 0; } geometry = new QSGGeometry(attrCount == 1 @@ -116,8 +123,6 @@ QSGGeometry *QQuickGridMesh::updateGeometry(QSGGeometry *geometry, const QVector QSGGeometry::Point2D *vdata = static_cast<QSGGeometry::Point2D *>(geometry->vertexData()); - bool positionFirst = attributes.at(0) == qtPositionAttributeName(); - QRectF srcRect(0, 0, 1, 1); for (int iy = 0; iy <= vmesh; ++iy) { float fy = iy / float(vmesh); @@ -126,7 +131,7 @@ QSGGeometry *QQuickGridMesh::updateGeometry(QSGGeometry *geometry, const QVector for (int ix = 0; ix <= hmesh; ++ix) { float fx = ix / float(hmesh); for (int ia = 0; ia < attrCount; ++ia) { - if (positionFirst == (ia == 0)) { + if (ia == positionIndex) { vdata->x = float(dstRect.left()) + fx * float(dstRect.width()); vdata->y = y; ++vdata; diff --git a/src/quick/items/qquickshadereffectmesh_p.h b/src/quick/items/qquickshadereffectmesh_p.h index 1671fd53f9..5f5eccccd6 100644 --- a/src/quick/items/qquickshadereffectmesh_p.h +++ b/src/quick/items/qquickshadereffectmesh_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -64,7 +64,9 @@ class Q_QUICK_EXPORT QQuickShaderEffectMesh : public QObject public: QQuickShaderEffectMesh(QObject *parent = 0); // If 'geometry' != 0, 'attributes' is the same as last time the function was called. - virtual QSGGeometry *updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &rect) const = 0; + virtual QSGGeometry *updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &rect) = 0; + // If updateGeometry() fails, the reason should appear in the log. + virtual QString log() const { return QString(); } Q_SIGNALS: // Emitted when the geometry needs to be updated. @@ -77,7 +79,8 @@ class QQuickGridMesh : public QQuickShaderEffectMesh Q_PROPERTY(QSize resolution READ resolution WRITE setResolution NOTIFY resolutionChanged) public: QQuickGridMesh(QObject *parent = 0); - virtual QSGGeometry *updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &rect) const; + virtual QSGGeometry *updateGeometry(QSGGeometry *geometry, const QVector<QByteArray> &attributes, const QRectF &rect); + virtual QString log() const { return m_log; } void setResolution(const QSize &res); QSize resolution() const; @@ -87,6 +90,7 @@ Q_SIGNALS: private: QSize m_resolution; + QString m_log; }; inline QColor qt_premultiply_color(const QColor &c) diff --git a/src/quick/items/qquickshadereffectnode.cpp b/src/quick/items/qquickshadereffectnode.cpp index 968982bb88..2fdd69c9e6 100644 --- a/src/quick/items/qquickshadereffectnode.cpp +++ b/src/quick/items/qquickshadereffectnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -42,6 +42,7 @@ #include <private/qquickshadereffectnode_p.h> #include "qquickshadereffectmesh_p.h" +#include "qquickshadereffect_p.h" #include <QtQuick/qsgtextureprovider.h> #include <QtQuick/private/qsgrenderer_p.h> @@ -58,6 +59,7 @@ public: protected: friend class QQuickShaderEffectNode; + virtual void compile(); virtual void initialize(); virtual const char *vertexShader() const; virtual const char *fragmentShader() const; @@ -65,6 +67,8 @@ protected: const QQuickShaderEffectMaterialKey m_key; QVector<const char *> m_attributeNames; const QVector<QByteArray> m_attributes; + QString m_log; + bool m_compiled; QVector<int> m_uniformLocs; int m_opacityLoc; @@ -75,6 +79,7 @@ protected: QQuickCustomMaterialShader::QQuickCustomMaterialShader(const QQuickShaderEffectMaterialKey &key, const QVector<QByteArray> &attributes) : m_key(key) , m_attributes(attributes) + , m_compiled(false) , m_textureIndicesSet(false) { for (int i = 0; i < attributes.count(); ++i) @@ -92,7 +97,12 @@ void QQuickCustomMaterialShader::updateState(const RenderState &state, QSGMateri { Q_ASSERT(newEffect != 0); - const QQuickShaderEffectMaterial *material = static_cast<const QQuickShaderEffectMaterial *>(newEffect); + QQuickShaderEffectMaterial *material = static_cast<QQuickShaderEffectMaterial *>(newEffect); + if (!material->m_emittedLogChanged && material->m_node) { + material->m_emittedLogChanged = true; + emit material->m_node->logAndStatusChanged(m_log, m_compiled ? QQuickShaderEffect::Compiled + : QQuickShaderEffect::Error); + } if (!m_textureIndicesSet) { for (int i = 0; i < material->m_textures.size(); ++i) @@ -192,6 +202,78 @@ char const *const *QQuickCustomMaterialShader::attributeNames() const return m_attributeNames.constData(); } +void QQuickCustomMaterialShader::compile() +{ + Q_ASSERT_X(!program()->isLinked(), "QQuickCustomMaterialShader::compile()", "Compile called multiple times!"); + + m_log.clear(); + m_compiled = true; + if (!program()->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader())) { + m_log += QLatin1String("*** Vertex shader ***\n"); + m_log += program()->log(); + m_compiled = false; + } + if (!program()->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader())) { + m_log += QLatin1String("*** Fragment shader ***\n"); + m_log += program()->log(); + m_compiled = false; + } + + char const *const *attr = attributeNames(); +#ifndef QT_NO_DEBUG + int maxVertexAttribs = 0; + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs); + int attrCount = 0; + while (attrCount < maxVertexAttribs && attr[attrCount]) + ++attrCount; + if (attr[attrCount]) { + qWarning("List of attribute names is too long.\n" + "Maximum number of attributes on this hardware is %i.\n" + "Vertex shader:\n%s\n" + "Fragment shader:\n%s\n", + maxVertexAttribs, vertexShader(), fragmentShader()); + } +#endif + + if (m_compiled) { +#ifndef QT_NO_DEBUG + for (int i = 0; i < attrCount; ++i) { +#else + for (int i = 0; attr[i]; ++i) { +#endif + if (*attr[i]) + program()->bindAttributeLocation(attr[i], i); + } + m_compiled = program()->link(); + m_log += program()->log(); + } + + static const char *fallbackVertexShader = + "uniform highp mat4 qt_Matrix;" + "attribute highp vec4 v;" + "void main() { gl_Position = qt_Matrix * v; }"; + static const char *fallbackFragmentShader = + "void main() { gl_FragColor = vec4(1., 0., 1., 1.); }"; + + if (!m_compiled) { + qWarning("QQuickCustomMaterialShader: Shader compilation failed:"); + qWarning() << program()->log(); + + program()->removeAllShaders(); + program()->addShaderFromSourceCode(QOpenGLShader::Vertex, fallbackVertexShader); + program()->addShaderFromSourceCode(QOpenGLShader::Fragment, fallbackFragmentShader); +#ifndef QT_NO_DEBUG + for (int i = 0; i < attrCount; ++i) { +#else + for (int i = 0; attr[i]; ++i) { +#endif + if (qstrcmp(attr[i], qtPositionAttributeName()) == 0) + program()->bindAttributeLocation("v", i); + } + program()->link(); + } +} + void QQuickCustomMaterialShader::initialize() { m_opacityLoc = program()->uniformLocation("qt_Opacity"); @@ -222,10 +304,12 @@ uint qHash(const QQuickShaderEffectMaterialKey &key) QHash<QQuickShaderEffectMaterialKey, QSharedPointer<QSGMaterialType> > QQuickShaderEffectMaterial::materialMap; -QQuickShaderEffectMaterial::QQuickShaderEffectMaterial() +QQuickShaderEffectMaterial::QQuickShaderEffectMaterial(QQuickShaderEffectNode *node) : m_cullMode(NoCulling) + , m_node(node) + , m_emittedLogChanged(false) { - setFlag(Blending, true); + setFlag(Blending | RequiresFullMatrix, true); } QSGMaterialType *QQuickShaderEffectMaterial::type() const @@ -256,6 +340,7 @@ QQuickShaderEffectMaterial::CullMode QQuickShaderEffectMaterial::cullMode() cons void QQuickShaderEffectMaterial::setProgramSource(const QQuickShaderEffectProgram &source) { m_source = source; + m_emittedLogChanged = false; m_type = materialMap.value(m_source); if (m_type.isNull()) { m_type = QSharedPointer<QSGMaterialType>(new QSGMaterialType); @@ -290,6 +375,7 @@ void QQuickShaderEffectMaterial::updateTextures() const QQuickShaderEffectNode::QQuickShaderEffectNode() + : m_material(this) { QSGNode::setFlag(UsePreprocess, true); setMaterial(&m_material); diff --git a/src/quick/items/qquickshadereffectnode_p.h b/src/quick/items/qquickshadereffectnode_p.h index 5f90e71cab..5a680f129c 100644 --- a/src/quick/items/qquickshadereffectnode_p.h +++ b/src/quick/items/qquickshadereffectnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -78,6 +78,7 @@ struct QQuickShaderEffectProgram : public QQuickShaderEffectMaterialKey class QQuickCustomMaterialShader; +class QQuickShaderEffectNode; class QQuickShaderEffectMaterial : public QSGMaterial { public: @@ -88,7 +89,7 @@ public: FrontFaceCulling }; - QQuickShaderEffectMaterial(); + explicit QQuickShaderEffectMaterial(QQuickShaderEffectNode *node = 0); virtual QSGMaterialType *type() const; virtual QSGMaterialShader *createShader() const; virtual int compare(const QSGMaterial *other) const; @@ -117,6 +118,8 @@ protected: QVector<QPair<QByteArray, QVariant> > m_uniformValues; QVector<QPair<QByteArray, QSGTextureProvider *> > m_textures; CullMode m_cullMode; + QQuickShaderEffectNode *m_node; + bool m_emittedLogChanged; static QHash<QQuickShaderEffectMaterialKey, QSharedPointer<QSGMaterialType> > materialMap; }; @@ -135,6 +138,9 @@ public: QQuickShaderEffectMaterial *shaderMaterial() { return &m_material; } +Q_SIGNALS: + void logAndStatusChanged(const QString &, int status); + private Q_SLOTS: void markDirtyTexture(); diff --git a/src/quick/items/qquickshadereffectsource.cpp b/src/quick/items/qquickshadereffectsource.cpp index c57d749153..af9456f1d0 100644 --- a/src/quick/items/qquickshadereffectsource.cpp +++ b/src/quick/items/qquickshadereffectsource.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickshadereffectsource_p.h b/src/quick/items/qquickshadereffectsource_p.h index d66d80bd56..e3327698c5 100644 --- a/src/quick/items/qquickshadereffectsource_p.h +++ b/src/quick/items/qquickshadereffectsource_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquicksprite.cpp b/src/quick/items/qquicksprite.cpp index 8d7930a232..4c7dafafbb 100644 --- a/src/quick/items/qquicksprite.cpp +++ b/src/quick/items/qquicksprite.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -53,12 +53,13 @@ QT_BEGIN_NAMESPACE /*! \qmlproperty int QtQuick2::Sprite::duration - Time between frames. + Time between frames. Use -1 to indicate one sprite frame per rendered frame. */ /*! \qmlproperty int QtQuick2::Sprite::durationVariation - The time between frames can vary by up to this amount. + The time between frames can vary by up to this amount. Variation will never decrease the time + between frames to less than 0. Default is 0. */ @@ -105,17 +106,6 @@ QT_BEGIN_NAMESPACE If frameHeight and frameWidth are not specified, it is assumed to be a single long row of square frames. Otherwise, it can be multiple contiguous rows or rectangluar frames, when one row runs out the next will be used. */ - Q_PROPERTY(int duration READ duration WRITE setDuration NOTIFY durationChanged) - Q_PROPERTY(int durationVariation READ durationVariance WRITE setDurationVariance NOTIFY durationVarianceChanged) - Q_PROPERTY(QVariantMap to READ to WRITE setTo NOTIFY toChanged) - Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) - Q_PROPERTY(qreal speedModifiesDuration READ speedModifer WRITE setSpeedModifier NOTIFY speedModifierChanged) - Q_PROPERTY(int frames READ frames WRITE setFrames NOTIFY framesChanged) - Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged) - //If frame height or width is not specified, it is assumed to be a single long row of square frames. - //Otherwise, it can be multiple contiguous rows, when one row runs out the next will be used. - Q_PROPERTY(int frameHeight READ frameHeight WRITE setFrameHeight NOTIFY frameHeightChanged) - Q_PROPERTY(int frameWidth READ frameWidth WRITE setFrameWidth NOTIFY frameWidthChanged) QQuickSprite::QQuickSprite(QObject *parent) : QQuickStochasticState(parent) diff --git a/src/quick/items/qquicksprite_p.h b/src/quick/items/qquicksprite_p.h index 8d0934f910..e8a033caa8 100644 --- a/src/quick/items/qquicksprite_p.h +++ b/src/quick/items/qquicksprite_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickspriteengine.cpp b/src/quick/items/qquickspriteengine.cpp index 43223f8fe6..38be93f1ce 100644 --- a/src/quick/items/qquickspriteengine.cpp +++ b/src/quick/items/qquickspriteengine.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -48,25 +48,50 @@ QT_BEGIN_NAMESPACE +/* + \internal Stochastic/Sprite engine implementation docs + + Nomenclature: 'thing' refers to an instance of a running sprite or state. It could be renamed. + States and Transitions are referred to in the state machine sense here, NOT in the QML sense. + + The Stochastic State engine takes states with stochastic state transitions defined and transitions them. + When a state is started, it's added to a list of pending updates sorted by their time they want to update. + An external driver calls the update function with an elapsed time, which becomes the new time offset. + The pending update stack is popped until all entries are past the current time, which simulates all intervening time. + + The Sprite Engine subclass has two major differences. Firstly all states are sprites (and there's a new vector with them + cast to sprite). Secondly, it chops up images and states to fit a texture friendly format. + Before the Sprite Engine starts running, its user requests a texture assembled from all the sprite images. This + texture is made by pasting the sprites into one image, with one sprite animation per row (in the future it is planned to have + arbitrary X/Y start ends, but they will still be assembled and recorded here and still have to be contiguous lines). + This cut-up allows the users to calcuate frame positions with a texture percentage width and elapsed time. + It also means that large sprites cover multiple lines to fit inside the texture memory limit (which is a square). + + Large sprites covering multiple lines breaks this simple interface for the users, so each line is treated as a pseudostate + and it's mostly hidden from the spriteengine users (except that they'll get advanced signals where the state is the same + but the visual parameters changed). These are not real states because that would get very complex with bindings. Instead, + when sprite attributes are requested from a sprite that has multiple pseudostates, it returns the values for the psuedostate + it is in. State advancement is intercepted and hollow for pseudostates, except the last one. The last one transitions as the + state normally does. +*/ + /* TODO: make sharable? solve the state data initialization/transfer issue so as to not need to make friends */ QQuickStochasticEngine::QQuickStochasticEngine(QObject *parent) : - QObject(parent), m_timeOffset(0) + QObject(parent), m_timeOffset(0), m_addAdvance(false) { //Default size 1 setCount(1); - m_advanceTime.start(); } QQuickStochasticEngine::QQuickStochasticEngine(QList<QQuickStochasticState*> states, QObject *parent) : - QObject(parent), m_states(states), m_timeOffset(0) + QObject(parent), m_states(states), m_timeOffset(0), m_addAdvance(false) { //Default size 1 setCount(1); - m_advanceTime.start(); } QQuickStochasticEngine::~QQuickStochasticEngine() @@ -102,24 +127,39 @@ int QQuickSpriteEngine::maxFrames() TODO: All these calculations should be pre-calculated and cached during initialization for a significant performance boost TODO: Above idea needs to have the varying duration offset added to it */ +//TODO: Should these be adding advanceTime as well? +/* + To get these working with duration=-1, m_startTimes will be messed with should duration=-1 + m_startTimes will be set in advance/restart to 0->(m_framesPerRow-1) and can be used directly as extra. + This makes it 'frame' instead, but is more memory efficient than two arrays and less hideous than a vector of unions. +*/ int QQuickSpriteEngine::spriteState(int sprite) { int state = m_things[sprite]; if (!m_sprites[state]->m_generatedCount) return state; - int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; - int extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; + int extra; + if (m_sprites[state]->duration() < 0) { + extra = m_startTimes[sprite]; + } else { + if (!m_duration[sprite]) + return state; + int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; + extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; + } return state + extra; } int QQuickSpriteEngine::spriteStart(int sprite) { + if (!m_duration[sprite]) + return m_timeOffset; int state = m_things[sprite]; if (!m_sprites[state]->m_generatedCount) return m_startTimes[sprite]; int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; int extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; - return state + extra*rowDuration; + return m_startTimes[sprite] + extra*rowDuration; } int QQuickSpriteEngine::spriteFrames(int sprite) @@ -127,19 +167,28 @@ int QQuickSpriteEngine::spriteFrames(int sprite) int state = m_things[sprite]; if (!m_sprites[state]->m_generatedCount) return m_sprites[state]->frames(); - int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; - int extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; + int extra; + if (m_sprites[state]->duration() < 0) { + extra = m_startTimes[sprite]; + } else { + if (!m_duration[sprite]) + return state; + int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; + extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; + } if (extra == m_sprites[state]->m_generatedCount - 1)//last state return m_sprites[state]->frames() % m_sprites[state]->m_framesPerRow; else return m_sprites[state]->m_framesPerRow; } -int QQuickSpriteEngine::spriteDuration(int sprite) +int QQuickSpriteEngine::spriteDuration(int sprite)//Full duration, not per frame { + if (!m_duration[sprite]) + return m_duration[sprite]; int state = m_things[sprite]; if (!m_sprites[state]->m_generatedCount) - return m_duration[sprite]; + return m_duration[sprite] * m_sprites[state]->frames(); int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; int extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; if (extra == m_sprites[state]->m_generatedCount - 1)//last state @@ -153,8 +202,15 @@ int QQuickSpriteEngine::spriteY(int sprite) int state = m_things[sprite]; if (!m_sprites[state]->m_generatedCount) return m_sprites[state]->m_rowY; - int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; - int extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; + int extra; + if (m_sprites[state]->duration() < 0) { + extra = m_startTimes[sprite]; + } else { + if (!m_duration[sprite]) + return state; + int rowDuration = m_duration[sprite] * m_sprites[state]->m_framesPerRow; + extra = (m_timeOffset - m_startTimes[sprite])/rowDuration; + } return m_sprites[state]->m_rowY + m_sprites[state]->m_frameHeight * extra; } @@ -205,6 +261,7 @@ QImage QQuickSpriteEngine::assembledImage() int maxSize = 0; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize); + //qDebug() << "MAX TEXTURE SIZE" << maxSize; foreach (QQuickStochasticState* s, m_states){ QQuickSprite* sprite = qobject_cast<QQuickSprite*>(s); if (sprite) @@ -235,8 +292,11 @@ QImage QQuickSpriteEngine::assembledImage() static int divRoundUp(int a, int b){return (a+b-1)/b;} }; int rowsNeeded = helper::divRoundUp(state->frames(), (maxSize / state->frameWidth())); - if (rowsNeeded * state->frameHeight() > maxSize){ - qWarning() << "SpriteEngine: Animation too large to fit in one texture..." << state->source().toLocalFile(); + if (h + rowsNeeded * state->frameHeight() > maxSize){ + if (rowsNeeded * state->frameHeight() > maxSize) + qWarning() << "SpriteEngine: Animation too large to fit in one texture:" << state->source().toLocalFile(); + else + qWarning() << "SpriteEngine: Animations too large to fit in one texture, pushed over the edge by:" << state->source().toLocalFile(); qWarning() << "SpriteEngine: Your texture max size today is " << maxSize; } state->m_generatedCount = rowsNeeded; @@ -273,7 +333,6 @@ QImage QQuickSpriteEngine::assembledImage() while (framesLeft > 0){ if (image.width() - x + curX <= img.width()){//finish a row in image (dest) int copied = image.width() - x; - Q_ASSERT(!(copied % frameWidth));//XXX: Just checking framesLeft -= copied/frameWidth; p.drawImage(x,y,img.copy(curX,curY,copied,frameHeight)); y += frameHeight; @@ -285,7 +344,6 @@ QImage QQuickSpriteEngine::assembledImage() } }else{//finish a row in img (src) int copied = img.width() - curX; - Q_ASSERT(!(copied % frameWidth));//XXX: Just checking framesLeft -= copied/frameWidth; p.drawImage(x,y,img.copy(curX,curY,copied,frameHeight)); curY += frameHeight; @@ -306,6 +364,7 @@ QImage QQuickSpriteEngine::assembledImage() return image; } +//TODO: Add a reset() function, for completeness in the case of a SpriteEngine being restarted from 0 void QQuickStochasticEngine::setCount(int c) { m_things.resize(c); @@ -335,71 +394,121 @@ void QQuickStochasticEngine::stop(int index) void QQuickStochasticEngine::restart(int index) { - m_startTimes[index] = m_timeOffset + m_advanceTime.elapsed(); + m_startTimes[index] = m_timeOffset; + if (m_addAdvance) + m_startTimes[index] += m_advanceTime.elapsed(); int time = m_duration[index] * m_states[m_things[index]]->frames() + m_startTimes[index]; for (int i=0; i<m_stateUpdates.count(); i++) m_stateUpdates[i].second.removeAll(index); - addToUpdateList(time, index); + if (m_duration[index] >= 0) + addToUpdateList(time, index); } -uint QQuickStochasticEngine::updateSprites(uint time)//### would returning a list of changed idxs be faster than signals? +void QQuickSpriteEngine::restart(int index) //Reimplemented to recognize and handle pseudostates { - //Sprite State Update; - QSet<int> changedIndexes; - while (!m_stateUpdates.isEmpty() && time >= m_stateUpdates.first().first){ - foreach (int idx, m_stateUpdates.first().second){ - if (idx >= m_things.count()) - continue;//TODO: Proper fix(because this does happen and I'm just ignoring it) - int stateIdx = m_things[idx]; - int nextIdx = -1; - int goalPath = goalSeek(stateIdx, idx); - if (goalPath == -1){//Random - qreal r =(qreal) qrand() / (qreal) RAND_MAX; - qreal total = 0.0; - for (QVariantMap::const_iterator iter=m_states[stateIdx]->m_to.constBegin(); - iter!=m_states[stateIdx]->m_to.constEnd(); iter++) - total += (*iter).toReal(); - r*=total; - for (QVariantMap::const_iterator iter= m_states[stateIdx]->m_to.constBegin(); - iter!=m_states[stateIdx]->m_to.constEnd(); iter++){ - if (r < (*iter).toReal()){ - bool superBreak = false; - for (int i=0; i<m_states.count(); i++){ - if (m_states[i]->name() == iter.key()){ - nextIdx = i; - superBreak = true; - break; - } - } - if (superBreak) - break; + if (m_sprites[m_things[index]]->duration() < 0) {//Manually advanced + m_startTimes[index] = 0; + } else { + m_startTimes[index] = m_timeOffset; + if (m_addAdvance) + m_startTimes[index] += m_advanceTime.elapsed(); + int time = spriteDuration(index) + m_startTimes[index]; + for (int i=0; i<m_stateUpdates.count(); i++) + m_stateUpdates[i].second.removeAll(index); + addToUpdateList(time, index); + } +} + +void QQuickStochasticEngine::advance(int idx) +{ + if (idx >= m_things.count()) + return;//TODO: Proper fix(because this has happened and I just ignored it) + int nextIdx = nextState(m_things[idx],idx); + m_things[idx] = nextIdx; + m_duration[idx] = m_states[nextIdx]->variedDuration(); + restart(idx); + emit m_states[nextIdx]->entered(); + emit stateChanged(idx); +} + +void QQuickSpriteEngine::advance(int idx) //Reimplemented to recognize and handle pseudostates +{ + if (idx >= m_things.count()) + return;//TODO: Proper fix(because this has happened and I just ignored it) + if (m_duration[idx] == 0) { + if (m_sprites[m_things[idx]]->duration() < 0) { + //Manually called, advance inner substate count + m_startTimes[idx]++; + if (m_startTimes[idx] < m_sprites[m_things[idx]]->m_generatedCount) { + //only a pseudostate ended + emit stateChanged(idx); + return; + } + } + //just go past the pseudostate logic + } else if (m_startTimes[idx] + m_duration[idx] * m_states[m_things[idx]]->frames() + > m_timeOffset + (m_addAdvance ? m_advanceTime.elapsed() : 0)) { + //only a pseduostate ended + emit stateChanged(idx); + addToUpdateList(m_timeOffset + spriteDuration(idx), idx); + return; + } + int nextIdx = nextState(m_things[idx],idx); + m_things[idx] = nextIdx; + m_duration[idx] = m_states[nextIdx]->variedDuration(); + restart(idx); + emit m_states[nextIdx]->entered(); + emit stateChanged(idx); +} + +int QQuickStochasticEngine::nextState(int curState, int curThing) +{ + int nextIdx = -1; + int goalPath = goalSeek(curState, curThing); + if (goalPath == -1){//Random + qreal r =(qreal) qrand() / (qreal) RAND_MAX; + qreal total = 0.0; + for (QVariantMap::const_iterator iter=m_states[curState]->m_to.constBegin(); + iter!=m_states[curState]->m_to.constEnd(); iter++) + total += (*iter).toReal(); + r*=total; + for (QVariantMap::const_iterator iter= m_states[curState]->m_to.constBegin(); + iter!=m_states[curState]->m_to.constEnd(); iter++){ + if (r < (*iter).toReal()){ + bool superBreak = false; + for (int i=0; i<m_states.count(); i++){ + if (m_states[i]->name() == iter.key()){ + nextIdx = i; + superBreak = true; + break; } - r -= (*iter).toReal(); } - }else{//Random out of shortest paths to goal - nextIdx = goalPath; + if (superBreak) + break; } - if (nextIdx == -1)//No to states means stay here - nextIdx = stateIdx; - - m_things[idx] = nextIdx; - m_duration[idx] = m_states[nextIdx]->variedDuration(); - m_startTimes[idx] = time; - if (nextIdx != stateIdx){ - changedIndexes << idx; - emit m_states[nextIdx]->entered(); - } - addToUpdateList((m_duration[idx] * m_states[nextIdx]->frames()) + time, idx); + r -= (*iter).toReal(); } - m_stateUpdates.pop_front(); + }else{//Random out of shortest paths to goal + nextIdx = goalPath; } + if (nextIdx == -1)//No 'to' states means stay here + nextIdx = curState; + return nextIdx; +} +uint QQuickStochasticEngine::updateSprites(uint time)//### would returning a list of changed idxs be faster than signals? +{ + //Sprite State Update; m_timeOffset = time; - m_advanceTime.start(); - //TODO: emit this when a psuedostate changes too - foreach (int idx, changedIndexes){//Batched so that update list doesn't change midway - emit stateChanged(idx); + m_addAdvance = false; + while (!m_stateUpdates.isEmpty() && time >= m_stateUpdates.first().first){ + foreach (int idx, m_stateUpdates.first().second) + advance(idx); + m_stateUpdates.pop_front(); } + + m_advanceTime.start(); + m_addAdvance = true; if (m_stateUpdates.isEmpty()) return -1; return m_stateUpdates.first().first; diff --git a/src/quick/items/qquickspriteengine_p.h b/src/quick/items/qquickspriteengine_p.h index 86f8aadc8c..48ef6c305e 100644 --- a/src/quick/items/qquickspriteengine_p.h +++ b/src/quick/items/qquickspriteengine_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -102,9 +102,9 @@ public: int variedDuration() const { - return m_duration + return qMax(qreal(0.0) , m_duration + (m_durationVariance * ((qreal)qrand()/RAND_MAX) * 2) - - m_durationVariance; + - m_durationVariance); } int frames() const @@ -212,6 +212,8 @@ public: void setGoal(int state, int sprite=0, bool jump=false); void start(int index=0, int state=0); + virtual void restart(int index=0); + virtual void advance(int index=0);//Sends state to the next chosen state, unlike goal. void stop(int index=0); int curState(int index=0) {return m_things[index];} @@ -244,8 +246,8 @@ public slots: protected: friend class QQuickParticleSystem; - void restart(int index); void addToUpdateList(uint t, int idx); + int nextState(int curState, int idx=0); int goalSeek(int curState, int idx, int dist=-1); QList<QQuickStochasticState*> m_states; //### Consider struct or class for the four data variables? @@ -260,6 +262,7 @@ protected: QString m_globalGoal; int m_maxFrames; int m_imageStateCount; + bool m_addAdvance; }; class QQuickSpriteEngine : public QQuickStochasticEngine @@ -279,14 +282,18 @@ public: int spriteState(int sprite=0); int spriteStart(int sprite=0); int spriteFrames(int sprite=0); - int spriteDuration(int sprite=0); + int spriteDuration(int sprite=0);//Full duration, not per frame int spriteX(int /* sprite */ = 0) { return 0; }//Currently all rows are 0 aligned, if we get more space efficient we might change this int spriteY(int sprite=0); int spriteWidth(int sprite=0); int spriteHeight(int sprite=0); - int spriteCount();//Like state count, but for the image states + int spriteCount();//Like state count int maxFrames(); + QString realName(int sprite=0);//Gives the parent sprite name for pseudosprites QImage assembledImage(); + + virtual void restart(int index=0); + virtual void advance(int index=0); private: QList<QQuickSprite*> m_sprites; }; diff --git a/src/quick/items/qquickspriteimage.cpp b/src/quick/items/qquickspriteimage.cpp index 6b39f73ae2..1819decf10 100644 --- a/src/quick/items/qquickspriteimage.cpp +++ b/src/quick/items/qquickspriteimage.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -58,32 +58,24 @@ QT_BEGIN_NAMESPACE static const char vertexShaderCode[] = "attribute highp vec2 vTex;\n" - "uniform highp vec4 animData;// interpolate(bool), duration, frameCount (this anim), timestamp (this anim)\n" - "uniform highp vec4 animPos;//sheet x,y, width/height of this anim\n" - "uniform highp vec4 animSheetSize; //width/height of whole sheet, width/height of element\n" + "uniform highp vec3 animData;// w,h(premultiplied of anim), interpolation progress\n" + "uniform highp vec4 animPos;//x,y, x,y (two frames for interpolation)\n" + "uniform highp vec2 size;//w,h of element\n" "\n" "uniform highp mat4 qt_Matrix;\n" - "uniform highp float timestamp;\n" "\n" "varying highp vec4 fTexS;\n" "varying lowp float progress;\n" "\n" "\n" "void main() {\n" + " progress = animData.z;\n" " //Calculate frame location in texture\n" - " highp float frameIndex = mod((((timestamp - animData.w)*1000.)/animData.y),animData.z);\n" - " progress = mod((timestamp - animData.w)*1000., animData.y) / animData.y;\n" - "\n" - " frameIndex = floor(frameIndex);\n" - " fTexS.xy = vec2(((frameIndex + vTex.x) * animPos.z / animSheetSize.x), ((animPos.y + vTex.y * animPos.w) / animSheetSize.y));\n" - "\n" + " fTexS.xy = animPos.xy + vTex.xy * animData.xy;\n" " //Next frame is also passed, for interpolation\n" - " //### Should the next anim be precalculated to allow for interpolation there?\n" - " if (animData.x == 1.0 && frameIndex != animData.z - 1.)//Can't do it for the last frame though, this anim may not loop\n" - " frameIndex = mod(frameIndex+1., animData.z);\n" - " fTexS.zw = vec2(((frameIndex + vTex.x) * animPos.z / animSheetSize.x), ((animPos.y + vTex.y * animPos.w) / animSheetSize.y));\n" + " fTexS.zw = animPos.zw + vTex.xy * animData.xy;\n" "\n" - " gl_Position = qt_Matrix * vec4(animSheetSize.z * vTex.x, animSheetSize.w * vTex.y, 0, 1);\n" + " gl_Position = qt_Matrix * vec4(size.x * vTex.x, size.y * vTex.y, 0, 1);\n" "}\n"; static const char fragmentShaderCode[] = @@ -111,33 +103,25 @@ public: QSGTexture *texture; - qreal timestamp; - float interpolate; - float frameDuration; - float frameCount; float animT; - float animX; - float animY; - float animWidth; - float animHeight; - float sheetWidth; - float sheetHeight; + float animX1; + float animY1; + float animX2; + float animY2; + float animW; + float animH; float elementWidth; float elementHeight; }; QQuickSpriteMaterial::QQuickSpriteMaterial() - : timestamp(0) - , interpolate(1.0f) - , frameDuration(1.0f) - , frameCount(1.0f) - , animT(0.0f) - , animX(0.0f) - , animY(0.0f) - , animWidth(1.0f) - , animHeight(1.0f) - , sheetWidth(1.0f) - , sheetHeight(1.0f) + : animT(0.0f) + , animX1(0.0f) + , animY1(0.0f) + , animX2(0.0f) + , animY2(0.0f) + , animW(1.0f) + , animH(1.0f) , elementWidth(1.0f) , elementHeight(1.0f) { @@ -170,10 +154,9 @@ public: m->texture->bind(); program()->setUniformValue(m_opacity_id, state.opacity()); - program()->setUniformValue(m_timestamp_id, (float) m->timestamp); - program()->setUniformValue(m_animData_id, m->interpolate, m->frameDuration, m->frameCount, m->animT); - program()->setUniformValue(m_animPos_id, m->animX, m->animY, m->animWidth, m->animHeight); - program()->setUniformValue(m_animSheetSize_id, m->sheetWidth, m->sheetHeight, m->elementWidth, m->elementHeight); + program()->setUniformValue(m_animData_id, m->animW, m->animH, m->animT); + program()->setUniformValue(m_animPos_id, m->animX1, m->animY1, m->animX2, m->animY2); + program()->setUniformValue(m_size_id, m->elementWidth, m->elementHeight); if (state.isMatrixDirty()) program()->setUniformValue(m_matrix_id, state.combinedMatrix()); @@ -182,10 +165,9 @@ public: virtual void initialize() { m_matrix_id = program()->uniformLocation("qt_Matrix"); m_opacity_id = program()->uniformLocation("qt_Opacity"); - m_timestamp_id = program()->uniformLocation("timestamp"); m_animData_id = program()->uniformLocation("animData"); m_animPos_id = program()->uniformLocation("animPos"); - m_animSheetSize_id = program()->uniformLocation("animSheetSize"); + m_size_id = program()->uniformLocation("size"); } virtual const char *vertexShader() const { return vertexShaderCode; } @@ -201,10 +183,9 @@ public: int m_matrix_id; int m_opacity_id; - int m_timestamp_id; int m_animData_id; int m_animPos_id; - int m_animSheetSize_id; + int m_size_id; static float chunkOfBytes[1024]; }; @@ -285,9 +266,11 @@ QQuickSpriteImage::QQuickSpriteImage(QQuickItem *parent) : , m_node(0) , m_material(0) , m_spriteEngine(0) + , m_curFrame(0) , m_pleaseReset(false) , m_running(true) , m_interpolate(true) + , m_curStateIdx(0) { setFlag(ItemHasContents); connect(this, SIGNAL(runningChanged(bool)), @@ -350,19 +333,17 @@ QSGGeometryNode* QQuickSpriteImage::buildNode() QImage image = m_spriteEngine->assembledImage(); if (image.isNull()) return 0; + m_sheetSize = QSizeF(image.size()); m_material->texture = canvas()->createTextureFromImage(image); m_material->texture->setFiltering(QSGTexture::Linear); m_spriteEngine->start(0); - m_material->interpolate = m_interpolate ? 1.0 : 0.0; - m_material->frameCount = m_spriteEngine->spriteFrames(); - m_material->frameDuration = m_spriteEngine->spriteDuration(); m_material->animT = 0; - m_material->animX = m_spriteEngine->spriteX(); - m_material->animY = m_spriteEngine->spriteY(); - m_material->animWidth = m_spriteEngine->spriteWidth(); - m_material->animHeight = m_spriteEngine->spriteHeight(); - m_material->sheetWidth = image.width(); - m_material->sheetHeight = image.height(); + m_material->animX1 = m_spriteEngine->spriteX() / m_sheetSize.width(); + m_material->animY1 = m_spriteEngine->spriteY() / m_sheetSize.height(); + m_material->animX2 = m_material->animX1; + m_material->animY2 = m_material->animY1; + m_material->animW = m_spriteEngine->spriteWidth() / m_sheetSize.width(); + m_material->animH = m_spriteEngine->spriteHeight() / m_sheetSize.height(); m_material->elementWidth = width(); m_material->elementHeight = height(); m_curState = m_spriteEngine->state(m_spriteEngine->curState())->name(); @@ -440,25 +421,53 @@ void QQuickSpriteImage::prepareNextFrame() uint timeInt = m_timestamp.elapsed(); qreal time = timeInt / 1000.; - m_material->timestamp = time; m_material->elementHeight = height(); m_material->elementWidth = width(); - m_material->interpolate = m_interpolate; //Advance State m_spriteEngine->updateSprites(timeInt); - int curY = m_spriteEngine->spriteY(); - if (curY != m_material->animY){ - m_material->animT = m_spriteEngine->spriteStart()/1000.0; - m_material->frameCount = m_spriteEngine->spriteFrames(); - m_material->frameDuration = m_spriteEngine->spriteDuration(); - m_material->animX = m_spriteEngine->spriteX(); - m_material->animY = m_spriteEngine->spriteY(); - m_material->animWidth = m_spriteEngine->spriteWidth(); - m_material->animHeight = m_spriteEngine->spriteHeight(); + if (m_curStateIdx != m_spriteEngine->curState()) { + m_curStateIdx = m_spriteEngine->curState(); m_curState = m_spriteEngine->state(m_spriteEngine->curState())->name(); emit currentSpriteChanged(m_curState); + m_curFrame= -1; + } + + //Advance Sprite + qreal animT = m_spriteEngine->spriteStart()/1000.0; + qreal frameCount = m_spriteEngine->spriteFrames(); + qreal frameDuration = m_spriteEngine->spriteDuration()/frameCount; + double frameAt; + qreal progress; + if (frameDuration > 0) { + qreal frame = (time - animT)/(frameDuration / 1000.0); + frame = qBound(qreal(0.0), frame, frameCount - qreal(1.0));//Stop at count-1 frames until we have between anim interpolation + progress = modf(frame,&frameAt); + } else { + m_curFrame++; + if (m_curFrame >= frameCount){ + m_curFrame = 0; + m_spriteEngine->advance(); + } + frameAt = m_curFrame; + progress = 0; } + qreal y = m_spriteEngine->spriteY() / m_sheetSize.height(); + qreal w = m_spriteEngine->spriteWidth() / m_sheetSize.width(); + qreal h = m_spriteEngine->spriteHeight() / m_sheetSize.height(); + qreal x1 = m_spriteEngine->spriteX() / m_sheetSize.width(); + x1 += frameAt * w; + qreal x2 = x1; + if (frameAt < (frameCount-1)) + x2 += w; + + m_material->animX1 = x1; + m_material->animY1 = y; + m_material->animX2 = x2; + m_material->animY2 = y; + m_material->animW = w; + m_material->animH = h; + m_material->animT = m_interpolate ? progress : 0.0; } QT_END_NAMESPACE diff --git a/src/quick/items/qquickspriteimage_p.h b/src/quick/items/qquickspriteimage_p.h index c5513031f5..cd0796be1a 100644 --- a/src/quick/items/qquickspriteimage_p.h +++ b/src/quick/items/qquickspriteimage_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -131,12 +131,14 @@ private: QList<QQuickSprite*> m_sprites; QQuickSpriteEngine* m_spriteEngine; QTime m_timestamp; - int m_maxFrames; + int m_curFrame; bool m_pleaseReset; bool m_running; bool m_interpolate; QString m_goalState; QString m_curState; + int m_curStateIdx; + QSizeF m_sheetSize; }; QT_END_NAMESPACE diff --git a/src/quick/items/qquickstateoperations.cpp b/src/quick/items/qquickstateoperations.cpp index a8ebc88e7e..7548ec9bde 100644 --- a/src/quick/items/qquickstateoperations.cpp +++ b/src/quick/items/qquickstateoperations.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickstateoperations_p.h b/src/quick/items/qquickstateoperations_p.h index 3454ac1e11..1e8704d672 100644 --- a/src/quick/items/qquickstateoperations_p.h +++ b/src/quick/items/qquickstateoperations_p.h @@ -1,9 +1,9 @@ // Commit: 84c47bbb133304d7ef35642fa1fbb17619d4a43d /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index e8eb555dde..82232ab0ea 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -85,7 +85,7 @@ QQuickTextPrivate::QQuickTextPrivate() disableDistanceField(false), internalWidthUpdate(false), requireImplicitWidth(false), truncated(false), hAlignImplicit(true), rightToLeftText(false), layoutTextElided(false), richTextAsImage(false), textureImageCacheDirty(false), textHasChanged(true), - naturalWidth(0), doc(0), elipsisLayout(0), textLine(0), nodeType(NodeIsNull) + naturalWidth(0), doc(0), elipsisLayout(0), textLine(0), nodeType(NodeIsNull), updateType(UpdatePaintNode) #if defined(Q_OS_MAC) , layoutThread(0), paintingThread(0) @@ -107,6 +107,7 @@ QQuickTextDocumentWithImageResources::QQuickTextDocumentWithImageResources(QQuic : QTextDocument(parent), outstanding(0) { setUndoRedoEnabled(false); + documentLayout()->registerHandler(QTextFormat::ImageObject, this); } QQuickTextDocumentWithImageResources::~QQuickTextDocumentWithImageResources() @@ -118,30 +119,11 @@ QQuickTextDocumentWithImageResources::~QQuickTextDocumentWithImageResources() QVariant QQuickTextDocumentWithImageResources::loadResource(int type, const QUrl &name) { QDeclarativeContext *context = qmlContext(parent()); - QUrl url = context->resolvedUrl(name); + QUrl url = m_baseUrl.resolved(name); if (type == QTextDocument::ImageResource) { - QHash<QUrl, QDeclarativePixmap *>::Iterator iter = m_resources.find(url); - - if (iter == m_resources.end()) { - QDeclarativePixmap *p = new QDeclarativePixmap(context->engine(), url); - iter = m_resources.insert(url, p); - - if (p->isLoading()) { - p->connectFinished(this, SLOT(requestFinished())); - outstanding++; - } - } - - QDeclarativePixmap *p = *iter; - if (p->isReady()) { - return p->image(); - } else if (p->isError()) { - if (!errors.contains(url)) { - errors.insert(url); - qmlInfo(parent()) << p->error(); - } - } + QDeclarativePixmap *p = loadPixmap(context, url); + return p->image(); } return QTextDocument::loadResource(type,url); // The *resolved* URL @@ -152,9 +134,7 @@ void QQuickTextDocumentWithImageResources::requestFinished() outstanding--; if (outstanding == 0) { markContentsDirty(0, characterCount()); - - if (QQuickText *item = qobject_cast<QQuickText *>(parent())) - QQuickTextPrivate::get(item)->updateLayout(); + emit imagesLoaded(); } } @@ -165,6 +145,100 @@ void QQuickTextDocumentWithImageResources::clear() QTextDocument::clear(); } + +QSizeF QQuickTextDocumentWithImageResources::intrinsicSize( + QTextDocument *, int, const QTextFormat &format) +{ + if (format.isImageFormat()) { + QTextImageFormat imageFormat = format.toImageFormat(); + + const bool hasWidth = imageFormat.hasProperty(QTextFormat::ImageWidth); + const int width = qRound(imageFormat.width()); + const bool hasHeight = imageFormat.hasProperty(QTextFormat::ImageHeight); + const int height = qRound(imageFormat.height()); + + QSizeF size(width, height); + if (!hasWidth || !hasHeight) { + QDeclarativeContext *context = qmlContext(parent()); + QUrl url = m_baseUrl.resolved(QUrl(imageFormat.name())); + + QDeclarativePixmap *p = loadPixmap(context, url); + if (!p->isReady()) { + if (!hasWidth) + size.setWidth(16); + if (!hasHeight) + size.setHeight(16); + return size; + } + QSize implicitSize = p->implicitSize(); + + if (!hasWidth) { + if (!hasHeight) + size.setWidth(implicitSize.width()); + else + size.setWidth(qRound(height * (implicitSize.width() / (qreal) implicitSize.height()))); + } + if (!hasHeight) { + if (!hasWidth) + size.setHeight(implicitSize.height()); + else + size.setHeight(qRound(width * (implicitSize.height() / (qreal) implicitSize.width()))); + } + } + return size; + } + return QSizeF(); +} + +void QQuickTextDocumentWithImageResources::drawObject( + QPainter *, const QRectF &, QTextDocument *, int, const QTextFormat &) +{ +} + +QImage QQuickTextDocumentWithImageResources::image(const QTextImageFormat &format) +{ + QDeclarativeContext *context = qmlContext(parent()); + QUrl url = m_baseUrl.resolved(QUrl(format.name())); + + QDeclarativePixmap *p = loadPixmap(context, url); + return p->image(); +} + +void QQuickTextDocumentWithImageResources::setBaseUrl(const QUrl &url, bool clear) +{ + m_baseUrl = url; + if (clear) { + clearResources(); + markContentsDirty(0, characterCount()); + } +} + +QDeclarativePixmap *QQuickTextDocumentWithImageResources::loadPixmap( + QDeclarativeContext *context, const QUrl &url) +{ + + QHash<QUrl, QDeclarativePixmap *>::Iterator iter = m_resources.find(url); + + if (iter == m_resources.end()) { + QDeclarativePixmap *p = new QDeclarativePixmap(context->engine(), url); + iter = m_resources.insert(url, p); + + if (p->isLoading()) { + p->connectFinished(this, SLOT(requestFinished())); + outstanding++; + } + } + + QDeclarativePixmap *p = *iter; + if (p->isError()) { + if (!errors.contains(url)) { + errors.insert(url); + qmlInfo(parent()) << p->error(); + } + } + return p; +} + void QQuickTextDocumentWithImageResources::clearResources() { foreach (QDeclarativePixmap *pixmap, m_resources) @@ -206,6 +280,12 @@ qreal QQuickTextPrivate::getImplicitWidth() const return implicitWidth; } +void QQuickText::q_imagesLoaded() +{ + Q_D(QQuickText); + d->updateLayout(); +} + void QQuickTextPrivate::updateLayout() { Q_Q(QQuickText); @@ -291,6 +371,7 @@ void QQuickTextPrivate::updateSize() q->setImplicitSize(0, fontHeight); paintedSize = QSize(0, fontHeight); emit q->paintedSizeChanged(); + updateType = UpdatePaintNode; q->update(); return; } @@ -365,6 +446,7 @@ void QQuickTextPrivate::updateSize() paintedSize = size; emit q->paintedSizeChanged(); } + updateType = UpdatePaintNode; q->update(); } @@ -818,6 +900,7 @@ void QQuickTextPrivate::checkImageCache() imageCacheDirty = false; textureImageCacheDirty = true; + updateType = UpdatePaintNode; q->update(); } @@ -830,6 +913,8 @@ void QQuickTextPrivate::ensureDoc() Q_Q(QQuickText); doc = new QQuickTextDocumentWithImageResources(q); doc->setDocumentMargin(0); + doc->setBaseUrl(q->baseUrl()); + FAST_CONNECT(doc, SIGNAL(imagesLoaded()), q, SLOT(q_imagesLoaded())); } } @@ -1243,8 +1328,10 @@ void QQuickText::setStyle(QQuickText::TextStyle style) return; // changing to/from Normal requires the boundingRect() to change - if (isComponentComplete() && (d->style == Normal || style == Normal)) + if (isComponentComplete() && (d->style == Normal || style == Normal)) { + d->updateType = QQuickTextPrivate::UpdatePaintNode; update(); + } d->style = style; d->markDirty(); emit styleChanged(d->style); @@ -1645,6 +1732,45 @@ void QQuickText::setElideMode(QQuickText::TextElideMode mode) emit elideModeChanged(d->elideMode); } +/*! + \qmlproperty url QtQuick2::Text::baseUrl + + This property specifies a base URL which is used to resolve relative URLs + within the text. + + By default is the url of the Text element. +*/ + +QUrl QQuickText::baseUrl() const +{ + Q_D(const QQuickText); + if (d->baseUrl.isEmpty()) { + if (QDeclarativeContext *context = qmlContext(this)) + const_cast<QQuickTextPrivate *>(d)->baseUrl = context->baseUrl(); + } + return d->baseUrl; +} + +void QQuickText::setBaseUrl(const QUrl &url) +{ + Q_D(QQuickText); + if (baseUrl() != url) { + d->baseUrl = url; + + if (d->doc) + d->doc->setBaseUrl(url); + emit baseUrlChanged(); + } +} + +void QQuickText::resetBaseUrl() +{ + if (QDeclarativeContext *context = qmlContext(this)) + setBaseUrl(context->baseUrl()); + else + setBaseUrl(QUrl()); +} + /*! \internal */ QRectF QQuickText::boundingRect() const { @@ -1721,6 +1847,14 @@ geomChangeDone: QQuickItem::geometryChanged(newGeometry, oldGeometry); } +void QQuickText::triggerPreprocess() +{ + Q_D(QQuickText); + if (d->updateType == QQuickTextPrivate::UpdateNone) + d->updateType = QQuickTextPrivate::UpdatePreprocess; + update(); +} + QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) { Q_UNUSED(data); @@ -1731,6 +1865,14 @@ QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data return 0; } + if (!d->updateType != QQuickTextPrivate::UpdatePaintNode && oldNode != 0) { + // Update done in preprocess() in the nodes + d->updateType = QQuickTextPrivate::UpdateNone; + return oldNode; + } + + d->updateType = QQuickTextPrivate::UpdateNone; + QRectF bounds = boundingRect(); // We need to make sure the layout is done in the current thread @@ -1781,7 +1923,7 @@ QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data QQuickTextNode *node = 0; if (!oldNode || d->nodeType != QQuickTextPrivate::NodeIsText) { delete oldNode; - node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext()); + node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext(), this); d->nodeType = QQuickTextPrivate::NodeIsText; } else { node = static_cast<QQuickTextNode *>(oldNode); diff --git a/src/quick/items/qquicktext_p.h b/src/quick/items/qquicktext_p.h index 2292ea5f4d..46197258c8 100644 --- a/src/quick/items/qquicktext_p.h +++ b/src/quick/items/qquicktext_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -85,6 +85,7 @@ class Q_QUICK_PRIVATE_EXPORT QQuickText : public QQuickImplicitSizeItem Q_PROPERTY(qreal paintedHeight READ paintedHeight NOTIFY paintedSizeChanged) Q_PROPERTY(qreal lineHeight READ lineHeight WRITE setLineHeight NOTIFY lineHeightChanged) Q_PROPERTY(LineHeightMode lineHeightMode READ lineHeightMode WRITE setLineHeightMode NOTIFY lineHeightModeChanged) + Q_PROPERTY(QUrl baseUrl READ baseUrl WRITE setBaseUrl RESET resetBaseUrl NOTIFY baseUrlChanged) public: QQuickText(QQuickItem *parent=0); @@ -164,6 +165,10 @@ public: LineHeightMode lineHeightMode() const; void setLineHeightMode(LineHeightMode); + QUrl baseUrl() const; + void setBaseUrl(const QUrl &url); + void resetBaseUrl(); + virtual void componentComplete(); int resourcesLoading() const; // mainly for testing @@ -194,6 +199,7 @@ Q_SIGNALS: void lineHeightModeChanged(LineHeightMode mode); void effectiveHorizontalAlignmentChanged(); void lineLaidOut(QQuickTextLine *line); + void baseUrlChanged(); protected: void mousePressEvent(QMouseEvent *event); @@ -203,6 +209,10 @@ protected: virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *); virtual bool event(QEvent *); +private Q_SLOTS: + void q_imagesLoaded(); + void triggerPreprocess(); + private: Q_DISABLE_COPY(QQuickText) Q_DECLARE_PRIVATE(QQuickText) diff --git a/src/quick/items/qquicktext_p_p.h b/src/quick/items/qquicktext_p_p.h index fe25a02759..dda24a0a68 100644 --- a/src/quick/items/qquicktext_p_p.h +++ b/src/quick/items/qquicktext_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -58,6 +58,7 @@ #include "qquickimplicitsizeitem_p_p.h" #include <QtDeclarative/qdeclarative.h> +#include <QtGui/qabstracttextdocumentlayout.h> #include <QtGui/qtextlayout.h> QT_BEGIN_NAMESPACE @@ -83,6 +84,7 @@ public: bool isLineLaidOutConnected(); QString text; + QUrl baseUrl; QFont font; QFont sourceFont; QColor color; @@ -159,6 +161,13 @@ public: }; NodeType nodeType; + enum UpdateType { + UpdateNone, + UpdatePreprocess, + UpdatePaintNode + }; + UpdateType updateType; + #if defined(Q_OS_MAC) QList<QRectF> linesRects; QThread *layoutThread; @@ -167,9 +176,10 @@ public: }; class QDeclarativePixmap; -class QQuickTextDocumentWithImageResources : public QTextDocument { +class QQuickTextDocumentWithImageResources : public QTextDocument, public QTextObjectInterface +{ Q_OBJECT - + Q_INTERFACES(QTextObjectInterface) public: QQuickTextDocumentWithImageResources(QQuickItem *parent); virtual ~QQuickTextDocumentWithImageResources(); @@ -181,14 +191,27 @@ public: void clear(); + QSizeF intrinsicSize(QTextDocument *doc, int posInDocument, const QTextFormat &format); + void drawObject(QPainter *p, const QRectF &rect, QTextDocument *doc, int posInDocument, const QTextFormat &format); + + QImage image(const QTextImageFormat &format); + + void setBaseUrl(const QUrl &url, bool clear = true); + +Q_SIGNALS: + void imagesLoaded(); + protected: QVariant loadResource(int type, const QUrl &name); + QDeclarativePixmap *loadPixmap(QDeclarativeContext *context, const QUrl &name); + private slots: void requestFinished(); private: QHash<QUrl, QDeclarativePixmap *> m_resources; + QUrl m_baseUrl; int outstanding; static QSet<QUrl> errors; diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index 4f9475f583..b1accb3781 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtGui module of the Qt Toolkit. ** @@ -624,7 +624,7 @@ QQuickTextControl::QQuickTextControl(QTextDocument *doc, QObject *parent) : QObject(*new QQuickTextControlPrivate, parent) { Q_D(QQuickTextControl); - d->init(Qt::RichText, QString(), doc); + d->init(Qt::PlainText, QString(), doc); } QQuickTextControl::~QQuickTextControl() diff --git a/src/quick/items/qquicktextcontrol_p.h b/src/quick/items/qquicktextcontrol_p.h index 0ea21169c9..6159826f34 100644 --- a/src/quick/items/qquicktextcontrol_p.h +++ b/src/quick/items/qquicktextcontrol_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtGui module of the Qt Toolkit. ** @@ -67,7 +67,6 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -QT_MODULE(Declarative) class QStyleSheet; class QTextDocument; diff --git a/src/quick/items/qquicktextcontrol_p_p.h b/src/quick/items/qquicktextcontrol_p_p.h index 9ba600aae4..59da1a8f52 100644 --- a/src/quick/items/qquicktextcontrol_p_p.h +++ b/src/quick/items/qquicktextcontrol_p_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtGui module of the Qt Toolkit. ** diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index e971ef7b5e..37c76c09a3 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -127,13 +127,17 @@ QQuickTextEdit::QQuickTextEdit(QQuickItem *parent) QString QQuickTextEdit::text() const { Q_D(const QQuickTextEdit); - + if (!d->textCached) { + QQuickTextEditPrivate *d = const_cast<QQuickTextEditPrivate *>(d_func()); #ifndef QT_NO_TEXTHTMLPARSER - if (d->richText) - return d->control->toHtml(); - else + if (d->richText) + d->text = d->control->toHtml(); + else #endif - return d->control->toPlainText(); + d->text = d->control->toPlainText(); + d->textCached = true; + } + return d->text; } /*! @@ -320,21 +324,21 @@ void QQuickTextEdit::setTextFormat(TextFormat format) Q_D(QQuickTextEdit); if (format == d->format) return; + bool wasRich = d->richText; - d->richText = format == RichText || (format == AutoText && Qt::mightBeRichText(d->text)); + d->richText = format == RichText || (format == AutoText && (wasRich || Qt::mightBeRichText(text()))); +#ifndef QT_NO_TEXTHTMLPARSER if (wasRich && !d->richText) { - d->control->setPlainText(d->text); + d->control->setPlainText(!d->textCached ? d->control->toHtml() : d->text); updateSize(); } else if (!wasRich && d->richText) { -#ifndef QT_NO_TEXTHTMLPARSER - d->control->setHtml(d->text); -#else - d->control->setPlainText(d->text); -#endif + d->control->setHtml(!d->textCached ? d->control->toPlainText() : d->text); updateSize(); d->useImageFallback = qmlEnableImageCache(); } +#endif + d->format = format; d->control->setAcceptRichText(d->format != PlainText); emit textFormatChanged(d->format); @@ -553,7 +557,7 @@ bool QQuickTextEditPrivate::determineHorizontalAlignment() Q_Q(QQuickTextEdit); if (hAlignImplicit && q->isComponentComplete()) { bool alignToRight; - if (text.isEmpty()) { + if (document->isEmpty()) { const QString preeditText = control->textCursor().block().layout()->preeditAreaText(); alignToRight = preeditText.isEmpty() ? qApp->inputPanel()->inputDirection() == Qt::RightToLeft @@ -682,6 +686,44 @@ qreal QQuickTextEdit::paintedHeight() const } /*! + \qmlproperty url QtQuick2::TextEdit::baseUrl + + This property specifies a base URL which is used to resolve relative URLs + within the text. + + By default is the url of the TextEdit element. +*/ + +QUrl QQuickTextEdit::baseUrl() const +{ + Q_D(const QQuickTextEdit); + if (d->baseUrl.isEmpty()) { + if (QDeclarativeContext *context = qmlContext(this)) + const_cast<QQuickTextEditPrivate *>(d)->baseUrl = context->baseUrl(); + } + return d->baseUrl; +} + +void QQuickTextEdit::setBaseUrl(const QUrl &url) +{ + Q_D(QQuickTextEdit); + if (baseUrl() != url) { + d->baseUrl = url; + + d->document->setBaseUrl(url, d->richText); + emit baseUrlChanged(); + } +} + +void QQuickTextEdit::resetBaseUrl() +{ + if (QDeclarativeContext *context = qmlContext(this)) + setBaseUrl(context->baseUrl()); + else + setBaseUrl(QUrl()); +} + +/*! \qmlmethod rectangle QtQuick2::TextEdit::positionToRectangle(position) Returns the rectangle at the given \a position in the text. The x, y, @@ -864,7 +906,7 @@ int QQuickTextEdit::cursorPosition() const void QQuickTextEdit::setCursorPosition(int pos) { Q_D(QQuickTextEdit); - if (pos < 0 || pos > d->text.length()) + if (pos < 0 || pos >= d->document->characterCount()) // characterCount includes the terminating null. return; QTextCursor cursor = d->control->textCursor(); if (cursor.position() == pos && cursor.anchor() == pos) @@ -1112,6 +1154,7 @@ void QQuickTextEdit::componentComplete() Q_D(QQuickTextEdit); QQuickImplicitSizeItem::componentComplete(); + d->document->setBaseUrl(baseUrl(), d->richText); if (d->richText) d->useImageFallback = qmlEnableImageCache(); @@ -1338,7 +1381,7 @@ void QQuickTextEdit::selectWord() void QQuickTextEdit::select(int start, int end) { Q_D(QQuickTextEdit); - if (start < 0 || end < 0 || start > d->text.length() || end > d->text.length()) + if (start < 0 || end < 0 || start >= d->document->characterCount() || end >= d->document->characterCount()) return; QTextCursor cursor = d->control->textCursor(); cursor.beginEditBlock(); @@ -1359,12 +1402,11 @@ void QQuickTextEdit::select(int start, int end) */ bool QQuickTextEdit::isRightToLeft(int start, int end) { - Q_D(QQuickTextEdit); if (start > end) { qmlInfo(this) << "isRightToLeft(start, end) called with the end property being smaller than the start."; return false; } else { - return d->text.mid(start, end - start).isRightToLeft(); + return getText(start, end).isRightToLeft(); } } @@ -1499,6 +1541,15 @@ void QQuickTextEdit::itemChange(ItemChange change, const ItemChangeData &value) { if (change == ItemActiveFocusHasChanged) { setCursorVisible(value.boolValue); // ### refactor: focus handling && d->canvas && d->canvas->hasFocus()); + + if (value.boolValue) { + q_updateAlignment(); + connect(qApp->inputPanel(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), + this, SLOT(q_updateAlignment())); + } else { + disconnect(qApp->inputPanel(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), + this, SLOT(q_updateAlignment())); + } } QQuickItem::itemChange(change, value); } @@ -1558,11 +1609,27 @@ void QQuickTextEdit::updateImageCache(const QRectF &) } +void QQuickTextEdit::triggerPreprocess() +{ + Q_D(QQuickTextEdit); + if (d->updateType == QQuickTextEditPrivate::UpdateNone) + d->updateType = QQuickTextEditPrivate::UpdateOnlyPreprocess; + update(); +} + QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData) { Q_UNUSED(updatePaintNodeData); Q_D(QQuickTextEdit); + if (d->updateType != QQuickTextEditPrivate::UpdatePaintNode && oldNode != 0) { + // Update done in preprocess() in the nodes + d->updateType = QQuickTextEditPrivate::UpdateNone; + return oldNode; + } + + d->updateType = QQuickTextEditPrivate::UpdateNone; + QSGNode *currentNode = oldNode; if (d->richText && d->useImageFallback) { QSGImageNode *node = 0; @@ -1600,7 +1667,7 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData * QQuickTextNode *node = 0; if (oldNode == 0 || d->nodeType != QQuickTextEditPrivate::NodeIsText) { delete oldNode; - node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext()); + node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext(), this); d->nodeType = QQuickTextEditPrivate::NodeIsText; currentNode = node; } else { @@ -1761,6 +1828,7 @@ void QQuickTextEditPrivate::init() #endif FAST_CONNECT(document, SIGNAL(undoAvailable(bool)), q, SIGNAL(canUndoChanged())); FAST_CONNECT(document, SIGNAL(redoAvailable(bool)), q, SIGNAL(canRedoChanged())); + FAST_CONNECT(document, SIGNAL(imagesLoaded()), q, SLOT(updateSize())); document->setDefaultFont(font); document->setDocumentMargin(textMargin); @@ -1772,13 +1840,13 @@ void QQuickTextEditPrivate::init() void QQuickTextEdit::q_textChanged() { Q_D(QQuickTextEdit); - d->text = text(); + d->textCached = false; d->rightToLeftText = d->document->begin().layout()->engine()->isRightToLeft(); d->determineHorizontalAlignment(); d->updateDefaultTextOption(); updateSize(); updateTotalLines(); - emit textChanged(d->text); + emit textChanged(); } void QQuickTextEdit::moveCursorDelegate() @@ -1910,6 +1978,7 @@ void QQuickTextEdit::updateDocument() if (isComponentComplete()) { updateImageCache(); + d->updateType = QQuickTextEditPrivate::UpdatePaintNode; update(); } } @@ -1919,10 +1988,20 @@ void QQuickTextEdit::updateCursor() Q_D(QQuickTextEdit); if (isComponentComplete()) { updateImageCache(d->control->cursorRect()); + d->updateType = QQuickTextEditPrivate::UpdatePaintNode; update(); } } +void QQuickTextEdit::q_updateAlignment() +{ + Q_D(QQuickTextEdit); + if (d->determineHorizontalAlignment()) { + d->updateDefaultTextOption(); + moveCursorDelegate(); + } +} + void QQuickTextEdit::updateTotalLines() { Q_D(QQuickTextEdit); diff --git a/src/quick/items/qquicktextedit_p.h b/src/quick/items/qquicktextedit_p.h index f37b7cd8ff..8d268ea6f8 100644 --- a/src/quick/items/qquicktextedit_p.h +++ b/src/quick/items/qquicktextedit_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -93,6 +93,7 @@ class Q_AUTOTEST_EXPORT QQuickTextEdit : public QQuickImplicitSizeItem Q_PROPERTY(bool canUndo READ canUndo NOTIFY canUndoChanged) Q_PROPERTY(bool canRedo READ canRedo NOTIFY canRedoChanged) Q_PROPERTY(bool inputMethodComposing READ isInputMethodComposing NOTIFY inputMethodComposingChanged) + Q_PROPERTY(QUrl baseUrl READ baseUrl WRITE setBaseUrl RESET resetBaseUrl NOTIFY baseUrlChanged) public: QQuickTextEdit(QQuickItem *parent=0); @@ -214,6 +215,10 @@ public: qreal paintedWidth() const; qreal paintedHeight() const; + QUrl baseUrl() const; + void setBaseUrl(const QUrl &url); + void resetBaseUrl(); + Q_INVOKABLE QRectF positionToRectangle(int) const; Q_INVOKABLE int positionAt(int x, int y) const; Q_INVOKABLE void moveCursorSelection(int pos); @@ -227,7 +232,7 @@ public: Q_INVOKABLE QString getFormattedText(int start, int end) const; Q_SIGNALS: - void textChanged(const QString &); + void textChanged(); void paintedSizeChanged(); void cursorPositionChanged(); void cursorRectangleChanged(); @@ -257,6 +262,7 @@ Q_SIGNALS: void canRedoChanged(); void inputMethodComposingChanged(); void effectiveHorizontalAlignmentChanged(); + void baseUrlChanged(); public Q_SLOTS: void selectAll(); @@ -282,9 +288,11 @@ private Q_SLOTS: void q_canPasteChanged(); void updateDocument(); void updateCursor(); + void q_updateAlignment(); + void updateSize(); + void triggerPreprocess(); private: - void updateSize(); void updateTotalLines(); void updateImageCache(const QRectF &rect = QRectF()); diff --git a/src/quick/items/qquicktextedit_p_p.h b/src/quick/items/qquicktextedit_p_p.h index fe2172def6..f8996c95ee 100644 --- a/src/quick/items/qquicktextedit_p_p.h +++ b/src/quick/items/qquicktextedit_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -74,13 +74,17 @@ public: documentDirty(true), dirty(false), richText(false), cursorVisible(false), focusOnPress(true), persistentSelection(true), requireImplicitWidth(false), selectByMouse(false), canPaste(false), canPasteValid(false), hAlignImplicit(true), rightToLeftText(false), useImageFallback(false), + textCached(false), textMargin(0.0), lastSelectionStart(0), lastSelectionEnd(0), cursorComponent(0), cursor(0), format(QQuickTextEdit::PlainText), document(0), wrapMode(QQuickTextEdit::NoWrap), mouseSelectionMode(QQuickTextEdit::SelectCharacters), - lineCount(0), yoff(0), nodeType(NodeIsNull), texture(0) + lineCount(0), yoff(0), nodeType(NodeIsNull), texture(0), updateType(UpdatePaintNode) { } + static QQuickTextEditPrivate *get(QQuickTextEdit *item) { + return static_cast<QQuickTextEditPrivate *>(QObjectPrivate::get(item)); } + void init(); void updateDefaultTextOption(); @@ -91,6 +95,7 @@ public: qreal getImplicitWidth() const; QString text; + QUrl baseUrl; QFont font; QFont sourceFont; QColor color; @@ -114,6 +119,7 @@ public: bool hAlignImplicit:1; bool rightToLeftText:1; bool useImageFallback:1; + bool textCached:1; qreal textMargin; int lastSelectionStart; @@ -137,6 +143,13 @@ public: NodeType nodeType; QSGTexture *texture; QPixmap pixmapCache; + + enum UpdateType { + UpdateNone, + UpdateOnlyPreprocess, + UpdatePaintNode + }; + UpdateType updateType; }; QT_END_NAMESPACE diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index e569581163..237db3537d 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -102,6 +102,7 @@ void QQuickTextInput::componentComplete() QQuickImplicitSizeItem::componentComplete(); + d->checkIsValid(); d->updateLayout(); updateCursorRectangle(); if (d->cursorComponent && d->cursorComponent->isReady()) @@ -327,6 +328,7 @@ void QQuickTextInput::setColor(const QColor &c) if (c != d->color) { d->color = c; d->textLayoutDirty = true; + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); emit colorChanged(c); } @@ -354,6 +356,7 @@ void QQuickTextInput::setSelectionColor(const QColor &color) d->m_palette.setColor(QPalette::Highlight, d->selectionColor); if (d->hasSelectedText()) { d->textLayoutDirty = true; + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); } emit selectionColorChanged(color); @@ -379,6 +382,7 @@ void QQuickTextInput::setSelectedTextColor(const QColor &color) d->m_palette.setColor(QPalette::HighlightedText, d->selectedTextColor); if (d->hasSelectedText()) { d->textLayoutDirty = true; + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); } emit selectedTextColorChanged(color); @@ -403,8 +407,8 @@ void QQuickTextInput::setSelectedTextColor(const QColor &color) The valid values for \c horizontalAlignment are \c TextInput.AlignLeft, \c TextInput.AlignRight and \c TextInput.AlignHCenter. - Valid values for \c verticalAlignment are \c TextEdit.AlignTop (default), - \c TextEdit.AlignBottom \c TextEdit.AlignVCenter. + Valid values for \c verticalAlignment are \c TextInput.AlignTop (default), + \c TextInput.AlignBottom \c TextInput.AlignVCenter. When using the attached property LayoutMirroring::enabled to mirror application layouts, the horizontal alignment of text will also be mirrored. However, the property @@ -506,7 +510,7 @@ void QQuickTextInput::setVAlign(QQuickTextInput::VAlignment alignment) /*! \qmlproperty enumeration QtQuick2::TextInput::wrapMode - Set this property to wrap the text to the TextEdit item's width. + Set this property to wrap the text to the TextInput item's width. The text will only wrap if an explicit width has been set. \list @@ -641,6 +645,7 @@ void QQuickTextInput::setCursorVisible(bool on) return; d->cursorVisible = on; d->setCursorBlinkPeriod(on ? qApp->styleHints()->cursorFlashTime() : 0); + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); emit cursorVisibleChanged(d->cursorVisible); } @@ -842,6 +847,23 @@ void QQuickTextInput::setAutoScroll(bool b) \ingroup qml-basic-visual-elements This element provides a validator for non-integer numbers. + + Input is accepted if it contains a double that is within the valid range + and is in the correct format. + + Input is accepected but invalid if it contains a double that is outside + the range or is in the wrong format; e.g. with too many digits after the + decimal point or is empty. + + Input is rejected if it is not a double. + + Note: If the valid range consists of just positive doubles (e.g. 0.0 to + 100.0) and input is a negative double then it is rejected. If \l notation + is set to DoubleValidator.StandardNotation, and the input contains more + digits before the decimal point than a double in the valid range may have, + it is also rejected. If \l notation is DoubleValidator.ScientificNotation, + and the input is not in the valid range, it is accecpted but invalid. The + value may yet become valid by changing the exponent. */ /*! @@ -931,20 +953,32 @@ void QQuickTextInput::setValidator(QValidator* v) return; d->m_validator = v; - if (!d->hasAcceptableInput(d->m_text)) { - if (d->m_validInput) { - d->m_validInput = false; - emit acceptableInputChanged(); - } - } else if (!d->m_validInput) { - d->m_validInput = true; - emit acceptableInputChanged(); - } + + if (isComponentComplete()) + d->checkIsValid(); emit validatorChanged(); } + #endif // QT_NO_VALIDATOR +void QQuickTextInputPrivate::checkIsValid() +{ + Q_Q(QQuickTextInput); + + ValidatorState state = hasAcceptableInput(m_text); + m_validInput = state != InvalidInput; + if (state != AcceptableInput) { + if (m_acceptableInput) { + m_acceptableInput = false; + emit q->acceptableInputChanged(); + } + } else if (!m_acceptableInput) { + m_acceptableInput = true; + emit q->acceptableInputChanged(); + } +} + /*! \qmlproperty string QtQuick2::TextInput::inputMask @@ -981,7 +1015,7 @@ void QQuickTextInput::setInputMask(const QString &im) bool QQuickTextInput::hasAcceptableInput() const { Q_D(const QQuickTextInput); - return d->hasAcceptableInput(d->m_text); + return d->hasAcceptableInput(d->m_text) == QQuickTextInputPrivate::AcceptableInput; } /*! @@ -1591,14 +1625,30 @@ void QQuickTextInputPrivate::updateVerticalScroll() textLayoutDirty = true; } +void QQuickTextInput::triggerPreprocess() +{ + Q_D(QQuickTextInput); + if (d->updateType == QQuickTextInputPrivate::UpdateNone) + d->updateType = QQuickTextInputPrivate::UpdateOnlyPreprocess; + update(); +} + QSGNode *QQuickTextInput::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) { Q_UNUSED(data); Q_D(QQuickTextInput); + if (d->updateType != QQuickTextInputPrivate::UpdatePaintNode && oldNode != 0) { + // Update done in preprocess() in the nodes + d->updateType = QQuickTextInputPrivate::UpdateNone; + return oldNode; + } + + d->updateType = QQuickTextInputPrivate::UpdateNone; + QQuickTextNode *node = static_cast<QQuickTextNode *>(oldNode); if (node == 0) - node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext()); + node = new QQuickTextNode(QQuickItemPrivate::get(this)->sceneGraphContext(), this); d->textNode = node; if (!d->textLayoutDirty) { @@ -2065,7 +2115,7 @@ void QQuickTextInput::setMouseSelectionMode(SelectionMode mode) \qmlproperty bool QtQuick2::TextInput::canPaste Returns true if the TextInput is writable and the content of the clipboard is - suitable for pasting into the TextEdit. + suitable for pasting into the TextInput. */ bool QQuickTextInput::canPaste() const { @@ -2125,9 +2175,9 @@ void QQuickTextInput::moveCursorSelection(int position) basis. If not specified the selection mode will default to TextInput.SelectCharacters. \list - \o TextEdit.SelectCharacters - Sets either the selectionStart or selectionEnd (whichever was at + \o TextInput.SelectCharacters - Sets either the selectionStart or selectionEnd (whichever was at the previous cursor position) to the specified position. - \o TextEdit.SelectWords - Sets the selectionStart and selectionEnd to include all + \o TextInput.SelectWords - Sets the selectionStart and selectionEnd to include all words between the specified position and the previous cursor position. Words partially in the range are included. \endlist @@ -2316,6 +2366,12 @@ void QQuickTextInput::itemChange(ItemChange change, const ItemChangeData &value) if (!hasFocus) { d->commitPreedit(); d->deselect(); + disconnect(qApp->inputPanel(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), + this, SLOT(q_updateAlignment())); + } else { + q_updateAlignment(); + connect(qApp->inputPanel(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), + this, SLOT(q_updateAlignment())); } } QQuickItem::itemChange(change, value); @@ -2372,6 +2428,7 @@ void QQuickTextInput::updateCursorRectangle() d->updateHorizontalScroll(); d->updateVerticalScroll(); + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); emit cursorRectangleChanged(); if (d->cursorItem) { @@ -2385,6 +2442,7 @@ void QQuickTextInput::selectionChanged() { Q_D(QQuickTextInput); d->textLayoutDirty = true; //TODO: Only update rect in selection + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); emit selectedTextChanged(); @@ -2444,6 +2502,15 @@ void QQuickTextInput::q_canPasteChanged() } +void QQuickTextInput::q_updateAlignment() +{ + Q_D(QQuickTextInput); + if (d->determineHorizontalAlignment()) { + d->updateLayout(); + updateCursorRectangle(); + } +} + // ### these should come from QStyleHints const int textCursorWidth = 1; const bool fullWidthSelection = true; @@ -2510,7 +2577,7 @@ void QQuickTextInputPrivate::updateLayout() return; QTextOption option = m_textLayout.textOption(); - option.setTextDirection(m_layoutDirection); + option.setTextDirection(layoutDirection()); option.setFlags(QTextOption::IncludeTrailingSpaces); option.setWrapMode(QTextOption::WrapMode(wrapMode)); option.setAlignment(Qt::Alignment(q->effectiveHAlign())); @@ -2539,6 +2606,7 @@ void QQuickTextInputPrivate::updateLayout() m_ascent = qRound(firstLine.ascent()); textLayoutDirty = true; + updateType = UpdatePaintNode; q->update(); q->setImplicitSize(qCeil(boundingRect.width()), qCeil(boundingRect.height())); @@ -2984,16 +3052,21 @@ bool QQuickTextInputPrivate::finishChange(int validateFromState, bool update, bo Q_UNUSED(update) bool notifyInputPanel = m_textDirty || m_selDirty; + bool alignmentChanged = false; if (m_textDirty) { // do validation bool wasValidInput = m_validInput; + bool wasAcceptable = m_acceptableInput; m_validInput = true; + m_acceptableInput = true; #ifndef QT_NO_VALIDATOR if (m_validator) { QString textCopy = m_text; int cursorCopy = m_cursor; - m_validInput = (m_validator->validate(textCopy, cursorCopy) != QValidator::Invalid); + QValidator::State state = m_validator->validate(textCopy, cursorCopy); + m_validInput = state != QValidator::Invalid; + m_acceptableInput = state == QValidator::Acceptable; if (m_validInput) { if (m_text != textCopy) { internalSetText(textCopy, cursorCopy); @@ -3020,24 +3093,28 @@ bool QQuickTextInputPrivate::finishChange(int validateFromState, bool update, bo if (m_modifiedState > m_undoState) m_modifiedState = -1; m_validInput = true; + m_acceptableInput = wasAcceptable; m_textDirty = false; } if (m_textDirty) { m_textDirty = false; m_preeditDirty = false; - determineHorizontalAlignment(); + alignmentChanged = determineHorizontalAlignment(); emit q->textChanged(); } - updateDisplayText(); + updateDisplayText(alignmentChanged); - if (m_validInput != wasValidInput) + if (m_acceptableInput != wasAcceptable) emit q->acceptableInputChanged(); } if (m_preeditDirty) { m_preeditDirty = false; - determineHorizontalAlignment(); + if (determineHorizontalAlignment()) { + alignmentChanged = true; + updateLayout(); + } } if (m_selDirty) { @@ -3049,7 +3126,9 @@ bool QQuickTextInputPrivate::finishChange(int validateFromState, bool update, bo if (notifyInputPanel) q->updateMicroFocus(); emitUndoRedoChanged(); - emitCursorPositionChanged(); + + if (!emitCursorPositionChanged() && alignmentChanged) + q->updateCursorRectangle(); return true; } @@ -3399,32 +3478,34 @@ bool QQuickTextInputPrivate::isValidInput(QChar key, QChar mask) const Otherwise returns false */ -bool QQuickTextInputPrivate::hasAcceptableInput(const QString &str) const +QQuickTextInputPrivate::ValidatorState QQuickTextInputPrivate::hasAcceptableInput(const QString &str) const { #ifndef QT_NO_VALIDATOR QString textCopy = str; int cursorCopy = m_cursor; - if (m_validator && m_validator->validate(textCopy, cursorCopy) - != QValidator::Acceptable) - return false; + if (m_validator) { + QValidator::State state = m_validator->validate(textCopy, cursorCopy); + if (state != QValidator::Acceptable) + return ValidatorState(state); + } #endif if (!m_maskData) - return true; + return AcceptableInput; if (str.length() != m_maxLength) - return false; + return InvalidInput; for (int i=0; i < m_maxLength; ++i) { if (m_maskData[i].separator) { if (str.at(i) != m_maskData[i].maskChar) - return false; + return InvalidInput; } else { if (!isValidInput(str.at(i), m_maskData[i].maskChar)) - return false; + return InvalidInput; } } - return true; + return AcceptableInput; } /*! @@ -3683,7 +3764,7 @@ void QQuickTextInputPrivate::emitUndoRedoChanged() If the current cursor position differs from the last emitted cursor position, emits cursorPositionChanged(). */ -void QQuickTextInputPrivate::emitCursorPositionChanged() +bool QQuickTextInputPrivate::emitCursorPositionChanged() { Q_Q(QQuickTextInput); if (m_cursor != m_lastCursorPos) { @@ -3710,7 +3791,10 @@ void QQuickTextInputPrivate::emitCursorPositionChanged() #ifndef QT_NO_ACCESSIBILITY QAccessible::updateAccessibility(q, 0, QAccessible::TextCaretMoved); #endif + + return true; } + return false; } @@ -3727,8 +3811,10 @@ void QQuickTextInputPrivate::setCursorBlinkPeriod(int msec) m_blinkStatus = 1; } else { m_blinkTimer = 0; - if (m_blinkStatus == 1) + if (m_blinkStatus == 1) { + updateType = UpdatePaintNode; q->update(); + } } m_blinkPeriod = msec; } @@ -3748,6 +3834,7 @@ void QQuickTextInput::timerEvent(QTimerEvent *event) Q_D(QQuickTextInput); if (event->timerId() == d->m_blinkTimer) { d->m_blinkStatus = !d->m_blinkStatus; + d->updateType = QQuickTextInputPrivate::UpdatePaintNode; update(); } else if (event->timerId() == d->m_deleteAllTimer) { killTimer(d->m_deleteAllTimer); diff --git a/src/quick/items/qquicktextinput_p.h b/src/quick/items/qquicktextinput_p.h index 535b1af266..92d09c3efd 100644 --- a/src/quick/items/qquicktextinput_p.h +++ b/src/quick/items/qquicktextinput_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -323,6 +323,8 @@ private Q_SLOTS: void createCursor(); void updateCursorRectangle(); void q_canPasteChanged(); + void q_updateAlignment(); + void triggerPreprocess(); private: Q_DECLARE_PRIVATE(QQuickTextInput) diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h index 3f28c4aefd..1fc55658e6 100644 --- a/src/quick/items/qquicktextinput_p_p.h +++ b/src/quick/items/qquicktextinput_p_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -125,8 +125,10 @@ public: , m_preeditDirty(0) , m_selDirty(0) , m_validInput(1) + , m_acceptableInput(1) , m_blinkStatus(0) , m_passwordEchoEditing(false) + , updateType(UpdatePaintNode) { } @@ -251,9 +253,17 @@ public: uint m_preeditDirty : 1; uint m_selDirty : 1; uint m_validInput : 1; + uint m_acceptableInput : 1; uint m_blinkStatus : 1; uint m_passwordEchoEditing; + enum UpdateType { + UpdateNone, + UpdateOnlyPreprocess, + UpdatePaintNode + }; + UpdateType updateType; + static inline QQuickTextInputPrivate *get(QQuickTextInput *t) { return t->d_func(); } @@ -424,7 +434,7 @@ private: void internalRedo(); void emitUndoRedoChanged(); - void emitCursorPositionChanged(); + bool emitCursorPositionChanged(); bool finishChange(int validateFromState = -1, bool update = false, bool edited = true); @@ -432,10 +442,23 @@ private: inline void separate() { m_separator = true; } + enum ValidatorState { +#ifndef QT_NO_VALIDATOR + InvalidInput = QValidator::Invalid, + IntermediateInput = QValidator::Intermediate, + AcceptableInput = QValidator::Acceptable +#else + Invalid, + Intermediate, + Acceptable +#endif + }; + // masking void parseInputMask(const QString &maskFields); bool isValidInput(QChar key, QChar mask) const; - bool hasAcceptableInput(const QString &text) const; + ValidatorState hasAcceptableInput(const QString &text) const; + void checkIsValid(); QString maskString(uint pos, const QString &str, bool clear = false) const; QString clearString(uint pos, uint len) const; QString stripString(const QString &str) const; diff --git a/src/quick/items/qquicktextnode.cpp b/src/quick/items/qquicktextnode.cpp index fcb1c855ec..2f72b0c8fe 100644 --- a/src/quick/items/qquicktextnode.cpp +++ b/src/quick/items/qquicktextnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -56,6 +56,7 @@ #include <qtexttable.h> #include <qtextlist.h> #include <private/qdeclarativestyledtext_p.h> +#include <private/qquicktext_p_p.h> #include <private/qfont_p.h> #include <private/qfontengine_p.h> #include <private/qrawfont_p.h> @@ -68,8 +69,8 @@ QT_BEGIN_NAMESPACE /*! Creates an empty QQuickTextNode */ -QQuickTextNode::QQuickTextNode(QSGContext *context) - : m_context(context), m_cursorNode(0) +QQuickTextNode::QQuickTextNode(QSGContext *context, QQuickItem *ownerElement) + : m_context(context), m_cursorNode(0), m_ownerElement(ownerElement) { #if defined(QML_RUNTIME_TESTING) description = QLatin1String("text"); @@ -130,6 +131,7 @@ QSGGlyphNode *QQuickTextNode::addGlyphs(const QPointF &position, const QGlyphRun QSGNode *parentNode) { QSGGlyphNode *node = m_context->createGlyphNode(); + node->setOwnerElement(m_ownerElement); node->setGlyphs(position + QPointF(0, glyphs.rawFont().ascent()), glyphs); node->setStyle(style); node->setStyleColor(styleColor); @@ -329,6 +331,12 @@ namespace { void addImage(const QRectF &rect, const QImage &image, qreal ascent, BinaryTreeNode::SelectionState selectionState, QTextFrameFormat::Position layoutPosition); + int addText(const QTextBlock &block, + const QTextCharFormat &charFormat, + const QColor &textColor, + const QVarLengthArray<QTextLayout::FormatRange> &colorChanges, + int textPos, int fragmentEnd, + int selectionStart, int selectionEnd); void addTextObject(const QPointF &position, const QTextCharFormat &format, BinaryTreeNode::SelectionState selectionState, QTextDocument *textDocument, int pos, @@ -407,6 +415,45 @@ namespace { QList<QPair<QRectF, QImage> > m_images; }; + int SelectionEngine::addText(const QTextBlock &block, + const QTextCharFormat &charFormat, + const QColor &textColor, + const QVarLengthArray<QTextLayout::FormatRange> &colorChanges, + int textPos, int fragmentEnd, + int selectionStart, int selectionEnd) + { + if (charFormat.foreground().style() != Qt::NoBrush) + setTextColor(charFormat.foreground().color()); + else + setTextColor(textColor); + + while (textPos < fragmentEnd) { + int blockRelativePosition = textPos - block.position(); + QTextLine line = block.layout()->lineForTextPosition(blockRelativePosition); + if (!currentLine().isValid() + || line.lineNumber() != currentLine().lineNumber()) { + setCurrentLine(line); + } + + Q_ASSERT(line.textLength() > 0); + int lineEnd = line.textStart() + block.position() + line.textLength(); + + int len = qMin(lineEnd - textPos, fragmentEnd - textPos); + Q_ASSERT(len > 0); + + int currentStepEnd = textPos + len; + + addGlyphsForRanges(colorChanges, + textPos - block.position(), + currentStepEnd - block.position(), + selectionStart - block.position(), + selectionEnd - block.position()); + + textPos = currentStepEnd; + } + return textPos; + } + void SelectionEngine::addTextDecorations(const QVarLengthArray<TextDecoration> &textDecorations, qreal offset, qreal thickness) { @@ -657,8 +704,15 @@ namespace { if (format.objectType() == QTextFormat::ImageObject) { QTextImageFormat imageFormat = format.toImageFormat(); - QTextImageHandler *imageHandler = static_cast<QTextImageHandler *>(handler); - image = imageHandler->image(textDocument, imageFormat); + if (QQuickTextDocumentWithImageResources *imageDoc = qobject_cast<QQuickTextDocumentWithImageResources *>(textDocument)) { + image = imageDoc->image(imageFormat); + + if (image.isNull()) + return; + } else { + QTextImageHandler *imageHandler = static_cast<QTextImageHandler *>(handler); + image = imageHandler->image(textDocument, imageFormat); + } } if (image.isNull()) { @@ -1155,6 +1209,13 @@ void QQuickTextNode::addTextDocument(const QPointF &, QTextDocument *textDocumen int textPos = block.position(); QTextBlock::iterator blockIterator = block.begin(); + if (blockIterator.atEnd() && preeditLength) { + engine.setPosition(blockPosition); + textPos = engine.addText(block, block.charFormat(), textColor, colorChanges, + textPos, textPos + preeditLength, + selectionStart, selectionEnd); + } + while (!blockIterator.atEnd()) { QTextFragment fragment = blockIterator.fragment(); QString text = fragment.text(); @@ -1183,42 +1244,15 @@ void QQuickTextNode::addTextDocument(const QPointF &, QTextDocument *textDocumen } textPos += text.length(); } else { - if (charFormat.foreground().style() != Qt::NoBrush) - engine.setTextColor(charFormat.foreground().color()); - else - engine.setTextColor(textColor); - int fragmentEnd = textPos + fragment.length(); if (preeditPosition >= 0 && preeditPosition >= textPos - && preeditPosition < fragmentEnd) { + && preeditPosition <= fragmentEnd) { fragmentEnd += preeditLength; } - while (textPos < fragmentEnd) { - int blockRelativePosition = textPos - block.position(); - QTextLine line = block.layout()->lineForTextPosition(blockRelativePosition); - if (!engine.currentLine().isValid() - || line.lineNumber() != engine.currentLine().lineNumber()) { - engine.setCurrentLine(line); - } - - Q_ASSERT(line.textLength() > 0); - int lineEnd = line.textStart() + block.position() + line.textLength(); - - int len = qMin(lineEnd - textPos, fragmentEnd - textPos); - Q_ASSERT(len > 0); - - int currentStepEnd = textPos + len; - - engine.addGlyphsForRanges(colorChanges, - textPos - block.position(), - currentStepEnd - block.position(), - selectionStart - block.position(), - selectionEnd - block.position()); - - textPos = currentStepEnd; - } + engine.addText(block, charFormat, textColor, colorChanges, textPos, fragmentEnd, + selectionStart, selectionEnd); } ++blockIterator; diff --git a/src/quick/items/qquicktextnode_p.h b/src/quick/items/qquicktextnode_p.h index a519322160..f64933b09f 100644 --- a/src/quick/items/qquicktextnode_p.h +++ b/src/quick/items/qquicktextnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -74,7 +74,7 @@ public: }; Q_DECLARE_FLAGS(Decorations, Decoration) - QQuickTextNode(QSGContext *); + QQuickTextNode(QSGContext *, QQuickItem *ownerElement); ~QQuickTextNode(); static bool isComplexRichText(QTextDocument *); @@ -103,6 +103,7 @@ private: QSGContext *m_context; QSGSimpleRectNode *m_cursorNode; QList<QSGTexture *> m_textures; + QQuickItem *m_ownerElement; }; QT_END_NAMESPACE diff --git a/src/quick/items/qquicktranslate.cpp b/src/quick/items/qquicktranslate.cpp index c1b00d4653..887159f9bc 100644 --- a/src/quick/items/qquicktranslate.cpp +++ b/src/quick/items/qquicktranslate.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquicktranslate_p.h b/src/quick/items/qquicktranslate_p.h index 1a7a56e49b..7f29870c36 100644 --- a/src/quick/items/qquicktranslate_p.h +++ b/src/quick/items/qquicktranslate_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickview.cpp b/src/quick/items/qquickview.cpp index 8c7db60195..638cbb7ff3 100644 --- a/src/quick/items/qquickview.cpp +++ b/src/quick/items/qquickview.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickview.h b/src/quick/items/qquickview.h index 3c637689d3..871105c143 100644 --- a/src/quick/items/qquickview.h +++ b/src/quick/items/qquickview.h @@ -1,9 +1,9 @@ // Commit: 0b83a2161261be525f01359397ab1c8c34827749 /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickview_p.h b/src/quick/items/qquickview_p.h index 585269ad2e..d4f2449069 100644 --- a/src/quick/items/qquickview_p.h +++ b/src/quick/items/qquickview_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickvisualadaptormodel.cpp b/src/quick/items/qquickvisualadaptormodel.cpp index 66c26ddf44..01590ca86b 100644 --- a/src/quick/items/qquickvisualadaptormodel.cpp +++ b/src/quick/items/qquickvisualadaptormodel.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickvisualadaptormodel_p.h b/src/quick/items/qquickvisualadaptormodel_p.h index cfc5a6903d..49dfae8fc3 100644 --- a/src/quick/items/qquickvisualadaptormodel_p.h +++ b/src/quick/items/qquickvisualadaptormodel_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickvisualdatamodel.cpp b/src/quick/items/qquickvisualdatamodel.cpp index 3de1e91f7f..698c4f29da 100644 --- a/src/quick/items/qquickvisualdatamodel.cpp +++ b/src/quick/items/qquickvisualdatamodel.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -425,6 +425,10 @@ QQuickVisualDataModel::ReleaseFlags QQuickVisualDataModelPrivate::release(QObjec if (QQuickItem *item = qobject_cast<QQuickItem *>(object)) emitDestroyingItem(item); cacheItem->object = 0; + if (cacheItem->incubationTask) { + releaseIncubator(cacheItem->incubationTask); + cacheItem->incubationTask = 0; + } stat |= QQuickVisualModel::Destroyed; } else { stat |= QQuickVisualDataModel::Referenced; diff --git a/src/quick/items/qquickvisualdatamodel_p.h b/src/quick/items/qquickvisualdatamodel_p.h index 2a87e5ed15..df45a94211 100644 --- a/src/quick/items/qquickvisualdatamodel_p.h +++ b/src/quick/items/qquickvisualdatamodel_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickvisualdatamodel_p_p.h b/src/quick/items/qquickvisualdatamodel_p_p.h index 6a943806b2..b840ca8ff6 100644 --- a/src/quick/items/qquickvisualdatamodel_p_p.h +++ b/src/quick/items/qquickvisualdatamodel_p_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickvisualitemmodel.cpp b/src/quick/items/qquickvisualitemmodel.cpp index 947c1755b3..59726c96db 100644 --- a/src/quick/items/qquickvisualitemmodel.cpp +++ b/src/quick/items/qquickvisualitemmodel.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickvisualitemmodel_p.h b/src/quick/items/qquickvisualitemmodel_p.h index 3471e1a0cc..cf0fcce082 100644 --- a/src/quick/items/qquickvisualitemmodel_p.h +++ b/src/quick/items/qquickvisualitemmodel_p.h @@ -3,7 +3,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickwindowmanager.cpp b/src/quick/items/qquickwindowmanager.cpp index 87867c8ddf..a07efeaeb3 100644 --- a/src/quick/items/qquickwindowmanager.cpp +++ b/src/quick/items/qquickwindowmanager.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickwindowmanager_p.h b/src/quick/items/qquickwindowmanager_p.h index 8a5073effd..5078048fc3 100644 --- a/src/quick/items/qquickwindowmanager_p.h +++ b/src/quick/items/qquickwindowmanager_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickwindowmodule.cpp b/src/quick/items/qquickwindowmodule.cpp index 172ab91477..1ff1df3145 100644 --- a/src/quick/items/qquickwindowmodule.cpp +++ b/src/quick/items/qquickwindowmodule.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/items/qquickwindowmodule_p.h b/src/quick/items/qquickwindowmodule_p.h index c111a74955..d556b63131 100644 --- a/src/quick/items/qquickwindowmodule_p.h +++ b/src/quick/items/qquickwindowmodule_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -48,7 +48,6 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -QT_MODULE(Declarative) class QQuickWindowModule { diff --git a/src/quick/particles/qquickage.cpp b/src/quick/particles/qquickage.cpp index c6c59f88aa..6c4318180f 100644 --- a/src/quick/particles/qquickage.cpp +++ b/src/quick/particles/qquickage.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickage_p.h b/src/quick/particles/qquickage_p.h index 9844455968..ac1a02ff17 100644 --- a/src/quick/particles/qquickage_p.h +++ b/src/quick/particles/qquickage_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickangledirection.cpp b/src/quick/particles/qquickangledirection.cpp index e272d082ee..3c44162f2e 100644 --- a/src/quick/particles/qquickangledirection.cpp +++ b/src/quick/particles/qquickangledirection.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickangledirection_p.h b/src/quick/particles/qquickangledirection_p.h index ddf6666417..0fdba4c7d1 100644 --- a/src/quick/particles/qquickangledirection_p.h +++ b/src/quick/particles/qquickangledirection_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickcumulativedirection.cpp b/src/quick/particles/qquickcumulativedirection.cpp index 985152aee9..8ce07e50dd 100644 --- a/src/quick/particles/qquickcumulativedirection.cpp +++ b/src/quick/particles/qquickcumulativedirection.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickcumulativedirection_p.h b/src/quick/particles/qquickcumulativedirection_p.h index cc5ad4cc6d..6cd245dbfe 100644 --- a/src/quick/particles/qquickcumulativedirection_p.h +++ b/src/quick/particles/qquickcumulativedirection_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickcustomaffector.cpp b/src/quick/particles/qquickcustomaffector.cpp index 279b2a76c0..23e706cabb 100644 --- a/src/quick/particles/qquickcustomaffector.cpp +++ b/src/quick/particles/qquickcustomaffector.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickcustomaffector_p.h b/src/quick/particles/qquickcustomaffector_p.h index 2bcabebd13..8d1023d2a1 100644 --- a/src/quick/particles/qquickcustomaffector_p.h +++ b/src/quick/particles/qquickcustomaffector_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickcustomparticle.cpp b/src/quick/particles/qquickcustomparticle.cpp index e6f50c0ff6..86ba41ef68 100644 --- a/src/quick/particles/qquickcustomparticle.cpp +++ b/src/quick/particles/qquickcustomparticle.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickcustomparticle_p.h b/src/quick/particles/qquickcustomparticle_p.h index 583e61fa39..fa962a3495 100644 --- a/src/quick/particles/qquickcustomparticle_p.h +++ b/src/quick/particles/qquickcustomparticle_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickdirection.cpp b/src/quick/particles/qquickdirection.cpp index 3ee8cba89c..bcd4e2227c 100644 --- a/src/quick/particles/qquickdirection.cpp +++ b/src/quick/particles/qquickdirection.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickdirection_p.h b/src/quick/particles/qquickdirection_p.h index 70b255fd79..f2d1cea9a2 100644 --- a/src/quick/particles/qquickdirection_p.h +++ b/src/quick/particles/qquickdirection_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickellipseextruder.cpp b/src/quick/particles/qquickellipseextruder.cpp index d3deeeb340..daebad0c3e 100644 --- a/src/quick/particles/qquickellipseextruder.cpp +++ b/src/quick/particles/qquickellipseextruder.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickellipseextruder_p.h b/src/quick/particles/qquickellipseextruder_p.h index b167a517cb..29ac806289 100644 --- a/src/quick/particles/qquickellipseextruder_p.h +++ b/src/quick/particles/qquickellipseextruder_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickfriction.cpp b/src/quick/particles/qquickfriction.cpp index eccc6e6677..93c8efc64b 100644 --- a/src/quick/particles/qquickfriction.cpp +++ b/src/quick/particles/qquickfriction.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickfriction_p.h b/src/quick/particles/qquickfriction_p.h index aa0a6752b7..c5cf28a24d 100644 --- a/src/quick/particles/qquickfriction_p.h +++ b/src/quick/particles/qquickfriction_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickgravity.cpp b/src/quick/particles/qquickgravity.cpp index 9a402205a0..744cd76a88 100644 --- a/src/quick/particles/qquickgravity.cpp +++ b/src/quick/particles/qquickgravity.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickgravity_p.h b/src/quick/particles/qquickgravity_p.h index 568d62afb8..8119001c66 100644 --- a/src/quick/particles/qquickgravity_p.h +++ b/src/quick/particles/qquickgravity_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickgroupgoal.cpp b/src/quick/particles/qquickgroupgoal.cpp index f5c40eb213..d471396303 100644 --- a/src/quick/particles/qquickgroupgoal.cpp +++ b/src/quick/particles/qquickgroupgoal.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickgroupgoal_p.h b/src/quick/particles/qquickgroupgoal_p.h index 3643159c79..b6ab84c103 100644 --- a/src/quick/particles/qquickgroupgoal_p.h +++ b/src/quick/particles/qquickgroupgoal_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickimageparticle.cpp b/src/quick/particles/qquickimageparticle.cpp index 5ca7d80925..b8b05f2330 100644 --- a/src/quick/particles/qquickimageparticle.cpp +++ b/src/quick/particles/qquickimageparticle.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -53,10 +53,9 @@ #include <QtQuick/qsgengine.h> #include <QtQuick/private/qsgtexture_p.h> #include <private/qdeclarativeglobal_p.h> +#include <cmath> QT_BEGIN_NAMESPACE -//###Switch to define later, for now user-friendly (no compilation) debugging is worth it -DEFINE_BOOL_CONFIG_OPTION(qmlParticlesDebug, QML_PARTICLES_DEBUG) #ifndef QT_OPENGL_ES_2 #define SHADER_DEFINES "#version 120\n" @@ -84,9 +83,8 @@ static const char vertexShaderCode[] = "attribute highp vec3 vRotation; //x = radians of rotation, y=rotation speed, z= bool autoRotate\n" "#endif\n" "#if defined(SPRITE)\n" - "attribute highp vec4 vAnimData;// interpolate(bool), duration, frameCount (this anim), timestamp (this anim)\n" - "attribute highp vec4 vAnimPos;//sheet x,y, width/height of this anim\n" - "uniform highp vec2 animSheetSize; //width/height of whole sheet\n" + "attribute highp vec3 vAnimData;// w,h(premultiplied of anim), interpolation progress\n" + "attribute highp vec4 vAnimPos;//x,y, x,y (two frames for interpolation)\n" "#endif\n" "\n" "uniform highp mat4 qt_Matrix;\n" @@ -119,18 +117,12 @@ static const char vertexShaderCode[] = "#endif\n" " } else {\n" "#if defined(SPRITE)\n" + " tt.y = vAnimData.z;\n" " //Calculate frame location in texture\n" - " highp float frameIndex = mod((((timestamp - vAnimData.w)*1000.)/vAnimData.y),vAnimData.z);\n" - " tt.y = mod((timestamp - vAnimData.w)*1000., vAnimData.y) / vAnimData.y;\n" - "\n" - " frameIndex = floor(frameIndex);\n" - " fTexS.xy = vec2(((frameIndex + vPosTex.z) * vAnimPos.z / animSheetSize.x), ((vAnimPos.y + vPosTex.w * vAnimPos.w) / animSheetSize.y));\n" - "\n" + " fTexS.xy = vAnimPos.xy + vPosTex.zw * vAnimData.xy;\n" " //Next frame is also passed, for interpolation\n" - " //### Should the next anim be precalculated to allow for interpolation there?\n" - " if (vAnimData.x == 1.0 && frameIndex != vAnimData.z - 1.)//Can't do it for the last frame though, this anim may not loop\n" - " frameIndex = mod(frameIndex+1., vAnimData.z);\n" - " fTexS.zw = vec2(((frameIndex + vPosTex.z) * vAnimPos.z / animSheetSize.x), ((vAnimPos.y + vPosTex.w * vAnimPos.w) / animSheetSize.y));\n" + " fTexS.zw = vAnimPos.zw + vPosTex.zw * vAnimData.xy;\n" + "\n" "#elif defined(DEFORM)\n" " fTex = vPosTex.zw;\n" "#endif\n" @@ -415,8 +407,8 @@ public: program()->setUniformValue("texture", 0); program()->setUniformValue("colortable", 1); glFuncs = QOpenGLContext::currentContext()->functions(); + //Don't actually expose the animSheetSize in the shader, it's currently only used for CPU calculations. m_timestamp_id = program()->uniformLocation("timestamp"); - m_animsize_id = program()->uniformLocation("animSheetSize"); m_entry_id = program()->uniformLocation("entry"); m_sizetable_id = program()->uniformLocation("sizetable"); m_opacitytable_id = program()->uniformLocation("opacitytable"); @@ -431,14 +423,12 @@ public: d->texture->bind(); program()->setUniformValue(m_timestamp_id, (float) d->timestamp); - program()->setUniformValue(m_animsize_id, d->animSheetSize); program()->setUniformValue(m_entry_id, (float) d->entry); program()->setUniformValueArray(m_sizetable_id, (float*) d->sizeTable, 64, 1); program()->setUniformValueArray(m_opacitytable_id, (float*) d->opacityTable, UNIFORM_ARRAY_SIZE, 1); } int m_timestamp_id; - int m_animsize_id; int m_entry_id; int m_sizetable_id; int m_opacitytable_id; @@ -825,7 +815,6 @@ QQuickImageParticle::QQuickImageParticle(QQuickItem* parent) , m_entryEffect(Fade) { setFlag(ItemHasContents); - m_debugMode = qmlParticlesDebug(); } QQuickImageParticle::~QQuickImageParticle() @@ -1115,7 +1104,7 @@ void QQuickImageParticle::createEngine() if (m_sprites.count()) { m_spriteEngine = new QQuickSpriteEngine(m_sprites, this); connect(m_spriteEngine, SIGNAL(stateChanged(int)), - this, SLOT(spriteAdvance(int))); + this, SLOT(spriteAdvance(int)), Qt::DirectConnection); m_explicitAnimation = true; } else { m_spriteEngine = 0; @@ -1174,14 +1163,14 @@ static QSGGeometry::Attribute SpriteParticle_Attributes[] = { QSGGeometry::Attribute::create(3, 4, GL_UNSIGNED_BYTE), // Colors QSGGeometry::Attribute::create(4, 4, GL_FLOAT), // DeformationVectors QSGGeometry::Attribute::create(5, 3, GL_FLOAT), // Rotation - QSGGeometry::Attribute::create(6, 4, GL_FLOAT), // Anim Data + QSGGeometry::Attribute::create(6, 3, GL_FLOAT), // Anim Data QSGGeometry::Attribute::create(7, 4, GL_FLOAT) // Anim Pos }; static QSGGeometry::AttributeSet SpriteParticle_AttributeSet = { 8, // Attribute Count - (4 + 4 + 4 + 4 + 4 + 4 + 3) * sizeof(float) + 4 * sizeof(uchar), + (4 + 4 + 4 + 4 + 3 + 3 + 4) * sizeof(float) + 4 * sizeof(uchar), SpriteParticle_Attributes }; @@ -1222,6 +1211,8 @@ QSGGeometryNode* QQuickImageParticle::buildParticleNodes() if (count() <= 0) return 0; + m_debugMode = m_system->m_debugMode; + if (m_sprites.count() || m_bypassOptimizations) { perfLevel = Sprites; } else if (!m_colortable_name.isEmpty() || !m_sizetable_name.isEmpty() @@ -1387,9 +1378,11 @@ QSGGeometryNode* QQuickImageParticle::buildParticleNodes() indices += 6; } } - } + if (perfLevel == Sprites) + spritesUpdate();//Gives all vertexes the initial sprite data, then maintained per frame + foreach (QSGGeometryNode* node, m_nodes){ if (node == *(m_nodes.begin())) node->setFlag(QSGGeometryNode::OwnsMaterial);//Root node owns the material for memory management purposes @@ -1455,7 +1448,8 @@ void QQuickImageParticle::prepareNextFrame() case Sprites: //Advance State if (m_spriteEngine) - m_spriteEngine->updateSprites(timeStamp); + m_spriteEngine->updateSprites(timeStamp);//fires signals if anim changed + spritesUpdate(time); case Tabled: case Deformable: case Colored: @@ -1468,6 +1462,67 @@ void QQuickImageParticle::prepareNextFrame() node->markDirty(QSGNode::DirtyMaterial); } +void QQuickImageParticle::spritesUpdate(qreal time) +{ + // Sprite progression handled CPU side, so as to have per-frame control. + foreach (const QString &str, m_groups) { + int gIdx = m_system->groupIds[str]; + foreach (QQuickParticleData* mainDatum, m_system->groupData[gIdx]->data) { + QSGGeometryNode *node = m_nodes[gIdx]; + if (!node) + continue; + //TODO: Interpolate between two different animations if it's going to transition next frame + // This is particularly important for cut-up sprites. + QQuickParticleData* datum = (mainDatum->animationOwner == this ? mainDatum : getShadowDatum(mainDatum)); + double frameAt; + qreal progress = 0; + if (datum->frameDuration > 0) { + qreal frame = (time - datum->animT)/(datum->frameDuration / 1000.0); + frame = qBound((qreal)0.0, frame, (qreal)((qreal)datum->frameCount - 1.0));//Stop at count-1 frames until we have between anim interpolation + if (m_spritesInterpolate) + progress = modf(frame,&frameAt); + else + modf(frame,&frameAt); + } else { + datum->frameAt++; + if (datum->frameAt >= datum->frameCount){ + datum->frameAt = 0; + for (int i = 0; i<m_startsIdx.count(); i++) { + if (m_startsIdx[i].second == gIdx){ + m_spriteEngine->advance(m_startsIdx[i].first + datum->index); + break; + } + } + } + frameAt = datum->frameAt; + } + QSizeF sheetSize = getState<ImageMaterialData>(m_material)->animSheetSize; + qreal y = datum->animY / sheetSize.height(); + qreal w = datum->animWidth / sheetSize.width(); + qreal h = datum->animHeight / sheetSize.height(); + qreal x1 = datum->animX / sheetSize.width(); + x1 += frameAt * w; + qreal x2 = x1; + if (frameAt < (datum->frameCount-1)) + x2 += w; + + node->setFlag(QSGNode::OwnsGeometry, false); + SpriteVertex *spriteVertices = (SpriteVertex *) node->geometry()->vertexData(); + spriteVertices += datum->index*4; + for (int i=0; i<4; i++) { + spriteVertices[i].animX1 = x1; + spriteVertices[i].animY1 = y; + spriteVertices[i].animX2 = x2; + spriteVertices[i].animY2 = y; + spriteVertices[i].animW = w; + spriteVertices[i].animH = h; + spriteVertices[i].animProgress = progress; + } + node->setFlag(QSGNode::OwnsGeometry, true); + } + } +} + void QQuickImageParticle::spriteAdvance(int spriteIdx) { if (!m_startsIdx.count())//Probably overly defensive @@ -1485,19 +1540,17 @@ void QQuickImageParticle::spriteAdvance(int spriteIdx) gIdx = m_startsIdx[i-1].second; int pIdx = spriteIdx - m_startsIdx[i-1].first; - QQuickParticleData* datum = m_system->groupData[gIdx]->data[pIdx]; - QQuickParticleData* d = (datum->animationOwner == this ? datum : getShadowDatum(datum)); - - d->animIdx = m_spriteEngine->spriteState(spriteIdx); - Vertices<SpriteVertex>* particles = (Vertices<SpriteVertex> *) m_nodes[gIdx]->geometry()->vertexData(); - Vertices<SpriteVertex> &p = particles[pIdx]; - d->animT = p.v1.animT = p.v2.animT = p.v3.animT = p.v4.animT = m_spriteEngine->spriteStart(spriteIdx)/1000.0; - d->frameCount = p.v1.frameCount = p.v2.frameCount = p.v3.frameCount = p.v4.frameCount = m_spriteEngine->spriteFrames(spriteIdx); - d->frameDuration = p.v1.frameDuration = p.v2.frameDuration = p.v3.frameDuration = p.v4.frameDuration = m_spriteEngine->spriteDuration(spriteIdx); - d->animX = p.v1.animX = p.v2.animX = p.v3.animX = p.v4.animX = m_spriteEngine->spriteX(spriteIdx); - d->animY = p.v1.animY = p.v2.animY = p.v3.animY = p.v4.animY = m_spriteEngine->spriteY(spriteIdx); - d->animWidth = p.v1.animWidth = p.v2.animWidth = p.v3.animWidth = p.v4.animWidth = m_spriteEngine->spriteWidth(spriteIdx); - d->animHeight = p.v1.animHeight = p.v2.animHeight = p.v3.animHeight = p.v4.animHeight = m_spriteEngine->spriteHeight(spriteIdx); + QQuickParticleData* mainDatum = m_system->groupData[gIdx]->data[pIdx]; + QQuickParticleData* datum = (mainDatum->animationOwner == this ? mainDatum : getShadowDatum(mainDatum)); + + datum->animIdx = m_spriteEngine->spriteState(spriteIdx); + datum->animT = m_spriteEngine->spriteStart(spriteIdx)/1000.0; + datum->frameCount = m_spriteEngine->spriteFrames(spriteIdx); + datum->frameDuration = m_spriteEngine->spriteDuration(spriteIdx) / datum->frameCount; + datum->animX = m_spriteEngine->spriteX(spriteIdx); + datum->animY = m_spriteEngine->spriteY(spriteIdx); + datum->animWidth = m_spriteEngine->spriteWidth(spriteIdx); + datum->animHeight = m_spriteEngine->spriteHeight(spriteIdx); } void QQuickImageParticle::reloadColor(const Color4ub &c, QQuickParticleData* d) @@ -1535,8 +1588,9 @@ void QQuickImageParticle::initialize(int gIdx, int pIdx) if (m_spriteEngine){ m_spriteEngine->start(spriteIdx); writeTo->frameCount = m_spriteEngine->spriteFrames(spriteIdx); - writeTo->frameDuration = m_spriteEngine->spriteDuration(spriteIdx); + writeTo->frameDuration = m_spriteEngine->spriteDuration(spriteIdx) / writeTo->frameCount; writeTo->animIdx = 0;//Always starts at 0 + writeTo->frameAt = -1; writeTo->animX = m_spriteEngine->spriteX(spriteIdx); writeTo->animY = m_spriteEngine->spriteY(spriteIdx); writeTo->animWidth = m_spriteEngine->spriteWidth(spriteIdx); @@ -1547,6 +1601,7 @@ void QQuickImageParticle::initialize(int gIdx, int pIdx) writeTo->animT = datum->t; writeTo->frameCount = 1; writeTo->frameDuration = 60000000.0; + writeTo->frameAt = -1; writeTo->animIdx = 0; writeTo->animT = 0; writeTo->animX = writeTo->animY = 0; @@ -1668,25 +1723,7 @@ void QQuickImageParticle::commit(int gIdx, int pIdx) spriteVertices[i].rotationSpeed = datum->rotationSpeed; spriteVertices[i].autoRotate = datum->autoRotate; } - spriteVertices[i].animInterpolate = m_spriteEngine ? (m_spritesInterpolate ? 1.0 : 0.0) : 0.0;//### Shadow? In particleData? Or uniform? - if (!m_spriteEngine || (m_explicitAnimation && datum->animationOwner != this)) { - QQuickParticleData* shadow = getShadowDatum(datum); - spriteVertices[i].frameDuration = shadow->frameDuration; - spriteVertices[i].frameCount = shadow->frameCount; - spriteVertices[i].animT = shadow->animT; - spriteVertices[i].animX = shadow->animX; - spriteVertices[i].animY = shadow->animY; - spriteVertices[i].animWidth = shadow->animWidth; - spriteVertices[i].animHeight = shadow->animHeight; - } else { - spriteVertices[i].frameDuration = datum->frameDuration; - spriteVertices[i].frameCount = datum->frameCount; - spriteVertices[i].animT = datum->animT; - spriteVertices[i].animX = datum->animX; - spriteVertices[i].animY = datum->animY; - spriteVertices[i].animWidth = datum->animWidth; - spriteVertices[i].animHeight = datum->animHeight; - } + //Sprite-related vertices updated per-frame in spritesUpdate(), not on demand if (m_explicitColor && datum->colorOwner != this) { QQuickParticleData* shadow = getShadowDatum(datum); spriteVertices[i].color.r = shadow->color.r; diff --git a/src/quick/particles/qquickimageparticle_p.h b/src/quick/particles/qquickimageparticle_p.h index 0ca3183daa..3e50a5fefe 100644 --- a/src/quick/particles/qquickimageparticle_p.h +++ b/src/quick/particles/qquickimageparticle_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -128,14 +128,13 @@ struct SpriteVertex { float rotation; float rotationSpeed; float autoRotate;//Assumed that GPUs prefer floats to bools - float animInterpolate; - float frameDuration; - float frameCount; - float animT; - float animX; - float animY; - float animWidth; - float animHeight; + float animW; + float animH; + float animProgress; + float animX1; + float animY1; + float animX2; + float animY2; }; template <typename Vertex> @@ -343,6 +342,7 @@ private slots: void createEngine(); //### method invoked by sprite list changing (in engine.h) - pretty nasty void spriteAdvance(int spriteIndex); + void spritesUpdate(qreal time = 0 ); private: QUrl m_image_name; QUrl m_colortable_name; diff --git a/src/quick/particles/qquickitemparticle.cpp b/src/quick/particles/qquickitemparticle.cpp index b775984a2e..7024a45c68 100644 --- a/src/quick/particles/qquickitemparticle.cpp +++ b/src/quick/particles/qquickitemparticle.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickitemparticle_p.h b/src/quick/particles/qquickitemparticle_p.h index 130d9aff55..0581039f99 100644 --- a/src/quick/particles/qquickitemparticle_p.h +++ b/src/quick/particles/qquickitemparticle_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquicklineextruder.cpp b/src/quick/particles/qquicklineextruder.cpp index af42910e85..e57c38d5a0 100644 --- a/src/quick/particles/qquicklineextruder.cpp +++ b/src/quick/particles/qquicklineextruder.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquicklineextruder_p.h b/src/quick/particles/qquicklineextruder_p.h index a4f73759ab..61a60e1663 100644 --- a/src/quick/particles/qquicklineextruder_p.h +++ b/src/quick/particles/qquicklineextruder_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickmaskextruder.cpp b/src/quick/particles/qquickmaskextruder.cpp index daaddf9edb..4051ed13fe 100644 --- a/src/quick/particles/qquickmaskextruder.cpp +++ b/src/quick/particles/qquickmaskextruder.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickmaskextruder_p.h b/src/quick/particles/qquickmaskextruder_p.h index 19ea269732..a1f70c72c0 100644 --- a/src/quick/particles/qquickmaskextruder_p.h +++ b/src/quick/particles/qquickmaskextruder_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticleaffector.cpp b/src/quick/particles/qquickparticleaffector.cpp index 9a6df32719..0413f1d517 100644 --- a/src/quick/particles/qquickparticleaffector.cpp +++ b/src/quick/particles/qquickparticleaffector.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticleaffector_p.h b/src/quick/particles/qquickparticleaffector_p.h index e4f33af28c..4884c61bbd 100644 --- a/src/quick/particles/qquickparticleaffector_p.h +++ b/src/quick/particles/qquickparticleaffector_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticleemitter.cpp b/src/quick/particles/qquickparticleemitter.cpp index 926b61e5e7..448e655416 100644 --- a/src/quick/particles/qquickparticleemitter.cpp +++ b/src/quick/particles/qquickparticleemitter.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticleemitter_p.h b/src/quick/particles/qquickparticleemitter_p.h index b863b2a097..2322265f4f 100644 --- a/src/quick/particles/qquickparticleemitter_p.h +++ b/src/quick/particles/qquickparticleemitter_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticleextruder.cpp b/src/quick/particles/qquickparticleextruder.cpp index f2266e7c90..e764186c2a 100644 --- a/src/quick/particles/qquickparticleextruder.cpp +++ b/src/quick/particles/qquickparticleextruder.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticleextruder_p.h b/src/quick/particles/qquickparticleextruder_p.h index 7a8d16a0f7..27dbc3da26 100644 --- a/src/quick/particles/qquickparticleextruder_p.h +++ b/src/quick/particles/qquickparticleextruder_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticlegroup.cpp b/src/quick/particles/qquickparticlegroup.cpp index 21d77d176c..d9666bf264 100644 --- a/src/quick/particles/qquickparticlegroup.cpp +++ b/src/quick/particles/qquickparticlegroup.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticlegroup_p.h b/src/quick/particles/qquickparticlegroup_p.h index ce9830441b..8f1397ed07 100644 --- a/src/quick/particles/qquickparticlegroup_p.h +++ b/src/quick/particles/qquickparticlegroup_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticlepainter.cpp b/src/quick/particles/qquickparticlepainter.cpp index 2eade8d77a..fd74860f1e 100644 --- a/src/quick/particles/qquickparticlepainter.cpp +++ b/src/quick/particles/qquickparticlepainter.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticlepainter_p.h b/src/quick/particles/qquickparticlepainter_p.h index 787668ef18..35f1ddbda7 100644 --- a/src/quick/particles/qquickparticlepainter_p.h +++ b/src/quick/particles/qquickparticlepainter_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticlesmodule.cpp b/src/quick/particles/qquickparticlesmodule.cpp index 0c7c6965f2..0ca48b8f61 100644 --- a/src/quick/particles/qquickparticlesmodule.cpp +++ b/src/quick/particles/qquickparticlesmodule.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticlesmodule_p.h b/src/quick/particles/qquickparticlesmodule_p.h index 2ba30a8cc6..d9710a2bc7 100644 --- a/src/quick/particles/qquickparticlesmodule_p.h +++ b/src/quick/particles/qquickparticlesmodule_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickparticlesystem.cpp b/src/quick/particles/qquickparticlesystem.cpp index 32b5fb4cea..924a2d0102 100644 --- a/src/quick/particles/qquickparticlesystem.cpp +++ b/src/quick/particles/qquickparticlesystem.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -57,6 +57,48 @@ QT_BEGIN_NAMESPACE //###Switch to define later, for now user-friendly (no compilation) debugging is worth it DEFINE_BOOL_CONFIG_OPTION(qmlParticlesDebug, QML_PARTICLES_DEBUG) + + +/* \internal ParticleSystem internals documentation + + Affectors, Painters, Emitters and Groups all register themselves on construction as a callback + from their setSystem (or componentComplete if they have a system from a parent). + + Particle data is stored by group, They have a group index (used by the particle system almost + everywhere) and a global index (used by the Stochastic state engine powering stochastic group + transitions). Each group has a recycling list/heap that stores the particle data. + + The recycling list/heap is a heap of particle data sorted by when they're expected to die. If + they die prematurely then they are marked as reusable (and will probably still be alive when + they exit the heap). If they have their life extended, then they aren't dead when expected. + If this happens, they go back in the heap with the new estimate. If they have died on schedule, + then the indexes are marked as reusable. If no indexes are reusable when new particles are + requested, then the list is extended. This relatively complex datastructure is because memory + allocation and deallocation on this scale proved to be a significant performance cost. In order + to reuse the indexes validly (even when particles can have their life extended or cut short + dynamically, or particle counts grow) this seemed to be the most efficient option for keeping + track of which indices could be reused. + + When a new particle is emitted, the emitter gets a new datum from the group (through the + system), and sets properties on it. Then it's passed back to the group briefly so that it can + now guess when the particle will die. Then the painters get a change to initialize properties + as well, since particle data includes shared data from painters as well as logical particle + data. + + Every animation advance, the simulation advances by running all emitters for the elapsed + duration, then running all affectors, then telling all particle painters to update changed + particles. The ParticlePainter superclass stores these changes, and they are implemented + when the painter is called to paint in the render thread. + + Particle group changes move the particle from one group to another by killing the old particle + and then creating a new one with the same data in the new group. + + Note that currently groups only grow. Given that data is stored in vectors, it is non-trivial + to pluck out the unused indexes when the count goes down. Given the dynamic nature of the + system, it is difficult to tell if those unused data instances will be used again. Still, + some form of garbage collection is on the long term plan. +*/ + /*! \qmlclass ParticleSystem QQuickParticleSystem \inqmlmodule QtQuick.Particles 2 @@ -420,6 +462,7 @@ QQuickParticleData::QQuickParticleData(QQuickParticleSystem* sys) autoRotate = 0; animIdx = 0; frameDuration = 1; + frameAt = -1; frameCount = 1; animT = -1; animX = 0; diff --git a/src/quick/particles/qquickparticlesystem_p.h b/src/quick/particles/qquickparticlesystem_p.h index 7a16b77df3..277dda1771 100644 --- a/src/quick/particles/qquickparticlesystem_p.h +++ b/src/quick/particles/qquickparticlesystem_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -200,6 +200,7 @@ public: float autoRotate;//Assume that GPUs prefer floats to bools float animIdx; float frameDuration; + float frameAt;//Used for duration -1 float frameCount; float animT; float animX; @@ -302,6 +303,7 @@ public: void updateCurrentTime( int currentTime ); QQuickParticleSystemAnimation* m_animation; bool m_running; + bool m_debugMode; int timeInt; bool initialized; @@ -340,7 +342,6 @@ private: QSignalMapper m_painterMapper; QSignalMapper m_emitterMapper; bool m_paused; - bool m_debugMode; bool m_allDead; bool m_empty; }; diff --git a/src/quick/particles/qquickpointattractor.cpp b/src/quick/particles/qquickpointattractor.cpp index a676908019..9697753b42 100644 --- a/src/quick/particles/qquickpointattractor.cpp +++ b/src/quick/particles/qquickpointattractor.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickpointattractor_p.h b/src/quick/particles/qquickpointattractor_p.h index ee44591394..4b05dc6cd7 100644 --- a/src/quick/particles/qquickpointattractor_p.h +++ b/src/quick/particles/qquickpointattractor_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickpointdirection.cpp b/src/quick/particles/qquickpointdirection.cpp index cbf526598a..8e0ff744b9 100644 --- a/src/quick/particles/qquickpointdirection.cpp +++ b/src/quick/particles/qquickpointdirection.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickpointdirection_p.h b/src/quick/particles/qquickpointdirection_p.h index 71237d31ff..a7478d4cf0 100644 --- a/src/quick/particles/qquickpointdirection_p.h +++ b/src/quick/particles/qquickpointdirection_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickrectangleextruder.cpp b/src/quick/particles/qquickrectangleextruder.cpp index 22f989042f..03e6cead89 100644 --- a/src/quick/particles/qquickrectangleextruder.cpp +++ b/src/quick/particles/qquickrectangleextruder.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickrectangleextruder_p.h b/src/quick/particles/qquickrectangleextruder_p.h index 60fac132eb..886f1a510d 100644 --- a/src/quick/particles/qquickrectangleextruder_p.h +++ b/src/quick/particles/qquickrectangleextruder_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickspritegoal.cpp b/src/quick/particles/qquickspritegoal.cpp index f5ed82e0b8..b923b8450c 100644 --- a/src/quick/particles/qquickspritegoal.cpp +++ b/src/quick/particles/qquickspritegoal.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickspritegoal_p.h b/src/quick/particles/qquickspritegoal_p.h index a73d67b7fa..db8fbf460f 100644 --- a/src/quick/particles/qquickspritegoal_p.h +++ b/src/quick/particles/qquickspritegoal_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquicktargetdirection.cpp b/src/quick/particles/qquicktargetdirection.cpp index 1fb0d49644..5043563b40 100644 --- a/src/quick/particles/qquicktargetdirection.cpp +++ b/src/quick/particles/qquicktargetdirection.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquicktargetdirection_p.h b/src/quick/particles/qquicktargetdirection_p.h index bf80d12433..74bd162b33 100644 --- a/src/quick/particles/qquicktargetdirection_p.h +++ b/src/quick/particles/qquicktargetdirection_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquicktrailemitter.cpp b/src/quick/particles/qquicktrailemitter.cpp index 3ed6aa8543..31b05451b2 100644 --- a/src/quick/particles/qquicktrailemitter.cpp +++ b/src/quick/particles/qquicktrailemitter.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquicktrailemitter_p.h b/src/quick/particles/qquicktrailemitter_p.h index 22d8529ed0..cc5a0b8967 100644 --- a/src/quick/particles/qquicktrailemitter_p.h +++ b/src/quick/particles/qquicktrailemitter_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickturbulence.cpp b/src/quick/particles/qquickturbulence.cpp index 2ac53219ed..6674cd564d 100644 --- a/src/quick/particles/qquickturbulence.cpp +++ b/src/quick/particles/qquickturbulence.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickturbulence_p.h b/src/quick/particles/qquickturbulence_p.h index 59957ee896..f21fcd6242 100644 --- a/src/quick/particles/qquickturbulence_p.h +++ b/src/quick/particles/qquickturbulence_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickv8particledata.cpp b/src/quick/particles/qquickv8particledata.cpp index 870c3f254a..caf32b6fbc 100644 --- a/src/quick/particles/qquickv8particledata.cpp +++ b/src/quick/particles/qquickv8particledata.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** @@ -411,6 +411,7 @@ FLOAT_GETTER_AND_SETTER(rotation) FLOAT_GETTER_AND_SETTER(rotationSpeed) FLOAT_GETTER_AND_SETTER(animIdx) FLOAT_GETTER_AND_SETTER(frameDuration) +FLOAT_GETTER_AND_SETTER(frameAt) FLOAT_GETTER_AND_SETTER(frameCount) FLOAT_GETTER_AND_SETTER(animT) FLOAT_GETTER_AND_SETTER(r) @@ -450,6 +451,7 @@ QV8ParticleDataDeletable::QV8ParticleDataDeletable(QV8Engine *engine) REGISTER_ACCESSOR(ft, engine, autoRotate, autoRotate); REGISTER_ACCESSOR(ft, engine, animIdx, animationIndex); REGISTER_ACCESSOR(ft, engine, frameDuration, frameDuration); + REGISTER_ACCESSOR(ft, engine, frameAt, frameAt); REGISTER_ACCESSOR(ft, engine, frameCount, frameCount); REGISTER_ACCESSOR(ft, engine, animT, animationT); REGISTER_ACCESSOR(ft, engine, r, r); diff --git a/src/quick/particles/qquickv8particledata_p.h b/src/quick/particles/qquickv8particledata_p.h index 176eb0d0d8..d61efadabe 100644 --- a/src/quick/particles/qquickv8particledata_p.h +++ b/src/quick/particles/qquickv8particledata_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickwander.cpp b/src/quick/particles/qquickwander.cpp index b36af8e39c..7f0c5d2cf2 100644 --- a/src/quick/particles/qquickwander.cpp +++ b/src/quick/particles/qquickwander.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/particles/qquickwander_p.h b/src/quick/particles/qquickwander_p.h index 0aa74cdb76..12952e91cc 100644 --- a/src/quick/particles/qquickwander_p.h +++ b/src/quick/particles/qquickwander_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Declarative module of the Qt Toolkit. ** diff --git a/src/quick/qtquick2.cpp b/src/quick/qtquick2.cpp index 8614589557..8c855d5a4a 100644 --- a/src/quick/qtquick2.cpp +++ b/src/quick/qtquick2.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -67,7 +67,7 @@ public: virtual void updateBinding(QDeclarativeContext *context, const QDeclarativeProperty &property, const QVariant &expression, bool isLiteralValue, - const QString &fileName, int line, + const QString &fileName, int line, int column, bool *isBaseState); virtual bool setBindingForInvalidProperty(QObject *object, const QString &propertyName, @@ -122,7 +122,7 @@ void QDeclarativeQtQuick2DebugStatesDelegate::buildStatesList(QObject *obj) void QDeclarativeQtQuick2DebugStatesDelegate::updateBinding(QDeclarativeContext *context, const QDeclarativeProperty &property, const QVariant &expression, bool isLiteralValue, - const QString &fileName, int line, + const QString &fileName, int line, int column, bool *inBaseState) { QObject *object = property.object(); @@ -138,7 +138,7 @@ void QDeclarativeQtQuick2DebugStatesDelegate::updateBinding(QDeclarativeContext newBinding = new QDeclarativeBinding(expression.toString(), object, context); newBinding->setTarget(property); newBinding->setNotifyOnValueChanged(true); - newBinding->setSourceLocation(fileName, line); + newBinding->setSourceLocation(fileName, line, column); } state->changeBindingInRevertList(object, propertyName, newBinding); diff --git a/src/quick/qtquick2_p.h b/src/quick/qtquick2_p.h index 53fd4c1270..b88f845b43 100644 --- a/src/quick/qtquick2_p.h +++ b/src/quick/qtquick2_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/qtquickglobal.h b/src/quick/qtquickglobal.h index eb9428c3da..b80e1ed117 100644 --- a/src/quick/qtquickglobal.h +++ b/src/quick/qtquickglobal.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -44,7 +44,7 @@ #include <QtCore/qglobal.h> -#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN) +#if defined(Q_OS_WIN) # if defined(QT_MAKEDLL) /* create a Qt DLL library */ # if defined(QT_BUILD_QUICK_LIB) # define Q_QUICK_EXPORT Q_DECL_EXPORT diff --git a/src/quick/qtquickglobal_p.h b/src/quick/qtquickglobal_p.h index 9e680fec24..d0387417b7 100644 --- a/src/quick/qtquickglobal_p.h +++ b/src/quick/qtquickglobal_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/coreapi/qsgdefaultrenderer.cpp b/src/quick/scenegraph/coreapi/qsgdefaultrenderer.cpp index 0bed1b8683..a7faf653fd 100644 --- a/src/quick/scenegraph/coreapi/qsgdefaultrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgdefaultrenderer.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/coreapi/qsgdefaultrenderer_p.h b/src/quick/scenegraph/coreapi/qsgdefaultrenderer_p.h index 7bbac40f84..df7ae8ea36 100644 --- a/src/quick/scenegraph/coreapi/qsgdefaultrenderer_p.h +++ b/src/quick/scenegraph/coreapi/qsgdefaultrenderer_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/coreapi/qsggeometry.cpp b/src/quick/scenegraph/coreapi/qsggeometry.cpp index 311ee9b3fe..3de69ae2b8 100644 --- a/src/quick/scenegraph/coreapi/qsggeometry.cpp +++ b/src/quick/scenegraph/coreapi/qsggeometry.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Qt scene graph research project. ** diff --git a/src/quick/scenegraph/coreapi/qsggeometry.h b/src/quick/scenegraph/coreapi/qsggeometry.h index 85f48814ed..3420b83e7d 100644 --- a/src/quick/scenegraph/coreapi/qsggeometry.h +++ b/src/quick/scenegraph/coreapi/qsggeometry.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the Qt scene graph research project. ** diff --git a/src/quick/scenegraph/coreapi/qsggeometry_p.h b/src/quick/scenegraph/coreapi/qsggeometry_p.h index a7a1330d47..47cc0930d5 100644 --- a/src/quick/scenegraph/coreapi/qsggeometry_p.h +++ b/src/quick/scenegraph/coreapi/qsggeometry_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/coreapi/qsgmaterial.cpp b/src/quick/scenegraph/coreapi/qsgmaterial.cpp index 36b50e89b6..cabe425525 100644 --- a/src/quick/scenegraph/coreapi/qsgmaterial.cpp +++ b/src/quick/scenegraph/coreapi/qsgmaterial.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -471,6 +471,12 @@ QSGMaterial::~QSGMaterial() \value Blending Set this flag to true if the material requires GL_BLEND to be enabled during rendering. + + \value RequiresDeterminant Set this flag to true if the material relies on + the determinant of the matrix of the geometry nodes for rendering. + + \value RequiresFullMatrix Set this flag to true if the material relies on + the full matrix of the geometry nodes for rendering. */ diff --git a/src/quick/scenegraph/coreapi/qsgmaterial.h b/src/quick/scenegraph/coreapi/qsgmaterial.h index d8411b4d88..6c4108c19e 100644 --- a/src/quick/scenegraph/coreapi/qsgmaterial.h +++ b/src/quick/scenegraph/coreapi/qsgmaterial.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -113,7 +113,9 @@ class Q_QUICK_EXPORT QSGMaterial { public: enum Flag { - Blending = 0x0001 + Blending = 0x0001, + RequiresDeterminant = 0x0002, + RequiresFullMatrix = 0x0004 | RequiresDeterminant }; Q_DECLARE_FLAGS(Flags, Flag) diff --git a/src/quick/scenegraph/coreapi/qsgnode.cpp b/src/quick/scenegraph/coreapi/qsgnode.cpp index bc83a81b48..fe0e637e1a 100644 --- a/src/quick/scenegraph/coreapi/qsgnode.cpp +++ b/src/quick/scenegraph/coreapi/qsgnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/coreapi/qsgnode.h b/src/quick/scenegraph/coreapi/qsgnode.h index 54e50e48be..d8dc87112b 100644 --- a/src/quick/scenegraph/coreapi/qsgnode.h +++ b/src/quick/scenegraph/coreapi/qsgnode.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/coreapi/qsgnodeupdater.cpp b/src/quick/scenegraph/coreapi/qsgnodeupdater.cpp index c5fa656c71..1c50a4aa30 100644 --- a/src/quick/scenegraph/coreapi/qsgnodeupdater.cpp +++ b/src/quick/scenegraph/coreapi/qsgnodeupdater.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -97,15 +97,13 @@ void QSGNodeUpdater::updateStates(QSGNode *n) bool QSGNodeUpdater::isNodeBlocked(QSGNode *node, QSGNode *root) const { qreal opacity = 1; - while (node != root) { + while (node != root && node != 0) { if (node->type() == QSGNode::OpacityNodeType) { opacity *= static_cast<QSGOpacityNode *>(node)->opacity(); if (opacity < 0.001) return true; } node = node->parent(); - - Q_ASSERT_X(node, "QSGNodeUpdater::isNodeBlocked", "node is not in the subtree of root"); } return false; diff --git a/src/quick/scenegraph/coreapi/qsgnodeupdater_p.h b/src/quick/scenegraph/coreapi/qsgnodeupdater_p.h index 446bdefdc5..ad0da66420 100644 --- a/src/quick/scenegraph/coreapi/qsgnodeupdater_p.h +++ b/src/quick/scenegraph/coreapi/qsgnodeupdater_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/coreapi/qsgrenderer.cpp b/src/quick/scenegraph/coreapi/qsgrenderer.cpp index a7aac5f42c..317deee0c5 100644 --- a/src/quick/scenegraph/coreapi/qsgrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgrenderer.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/coreapi/qsgrenderer_p.h b/src/quick/scenegraph/coreapi/qsgrenderer_p.h index 5217bee205..4fde0e26c8 100644 --- a/src/quick/scenegraph/coreapi/qsgrenderer_p.h +++ b/src/quick/scenegraph/coreapi/qsgrenderer_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgadaptationlayer.cpp b/src/quick/scenegraph/qsgadaptationlayer.cpp index 73ac81fd5b..574c1218bb 100644 --- a/src/quick/scenegraph/qsgadaptationlayer.cpp +++ b/src/quick/scenegraph/qsgadaptationlayer.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -267,6 +267,21 @@ void QSGDistanceFieldGlyphCache::setGlyphsPosition(const QList<GlyphPosition> &g } } +void QSGDistanceFieldGlyphCache::registerOwnerElement(QQuickItem *ownerElement) +{ + Q_UNUSED(ownerElement); +} + +void QSGDistanceFieldGlyphCache::unregisterOwnerElement(QQuickItem *ownerElement) +{ + Q_UNUSED(ownerElement); +} + +void QSGDistanceFieldGlyphCache::processPendingGlyphs() +{ + /* Intentionally empty */ +} + void QSGDistanceFieldGlyphCache::setGlyphsTexture(const QVector<glyph_t> &glyphs, const Texture &tex) { int i = m_cacheData->textures.indexOf(tex); diff --git a/src/quick/scenegraph/qsgadaptationlayer_p.h b/src/quick/scenegraph/qsgadaptationlayer_p.h index c4851c326b..2d82ca30ba 100644 --- a/src/quick/scenegraph/qsgadaptationlayer_p.h +++ b/src/quick/scenegraph/qsgadaptationlayer_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -110,6 +110,8 @@ public: HighQualitySubPixelAntialiasing }; + QSGGlyphNode() : m_ownerElement(0) {} + virtual void setGlyphs(const QPointF &position, const QGlyphRun &glyphs) = 0; virtual void setColor(const QColor &color) = 0; virtual void setStyle(QQuickText::TextStyle style) = 0; @@ -123,8 +125,12 @@ public: virtual void update() = 0; + void setOwnerElement(QQuickItem *ownerElement) { m_ownerElement = ownerElement; } + QQuickItem *ownerElement() const { return m_ownerElement; } + protected: QRectF m_bounding_rect; + QQuickItem *m_ownerElement; }; class Q_QUICK_EXPORT QSGDistanceFieldGlyphCache @@ -185,6 +191,10 @@ public: void registerGlyphNode(QSGDistanceFieldGlyphNode *node); void unregisterGlyphNode(QSGDistanceFieldGlyphNode *node); + virtual void registerOwnerElement(QQuickItem *ownerElement); + virtual void unregisterOwnerElement(QQuickItem *ownerElement); + virtual void processPendingGlyphs(); + protected: struct GlyphPosition { glyph_t glyph; @@ -204,6 +214,7 @@ protected: void updateTexture(GLuint oldTex, GLuint newTex, const QSize &newTexSize); bool containsGlyph(glyph_t glyph) const; + GLuint textureIdForGlyph(glyph_t glyph) const; QOpenGLContext *ctx; diff --git a/src/quick/scenegraph/qsgcontext.cpp b/src/quick/scenegraph/qsgcontext.cpp index cad2cb09c8..834f336394 100644 --- a/src/quick/scenegraph/qsgcontext.cpp +++ b/src/quick/scenegraph/qsgcontext.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -47,6 +47,8 @@ #include <QtQuick/private/qsgdefaultimagenode_p.h> #include <QtQuick/private/qsgdefaultglyphnode_p.h> #include <QtQuick/private/qsgdistancefieldglyphnode_p.h> +#include <QtQuick/private/qsgshareddistancefieldglyphcache_p.h> + #include <QtQuick/private/qsgtexture_p.h> #include <QtQuick/private/qdeclarativepixmapcache_p.h> @@ -56,6 +58,11 @@ #include <QDeclarativeImageProvider> #include <private/qdeclarativeglobal_p.h> +#include <QtQuick/private/qsgtexture_p.h> +#include <QtGui/private/qguiapplication_p.h> + +#include <QtGui/qplatformsharedgraphicscache_qpa.h> + #include <private/qobject_p.h> #include <qmutex.h> @@ -247,6 +254,35 @@ QSGImageNode *QSGContext::createImageNode() QSGDistanceFieldGlyphCache *QSGContext::createDistanceFieldGlyphCache(const QRawFont &font) { Q_D(QSGContext); + + QPlatformIntegration *platformIntegration = QGuiApplicationPrivate::platformIntegration(); + if (platformIntegration != 0 + && platformIntegration->hasCapability(QPlatformIntegration::SharedGraphicsCache)) { + QFontEngine *fe = QRawFontPrivate::get(font)->fontEngine; + if (!fe->faceId().filename.isEmpty()) { + QByteArray keyName = fe->faceId().filename; + if (font.style() != QFont::StyleNormal) + keyName += QByteArray(" I"); + if (font.weight() != QFont::Normal) + keyName += " " + QByteArray::number(font.weight()); + keyName += QByteArray(" DF"); + QPlatformSharedGraphicsCache *sharedGraphicsCache = + platformIntegration->createPlatformSharedGraphicsCache(keyName); + + if (sharedGraphicsCache != 0) { + sharedGraphicsCache->ensureCacheInitialized(keyName, + QPlatformSharedGraphicsCache::OpenGLTexture, + QPlatformSharedGraphicsCache::Alpha8); + + return new QSGSharedDistanceFieldGlyphCache(keyName, + sharedGraphicsCache, + d->distanceFieldCacheManager, + glContext(), + font); + } + } + } + return new QSGDefaultDistanceFieldGlyphCache(d->distanceFieldCacheManager, glContext(), font); } diff --git a/src/quick/scenegraph/qsgcontext_p.h b/src/quick/scenegraph/qsgcontext_p.h index ea1db19e29..cc7060f553 100644 --- a/src/quick/scenegraph/qsgcontext_p.h +++ b/src/quick/scenegraph/qsgcontext_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -56,7 +56,6 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -QT_MODULE(Declarative) class QSGContextPrivate; class QSGRectangleNode; diff --git a/src/quick/scenegraph/qsgcontextplugin.cpp b/src/quick/scenegraph/qsgcontextplugin.cpp index 6bf6ac90e7..7467448dbd 100644 --- a/src/quick/scenegraph/qsgcontextplugin.cpp +++ b/src/quick/scenegraph/qsgcontextplugin.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgcontextplugin_p.h b/src/quick/scenegraph/qsgcontextplugin_p.h index 21924c90ac..6cd689e1bd 100644 --- a/src/quick/scenegraph/qsgcontextplugin_p.h +++ b/src/quick/scenegraph/qsgcontextplugin_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp index 57a9a8741c..0227791d72 100644 --- a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp +++ b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h index 06f9283bcc..b701f2ef3d 100644 --- a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h +++ b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgdefaultglyphnode.cpp b/src/quick/scenegraph/qsgdefaultglyphnode.cpp index f41fbe486a..7ad8b0590c 100644 --- a/src/quick/scenegraph/qsgdefaultglyphnode.cpp +++ b/src/quick/scenegraph/qsgdefaultglyphnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp b/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp index 36efe9b570..d99ea2bfba 100644 --- a/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp +++ b/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -195,7 +195,7 @@ void QSGTextMaskMaterial::populate(const QPointF &p, fixedPointPositions.data()); cache->fillInPendingGlyphs(); - int margin = cache->glyphMargin(); + int margin = fontD->fontEngine->glyphMargin(cache->cacheType()); Q_ASSERT(geometry->indexType() == GL_UNSIGNED_SHORT); geometry->allocate(glyphIndexes.size() * 4, glyphIndexes.size() * 6); diff --git a/src/quick/scenegraph/qsgdefaultglyphnode_p.h b/src/quick/scenegraph/qsgdefaultglyphnode_p.h index cc14d33a30..307deaaa15 100644 --- a/src/quick/scenegraph/qsgdefaultglyphnode_p.h +++ b/src/quick/scenegraph/qsgdefaultglyphnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgdefaultglyphnode_p_p.h b/src/quick/scenegraph/qsgdefaultglyphnode_p_p.h index 2378178a1b..2da3434a44 100644 --- a/src/quick/scenegraph/qsgdefaultglyphnode_p_p.h +++ b/src/quick/scenegraph/qsgdefaultglyphnode_p_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgdefaultimagenode.cpp b/src/quick/scenegraph/qsgdefaultimagenode.cpp index 072a309206..e7c8502302 100644 --- a/src/quick/scenegraph/qsgdefaultimagenode.cpp +++ b/src/quick/scenegraph/qsgdefaultimagenode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgdefaultimagenode_p.h b/src/quick/scenegraph/qsgdefaultimagenode_p.h index f1b416d69c..6bc102bae9 100644 --- a/src/quick/scenegraph/qsgdefaultimagenode_p.h +++ b/src/quick/scenegraph/qsgdefaultimagenode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgdefaultrectanglenode.cpp b/src/quick/scenegraph/qsgdefaultrectanglenode.cpp index bb89b4a9f8..d633ad7652 100644 --- a/src/quick/scenegraph/qsgdefaultrectanglenode.cpp +++ b/src/quick/scenegraph/qsgdefaultrectanglenode.cpp @@ -1,9 +1,9 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgdefaultrectanglenode_p.h b/src/quick/scenegraph/qsgdefaultrectanglenode_p.h index b491913428..a6d787c840 100644 --- a/src/quick/scenegraph/qsgdefaultrectanglenode_p.h +++ b/src/quick/scenegraph/qsgdefaultrectanglenode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgdistancefieldglyphnode.cpp b/src/quick/scenegraph/qsgdistancefieldglyphnode.cpp index f192573624..eb1c1eb22d 100644 --- a/src/quick/scenegraph/qsgdistancefieldglyphnode.cpp +++ b/src/quick/scenegraph/qsgdistancefieldglyphnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -57,10 +57,10 @@ QSGDistanceFieldGlyphNode::QSGDistanceFieldGlyphNode(QSGDistanceFieldGlyphCacheM , m_dirtyGeometry(false) , m_dirtyMaterial(false) { - setFlag(UsePreprocess); m_geometry.setDrawingMode(GL_TRIANGLES); setGeometry(&m_geometry); setPreferredAntialiasingMode(cacheManager->defaultAntialiasingMode()); + setFlag(UsePreprocess); #ifdef QML_RUNTIME_TESTING description = QLatin1String("glyphs"); #endif @@ -112,9 +112,13 @@ void QSGDistanceFieldGlyphNode::setGlyphs(const QPointF &position, const QGlyphR QSGDistanceFieldGlyphCache *oldCache = m_glyph_cache; m_glyph_cache = m_glyph_cacheManager->cache(m_glyphs.rawFont()); if (m_glyph_cache != oldCache) { - if (oldCache) + Q_ASSERT(ownerElement() != 0); + if (oldCache) { oldCache->unregisterGlyphNode(this); + oldCache->unregisterOwnerElement(ownerElement()); + } m_glyph_cache->registerGlyphNode(this); + m_glyph_cache->registerOwnerElement(ownerElement()); } m_glyph_cache->populate(glyphs.glyphIndexes()); @@ -158,12 +162,13 @@ void QSGDistanceFieldGlyphNode::preprocess() { Q_ASSERT(m_glyph_cache); - m_glyph_cache->update(); - for (int i = 0; i < m_nodesToDelete.count(); ++i) delete m_nodesToDelete.at(i); m_nodesToDelete.clear(); + m_glyph_cache->processPendingGlyphs(); + m_glyph_cache->update(); + if (m_dirtyGeometry) updateGeometry(); } @@ -285,6 +290,7 @@ void QSGDistanceFieldGlyphNode::updateGeometry() QHash<const QSGDistanceFieldGlyphCache::Texture *, QSGDistanceFieldGlyphNode *>::iterator subIt = m_subNodes.find(ite.key()); if (subIt == m_subNodes.end()) { QSGDistanceFieldGlyphNode *subNode = new QSGDistanceFieldGlyphNode(m_glyph_cacheManager); + subNode->setOwnerElement(m_ownerElement); subNode->setColor(m_color); subNode->setStyle(m_style); subNode->setStyleColor(m_styleColor); diff --git a/src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp b/src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp index 938fe9b42d..6a220c9fe5 100644 --- a/src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp +++ b/src/quick/scenegraph/qsgdistancefieldglyphnode_p.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -90,8 +90,8 @@ const char *QSGDistanceFieldTextMaterialShader::fragmentShader() const { "varying highp vec2 sampleCoord; \n" "uniform sampler2D texture; \n" "uniform lowp vec4 color; \n" - "uniform lowp float alphaMin; \n" - "uniform lowp float alphaMax; \n" + "uniform mediump float alphaMin; \n" + "uniform mediump float alphaMax; \n" "void main() { \n" " gl_FragColor = color * smoothstep(alphaMin, \n" " alphaMax, \n" @@ -189,7 +189,7 @@ QSGDistanceFieldTextMaterial::QSGDistanceFieldTextMaterial() : m_glyph_cache(0) , m_texture(0) { - setFlag(Blending, true); + setFlag(Blending | RequiresDeterminant, true); } QSGDistanceFieldTextMaterial::~QSGDistanceFieldTextMaterial() @@ -324,10 +324,10 @@ const char *DistanceFieldOutlineTextMaterialShader::fragmentShader() const { "uniform sampler2D texture; \n" "uniform lowp vec4 color; \n" "uniform lowp vec4 styleColor; \n" - "uniform lowp float alphaMin; \n" - "uniform lowp float alphaMax; \n" - "uniform lowp float outlineAlphaMax0; \n" - "uniform lowp float outlineAlphaMax1; \n" + "uniform mediump float alphaMin; \n" + "uniform mediump float alphaMax; \n" + "uniform mediump float outlineAlphaMax0; \n" + "uniform mediump float outlineAlphaMax1; \n" "void main() { \n" " mediump float d = texture2D(texture, sampleCoord).a; \n" " gl_FragColor = mix(styleColor, color, smoothstep(alphaMin, alphaMax, d)) \n" @@ -468,8 +468,8 @@ const char *DistanceFieldShiftedStyleTextMaterialShader::fragmentShader() const "uniform sampler2D texture; \n" "uniform lowp vec4 color; \n" "uniform lowp vec4 styleColor; \n" - "uniform lowp float alphaMin; \n" - "uniform lowp float alphaMax; \n" + "uniform mediump float alphaMin; \n" + "uniform mediump float alphaMax; \n" "void main() { \n" " highp float a = smoothstep(alphaMin, alphaMax, texture2D(texture, sampleCoord).a);\n" " highp vec4 shifted = styleColor * smoothstep(alphaMin, \n" @@ -558,8 +558,8 @@ const char *QSGHiQSubPixelDistanceFieldTextMaterialShader::fragmentShader() cons "varying highp vec3 sampleFarRight; \n" "uniform sampler2D texture; \n" "uniform lowp vec4 color; \n" - "uniform lowp float alphaMin; \n" - "uniform lowp float alphaMax; \n" + "uniform mediump float alphaMin; \n" + "uniform mediump float alphaMax; \n" "void main() { \n" " highp vec4 n; \n" " n.x = texture2DProj(texture, sampleFarLeft).a; \n" @@ -697,8 +697,8 @@ const char *QSGLoQSubPixelDistanceFieldTextMaterialShader::fragmentShader() cons "varying highp vec3 sampleNearRight; \n" "uniform sampler2D texture; \n" "uniform lowp vec4 color; \n" - "uniform lowp float alphaMin; \n" - "uniform lowp float alphaMax; \n" + "uniform mediump float alphaMin; \n" + "uniform mediump float alphaMax; \n" "void main() { \n" " highp vec2 n; \n" " n.x = texture2DProj(texture, sampleNearLeft).a; \n" diff --git a/src/quick/scenegraph/qsgdistancefieldglyphnode_p.h b/src/quick/scenegraph/qsgdistancefieldglyphnode_p.h index 79b40ddf3e..a58e0b1eb4 100644 --- a/src/quick/scenegraph/qsgdistancefieldglyphnode_p.h +++ b/src/quick/scenegraph/qsgdistancefieldglyphnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -69,7 +69,6 @@ public: virtual void setStyleColor(const QColor &color); virtual void update(); - void preprocess(); void invalidateGlyphs(const QVector<quint32> &glyphs); diff --git a/src/quick/scenegraph/qsgdistancefieldglyphnode_p_p.h b/src/quick/scenegraph/qsgdistancefieldglyphnode_p_p.h index d71cc48196..2bffb1ecb6 100644 --- a/src/quick/scenegraph/qsgdistancefieldglyphnode_p_p.h +++ b/src/quick/scenegraph/qsgdistancefieldglyphnode_p_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgflashnode.cpp b/src/quick/scenegraph/qsgflashnode.cpp index 9546e91ee1..92c705cb28 100644 --- a/src/quick/scenegraph/qsgflashnode.cpp +++ b/src/quick/scenegraph/qsgflashnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgflashnode_p.h b/src/quick/scenegraph/qsgflashnode_p.h index 71ac22d648..0029146503 100644 --- a/src/quick/scenegraph/qsgflashnode_p.h +++ b/src/quick/scenegraph/qsgflashnode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgpathsimplifier.cpp b/src/quick/scenegraph/qsgpathsimplifier.cpp index 4b9f401786..79cd7a290b 100644 --- a/src/quick/scenegraph/qsgpathsimplifier.cpp +++ b/src/quick/scenegraph/qsgpathsimplifier.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgpathsimplifier_p.h b/src/quick/scenegraph/qsgpathsimplifier_p.h index 0639c4f622..e3d2e769eb 100644 --- a/src/quick/scenegraph/qsgpathsimplifier_p.h +++ b/src/quick/scenegraph/qsgpathsimplifier_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/qsgshareddistancefieldglyphcache.cpp b/src/quick/scenegraph/qsgshareddistancefieldglyphcache.cpp new file mode 100644 index 0000000000..841322e58b --- /dev/null +++ b/src/quick/scenegraph/qsgshareddistancefieldglyphcache.cpp @@ -0,0 +1,621 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#define EGL_EGLEXT_PROTOTYPES +#define GL_GLEXT_PROTOTYPES +#if defined(QSGSHAREDDISTANCEFIELDGLYPHCACHE_DEBUG) +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> +#endif + +#include "qsgshareddistancefieldglyphcache_p.h" + +#include <QtCore/qhash.h> +#include <QtCore/qthread.h> +#include <QtGui/qplatformsharedgraphicscache_qpa.h> + +#include <QtQuick/qquickcanvas.h> + +#include <QtOpenGL/qglframebufferobject.h> + +// #define QSGSHAREDDISTANCEFIELDGLYPHCACHE_DEBUG + +Q_DECLARE_METATYPE(QVector<quint32>) +Q_DECLARE_METATYPE(QVector<QImage>) + +QT_BEGIN_NAMESPACE + +QSGSharedDistanceFieldGlyphCache::QSGSharedDistanceFieldGlyphCache(const QByteArray &cacheId, + QPlatformSharedGraphicsCache *sharedGraphicsCache, + QSGDistanceFieldGlyphCacheManager *man, + QOpenGLContext *c, + const QRawFont &font) + : QSGDistanceFieldGlyphCache(man, c, font) + , m_cacheId(cacheId) + , m_sharedGraphicsCache(sharedGraphicsCache) +{ +#if defined(QSGSHAREDDISTANCEFIELDGLYPHCACHE_DEBUG) + qDebug("QSGSharedDistanceFieldGlyphCache with id %s created in thread %p", + cacheId.constData(), QThread::currentThreadId()); +#endif + + Q_ASSERT(sizeof(glyph_t) == sizeof(quint32)); + Q_ASSERT(sharedGraphicsCache != 0); + + qRegisterMetaType<QVector<quint32> >(); + qRegisterMetaType<QVector<QImage> >(); + + connect(sharedGraphicsCache, SIGNAL(itemsMissing(QByteArray,QVector<quint32>)), + this, SLOT(reportItemsMissing(QByteArray,QVector<quint32>)), + Qt::DirectConnection); + connect(sharedGraphicsCache, SIGNAL(itemsAvailable(QByteArray,void*,QSize,QVector<quint32>,QVector<QPoint>)), + this, SLOT(reportItemsAvailable(QByteArray,void*,QSize,QVector<quint32>,QVector<QPoint>)), + Qt::DirectConnection); + connect(sharedGraphicsCache, SIGNAL(itemsUpdated(QByteArray,void*,QSize,QVector<quint32>,QVector<QPoint>)), + this, SLOT(reportItemsAvailable(QByteArray,void*,QSize,QVector<quint32>,QVector<QPoint>)), + Qt::DirectConnection); + connect(sharedGraphicsCache, SIGNAL(itemsInvalidated(QByteArray,QVector<quint32>)), + this, SLOT(reportItemsInvalidated(QByteArray,QVector<quint32>)), + Qt::DirectConnection); +} + +QSGSharedDistanceFieldGlyphCache::~QSGSharedDistanceFieldGlyphCache() +{ + { + QHash<glyph_t, void *>::const_iterator it = m_bufferForGlyph.constBegin(); + while (it != m_bufferForGlyph.constEnd()) { + m_sharedGraphicsCache->dereferenceBuffer(it.value()); + ++it; + } + } + + { + QHash<quint32, PendingGlyph>::const_iterator it = m_pendingReadyGlyphs.constBegin(); + while (it != m_pendingReadyGlyphs.constEnd()) { + m_sharedGraphicsCache->dereferenceBuffer(it.value().buffer); + ++it; + } + } +} + +void QSGSharedDistanceFieldGlyphCache::requestGlyphs(const QSet<glyph_t> &glyphs) +{ + QMutexLocker locker(&m_pendingGlyphsMutex); + +#if defined(QSGSHAREDDISTANCEFIELDGLYPHCACHE_DEBUG) + qDebug("QSGSharedDistanceFieldGlyphCache::requestGlyphs() called for %s (%d glyphs)", + m_cacheId.constData(), glyphs.size()); +#endif + + m_requestedGlyphsThatHaveNotBeenReturned.unite(glyphs); + + QVector<quint32> glyphsVector; + glyphsVector.reserve(glyphs.size()); + + QSet<glyph_t>::const_iterator it; + for (it = glyphs.constBegin(); it != glyphs.constEnd(); ++it) { + Q_ASSERT(!m_bufferForGlyph.contains(*it)); + glyphsVector.append(*it); + } + + // Invoke method on queued connection to make sure it's called asynchronously on the + // correct thread (requestGlyphs() is called from the rendering thread.) + QMetaObject::invokeMethod(m_sharedGraphicsCache, "requestItems", Qt::QueuedConnection, + Q_ARG(QByteArray, m_cacheId), + Q_ARG(QVector<quint32>, glyphsVector)); +} + +void QSGSharedDistanceFieldGlyphCache::waitForGlyphs() +{ + { + QMutexLocker locker(&m_pendingGlyphsMutex); + while (!m_requestedGlyphsThatHaveNotBeenReturned.isEmpty()) + m_pendingGlyphsCondition.wait(&m_pendingGlyphsMutex); + } +} + +void QSGSharedDistanceFieldGlyphCache::storeGlyphs(const QHash<glyph_t, QImage> &glyphs) +{ + { + QMutexLocker locker(&m_pendingGlyphsMutex); +#if defined(QSGSHAREDDISTANCEFIELDGLYPHCACHE_DEBUG) + qDebug("QSGSharedDistanceFieldGlyphCache::storeGlyphs() called for %s (%d glyphs)", + m_cacheId.constData(), glyphs.size()); +#endif + + int glyphCount = glyphs.size(); + QVector<quint32> glyphIds(glyphCount); + QVector<QImage> images(glyphCount); + QHash<glyph_t, QImage>::const_iterator it = glyphs.constBegin(); + int i=0; + while (it != glyphs.constEnd()) { + m_requestedGlyphsThatHaveNotBeenReturned.insert(it.key()); + glyphIds[i] = it.key(); + images[i] = it.value(); + + ++it; ++i; + } + + QMetaObject::invokeMethod(m_sharedGraphicsCache, "insertItems", Qt::QueuedConnection, + Q_ARG(QByteArray, m_cacheId), + Q_ARG(QVector<quint32>, glyphIds), + Q_ARG(QVector<QImage>, images)); + } + + processPendingGlyphs(); +} + +void QSGSharedDistanceFieldGlyphCache::referenceGlyphs(const QSet<glyph_t> &glyphs) +{ + Q_UNUSED(glyphs); + + // Intentionally empty. Not required in this implementation, since the glyphs are reference + // counted outside and releaseGlyphs() will only be called when there are no more references. +} + +void QSGSharedDistanceFieldGlyphCache::releaseGlyphs(const QSet<glyph_t> &glyphs) +{ +#if defined(QSGSHAREDDISTANCEFIELDGLYPHCACHE_DEBUG) + qDebug("QSGSharedDistanceFieldGlyphCache::releaseGlyphs() called for %s (%d glyphs)", + m_cacheId.constData(), glyphs.size()); +#endif + + QVector<quint32> glyphsVector; + glyphsVector.reserve(glyphs.size()); + + QSet<glyph_t>::const_iterator glyphsIt; + for (glyphsIt = glyphs.constBegin(); glyphsIt != glyphs.constEnd(); ++glyphsIt) { + QHash<glyph_t, void *>::iterator bufferIt = m_bufferForGlyph.find(*glyphsIt); + if (bufferIt != m_bufferForGlyph.end()) { + void *buffer = bufferIt.value(); + removeGlyph(*glyphsIt); + m_bufferForGlyph.erase(bufferIt); + Q_ASSERT(!m_bufferForGlyph.contains(*glyphsIt)); + + if (!m_sharedGraphicsCache->dereferenceBuffer(buffer)) { +#if !defined(QT_NO_DEBUG) + bufferIt = m_bufferForGlyph.begin(); + while (bufferIt != m_bufferForGlyph.end()) { + Q_ASSERT(bufferIt.value() != buffer); + ++bufferIt; + } +#endif + } + } + + glyphsVector.append(*glyphsIt); + } + + QMetaObject::invokeMethod(m_sharedGraphicsCache, "releaseItems", Qt::QueuedConnection, + Q_ARG(QByteArray, m_cacheId), + Q_ARG(QVector<quint32>, glyphsVector)); +} + +void QSGSharedDistanceFieldGlyphCache::registerOwnerElement(QQuickItem *ownerElement) +{ + bool ok = connect(this, SIGNAL(glyphsPending()), ownerElement, SLOT(triggerPreprocess())); + Q_ASSERT_X(ok, Q_FUNC_INFO, "QML element that owns a glyph node must have triggerPreprocess() slot"); + Q_UNUSED(ok); +} + +void QSGSharedDistanceFieldGlyphCache::unregisterOwnerElement(QQuickItem *ownerElement) +{ + disconnect(this, SIGNAL(glyphsPending()), ownerElement, SLOT(triggerPreprocess())); +} + +#if defined(QSGSHAREDDISTANCEFIELDGLYPHCACHE_DEBUG_) +# include <QtOpenGL/private/qglextensions_p.h> + +void QSGSharedDistanceFieldGlyphCache::saveTexture(GLuint textureId, int width, int height) +{ + GLuint fboId; + glGenFramebuffers(1, &fboId); + + GLuint tmpTexture = 0; + glGenTextures(1, &tmpTexture); + glBindTexture(GL_TEXTURE_2D, tmpTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); + + glBindFramebuffer(GL_FRAMEBUFFER_EXT, fboId); + glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, + tmpTexture, 0); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, textureId); + + glDisable(GL_STENCIL_TEST); + glDisable(GL_DEPTH_TEST); + glDisable(GL_SCISSOR_TEST); + glDisable(GL_BLEND); + + GLfloat textureCoordinateArray[8]; + textureCoordinateArray[0] = 0.0f; + textureCoordinateArray[1] = 0.0f; + textureCoordinateArray[2] = 1.0f; + textureCoordinateArray[3] = 0.0f; + textureCoordinateArray[4] = 1.0f; + textureCoordinateArray[5] = 1.0f; + textureCoordinateArray[6] = 0.0f; + textureCoordinateArray[7] = 1.0f; + + GLfloat vertexCoordinateArray[8]; + vertexCoordinateArray[0] = -1.0f; + vertexCoordinateArray[1] = -1.0f; + vertexCoordinateArray[2] = 1.0f; + vertexCoordinateArray[3] = -1.0f; + vertexCoordinateArray[4] = 1.0f; + vertexCoordinateArray[5] = 1.0f; + vertexCoordinateArray[6] = -1.0f; + vertexCoordinateArray[7] = 1.0f; + + glViewport(0, 0, width, height); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertexCoordinateArray); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, textureCoordinateArray); + + { + static const char *vertexShaderSource = + "attribute highp vec4 vertexCoordsArray; \n" + "attribute highp vec2 textureCoordArray; \n" + "varying highp vec2 textureCoords; \n" + "void main(void) \n" + "{ \n" + " gl_Position = vertexCoordsArray; \n" + " textureCoords = textureCoordArray; \n" + "} \n"; + + static const char *fragmentShaderSource = + "varying highp vec2 textureCoords; \n" + "uniform sampler2D texture; \n" + "void main() \n" + "{ \n" + " gl_FragColor = texture2D(texture, textureCoords); \n" + "} \n"; + + GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); + GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + + if (vertexShader == 0 || fragmentShader == 0) { + GLenum error = glGetError(); + qWarning("SharedGraphicsCacheServer::setupShaderPrograms: Failed to create shaders. (GL error: %x)", + error); + return; + } + + glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); + glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); + glCompileShader(vertexShader); + + GLint len = 1; + glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &len); + + char infoLog[2048]; + glGetShaderInfoLog(vertexShader, 2048, NULL, infoLog); + if (qstrlen(infoLog) > 0) { + qWarning("SharedGraphicsCacheServer::setupShaderPrograms, problems compiling vertex shader:\n %s", + infoLog); + //return; + } + + glCompileShader(fragmentShader); + glGetShaderInfoLog(fragmentShader, 2048, NULL, infoLog); + if (qstrlen(infoLog) > 0) { + qWarning("SharedGraphicsCacheServer::setupShaderPrograms, problems compiling fragent shader:\n %s", + infoLog); + //return; + } + + GLuint shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + + glBindAttribLocation(shaderProgram, 0, "vertexCoordsArray"); + glBindAttribLocation(shaderProgram, 1, "textureCoordArray"); + + glLinkProgram(shaderProgram); + glGetProgramInfoLog(shaderProgram, 2048, NULL, infoLog); + if (qstrlen(infoLog) > 0) { + qWarning("SharedGraphicsCacheServer::setupShaderPrograms, problems linking shaders:\n %s", + infoLog); + //return; + } + + glUseProgram(shaderProgram); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + + int textureUniformLocation = glGetUniformLocation(shaderProgram, "texture"); + glUniform1i(textureUniformLocation, 0); + } + + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + + { + GLenum error = glGetError(); + if (error != GL_NO_ERROR) { + qWarning("SharedGraphicsCacheServer::readBackBuffer: glDrawArrays reported error 0x%x", + error); + } + } + + uchar *data = new uchar[width * height * 4]; + + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); + + QImage image(width, height, QImage::Format_ARGB32); + quint32 *dest = reinterpret_cast<quint32 *>(image.bits()); + for (int i=0; i<width*height; ++i) + dest[i] = qRgba(0xff, 0xff, 0xff, data[i]); + + QByteArray fileName = m_cacheId + " " + QByteArray::number(textureId); + fileName = fileName.replace('/', '_').replace(' ', '_') + ".png"; + image.save(QString::fromLocal8Bit(fileName)); + + { + GLenum error = glGetError(); + if (error != GL_NO_ERROR) { + qWarning("SharedGraphicsCacheServer::readBackBuffer: glReadPixels reported error 0x%x", + error); + } + } + + glDisableVertexAttribArray(0); + glDisableVertexAttribArray(1); + + glDeleteFramebuffers(1, &fboId); + glDeleteTextures(1, &tmpTexture); + + delete[] data; +} +#endif + +namespace { + struct TextureContent { + QSize size; + QVector<glyph_t> glyphs; + }; +} + +void QSGSharedDistanceFieldGlyphCache::processPendingGlyphs() +{ + Q_ASSERT(QThread::currentThread() == thread()); + + waitForGlyphs(); + + { + QMutexLocker locker(&m_pendingGlyphsMutex); + if (m_pendingMissingGlyphs.isEmpty() + && m_pendingReadyGlyphs.isEmpty() + && m_pendingInvalidatedGlyphs.isEmpty()) { + return; + } + + { + QVector<glyph_t> pendingMissingGlyphs; + pendingMissingGlyphs.reserve(m_pendingMissingGlyphs.size()); + + QSet<glyph_t>::const_iterator it = m_pendingMissingGlyphs.constBegin(); + while (it != m_pendingMissingGlyphs.constEnd()) { + pendingMissingGlyphs.append(*it); + ++it; + } + + markGlyphsToRender(pendingMissingGlyphs); + } + + { + QVector<glyph_t> filteredPendingInvalidatedGlyphs; + filteredPendingInvalidatedGlyphs.reserve(m_pendingInvalidatedGlyphs.size()); + + QSet<glyph_t>::const_iterator it = m_pendingInvalidatedGlyphs.constBegin(); + while (it != m_pendingInvalidatedGlyphs.constEnd()) { + bool rerequestGlyph = false; + + // The glyph was invalidated right after being posted as ready, we throw away + // the ready glyph and rerequest it to be certain + QHash<quint32, PendingGlyph>::iterator pendingGlyphIt = m_pendingReadyGlyphs.find(*it); + if (pendingGlyphIt != m_pendingReadyGlyphs.end()) { + m_sharedGraphicsCache->dereferenceBuffer(pendingGlyphIt.value().buffer); + pendingGlyphIt = m_pendingReadyGlyphs.erase(pendingGlyphIt); + rerequestGlyph = true; + } + + void *bufferId = m_bufferForGlyph.value(*it, 0); + if (bufferId != 0) { + m_sharedGraphicsCache->dereferenceBuffer(bufferId); + m_bufferForGlyph.remove(*it); + rerequestGlyph = true; + } + + if (rerequestGlyph) + filteredPendingInvalidatedGlyphs.append(*it); + + ++it; + } + + // If this cache is still using the glyphs, reset the texture held by them, and mark them + // to be rendered again since they are still needed. + if (!filteredPendingInvalidatedGlyphs.isEmpty()) { + setGlyphsTexture(filteredPendingInvalidatedGlyphs, Texture()); + markGlyphsToRender(filteredPendingInvalidatedGlyphs); + } + } + + { + QList<GlyphPosition> glyphPositions; + + QHash<void *, TextureContent> textureContentForBuffer; + { + QHash<quint32, PendingGlyph>::iterator it = m_pendingReadyGlyphs.begin(); + while (it != m_pendingReadyGlyphs.end()) { + void *currentGlyphBuffer = m_bufferForGlyph.value(it.key(), 0); + if (currentGlyphBuffer != 0) { + if (!m_sharedGraphicsCache->dereferenceBuffer(currentGlyphBuffer)) { + Q_ASSERT(!textureContentForBuffer.contains(currentGlyphBuffer)); + } + } + + PendingGlyph &pendingGlyph = it.value(); + + // We don't ref or deref the buffer here, since it was already referenced when + // added to the pending ready glyphs + m_bufferForGlyph[it.key()] = pendingGlyph.buffer; + + textureContentForBuffer[pendingGlyph.buffer].size = pendingGlyph.bufferSize; + textureContentForBuffer[pendingGlyph.buffer].glyphs.append(it.key()); + + GlyphPosition glyphPosition; + glyphPosition.glyph = it.key(); + glyphPosition.position = pendingGlyph.position; + + glyphPositions.append(glyphPosition); + + ++it; + } + } + + setGlyphsPosition(glyphPositions); + + { + QHash<void *, TextureContent>::const_iterator it = textureContentForBuffer.constBegin(); + while (it != textureContentForBuffer.constEnd()) { + Texture texture; + texture.textureId = m_sharedGraphicsCache->textureIdForBuffer(it.key()); + texture.size = it.value().size; + +#if defined(QSGSHAREDDISTANCEFIELDGLYPHCACHE_DEBUG_) + saveTexture(texture.textureId, texture.size.width(), texture.size.height()); +#endif + setGlyphsTexture(it.value().glyphs, texture); + + ++it; + } + } + } + + m_pendingMissingGlyphs.clear(); + m_pendingInvalidatedGlyphs.clear(); + m_pendingReadyGlyphs.clear(); + } +} + +void QSGSharedDistanceFieldGlyphCache::reportItemsAvailable(const QByteArray &cacheId, + void *bufferId, const QSize &bufferSize, + const QVector<quint32> &itemIds, + const QVector<QPoint> &positions) +{ + { + QMutexLocker locker(&m_pendingGlyphsMutex); + if (m_cacheId != cacheId) + return; + + Q_ASSERT(itemIds.size() == positions.size()); + +#if defined(QSGSHAREDDISTANCEFIELDGLYPHCACHE_DEBUG) + qDebug("QSGSharedDistanceFieldGlyphCache::reportItemsAvailable() called for %s (%d glyphs, bufferSize: %dx%d)", + cacheId.constData(), itemIds.size(), bufferSize.width(), bufferSize.height()); +#endif + + for (int i=0; i<itemIds.size(); ++i) { + PendingGlyph &pendingGlyph = m_pendingReadyGlyphs[itemIds.at(i)]; + void *oldBuffer = pendingGlyph.buffer; + Q_ASSERT(bufferSize.height() >= pendingGlyph.bufferSize.height()); + + pendingGlyph.buffer = bufferId; + pendingGlyph.position = positions.at(i); + pendingGlyph.bufferSize = bufferSize; + + m_sharedGraphicsCache->referenceBuffer(bufferId); + if (oldBuffer != 0) + m_sharedGraphicsCache->dereferenceBuffer(oldBuffer); + + m_requestedGlyphsThatHaveNotBeenReturned.remove(itemIds.at(i)); + } + } + + m_pendingGlyphsCondition.wakeAll(); + emit glyphsPending(); +} + +void QSGSharedDistanceFieldGlyphCache::reportItemsInvalidated(const QByteArray &cacheId, + const QVector<quint32> &itemIds) +{ + { + QMutexLocker locker(&m_pendingGlyphsMutex); + if (m_cacheId != cacheId) + return; + + for (int i=0; i<itemIds.size(); ++i) + m_pendingInvalidatedGlyphs.insert(itemIds.at(i)); + } + + emit glyphsPending(); +} + + +void QSGSharedDistanceFieldGlyphCache::reportItemsMissing(const QByteArray &cacheId, + const QVector<quint32> &itemIds) +{ + { + QMutexLocker locker(&m_pendingGlyphsMutex); + if (m_cacheId != cacheId) + return; + +#if defined(QSGSHAREDDISTANCEFIELDGLYPHCACHE_DEBUG) + qDebug("QSGSharedDistanceFieldGlyphCache::reportItemsMissing() called for %s (%d glyphs)", + cacheId.constData(), itemIds.size()); +#endif + + for (int i=0; i<itemIds.size(); ++i) { + m_pendingMissingGlyphs.insert(itemIds.at(i)); + m_requestedGlyphsThatHaveNotBeenReturned.remove(itemIds.at(i)); + } + } + + m_pendingGlyphsCondition.wakeAll(); + emit glyphsPending(); +} + +QT_END_NAMESPACE diff --git a/src/quick/scenegraph/qsgshareddistancefieldglyphcache_p.h b/src/quick/scenegraph/qsgshareddistancefieldglyphcache_p.h new file mode 100644 index 0000000000..6f5696eabb --- /dev/null +++ b/src/quick/scenegraph/qsgshareddistancefieldglyphcache_p.h @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QSGSHAREDDISTANCEFIELDGLYPHCACHE_H +#define QSGSHAREDDISTANCEFIELDGLYPHCACHE_H + +#include <QtCore/qwaitcondition.h> +#include <private/qsgadaptationlayer_p.h> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class QPlatformSharedGraphicsCache; +class QSGSharedDistanceFieldGlyphCache : public QObject, public QSGDistanceFieldGlyphCache +{ + Q_OBJECT +public: + explicit QSGSharedDistanceFieldGlyphCache(const QByteArray &cacheId, + QPlatformSharedGraphicsCache *sharedGraphicsCache, + QSGDistanceFieldGlyphCacheManager *man, + QOpenGLContext *c, + const QRawFont &font); + ~QSGSharedDistanceFieldGlyphCache(); + + void registerOwnerElement(QQuickItem *ownerElement); + void unregisterOwnerElement(QQuickItem *ownerElement); + void processPendingGlyphs(); + + void requestGlyphs(const QSet<glyph_t> &glyphs); + void referenceGlyphs(const QSet<glyph_t> &glyphs); + void storeGlyphs(const QHash<glyph_t, QImage> &glyphs); + void releaseGlyphs(const QSet<glyph_t> &glyphs); + +Q_SIGNALS: + void glyphsPending(); + +private Q_SLOTS: + void reportItemsMissing(const QByteArray &cacheId, const QVector<quint32> &itemIds); + void reportItemsAvailable(const QByteArray &cacheId, + void *bufferId, const QSize &bufferSize, + const QVector<quint32> &itemIds, const QVector<QPoint> &positions); + void reportItemsInvalidated(const QByteArray &cacheId, const QVector<quint32> &itemIds); + +private: + void waitForGlyphs(); + void saveTexture(GLuint textureId, int width, int height); + + QSet<quint32> m_requestedGlyphsThatHaveNotBeenReturned; + QWaitCondition m_pendingGlyphsCondition; + QByteArray m_cacheId; + QPlatformSharedGraphicsCache *m_sharedGraphicsCache; + QMutex m_pendingGlyphsMutex; + + QSet<glyph_t> m_pendingInvalidatedGlyphs; + QSet<glyph_t> m_pendingMissingGlyphs; + + struct PendingGlyph + { + PendingGlyph() : buffer(0) {} + + void *buffer; + QSize bufferSize; + QPoint position; + }; + + QHash<quint32, PendingGlyph> m_pendingReadyGlyphs; + QHash<glyph_t, void *> m_bufferForGlyph; +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QSGSHAREDDISTANCEFIELDGLYPHCACHE_H diff --git a/src/quick/scenegraph/scenegraph.pri b/src/quick/scenegraph/scenegraph.pri index db57b1e52b..9fc92222ae 100644 --- a/src/quick/scenegraph/scenegraph.pri +++ b/src/quick/scenegraph/scenegraph.pri @@ -18,7 +18,6 @@ SOURCES += \ $$PWD/coreapi/qsgnodeupdater.cpp \ $$PWD/coreapi/qsgrenderer.cpp - # Util API HEADERS += \ $$PWD/util/qsgareaallocator_p.h \ @@ -63,7 +62,8 @@ HEADERS += \ $$PWD/qsgdefaultimagenode_p.h \ $$PWD/qsgdefaultrectanglenode_p.h \ $$PWD/qsgflashnode_p.h \ - $$PWD/qsgpathsimplifier_p.h + $$PWD/qsgpathsimplifier_p.h \ + $$PWD/qsgshareddistancefieldglyphcache_p.h SOURCES += \ $$PWD/qsgadaptationlayer.cpp \ @@ -77,7 +77,8 @@ SOURCES += \ $$PWD/qsgdefaultimagenode.cpp \ $$PWD/qsgdefaultrectanglenode.cpp \ $$PWD/qsgflashnode.cpp \ - $$PWD/qsgpathsimplifier.cpp + $$PWD/qsgpathsimplifier.cpp \ + $$PWD/qsgshareddistancefieldglyphcache.cpp diff --git a/src/quick/scenegraph/util/qsgareaallocator.cpp b/src/quick/scenegraph/util/qsgareaallocator.cpp index c5171f1c93..09593e0b44 100644 --- a/src/quick/scenegraph/util/qsgareaallocator.cpp +++ b/src/quick/scenegraph/util/qsgareaallocator.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgareaallocator_p.h b/src/quick/scenegraph/util/qsgareaallocator_p.h index be26046865..1f70143902 100644 --- a/src/quick/scenegraph/util/qsgareaallocator_p.h +++ b/src/quick/scenegraph/util/qsgareaallocator_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgdistancefieldutil.cpp b/src/quick/scenegraph/util/qsgdistancefieldutil.cpp index d1b0445ee0..843120ae96 100644 --- a/src/quick/scenegraph/util/qsgdistancefieldutil.cpp +++ b/src/quick/scenegraph/util/qsgdistancefieldutil.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgdistancefieldutil_p.h b/src/quick/scenegraph/util/qsgdistancefieldutil_p.h index bc28a4d9e1..3e2ce5d47a 100644 --- a/src/quick/scenegraph/util/qsgdistancefieldutil_p.h +++ b/src/quick/scenegraph/util/qsgdistancefieldutil_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgengine.cpp b/src/quick/scenegraph/util/qsgengine.cpp index b8c93bab8b..65780278c0 100644 --- a/src/quick/scenegraph/util/qsgengine.cpp +++ b/src/quick/scenegraph/util/qsgengine.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -78,8 +78,8 @@ QSGEngine::~QSGEngine() void QSGEngine::setCanvas(QQuickCanvas *canvas) { d_func()->canvas = canvas; - connect(canvas, SIGNAL(afterRendering()), this, SIGNAL(afterRendering())); - connect(canvas, SIGNAL(beforeRendering()), this, SIGNAL(beforeRendering())); + connect(canvas, SIGNAL(afterRendering()), this, SIGNAL(afterRendering()), Qt::DirectConnection); + connect(canvas, SIGNAL(beforeRendering()), this, SIGNAL(beforeRendering()), Qt::DirectConnection); } void QSGEngine::setClearBeforeRendering(bool enabled) diff --git a/src/quick/scenegraph/util/qsgengine.h b/src/quick/scenegraph/util/qsgengine.h index 6b7ceb939f..2457509e7f 100644 --- a/src/quick/scenegraph/util/qsgengine.h +++ b/src/quick/scenegraph/util/qsgengine.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgflatcolormaterial.cpp b/src/quick/scenegraph/util/qsgflatcolormaterial.cpp index cf5c7869ea..e14f4d9e7c 100644 --- a/src/quick/scenegraph/util/qsgflatcolormaterial.cpp +++ b/src/quick/scenegraph/util/qsgflatcolormaterial.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgflatcolormaterial.h b/src/quick/scenegraph/util/qsgflatcolormaterial.h index d788901b8a..13297eba5a 100644 --- a/src/quick/scenegraph/util/qsgflatcolormaterial.h +++ b/src/quick/scenegraph/util/qsgflatcolormaterial.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgpainternode.cpp b/src/quick/scenegraph/util/qsgpainternode.cpp index 2ce42fcc4d..876c27e97d 100644 --- a/src/quick/scenegraph/util/qsgpainternode.cpp +++ b/src/quick/scenegraph/util/qsgpainternode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgpainternode_p.h b/src/quick/scenegraph/util/qsgpainternode_p.h index 85f26f6056..8fc757a713 100644 --- a/src/quick/scenegraph/util/qsgpainternode_p.h +++ b/src/quick/scenegraph/util/qsgpainternode_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgsimplematerial.h b/src/quick/scenegraph/util/qsgsimplematerial.h index 44beb135f7..2bca97cf17 100644 --- a/src/quick/scenegraph/util/qsgsimplematerial.h +++ b/src/quick/scenegraph/util/qsgsimplematerial.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgsimplerectnode.cpp b/src/quick/scenegraph/util/qsgsimplerectnode.cpp index c3dc5354ca..7e8a430592 100644 --- a/src/quick/scenegraph/util/qsgsimplerectnode.cpp +++ b/src/quick/scenegraph/util/qsgsimplerectnode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgsimplerectnode.h b/src/quick/scenegraph/util/qsgsimplerectnode.h index 6519290cfe..0aed02ea6d 100644 --- a/src/quick/scenegraph/util/qsgsimplerectnode.h +++ b/src/quick/scenegraph/util/qsgsimplerectnode.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgsimpletexturenode.cpp b/src/quick/scenegraph/util/qsgsimpletexturenode.cpp index 00b240e435..0054f92c3d 100644 --- a/src/quick/scenegraph/util/qsgsimpletexturenode.cpp +++ b/src/quick/scenegraph/util/qsgsimpletexturenode.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgsimpletexturenode.h b/src/quick/scenegraph/util/qsgsimpletexturenode.h index 605cae11e4..94f900f2eb 100644 --- a/src/quick/scenegraph/util/qsgsimpletexturenode.h +++ b/src/quick/scenegraph/util/qsgsimpletexturenode.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgtexture.cpp b/src/quick/scenegraph/util/qsgtexture.cpp index a732c5ab06..32042b0a3d 100644 --- a/src/quick/scenegraph/util/qsgtexture.cpp +++ b/src/quick/scenegraph/util/qsgtexture.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgtexture.h b/src/quick/scenegraph/util/qsgtexture.h index 6fdab9f401..df07382d10 100644 --- a/src/quick/scenegraph/util/qsgtexture.h +++ b/src/quick/scenegraph/util/qsgtexture.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgtexture_p.h b/src/quick/scenegraph/util/qsgtexture_p.h index e1d6dd0e32..4186995afd 100644 --- a/src/quick/scenegraph/util/qsgtexture_p.h +++ b/src/quick/scenegraph/util/qsgtexture_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgtexturematerial.cpp b/src/quick/scenegraph/util/qsgtexturematerial.cpp index 0bee81993c..893993db6c 100644 --- a/src/quick/scenegraph/util/qsgtexturematerial.cpp +++ b/src/quick/scenegraph/util/qsgtexturematerial.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgtexturematerial.h b/src/quick/scenegraph/util/qsgtexturematerial.h index b2b3ce6374..fa34e9f31e 100644 --- a/src/quick/scenegraph/util/qsgtexturematerial.h +++ b/src/quick/scenegraph/util/qsgtexturematerial.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgtexturematerial_p.h b/src/quick/scenegraph/util/qsgtexturematerial_p.h index 0ab552f4e9..7ffe15e85a 100644 --- a/src/quick/scenegraph/util/qsgtexturematerial_p.h +++ b/src/quick/scenegraph/util/qsgtexturematerial_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgtextureprovider.cpp b/src/quick/scenegraph/util/qsgtextureprovider.cpp index 62b2819dab..984733513a 100644 --- a/src/quick/scenegraph/util/qsgtextureprovider.cpp +++ b/src/quick/scenegraph/util/qsgtextureprovider.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgtextureprovider.h b/src/quick/scenegraph/util/qsgtextureprovider.h index bc4ffec03d..87755d852d 100644 --- a/src/quick/scenegraph/util/qsgtextureprovider.h +++ b/src/quick/scenegraph/util/qsgtextureprovider.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgvertexcolormaterial.cpp b/src/quick/scenegraph/util/qsgvertexcolormaterial.cpp index 8c6996642b..ef1fecae90 100644 --- a/src/quick/scenegraph/util/qsgvertexcolormaterial.cpp +++ b/src/quick/scenegraph/util/qsgvertexcolormaterial.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/scenegraph/util/qsgvertexcolormaterial.h b/src/quick/scenegraph/util/qsgvertexcolormaterial.h index 1d3b5a82e0..e6b075415d 100644 --- a/src/quick/scenegraph/util/qsgvertexcolormaterial.h +++ b/src/quick/scenegraph/util/qsgvertexcolormaterial.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativeanimation.cpp b/src/quick/util/qdeclarativeanimation.cpp index 1fc31ae8ad..7f632e3cf0 100644 --- a/src/quick/util/qdeclarativeanimation.cpp +++ b/src/quick/util/qdeclarativeanimation.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativeanimation_p.h b/src/quick/util/qdeclarativeanimation_p.h index 6c9e2646d9..35ae57628e 100644 --- a/src/quick/util/qdeclarativeanimation_p.h +++ b/src/quick/util/qdeclarativeanimation_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativeanimation_p_p.h b/src/quick/util/qdeclarativeanimation_p_p.h index bf596a7c99..ac75875ae5 100644 --- a/src/quick/util/qdeclarativeanimation_p_p.h +++ b/src/quick/util/qdeclarativeanimation_p_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativebehavior.cpp b/src/quick/util/qdeclarativebehavior.cpp index 1c3fb63521..9d5376548c 100644 --- a/src/quick/util/qdeclarativebehavior.cpp +++ b/src/quick/util/qdeclarativebehavior.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativebehavior_p.h b/src/quick/util/qdeclarativebehavior_p.h index fc0af764f4..5927b1e8c4 100644 --- a/src/quick/util/qdeclarativebehavior_p.h +++ b/src/quick/util/qdeclarativebehavior_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativebind.cpp b/src/quick/util/qdeclarativebind.cpp index 7d576858bb..b490a41a83 100644 --- a/src/quick/util/qdeclarativebind.cpp +++ b/src/quick/util/qdeclarativebind.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativebind_p.h b/src/quick/util/qdeclarativebind_p.h index 8dc6a941fa..1bbcc0baed 100644 --- a/src/quick/util/qdeclarativebind_p.h +++ b/src/quick/util/qdeclarativebind_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativechangeset.cpp b/src/quick/util/qdeclarativechangeset.cpp index 680b40e11a..c23247e664 100644 --- a/src/quick/util/qdeclarativechangeset.cpp +++ b/src/quick/util/qdeclarativechangeset.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativechangeset_p.h b/src/quick/util/qdeclarativechangeset_p.h index 0a4b7bcc83..86c24e8cb0 100644 --- a/src/quick/util/qdeclarativechangeset_p.h +++ b/src/quick/util/qdeclarativechangeset_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativeconnections.cpp b/src/quick/util/qdeclarativeconnections.cpp index 92bb1ffa0f..09c0daf013 100644 --- a/src/quick/util/qdeclarativeconnections.cpp +++ b/src/quick/util/qdeclarativeconnections.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -204,6 +204,7 @@ QDeclarativeConnectionsParser::compile(const QList<QDeclarativeCustomParserPrope { QString propName = props.at(ii).name(); int propLine = props.at(ii).location().line; + int propColumn = props.at(ii).location().column; if (!propName.startsWith(QLatin1String("on")) || !propName.at(2).isUpper()) { error(props.at(ii), QDeclarativeConnections::tr("Cannot assign to non-existent property \"%1\"").arg(propName)); @@ -227,6 +228,7 @@ QDeclarativeConnectionsParser::compile(const QList<QDeclarativeCustomParserPrope ds << propName; ds << rewriteSignalHandler(v.asScript(), propName); ds << propLine; + ds << propColumn; } else { error(props.at(ii), QDeclarativeConnections::tr("Connections: script expected")); return QByteArray(); @@ -261,6 +263,9 @@ void QDeclarativeConnections::connectSignals() ds >> script; int line; ds >> line; + int column; + ds >> column; + QDeclarativeProperty prop(target(), propName); if (prop.isValid() && (prop.type() & QDeclarativeProperty::SignalProperty)) { QDeclarativeBoundSignal *signal = @@ -276,7 +281,7 @@ void QDeclarativeConnections::connectSignals() } QDeclarativeExpression *expression = ctxtdata ? - QDeclarativeExpressionPrivate::create(ctxtdata, 0, script, true, location, line) : 0; + QDeclarativeExpressionPrivate::create(ctxtdata, 0, script, true, location, line, column) : 0; signal->setExpression(expression); d->boundsignals += signal; } else { diff --git a/src/quick/util/qdeclarativeconnections_p.h b/src/quick/util/qdeclarativeconnections_p.h index bbde82ea89..011e5a6031 100644 --- a/src/quick/util/qdeclarativeconnections_p.h +++ b/src/quick/util/qdeclarativeconnections_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativefontloader.cpp b/src/quick/util/qdeclarativefontloader.cpp index 002723a88a..2e74d6d0a7 100644 --- a/src/quick/util/qdeclarativefontloader.cpp +++ b/src/quick/util/qdeclarativefontloader.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativefontloader_p.h b/src/quick/util/qdeclarativefontloader_p.h index ec9984a11b..cb13eb7efc 100644 --- a/src/quick/util/qdeclarativefontloader_p.h +++ b/src/quick/util/qdeclarativefontloader_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativelistaccessor.cpp b/src/quick/util/qdeclarativelistaccessor.cpp index ca0ece2325..8af048a06f 100644 --- a/src/quick/util/qdeclarativelistaccessor.cpp +++ b/src/quick/util/qdeclarativelistaccessor.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativelistaccessor_p.h b/src/quick/util/qdeclarativelistaccessor_p.h index c463855491..f990312581 100644 --- a/src/quick/util/qdeclarativelistaccessor_p.h +++ b/src/quick/util/qdeclarativelistaccessor_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativelistcompositor.cpp b/src/quick/util/qdeclarativelistcompositor.cpp index 15cbab72ea..ba6e23ec03 100644 --- a/src/quick/util/qdeclarativelistcompositor.cpp +++ b/src/quick/util/qdeclarativelistcompositor.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativelistcompositor_p.h b/src/quick/util/qdeclarativelistcompositor_p.h index 83467bd1d7..bc1c6a7c19 100644 --- a/src/quick/util/qdeclarativelistcompositor_p.h +++ b/src/quick/util/qdeclarativelistcompositor_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativepackage.cpp b/src/quick/util/qdeclarativepackage.cpp index 395ca3657e..cdaa730346 100644 --- a/src/quick/util/qdeclarativepackage.cpp +++ b/src/quick/util/qdeclarativepackage.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativepackage_p.h b/src/quick/util/qdeclarativepackage_p.h index 0b79978d49..eb0ff18f80 100644 --- a/src/quick/util/qdeclarativepackage_p.h +++ b/src/quick/util/qdeclarativepackage_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativepath.cpp b/src/quick/util/qdeclarativepath.cpp index b21d6119d2..52d0245ee0 100644 --- a/src/quick/util/qdeclarativepath.cpp +++ b/src/quick/util/qdeclarativepath.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativepath_p.h b/src/quick/util/qdeclarativepath_p.h index b1bd68395d..fd8be57d6b 100644 --- a/src/quick/util/qdeclarativepath_p.h +++ b/src/quick/util/qdeclarativepath_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativepath_p_p.h b/src/quick/util/qdeclarativepath_p_p.h index 5af7a22282..47031bc28c 100644 --- a/src/quick/util/qdeclarativepath_p_p.h +++ b/src/quick/util/qdeclarativepath_p_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativepathinterpolator.cpp b/src/quick/util/qdeclarativepathinterpolator.cpp index b528726ff8..c954c23f6c 100644 --- a/src/quick/util/qdeclarativepathinterpolator.cpp +++ b/src/quick/util/qdeclarativepathinterpolator.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativepathinterpolator_p.h b/src/quick/util/qdeclarativepathinterpolator_p.h index 2d2ad42689..fe4c9791d7 100644 --- a/src/quick/util/qdeclarativepathinterpolator_p.h +++ b/src/quick/util/qdeclarativepathinterpolator_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativepixmapcache.cpp b/src/quick/util/qdeclarativepixmapcache.cpp index cb29ec649b..236b93ecbd 100644 --- a/src/quick/util/qdeclarativepixmapcache.cpp +++ b/src/quick/util/qdeclarativepixmapcache.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativepixmapcache_p.h b/src/quick/util/qdeclarativepixmapcache_p.h index 2e310e13fb..e99d95949c 100644 --- a/src/quick/util/qdeclarativepixmapcache_p.h +++ b/src/quick/util/qdeclarativepixmapcache_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativepropertychanges.cpp b/src/quick/util/qdeclarativepropertychanges.cpp index a475c5f879..16293d5649 100644 --- a/src/quick/util/qdeclarativepropertychanges.cpp +++ b/src/quick/util/qdeclarativepropertychanges.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -337,7 +337,7 @@ void QDeclarativePropertyChangesPrivate::decode() QDeclarativeExpression *expression = new QDeclarativeExpression(qmlContext(q), object, data.toString()); QDeclarativeData *ddata = QDeclarativeData::get(q); if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) - expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber); + expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber, ddata->columnNumber); QDeclarativeReplaceSignalHandler *handler = new QDeclarativeReplaceSignalHandler; handler->property = prop; handler->expression = expression; @@ -346,7 +346,7 @@ void QDeclarativePropertyChangesPrivate::decode() QDeclarativeExpression *expression = new QDeclarativeExpression(qmlContext(q), object, data.toString()); QDeclarativeData *ddata = QDeclarativeData::get(q); if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) - expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber); + expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber, ddata->columnNumber); expressions << ExpressionChange(name, id, expression); } else { properties << qMakePair(name, data); @@ -480,7 +480,7 @@ QDeclarativePropertyChanges::ActionList QDeclarativePropertyChanges::actions() QDeclarativeBinding *newBinding = id != QDeclarativeBinding::Invalid ? QDeclarativeBinding::createBinding(id, object(), qmlContext(this), e->sourceFile(), e->lineNumber()) : 0; if (!newBinding) { newBinding = new QDeclarativeBinding(e->expression(), object(), qmlContext(this)); - newBinding->setSourceLocation(e->sourceFile(), e->lineNumber()); + newBinding->setSourceLocation(e->sourceFile(), e->lineNumber(), e->columnNumber()); } newBinding->setTarget(prop); a.toBinding = newBinding; diff --git a/src/quick/util/qdeclarativepropertychanges_p.h b/src/quick/util/qdeclarativepropertychanges_p.h index 1057cf2b72..ca12adcc22 100644 --- a/src/quick/util/qdeclarativepropertychanges_p.h +++ b/src/quick/util/qdeclarativepropertychanges_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativesmoothedanimation.cpp b/src/quick/util/qdeclarativesmoothedanimation.cpp index dd277e4ff3..2944c7ace9 100644 --- a/src/quick/util/qdeclarativesmoothedanimation.cpp +++ b/src/quick/util/qdeclarativesmoothedanimation.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativesmoothedanimation_p.h b/src/quick/util/qdeclarativesmoothedanimation_p.h index 2bf7dfbf8f..b8f031791b 100644 --- a/src/quick/util/qdeclarativesmoothedanimation_p.h +++ b/src/quick/util/qdeclarativesmoothedanimation_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativesmoothedanimation_p_p.h b/src/quick/util/qdeclarativesmoothedanimation_p_p.h index 93b3f1f3bc..c6a48e4369 100644 --- a/src/quick/util/qdeclarativesmoothedanimation_p_p.h +++ b/src/quick/util/qdeclarativesmoothedanimation_p_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativespringanimation.cpp b/src/quick/util/qdeclarativespringanimation.cpp index 84e0b773f4..84bb17f682 100644 --- a/src/quick/util/qdeclarativespringanimation.cpp +++ b/src/quick/util/qdeclarativespringanimation.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativespringanimation_p.h b/src/quick/util/qdeclarativespringanimation_p.h index f9ca9f4dca..2ae1743449 100644 --- a/src/quick/util/qdeclarativespringanimation_p.h +++ b/src/quick/util/qdeclarativespringanimation_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativestate.cpp b/src/quick/util/qdeclarativestate.cpp index 003ac6b03e..db00652fd9 100644 --- a/src/quick/util/qdeclarativestate.cpp +++ b/src/quick/util/qdeclarativestate.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativestate_p.h b/src/quick/util/qdeclarativestate_p.h index e74ef5004f..a7bd36d110 100644 --- a/src/quick/util/qdeclarativestate_p.h +++ b/src/quick/util/qdeclarativestate_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativestate_p_p.h b/src/quick/util/qdeclarativestate_p_p.h index 230132434f..42de614763 100644 --- a/src/quick/util/qdeclarativestate_p_p.h +++ b/src/quick/util/qdeclarativestate_p_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativestategroup.cpp b/src/quick/util/qdeclarativestategroup.cpp index 31a95c8192..43397dbf6f 100644 --- a/src/quick/util/qdeclarativestategroup.cpp +++ b/src/quick/util/qdeclarativestategroup.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativestategroup_p.h b/src/quick/util/qdeclarativestategroup_p.h index cc0aa39722..58453d1491 100644 --- a/src/quick/util/qdeclarativestategroup_p.h +++ b/src/quick/util/qdeclarativestategroup_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativestateoperations.cpp b/src/quick/util/qdeclarativestateoperations.cpp index 31a1f2e65f..796689d770 100644 --- a/src/quick/util/qdeclarativestateoperations.cpp +++ b/src/quick/util/qdeclarativestateoperations.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativestateoperations_p.h b/src/quick/util/qdeclarativestateoperations_p.h index 9796b072d5..1876fe39c6 100644 --- a/src/quick/util/qdeclarativestateoperations_p.h +++ b/src/quick/util/qdeclarativestateoperations_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativestyledtext.cpp b/src/quick/util/qdeclarativestyledtext.cpp index fb8bf5ddf2..9944b015ca 100644 --- a/src/quick/util/qdeclarativestyledtext.cpp +++ b/src/quick/util/qdeclarativestyledtext.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativestyledtext_p.h b/src/quick/util/qdeclarativestyledtext_p.h index da86d4b3c2..a77e848e74 100644 --- a/src/quick/util/qdeclarativestyledtext_p.h +++ b/src/quick/util/qdeclarativestyledtext_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativesvgparser.cpp b/src/quick/util/qdeclarativesvgparser.cpp index 5b1d9730e4..cdf575d7fb 100644 --- a/src/quick/util/qdeclarativesvgparser.cpp +++ b/src/quick/util/qdeclarativesvgparser.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclaractive module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativesvgparser_p.h b/src/quick/util/qdeclarativesvgparser_p.h index 991dcae0e3..e6e4292b41 100644 --- a/src/quick/util/qdeclarativesvgparser_p.h +++ b/src/quick/util/qdeclarativesvgparser_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclaractive module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativesystempalette.cpp b/src/quick/util/qdeclarativesystempalette.cpp index 658694c4fb..efbc97870e 100644 --- a/src/quick/util/qdeclarativesystempalette.cpp +++ b/src/quick/util/qdeclarativesystempalette.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativesystempalette_p.h b/src/quick/util/qdeclarativesystempalette_p.h index f882c5e2ec..d8e17a42d6 100644 --- a/src/quick/util/qdeclarativesystempalette_p.h +++ b/src/quick/util/qdeclarativesystempalette_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativetimeline.cpp b/src/quick/util/qdeclarativetimeline.cpp index 5cbda211be..0ec4bcf7f7 100644 --- a/src/quick/util/qdeclarativetimeline.cpp +++ b/src/quick/util/qdeclarativetimeline.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativetimeline_p_p.h b/src/quick/util/qdeclarativetimeline_p_p.h index d468221fc7..348c82280a 100644 --- a/src/quick/util/qdeclarativetimeline_p_p.h +++ b/src/quick/util/qdeclarativetimeline_p_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativetimer.cpp b/src/quick/util/qdeclarativetimer.cpp index 706afec9fa..6143464f48 100644 --- a/src/quick/util/qdeclarativetimer.cpp +++ b/src/quick/util/qdeclarativetimer.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativetimer_p.h b/src/quick/util/qdeclarativetimer_p.h index f3d53bf287..c1991b16be 100644 --- a/src/quick/util/qdeclarativetimer_p.h +++ b/src/quick/util/qdeclarativetimer_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativetransition.cpp b/src/quick/util/qdeclarativetransition.cpp index 7ebff8cbca..b1f5bd11ca 100644 --- a/src/quick/util/qdeclarativetransition.cpp +++ b/src/quick/util/qdeclarativetransition.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativetransition_p.h b/src/quick/util/qdeclarativetransition_p.h index bc9f04423c..036d7305d1 100644 --- a/src/quick/util/qdeclarativetransition_p.h +++ b/src/quick/util/qdeclarativetransition_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativetransitionmanager.cpp b/src/quick/util/qdeclarativetransitionmanager.cpp index b13cc8aa36..0d96cc98f0 100644 --- a/src/quick/util/qdeclarativetransitionmanager.cpp +++ b/src/quick/util/qdeclarativetransitionmanager.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativetransitionmanager_p_p.h b/src/quick/util/qdeclarativetransitionmanager_p_p.h index b56e878143..de16908096 100644 --- a/src/quick/util/qdeclarativetransitionmanager_p_p.h +++ b/src/quick/util/qdeclarativetransitionmanager_p_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativeutilmodule.cpp b/src/quick/util/qdeclarativeutilmodule.cpp index 94119f1a9c..85c783a13d 100644 --- a/src/quick/util/qdeclarativeutilmodule.cpp +++ b/src/quick/util/qdeclarativeutilmodule.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** diff --git a/src/quick/util/qdeclarativeutilmodule_p.h b/src/quick/util/qdeclarativeutilmodule_p.h index 69cdfd37a1..7e4812349e 100644 --- a/src/quick/util/qdeclarativeutilmodule_p.h +++ b/src/quick/util/qdeclarativeutilmodule_p.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** |