diff options
51 files changed, 3212 insertions, 1393 deletions
@@ -6516,6 +6516,7 @@ cat >>"$QTCONFIG.tmp" <<EOF CONFIG += $QTCONFIG_CONFIG host_build { QT_ARCH = $CFG_HOST_ARCH + QT_TARGET_ARCH = $CFG_ARCH } else { QT_ARCH = $CFG_ARCH QMAKE_DEFAULT_LIBDIRS = $DEFAULT_LIBDIRS diff --git a/doc/global/externalsites/rfc.qdoc b/doc/global/externalsites/rfc.qdoc index bc6a1d66a2..37c71ab73e 100644 --- a/doc/global/externalsites/rfc.qdoc +++ b/doc/global/externalsites/rfc.qdoc @@ -77,3 +77,18 @@ \externalpage http://www.rfc-editor.org/rfc/rfc3986.txt \title RFC 3986 */ + +/*! + \externalpage http://www.rfc-editor.org/rfc/rfc2822.txt + \title RFC 2822 +*/ + +/*! + \externalpage http://www.rfc-editor.org/rfc/rfc1036.txt + \title RFC 1036 +*/ + +/*! + \externalpage http://www.rfc-editor.org/rfc/rfc850.txt + \title RFC 850 +*/ diff --git a/doc/global/qt-cpp-defines.qdocconf b/doc/global/qt-cpp-defines.qdocconf index e65baf6c5f..66589a1504 100644 --- a/doc/global/qt-cpp-defines.qdocconf +++ b/doc/global/qt-cpp-defines.qdocconf @@ -60,6 +60,7 @@ Cpp.ignoretokens += \ Q_OUTOFLINE_TEMPLATE \ Q_PRINTSUPPORT_EXPORT \ Q_QML_EXPORT \ + Q_REQUIRED_RESULT \ Q_SCRIPT_EXPORT \ Q_SCRIPTTOOLS_EXPORT \ Q_SQL_EXPORT \ diff --git a/doc/global/template/style/offline.css b/doc/global/template/style/offline.css index 5a036c7f07..f573633331 100644 --- a/doc/global/template/style/offline.css +++ b/doc/global/template/style/offline.css @@ -1,43 +1,55 @@ -body{ -font: normal 400 14px/1.2 Arial; -margin-top:85px; -font-family: Arial, Helvetica; -color:#313131; -text-align:justify; -margin-left:5px; -margin-right:5px; +body { + font: normal 400 14px/1.2 Arial; + margin-top: 85px; + font-family: Arial, Helvetica; + color: #313131; + text-align: justify; + margin-left: 5px; + margin-right: 5px; } p { -line-height: 20px; + line-height: 20px } -img{ --moz-box-shadow: 3px 3px 3px #ccc; --webkit-box-shadow: 3px 3px 3px #ccc; -box-shadow: 3px 3px 3px #ccc; -border:#8E8D8D 2px solid; -margin-left:0px; -max-width: 800px; -height: auto + +img { + -moz-box-shadow: 3px 3px 3px #ccc; + -webkit-box-shadow: 3px 3px 3px #ccc; + box-shadow: 3px 3px 3px #ccc; + border: #8E8D8D 2px solid; + margin-left: 0px; + max-width: 800px; + height: auto; } -.content{} +.content { -.descr{ -margin-top:35px; -/*max-width: 75%;*/ -margin-left:5px; -text-align:justify; -vertical-align:top; } -.name{ -max-width: 75%; -font-weight:100; +.content .indexboxcont li { + font: normal bold 13px/1 Verdana + } + +.content .normallist li { + font: normal 13px/1 Verdana + } + +.descr { + margin-top: 35px; + /*max-width: 75%;*/ + margin-left: 5px; + text-align: justify; + vertical-align: top; } -tt{ -text-align:left;} +.name { + max-width: 75%; + font-weight: 100; +} + +tt { + text-align: left +} /* ----------- @@ -45,25 +57,25 @@ links ----------- */ -a:link{ -color: #007330; -text-decoration: none; -text-align:left; +a:link { + color: #007330; + text-decoration: none; + text-align: left; } -a:hover{ -color: #44a51c; -text-align:left; +a:hover { + color: #44a51c; + text-align: left; } -a:visited{ -color: #007330; -text-align:left; +a:visited { + color: #007330; + text-align: left; } -a:visited:hover{ -color: #44a51c; -text-align:left; +a:visited:hover { + color: #44a51c; + text-align: left; } /* @@ -71,19 +83,19 @@ text-align:left; offline viewing: HTML links display an icon ----------- */ -a[href*="http://"], a[href*="ftp://"],a[href*="https://"] -{ -text-decoration: none; -background-image:url(../images/ico_out.png); -background-repeat:no-repeat; -background-position:left; -padding-left:20px; -text-align:left; + +a[href*="http://"], a[href*="ftp://"], a[href*="https://"] { + text-decoration: none; + background-image: url(../images/ico_out.png); + background-repeat: no-repeat; + background-position: left; + padding-left: 20px; + text-align: left; } -.flags{ -text-decoration:none; -text-height:24px; +.flags { + text-decoration: none; + text-height: 24px; } /* @@ -91,36 +103,37 @@ text-height:24px; NOTE styles ------------------------------- */ -.notetitle, .tiptitle, .fastpathtitle{ -font-weight:bold; + +.notetitle, .tiptitle, .fastpathtitle { + font-weight: bold } -.attentiontitle,.cautiontitle,.dangertitle,.importanttitle,.remembertitle,.restrictiontitle{ -font-weight:bold; +.attentiontitle, .cautiontitle, .dangertitle, .importanttitle, .remembertitle, .restrictiontitle { + font-weight: bold } -.note,.tip,.fastpath{ -background: #F2F2F2 url(../images/ico_note.png); -background-repeat: no-repeat; -background-position: top left; -padding:5px; -padding-left:40px; -padding-bottom:10px; -border:#999 1px dotted; -color:#666666; -margin:5px; +.note, .tip, .fastpath { + background: #F2F2F2 url(../images/ico_note.png); + background-repeat: no-repeat; + background-position: top left; + padding: 5px; + padding-left: 40px; + padding-bottom: 10px; + border: #999 1px dotted; + color: #666666; + margin: 5px; } -.attention,.caution,.danger,.important,.remember,.restriction{ -background: #F2F2F2 url(../images/ico_note_attention.png); -background-repeat:no-repeat; -background-position:top left; -padding:5px; -padding-left:40px; -padding-bottom:10px; -border:#999 1px dotted; -color:#666666; -margin:5px; +.attention, .caution, .danger, .important, .remember, .restriction { + background: #F2F2F2 url(../images/ico_note_attention.png); + background-repeat: no-repeat; + background-position: top left; + padding: 5px; + padding-left: 40px; + padding-bottom: 10px; + border: #999 1px dotted; + color: #666666; + margin: 5px; } /* @@ -129,124 +142,125 @@ Top navigation ------------------------------- */ -.qtref{ -display: block; -position: relative; -height:15px; -z-index: 1; -font-size:11px; -padding-right:10px; -float:right; -} - -.naviNextPrevious{ -clear: both; -display: block; -position: relative; -text-align: right; -top: -47px; -float:right; -height:20px; -z-index:1; -padding-right:10px; -padding-top:2px; -vertical-align:top; -margin:0px; -} - - -.naviNextPrevious > a:first-child{ -background-image:url(../images/btn_prev.png); -background-repeat:no-repeat; -background-position:left; -padding-left:20px; -height:20px; -padding-left:20px; -} - -.naviNextPrevious > a:last-child{ -background-image:url(../images/btn_next.png); -background-repeat:no-repeat; -background-position:right; -padding-right:20px; -height:20px; -margin-left:30px; -} +.qtref { + display: block; + position: relative; + height: 15px; + z-index: 1; + font-size: 11px; + padding-right: 10px; + float: right; +} + +.naviNextPrevious { + clear: both; + display: block; + position: relative; + text-align: right; + top: -47px; + float: right; + height: 20px; + z-index: 1; + padding-right: 10px; + padding-top: 2px; + vertical-align: top; + margin: 0px; +} + +.naviNextPrevious > a:first-child { + background-image: url(../images/btn_prev.png); + background-repeat: no-repeat; + background-position: left; + padding-left: 20px; + height: 20px; + padding-left: 20px; + } + +.naviNextPrevious > a:last-child { + background-image: url(../images/btn_next.png); + background-repeat: no-repeat; + background-position: right; + padding-right: 20px; + height: 20px; + margin-left: 30px; + } + /* ----------- footer and license ----------- */ -.footer{ -text-align:center -} - -.navigationbar{ -display: block; -position: relative; -top:-20px; -/*border-top:2px solid #ffffff;*/ -border-bottom: 1px solid #cecece; -background-color:#F2F2F2; -z-index:1; -height:20px; -padding-left:7px; -margin:0px; -padding-top:2px; -margin-left:-5px; -margin-right:-5px; -} - -.navigationbar ul{ - margin:0px; - padding:0px; -} -.navigationbar ul li{ -list-style-type:none; -padding-top:2px; -padding-left: 4px; -margin:0; -height:20px; +.footer { + text-align: center } -.navigationbar li{ -float:left; +.navigationbar { + display: block; + position: relative; + top: -20px; + /*border-top: 2px solid #ffffff;*/ + border-bottom: 1px solid #cecece; + background-color: #F2F2F2; + z-index: 1; + height: 20px; + padding-left: 7px; + margin: 0px; + padding-top: 2px; + margin-left: -5px; + margin-right: -5px; } .navigationbar .first { -background:url(../images/home.png); -background-position:left; -background-repeat:no-repeat; -padding-left:20px; -} - - -.navigationbar li a{ -display:block; -text-decoration:none; -background:url(../images/arrow_bc.png); -background-repeat:no-repeat; -background-position:right; -padding-right:17px; -} - + background: url(../images/home.png); + background-position: left; + background-repeat: no-repeat; + padding-left: 20px; + } + +.navigationbar ul { + margin: 0px; + padding: 0px; + } + + .navigationbar ul li { + list-style-type: none; + padding-top: 2px; + padding-left: 4px; + margin: 0; + height: 20px; + } + +.navigationbar li { + float: left + } + + .navigationbar li a { + display: block; + text-decoration: none; + background: url(../images/arrow_bc.png); + background-repeat: no-repeat; + background-position: right; + padding-right: 17px; + } /* ----------- footer and license ----------- */ -.footer{ -text-align:center + +.footer { + text-align: center } -#buildversion{ -font-style: italic; -font-size: small; -float: right; -margin-right: 5px; +#buildversion { + font-style: italic; + font-size: small; + float: right; + margin-right: 5px; } + /* /* table of content @@ -259,181 +273,177 @@ headers ----------- */ - -@media screen{ -.title{ -color:#313131; -font-size: 18px; -font-weight: normal; -left: 0; -padding-bottom: 20px; -padding-left: 10px; -padding-top: 20px; -position: absolute; -right: 0; -top: 0; -background-color:#E6E6E6; -border-bottom: 1px #CCC solid; -border-top: 2px #CCC solid; -font-weight:bold; -margin-left:0px; -margin-right:0px; -} +@media screen { + .title { + color: #313131; + font-size: 18px; + font-weight: normal; + left: 0; + padding-bottom: 20px; + padding-left: 10px; + padding-top: 20px; + position: absolute; + right: 0; + top: 0; + background-color: #E6E6E6; + border-bottom: 1px #CCC solid; + border-top: 2px #CCC solid; + font-weight: bold; + margin-left: 0px; + margin-right: 0px; + } } h1 { -margin: 0; + margin: 0 } h2, p.h2 { -font: 500 16px/1.2 Arial; -font-weight:100; -background-color:#F2F3F4; -padding:4px; -margin-bottom:30px; -margin-top:30px; -border-top:#E0E0DE 1px solid; -border-bottom: #E0E0DE 1px solid; -max-width: 99%; -overflow: hidden; -} - -h3{ - -font: 500 14px/1.2 Arial; -font-weight:100; -text-decoration:underline; -margin-bottom:30px; -margin-top:30px; -} - -h3.fn,span.fn{ -border-width: 1px; -border-style: solid; -border-color: #E6E6E6; --moz-border-radius: 7px 7px 7px 7px; --webkit-border-radius: 7px 7px 7px 7px; -border-radius: 7px 7px 7px 7px; -background-color: #F6F6F6; -word-spacing: 3px; -padding: 5px 5px; -text-decoration:none; -font-weight:bold; -max-width:75%; -font-size:14px; -margin:0px; -margin-top:45px; - -} - -.name{ -color:#1A1A1A; -} -.type{ -color:#808080; + font: 500 16px/1.2 Arial; + font-weight: 100; + background-color: #F2F3F4; + padding: 4px; + margin-bottom: 30px; + margin-top: 30px; + border-top: #E0E0DE 1px solid; + border-bottom: #E0E0DE 1px solid; + max-width: 99%; + overflow: hidden; +} + +h3 { + font: 500 14px/1.2 Arial; + font-weight: 100; + text-decoration: underline; + margin-bottom: 30px; + margin-top: 30px; +} + +h3.fn, span.fn { + border-width: 1px; + border-style: solid; + border-color: #E6E6E6; + -moz-border-radius: 7px 7px 7px 7px; + -webkit-border-radius: 7px 7px 7px 7px; + border-radius: 7px 7px 7px 7px; + background-color: #F6F6F6; + word-spacing: 3px; + padding: 5px 5px; + text-decoration: none; + font-weight: bold; + max-width: 75%; + font-size: 14px; + margin: 0px; + margin-top: 45px; +} + +.name { + color: #1A1A1A +} + +.type { + color: #808080 } - - @media print { -.title { -color:#0066CB; -font-family:Arial, Helvetica; -font-size: 32px; -font-weight: normal; -left: 0; -position: absolute; -right: 0; -top: 0; -} + .title { + color: #0066CB; + font-family: Arial, Helvetica; + font-size: 32px; + font-weight: normal; + left: 0; + position: absolute; + right: 0; + top: 0; + } } - /* ----------------- table styles ----------------- */ + .table img { -border:none; -margin-left:0px; --moz-box-shadow:0px 0px 0px #fff; --webkit-box-shadow: 0px 0px 0px #fff; -box-shadow: 0px 0px 0px #fff; + border: none; + margin-left: 0px; + -moz-box-shadow: 0px 0px 0px #fff; + -webkit-box-shadow: 0px 0px 0px #fff; + box-shadow: 0px 0px 0px #fff; } /* table with border alternative colours*/ - table,pre{ --moz-border-radius: 7px 7px 7px 7px; --webkit-border-radius: 7px 7px 7px 7px; - border-radius: 7px 7px 7px 7px; -background-color: #F6F6F6; -border: 1px solid #E6E6E6; -border-collapse: separate; -margin-bottom: 25px; -margin-left: 15px; -font-size: 12px; -line-height: 1.2; -} - - -table th{ -text-align:left; -padding-left:20px; -} - -table td { -padding: 3px 15px 3px 20px; -border-bottom:#CCC dotted 1px; -} -table p { margin:0px;} - -table tr.even { -background-color: white; -color: #66666E; -} - -table tr.odd { -background-color: #F6F6F6; -color: #66666E; -} - - -table thead { -text-align:left; -padding-left:20px; -background-color:#e1e0e0; -border-left:none; -border-right:none; -} - -table thead th { -padding-top:5px; -padding-left:10px; -padding-bottom:5px; -border-bottom: 2px solid #D1D1D1; -padding-right:10px; -} - +table, pre { + -moz-border-radius: 7px 7px 7px 7px; + -webkit-border-radius: 7px 7px 7px 7px; + border-radius: 7px 7px 7px 7px; + background-color: #F6F6F6; + border: 1px solid #E6E6E6; + border-collapse: separate; + margin-bottom: 25px; + margin-left: 15px; + font-size: 12px; + line-height: 1.2; +} + + table tr.even { + background-color: white; + color: #66666E; + } + + table tr.odd { + background-color: #F6F6F6; + color: #66666E; + } + + table thead { + text-align: left; + padding-left: 20px; + background-color: #e1e0e0; + border-left: none; + border-right: none; + } + + table thead th { + padding-top: 5px; + padding-left: 10px; + padding-bottom: 5px; + border-bottom: 2px solid #D1D1D1; + padding-right: 10px; + } + + table th { + text-align: left; + padding-left: 20px; + } + + table td { + padding: 3px 15px 3px 20px; + border-bottom: #CCC dotted 1px; + } + + table p { + margin: 0px + } /* table bodless & white*/ .borderless { -border-radius: 0px 0px 0px 0px; -background-color: #fff; -border: 1px solid #fff; + border-radius: 0px 0px 0px 0px; + background-color: #fff; + border: 1px solid #fff; } .borderless tr { -background-color: #FFF; -color: #66666E; -} + background-color: #FFF; + color: #66666E; + } .borderless td { -border:none; -border-bottom:#fff dotted 1px; -} + border: none; + border-bottom: #fff dotted 1px; + } /* ----------- @@ -441,264 +451,249 @@ List ----------- */ -ul{ -padding-bottom:2px; +ul { + padding-bottom: 2px } li { -margin-bottom: 10px; -padding-left: 8px; -list-style:outside; -list-style-type:square; -text-align:left; + margin-bottom: 10px; + padding-left: 8px; + list-style: outside; + list-style-type: square; + text-align: left; } - -ol{ -margin:10px; -padding:0; +ol { + margin: 10px; + padding: 0; } -ol > li{ -margin-left: 30px; -padding-left:8px; -list-style:decimal; -} + ol > li { + margin-left: 30px; + padding-left: 8px; + list-style: decimal; + } -.centerAlign{ -text-align: left; +.centerAlign { + text-align: left } -.cpp{ -display: block; -margin: 10px; -overflow: auto; -padding: 20px 20px 20px 20px; +.cpp { + display: block; + margin: 10px; + overflow: auto; + padding: 20px 20px 20px 20px; } -.js{ -display: block; -margin: 10px; -overflow: auto; -padding: 20px 20px 20px 20px; +.js { + display: block; + margin: 10px; + overflow: auto; + padding: 20px 20px 20px 20px; } -.footer{ -margin-top: 50px; -padding-left:5px; -margin-bottom: 10px; -font-size:10px; -border-top: 1px solid #999; -padding-top:11px; +.footer { + margin-top: 50px; + padding-left: 5px; + margin-bottom: 10px; + font-size: 10px; + border-top: 1px solid #999; + padding-top: 11px; } -.footerNavi{ -width:auto; -text-align:right; -margin-top:50px; -z-index:1; +.footerNavi { + width: auto; + text-align: right; + margin-top: 50px; + z-index: 1; } -.memItemLeft{ -padding-right: 3px; +.memItemLeft { + padding-right: 3px } -.memItemRight{ -padding: 3px 15px 3px 0; +.memItemRight { + padding: 3px 15px 3px 0 } -.qml{ -display: block; -margin: 10px; -overflow: auto; -padding: 20px 20px 20px 20px; +.qml { + display: block; + margin: 10px; + overflow: auto; + padding: 20px 20px 20px 20px; } -.qmldefault{ -padding-left: 5px; -float: right; -color: red; +.qmldefault { + padding-left: 5px; + float: right; + color: red; } -.qmlreadonly{ -padding-left: 5px; -float: right; -color: #254117; +.qmlreadonly { + padding-left: 5px; + float: right; + color: #254117; } -.rightAlign{ -padding: 3px 5px 3px 10px; -text-align: right; +.rightAlign { + padding: 3px 5px 3px 10px; + text-align: right; } .qmldoc { -margin-left: 15px; + margin-left: 15px } + /* ----------- Content table ----------- */ -@media print{ -.toc { -float: right; -clear: right; -padding-bottom: 10px; -padding-top: 50px; -width: 100%; -background-image:url(../images/bgrContent.png); -background-position:top; -background-repeat:no-repeat; -} +@media print { + .toc { + float: right; + clear: right; + padding-bottom: 10px; + padding-top: 50px; + width: 100%; + background-image: url(../images/bgrContent.png); + background-position: top; + background-repeat: no-repeat; + } } -@media screen{ -.toc{ -float:right; -clear: right; -vertical-align:top; --moz-border-radius: 7px 7px 7px 7px; --webkit-border-radius: 7px 7px 7px 7px; -border-radius: 7px 7px 7px 7px; - background:#FFF url('../images/bgrContent.png'); -background-position:top; -background-repeat:repeat-x; -border: 1px solid #E6E6E6; -padding-left:5px; -padding-bottom:10px; -height: auto; -width: 200px; -text-align:left; -margin-left:20px; -} +@media screen { + .toc { + float: right; + clear: right; + vertical-align: top; + -moz-border-radius: 7px 7px 7px 7px; + -webkit-border-radius: 7px 7px 7px 7px; + border-radius: 7px 7px 7px 7px; + background: #FFF url('../images/bgrContent.png'); + background-position: top; + background-repeat: repeat-x; + border: 1px solid #E6E6E6; + padding-left: 5px; + padding-bottom: 10px; + height: auto; + width: 200px; + text-align: left; + margin-left: 20px; + } } -.toc h3{ -text-decoration:none; -} -.toc h3{font: 500 14px/1.2 Arial; -font-weight:100; -padding:0px; -margin:0px; -padding-top:5px; -padding-left:5px; +.toc h3 { + text-decoration: none } - -.toc ul{ -padding-left:10px; -padding-right:5px; +.toc h3 { + font: 500 14px/1.2 Arial; + font-weight: 100; + padding: 0px; + margin: 0px; + padding-top: 5px; + padding-left: 5px; } -.toc ul li{ -margin-left:15px; -list-style-image:url(../images/bullet_dn.png); -marker-offset: 0px; -margin-bottom:8px; -padding-left:0px; +.toc ul { + padding-left: 10px; + padding-right: 5px; } -.toc .level1{ -border:none;} +.toc ul li { + margin-left: 15px; + list-style-image: url(../images/bullet_dn.png); + marker-offset: 0px; + margin-bottom: 8px; + padding-left: 0px; + } -.toc .level2{ -border:none; -margin-left: 25px; +.toc .level1 { + border: none } -.level3{ -border:none; -margin-left: 30px; +.toc .level2 { + border: none; + margin-left: 25px; } -.clearfix{ -clear:both;} +.level3 { + border: none; + margin-left: 30px; +} -/* start index box */ -.indexbox -{ -width: 100%; -display:inline-block; +.clearfix { + clear: both } -.indexboxcont -{ -display: block; +/* start index box */ +.indexbox { + width: 100%; + display: inline-block; } -.indexboxcont .section -{ -display: inline-block; -width: 49%; -*width:42%; -_width:42%; -padding:0 2% 0 1%; -vertical-align:top; -} +.indexbox .indexIcon { + width: 11% + } -.indexboxcont .indexIcon -{ -width: 11%; -*width:18%; -_width:18%; -overflow:hidden; -} + .indexbox .indexIcon span { + display: block + } -.indexboxcont .section { - float: left; +.indexboxcont { + display: block } -.indexboxcont .section p -{ -padding-top: 20px; -padding-bottom: 20px; -} -.indexboxcont .sectionlist -{ -display: inline-block; -vertical-align:top; -width: 32.5%; -padding: 0; -} -.indexboxcont .sectionlist ul -{ -margin-bottom: 20px; -} +.indexboxcont .sectionlist { + display: inline-block; + vertical-align: top; + width: 32.5%; + padding: 0; + } -.indexboxcont .sectionlist ul li -{ -line-height: 1.5; -} + .indexboxcont .sectionlist ul { + margin-bottom: 20px + } -.content .indexboxcont li -{ -font: normal bold 13px/1 Verdana; -} + .indexboxcont .sectionlist ul li { + line-height: 1.5 + } -.content .normallist li -{ -font: normal 13px/1 Verdana; -} +.indexboxcont .indexIcon { + width: 11%; + *width: 18%; + _width: 18%; + overflow: hidden; + } -.indexbox .indexIcon { -width: 11%; -} +.indexboxcont .section { + display: inline-block; + width: 49%; + *width: 42%; + _width: 42%; + padding: 0 2% 0 1%; + vertical-align: top; + } + + .indexboxcont .section p { + padding-top: 20px; + padding-bottom: 20px; + } -.indexbox .indexIcon span -{ -display: block; -} +.indexboxcont .section { + float: left + } -.indexboxcont:after -{ -content: "."; -display: block; -height: 0; -clear: both; -visibility: hidden; +.indexboxcont:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; } /* @@ -706,6 +701,7 @@ visibility: hidden; Landing page ----------- */ + .col-group { white-space: nowrap; vertical-align: top; @@ -720,8 +716,8 @@ Landing page } .col-1 h1 { - margin: 20px 0 0 0; -} + margin: 20px 0 0 0 + } .col-2 { display: inline-block; @@ -731,5 +727,5 @@ Landing page } .sectionlist { - width: 100% !important; + width: 100% !important } diff --git a/doc/global/template/style/online.css b/doc/global/template/style/online.css index 09c863feff..cf73455877 100644 --- a/doc/global/template/style/online.css +++ b/doc/global/template/style/online.css @@ -1,35 +1,41 @@ -{ -line-height: 20px; -} -img{ --moz-box-shadow: 3px 3px 3px #ccc; --webkit-box-shadow: 3px 3px 3px #ccc; -box-shadow: 3px 3px 3px #ccc; -border:#8E8D8D 2px solid; -margin-left:0px; -max-width: 800px; -height: auto +img { + -moz-box-shadow: 3px 3px 3px #ccc; + -webkit-box-shadow: 3px 3px 3px #ccc; + box-shadow: 3px 3px 3px #ccc; + border: #8E8D8D 2px solid; + margin-left: 0px; + max-width: 800px; + height: auto; } -.content{ - margin: 15px; +.content { + margin: 15px } -.descr{ -margin-top:35px; -/*max-width: 75%;*/ -margin-left:5px; -text-align:justify; -vertical-align:top; +.content .indexboxcont li { + font: normal bold 13px/1 Verdana + } + +.content .normallist li { + font: normal 13px/1 Verdana + } + +.descr { + margin-top: 35px; + /*max-width: 75%;*/ + margin-left: 5px; + text-align: justify; + vertical-align: top; } -.name{ -max-width: 75%; -font-weight:100; +.name { + max-width: 75%; + font-weight: 100; } -tt{ -text-align:left;} +tt { + text-align: left +} /* ----------- @@ -37,30 +43,9 @@ links ----------- */ -a:link{ -color: #007330; -text-decoration: none; -text-align:left; -} - -a:hover{ -color: #44a51c; -text-align:left; -} - -a:visited{ -color: #007330; -text-align:left; -} - -a:visited:hover{ -color: #44a51c; -text-align:left; -} - -.flags{ -text-decoration:none; -text-height:24px; +.flags { + text-decoration: none; + text-height: 24px; } /* @@ -68,74 +53,74 @@ text-height:24px; NOTE styles ------------------------------- */ -.notetitle, .tiptitle, .fastpathtitle{ -font-weight:bold; -} -.attentiontitle,.cautiontitle,.dangertitle,.importanttitle,.remembertitle,.restrictiontitle{ -font-weight:bold; +.notetitle, .tiptitle, .fastpathtitle { + font-weight: bold } -.note,.tip,.fastpath{ -background: #F2F2F2 url('../images/ico_note.png'); -background-repeat: no-repeat; -background-position: top left; -padding:5px; -padding-left:40px; -padding-bottom:10px; -border:#999 1px dotted; -color:#666666; -margin:5px; +.attentiontitle, .cautiontitle, .dangertitle, .importanttitle, .remembertitle, .restrictiontitle { + font-weight: bold } -.attention,.caution,.danger,.important,.remember,.restriction{ -background: #F2F2F2 url('../images/ico_note_attention.png'); -background-repeat:no-repeat; -background-position:top left; -padding:5px; -padding-left:40px; -padding-bottom:10px; -border:#999 1px dotted; -color:#666666; -margin:5px; +.note, .tip, .fastpath { + background: #F2F2F2 url('../images/ico_note.png'); + background-repeat: no-repeat; + background-position: top left; + padding: 5px; + padding-left: 40px; + padding-bottom: 10px; + border: #999 1px dotted; + color: #666666; + margin: 5px; } -.qtref{ -display: block; -top: -76px; -z-index: 1; -font-size:11px; -padding-right:10px; -float:right; +.attention, .caution, .danger, .important, .remember, .restriction { + background: #F2F2F2 url('../images/ico_note_attention.png'); + background-repeat: no-repeat; + background-position: top left; + padding: 5px; + padding-left: 40px; + padding-bottom: 10px; + border: #999 1px dotted; + color: #666666; + margin: 5px; } -.naviNextPrevious{ -display: block; -text-align: right; -float:right; -z-index:1; -padding-right:10px; -padding-top:4px; +.qtref { + display: block; + top: -76px; + z-index: 1; + font-size: 11px; + padding-right: 10px; + float: right; } - -.naviNextPrevious > a.prevPage { -background-image:url('../images/btn_prev.png'); -background-repeat:no-repeat; -background-position:left; -padding-left:20px; -height:20px; -padding-left:20px; +.naviNextPrevious { + display: block; + text-align: right; + float: right; + z-index: 1; + padding-right: 10px; + padding-top: 4px; } .naviNextPrevious > a.nextPage { -background-image:url('../images/btn_next.png'); -background-repeat:no-repeat; -background-position:right; -padding-right:20px; -height:20px; -margin-left:30px; -} + background-image: url('../images/btn_next.png'); + background-repeat: no-repeat; + background-position: right; + padding-right: 20px; + height: 20px; + margin-left: 30px; + } + +.naviNextPrevious > a.prevPage { + background-image: url('../images/btn_prev.png'); + background-repeat: no-repeat; + background-position: left; + padding-left: 20px; + height: 20px; + padding-left: 20px; + } .navigationbar { background-repeat: no-repeat; @@ -144,38 +129,37 @@ margin-left:30px; padding: 0px !important; border-bottom: 1px solid rgb(209, 209, 209); background-image: -moz-linear-gradient(center top , rgb(246, 245, 245), rgb(239, 239, 239)); -background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0.0, #efefef), color-stop(0.5, #f6f5f5) ); + background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0.0, #efefef), color-stop(0.5, #f6f5f5) ); border-radius: 10px 10px 0px 0px; } -.navigationbar ul{ -margin:0px; -padding:8px 0px 15px 15px; -height:20px; -} - -.navigationbar li{ -list-style-type:none; -float:left; -font-size: 15px; -} +.navigationbar ul { + margin: 0px; + padding: 8px 0px 15px 15px; + height: 20px; + } -.navigationbar li a{ -display:block; -text-decoration:none; -background:url('../images/arrow_bc.png'); -background-repeat:no-repeat; -background-position:right; -padding-right:25px; -font-size: inherit; -} +.navigationbar li { + list-style-type: none; + float: left; + font-size: 15px; + } + .navigationbar li a { + display: block; + text-decoration: none; + background: url('../images/arrow_bc.png'); + background-repeat: no-repeat; + background-position: right; + padding-right: 25px; + font-size: inherit; + } -#buildversion{ -font-style: italic; -font-size: small; -float: right; -margin-right: 5px; +#buildversion { + font-style: italic; + font-size: small; + float: right; + margin-right: 5px; } /* @@ -184,182 +168,178 @@ headers ----------- */ - -@media screen{ -.title{ -color:#313131; -font-size: 18px; -font-weight: normal; -left: 0; -padding-bottom: 20px; -padding-left: 10px; -padding-top: 20px; -border-bottom: 1px #CCC solid ; -font-weight:bold; -margin-left:0px; -margin-right:0px; -} +@media screen { + .title { + color: #313131; + font-size: 18px; + font-weight: normal; + left: 0; + padding-bottom: 20px; + padding-left: 10px; + padding-top: 20px; + border-bottom: 1px #CCC solid; + font-weight: bold; + margin-left: 0px; + margin-right: 0px; + } } h1 { -margin: 0; + margin: 0 } h2, p.h2 { -font: 500 16px/1.2 Arial; -font-weight:100; -background-color:#F2F3F4; -padding:4px; -padding-left:14px; -margin-bottom:30px; -margin-top:30px; -margin-left:-10px; -margin-right:-5px; -border-top:#E0E0DE 1px solid; -border-bottom: #E0E0DE 1px solid; -max-width: 99%; -overflow: hidden; + font: 500 16px/1.2 Arial; + font-weight: 100; + background-color: #F2F3F4; + padding: 4px; + padding-left: 14px; + margin-bottom: 30px; + margin-top: 30px; + margin-left: -10px; + margin-right: -5px; + border-top: #E0E0DE 1px solid; + border-bottom: #E0E0DE 1px solid; + max-width: 99%; + overflow: hidden; } -h3{ - -font: 500 14px/1.2 Arial; -font-weight:100; -text-decoration:underline; -margin-bottom:30px; -margin-top:30px; +h3 { + font: 500 14px/1.2 Arial; + font-weight: 100; + text-decoration: underline; + margin-bottom: 30px; + margin-top: 30px; } -h3.fn,span.fn{ -border-width: 1px; -border-style: solid; -border-color: #E6E6E6; --moz-border-radius: 7px 7px 7px 7px; --webkit-border-radius: 7px 7px 7px 7px; -border-radius: 7px 7px 7px 7px; -background-color: #F6F6F6; -word-spacing: 3px; -padding: 5px 5px; -text-decoration:none; -font-weight:bold; -max-width:75%; -font-size:14px; -margin:0px; -margin-top:45px; - +h3.fn, span.fn { + border-width: 1px; + border-style: solid; + border-color: #E6E6E6; + -moz-border-radius: 7px 7px 7px 7px; + -webkit-border-radius: 7px 7px 7px 7px; + border-radius: 7px 7px 7px 7px; + background-color: #F6F6F6; + word-spacing: 3px; + padding: 5px 5px; + text-decoration: none; + font-weight: bold; + max-width: 75%; + font-size: 14px; + margin: 0px; + margin-top: 45px; } -.name{ -color:#1A1A1A; -} -.type{ -color:#808080; +.name { + color: #1A1A1A } - +.type { + color: #808080 +} @media print { -.title { -color:#0066CB; -font-size: 32px; -font-weight: normal; -left: 0; -position: absolute; -right: 0; -top: 0; -} + .title { + color: #0066CB; + font-size: 32px; + font-weight: normal; + left: 0; + position: absolute; + right: 0; + top: 0; + } } - /* ----------------- table styles ----------------- */ + .table img { -border:none; -margin-left:0px; --moz-box-shadow:0px 0px 0px #fff; --webkit-box-shadow: 0px 0px 0px #fff; -box-shadow: 0px 0px 0px #fff; + border: none; + margin-left: 0px; + -moz-box-shadow: 0px 0px 0px #fff; + -webkit-box-shadow: 0px 0px 0px #fff; + box-shadow: 0px 0px 0px #fff; } /* table with border alternative colours*/ - table,pre{ --moz-border-radius: 7px 7px 7px 7px; --webkit-border-radius: 7px 7px 7px 7px; - border-radius: 7px 7px 7px 7px; -background-color: #F6F6F6; -border: 1px solid #E6E6E6; -border-collapse: separate; -font-size: 12px; -line-height: 1.2; -margin-bottom: 25px; -margin-left: 15px; -font-size: 12px; -line-height: 1.2; -margin-bottom: 25px; -margin-left: 15px; -} - - -table th{ -text-align:left; -padding-left:20px; -} - -table td { -padding: 3px 15px 3px 20px; -border-bottom:#CCC dotted 1px; -} -table p { margin:0px;} - -table tr.even { -background-color: white; -color: #66666E; -} - -table tr.odd { -background-color: #F6F6F6; -color: #66666E; -} - - -table thead { -text-align:left; -padding-left:20px; -background-color:#e1e0e0; -border-left:none; -border-right:none; -} - -table thead th { -padding-top:5px; -padding-left:10px; -padding-bottom:5px; -border-bottom: 2px solid #D1D1D1; -padding-right:10px; -} - +table, pre { + -moz-border-radius: 7px 7px 7px 7px; + -webkit-border-radius: 7px 7px 7px 7px; + border-radius: 7px 7px 7px 7px; + background-color: #F6F6F6; + border: 1px solid #E6E6E6; + border-collapse: separate; + font-size: 12px; + line-height: 1.2; + margin-bottom: 25px; + margin-left: 15px; + font-size: 12px; + line-height: 1.2; + margin-bottom: 25px; + margin-left: 15px; +} + + table tr.even { + background-color: white; + color: #66666E; + } + + table tr.odd { + background-color: #F6F6F6; + color: #66666E; + } + + table thead { + text-align: left; + padding-left: 20px; + background-color: #e1e0e0; + border-left: none; + border-right: none; + } + + table thead th { + padding-top: 5px; + padding-left: 10px; + padding-bottom: 5px; + border-bottom: 2px solid #D1D1D1; + padding-right: 10px; + } + + table td { + padding: 3px 15px 3px 20px; + border-bottom: #CCC dotted 1px; + } + + table th { + text-align: left; + padding-left: 20px; + } + + table p { + margin: 0px + } /* table bodless & white*/ .borderless { -border-radius: 0px 0px 0px 0px; -background-color: #fff; -border: 1px solid #fff; -} - -.borderless tr { -background-color: #FFF; -color: #66666E; + border-radius: 0px 0px 0px 0px; + background-color: #fff; + border: 1px solid #fff; } .borderless td { -border:none; -border-bottom:#fff dotted 1px; -} + border: none; + border-bottom: #fff dotted 1px; + } + +.borderless tr { + background-color: #FFF; + color: #66666E; + } /* ----------- @@ -367,90 +347,88 @@ List ----------- */ -ul{ -padding-bottom:2px; +ul { + padding-bottom: 2px } li { -margin-bottom: 10px; -padding-left: 8px; -list-style:outside; -list-style-type:square; -text-align:left; + margin-bottom: 10px; + padding-left: 8px; + list-style: outside; + list-style-type: square; + text-align: left; } - -ol{ -margin:10px; -padding:0; +ol { + margin: 10px; + padding: 0; } -ol > li{ -margin-left: 30px; -padding-left:8px; -list-style:decimal; -} + ol > li { + margin-left: 30px; + padding-left: 8px; + list-style: decimal; + } -.centerAlign{ -text-align: left; +.centerAlign { + text-align: left } -.cpp{ -display: block; -margin: 10px; -overflow: auto; -padding: 20px 20px 20px 20px; +.cpp { + display: block; + margin: 10px; + overflow: auto; + padding: 20px 20px 20px 20px; } -.js{ -display: block; -margin: 10px; -overflow: auto; -padding: 20px 20px 20px 20px; +.js { + display: block; + margin: 10px; + overflow: auto; + padding: 20px 20px 20px 20px; } - -.footerNavi{ -width:auto; -text-align:right; -margin-top:50px; -z-index:1; +.footerNavi { + width: auto; + text-align: right; + margin-top: 50px; + z-index: 1; } -.memItemLeft{ -padding-right: 3px; +.memItemLeft { + padding-right: 3px } -.memItemRight{ -padding: 3px 15px 3px 0; +.memItemRight { + padding: 3px 15px 3px 0 } -.qml{ -display: block; -margin: 10px; -overflow: auto; -padding: 20px 20px 20px 20px; +.qml { + display: block; + margin: 10px; + overflow: auto; + padding: 20px 20px 20px 20px; } -.qmldefault{ -padding-left: 5px; -float: right; -color: red; +.qmldefault { + padding-left: 5px; + float: right; + color: red; } -.qmlreadonly{ -padding-left: 5px; -float: right; -color: #254117; +.qmlreadonly { + padding-left: 5px; + float: right; + color: #254117; } -.rightAlign{ -padding: 3px 5px 3px 10px; -text-align: right; +.rightAlign { + padding: 3px 5px 3px 10px; + text-align: right; } .qmldoc { -margin-left: 15px; + margin-left: 15px } /* @@ -459,406 +437,615 @@ Content table ----------- */ -@media print{ -.toc { -float: right; -clear: right; -padding-bottom: 10px; -padding-top: 50px; -width: 100%; -background-image:url('../images/bgrContent.png'); -background-position:top; -background-repeat:no-repeat; -} +@media print { + .toc { + float: right; + clear: right; + padding-bottom: 10px; + padding-top: 50px; + width: 100%; + background-image: url('../images/bgrContent.png'); + background-position: top; + background-repeat: no-repeat; + } +} + +@media screen { + .toc { + clear: both; + clear: right; + position: relative; + top: 83px; + float: right; + vertical-align: top; + -moz-border-radius: 7px 7px 7px 7px; + -webkit-border-radius: 7px 7px 7px 7px; + border-radius: 7px 7px 7px 7px; + background: #FFF url('../images/bgrContent.png'); + background-position: top; + background-repeat: repeat-x; + border: 1px solid #E6E6E6; + padding-left: 5px; + padding-bottom: 10px; + height: auto; + width: 200px; + text-align: left; + margin-left: 20px; + } +} + +.toc h3 { + text-decoration: none +} + +.toc h3 { + font: 500 14px/1.2 Arial; + font-weight: 100; + padding: 0px; + margin: 0px; + padding-top: 5px; + padding-left: 5px; +} + +.toc ul { + padding-left: 10px; + padding-right: 5px; + padding-top: 10px; +} + +.toc ul li { + margin-left: 15px; + list-style-image: url('../images/blu_dot.png'); + list-style: outside; + marker-offset: 0px; + margin-bottom: 8px; + padding-left: 0px; + } + +.toc .level1 { + border: none +} + +.toc .level2 { + border: none; + margin-left: 25px; +} + +.level3 { + border: none; + margin-left: 30px; +} + +.clearfix { + clear: both } -@media screen{ -.toc{ -clear: both; -clear: right; -position: relative; -top: 83px; -float:right; -vertical-align:top; --moz-border-radius: 7px 7px 7px 7px; --webkit-border-radius: 7px 7px 7px 7px; -border-radius: 7px 7px 7px 7px; - background:#FFF url('../images/bgrContent.png'); -background-position:top; -background-repeat:repeat-x; -border: 1px solid #E6E6E6; -padding-left:5px; -padding-bottom:10px; -height: auto; -width: 200px; -text-align:left; -margin-left:20px; -} -} +/* start index box */ -.toc h3{ -text-decoration:none; +.indexbox { + width: 100%; + display: inline-block; } -.toc h3{font: 500 14px/1.2 Arial; -font-weight:100; -padding:0px; -margin:0px; -padding-top:5px; -padding-left:5px; -} +.indexbox .indexIcon { + width: 11% + } + .indexbox .indexIcon span { + display: block + } -.toc ul{ -padding-left:10px; -padding-right:5px; -padding-top:10px; +.indexboxcont { + display: block } -.toc ul li{ -margin-left:15px; -list-style-image:url('../images/blu_dot.png'); -list-style:outside; -marker-offset: 0px; -margin-bottom:8px; -padding-left:0px; -} +.indexboxcont .sectionlist { + display: inline-block; + vertical-align: top; + width: 32.5%; + padding: 0; + } -.toc .level1{ -border:none;} + .indexboxcont .sectionlist ul { + margin-bottom: 20px + } -.toc .level2{ -border:none; -margin-left: 25px; -} + .indexboxcont .sectionlist ul li { + line-height: 1.5 + } -.level3{ -border:none; -margin-left: 30px; +.indexboxcont .indexIcon { + width: 11%; + *width: 18%; + _width: 18%; + overflow: hidden; + } + +.indexboxcont .section { + float: left + } + +.indexboxcont .section { + display: inline-block; + width: 49%; + *width: 42%; + _width: 42%; + padding: 0 2% 0 1%; + vertical-align: top; + } + + .indexboxcont .section p { + padding-top: 20px; + padding-bottom: 20px; + } + +.indexboxcont:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; } -.clearfix{ -clear:both;} +/* +----------- +Landing page +----------- +*/ -/* start index box */ -.indexbox -{ -width: 100%; -display:inline-block; +.col-group { + white-space: nowrap; + vertical-align: top; } -.indexboxcont -{ -display: block; +.col-1 { + display: inline-block; + white-space: normal; + width: 70%; + height: 100%; + float: left; +} +.col-1 h1 { + margin: 20px 0 0 0 + } + +.col-2 { + display: inline-block; + white-space: normal; + width: 25%; + margin: 0 0 0 50px; } -.indexboxcont .section -{ -display: inline-block; -width: 49%; -*width:42%; -_width:42%; -padding:0 2% 0 1%; -vertical-align:top; +.sectionlist { + width: 100% !important } -.indexboxcont .indexIcon -{ -width: 11%; -*width:18%; -_width:18%; -overflow:hidden; +/* +Additions from Qt Project +*/ + +body { + background: #E8E8E8; + margin: 0px; + font-family: "Open Sans",sans-serif !important; } -.indexboxcont .section { - float: left; +.qt13a-twoCol { + width: 23.46939%; + float: left; + margin-right: 2.04082%; + display: inline; } -.indexboxcont .section p -{ -padding-top: 20px; -padding-bottom: 20px; +.qt13a-fourCol { + width: 48.97959%; + float: left; + margin-right: 2.04082%; + display: inline; } -.indexboxcont .sectionlist -{ -display: inline-block; -vertical-align:top; -width: 32.5%; -padding: 0; + +.qt13a-sixCol { + width: 70.4898%; + float: left; + margin-right: 2.04082%; + display: inline; } -.indexboxcont .sectionlist ul -{ -margin-bottom: 20px; + +.qt13a-eightCol { + width: 100%; + float: left; + margin-right: 2.04082%; + display: inline; } -.indexboxcont .sectionlist ul li -{ -line-height: 1.5; +.qt13a-fiveCol { + width: 17.35537%; + float: left; + margin-right: 3.30579%; + display: inline; } -.content .indexboxcont li -{ -font: normal bold 13px/1 Verdana; +.qt13a-fiveCol:nth-child(2n) { + float: left; + margin-right: 3.30579%; } -.content .normallist li -{ -font: normal 13px/1 Verdana; +.qt13a-omega { + float: right; + margin-right: 0; + *margin-left: -20px; + display: inline; } -.indexbox .indexIcon { -width: 11%; +.qt13a-last { + float: right; + margin-right: 0; + *margin-left: -20px; + display: inline; } -.indexbox .indexIcon span -{ -display: block; +.qt13a-container { + *zoom: 1; + padding-left: 20px; + padding-right: 20px; + margin-left: auto; + margin-right: auto; + max-width: 1045px; } -.indexboxcont:after -{ -content: "."; -display: block; -height: 0; -clear: both; -visibility: hidden; +.qt13a-container:after { + content: ""; + display: table; + clear: both; } -/* ------------ -Landing page ------------ -*/ -.col-group { - white-space: nowrap; - vertical-align: top; +.qt13a-container.qt13a-dynamic { + max-width: 1295px } -.col-1 { - display: inline-block; - white-space: normal; - width: 70%; - height: 100%; - float: left; +.qt13a-no-bg-img { + background-image: none !important } -.col-1 h1 { - margin: 20px 0 0 0; +.qt13a-wrapper { + overflow: hidden } -.col-2 { - display: inline-block; - white-space: normal; - width: 25%; - margin: 0 0 0 50px; +.content-view { + position: relative; + overflow: hidden; } -.sectionlist { - width: 100% !important; +#qt13a-header { + background: url('../images/Qt-header-bg.jpg') repeat; + min-height: 126px; + padding: 0; + margin: 0; + min-width: 1045px; + margin-bottom: 18px; +} + + #qt13a-header .qt13a-nav-divider-left { + border-left: 1px solid #35322f; + padding-left: 10px; + margin-left: 5px; + font-size: 13px; + } + + #qt13a-header #qt13a-title_nav { + padding-top: 34px; + width: 87.37374%; + float: left; + margin-right: 1.0101%; + display: inline; + float: right; + margin-right: 0; + *margin-left: -20px; + display: inline; + } + + #qt13a-header .qt13a-gradient { + background: url('../images/Qt-gradient.png') repeat-x; + background-position: bottom; + margin: 0; + min-height: 126px; + padding: 0; + } + + #qt13a-header p.qt13a-title { + font-size: 24px; + margin: 0 0 0 0px; + letter-spacing: -1px; + color: #35322f; + font-weight: 600; + } + + #qt13a-header p.qt13a-title a { + font-weight: 600; + color: #35322f; + } + + #qt13a-header p.qt13a-title a:hover { + color: #35322f; + text-decoration: none; + } + + #qt13a-header #qt13a-title { + padding: 0px 0 0 0px; + padding-bottom: 0px; + } + + #qt13a-header #qt13a-logo { + float: left; + width: 11.61616%; + float: left; + margin-right: 1.0101%; + display: inline; + margin: 20px 0px 10px 0; + min-width: 50px; + } + + #qt13a-header #qt13a-logo .qt13a-site-logo { + background: url('../images/Qt-logo.png') no-repeat; + text-indent: -100em; + overflow: hidden; + display: block; + height: 90px; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; + } + + #qt13a-header #qt13a-logo img { + float: left; + border: 0; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; + } + + #qt13a-header .qt13a-nav { + background: none + } + + #qt13a-header .qt13a-nav .qt13a-nav-divider-left { + border-left: 1px solid #35322f; + padding-left: 20px; + } + + #qt13a-header .qt13a-nav .qt13a-nav-small a { + font-size: 13px + } + + #qt13a-header .qt13a-nav ul { + margin: 0 0 0 0px; + padding: 11px 0 0; + background: none; + } + + #qt13a-header .qt13a-nav ul li.devnet-active a { + color: #fff + } + + #qt13a-header .qt13a-nav ul li { + display: inline-block; + width: auto; + padding: 0 2.88% 0 0; + margin: 0; + border: 0; + *display: inline; + zoom: 1; + } + + #qt13a-header .qt13a-nav ul li a { + color: #35322f; + margin: 0; + padding: 0; + line-height: 18px; + font-size: 18px; + } + + #qt13a-header .qt13a-nav ul li a:hover, #qt13a-header .qt13a-nav ul li a:active, #qt13a-header .qt13a-nav ul li a.active { + color: #fff; + text-decoration: none; + } + +#qt13a-register_search { + display: block; + font-variant: 400; + float: right; +} + +#qt13a-register { + padding: 34px 0px 0; + float: right; + text-align: right; + color: #1e1b18; +} + + #qt13a-register .qt13a-link-divider { + padding: 0 5px + } + + #qt13a-register a { + color: #1e1b18; + font-weight: 400; + font-size: 13px; + padding-left: 13px; + } + + #qt13a-register a:visited { + color: #1e1b18 + } + + #qt13a-register a:hover { + color: #fff; + text-decoration: none; + } + +#search { + margin-top: 23px +} + +#qt13a-footer { + background: url('../images/Qt-header-bg.jpg') repeat; + margin: 0; +} + + #qt13a-footer .qt13a-container { + padding: 36px 0 + } + + #qt13a-footer .qt13a-gradient { + background: url('../images/Qt-dark_gradient.png') repeat-x; + background-position: bottom; + margin: 0; + min-height: 126px; + padding: 0; + } + + #qt13a-footer .qt13a-shadow { + background: transparent url('../images/Qt-footer_shadow.png') repeat-x top center + } + + #qt13a-footer .qt13a-last { + float: right; + margin-right: 0; + *margin-left: -20px; + display: inline; + } + + #qt13a-footer ul { + width: 17.35537%; + float: left; + margin-right: 3.30579%; + display: inline; + padding-left: 0; + list-style-type: none; + } + + #qt13a-footer ul li a.qt13a-some-icon { + width: 32px; + height: 32px; + background-repeat: none; + text-indent: -300em; + overflow: hidden; + display: -moz-inline-stack; + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + zoom: 1; + *display: inline; + } + + #qt13a-footer ul li a { + font-family: "Open Sans",sans-serif; + font-size: 13px; + color: #35322f; + padding: 0; + font-weight: 400; + } + + #qt13a-footer ul li a:hover, #qt13a-footer ul li a:active { + color: #35322f; + text-decoration: underline; + } + + #qt13a-footer .qt13a-title a, #qt13a-footer .qt13a-title { + padding: 18px 0 18px; + font-weight: 400; + letter-spacing: -0.5pt; + color: #35322f; + font-size: 18px; + margin: 0; + } + +.qt13a-copyright { + border-top: 1px solid #000; + background: url('../images/Qt-footer-bg.jpg') repeat; + margin: 0; + padding: 36px 0; + font-weight: 400; + font-size: 0.84615em; + line-height: 1.63636em; } +.qt13a-copyright p { + padding: 0; + color: #aeadac; + font-size: 11px; + } -/* -Additions from Qt Project -*/ +.qt13a-copyright a { + color: #328930 + } -body{ -background:#E8E8E8; -margin: 0px; -font-family:"Open Sans",sans-serif !important -} - -.qt13a-twoCol{width:23.46939%;float:left;margin-right:2.04082%;display:inline} - -.qt13a-fourCol{width:48.97959%;float:left;margin-right:2.04082%;display:inline} - -.qt13a-sixCol{ - width:70.4898%; - float:left; - margin-right:2.04082%; - display:inline -} -.qt13a-eightCol{ - width:100%; - float:left; - margin-right:2.04082%; - display:inline -} -.qt13a-fiveCol{width:17.35537%;float:left;margin-right:3.30579%;display:inline} -.qt13a-fiveCol:nth-child(2n){float:left;margin-right:3.30579%} -.qt13a-omega{float:right;margin-right:0;*margin-left:-20px;display:inline} -.qt13a-last{float:right;margin-right:0;*margin-left:-20px;display:inline} -.qt13a-container{*zoom:1;padding-left:20px;padding-right:20px;margin-left:auto;margin-right:auto;max-width:1045px} -.qt13a-container:after{content:"";display:table;clear:both} -.qt13a-container.qt13a-dynamic{max-width:1295px} -.qt13a-no-bg-img{background-image:none !important} -.qt13a-wrapper{overflow:hidden} -.content-view{position:relative;overflow:hidden;} - -#qt13a-header{background:url('../images/Qt-header-bg.jpg') repeat;min-height:126px;padding:0;margin:0;min-width:1045px;margin-bottom:18px} -#qt13a-header .qt13a-gradient{background:url('../images/Qt-gradient.png') repeat-x;background-position:bottom;margin:0;min-height:126px;padding:0} -#qt13a-header #qt13a-title_nav{padding-top:34px;width:87.37374%;float:left;margin-right:1.0101%;display:inline;float:right;margin-right:0;*margin-left:-20px;display:inline} -#qt13a-header #qt13a-title{padding:0px 0 0 0px;padding-bottom:0px} -#qt13a-header p.qt13a-title{ - font-size:24px; - margin:0 0 0 0px; - letter-spacing:-1px; - color:#35322f; - font-weight: 600 -} -#qt13a-header p.qt13a-title a{font-weight:600;color:#35322f} -#qt13a-header p.qt13a-title a:hover{color:#35322f;text-decoration:none} -#qt13a-header #qt13a-logo{float:left;width:11.61616%;float:left;margin-right:1.0101%;display:inline;margin:20px 0px 10px 0;min-width:50px} -#qt13a-header #qt13a-logo img{ - float:left; - border: 0; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -#qt13a-header #qt13a-logo .qt13a-site-logo{ - background: url('../images/Qt-logo.png') no-repeat; - text-indent:-100em; - overflow:hidden; - display:block; - height:90px; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -#qt13a-header .qt13a-nav{ - background:none -} - -#qt13a-header .qt13a-nav ul{ - margin:0 0 0 0px; - padding:11px 0 0; - background:none -} -#qt13a-header .qt13a-nav .qt13a-nav-small a{font-size:13px} -#qt13a-header .qt13a-nav ul li{display:inline-block;width:auto;padding:0 2.88% 0 0;margin:0;border:0;*display:inline;zoom:1} -#qt13a-header .qt13a-nav ul li.devnet-active a{color:#fff} - -#qt13a-header .qt13a-nav ul li a{ - color:#35322f; - margin:0; - padding:0; - line-height:18px; - font-size:18px -} -#qt13a-header .qt13a-nav ul li a:hover,#qt13a-header .qt13a-nav ul li a:active,#qt13a-header .qt13a-nav ul li a.active{ - color:#fff; - text-decoration:none -} -#qt13a-header .qt13a-nav .qt13a-nav-divider-left{ - border-left:1px solid #35322f; - padding-left:20px -} -#qt13a-header .qt13a-nav-divider-left{ - border-left:1px solid #35322f; - padding-left:10px; - margin-left:5px; - font-size: 13px -} -#qt13a-register_search{ - display:block; - font-variant:400; - float:right -} -#qt13a-register{ - padding:34px 0px 0; - float:right; - text-align:right; - color:#1e1b18; -} -#qt13a-register a{ - color:#1e1b18; - font-weight:400; - font-size:13px; - padding-left:13px -} -#qt13a-register a:visited{color:#1e1b18} -#qt13a-register a:hover{color:#fff;text-decoration:none} -#qt13a-register .qt13a-link-divider{padding:0 5px} -#search{margin-top:23px} -#qt13a-footer{background: url('../images/Qt-header-bg.jpg') repeat;margin:0} -#qt13a-footer .qt13a-last{float:right;margin-right:0;*margin-left:-20px;display:inline} -#qt13a-footer .qt13a-container{padding:36px 0} -#qt13a-footer .qt13a-gradient{background: url('../images/Qt-dark_gradient.png') repeat-x;background-position:bottom;margin:0;min-height:126px;padding:0} -#qt13a-footer .qt13a-shadow{background:transparent url('../images/Qt-footer_shadow.png') repeat-x top center} -#qt13a-footer .qt13a-title a,#qt13a-footer .qt13a-title{padding:18px 0 18px;font-weight:400;letter-spacing:-0.5pt;color:#35322f;font-size:18px;margin:0} -#qt13a-footer ul{width:17.35537%;float:left;margin-right:3.30579%;display:inline;padding-left:0;list-style-type:none} -#qt13a-footer ul li a{font-family:"Open Sans",sans-serif;font-size:13px;color:#35322f;padding:0;font-weight:400} -#qt13a-footer ul li a:hover,#qt13a-footer ul li a:active{color:#35322f;text-decoration:underline} -#qt13a-footer ul li a.qt13a-some-icon{width:32px;height:32px;background-repeat:none;text-indent:-300em;overflow:hidden;display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline} -.qt13a-copyright{ - border-top:1px solid #000; - background: url('../images/Qt-footer-bg.jpg') repeat; - margin:0; - padding:36px 0; - font-weight:400; - font-size:0.84615em; - line-height:1.63636em} -.qt13a-copyright p{padding:0;color:#aeadac;font-size:11px} -.qt13a-copyright a{color:#328930} -.qt13a-copyright a:visited{color:#328930} - - -.searchbox -{ +.qt13a-copyright a:visited { + color: #328930 + } + +.searchbox { display: block; overflow: hidden; padding: 0px 35px 0 5px; } +.content-view { + position: relative; + overflow: hidden; +} + +p, li, p.forum-overview-title, p.forum-description, p.desc, p.forum-lastpost, div.navigationbars li, div.block-profile div { + font-size: 13px +} + +p.forum-description.desc { + font-size: 13px !important +} -.content-view -{ - position:relative; - overflow:hidden; +.steps li { + font-size: 16px } +div.license p, div.notes p { + font-size: 12px !important +} -p, li, -p.forum-overview-title, -p.forum-description, -p.desc, -p.forum-lastpost, -div.navigationbars li, -div.block-profile div -{ - font-size: 13px; +a { + color: #44a51c; + text-decoration: none; } -p.forum-description.desc -{ - font-size: 13px !important; +.wrap { + padding-left: 30px } -.steps li -{ - font-size: 16px; +a:visited { + color: #007330; + text-align: left; } -div.license p, -div.notes p -{ - font-size: 12px !important; +a:hover { + color: #44a51c; + text-align: left; } -a { -color: #44a51c; -text-decoration: none; +a:visited:hover { + color: #44a51c; + text-align: left; } -.wrap{ -padding-left: 30px + +a:link { + color: #007330; + text-decoration: none; + text-align: left; } .main { - padding: 0px 30px 30px 30px; + padding: 0px 30px 30px 30px } + .main-rounded { display: inline-block; background: none repeat scroll 0% 0% rgb(255,255,255); diff --git a/examples/widgets/doc/src/addressbook-fr.qdoc b/examples/widgets/doc/src/addressbook-fr.qdoc index 9a7bc3a6b7..7d15d99597 100644 --- a/examples/widgets/doc/src/addressbook-fr.qdoc +++ b/examples/widgets/doc/src/addressbook-fr.qdoc @@ -71,8 +71,6 @@ */ /*! - \page tutorials-addressbook-fr-part1.html - \example tutorials/addressbook-fr/part1 \title Carnet d'adresses 1 - Conception de l'interface utilisateur @@ -229,8 +227,6 @@ */ /*! - \page tutorials-addressbook-fr-part2.html - \example tutorials/addressbook-fr/part2 \title Carnet d'adresses 2 - Ajouter des adresses @@ -389,8 +385,6 @@ */ /*! - \page tutorials-addressbook-fr-part3.html - \example tutorials/addressbook-fr/part3 \title Carnet d'adresses 3 - Navigation entre les éléments @@ -509,8 +503,6 @@ /*! - \page tutorials-addressbook-fr-part4.html - \example tutorials/addressbook-fr/part4 \title Carnet d'Adresses 4 - éditer et supprimer des adresses @@ -659,8 +651,6 @@ */ /*! - \page tutorials-addressbook-fr-part5.html - \example tutorials/addressbook-fr/part5 \title Carnet d'adresse 5 - Ajout d'une fonction de recherche @@ -808,8 +798,6 @@ */ /*! - \page tutorials-addressbook-part6.html - \example tutorials/addressbook-fr/part6 \title Carnet d'Adresses 6 - Sauvegarde et chargement @@ -945,8 +933,6 @@ */ /*! - \page tutorials-addressbook-fr-part7.html - \example tutorials/addressbook-fr/part7 \title Carnet d'adresse 7 - Fonctionnalités avancées diff --git a/examples/widgets/doc/src/addressbook-tutorial.qdoc b/examples/widgets/doc/src/addressbook-tutorial.qdoc index 089ab2319d..78517f80d7 100644 --- a/examples/widgets/doc/src/addressbook-tutorial.qdoc +++ b/examples/widgets/doc/src/addressbook-tutorial.qdoc @@ -77,8 +77,6 @@ */ /*! - \page tutorials-addressbook-part1.html - \example tutorials/addressbook/part1 \title Part 1 - Designing the User Interface @@ -231,8 +229,6 @@ */ /*! - \page tutorials-addressbook-part2.html - \example tutorials/addressbook/part2 \title Part 2 - Adding Addresses @@ -382,8 +378,6 @@ */ /*! - \page tutorials-addressbook-part3.html - \example tutorials/addressbook/part3 \title Part 3 - Navigating between Entries @@ -499,8 +493,6 @@ */ /*! - \page tutorials-addressbook-part4.html - \example tutorials/addressbook/part4 \title Part 4 - Editing and Removing Addresses @@ -633,8 +625,6 @@ */ /*! - \page tutorials-addressbook-part5.html - \example tutorials/addressbook/part5 \title Part 5 - Adding a Find Function @@ -777,8 +767,6 @@ */ /*! - \page tutorials-addressbook-part6.html - \example tutorials/addressbook/part6 \title Part 6 - Loading and Saving @@ -899,8 +887,6 @@ */ /*! - \page tutorials-addressbook-part7.html - \example tutorials/addressbook/part7 \title Part 7 - Additional Features diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index 6f1a089670..e714839f26 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -1181,7 +1181,8 @@ public: SystemLocaleShortDate, SystemLocaleLongDate, DefaultLocaleShortDate, - DefaultLocaleLongDate + DefaultLocaleLongDate, + RFC2822Date // RFC 2822 (+ 850 and 1036 during parsing) }; enum TimeSpec { diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index 5cd1812b54..4a5285fa5d 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -585,6 +585,10 @@ \value LocalDate \e{This enum value is deprecated.} Use Qt::SystemLocaleShortDate instead (or Qt::SystemLocaleLongDate if you want long dates). + \value RFC2822Date \l{RFC 2822}, \l{RFC 850} and \l{RFC 1036} format: either + \c{[ddd,] dd MMM yyyy hh:mm[:ss] +/-TZ} or \c{ddd MMM dd yyyy hh:mm[:ss] +/-TZ} + for combined dates and times. + \note For \c ISODate formats, each \c Y, \c M and \c D represents a single digit of the year, month and day used to specify the date. Each \c H, \c M and \c S represents a single digit of the hour, minute and second used to specify the time. diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp index e9957d2384..bc0ae5a382 100644 --- a/src/corelib/io/qprocess_unix.cpp +++ b/src/corelib/io/qprocess_unix.cpp @@ -1031,6 +1031,41 @@ static int qt_timeout_value(int msecs, int elapsed) return timeout < 0 ? 0 : timeout; } +#ifdef Q_OS_BLACKBERRY +// The BlackBerry event dispatcher uses bps_get_event. Unfortunately, already registered +// socket notifiers are disabled by a call to select. This is to rearm the standard streams. +static int bb_select(QProcessPrivate *process, int nfds, fd_set *fdread, fd_set *fdwrite, int timeout) +{ + bool stdoutEnabled = false; + bool stderrEnabled = false; + bool stdinEnabled = false; + + if (process->stdoutChannel.notifier && process->stdoutChannel.notifier->isEnabled()) { + stdoutEnabled = true; + process->stdoutChannel.notifier->setEnabled(false); + } + if (process->stderrChannel.notifier && process->stderrChannel.notifier->isEnabled()) { + stderrEnabled = true; + process->stderrChannel.notifier->setEnabled(false); + } + if (process->stdinChannel.notifier && process->stdinChannel.notifier->isEnabled()) { + stdinEnabled = true; + process->stdinChannel.notifier->setEnabled(false); + } + + const int ret = select_msecs(nfds, fdread, fdwrite, timeout); + + if (stdoutEnabled) + process->stdoutChannel.notifier->setEnabled(true); + if (stderrEnabled) + process->stderrChannel.notifier->setEnabled(true); + if (stdinEnabled) + process->stdinChannel.notifier->setEnabled(true); + + return ret; +} +#endif // Q_OS_BLACKBERRY + bool QProcessPrivate::waitForStarted(int msecs) { Q_Q(QProcess); @@ -1091,7 +1126,11 @@ bool QProcessPrivate::waitForReadyRead(int msecs) add_fd(nfds, stdinChannel.pipe[1], &fdwrite); int timeout = qt_timeout_value(msecs, stopWatch.elapsed()); +#ifdef Q_OS_BLACKBERRY + int ret = bb_select(this, nfds + 1, &fdread, &fdwrite, timeout); +#else int ret = select_msecs(nfds + 1, &fdread, &fdwrite, timeout); +#endif if (ret < 0) { break; } @@ -1163,8 +1202,12 @@ bool QProcessPrivate::waitForBytesWritten(int msecs) if (!writeBuffer.isEmpty() && stdinChannel.pipe[1] != -1) add_fd(nfds, stdinChannel.pipe[1], &fdwrite); - int timeout = qt_timeout_value(msecs, stopWatch.elapsed()); - int ret = select_msecs(nfds + 1, &fdread, &fdwrite, timeout); + int timeout = qt_timeout_value(msecs, stopWatch.elapsed()); +#ifdef Q_OS_BLACKBERRY + int ret = bb_select(this, nfds + 1, &fdread, &fdwrite, timeout); +#else + int ret = select_msecs(nfds + 1, &fdread, &fdwrite, timeout); +#endif if (ret < 0) { break; } @@ -1230,8 +1273,12 @@ bool QProcessPrivate::waitForFinished(int msecs) if (!writeBuffer.isEmpty() && stdinChannel.pipe[1] != -1) add_fd(nfds, stdinChannel.pipe[1], &fdwrite); - int timeout = qt_timeout_value(msecs, stopWatch.elapsed()); - int ret = select_msecs(nfds + 1, &fdread, &fdwrite, timeout); + int timeout = qt_timeout_value(msecs, stopWatch.elapsed()); +#ifdef Q_OS_BLACKBERRY + int ret = bb_select(this, nfds + 1, &fdread, &fdwrite, timeout); +#else + int ret = select_msecs(nfds + 1, &fdread, &fdwrite, timeout); +#endif if (ret < 0) { break; } diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index 0b4761d5b4..7b99aa1e06 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -158,9 +158,19 @@ static const char monthDays[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, static const char * const qt_shortMonthNames[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + +int qt_monthNumberFromShortName(const QString &shortName) +{ + for (unsigned int i = 0; i < sizeof(qt_shortMonthNames) / sizeof(qt_shortMonthNames[0]); ++i) { + if (shortName == QLatin1String(qt_shortMonthNames[i])) + return i + 1; + } + return -1; +} #endif #ifndef QT_NO_DATESTRING static QString fmtDateTime(const QString& f, const QTime* dt = 0, const QDate* dd = 0); +static void rfcDateImpl(const QString &s, QDate *dd = 0, QTime *dt = 0, int *utfcOffset = 0); #endif /***************************************************************************** @@ -735,6 +745,10 @@ QString QDate::longDayName(int weekday, MonthNameType type) QLocale::ShortFormat) or QLocale().toString(date, QLocale::LongFormat). + If the \a format is Qt::RFC2822Date, the string is formatted in + an \l{RFC 2822} compatible way. An example of this formatting is + "20 May 1995". + If the date is invalid, an empty string will be returned. \warning The Qt::ISODate format is only valid for years in the @@ -771,6 +785,8 @@ QString QDate::toString(Qt::DateFormat f) const .arg(y); } #endif + case Qt::RFC2822Date: + return toString(QStringLiteral("dd MMM yyyy")); case Qt::ISODate: { if (year() < 0 || year() > 9999) @@ -1124,6 +1140,11 @@ QDate QDate::fromString(const QString& s, Qt::DateFormat f) case Qt::DefaultLocaleLongDate: return fromString(s, QLocale().dateFormat(f == Qt::DefaultLocaleLongDate ? QLocale::LongFormat : QLocale::ShortFormat)); + case Qt::RFC2822Date: { + QDate date; + rfcDateImpl(s, &date); + return date; + } default: #ifndef QT_NO_TEXTDATE case Qt::TextDate: { @@ -1498,6 +1519,10 @@ int QTime::msec() const QLocale::ShortFormat) or QLocale().toString(time, QLocale::LongFormat). + If the \a format is Qt::RFC2822Date, the string is formatted in + an \l{RFC 2822} compatible way. An example of this formatting is + "23:59:20". + If the time is invalid, an empty string will be returned. */ @@ -1518,6 +1543,11 @@ QString QTime::toString(Qt::DateFormat format) const return QLocale().toString(*this, format == Qt::DefaultLocaleLongDate ? QLocale::LongFormat : QLocale::ShortFormat); + case Qt::RFC2822Date: + return QString::fromLatin1("%1:%2:%3") + .arg(hour(), 2, 10, QLatin1Char('0')) + .arg(minute(), 2, 10, QLatin1Char('0')) + .arg(second(), 2, 10, QLatin1Char('0')); default: case Qt::ISODate: case Qt::TextDate: @@ -1790,6 +1820,11 @@ QTime fromStringImpl(const QString &s, Qt::DateFormat f, bool &isMidnight24) QLocale::FormatType formatType(f == Qt::DefaultLocaleLongDate ? QLocale::LongFormat : QLocale::ShortFormat); return QTime::fromString(s, QLocale().timeFormat(formatType)); } + case Qt::RFC2822Date: { + QTime time; + rfcDateImpl(s, 0, &time); + return time; + } case Qt::TextDate: case Qt::ISODate: { @@ -2490,6 +2525,9 @@ void QDateTime::setTime_t(uint secsSince1Jan1970UTC) QLocale::ShortFormat) or QLocale().toString(datetime, QLocale::LongFormat). + If the \a format is Qt::RFC2822Date, the string is formatted + following \l{RFC 2822}. + If the datetime is invalid, an empty string will be returned. \warning The Qt::ISODate format is only valid for years in the @@ -2526,6 +2564,28 @@ QString QDateTime::toString(Qt::DateFormat f) const default: break; } + } else if (f == Qt::RFC2822Date) { + buf = toString(QStringLiteral("dd MMM yyyy hh:mm:ss ")); + + int utcOffset = d->utcOffset; + if (timeSpec() == Qt::LocalTime) { + QDateTime utc = toUTC(); + utc.setTimeSpec(timeSpec()); + utcOffset = utc.secsTo(*this); + } + + const int offset = qAbs(utcOffset); + buf += QLatin1Char((offset == utcOffset) ? '+' : '-'); + + const int hour = offset / 3600; + if (hour < 10) + buf += QLatin1Char('0'); + buf += QString::number(hour); + + const int min = (offset - (hour * 3600)) / 60; + if (min < 10) + buf += QLatin1Char('0'); + buf += QString::number(min); } #ifndef QT_NO_TEXTDATE else if (f == Qt::TextDate) { @@ -3333,6 +3393,19 @@ QDateTime QDateTime::fromString(const QString& s, Qt::DateFormat f) return QDateTime(date, time, ts); } + case Qt::RFC2822Date: { + QDate date; + QTime time; + int utcOffset = 0; + rfcDateImpl(s, &date, &time, &utcOffset); + + if (!date.isValid() || !time.isValid()) + return QDateTime(); + + QDateTime dateTime(date, time, Qt::UTC); + dateTime.setUtcOffset(utcOffset); + return dateTime; + } case Qt::SystemLocaleDate: case Qt::SystemLocaleShortDate: case Qt::SystemLocaleLongDate: @@ -3953,6 +4026,68 @@ static QString fmtDateTime(const QString& f, const QTime* dt, const QDate* dd) return buf; } + +static void rfcDateImpl(const QString &s, QDate *dd, QTime *dt, int *utcOffset) +{ + int day = -1; + int month = -1; + int year = -1; + int hour = -1; + int min = -1; + int sec = -1; + int hourOffset = 0; + int minOffset = 0; + bool positiveOffset = false; + + // Matches "Wdy, DD Mon YYYY HH:MM:SS ±hhmm" (Wdy, being optional) + QRegExp rex(QStringLiteral("^(?:[A-Z][a-z]+,)?[ \\t]*(\\d{1,2})[ \\t]+([A-Z][a-z]+)[ \\t]+(\\d\\d\\d\\d)(?:[ \\t]+(\\d\\d):(\\d\\d)(?::(\\d\\d))?)?[ \\t]*(?:([+-])(\\d\\d)(\\d\\d))?")); + if (s.indexOf(rex) == 0) { + if (dd) { + day = rex.cap(1).toInt(); + month = qt_monthNumberFromShortName(rex.cap(2)); + year = rex.cap(3).toInt(); + } + if (dt) { + if (!rex.cap(4).isEmpty()) { + hour = rex.cap(4).toInt(); + min = rex.cap(5).toInt(); + sec = rex.cap(6).toInt(); + } + positiveOffset = (rex.cap(7) == QStringLiteral("+")); + hourOffset = rex.cap(8).toInt(); + minOffset = rex.cap(9).toInt(); + } + if (utcOffset) + *utcOffset = ((hourOffset * 60 + minOffset) * (positiveOffset ? 60 : -60)); + } else { + // Matches "Wdy Mon DD HH:MM:SS YYYY" + QRegExp rex(QStringLiteral("^[A-Z][a-z]+[ \\t]+([A-Z][a-z]+)[ \\t]+(\\d\\d)(?:[ \\t]+(\\d\\d):(\\d\\d):(\\d\\d))?[ \\t]+(\\d\\d\\d\\d)[ \\t]*(?:([+-])(\\d\\d)(\\d\\d))?")); + if (s.indexOf(rex) == 0) { + if (dd) { + month = qt_monthNumberFromShortName(rex.cap(1)); + day = rex.cap(2).toInt(); + year = rex.cap(6).toInt(); + } + if (dt) { + if (!rex.cap(3).isEmpty()) { + hour = rex.cap(3).toInt(); + min = rex.cap(4).toInt(); + sec = rex.cap(5).toInt(); + } + positiveOffset = (rex.cap(7) == QStringLiteral("+")); + hourOffset = rex.cap(8).toInt(); + minOffset = rex.cap(9).toInt(); + } + if (utcOffset) + *utcOffset = ((hourOffset * 60 + minOffset) * (positiveOffset ? 60 : -60)); + } + } + + if (dd) + *dd = QDate(year, month, day); + if (dt) + *dt = QTime(hour, min, sec); +} #endif // QT_NO_DATESTRING #ifdef Q_OS_WIN diff --git a/src/gui/image/qbmphandler.cpp b/src/gui/image/qbmphandler.cpp index cb4e45f1d0..c03d9b8e5d 100644 --- a/src/gui/image/qbmphandler.cpp +++ b/src/gui/image/qbmphandler.cpp @@ -781,6 +781,8 @@ bool QBmpHandler::write(const QImage &img) case QImage::Format_ARGB8555_Premultiplied: case QImage::Format_ARGB6666_Premultiplied: case QImage::Format_ARGB4444_Premultiplied: + case QImage::Format_RGBA8888: + case QImage::Format_RGBA8888_Premultiplied: image = img.convertToFormat(QImage::Format_ARGB32); break; case QImage::Format_RGB16: @@ -788,6 +790,7 @@ bool QBmpHandler::write(const QImage &img) case QImage::Format_RGB666: case QImage::Format_RGB555: case QImage::Format_RGB444: + case QImage::Format_RGBX8888: image = img.convertToFormat(QImage::Format_RGB32); break; default: diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index 98f3aeeeb9..8e5f6391a7 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -212,6 +212,16 @@ bool QImageData::checkForAlphaPixels() const } } break; + case QImage::Format_RGBA8888: + case QImage::Format_RGBA8888_Premultiplied: { + uchar *bits = data; + for (int y=0; y<height && !has_alpha_pixels; ++y) { + for (int x=0; x<width; ++x) + has_alpha_pixels |= bits[x*4+3] != 0xff; + bits += bytes_per_line; + } + } break; + case QImage::Format_ARGB8555_Premultiplied: case QImage::Format_ARGB8565_Premultiplied: { uchar *bits = data; @@ -621,9 +631,9 @@ bool QImageData::checkForAlphaPixels() const /*! \enum QImage::Format - The following image formats are available in Qt. Values greater - than QImage::Format_RGB16 were added in Qt 4.4. See the notes - after the table. + The following image formats are available in Qt. Values from Format_ARGB8565_Premultiplied + to Format_ARGB4444_Premultiplied were added in Qt 4.4. Values Format_RGBX8888, Format_RGBA8888 + and Format_RGBA8888_Premultiplied were added in Qt 5.2. See the notes after the table. \value Format_Invalid The image is invalid. \value Format_Mono The image is stored using 1-bit per pixel. Bytes are @@ -665,6 +675,15 @@ bool QImageData::checkForAlphaPixels() const The unused bits are always zero. \value Format_ARGB4444_Premultiplied The image is stored using a premultiplied 16-bit ARGB format (4-4-4-4). + \value Format_RGBX8888 The image is stored using a 32-bit byte-ordered RGB(x) format (8-8-8-8). + This is the same as the Format_RGBA8888 except alpha must always be 255. + \value Format_RGBA8888 The image is stored using a 32-bit byte-ordered RGBA format (8-8-8-8). + Unlike ARGB32 this is a byte-ordered format, which means the 32bit + encoding differs between big endian and little endian architectures, + being respectively (0xRRGGBBAA) and (0xAABBGGRR). The order of the colors + is the same on any architecture if read as bytes 0xRR,0xGG,0xBB,0xAA. + \value Format_RGBA8888_Premultiplied The image is stored using a + premultiplied 32-bit byte-ordered RGBA format (8-8-8-8). \note Drawing into a QImage with QImage::Format_Indexed8 is not supported. @@ -1663,9 +1682,12 @@ void QImage::fill(uint pixel) return; } - if (d->format == Format_RGB32) + if (d->format == Format_RGB32 || d->format == Format_RGBX8888) pixel |= 0xff000000; + if (d->format == Format_RGBX8888 || d->format == Format_RGBA8888 || d->format == Format_RGBA8888_Premultiplied) + pixel = ARGB2RGBA(pixel); + qt_rectfill<uint>(reinterpret_cast<uint*>(d->data), pixel, 0, 0, d->width, d->height, d->bytes_per_line); } @@ -1716,7 +1738,7 @@ void QImage::fill(const QColor &color) if (d->depth == 32) { uint pixel = color.rgba(); - if (d->format == QImage::Format_ARGB32_Premultiplied) + if (d->format == QImage::Format_ARGB32_Premultiplied || d->format == QImage::Format_RGBA8888_Premultiplied) pixel = PREMUL(pixel); fill((uint) pixel); @@ -1871,8 +1893,8 @@ typedef bool (*InPlace_Image_Converter)(QImageData *data, Qt::ImageConversionFla static void convert_ARGB_to_ARGB_PM(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) { - Q_ASSERT(src->format == QImage::Format_ARGB32); - Q_ASSERT(dest->format == QImage::Format_ARGB32_Premultiplied); + Q_ASSERT(src->format == QImage::Format_ARGB32 || src->format == QImage::Format_RGBA8888); + Q_ASSERT(dest->format == QImage::Format_ARGB32_Premultiplied || dest->format == QImage::Format_RGBA8888_Premultiplied); Q_ASSERT(src->width == dest->width); Q_ASSERT(src->height == dest->height); @@ -1912,6 +1934,191 @@ static bool convert_ARGB_to_ARGB_PM_inplace(QImageData *data, Qt::ImageConversio return true; } +static void convert_ARGB_to_RGBx(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) +{ + Q_ASSERT(src->format == QImage::Format_ARGB32); + Q_ASSERT(dest->format == QImage::Format_RGBX8888); + Q_ASSERT(src->width == dest->width); + Q_ASSERT(src->height == dest->height); + + const int src_pad = (src->bytes_per_line >> 2) - src->width; + const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; + const quint32 *src_data = (quint32 *) src->data; + quint32 *dest_data = (quint32 *) dest->data; + + for (int i = 0; i < src->height; ++i) { + const quint32 *end = src_data + src->width; + while (src_data < end) { + *dest_data = ARGB2RGBA(0xff000000 | *src_data); + ++src_data; + ++dest_data; + } + src_data += src_pad; + dest_data += dest_pad; + } +} + +static void convert_ARGB_to_RGBA(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) +{ + Q_ASSERT(src->format == QImage::Format_ARGB32 || src->format == QImage::Format_ARGB32_Premultiplied); + Q_ASSERT(dest->format == QImage::Format_RGBA8888 || dest->format == QImage::Format_RGBA8888_Premultiplied); + Q_ASSERT(src->width == dest->width); + Q_ASSERT(src->height == dest->height); + + const int src_pad = (src->bytes_per_line >> 2) - src->width; + const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; + const quint32 *src_data = (quint32 *) src->data; + quint32 *dest_data = (quint32 *) dest->data; + + for (int i = 0; i < src->height; ++i) { + const quint32 *end = src_data + src->width; + while (src_data < end) { + *dest_data = ARGB2RGBA(*src_data); + ++src_data; + ++dest_data; + } + src_data += src_pad; + dest_data += dest_pad; + } +} + +static bool convert_ARGB_to_RGBA_inplace(QImageData *data, Qt::ImageConversionFlags) +{ + Q_ASSERT(data->format == QImage::Format_ARGB32 || data->format == QImage::Format_ARGB32_Premultiplied); + + const int pad = (data->bytes_per_line >> 2) - data->width; + quint32 *rgb_data = (quint32 *) data->data; + + for (int i = 0; i < data->height; ++i) { + const quint32 *end = rgb_data + data->width; + while (rgb_data < end) { + *rgb_data = ARGB2RGBA(*rgb_data); + ++rgb_data; + } + rgb_data += pad; + } + if (data->format == QImage::Format_ARGB32) + data->format = QImage::Format_RGBA8888; + else + data->format = QImage::Format_RGBA8888_Premultiplied; + return true; +} + +static void convert_ARGB_to_RGBA_PM(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) +{ + Q_ASSERT(src->format == QImage::Format_ARGB32); + Q_ASSERT(dest->format == QImage::Format_RGBA8888_Premultiplied); + Q_ASSERT(src->width == dest->width); + Q_ASSERT(src->height == dest->height); + + const int src_pad = (src->bytes_per_line >> 2) - src->width; + const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; + const quint32 *src_data = (quint32 *) src->data; + quint32 *dest_data = (quint32 *) dest->data; + + for (int i = 0; i < src->height; ++i) { + const quint32 *end = src_data + src->width; + while (src_data < end) { + *dest_data = ARGB2RGBA(PREMUL(*src_data)); + ++src_data; + ++dest_data; + } + src_data += src_pad; + dest_data += dest_pad; + } +} + +static void convert_RGBA_to_ARGB(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) +{ + Q_ASSERT(src->format == QImage::Format_RGBX8888 || src->format == QImage::Format_RGBA8888 || src->format == QImage::Format_RGBA8888_Premultiplied); + Q_ASSERT(dest->format == QImage::Format_ARGB32 || dest->format == QImage::Format_ARGB32_Premultiplied); + Q_ASSERT(src->width == dest->width); + Q_ASSERT(src->height == dest->height); + + const int src_pad = (src->bytes_per_line >> 2) - src->width; + const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; + const quint32 *src_data = (quint32 *) src->data; + quint32 *dest_data = (quint32 *) dest->data; + + for (int i = 0; i < src->height; ++i) { + const quint32 *end = src_data + src->width; + while (src_data < end) { + *dest_data = RGBA2ARGB(*src_data); + ++src_data; + ++dest_data; + } + src_data += src_pad; + dest_data += dest_pad; + } +} + +static bool convert_RGBA_to_ARGB_inplace(QImageData *data, Qt::ImageConversionFlags) +{ + Q_ASSERT(data->format == QImage::Format_RGBX8888 || data->format == QImage::Format_RGBA8888 || data->format == QImage::Format_RGBA8888_Premultiplied); + + const int pad = (data->bytes_per_line >> 2) - data->width; + QRgb *rgb_data = (QRgb *) data->data; + + for (int i = 0; i < data->height; ++i) { + const QRgb *end = rgb_data + data->width; + while (rgb_data < end) { + *rgb_data = RGBA2ARGB(*rgb_data); + ++rgb_data; + } + rgb_data += pad; + } + if (data->format == QImage::Format_RGBA8888_Premultiplied) + data->format = QImage::Format_ARGB32_Premultiplied; + else if (data->format == QImage::Format_RGBX8888) + data->format = QImage::Format_RGB32; + else + data->format = QImage::Format_ARGB32; + return true; +} + +static void convert_RGBA_to_ARGB_PM(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) +{ + Q_ASSERT(src->format == QImage::Format_RGBA8888); + Q_ASSERT(dest->format == QImage::Format_ARGB32_Premultiplied); + Q_ASSERT(src->width == dest->width); + Q_ASSERT(src->height == dest->height); + + const int src_pad = (src->bytes_per_line >> 2) - src->width; + const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; + const quint32 *src_data = (quint32 *) src->data; + quint32 *dest_data = (quint32 *) dest->data; + + for (int i = 0; i < src->height; ++i) { + const quint32 *end = src_data + src->width; + while (src_data < end) { + *dest_data = PREMUL(RGBA2ARGB(*src_data)); + ++src_data; + ++dest_data; + } + src_data += src_pad; + dest_data += dest_pad; + } +} + +static bool convert_RGBA_to_ARGB_PM_inplace(QImageData *data, Qt::ImageConversionFlags) +{ + Q_ASSERT(data->format == QImage::Format_RGBA8888); + + const int pad = (data->bytes_per_line >> 2) - data->width; + QRgb *rgb_data = (QRgb *) data->data; + + for (int i = 0; i < data->height; ++i) { + const QRgb *end = rgb_data + data->width; + while (rgb_data < end) { + *rgb_data = PREMUL(RGBA2ARGB(*rgb_data)); + ++rgb_data; + } + rgb_data += pad; + } + data->format = QImage::Format_ARGB32_Premultiplied; + return true; +} + static bool convert_indexed8_to_ARGB_PM_inplace(QImageData *data, Qt::ImageConversionFlags) { Q_ASSERT(data->format == QImage::Format_Indexed8); @@ -2099,8 +2306,8 @@ static bool convert_RGB_to_RGB16_inplace(QImageData *data, Qt::ImageConversionFl static void convert_ARGB_PM_to_ARGB(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) { - Q_ASSERT(src->format == QImage::Format_ARGB32_Premultiplied); - Q_ASSERT(dest->format == QImage::Format_ARGB32); + Q_ASSERT(src->format == QImage::Format_ARGB32_Premultiplied || src->format == QImage::Format_RGBA8888_Premultiplied); + Q_ASSERT(dest->format == QImage::Format_ARGB32 || src->format == QImage::Format_RGBA8888); Q_ASSERT(src->width == dest->width); Q_ASSERT(src->height == dest->height); @@ -2123,20 +2330,164 @@ static void convert_ARGB_PM_to_ARGB(QImageData *dest, const QImageData *src, Qt: static void convert_ARGB_PM_to_RGB(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) { + Q_ASSERT(src->format == QImage::Format_ARGB32_Premultiplied || src->format == QImage::Format_RGBA8888_Premultiplied); + Q_ASSERT(dest->format == QImage::Format_RGB32 || dest->format == QImage::Format_RGBX8888); + Q_ASSERT(src->width == dest->width); + Q_ASSERT(src->height == dest->height); + + const int src_pad = (src->bytes_per_line >> 2) - src->width; + const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; + const QRgb *src_data = (QRgb *) src->data; + QRgb *dest_data = (QRgb *) dest->data; + + for (int i = 0; i < src->height; ++i) { + const QRgb *end = src_data + src->width; + while (src_data < end) { + *dest_data = 0xff000000 | INV_PREMUL(*src_data); + ++src_data; + ++dest_data; + } + src_data += src_pad; + dest_data += dest_pad; + } +} + +static void convert_ARGB_PM_to_RGBx(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) +{ Q_ASSERT(src->format == QImage::Format_ARGB32_Premultiplied); + Q_ASSERT(dest->format == QImage::Format_RGBX8888); + Q_ASSERT(src->width == dest->width); + Q_ASSERT(src->height == dest->height); + + const int src_pad = (src->bytes_per_line >> 2) - src->width; + const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; + const QRgb *src_data = (QRgb *) src->data; + QRgb *dest_data = (QRgb *) dest->data; + + for (int i = 0; i < src->height; ++i) { + const QRgb *end = src_data + src->width; + while (src_data < end) { + *dest_data = ARGB2RGBA(0xff000000 | INV_PREMUL(*src_data)); + ++src_data; + ++dest_data; + } + src_data += src_pad; + dest_data += dest_pad; + } +} + +static void convert_ARGB_PM_to_RGBA(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) +{ + Q_ASSERT(src->format == QImage::Format_ARGB32_Premultiplied); + Q_ASSERT(dest->format == QImage::Format_RGBA8888); + Q_ASSERT(src->width == dest->width); + Q_ASSERT(src->height == dest->height); + + const int src_pad = (src->bytes_per_line >> 2) - src->width; + const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; + const QRgb *src_data = (QRgb *) src->data; + QRgb *dest_data = (QRgb *) dest->data; + + for (int i = 0; i < src->height; ++i) { + const QRgb *end = src_data + src->width; + while (src_data < end) { + *dest_data = ARGB2RGBA(INV_PREMUL(*src_data)); + ++src_data; + ++dest_data; + } + src_data += src_pad; + dest_data += dest_pad; + } +} + +static void convert_RGBA_to_RGB(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) +{ + Q_ASSERT(src->format == QImage::Format_RGBA8888 || src->format == QImage::Format_RGBX8888); Q_ASSERT(dest->format == QImage::Format_RGB32); Q_ASSERT(src->width == dest->width); Q_ASSERT(src->height == dest->height); const int src_pad = (src->bytes_per_line >> 2) - src->width; const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; + const uint *src_data = (const uint *)src->data; + uint *dest_data = (uint *)dest->data; + + for (int i = 0; i < src->height; ++i) { + const uint *end = src_data + src->width; + while (src_data < end) { + *dest_data = RGBA2ARGB(*src_data) | 0xff000000; + ++src_data; + ++dest_data; + } + src_data += src_pad; + dest_data += dest_pad; + } +} + +static void convert_RGB_to_RGBA(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) +{ + Q_ASSERT(src->format == QImage::Format_RGB32); + Q_ASSERT(dest->format == QImage::Format_RGBX8888 || dest->format == QImage::Format_RGBA8888 || dest->format == QImage::Format_RGBA8888_Premultiplied); + Q_ASSERT(src->width == dest->width); + Q_ASSERT(src->height == dest->height); + + const int src_pad = (src->bytes_per_line >> 2) - src->width; + const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; + const uint *src_data = (const uint *)src->data; + uint *dest_data = (uint *)dest->data; + + for (int i = 0; i < src->height; ++i) { + const uint *end = src_data + src->width; + while (src_data < end) { + *dest_data = ARGB2RGBA(*src_data | 0xff000000); + ++src_data; + ++dest_data; + } + src_data += src_pad; + dest_data += dest_pad; + } +} + +static void convert_RGBA_PM_to_ARGB(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) +{ + Q_ASSERT(src->format == QImage::Format_RGBA8888_Premultiplied); + Q_ASSERT(dest->format == QImage::Format_ARGB32); + Q_ASSERT(src->width == dest->width); + Q_ASSERT(src->height == dest->height); + + const int src_pad = (src->bytes_per_line >> 2) - src->width; + const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; const QRgb *src_data = (QRgb *) src->data; QRgb *dest_data = (QRgb *) dest->data; for (int i = 0; i < src->height; ++i) { const QRgb *end = src_data + src->width; while (src_data < end) { - *dest_data = 0xff000000 | INV_PREMUL(*src_data); + *dest_data = INV_PREMUL(RGBA2ARGB(*src_data)); + ++src_data; + ++dest_data; + } + src_data += src_pad; + dest_data += dest_pad; + } +} + +static void convert_RGBA_PM_to_RGB(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) +{ + Q_ASSERT(src->format == QImage::Format_RGBA8888_Premultiplied); + Q_ASSERT(dest->format == QImage::Format_RGB32); + Q_ASSERT(src->width == dest->width); + Q_ASSERT(src->height == dest->height); + + const int src_pad = (src->bytes_per_line >> 2) - src->width; + const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; + const QRgb *src_data = (QRgb *) src->data; + QRgb *dest_data = (QRgb *) dest->data; + + for (int i = 0; i < src->height; ++i) { + const QRgb *end = src_data + src->width; + while (src_data < end) { + *dest_data = 0xff000000 | INV_PREMUL(RGBA2ARGB(*src_data)); ++src_data; ++dest_data; } @@ -2188,6 +2539,33 @@ static void mask_alpha_converter(QImageData *dest, const QImageData *src, Qt::Im } } +static void mask_alpha_converter_RGBx(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags flags) +{ +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + return mask_alpha_converter(dest, src, flags); +#else + Q_UNUSED(flags); + Q_ASSERT(src->width == dest->width); + Q_ASSERT(src->height == dest->height); + + const int src_pad = (src->bytes_per_line >> 2) - src->width; + const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; + const uint *src_data = (const uint *)src->data; + uint *dest_data = (uint *)dest->data; + + for (int i = 0; i < src->height; ++i) { + const uint *end = src_data + src->width; + while (src_data < end) { + *dest_data = *src_data | 0x000000ff; + ++src_data; + ++dest_data; + } + src_data += src_pad; + dest_data += dest_pad; + } +#endif +} + static QVector<QRgb> fix_color_table(const QVector<QRgb> &ctbl, QImage::Format format) { QVector<QRgb> colorTable = ctbl; @@ -2941,6 +3319,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, + 0, + 0, + 0, 0 }, // Format_Mono @@ -2960,6 +3341,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, + 0, + 0, + 0, 0 }, // Format_MonoLSB @@ -2979,6 +3363,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, + 0, + 0, + 0, 0 }, // Format_Indexed8 @@ -2998,7 +3385,10 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat convert_generic, convert_generic, convert_generic, - convert_generic + convert_generic, + convert_RGB_to_RGBA, + convert_RGB_to_RGBA, + convert_RGB_to_RGBA }, // Format_RGB32 { @@ -3017,7 +3407,10 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat convert_generic, convert_generic, convert_generic, - convert_generic + convert_generic, + convert_ARGB_to_RGBx, + convert_ARGB_to_RGBA, + convert_ARGB_to_RGBA_PM, }, // Format_ARGB32 { @@ -3036,7 +3429,10 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, - 0 + 0, + convert_ARGB_PM_to_RGBx, + convert_ARGB_PM_to_RGBA, + convert_ARGB_to_RGBA, }, // Format_ARGB32_Premultiplied { @@ -3059,6 +3455,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, + 0, + 0, + 0, 0 }, // Format_RGB16 @@ -3078,6 +3477,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, + 0, + 0, + 0, 0 }, // Format_ARGB8565_Premultiplied @@ -3097,6 +3499,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, + 0, + 0, + 0, 0 }, // Format_RGB666 @@ -3116,6 +3521,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, + 0, + 0, + 0, 0 }, // Format_ARGB6666_Premultiplied @@ -3139,6 +3547,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, + 0, + 0, + 0, 0 }, // Format_RGB555 @@ -3158,6 +3569,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, + 0, + 0, + 0, 0 }, // Format_ARGB8555_Premultiplied @@ -3177,6 +3591,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, + 0, + 0, + 0, 0 }, // Format_RGB888 @@ -3196,6 +3613,9 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, + 0, + 0, + 0, 0 }, // Format_RGB444 @@ -3215,20 +3635,97 @@ static Image_Converter converter_map[QImage::NImageFormats][QImage::NImageFormat 0, 0, 0, + 0, + 0, 0 - } // Format_ARGB4444_Premultiplied + }, // Format_ARGB4444_Premultiplied + { + 0, + 0, + 0, + 0, + convert_RGBA_to_RGB, + convert_RGBA_to_ARGB, + convert_RGBA_to_ARGB_PM, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + mask_alpha_converter_RGBx, + mask_alpha_converter_RGBx, + }, // Format_RGBX8888 + { + 0, + 0, + 0, + 0, + convert_RGBA_to_RGB, + convert_RGBA_to_ARGB, + convert_RGBA_to_ARGB_PM, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + mask_alpha_converter_RGBx, +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + 0, + convert_ARGB_to_ARGB_PM, +#else + 0, + 0 +#endif + }, // Format_RGBA8888 + + { + 0, + 0, + 0, + 0, + convert_RGBA_PM_to_RGB, + convert_RGBA_PM_to_ARGB, + convert_RGBA_to_ARGB, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + convert_ARGB_PM_to_RGB, + convert_ARGB_PM_to_ARGB, + 0, +#else + 0, + 0, + 0 +#endif + } // Format_RGBA8888_Premultiplied }; static InPlace_Image_Converter inplace_converter_map[QImage::NImageFormats][QImage::NImageFormats] = { { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Format_Mono { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Format_MonoLSB { 0, @@ -3247,6 +3744,9 @@ static InPlace_Image_Converter inplace_converter_map[QImage::NImageFormats][QIma 0, 0, 0, + 0, + 0, + 0, }, // Format_Indexed8 { 0, @@ -3265,7 +3765,10 @@ static InPlace_Image_Converter inplace_converter_map[QImage::NImageFormats][QIma 0, 0, 0, - }, // Format_ARGB32 + 0, + 0, + 0, + }, // Format_RGB32 { 0, 0, @@ -3283,37 +3786,118 @@ static InPlace_Image_Converter inplace_converter_map[QImage::NImageFormats][QIma 0, 0, 0, + 0, + convert_ARGB_to_RGBA_inplace, + 0, }, // Format_ARGB32 { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + convert_ARGB_to_RGBA_inplace }, // Format_ARGB32_Premultiplied { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Format_RGB16 { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Format_ARGB8565_Premultiplied { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Format_RGB666 { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Format_ARGB6666_Premultiplied { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Format_RGB555 { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Format_ARGB8555_Premultiplied { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Format_RGB888 { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Format_RGB444 { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - } // Format_ARGB4444_Premultiplied + 0, + 0, + 0, + 0, + 0, + convert_RGBA_to_ARGB_inplace, + convert_RGBA_to_ARGB_inplace, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + }, // Format_RGBX8888 + { + 0, + 0, + 0, + 0, + 0, + 0, + convert_RGBA_to_ARGB_inplace, + convert_RGBA_to_ARGB_PM_inplace, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + }, // Format_RGBA8888 + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + convert_RGBA_to_ARGB_inplace, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + } // Format_RGBA8888_Premultiplied }; void qInitImageConversions() @@ -3633,6 +4217,10 @@ QRgb QImage::pixel(int x, int y) const case Format_ARGB32: // Keep old behaviour. case Format_ARGB32_Premultiplied: return reinterpret_cast<const QRgb *>(s)[x]; + case Format_RGBX8888: + case Format_RGBA8888: // Match ARGB32 behavior. + case Format_RGBA8888_Premultiplied: + return RGBA2ARGB(reinterpret_cast<const quint32 *>(s)[x]); case Format_RGB16: return qConvertRgb16To32(reinterpret_cast<const quint16 *>(s)[x]); default: @@ -3716,6 +4304,13 @@ void QImage::setPixel(int x, int y, uint index_or_rgb) case Format_RGB16: ((quint16 *)s)[x] = qConvertRgb32To16(INV_PREMUL(index_or_rgb)); return; + case Format_RGBX8888: + ((uint *)s)[x] = ARGB2RGBA(index_or_rgb | 0xff000000); + return; + case Format_RGBA8888: + case Format_RGBA8888_Premultiplied: + ((uint *)s)[x] = ARGB2RGBA(index_or_rgb); + return; case Format_Invalid: case NImageFormats: Q_ASSERT(false); @@ -3756,6 +4351,11 @@ bool QImage::allGray() const case Format_RGB32: case Format_ARGB32: case Format_ARGB32_Premultiplied: +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + case Format_RGBX8888: + case Format_RGBA8888: + case Format_RGBA8888_Premultiplied: +#endif for (int j = 0; j < d->height; ++j) { const QRgb *b = (const QRgb *)constScanLine(j); for (int i = 0; i < d->width; ++i) { @@ -4330,6 +4930,11 @@ QImage QImage::rgbSwapped() const case Format_RGB32: case Format_ARGB32: case Format_ARGB32_Premultiplied: +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + case Format_RGBX8888: + case Format_RGBA8888: + case Format_RGBA8888_Premultiplied: +#endif res = QImage(d->width, d->height, d->format); QIMAGE_SANITYCHECK_MEMORY(res); for (int i = 0; i < d->height; i++) { @@ -5373,7 +5978,11 @@ QImage QImage::alphaChannel() const } } else { QImage alpha32 = *this; - if (d->format != Format_ARGB32 && d->format != Format_ARGB32_Premultiplied) + bool canSkipConversion = (d->format == Format_ARGB32 || d->format == Format_ARGB32_Premultiplied); +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + canSkipConversion = canSkipConversion || (d->format == Format_RGBA8888 || d->format == Format_RGBA8888_Premultiplied); +#endif + if (!canSkipConversion) alpha32 = convertToFormat(Format_ARGB32); const uchar *src_data = alpha32.d->data; @@ -5408,6 +6017,8 @@ bool QImage::hasAlphaChannel() const || d->format == Format_ARGB8555_Premultiplied || d->format == Format_ARGB6666_Premultiplied || d->format == Format_ARGB4444_Premultiplied + || d->format == Format_RGBA8888 + || d->format == Format_RGBA8888_Premultiplied || (d->has_alpha_clut && (d->format == Format_Indexed8 || d->format == Format_Mono || d->format == Format_MonoLSB))); @@ -5434,6 +6045,7 @@ int QImage::bitPlaneCount() const case QImage::Format_Invalid: break; case QImage::Format_RGB32: + case QImage::Format_RGBX8888: bpc = 24; break; case QImage::Format_RGB666: @@ -5457,9 +6069,11 @@ int QImage::bitPlaneCount() const static QImage smoothScaled(const QImage &source, int w, int h) { QImage src = source; - if (src.format() == QImage::Format_ARGB32) - src = src.convertToFormat(QImage::Format_ARGB32_Premultiplied); - else if (src.depth() < 32) { + bool canSkipConversion = (src.format() == QImage::Format_RGB32 || src.format() == QImage::Format_ARGB32_Premultiplied); +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + canSkipConversion = canSkipConversion || (src.format() == QImage::Format_RGBX8888 || src.format() == QImage::Format_RGBA8888_Premultiplied); +#endif + if (!canSkipConversion) { if (src.hasAlphaChannel()) src = src.convertToFormat(QImage::Format_ARGB32_Premultiplied); else @@ -5480,6 +6094,9 @@ static QImage rotated90(const QImage &image) { case QImage::Format_RGB32: case QImage::Format_ARGB32: case QImage::Format_ARGB32_Premultiplied: + case QImage::Format_RGBX8888: + case QImage::Format_RGBA8888: + case QImage::Format_RGBA8888_Premultiplied: qt_memrotate270(reinterpret_cast<const quint32*>(image.bits()), w, h, image.bytesPerLine(), reinterpret_cast<quint32*>(out.bits()), @@ -5539,6 +6156,9 @@ static QImage rotated270(const QImage &image) { case QImage::Format_RGB32: case QImage::Format_ARGB32: case QImage::Format_ARGB32_Premultiplied: + case QImage::Format_RGBX8888: + case QImage::Format_RGBA8888: + case QImage::Format_RGBA8888_Premultiplied: qt_memrotate90(reinterpret_cast<const quint32*>(image.bits()), w, h, image.bytesPerLine(), reinterpret_cast<quint32*>(out.bits()), @@ -5684,6 +6304,9 @@ QImage QImage::transformed(const QTransform &matrix, Qt::TransformationMode mode case QImage::Format_RGB444: target_format = Format_ARGB4444_Premultiplied; break; + case QImage::Format_RGBX8888: + target_format = Format_RGBA8888_Premultiplied; + break; default: target_format = Format_ARGB32_Premultiplied; break; diff --git a/src/gui/image/qimage.h b/src/gui/image/qimage.h index a4aaf049f0..02f0c18243 100644 --- a/src/gui/image/qimage.h +++ b/src/gui/image/qimage.h @@ -110,6 +110,9 @@ public: Format_RGB888, Format_RGB444, Format_ARGB4444_Premultiplied, + Format_RGBX8888, + Format_RGBA8888, + Format_RGBA8888_Premultiplied, #if 0 // reserved for future use Format_RGB15, diff --git a/src/gui/image/qimage_p.h b/src/gui/image/qimage_p.h index 18c686e917..36f117df60 100644 --- a/src/gui/image/qimage_p.h +++ b/src/gui/image/qimage_p.h @@ -128,6 +128,9 @@ inline int qt_depthForFormat(QImage::Format format) case QImage::Format_RGB32: case QImage::Format_ARGB32: case QImage::Format_ARGB32_Premultiplied: + case QImage::Format_RGBX8888: + case QImage::Format_RGBA8888: + case QImage::Format_RGBA8888_Premultiplied: depth = 32; break; case QImage::Format_RGB555: diff --git a/src/gui/image/qppmhandler.cpp b/src/gui/image/qppmhandler.cpp index 6fc41df77c..39f63a620c 100644 --- a/src/gui/image/qppmhandler.cpp +++ b/src/gui/image/qppmhandler.cpp @@ -274,12 +274,15 @@ static bool write_pbm_image(QIODevice *out, const QImage &sourceImage, const QBy case QImage::Format_RGB555: case QImage::Format_RGB888: case QImage::Format_RGB444: + case QImage::Format_RGBX8888: image = image.convertToFormat(QImage::Format_RGB32); break; case QImage::Format_ARGB8565_Premultiplied: case QImage::Format_ARGB6666_Premultiplied: case QImage::Format_ARGB8555_Premultiplied: case QImage::Format_ARGB4444_Premultiplied: + case QImage::Format_RGBA8888: + case QImage::Format_RGBA8888_Premultiplied: image = image.convertToFormat(QImage::Format_ARGB32); break; default: diff --git a/src/gui/image/qxpmhandler.cpp b/src/gui/image/qxpmhandler.cpp index a7936f915d..3bd8ca92b4 100644 --- a/src/gui/image/qxpmhandler.cpp +++ b/src/gui/image/qxpmhandler.cpp @@ -1092,7 +1092,7 @@ static bool write_xpm_image(const QImage &sourceImage, QIODevice *device, const return false; QImage image; - if (sourceImage.depth() != 32) + if (sourceImage.format() != QImage::Format_RGB32 || sourceImage.format() != QImage::Format_ARGB32 || sourceImage.format() != QImage::Format_ARGB32_Premultiplied) image = sourceImage.convertToFormat(QImage::Format_RGB32); else image = sourceImage; diff --git a/src/gui/kernel/qplatformintegrationplugin.h b/src/gui/kernel/qplatformintegrationplugin.h index 674622f84a..e624e2d31d 100644 --- a/src/gui/kernel/qplatformintegrationplugin.h +++ b/src/gui/kernel/qplatformintegrationplugin.h @@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE class QPlatformIntegration; -#define QPlatformIntegrationFactoryInterface_iid "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" +#define QPlatformIntegrationFactoryInterface_iid "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" class Q_GUI_EXPORT QPlatformIntegrationPlugin : public QObject { diff --git a/src/gui/opengl/qopenglframebufferobject.cpp b/src/gui/opengl/qopenglframebufferobject.cpp index 90416db72b..247ecf7351 100644 --- a/src/gui/opengl/qopenglframebufferobject.cpp +++ b/src/gui/opengl/qopenglframebufferobject.cpp @@ -1012,23 +1012,28 @@ QOpenGLFramebufferObjectFormat QOpenGLFramebufferObject::format() const Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha) { - QImage img(size, (alpha_format && include_alpha) ? QImage::Format_ARGB32_Premultiplied - : QImage::Format_RGB32); int w = size.width(); int h = size.height(); + while (glGetError()); + +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + QImage img(size, (alpha_format && include_alpha) ? QImage::Format_ARGB32_Premultiplied + : QImage::Format_RGB32); #ifdef QT_OPENGL_ES GLint fmt = GL_BGRA_EXT; #else GLint fmt = GL_BGRA; #endif - while (glGetError()); glReadPixels(0, 0, w, h, fmt, GL_UNSIGNED_BYTE, img.bits()); - if (glGetError()) { - glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); - img = img.rgbSwapped(); - } - return img.mirrored(); + if (!glGetError()) + return img.mirrored(); +#endif + + QImage rgbaImage(size, (alpha_format && include_alpha) ? QImage::Format_RGBA8888_Premultiplied + : QImage::Format_RGBX8888); + glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, rgbaImage.bits()); + return rgbaImage.mirrored(); } /*! diff --git a/src/gui/painting/qblendfunctions.cpp b/src/gui/painting/qblendfunctions.cpp index 6d9168ecf4..23eaa9a3e7 100644 --- a/src/gui/painting/qblendfunctions.cpp +++ b/src/gui/painting/qblendfunctions.cpp @@ -604,7 +604,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_Mono 0, // Format_Invalid, @@ -622,7 +625,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_MonoLSB 0, // Format_Invalid, @@ -640,7 +646,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_Indexed8 0, // Format_Invalid, @@ -658,7 +667,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB32 0, // Format_Invalid, @@ -676,7 +688,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB32 0, // Format_Invalid, @@ -694,7 +709,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB32_Premultiplied 0, // Format_Invalid, @@ -712,7 +730,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB16 0, // Format_Invalid, @@ -730,7 +751,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB8565_Premultiplied 0, // Format_Invalid, @@ -748,7 +772,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB666 0, // Format_Invalid, @@ -766,7 +793,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB6666_Premultiplied 0, // Format_Invalid, @@ -784,7 +814,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB555 0, // Format_Invalid, @@ -802,7 +835,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB8555_Premultiplied 0, // Format_Invalid, @@ -820,7 +856,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB888 0, // Format_Invalid, @@ -838,7 +877,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB444 0, // Format_Invalid, @@ -856,7 +898,10 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB4444_Premultiplied 0, // Format_Invalid, @@ -874,7 +919,85 @@ SrcOverScaleFunc qScaleFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, + }, + { // Format_RGBX8888 + 0, // Format_Invalid, + 0, // Format_Mono, + 0, // Format_MonoLSB, + 0, // Format_Indexed8, + 0, // Format_RGB32, + 0, // Format_ARGB32, + 0, // Format_ARGB32_Premultiplied, + 0, // Format_RGB16, + 0, // Format_ARGB8565_Premultiplied, + 0, // Format_RGB666, + 0, // Format_ARGB6666_Premultiplied, + 0, // Format_RGB555, + 0, // Format_ARGB8555_Premultiplied, + 0, // Format_RGB888, + 0, // Format_RGB444, + 0, // Format_ARGB4444_Premultiplied, +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qt_scale_image_rgb32_on_rgb32, // Format_RGBX8888, + 0, // Format_RGBA8888, + qt_scale_image_argb32_on_argb32, // Format_RGBA8888_Premultiplied, +#else + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, +#endif + }, + { // Format_RGBA8888 + 0, // Format_Invalid, + 0, // Format_Mono, + 0, // Format_MonoLSB, + 0, // Format_Indexed8, + 0, // Format_RGB32, + 0, // Format_ARGB32, + 0, // Format_ARGB32_Premultiplied, + 0, // Format_RGB16, + 0, // Format_ARGB8565_Premultiplied, + 0, // Format_RGB666, + 0, // Format_ARGB6666_Premultiplied, + 0, // Format_RGB555, + 0, // Format_ARGB8555_Premultiplied, + 0, // Format_RGB888, + 0, // Format_RGB444, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, + }, + { // Format_RGBA8888_Premultiplied + 0, // Format_Invalid, + 0, // Format_Mono, + 0, // Format_MonoLSB, + 0, // Format_Indexed8, + 0, // Format_RGB32, + 0, // Format_ARGB32, + 0, // Format_ARGB32_Premultiplied, + 0, // Format_RGB16, + 0, // Format_ARGB8565_Premultiplied, + 0, // Format_RGB666, + 0, // Format_ARGB6666_Premultiplied, + 0, // Format_RGB555, + 0, // Format_ARGB8555_Premultiplied, + 0, // Format_RGB888, + 0, // Format_RGB444, + 0, // Format_ARGB4444_Premultiplied, +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qt_scale_image_rgb32_on_rgb32, // Format_RGBX8888, + 0, // Format_RGBA8888, + qt_scale_image_argb32_on_argb32, // Format_RGBA8888_Premultiplied, +#else + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, +#endif } }; @@ -896,7 +1019,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_Mono 0, // Format_Invalid, @@ -914,7 +1040,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_MonoLSB 0, // Format_Invalid, @@ -932,7 +1061,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_Indexed8 0, // Format_Invalid, @@ -950,7 +1082,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB32 0, // Format_Invalid, @@ -968,7 +1103,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB32 0, // Format_Invalid, @@ -986,7 +1124,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB32_Premultiplied 0, // Format_Invalid, @@ -1004,7 +1145,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB16 0, // Format_Invalid, @@ -1022,7 +1166,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB8565_Premultiplied 0, // Format_Invalid, @@ -1040,7 +1187,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB666 0, // Format_Invalid, @@ -1058,7 +1208,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB6666_Premultiplied 0, // Format_Invalid, @@ -1076,7 +1229,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB555 0, // Format_Invalid, @@ -1094,7 +1250,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB8555_Premultiplied 0, // Format_Invalid, @@ -1112,7 +1271,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB888 0, // Format_Invalid, @@ -1130,7 +1292,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB444 0, // Format_Invalid, @@ -1148,7 +1313,10 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB4444_Premultiplied 0, // Format_Invalid, @@ -1166,7 +1334,85 @@ SrcOverBlendFunc qBlendFunctions[QImage::NImageFormats][QImage::NImageFormats] = 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, + }, + { // Format_RGBX8888 + 0, // Format_Invalid, + 0, // Format_Mono, + 0, // Format_MonoLSB, + 0, // Format_Indexed8, + 0, // Format_RGB32, + 0, // Format_ARGB32, + 0, // Format_ARGB32_Premultiplied, + 0, // Format_RGB16, + 0, // Format_ARGB8565_Premultiplied, + 0, // Format_RGB666, + 0, // Format_ARGB6666_Premultiplied, + 0, // Format_RGB555, + 0, // Format_ARGB8555_Premultiplied, + 0, // Format_RGB888, + 0, // Format_RGB444, + 0, // Format_ARGB4444_Premultiplied, +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qt_blend_rgb32_on_rgb32, // Format_RGBX8888, + 0, // Format_RGBA8888, + qt_blend_argb32_on_argb32, // Format_RGBA8888_Premultiplied, +#else + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, +#endif + }, + { // Format_RGBA8888 + 0, // Format_Invalid, + 0, // Format_Mono, + 0, // Format_MonoLSB, + 0, // Format_Indexed8, + 0, // Format_RGB32, + 0, // Format_ARGB32, + 0, // Format_ARGB32_Premultiplied, + 0, // Format_RGB16, + 0, // Format_ARGB8565_Premultiplied, + 0, // Format_RGB666, + 0, // Format_ARGB6666_Premultiplied, + 0, // Format_RGB555, + 0, // Format_ARGB8555_Premultiplied, + 0, // Format_RGB888, + 0, // Format_RGB444, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, + }, + { // Format_RGBA8888_Premultiplied + 0, // Format_Invalid, + 0, // Format_Mono, + 0, // Format_MonoLSB, + 0, // Format_Indexed8, + 0, // Format_RGB32, + 0, // Format_ARGB32, + 0, // Format_ARGB32_Premultiplied, + 0, // Format_RGB16, + 0, // Format_ARGB8565_Premultiplied, + 0, // Format_RGB666, + 0, // Format_ARGB6666_Premultiplied, + 0, // Format_RGB555, + 0, // Format_ARGB8555_Premultiplied, + 0, // Format_RGB888, + 0, // Format_RGB444, + 0, // Format_ARGB4444_Premultiplied, +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qt_blend_rgb32_on_rgb32, // Format_RGBX8888, + 0, // Format_RGBA8888, + qt_blend_argb32_on_argb32, // Format_RGBA8888_Premultiplied, +#else + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, +#endif } }; @@ -1187,7 +1433,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_Mono 0, // Format_Invalid, @@ -1205,7 +1454,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_MonoLSB 0, // Format_Invalid, @@ -1223,7 +1475,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_Indexed8 0, // Format_Invalid, @@ -1241,7 +1496,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB32 0, // Format_Invalid, @@ -1259,7 +1517,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB32 0, // Format_Invalid, @@ -1277,7 +1538,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB32_Premultiplied 0, // Format_Invalid, @@ -1295,7 +1559,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB16 0, // Format_Invalid, @@ -1313,7 +1580,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB8565_Premultiplied 0, // Format_Invalid, @@ -1331,7 +1601,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB666 0, // Format_Invalid, @@ -1349,7 +1622,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB6666_Premultiplied 0, // Format_Invalid, @@ -1367,7 +1643,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB555 0, // Format_Invalid, @@ -1385,7 +1664,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB8555_Premultiplied 0, // Format_Invalid, @@ -1403,7 +1685,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB888 0, // Format_Invalid, @@ -1421,7 +1706,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_RGB444 0, // Format_Invalid, @@ -1439,7 +1727,10 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, }, { // Format_ARGB4444_Premultiplied 0, // Format_Invalid, @@ -1457,7 +1748,85 @@ SrcOverTransformFunc qTransformFunctions[QImage::NImageFormats][QImage::NImageFo 0, // Format_ARGB8555_Premultiplied, 0, // Format_RGB888, 0, // Format_RGB444, - 0 // Format_ARGB4444_Premultiplied, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, + }, + { // Format_RGBX8888 + 0, // Format_Invalid, + 0, // Format_Mono, + 0, // Format_MonoLSB, + 0, // Format_Indexed8, + 0, // Format_RGB32, + 0, // Format_ARGB32, + 0, // Format_ARGB32_Premultiplied, + 0, // Format_RGB16, + 0, // Format_ARGB8565_Premultiplied, + 0, // Format_RGB666, + 0, // Format_ARGB6666_Premultiplied, + 0, // Format_RGB555, + 0, // Format_ARGB8555_Premultiplied, + 0, // Format_RGB888, + 0, // Format_RGB444, + 0, // Format_ARGB4444_Premultiplied, +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qt_transform_image_rgb32_on_rgb32, // Format_RGBX8888, + 0, // Format_RGBA8888, + qt_transform_image_argb32_on_argb32, // Format_RGBA8888_Premultiplied, +#else + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, +#endif + }, + { // Format_RGBA8888 + 0, // Format_Invalid, + 0, // Format_Mono, + 0, // Format_MonoLSB, + 0, // Format_Indexed8, + 0, // Format_RGB32, + 0, // Format_ARGB32, + 0, // Format_ARGB32_Premultiplied, + 0, // Format_RGB16, + 0, // Format_ARGB8565_Premultiplied, + 0, // Format_RGB666, + 0, // Format_ARGB6666_Premultiplied, + 0, // Format_RGB555, + 0, // Format_ARGB8555_Premultiplied, + 0, // Format_RGB888, + 0, // Format_RGB444, + 0, // Format_ARGB4444_Premultiplied, + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, + }, + { // Format_RGBA8888_Premultiplied + 0, // Format_Invalid, + 0, // Format_Mono, + 0, // Format_MonoLSB, + 0, // Format_Indexed8, + 0, // Format_RGB32, + 0, // Format_ARGB32, + 0, // Format_ARGB32_Premultiplied, + 0, // Format_RGB16, + 0, // Format_ARGB8565_Premultiplied, + 0, // Format_RGB666, + 0, // Format_ARGB6666_Premultiplied, + 0, // Format_RGB555, + 0, // Format_ARGB8555_Premultiplied, + 0, // Format_RGB888, + 0, // Format_RGB444, + 0, // Format_ARGB4444_Premultiplied, +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qt_transform_image_rgb32_on_rgb32, // Format_RGBX8888, + 0, // Format_RGBA8888, + qt_transform_image_argb32_on_argb32, // Format_RGBA8888_Premultiplied, +#else + 0, // Format_RGBX8888, + 0, // Format_RGBA8888, + 0 // Format_RGBA8888_Premultiplied, +#endif } }; diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index c79e8babb6..b2108ef67e 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -255,6 +255,33 @@ static const uint *QT_FASTCALL convertFromARGB32PM(uint *buffer, const uint *src return buffer; } +static const uint *QT_FASTCALL convertRGBFromARGB32PM(uint *buffer, const uint *src, int count, + const QPixelLayout *layout, const QRgb *) +{ + Q_ASSERT(layout->redWidth <= 8); + Q_ASSERT(layout->greenWidth <= 8); + Q_ASSERT(layout->blueWidth <= 8); + Q_ASSERT(layout->alphaWidth == 0); + + const uint redMask = (1 << layout->redWidth) - 1; + const uint greenMask = (1 << layout->greenWidth) - 1; + const uint blueMask = (1 << layout->blueWidth) - 1; + + const uchar redRightShift = 24 - layout->redWidth; + const uchar greenRightShift = 16 - layout->greenWidth; + const uchar blueRightShift = 8 - layout->blueWidth; + + for (int i = 0; i < count; ++i) { + uint color = INV_PREMUL(src[i]); + uint red = ((color >> redRightShift) & redMask) << layout->redShift; + uint green = ((color >> greenRightShift) & greenMask) << layout->greenShift; + uint blue = ((color >> blueRightShift) & blueMask) << layout->blueShift; + uint alpha = 0xff << layout->alphaShift; + buffer[i] = red | green | blue | alpha; + } + return buffer; +} + template <QPixelLayout::BPP bpp> static uint QT_FASTCALL fetchPixel(const uchar *src, int index); @@ -386,7 +413,16 @@ QPixelLayout qPixelLayouts[QImage::NImageFormats] = { { 5, 18, 5, 13, 5, 8, 8, 0, true, QPixelLayout::BPP24, convertToARGB32PM, convertFromARGB32PM }, // Format_ARGB8555_Premultiplied { 8, 16, 8, 8, 8, 0, 0, 0, false, QPixelLayout::BPP24, convertToRGB32, convertFromARGB32PM }, // Format_RGB888 { 4, 8, 4, 4, 4, 0, 0, 0, false, QPixelLayout::BPP16, convertToRGB32, convertFromARGB32PM }, // Format_RGB444 - { 4, 8, 4, 4, 4, 0, 4, 12, true, QPixelLayout::BPP16, convertToARGB32PM, convertFromARGB32PM } // Format_ARGB4444_Premultiplied + { 4, 8, 4, 4, 4, 0, 4, 12, true, QPixelLayout::BPP16, convertToARGB32PM, convertFromARGB32PM }, // Format_ARGB4444_Premultiplied +#if Q_BYTE_ORDER == Q_BIG_ENDIAN + { 8, 24, 8, 16, 8, 8, 0, 0, false, QPixelLayout::BPP32, convertToRGB32, convertRGBFromARGB32PM }, // Format_RGBX8888 + { 8, 24, 8, 16, 8, 8, 8, 0, false, QPixelLayout::BPP32, convertToARGB32PM, convertFromARGB32PM }, // Format_RGBA8888 + { 8, 24, 8, 16, 8, 8, 8, 0, true, QPixelLayout::BPP32, convertToARGB32PM, convertFromARGB32PM }, // Format_RGBA8888_Premultiplied +#else + { 8, 0, 8, 8, 8, 16, 0, 24, false, QPixelLayout::BPP32, convertToRGB32, convertRGBFromARGB32PM }, // Format_RGBX8888 + { 8, 0, 8, 8, 8, 16, 8, 24, false, QPixelLayout::BPP32, convertToARGB32PM, convertFromARGB32PM }, // Format_RGBA8888 (ABGR32) + { 8, 0, 8, 8, 8, 16, 8, 24, true, QPixelLayout::BPP32, convertToARGB32PM, convertFromARGB32PM } // Format_RGBA8888_Premultiplied +#endif }; FetchPixelsFunc qFetchPixels[QPixelLayout::BPPCount] = { @@ -490,7 +526,10 @@ static DestFetchProc destFetchProc[QImage::NImageFormats] = destFetch, // Format_ARGB8555_Premultiplied destFetch, // Format_RGB888 destFetch, // Format_RGB444 - destFetch // Format_ARGB4444_Premultiplied + destFetch, // Format_ARGB4444_Premultiplied + destFetch, // Format_RGBX8888 + destFetch, // Format_RGBA8888 + destFetch, // Format_RGBA8888_Premultiplied }; /* @@ -622,7 +661,10 @@ static DestStoreProc destStoreProc[QImage::NImageFormats] = destStore, // Format_ARGB8555_Premultiplied destStore, // Format_RGB888 destStore, // Format_RGB444 - destStore // Format_ARGB4444_Premultiplied + destStore, // Format_ARGB4444_Premultiplied + destStore, // Format_RGBX8888 + destStore, // Format_RGBA8888 + destStore // Format_RGBA8888_Premultiplied }; /* @@ -1766,7 +1808,10 @@ static const SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = { fetchUntransformed, // ARGB8555_Premultiplied fetchUntransformed, // RGB888 fetchUntransformed, // RGB444 - fetchUntransformed // ARGB4444_Premultiplied + fetchUntransformed, // ARGB4444_Premultiplied + fetchUntransformed, // RGBX8888 + fetchUntransformed, // RGBA8888 + fetchUntransformed // RGBA8888_Premultiplied }, // Tiled { @@ -1785,7 +1830,10 @@ static const SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = { fetchUntransformed, // ARGB8555_Premultiplied fetchUntransformed, // RGB888 fetchUntransformed, // RGB444 - fetchUntransformed // ARGB4444_Premultiplied + fetchUntransformed, // ARGB4444_Premultiplied + fetchUntransformed, // RGBX8888 + fetchUntransformed, // RGBA8888 + fetchUntransformed // RGBA8888_Premultiplied }, // Transformed { @@ -1805,6 +1853,9 @@ static const SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = { fetchTransformed<BlendTransformed>, // RGB888 fetchTransformed<BlendTransformed>, // RGB444 fetchTransformed<BlendTransformed>, // ARGB4444_Premultiplied + fetchTransformed<BlendTransformed>, // RGBX8888 + fetchTransformed<BlendTransformed>, // RGBA8888 + fetchTransformed<BlendTransformed>, // RGBA8888_Premultiplied }, { 0, // TransformedTiled @@ -1823,6 +1874,9 @@ static const SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = { fetchTransformed<BlendTransformedTiled>, // RGB888 fetchTransformed<BlendTransformedTiled>, // RGB444 fetchTransformed<BlendTransformedTiled>, // ARGB4444_Premultiplied + fetchTransformed<BlendTransformedTiled>, // RGBX8888 + fetchTransformed<BlendTransformedTiled>, // RGBA8888 + fetchTransformed<BlendTransformedTiled>, // RGBA8888_Premultiplied }, { 0, // Bilinear @@ -1840,7 +1894,10 @@ static const SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = { fetchTransformedBilinear<BlendTransformedBilinear>, // ARGB8555_Premultiplied fetchTransformedBilinear<BlendTransformedBilinear>, // RGB888 fetchTransformedBilinear<BlendTransformedBilinear>, // RGB444 - fetchTransformedBilinear<BlendTransformedBilinear> // ARGB4444_Premultiplied + fetchTransformedBilinear<BlendTransformedBilinear>, // ARGB4444_Premultiplied + fetchTransformedBilinear<BlendTransformedBilinear>, // RGBX8888 + fetchTransformedBilinear<BlendTransformedBilinear>, // RGBA8888 + fetchTransformedBilinear<BlendTransformedBilinear> // RGBA8888_Premultiplied }, { 0, // BilinearTiled @@ -1858,7 +1915,10 @@ static const SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = { fetchTransformedBilinear<BlendTransformedBilinearTiled>, // ARGB8555_Premultiplied fetchTransformedBilinear<BlendTransformedBilinearTiled>, // RGB888 fetchTransformedBilinear<BlendTransformedBilinearTiled>, // RGB444 - fetchTransformedBilinear<BlendTransformedBilinearTiled> // ARGB4444_Premultiplied + fetchTransformedBilinear<BlendTransformedBilinearTiled>, // ARGB4444_Premultiplied + fetchTransformedBilinear<BlendTransformedBilinearTiled>, // RGBX8888 + fetchTransformedBilinear<BlendTransformedBilinearTiled>, // RGBA8888 + fetchTransformedBilinear<BlendTransformedBilinearTiled> // RGBA8888_Premultiplied }, }; @@ -5268,6 +5328,9 @@ static const ProcessSpans processTextureSpans[NBlendTypes][QImage::NImageFormats blend_untransformed_generic, blend_untransformed_generic, blend_untransformed_generic, + blend_untransformed_generic, + blend_untransformed_generic, + blend_untransformed_generic, }, // Tiled { @@ -5287,6 +5350,9 @@ static const ProcessSpans processTextureSpans[NBlendTypes][QImage::NImageFormats blend_tiled_generic, blend_tiled_generic, blend_tiled_generic, + blend_tiled_generic, + blend_tiled_generic, + blend_tiled_generic, }, // Transformed { @@ -5306,6 +5372,9 @@ static const ProcessSpans processTextureSpans[NBlendTypes][QImage::NImageFormats blend_src_generic, blend_src_generic, blend_src_generic, + blend_src_generic, + blend_src_generic, + blend_src_generic, }, // TransformedTiled { @@ -5324,6 +5393,9 @@ static const ProcessSpans processTextureSpans[NBlendTypes][QImage::NImageFormats blend_src_generic, blend_src_generic, blend_src_generic, + blend_src_generic, + blend_src_generic, + blend_src_generic, blend_src_generic }, // Bilinear @@ -5344,6 +5416,9 @@ static const ProcessSpans processTextureSpans[NBlendTypes][QImage::NImageFormats blend_src_generic, blend_src_generic, blend_src_generic, + blend_src_generic, + blend_src_generic, + blend_src_generic, }, // BilinearTiled { @@ -5363,6 +5438,9 @@ static const ProcessSpans processTextureSpans[NBlendTypes][QImage::NImageFormats blend_src_generic, // RGB888 blend_src_generic, // RGB444 blend_src_generic, // ARGB4444_Premultiplied + blend_src_generic, // RGBX8888 + blend_src_generic, // RGBA8888 + blend_src_generic, // RGBA8888_Premultiplied } }; @@ -5956,6 +6034,48 @@ DrawHelper qDrawHelper[QImage::NImageFormats] = blend_color_generic, blend_src_generic, 0, 0, 0, 0 + }, + // Format_RGBX8888 + { + blend_color_generic, + qt_gradient_quint32, + qt_bitmapblit_quint32, +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qt_alphamapblit_quint32, + qt_alphargbblit_quint32, +#else + 0, + 0, +#endif + qt_rectfill_quint32 + }, + // Format_RGBA8888 + { + blend_color_generic, + qt_gradient_quint32, + qt_bitmapblit_quint32, +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qt_alphamapblit_quint32, + qt_alphargbblit_quint32, +#else + 0, + 0, +#endif + qt_rectfill_quint32 + }, + // Format_RGB8888_Premultiplied + { + blend_color_generic, + qt_gradient_quint32, + qt_bitmapblit_quint32, +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qt_alphamapblit_quint32, + qt_alphargbblit_quint32, +#else + 0, + 0, +#endif + qt_rectfill_quint32 } }; @@ -6043,6 +6163,9 @@ void qInitDrawhelperAsm() qDrawHelper[QImage::Format_ARGB32].bitmapBlit = qt_bitmapblit32_avx; qDrawHelper[QImage::Format_ARGB32_Premultiplied].bitmapBlit = qt_bitmapblit32_avx; qDrawHelper[QImage::Format_RGB16].bitmapBlit = qt_bitmapblit16_avx; + qDrawHelper[QImage::Format_RGBX8888].bitmapBlit = qt_bitmapblit32_avx; + qDrawHelper[QImage::Format_RGBA8888].bitmapBlit = qt_bitmapblit32_avx; + qDrawHelper[QImage::Format_RGBA8888_Premultiplied].bitmapBlit = qt_bitmapblit32_avx; extern void qt_scale_image_argb32_on_argb32_avx(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, @@ -6052,6 +6175,10 @@ void qInitDrawhelperAsm() int const_alpha); qScaleFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_ARGB32_Premultiplied] = qt_scale_image_argb32_on_argb32_avx; qScaleFunctions[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = qt_scale_image_argb32_on_argb32_avx; +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qScaleFunctions[QImage::Format_RGBA8888_Premultiplied][QImage::Format_RGBA8888_Premultiplied] = qt_scale_image_argb32_on_argb32_avx; + qScaleFunctions[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] = qt_scale_image_argb32_on_argb32_avx; +#endif #endif #ifdef QT_COMPILER_SUPPORTS_SSE2 } else if (features & SSE2) { @@ -6061,6 +6188,9 @@ void qInitDrawhelperAsm() qDrawHelper[QImage::Format_ARGB32].bitmapBlit = qt_bitmapblit32_sse2; qDrawHelper[QImage::Format_ARGB32_Premultiplied].bitmapBlit = qt_bitmapblit32_sse2; qDrawHelper[QImage::Format_RGB16].bitmapBlit = qt_bitmapblit16_sse2; + qDrawHelper[QImage::Format_RGBX8888].bitmapBlit = qt_bitmapblit32_sse2; + qDrawHelper[QImage::Format_RGBA8888].bitmapBlit = qt_bitmapblit32_sse2; + qDrawHelper[QImage::Format_RGBA8888_Premultiplied].bitmapBlit = qt_bitmapblit32_sse2; extern void qt_scale_image_argb32_on_argb32_sse2(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, @@ -6070,6 +6200,10 @@ void qInitDrawhelperAsm() int const_alpha); qScaleFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_ARGB32_Premultiplied] = qt_scale_image_argb32_on_argb32_sse2; qScaleFunctions[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = qt_scale_image_argb32_on_argb32_sse2; +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qScaleFunctions[QImage::Format_RGBA8888_Premultiplied][QImage::Format_RGBA8888_Premultiplied] = qt_scale_image_argb32_on_argb32_sse2; + qScaleFunctions[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] = qt_scale_image_argb32_on_argb32_sse2; +#endif #endif } @@ -6088,6 +6222,12 @@ void qInitDrawhelperAsm() qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGB32] = qt_blend_rgb32_on_rgb32_sse2; qBlendFunctions[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_sse2; qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_sse2; +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qBlendFunctions[QImage::Format_RGBX8888][QImage::Format_RGBX8888] = qt_blend_rgb32_on_rgb32_sse2; + qBlendFunctions[QImage::Format_RGBA8888_Premultiplied][QImage::Format_RGBX8888] = qt_blend_rgb32_on_rgb32_sse2; + qBlendFunctions[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] = qt_blend_argb32_on_argb32_sse2; + qBlendFunctions[QImage::Format_RGBA8888_Premultiplied][QImage::Format_RGBA8888_Premultiplied] = qt_blend_argb32_on_argb32_sse2; +#endif extern const uint * QT_FASTCALL qt_fetch_radial_gradient_sse2(uint *buffer, const Operator *op, const QSpanData *data, int y, int x, int length); @@ -6104,6 +6244,10 @@ void qInitDrawhelperAsm() qBlendFunctions[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_ssse3; qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_ssse3; +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qBlendFunctions[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] = qt_blend_argb32_on_argb32_ssse3; + qBlendFunctions[QImage::Format_RGBA8888_Premultiplied][QImage::Format_RGBA8888_Premultiplied] = qt_blend_argb32_on_argb32_ssse3; +#endif } #endif // SSSE3 @@ -6122,6 +6266,12 @@ void qInitDrawhelperAsm() qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGB32] = qt_blend_rgb32_on_rgb32_avx; qBlendFunctions[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_avx; qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_avx; +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qBlendFunctions[QImage::Format_RGBX8888][QImage::Format_RGBX8888] = qt_blend_rgb32_on_rgb32_avx; + qBlendFunctions[QImage::Format_RGBA8888_Premultiplied][QImage::Format_RGBX8888] = qt_blend_rgb32_on_rgb32_avx; + qBlendFunctions[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] = qt_blend_argb32_on_argb32_avx; + qBlendFunctions[QImage::Format_RGBA8888_Premultiplied][QImage::Format_RGBA8888_Premultiplied] = qt_blend_argb32_on_argb32_avx; +#endif extern const uint * QT_FASTCALL qt_fetch_radial_gradient_avx(uint *buffer, const Operator *op, const QSpanData *data, int y, int x, int length); @@ -6172,6 +6322,12 @@ void qInitDrawhelperAsm() qBlendFunctions[QImage::Format_RGB16][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_rgb16_neon; qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGB16] = qt_blend_rgb16_on_argb32_neon; qBlendFunctions[QImage::Format_RGB16][QImage::Format_RGB16] = qt_blend_rgb16_on_rgb16_neon; +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qBlendFunctions[QImage::Format_RGBX8888][QImage::Format_RGBX8888] = qt_blend_rgb32_on_rgb32_neon; + qBlendFunctions[QImage::Format_RGBA8888_Premultiplied][QImage::Format_RGBX8888] = qt_blend_rgb32_on_rgb32_neon; + qBlendFunctions[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] = qt_blend_argb32_on_argb32_neon; + qBlendFunctions[QImage::Format_RGBA8888_Premultiplied][QImage::Format_RGBA8888_Premultiplied] = qt_blend_argb32_on_argb32_neon; +#endif qScaleFunctions[QImage::Format_RGB16][QImage::Format_ARGB32_Premultiplied] = qt_scale_image_argb32_on_rgb16_neon; qScaleFunctions[QImage::Format_RGB16][QImage::Format_RGB16] = qt_scale_image_rgb16_on_rgb16_neon; diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h index 0b8a41c904..f4c29996b4 100644 --- a/src/gui/painting/qdrawhelper_p.h +++ b/src/gui/painting/qdrawhelper_p.h @@ -653,6 +653,30 @@ static Q_ALWAYS_INLINE uint PREMUL(uint x) { } #endif +#if Q_BYTE_ORDER == Q_BIG_ENDIAN +static Q_ALWAYS_INLINE quint32 RGBA2ARGB(quint32 x) { + quint32 rgb = x >> 8; + quint32 a = x << 24; + return a | rgb; +} + +static Q_ALWAYS_INLINE quint32 ARGB2RGBA(quint32 x) { + quint32 rgb = x << 8; + quint32 a = x >> 24; + return a | rgb; +} +#else +static Q_ALWAYS_INLINE quint32 RGBA2ARGB(quint32 x) { + // RGBA8888 is ABGR32 on little endian. + quint32 ag = x & 0xff00ff00; + quint32 rg = x & 0x00ff00ff; + return ag | (rg << 16) | (rg >> 16); +} + +static Q_ALWAYS_INLINE quint32 ARGB2RGBA(quint32 x) { + return RGBA2ARGB(x); +} +#endif static Q_ALWAYS_INLINE uint BYTE_MUL_RGB16(uint x, uint a) { a += 1; diff --git a/src/gui/painting/qimagescale.cpp b/src/gui/painting/qimagescale.cpp index 27cb08f353..89ccdd42f0 100644 --- a/src/gui/painting/qimagescale.cpp +++ b/src/gui/painting/qimagescale.cpp @@ -1017,7 +1017,7 @@ QImage qSmoothScaleImage(const QImage &src, int dw, int dh) return QImage(); } - if (src.format() == QImage::Format_ARGB32_Premultiplied) + if (src.format() == QImage::Format_ARGB32_Premultiplied || src.format() == QImage::Format_RGBA8888_Premultiplied) qt_qimageScaleArgb(scaleinfo, (unsigned int *)buffer.scanLine(0), 0, 0, 0, 0, dw, dh, dw, src.bytesPerLine() / 4); else diff --git a/src/gui/painting/qmemrotate.cpp b/src/gui/painting/qmemrotate.cpp index 747881bbd1..087231df43 100644 --- a/src/gui/painting/qmemrotate.cpp +++ b/src/gui/painting/qmemrotate.cpp @@ -529,7 +529,10 @@ MemRotateFunc qMemRotateFunctions[QImage::NImageFormats][3] = { 0, 0, 0 }, // Format_ARGB8555_Premultiplied, { 0, 0, 0 }, // Format_RGB888, { 0, 0, 0 }, // Format_RGB444, - { 0, 0, 0 } // Format_ARGB4444_Premultiplied, + { 0, 0, 0 }, // Format_ARGB4444_Premultiplied, + { qt_memrotate90_32, qt_memrotate180_32, qt_memrotate270_32 }, // Format_RGBX8888, + { qt_memrotate90_32, qt_memrotate180_32, qt_memrotate270_32 }, // Format_RGBA8888, + { qt_memrotate90_32, qt_memrotate180_32, qt_memrotate270_32 } // Format_RGBA8888_Premultiplied, }; QT_END_NAMESPACE diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index d1e9b81faa..7112380043 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -435,6 +435,8 @@ void QRasterPaintEngine::init() case QImage::Format_ARGB4444_Premultiplied: case QImage::Format_ARGB32_Premultiplied: case QImage::Format_ARGB32: + case QImage::Format_RGBA8888_Premultiplied: + case QImage::Format_RGBA8888: gccaps |= PorterDuff; break; case QImage::Format_RGB32: @@ -443,6 +445,7 @@ void QRasterPaintEngine::init() case QImage::Format_RGB666: case QImage::Format_RGB888: case QImage::Format_RGB16: + case QImage::Format_RGBX8888: break; default: break; @@ -2261,6 +2264,7 @@ void QRasterPaintEngine::drawImage(const QRectF &r, const QImage &img, const QRe case QImage::Format_ARGB6666_Premultiplied: case QImage::Format_ARGB8555_Premultiplied: case QImage::Format_ARGB4444_Premultiplied: + case QImage::Format_RGBA8888_Premultiplied: // Combine premultiplied color with the opacity set on the painter. d->solid_color_filler.solid.color = ((((color & 0x00ff00ff) * s->intOpacity) >> 8) & 0x00ff00ff) diff --git a/src/plugins/platforms/android/src/androidplatformplugin.cpp b/src/plugins/platforms/android/src/androidplatformplugin.cpp index 71c5096e16..79e23c2d32 100644 --- a/src/plugins/platforms/android/src/androidplatformplugin.cpp +++ b/src/plugins/platforms/android/src/androidplatformplugin.cpp @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE class QAndroidPlatformIntegrationPlugin: public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "android.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "android.json") public: QPlatformIntegration *create(const QString &key, const QStringList ¶mList); }; diff --git a/src/plugins/platforms/cocoa/main.mm b/src/plugins/platforms/cocoa/main.mm index 6adcb27817..b730514b12 100644 --- a/src/plugins/platforms/cocoa/main.mm +++ b/src/plugins/platforms/cocoa/main.mm @@ -51,7 +51,7 @@ QT_BEGIN_NAMESPACE class QCocoaIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "cocoa.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "cocoa.json") public: QPlatformIntegration *create(const QString&, const QStringList&); }; diff --git a/src/plugins/platforms/directfb/main.cpp b/src/plugins/platforms/directfb/main.cpp index 3d5d60abaa..5ba1b0996b 100644 --- a/src/plugins/platforms/directfb/main.cpp +++ b/src/plugins/platforms/directfb/main.cpp @@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE class QDirectFbIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "directfb.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "directfb.json") public: QPlatformIntegration *create(const QString&, const QStringList&); }; diff --git a/src/plugins/platforms/eglfs/main.cpp b/src/plugins/platforms/eglfs/main.cpp index df77127b4a..d8e7a3792e 100644 --- a/src/plugins/platforms/eglfs/main.cpp +++ b/src/plugins/platforms/eglfs/main.cpp @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE class QEglFSIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "eglfs.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "eglfs.json") public: QPlatformIntegration *create(const QString&, const QStringList&); }; diff --git a/src/plugins/platforms/ios/plugin.mm b/src/plugins/platforms/ios/plugin.mm index ca8ec936ae..efb1ad8d74 100644 --- a/src/plugins/platforms/ios/plugin.mm +++ b/src/plugins/platforms/ios/plugin.mm @@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE class QIOSIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "ios.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "ios.json") public: QPlatformIntegration *create(const QString&, const QStringList&); }; diff --git a/src/plugins/platforms/kms/main.cpp b/src/plugins/platforms/kms/main.cpp index 75f7ef5278..db0582e694 100644 --- a/src/plugins/platforms/kms/main.cpp +++ b/src/plugins/platforms/kms/main.cpp @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE class QKmsIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "kms.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "kms.json") public: QPlatformIntegration *create(const QString&, const QStringList&); }; diff --git a/src/plugins/platforms/linuxfb/main.cpp b/src/plugins/platforms/linuxfb/main.cpp index a1037c4feb..579984d2fc 100644 --- a/src/plugins/platforms/linuxfb/main.cpp +++ b/src/plugins/platforms/linuxfb/main.cpp @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE class QLinuxFbIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "linuxfb.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "linuxfb.json") public: QPlatformIntegration *create(const QString&, const QStringList&); }; diff --git a/src/plugins/platforms/minimal/main.cpp b/src/plugins/platforms/minimal/main.cpp index 811f1fe5ee..7846b5b387 100644 --- a/src/plugins/platforms/minimal/main.cpp +++ b/src/plugins/platforms/minimal/main.cpp @@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE class QMinimalIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "minimal.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "minimal.json") public: QPlatformIntegration *create(const QString&, const QStringList&); }; diff --git a/src/plugins/platforms/minimalegl/main.cpp b/src/plugins/platforms/minimalegl/main.cpp index 414f45c745..c951bfb0dc 100644 --- a/src/plugins/platforms/minimalegl/main.cpp +++ b/src/plugins/platforms/minimalegl/main.cpp @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE class QMinimalEglIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "minimalegl.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "minimalegl.json") public: QStringList keys() const; QPlatformIntegration *create(const QString&, const QStringList&); diff --git a/src/plugins/platforms/offscreen/main.cpp b/src/plugins/platforms/offscreen/main.cpp index ca7dc1d18b..f48451d00d 100644 --- a/src/plugins/platforms/offscreen/main.cpp +++ b/src/plugins/platforms/offscreen/main.cpp @@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE class QOffscreenIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "offscreen.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "offscreen.json") public: QPlatformIntegration *create(const QString&, const QStringList&); }; diff --git a/src/plugins/platforms/openwfd/main.cpp b/src/plugins/platforms/openwfd/main.cpp index 724c5cfa4b..cea3c50e56 100644 --- a/src/plugins/platforms/openwfd/main.cpp +++ b/src/plugins/platforms/openwfd/main.cpp @@ -46,7 +46,7 @@ QT_BEGIN_NAMESPACE class QOpenWFDIntegrationPlugin : public QPlatformIntegrationPlugin { - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2") public: QPlatformIntegration *create(const QString&, const QStringList&); }; diff --git a/src/plugins/platforms/qnx/main.h b/src/plugins/platforms/qnx/main.h index 0b5f6323c4..683b20efd2 100644 --- a/src/plugins/platforms/qnx/main.h +++ b/src/plugins/platforms/qnx/main.h @@ -46,7 +46,7 @@ QT_BEGIN_NAMESPACE class QQnxIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "qnx.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "qnx.json") public: QPlatformIntegration *create(const QString&, const QStringList&); }; diff --git a/src/plugins/platforms/windows/main.cpp b/src/plugins/platforms/windows/main.cpp index 16cac9d547..ffd87af193 100644 --- a/src/plugins/platforms/windows/main.cpp +++ b/src/plugins/platforms/windows/main.cpp @@ -105,7 +105,7 @@ QT_BEGIN_NAMESPACE class QWindowsIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "windows.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "windows.json") public: QPlatformIntegration *create(const QString&, const QStringList&, int &, char **); }; diff --git a/src/plugins/platforms/xcb/main.cpp b/src/plugins/platforms/xcb/main.cpp index 09e60f8d4c..e114827703 100644 --- a/src/plugins/platforms/xcb/main.cpp +++ b/src/plugins/platforms/xcb/main.cpp @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE class QXcbIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "xcb.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "xcb.json") public: QPlatformIntegration *create(const QString&, const QStringList&, int &, char **); }; diff --git a/src/tools/qdoc/cppcodeparser.cpp b/src/tools/qdoc/cppcodeparser.cpp index 30b26264f1..3e63432047 100644 --- a/src/tools/qdoc/cppcodeparser.cpp +++ b/src/tools/qdoc/cppcodeparser.cpp @@ -612,10 +612,10 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, (command == COMMAND_QMLATTACHEDSIGNAL) || (command == COMMAND_QMLATTACHEDMETHOD)) { QString module; - QString element; + QString qmlType; QString type; - if (splitQmlMethodArg(arg.first,type,module,element)) { - QmlClassNode* qmlClass = qdb_->findQmlType(module,element); + if (splitQmlMethodArg(arg.first,type,module,qmlType)) { + QmlClassNode* qmlClass = qdb_->findQmlType(module,qmlType); if (qmlClass) { bool attached = false; Node::Type nodeType = Node::QmlMethod; @@ -650,24 +650,24 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, /*! A QML property group argument has the form... - <QML-module>::<element>::<name> + <QML-module>::<QML-type>::<name> This function splits the argument into those parts. A <QML-module> is the QML equivalent of a C++ namespace. So this function splits \a arg on "::" and stores the - parts in \a module, \a element, and \a name, and returns + parts in \a module, \a qmlType, and \a name, and returns true. If any part is not found, a qdoc warning is emitted and false is returned. */ bool CppCodeParser::splitQmlPropertyGroupArg(const QString& arg, QString& module, - QString& element, + QString& qmlType, QString& name) { QStringList colonSplit = arg.split("::"); if (colonSplit.size() == 3) { module = colonSplit[0]; - element = colonSplit[1]; + qmlType = colonSplit[1]; name = colonSplit[2]; return true; } @@ -679,26 +679,26 @@ bool CppCodeParser::splitQmlPropertyGroupArg(const QString& arg, /*! A QML property argument has the form... - <type> <element>::<name> - <type> <QML-module>::<element>::<name> + <type> <QML-type>::<name> + <type> <QML-module>::<QML-type>::<name> This function splits the argument into one of those two forms. The three part form is the old form, which was used before the creation of Qt Quick 2 and Qt Components. A <QML-module> is the QML equivalent of a C++ namespace. So this function splits \a arg on "::" - and stores the parts in \a type, \a module, \a element, + and stores the parts in \a type, \a module, \a qmlType, and \a name, and returns true. If any part other than \a module is not found, a qdoc warning is emitted and false is returned. - \note The two elements \e{Component} and \e{QtObject} never - have a module qualifier. + \note The two QML types \e{Component} and \e{QtObject} + never have a module qualifier. */ bool CppCodeParser::splitQmlPropertyArg(const QString& arg, QString& type, QString& module, - QString& element, + QString& qmlType, QString& name) { QStringList blankSplit = arg.split(QLatin1Char(' ')); @@ -707,13 +707,13 @@ bool CppCodeParser::splitQmlPropertyArg(const QString& arg, QStringList colonSplit(blankSplit[1].split("::")); if (colonSplit.size() == 3) { module = colonSplit[0]; - element = colonSplit[1]; + qmlType = colonSplit[1]; name = colonSplit[2]; return true; } if (colonSplit.size() == 2) { module.clear(); - element = colonSplit[0]; + qmlType = colonSplit[0]; name = colonSplit[1]; return true; } @@ -730,21 +730,21 @@ bool CppCodeParser::splitQmlPropertyArg(const QString& arg, /*! A QML signal or method argument has the form... - <type> <element>::<name>(<param>, <param>, ...) - <type> <QML-module>::<element>::<name>(<param>, <param>, ...) + <type> <QML-type>::<name>(<param>, <param>, ...) + <type> <QML-module>::<QML-type>::<name>(<param>, <param>, ...) This function splits the argument into one of those two - forms, sets \a module, \a element, and \a name, and returns + forms, sets \a module, \a qmlType, and \a name, and returns true. If the argument doesn't match either form, an error message is emitted and false is returned. - \note The two elements \e{Component} and \e{QtObject} never + \note The two QML types \e{Component} and \e{QtObject} never have a module qualifier. */ bool CppCodeParser::splitQmlMethodArg(const QString& arg, QString& type, QString& module, - QString& element) + QString& qmlType) { QStringList colonSplit(arg.split("::")); if (colonSplit.size() > 1) { @@ -753,22 +753,22 @@ bool CppCodeParser::splitQmlMethodArg(const QString& arg, type = blankSplit[0]; if (colonSplit.size() > 2) { module = blankSplit[1]; - element = colonSplit[1]; + qmlType = colonSplit[1]; } else { module.clear(); - element = blankSplit[1]; + qmlType = blankSplit[1]; } } else { type.clear(); if (colonSplit.size() > 2) { module = colonSplit[0]; - element = colonSplit[1]; + qmlType = colonSplit[1]; } else { module.clear(); - element = colonSplit[0]; + qmlType = colonSplit[0]; } } return true; @@ -790,7 +790,7 @@ void CppCodeParser::processQmlProperties(const Doc& doc, NodeList& nodes, DocLis QString type; QString topic; QString module; - QString element; + QString qmlType; QString property; QmlPropertyNode* qpn = 0; QmlClassNode* qmlClass = 0; @@ -808,11 +808,11 @@ void CppCodeParser::processQmlProperties(const Doc& doc, NodeList& nodes, DocLis qmlPropertyGroupTopic = topics.at(0); qmlPropertyGroupTopic.topic = COMMAND_QMLPROPERTYGROUP; arg = qmlPropertyGroupTopic.args; - if (splitQmlPropertyArg(arg, type, module, element, property)) { + if (splitQmlPropertyArg(arg, type, module, qmlType, property)) { int i = property.indexOf('.'); if (i != -1) { property = property.left(i); - qmlPropertyGroupTopic.args = module + "::" + element + "::" + property; + qmlPropertyGroupTopic.args = module + "::" + qmlType + "::" + property; doc.location().warning(tr("No QML property group command found; using \\%1 %2") .arg(COMMAND_QMLPROPERTYGROUP).arg(qmlPropertyGroupTopic.args)); } @@ -828,8 +828,8 @@ void CppCodeParser::processQmlProperties(const Doc& doc, NodeList& nodes, DocLis if (!qmlPropertyGroupTopic.isEmpty()) { arg = qmlPropertyGroupTopic.args; - if (splitQmlPropertyGroupArg(arg, module, element, property)) { - qmlClass = qdb_->findQmlType(module, element); + if (splitQmlPropertyGroupArg(arg, module, qmlType, property)) { + qmlClass = qdb_->findQmlType(module, qmlType); if (qmlClass) { qpgn = new QmlPropertyGroupNode(qmlClass, property); qpgn->setLocation(doc.startLocation()); @@ -848,8 +848,8 @@ void CppCodeParser::processQmlProperties(const Doc& doc, NodeList& nodes, DocLis arg = topics.at(i).args; if ((topic == COMMAND_QMLPROPERTY) || (topic == COMMAND_QMLATTACHEDPROPERTY)) { bool attached = (topic == COMMAND_QMLATTACHEDPROPERTY); - if (splitQmlPropertyArg(arg, type, module, element, property)) { - qmlClass = qdb_->findQmlType(module, element); + if (splitQmlPropertyArg(arg, type, module, qmlType, property)) { + qmlClass = qdb_->findQmlType(module, qmlType); if (qmlClass) { if (qmlClass->hasQmlProperty(property) != 0) { QString msg = tr("QML property documented multiple times: '%1'").arg(arg); @@ -2327,7 +2327,7 @@ bool CppCodeParser::makeFunctionNode(const QString& signature, the \a type. \a parent is the QML class node. The QML module and QML - element names have already been consumed to find \a parent. + type names have already been consumed to find \a parent. What remains in \a sig is the method signature. The method must be a child of \a parent. */ diff --git a/src/tools/qdoc/doc.cpp b/src/tools/qdoc/doc.cpp index 04d673e748..4d6b0b1a2c 100644 --- a/src/tools/qdoc/doc.cpp +++ b/src/tools/qdoc/doc.cpp @@ -80,7 +80,6 @@ enum { CMD_ANNOTATEDLIST, CMD_B, CMD_BADCODE, - CMD_BASENAME, CMD_BOLD, CMD_BR, CMD_BRIEF, @@ -198,7 +197,6 @@ static struct { { "annotatedlist", CMD_ANNOTATEDLIST, 0 }, { "b", CMD_B, 0 }, { "badcode", CMD_BADCODE, 0 }, - { "basename", CMD_BASENAME, 0 }, // ### don't document for now { "bold", CMD_BOLD, 0 }, { "br", CMD_BR, 0 }, { "brief", CMD_BRIEF, 0 }, @@ -316,7 +314,6 @@ Q_GLOBAL_STATIC(QHash_QString_Macro, macroHash) class DocPrivateExtra { public: - QString baseName; Doc::Sections granularity; Doc::Sections section; // ### QList<Atom*> tableOfContents; @@ -466,7 +463,6 @@ private: Location& location(); QString detailsUnknownCommand(const QSet<QString>& metaCommandSet, const QString& str); - void insertBaseName(const QString &baseName); void insertTarget(const QString& target, bool keyword); void include(const QString& fileName, const QString& identifier); void startFormat(const QString& format, int cmd); @@ -644,10 +640,6 @@ void DocParser::parse(const QString& source, leavePara(); append(Atom::CodeBad,getCode(CMD_BADCODE, marker)); break; - case CMD_BASENAME: - leavePara(); - insertBaseName(getArgument()); - break; case CMD_BR: leavePara(); append(Atom::BR); @@ -1669,29 +1661,6 @@ QString DocParser::detailsUnknownCommand(const QSet<QString> &metaCommandSet, return tr("Maybe you meant '\\%1'?").arg(best); } -void DocParser::insertBaseName(const QString &baseName) -{ - priv->constructExtra(); - if (currentSection == priv->extra->section) { - priv->extra->baseName = baseName; - } - else { - Atom *atom = priv->text.firstAtom(); - Atom *sectionLeft = 0; - - int delta = currentSection - priv->extra->section; - - while (atom != 0) { - if (atom->type() == Atom::SectionLeft && - atom->string().toInt() == delta) - sectionLeft = atom; - atom = atom->next(); - } - if (sectionLeft != 0) - (void) new Atom(sectionLeft, Atom::BaseName, baseName); - } -} - void DocParser::insertTarget(const QString &target, bool keyword) { if (targetMap.contains(target)) { @@ -2980,17 +2949,6 @@ Text Doc::legaleseText() const return body().subText(Atom::LegaleseLeft, Atom::LegaleseRight); } -const QString& Doc::baseName() const -{ - static QString null; - if (priv == 0 || priv->extra == 0) { - return null; - } - else { - return priv->extra->baseName; - } -} - Doc::Sections Doc::granularity() const { if (priv == 0 || priv->extra == 0) { diff --git a/src/tools/qdoc/doc.h b/src/tools/qdoc/doc.h index 23fc4c5b8b..bd3d623a05 100644 --- a/src/tools/qdoc/doc.h +++ b/src/tools/qdoc/doc.h @@ -164,7 +164,6 @@ public: Text briefText(bool inclusive = false) const; Text trimmedBriefText(const QString &className) const; Text legaleseText() const; - const QString& baseName() const; Sections granularity() const; const QSet<QString> ¶meterNames() const; const QStringList &enumItemNames() const; diff --git a/src/tools/qdoc/generator.cpp b/src/tools/qdoc/generator.cpp index 8cc8e0050a..f9601f8281 100644 --- a/src/tools/qdoc/generator.cpp +++ b/src/tools/qdoc/generator.cpp @@ -305,10 +305,18 @@ QString Generator::fileBase(const Node *node) const node = node->parent(); } - QString base = node->doc().baseName(); - if (!base.isEmpty()) - return base; + if (node->type() == Node::Document && node->subType() == Node::Collision) { + const NameCollisionNode* ncn = static_cast<const NameCollisionNode*>(node); + if (ncn->currentChild()) + return fileBase(ncn->currentChild()); + } + + if (node->hasBaseName()) { + //qDebug() << "RETURNING:" << node->baseName(); + return node->baseName(); + } + QString base; const Node *p = node; forever { @@ -377,6 +385,8 @@ QString Generator::fileBase(const Node *node) const } while (res.endsWith(QLatin1Char('-'))) res.chop(1); + Node* n = const_cast<Node*>(node); + n->setBaseName(res); return res; } diff --git a/src/tools/qdoc/htmlgenerator.cpp b/src/tools/qdoc/htmlgenerator.cpp index 4cd2206f9c..d5a1647c5a 100644 --- a/src/tools/qdoc/htmlgenerator.cpp +++ b/src/tools/qdoc/htmlgenerator.cpp @@ -2118,21 +2118,22 @@ QString HtmlGenerator::generateLowStatusMemberFile(InnerNode *inner, generateTitle(title, Text(), SmallSubTitle, inner, marker); if (status == CodeMarker::Compat) { - out() << "<p><b>The following class members are part of the " + out() << "<p><b>The following members of class " + << "<a href=\"" << linkForNode(inner, 0) << "\">" + << protectEnc(inner->name()) << "</a>" + << "are part of the " "Qt compatibility layer.</b> We advise against " "using them in new code.</p>\n"; } else { - out() << "<p><b>The following class members are obsolete.</b> " + out() << "<p><b>The following members of class " + << "<a href=\"" << linkForNode(inner, 0) << "\">" + << protectEnc(inner->name()) << "</a>" + << " are obsolete.</b> " << "They are provided to keep old source code working. " << "We strongly advise against using them in new code.</p>\n"; } - out() << "<p><ul><li><a href=\"" - << linkForNode(inner, 0) << "\">" - << protectEnc(inner->name()) - << " class reference</a></li></ul></p>\n"; - for (i = 0; i < sections.size(); ++i) { out() << "<h2>" << protectEnc(sections.at(i).name) << "</h2>\n"; generateSectionList(sections.at(i), inner, marker, CodeMarker::Summary); @@ -3779,7 +3780,7 @@ void HtmlGenerator::generateDetailedQmlMember(Node *node, out() << "<div class=\"qmlproto\">"; out() << "<table class=\"qmlname\">"; - QString heading = "Property Group: " + qpgn->name(); + QString heading = qpgn->name() + " group"; out() << "<tr valign=\"top\" class=\"even\">"; out() << "<th class=\"centerAlign\"><p>"; out() << "<a name=\"" + refForNode(qpgn) + "\"></a>"; diff --git a/src/tools/qdoc/node.h b/src/tools/qdoc/node.h index d5aa4a0cd4..5a71a2f9c4 100644 --- a/src/tools/qdoc/node.h +++ b/src/tools/qdoc/node.h @@ -164,7 +164,10 @@ public: QString plainName() const; QString plainFullName(const Node* relative = 0) const; QString fullName(const Node* relative=0) const; + const QString& baseName() const { return baseName_; } + bool hasBaseName() const { return !baseName_.isEmpty(); } + void setBaseName(const QString& bn) { baseName_ = bn; } void setAccess(Access access) { access_ = access; } void setLocation(const Location& location) { loc = location; } void setDoc(const Doc& doc, bool replace = false); @@ -302,6 +305,7 @@ private: Location loc; Doc doc_; QMap<LinkType, QPair<QString, QString> > linkMap_; + QString baseName_; QString moduleName_; QString url_; QString since_; diff --git a/tests/auto/corelib/tools/qdate/tst_qdate.cpp b/tests/auto/corelib/tools/qdate/tst_qdate.cpp index 310528ba27..728a4244a1 100644 --- a/tests/auto/corelib/tools/qdate/tst_qdate.cpp +++ b/tests/auto/corelib/tools/qdate/tst_qdate.cpp @@ -944,6 +944,61 @@ void tst_QDate::fromStringDateFormat_data() QTest::newRow("iso2") << QDate(1999, 11, 14).toString(Qt::ISODate) << Qt::ISODate << QDate(1999, 11, 14); QTest::newRow("iso3") << QString("0999-01-01") << Qt::ISODate << QDate(999, 1, 1); QTest::newRow("iso3b") << QString("0999-01-01") << Qt::ISODate << QDate(999, 1, 1); + + // Test Qt::RFC2822Date format (RFC 2822). + QTest::newRow("RFC 2822") << QString::fromLatin1("13 Feb 1987 13:24:51 +0100") + << Qt::RFC2822Date << QDate(1987, 2, 13); + QTest::newRow("RFC 2822 with day") << QString::fromLatin1("Thu, 01 Jan 1970 00:12:34 +0000") + << Qt::RFC2822Date << QDate(1970, 1, 1); + // No timezone + QTest::newRow("RFC 2822 no timezone") << QString::fromLatin1("01 Jan 1970 00:12:34") + << Qt::RFC2822Date << QDate(1970, 1, 1); + // No time specified + QTest::newRow("RFC 2822 date only") << QString::fromLatin1("01 Nov 2002") + << Qt::RFC2822Date << QDate(2002, 11, 1); + QTest::newRow("RFC 2822 with day date only") << QString::fromLatin1("Fri, 01 Nov 2002") + << Qt::RFC2822Date << QDate(2002, 11, 1); + // Test invalid month, day, year + QTest::newRow("RFC 2822 invalid month name") << QString::fromLatin1("13 Fev 1987 13:24:51 +0100") + << Qt::RFC2822Date << QDate(); + QTest::newRow("RFC 2822 invalid day") << QString::fromLatin1("36 Fev 1987 13:24:51 +0100") + << Qt::RFC2822Date << QDate(); + QTest::newRow("RFC 2822 invalid year") << QString::fromLatin1("13 Fev 0000 13:24:51 +0100") + << Qt::RFC2822Date << QDate(); + // Test invalid characters (should ignore invalid characters at end of string). + QTest::newRow("RFC 2822 invalid character at end") << QString::fromLatin1("01 Jan 2012 08:00:00 +0100!") + << Qt::RFC2822Date << QDate(2012, 1, 1); + QTest::newRow("RFC 2822 invalid character at front") << QString::fromLatin1("!01 Jan 2012 08:00:00 +0000") + << Qt::RFC2822Date << QDate(); + QTest::newRow("RFC 2822 invalid character both ends") << QString::fromLatin1("!01 Jan 2012 08:00:00 +0000!") + << Qt::RFC2822Date << QDate(); + QTest::newRow("RFC 2822 invalid character at front, 2 at back") << QString::fromLatin1("!01 Jan 2012 08:00:00 +0000..") + << Qt::RFC2822Date << QDate(); + QTest::newRow("RFC 2822 invalid character 2 at front") << QString::fromLatin1("!!01 Jan 2012 08:00:00 +0000") + << Qt::RFC2822Date << QDate(); + + // Test Qt::RFC2822Date format (RFC 850 and 1036). + QTest::newRow("RFC 850 and 1036") << QString::fromLatin1("Fri Feb 13 13:24:51 1987 +0100") + << Qt::RFC2822Date << QDate(1987, 2, 13); + // No timezone + QTest::newRow("RFC 850 and 1036 no timezone") << QString::fromLatin1("Thu Jan 01 00:12:34 1970") + << Qt::RFC2822Date << QDate(1970, 1, 1); + // No time specified + QTest::newRow("RFC 850 and 1036 date only") << QString::fromLatin1("Fri Nov 01 2002") + << Qt::RFC2822Date << QDate(2002, 11, 1); + // Test invalid characters (should ignore invalid characters at end of string). + QTest::newRow("RFC 850 and 1036 invalid character at end") << QString::fromLatin1("Sun Jan 01 08:00:00 2012 +0100!") + << Qt::RFC2822Date << QDate(2012, 1, 1); + QTest::newRow("RFC 850 and 1036 invalid character at front") << QString::fromLatin1("!Sun Jan 01 08:00:00 2012 +0000") + << Qt::RFC2822Date << QDate(); + QTest::newRow("RFC 850 and 1036 invalid character both ends") << QString::fromLatin1("!Sun Jan 01 08:00:00 2012 +0000!") + << Qt::RFC2822Date << QDate(); + QTest::newRow("RFC 850 and 1036 invalid character at front, 2 at back") << QString::fromLatin1("!Sun Jan 01 08:00:00 2012 +0000..") + << Qt::RFC2822Date << QDate(); + QTest::newRow("RFC 850 and 1036 invalid character 2 at front") << QString::fromLatin1("!!Sun Jan 01 08:00:00 2012 +0000") + << Qt::RFC2822Date << QDate(); + + QTest::newRow("RFC empty") << QString::fromLatin1("") << Qt::RFC2822Date << QDate(); } void tst_QDate::fromStringDateFormat() @@ -1072,6 +1127,7 @@ void tst_QDate::toStringDateFormat_data() QTest::newRow("data3") << QDate(1974,12,1) << Qt::ISODate << QString("1974-12-01"); QTest::newRow("year < 0") << QDate(-1,1,1) << Qt::ISODate << QString(); QTest::newRow("year > 9999") << QDate(-1,1,1) << Qt::ISODate << QString(); + QTest::newRow("RFC2822Date") << QDate(1974,12,1) << Qt::RFC2822Date << QString("01 Dec 1974"); } void tst_QDate::toStringDateFormat() diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp index 23c4eb33f6..a0e55e9ae1 100644 --- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp @@ -85,6 +85,8 @@ private slots: void fromMSecsSinceEpoch(); void toString_isoDate_data(); void toString_isoDate(); + void toString_rfcDate_data(); + void toString_rfcDate(); void toString_enumformat(); void toString_strformat_data(); void toString_strformat(); @@ -585,6 +587,44 @@ void tst_QDateTime::toString_isoDate() QCOMPARE(dt.toString(Qt::ISODate), formatted); } +void tst_QDateTime::toString_rfcDate_data() +{ + QTest::addColumn<QDateTime>("dt"); + QTest::addColumn<QString>("formatted"); + + if (europeanTimeZone) { + QTest::newRow("localtime") + << QDateTime(QDate(1978, 11, 9), QTime(13, 28, 34)) + << QString("09 Nov 1978 13:28:34 +0100"); + } + QTest::newRow("UTC") + << QDateTime(QDate(1978, 11, 9), QTime(13, 28, 34), Qt::UTC) + << QString("09 Nov 1978 13:28:34 +0000"); + QDateTime dt(QDate(1978, 11, 9), QTime(13, 28, 34)); + dt.setUtcOffset(19800); + QTest::newRow("positive OffsetFromUTC") + << dt + << QString("09 Nov 1978 13:28:34 +0530"); + dt.setUtcOffset(-7200); + QTest::newRow("negative OffsetFromUTC") + << dt + << QString("09 Nov 1978 13:28:34 -0200"); + QTest::newRow("invalid") + << QDateTime(QDate(1978, 13, 9), QTime(13, 28, 34), Qt::UTC) + << QString(); + QTest::newRow("999 milliseconds UTC") + << QDateTime(QDate(2000, 1, 1), QTime(13, 28, 34, 999), Qt::UTC) + << QString("01 Jan 2000 13:28:34 +0000"); +} + +void tst_QDateTime::toString_rfcDate() +{ + QFETCH(QDateTime, dt); + QFETCH(QString, formatted); + + QCOMPARE(dt.toString(Qt::RFC2822Date), formatted); +} + void tst_QDateTime::toString_enumformat() { QDateTime dt1(QDate(1995, 5, 20), QTime(12, 34, 56)); @@ -1702,6 +1742,79 @@ void tst_QDateTime::fromStringDateFormat_data() QTest::newRow("ISO .99999 of a minute (comma)") << QString::fromLatin1("2012-01-01T08:00,99999") << Qt::ISODate << QDateTime(QDate(2012, 1, 1), QTime(8, 0, 59, 999), Qt::LocalTime); QTest::newRow("ISO empty") << QString::fromLatin1("") << Qt::ISODate << invalidDateTime(); + + // Test Qt::RFC2822Date format (RFC 2822). + QTest::newRow("RFC 2822 +0100") << QString::fromLatin1("13 Feb 1987 13:24:51 +0100") + << Qt::RFC2822Date << QDateTime(QDate(1987, 2, 13), QTime(12, 24, 51), Qt::UTC); + QTest::newRow("RFC 2822 with day +0100") << QString::fromLatin1("Fri, 13 Feb 1987 13:24:51 +0100") + << Qt::RFC2822Date << QDateTime(QDate(1987, 2, 13), QTime(12, 24, 51), Qt::UTC); + QTest::newRow("RFC 2822 -0100") << QString::fromLatin1("13 Feb 1987 13:24:51 -0100") + << Qt::RFC2822Date << QDateTime(QDate(1987, 2, 13), QTime(14, 24, 51), Qt::UTC); + QTest::newRow("RFC 2822 with day -0100") << QString::fromLatin1("Fri, 13 Feb 1987 13:24:51 -0100") + << Qt::RFC2822Date << QDateTime(QDate(1987, 2, 13), QTime(14, 24, 51), Qt::UTC); + QTest::newRow("RFC 2822 +0000") << QString::fromLatin1("01 Jan 1970 00:12:34 +0000") + << Qt::RFC2822Date << QDateTime(QDate(1970, 1, 1), QTime(0, 12, 34), Qt::UTC); + QTest::newRow("RFC 2822 with day +0000") << QString::fromLatin1("Thu, 01 Jan 1970 00:12:34 +0000") + << Qt::RFC2822Date << QDateTime(QDate(1970, 1, 1), QTime(0, 12, 34), Qt::UTC); + QTest::newRow("RFC 2822 +0000") << QString::fromLatin1("01 Jan 1970 00:12:34 +0000") + << Qt::RFC2822Date << QDateTime(QDate(1970, 1, 1), QTime(0, 12, 34), Qt::UTC); + QTest::newRow("RFC 2822 with day +0000") << QString::fromLatin1("Thu, 01 Jan 1970 00:12:34 +0000") + << Qt::RFC2822Date << QDateTime(QDate(1970, 1, 1), QTime(0, 12, 34), Qt::UTC); + // No timezone assume UTC + QTest::newRow("RFC 2822 no timezone") << QString::fromLatin1("01 Jan 1970 00:12:34") + << Qt::RFC2822Date << QDateTime(QDate(1970, 1, 1), QTime(0, 12, 34), Qt::UTC); + // No time specified + QTest::newRow("RFC 2822 date only") << QString::fromLatin1("01 Nov 2002") + << Qt::RFC2822Date << invalidDateTime(); + QTest::newRow("RFC 2822 with day date only") << QString::fromLatin1("Fri, 01 Nov 2002") + << Qt::RFC2822Date << invalidDateTime(); + // Test invalid month, day, year + QTest::newRow("RFC 2822 invalid month name") << QString::fromLatin1("13 Fev 1987 13:24:51 +0100") + << Qt::RFC2822Date << invalidDateTime(); + QTest::newRow("RFC 2822 invalid day") << QString::fromLatin1("36 Fev 1987 13:24:51 +0100") + << Qt::RFC2822Date << invalidDateTime(); + QTest::newRow("RFC 2822 invalid year") << QString::fromLatin1("13 Fev 0000 13:24:51 +0100") + << Qt::RFC2822Date << invalidDateTime(); + // Test invalid characters (should ignore invalid characters at end of string). + QTest::newRow("RFC 2822 invalid character at end") << QString::fromLatin1("01 Jan 2012 08:00:00 +0100!") + << Qt::RFC2822Date << QDateTime(QDate(2012, 1, 1), QTime(7, 0, 0, 0), Qt::UTC); + QTest::newRow("RFC 2822 invalid character at front") << QString::fromLatin1("!01 Jan 2012 08:00:00 +0000") + << Qt::RFC2822Date << invalidDateTime(); + QTest::newRow("RFC 2822 invalid character both ends") << QString::fromLatin1("!01 Jan 2012 08:00:00 +0000!") + << Qt::RFC2822Date << invalidDateTime(); + QTest::newRow("RFC 2822 invalid character at front, 2 at back") << QString::fromLatin1("!01 Jan 2012 08:00:00 +0000..") + << Qt::RFC2822Date << invalidDateTime(); + QTest::newRow("RFC 2822 invalid character 2 at front") << QString::fromLatin1("!!01 Jan 2012 08:00:00 +0000") + << Qt::RFC2822Date << invalidDateTime(); + + // Test Qt::RFC2822Date format (RFC 850 and 1036). + QTest::newRow("RFC 850 and 1036 +0100") << QString::fromLatin1("Fri Feb 13 13:24:51 1987 +0100") + << Qt::RFC2822Date << QDateTime(QDate(1987, 2, 13), QTime(12, 24, 51), Qt::UTC); + QTest::newRow("RFC 850 and 1036 -0100") << QString::fromLatin1("Fri Feb 13 13:24:51 1987 -0100") + << Qt::RFC2822Date << QDateTime(QDate(1987, 2, 13), QTime(14, 24, 51), Qt::UTC); + QTest::newRow("RFC 850 and 1036 +0000") << QString::fromLatin1("Thu Jan 01 00:12:34 1970 +0000") + << Qt::RFC2822Date << QDateTime(QDate(1970, 1, 1), QTime(0, 12, 34), Qt::UTC); + QTest::newRow("RFC 850 and 1036 +0000") << QString::fromLatin1("Thu Jan 01 00:12:34 1970 +0000") + << Qt::RFC2822Date << QDateTime(QDate(1970, 1, 1), QTime(0, 12, 34), Qt::UTC); + // No timezone assume UTC + QTest::newRow("RFC 850 and 1036 no timezone") << QString::fromLatin1("Thu Jan 01 00:12:34 1970") + << Qt::RFC2822Date << QDateTime(QDate(1970, 1, 1), QTime(0, 12, 34), Qt::UTC); + // No time specified + QTest::newRow("RFC 850 and 1036 date only") << QString::fromLatin1("Fri Nov 01 2002") + << Qt::RFC2822Date << invalidDateTime(); + // Test invalid characters (should ignore invalid characters at end of string). + QTest::newRow("RFC 850 and 1036 invalid character at end") << QString::fromLatin1("Sun Jan 01 08:00:00 2012 +0100!") + << Qt::RFC2822Date << QDateTime(QDate(2012, 1, 1), QTime(7, 0, 0, 0), Qt::UTC); + QTest::newRow("RFC 850 and 1036 invalid character at front") << QString::fromLatin1("!Sun Jan 01 08:00:00 2012 +0000") + << Qt::RFC2822Date << invalidDateTime(); + QTest::newRow("RFC 850 and 1036 invalid character both ends") << QString::fromLatin1("!Sun Jan 01 08:00:00 2012 +0000!") + << Qt::RFC2822Date << invalidDateTime(); + QTest::newRow("RFC 850 and 1036 invalid character at front, 2 at back") << QString::fromLatin1("!Sun Jan 01 08:00:00 2012 +0000..") + << Qt::RFC2822Date << invalidDateTime(); + QTest::newRow("RFC 850 and 1036 invalid character 2 at front") << QString::fromLatin1("!!Sun Jan 01 08:00:00 2012 +0000") + << Qt::RFC2822Date << invalidDateTime(); + + QTest::newRow("RFC empty") << QString::fromLatin1("") << Qt::RFC2822Date << invalidDateTime(); } void tst_QDateTime::fromStringDateFormat() diff --git a/tests/auto/corelib/tools/qtime/tst_qtime.cpp b/tests/auto/corelib/tools/qtime/tst_qtime.cpp index 95aed05e7c..675aeafc06 100644 --- a/tests/auto/corelib/tools/qtime/tst_qtime.cpp +++ b/tests/auto/corelib/tools/qtime/tst_qtime.cpp @@ -600,6 +600,59 @@ void tst_QTime::fromStringDateFormat_data() QTest::newRow("IsoDate - data2") << QString("19:03:54.998601") << Qt::ISODate << QTime(19, 3, 54, 999); QTest::newRow("IsoDate - data3") << QString("19:03:54.999601") << Qt::ISODate << QTime(19, 3, 54, 999); QTest::newRow("IsoDate - minute fraction midnight") << QString("24:00,0") << Qt::ISODate << QTime(0, 0, 0, 0); + + // Test Qt::RFC2822Date format (RFC 2822). + QTest::newRow("RFC 2822") << QString::fromLatin1("13 Feb 1987 13:24:51 +0100") + << Qt::RFC2822Date << QTime(13, 24, 51); + QTest::newRow("RFC 2822 with day") << QString::fromLatin1("Thu, 01 Jan 1970 00:12:34 +0000") + << Qt::RFC2822Date << QTime(0, 12, 34); + // No timezone + QTest::newRow("RFC 2822 no timezone") << QString::fromLatin1("01 Jan 1970 00:12:34") + << Qt::RFC2822Date << QTime(0, 12, 34); + // No time specified + QTest::newRow("RFC 2822 date only") << QString::fromLatin1("01 Nov 2002") + << Qt::RFC2822Date << invalidTime(); + QTest::newRow("RFC 2822 with day date only") << QString::fromLatin1("Fri, 01 Nov 2002") + << Qt::RFC2822Date << invalidTime(); + // Test invalid month, day, year + QTest::newRow("RFC 2822 invalid month name") << QString::fromLatin1("13 Fev 1987 13:24:51 +0100") + << Qt::RFC2822Date << QTime(13, 24, 51); + QTest::newRow("RFC 2822 invalid day") << QString::fromLatin1("36 Fev 1987 13:24:51 +0100") + << Qt::RFC2822Date << QTime(13, 24, 51); + QTest::newRow("RFC 2822 invalid year") << QString::fromLatin1("13 Fev 0000 13:24:51 +0100") + << Qt::RFC2822Date << QTime(13, 24, 51); + // Test invalid characters (should ignore invalid characters at end of string). + QTest::newRow("RFC 2822 invalid character at end") << QString::fromLatin1("01 Jan 2012 08:00:00 +0100!") + << Qt::RFC2822Date << QTime(8, 0, 0); + QTest::newRow("RFC 2822 invalid character at front") << QString::fromLatin1("!01 Jan 2012 08:00:00 +0000") + << Qt::RFC2822Date << invalidTime(); + QTest::newRow("RFC 2822 invalid character both ends") << QString::fromLatin1("!01 Jan 2012 08:00:00 +0000!") + << Qt::RFC2822Date << invalidTime(); + QTest::newRow("RFC 2822 invalid character at front, 2 at back") << QString::fromLatin1("!01 Jan 2012 08:00:00 +0000..") + << Qt::RFC2822Date << invalidTime(); + QTest::newRow("RFC 2822 invalid character 2 at front") << QString::fromLatin1("!!01 Jan 2012 08:00:00 +0000") + << Qt::RFC2822Date << invalidTime(); + + // Test Qt::RFC2822Date format (RFC 850 and 1036). + QTest::newRow("RFC 850 and 1036") << QString::fromLatin1("Fri Feb 13 13:24:51 1987 +0100") + << Qt::RFC2822Date << QTime(13, 24, 51); + // No timezone + QTest::newRow("RFC 850 and 1036 no timezone") << QString::fromLatin1("Thu Jan 01 00:12:34 1970") + << Qt::RFC2822Date << QTime(0, 12, 34); + // No time specified + QTest::newRow("RFC 850 and 1036 date only") << QString::fromLatin1("Fri Nov 01 2002") + << Qt::RFC2822Date << invalidTime(); + // Test invalid characters (should ignore invalid characters at end of string). + QTest::newRow("RFC 850 and 1036 invalid character at end") << QString::fromLatin1("Sun Jan 01 08:00:00 2012 +0100!") + << Qt::RFC2822Date << QTime(8, 0, 0); + QTest::newRow("RFC 850 and 1036 invalid character at front") << QString::fromLatin1("!Sun Jan 01 08:00:00 2012 +0000") + << Qt::RFC2822Date << invalidTime(); + QTest::newRow("RFC 850 and 1036 invalid character both ends") << QString::fromLatin1("!Sun Jan 01 08:00:00 2012 +0000!") + << Qt::RFC2822Date << invalidTime(); + QTest::newRow("RFC 850 and 1036 invalid character at front, 2 at back") << QString::fromLatin1("!Sun Jan 01 08:00:00 2012 +0000..") + << Qt::RFC2822Date << invalidTime(); + + QTest::newRow("RFC empty") << QString::fromLatin1("") << Qt::RFC2822Date << invalidTime(); } void tst_QTime::fromStringDateFormat() @@ -626,6 +679,7 @@ void tst_QTime::toStringDateFormat_data() QTest::newRow("ISO 10:12:34.001") << QTime(10, 12, 34, 001) << Qt::ISODate << QString("10:12:34.001"); QTest::newRow("Text 10:12:34.999") << QTime(10, 12, 34, 999) << Qt::TextDate << QString("10:12:34.999"); QTest::newRow("ISO 10:12:34.999") << QTime(10, 12, 34, 999) << Qt::ISODate << QString("10:12:34.999"); + QTest::newRow("RFC2822Date") << QTime(10, 12, 34, 999) << Qt::RFC2822Date << QString("10:12:34"); } void tst_QTime::toStringDateFormat() diff --git a/tests/auto/gui/image/qimage/tst_qimage.cpp b/tests/auto/gui/image/qimage/tst_qimage.cpp index 2cd5216c59..7fdb2f4cba 100644 --- a/tests/auto/gui/image/qimage/tst_qimage.cpp +++ b/tests/auto/gui/image/qimage/tst_qimage.cpp @@ -728,6 +728,24 @@ void tst_QImage::convertToFormat_data() << int(QImage::Format_RGB888) << 0xffffffffu; QTest::newRow("semiblack pm -> rgb888") << int(QImage::Format_ARGB32_Premultiplied) << 0x7f000000u << int(QImage::Format_RGB888) << 0xff000000u; + + QTest::newRow("red rgba8888 -> argb32") << int(QImage::Format_RGBA8888) << 0xffff0000 + << int(QImage::Format_ARGB32) << 0xffff0000; + QTest::newRow("green rgba8888 -> argb32") << int(QImage::Format_RGBA8888) << 0xff00ff00 + << int(QImage::Format_ARGB32) << 0xff00ff00; + QTest::newRow("blue rgba8888 -> argb32") << int(QImage::Format_RGBA8888) << 0xff0000ff + << int(QImage::Format_ARGB32) << 0xff0000ff; + + QTest::newRow("semired rgba8888 -> argb pm") << int(QImage::Format_RGBA8888) << 0x7fff0000u + << int(QImage::Format_ARGB32_Premultiplied) << 0x7f7f0000u; + QTest::newRow("semigreen rgba8888 -> argb pm") << int(QImage::Format_RGBA8888) << 0x7f00ff00u + << int(QImage::Format_ARGB32_Premultiplied) << 0x7f007f00u; + QTest::newRow("semiblue rgba8888 -> argb pm") << int(QImage::Format_RGBA8888) << 0x7f0000ffu + << int(QImage::Format_ARGB32_Premultiplied) << 0x7f00007fu; + QTest::newRow("semiwhite rgba8888 -> argb pm") << int(QImage::Format_RGBA8888) << 0x7fffffffu + << int(QImage::Format_ARGB32_Premultiplied) << 0x7f7f7f7fu; + QTest::newRow("semiblack rgba8888 -> argb pm") << int(QImage::Format_RGBA8888) << 0x7f000000u + << int(QImage::Format_ARGB32_Premultiplied) << 0x7f000000u; } @@ -953,6 +971,10 @@ void tst_QImage::rotate_data() << QImage::Format_RGB888 << d; QTest::newRow(qPrintable(title.arg("Format_Indexed8"))) << QImage::Format_Indexed8 << d; + QTest::newRow(qPrintable(title.arg("Format_RGBX8888"))) + << QImage::Format_RGBX8888 << d; + QTest::newRow(qPrintable(title.arg("Format_RGBA8888_Premultiplied"))) + << QImage::Format_RGBA8888_Premultiplied << d; } } @@ -1161,6 +1183,21 @@ void tst_QImage::setPixel_data() << 0xff00ff00 << 0x00ff00u; QTest::newRow("RGB888 blue") << int(QImage::Format_RGB888) << 0xff0000ff << 0x0000ffu; +#if Q_BYTE_ORDER == Q_BIG_ENDIAN + QTest::newRow("RGBA8888 red") << int(QImage::Format_RGBA8888) + << 0xffff0000u << 0xff0000ffu; + QTest::newRow("RGBA8888 green") << int(QImage::Format_RGBA8888) + << 0xff00ff00u << 0x00ff00ffu; + QTest::newRow("RGBA8888 blue") << int(QImage::Format_RGBA8888) + << 0xff0000ffu << 0x0000ffffu; +#else + QTest::newRow("RGBA8888 red") << int(QImage::Format_RGBA8888) + << 0xffff0000u << 0xff0000ffu; + QTest::newRow("RGBA8888 green") << int(QImage::Format_RGBA8888) + << 0xff00ff00u << 0xff00ff00u; + QTest::newRow("RGBA8888 blue") << int(QImage::Format_RGBA8888) + << 0xff0000ffu << 0xffff0000u; +#endif } void tst_QImage::setPixel() @@ -1184,6 +1221,9 @@ void tst_QImage::setPixel() case int(QImage::Format_RGB32): case int(QImage::Format_ARGB32): case int(QImage::Format_ARGB32_Premultiplied): + case int(QImage::Format_RGBX8888): + case int(QImage::Format_RGBA8888): + case int(QImage::Format_RGBA8888_Premultiplied): { for (int y = 0; y < h; ++y) { const quint32 *row = (const quint32*)(img.scanLine(y)); @@ -1901,6 +1941,8 @@ void tst_QImage::fillColor_data() "RGB888", "RGB444", "ARGB4444pm", + "RGBx8888", + "RGBA8888pm", 0 }; @@ -1917,7 +1959,9 @@ void tst_QImage::fillColor_data() QImage::Format_ARGB8555_Premultiplied, QImage::Format_RGB888, QImage::Format_RGB444, - QImage::Format_ARGB4444_Premultiplied + QImage::Format_ARGB4444_Premultiplied, + QImage::Format_RGBX8888, + QImage::Format_RGBA8888_Premultiplied, }; for (int i=0; names[i] != 0; ++i) { @@ -1935,6 +1979,7 @@ void tst_QImage::fillColor_data() QTest::newRow("RGB32, transparent") << QImage::Format_RGB32 << Qt::transparent << 0xff000000; QTest::newRow("ARGB32, transparent") << QImage::Format_ARGB32 << Qt::transparent << 0x00000000u; QTest::newRow("ARGB32pm, transparent") << QImage::Format_ARGB32_Premultiplied << Qt::transparent << 0x00000000u; + QTest::newRow("RGBA8888pm, transparent") << QImage::Format_RGBA8888_Premultiplied << Qt::transparent << 0x00000000u; } void tst_QImage::fillColor() @@ -2013,6 +2058,8 @@ void tst_QImage::rgbSwapped_data() QTest::newRow("Format_ARGB8555_Premultiplied") << QImage::Format_ARGB8555_Premultiplied; QTest::newRow("Format_RGB888") << QImage::Format_RGB888; QTest::newRow("Format_RGB444") << QImage::Format_RGB444; + QTest::newRow("Format_RGBX8888") << QImage::Format_RGBX8888; + QTest::newRow("Format_RGBA8888_Premultiplied") << QImage::Format_RGBA8888_Premultiplied; } void tst_QImage::rgbSwapped() diff --git a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp index 4f1213dff9..e5ded203cf 100644 --- a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp +++ b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp @@ -2265,6 +2265,27 @@ void tst_QPainter::setOpacity_data() QTest::newRow("RGB444 on RGB444") << QImage::Format_RGB444 << QImage::Format_RGB444; + + QTest::newRow("RGBA8888P on RGBA8888P") << QImage::Format_RGBA8888_Premultiplied + << QImage::Format_RGBA8888_Premultiplied; + + QTest::newRow("RGBA8888 on RGBA8888") << QImage::Format_RGBA8888 + << QImage::Format_RGBA8888; + + QTest::newRow("RGBx8888 on RGBx8888") << QImage::Format_RGBX8888 + << QImage::Format_RGBX8888; + + QTest::newRow("RGBA8888P on ARGB32P") << QImage::Format_RGBA8888_Premultiplied + << QImage::Format_ARGB32_Premultiplied; + + QTest::newRow("RGBx8888 on ARGB32P") << QImage::Format_RGBX8888 + << QImage::Format_ARGB32_Premultiplied; + + QTest::newRow("ARGB32P on RGBA8888P") << QImage::Format_ARGB32_Premultiplied + << QImage::Format_RGBA8888_Premultiplied; + + QTest::newRow("RGB32 on RGBx8888") << QImage::Format_RGB32 + << QImage::Format_RGBX8888; } void tst_QPainter::setOpacity() diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 4443122595..e78944b5aa 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -3094,6 +3094,7 @@ void Configure::generateQConfigPri() configStream << endl; configStream << "host_build {" << endl; configStream << " QT_ARCH = " << dictionary["QT_HOST_ARCH"] << endl; + configStream << " QT_TARGET_ARCH = " << dictionary["QT_ARCH"] << endl; configStream << "} else {" << endl; configStream << " QT_ARCH = " << dictionary["QT_ARCH"] << endl; if (dictionary.contains("XQMAKESPEC") && !dictionary["XQMAKESPEC"].startsWith("wince")) { |