Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package qt6-location for openSUSE:Factory checked in at 2023-05-28 19:21:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/qt6-location (Old) and /work/SRC/openSUSE:Factory/.qt6-location.new.1533 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "qt6-location" Sun May 28 19:21:57 2023 rev:3 rq:1089089 version:6.5.1 Changes: -------- --- /work/SRC/openSUSE:Factory/qt6-location/qt6-location.changes 2023-04-06 15:56:06.328351276 +0200 +++ /work/SRC/openSUSE:Factory/.qt6-location.new.1533/qt6-location.changes 2023-05-28 19:22:14.992750459 +0200 @@ -1,0 +2,6 @@ +Wed May 24 07:45:37 UTC 2023 - Christophe Marin <[email protected]> + +- Update to 6.5.1 + * https://www.qt.io/blog/qt-6.5.1-released + +------------------------------------------------------------------- Old: ---- qtlocation-everywhere-src-6.5.0.tar.xz New: ---- qtlocation-everywhere-src-6.5.1.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ qt6-location.spec ++++++ --- /var/tmp/diff_new_pack.wTxXHY/_old 2023-05-28 19:22:15.572753911 +0200 +++ /var/tmp/diff_new_pack.wTxXHY/_new 2023-05-28 19:22:15.576753935 +0200 @@ -16,7 +16,7 @@ # -%define real_version 6.5.0 +%define real_version 6.5.1 %define short_version 6.5 %define tar_name qtlocation-everywhere-src %define tar_suffix %{nil} @@ -27,7 +27,7 @@ %endif # Name: qt6-location%{?pkg_suffix} -Version: 6.5.0 +Version: 6.5.1 Release: 0 Summary: Qt 6 Location plugins and libraries License: GPL-3.0-or-later ++++++ qtlocation-everywhere-src-6.5.0.tar.xz -> qtlocation-everywhere-src-6.5.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/.QT-ENTERPRISE-LICENSE-AGREEMENT new/qtlocation-everywhere-src-6.5.1/.QT-ENTERPRISE-LICENSE-AGREEMENT --- old/qtlocation-everywhere-src-6.5.0/.QT-ENTERPRISE-LICENSE-AGREEMENT 2023-03-29 08:45:09.037525200 +0200 +++ new/qtlocation-everywhere-src-6.5.1/.QT-ENTERPRISE-LICENSE-AGREEMENT 2023-05-22 09:05:59.448950000 +0200 @@ -1253,7 +1253,7 @@ +----------------------------------------------------------+ | Device Utilities | | | X,R | X,R | +----------------------------------------------------------+ -| Qt Debugging Bridge (QBD) Daemon | | | X,R | X,R | +| Qt Debugging Bridge (QDB) Daemon | | | X,R | X,R | +----------------------------------------------------------+ | Qt Quick Ultralite Controls | | | X,R | X,R | +----------------------------------------------------------+ @@ -1669,116 +1669,152 @@ APPENDIX 8: INTENTIONALLY LEFT BLANK APPENDIX 9: SUPPORT TERMS +Version 2023-04 -These Qt support terms and conditions ("Support Terms") set forth the legal -framework, where under The Qt Company ("The Qt Company") provides support +These Qt support terms and conditions (âSupport Termsâ) set forth the legal +framework, where under The Qt Company (âThe Qt Companyâ) provides support services (as herein defined) to the Licensee. 1 DEFINITIONS -"Application Code" shall mean a computer software program written strictly +âApplication Codeâ shall mean a computer software program written strictly using the Qt programming language, by or for the Licensee, with a user interface, enabling the Licensee or their users to accomplish a specific task and display any results of the task on the display monitor or screen. -"Dedicated Contact" shall mean the employee of The Qt Company who will be the -first point of contact for all Designated Users' requests for Support. +âCustomer Portalâ shall mean The Qt Companyâs web-based service and support +user interface located at https://account.qt.io/ or at another location +designated by The Qt Company. Customer Portal is used by a Designated User with +Qt Account, and it provides downloads, license management, license certificate +and other services for Designated Users. -"Errors" shall mean an error, flaw, mistake, failure, or fault in Licensed +âDedicated Contactâ shall mean the employee of The Qt Company who will be the +first point of contact for all Designated Usersâ requests for Support. + +âErrorsâ shall mean an error, flaw, mistake, failure, or fault in Licensed Software that prevents it from behaving as described in the relevant -documentation or as agreed between the Parties. +documentation or as agreed between the Parties. Designated User can follow the +state and progress of Errors in Customer Portal. -"Extended Support" shall mean a continuation to the normal Support period, +âExtended Supportâ shall mean a continuation to the normal Support period, which allows Designated Users to receive selected Support (Standard Support or Premium Support) for a version of Licensed Software that is no longer generally supported by The Qt Company. -"Install Support" shall mean Support that is limited to installation related +âInstall Supportâ shall mean Support that is limited to installation-related Error(s) on Development Platforms specified as supported host platforms for -each Qt release under doc.qt.io. +each Qt release under doc.qt.io. Install Support covers also operational use of +the QA Tools, but not operational use of Qt Software. -"Maintenance Release" shall mean a release or version of Licensed Software +âMaintenance Releaseâ shall mean a release or version of Licensed Software containing bug fixes, error corrections and other changes targeted to maintaining and improving product stability and quality. Maintenance Releases are generally depicted as a change to the third digit of Licensed Software version number. -"Platforms" shall mean both Development Platforms and Deployment Platforms. +âPlatformsâ shall mean both Development Platforms and Deployment Platforms. Supported host and target Platforms may vary from for each Qt release as defined under doc.qt.io. -"Premium Support" shall mean an upgraded level of Support that The Qt Company +âPremium Supportâ shall mean an upgraded level of Support that The Qt Company provides pursuant to these Support Terms to Licensee if Licensee has purchased -Premium Support instead of Standard Support. Premium Support shall always be -purchased for all Designated User(s) in the respective development team of the -Licensee. +Premium Support instead of Standard Support. Premium Support also covers what +is included in Standard Support. Premium Support shall always be purchased for +all Designated User(s) in the respective development team of the Licensee. + +âQt Accountâ shall mean the Qt Account for a Designated User used for using Qt +services and Customer Portal. A Qt Account is mapped to the Licensee company +with the corporate email domain or domains. + +âQualification Kitâ shall mean a set of documents and validation test cases +used for product certification needs as defined in section 2.6. -"Response Time" shall mean the period of time from when Licensee notifies -TheQt Company about an Error or requests Support until The Qt Company provides +âResponse Timeâ shall mean the period of time from when Licensee notifies The +Qt Company about an Error or requests Support until The Qt Company provides Licensee with a response that addresses (but not necessarily resolves) the reported Error or provides the requested Support. -"Standard Support" shall mean standard level of Support that The Qt Company -provides pursuant to these Support Terms to Licensee. +âStandard Supportâ shall mean standard level of Support that The Qt Company +provides pursuant to these Support Terms to Licensee. Standard Support also +covers what is included in Install Support. + +âSecurity Issueâ shall mean an Error that may cause a vulnerability in a system +or application that uses the Licensed Software. + +âSupportâ shall mean developer assistance that is provided by The Qt Company to +assist eligible Designated Users in Licensed Software installation, usage and +functionality problem resolution for Error(s) and Error workarounds pursuant to +the terms of these Support Terms. Support for different products is available +as specified in the below table (âXâ marking the Support that is included in +the license price, optional Add-on Support services are marked as âOâ): -"Support" shall mean developer assistance that is provided by The Qt Company -to assist eligible Designated Users in Licensed Software installation, usage -and functionality problem resolution for Error(s) and Error workarounds -pursuant to the terms of these Support Terms. Support for different products is -available as specified in the below table ("X" marking the Support that is -included in the license price, optional Add-on Support services are marked as -"O"): - -+-----------------------------------------------------------------------+ -| |ADP|ADE|DCP|DCE|DSP|DSE|Squish|Coco|Test Center| -+-----------------------------------------------------------------------+ -| Install Support | X | X | X | X | X | X | X | X | X | -+-----------------------------------------------------------------------+ -| Standard Support | | X | X | X | X | X | X | X | X | -+-----------------------------------------------------------------------+ -| Premium Support | | O | O | O | O | O | O | O | O | -+-----------------------------------------------------------------------+ -| Extended Support | | O | O | O | O | O | | | | -+-----------------------------------------------------------------------+ -| Tool Qualification Kit| | | | | | | O | O | | -+-----------------------------------------------------------------------+ ++-----------------------------------------------------------------------------+ +| | Install| Standard| Premium| Extended| Qualification| +| | Support| Support | Support| Support | Kit | ++-----------------------------------------------------------------------------+ +| DSP | X | X | O | O | | ++-----------------------------------------------------------------------------+ +| DSE | X | X | O | O | | ++-----------------------------------------------------------------------------+ +| ADP | X | | | | | ++-----------------------------------------------------------------------------+ +| ADE | X | X | O | O | | ++-----------------------------------------------------------------------------+ +| DCP | X | X | O | O | | ++-----------------------------------------------------------------------------+ +| DCE | X | X | O | O | | ++-----------------------------------------------------------------------------+ +| Squish | X | X | O | | O | ++-----------------------------------------------------------------------------+ +| Coco | X | X | O | | O | ++-----------------------------------------------------------------------------+ +| Test Center | X | X | O | | O | ++-----------------------------------------------------------------------------+ +| Axivion Suite | X | X | | | | ++-----------------------------------------------------------------------------+ +| Architecture Analysis | X | X | | | | ++-----------------------------------------------------------------------------+ +| Static Code Analysis | X | X | | | | ++-----------------------------------------------------------------------------+ +| Static Coverage | X | X | | | | +| Analysis Professional | | | | | | ++-----------------------------------------------------------------------------+ +| Qt Insight | | X | | | | ++-----------------------------------------------------------------------------+ -"Support Validity Term" shall mean the Development License Term or any other -fixed time period agreed between the Parties during which time the Customer is +âSupport Validity Termâ shall mean the Development License Term or any other +fixed time period agreed between the Parties during which time the Licensee is eligible to receive Support from The Qt Company. -"Tool Qualification Kit" shall mean a customized set of documents and -validation test cases. - 2 SUPPORT SERVICES 2.1 Support Services Provided by The Qt Company Subject to these Support Terms and during the Support Validity Term, The Qt -Company will via its web-based support user-interface, provide Designated -User(s) with Support for the Platforms which Customer has licensed under the -Agreement. -The Qt Company will make commercially reasonable efforts to solve any Errors -reported by Designated User(s). Resolution of an Error may be provided through +Company will via its Customer Portal, provide Designated User(s) with Support +for the Licensed Software which Licensee has licensed under the Agreement. The +Qt Company will make commercially reasonable efforts to solve any Errors +reported by Designated User(s). Resolution of an Error may be provided through Designated User(s) themselves downloading of a later released version of the applicable Licensed Software product(s) or providing the Designated User with a -temporary workaround addressing such Error. +workaround addressing such Error or providing the Designated User with an +updated tool configuration. 2.2 Licensee's Obligations -To report an Error, the Designated User shall register the Error on The Qt -Company's web-based support user interface located at: -https://account.qt.io/login or at another location designated by The Qt Company. +To report an Error, the Designated User shall register the Error on the +Customer Portal. If the Designated User considers the reported Error to be a +Security Issue, the Error shall be marked as a Security Issue. The Designated User must provide adequate information and documentation to The Qt Company to enable it to recreate the Error or problem for which the -Designated User has sought assistance. -To ensure efficient handling of Errors, the Designated User must provide the -following information, where relevant: +Designated User has sought assistance. To ensure efficient handling of Errors, +the Designated User must provide the following information, where relevant: - A clear, detailed description of the problem, question or suggestion; - Identification of which Licensed Software product and version is affected; - Identification of the operating environment (e.g. operating system, hardware - Platform, build tools, etc.) on which the problem exists; + Platform, build tools, tool configuration, etc.) on which the problem exists; +- Marking the issue as a Security Issue, when reporting a Security Issue; - On Standard Support: A complete and compilable test case of not more than 500 lines of code that demonstrates the problem; - On Premium Support: A complete and compilable test case that demonstrates the @@ -1800,29 +1836,30 @@ Each version or release of the Licensed Software will be Supported under Standard Support or Premium Support only for limited time period as set forth -in doc.qt.io. For example, regular releases of Qt Software are supported for -one (1) year from the release date of the version x.y.0 and Long Term Support -(LTS) Releases are supported for a period of three (3) years from the release -date of the LTS version x.y.0. - -The Qt Company shall only provide Support for Designated User(s). - -Support is made available for the entire development teams only: It is not -allowed to purchase Support only for some members of the development team, and -all Designated Users of the respective development team must be eligible for -the same level of Support. +in doc.qt.io or in documentation provided with the respective Licensed Software +product. If nothing is documented, a release of Licensed Software is supported +for one (1) year from the release date of the version x.y.0 and Long Term +Support (LTS) Releases are supported for a period of three (3) years from the +release date of the LTS version x.y.0. + +The Qt Company shall only provide Support for Designated User(s) through +Customer Portal.Support is made available for the entire development teams +only: It is not allowed to purchase Support only for some members of the +development team, and all Designated Users of the respective development team +must be eligible for the same level of Support. Support is not provided for snapshots, preview releases, beta releases or release candidates. -The Qt Company shall have no obligation to provide Support for hardware or -operating system specific problems or problems arising from improper use, -accident, neglect or modification of Qt. +The Qt Company shall have no obligation to provide Support for 3rd party +components, hardware or operating system specific problems or problems arising +from improper use, accident, neglect, or modification of Qt. Limitations with Install Support: -Support limited to Error(s) regarding installation and setting up of the Qt -development environment on host Platforms. +Support limited to (i) Error(s) regarding installation and setting up of the Qt +development environment on host Platforms, or (ii) Errors impacting operational +use of the QA Tools. Limitations with Standard Support: @@ -1848,31 +1885,60 @@ corresponding supported Platform. Premium Support is optional and purchased for an agreed bucket of hours -("Bucket"). Hours can be used by any Designated User in the respective +(âBucketâ). Hours can be used by any Designated User in the respective development team. To encourage continuous usage of the Support, ten percent (10%) of the purchased Bucket shall automatically expire (regardless of whether such support hours are actually used or not by the Licensee) each month after three (3) months from the purchase of the Premium Support. -2.4 Extended Support +2.4 Handling of Security Issues + +The reported Errors marked as Security Issues will be assessed by experts to +determine the severity of the issue and to verify if it indeed is a valid +Security Issue. The Designated User who reported the issue may be contacted for +more details. If the reported issue is not deemed to be a Security Issue, it +will be treated as a normal Error and handled accordingly. + +A verified Security Issue will be fixed as soon as possible. Qt Company will +notify all Licensees via appropriate channels about the Security Errors and +availability of patches for Licensed Software. Typically, a fix for the +Security Issue is included in the next Maintenance Release of Licensed +Software. + +If the Security Issue is reported in a third-party library used in Licensed +Software, The Qt Company will notify the relevant third party of such Security +Issue detected in their library. When the Security Issue is fixed in the +third-party library, the new version of the third-party library will be in the +next feasible Maintenance Release of the Licensed Software. If a fixed version +of the third-party library is not available, The Qt Company may instead decide +to include documentation regarding the issue, or a patch for this third-party +library. + +All known Security Issues in Licensed Software will be mentioned as part of the +change notes released with each version of Licensed Software. + +2.5 Extended Support Extended Support extends the Support Validity Term for a release of Licensed Software that is no longer generally supported. Extended Support includes and is by default provided with Standard Support -rules and limitations, unless Extended Support is purchased with Premium -Support in which case Premium Support rules and limitations will apply. +rules and limitations, unless Extended Support is purchased together with +Premium Support in which case Premium Support rules and limitations will apply. Extended Support is optional and purchased with annual fee and separately per each Licensee product. Extended Support will need definition of (i) Licensee -product, (ii) used Platform(s) and (iii) Licensed Software version(s). - -2.5 Tool Qualification Kit - -The Qt Company shall provide set of customized documents and validation tests -that enable Licensee to qualify QA testing tool for the purpose of ISO 26262, -EN 50128, DO-330, IEC 61508, IEC 62304 or IEC 13485 certification Licensee end -to end solution. +product, (ii) used Platform(s) and (iii) Licensed Software version(s). For +avoidance of doubt, Extended Support requires that the Designated User has a +valid license for the respective Licensed Software. + +2.6 Qualification Kit + +The Qt Company shall provide a set of documents and validation tests that +enable the Licensee to qualify QA testing tool (subject to a separate fee) or +Qt Safe Renderer for the purpose of safety certification of Licensee end-to-end +solution. Exact complied safety standards may vary between products, used +features, use case, and industry. 3 RESPONSE TIME @@ -1885,6 +1951,9 @@ Premium Support: Errors and Support requests will have a Response Time not to exceed one (1) business day. +Security Issues: Errors that are Security Issues will have a Response Time not +to exceed one (1) business day. + For complex issues, The Qt Company may provide an initial response to the Designated User and then follow up, without undue delay, with additional communication before an Error is properly addressed or Support provided. @@ -1908,7 +1977,7 @@ 5 MAINTENANCE RELEASES, UPDATES AND UPGRADES -Under the Support the Customer is eligible for Maintenance Releases and Updates +Under the Support the Licensee is eligible for Maintenance Releases and Updates that The Qt Company generally makes available to customers who has purchased Support. Unless otherwise decided by The Company at its free and absolute discretion, Upgrades will not be provided under the Support. @@ -1920,6 +1989,7 @@ - Fixes related to build issues on supported Platforms; - Error corrections specific to a single Platform that are not present on other Platforms; +- Corrections to Security Issues; - Critical Error corrections such as crashes, data corruption, loss of data, race conditions; and - Updates to documentation and license information when deemed necessary by diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/.cmake.conf new/qtlocation-everywhere-src-6.5.1/.cmake.conf --- old/qtlocation-everywhere-src-6.5.0/.cmake.conf 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/.cmake.conf 2023-05-16 12:32:21.000000000 +0200 @@ -1,4 +1,4 @@ -set(QT_REPO_MODULE_VERSION "6.5.0") +set(QT_REPO_MODULE_VERSION "6.5.1") set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1") list(APPEND QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_AS_CONST=1") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/.tag new/qtlocation-everywhere-src-6.5.1/.tag --- old/qtlocation-everywhere-src-6.5.0/.tag 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/.tag 2023-05-16 12:32:21.000000000 +0200 @@ -1 +1 @@ -5278743537696d343633e771606a61b712573563 +e84dd5b2b1a7fedd8f0da8c7ab952224909680aa diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/CMakeLists.txt new/qtlocation-everywhere-src-6.5.1/CMakeLists.txt --- old/qtlocation-everywhere-src-6.5.0/CMakeLists.txt 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/CMakeLists.txt 2023-05-16 12:32:21.000000000 +0200 @@ -1,5 +1,3 @@ -# Generated from qtlocation.pro. - cmake_minimum_required(VERSION 3.16) include(.cmake.conf) @@ -13,7 +11,7 @@ # Make sure we use the fixed BASE argument of qt_add_resource. set(QT_USE_FIXED_QT_ADD_RESOURCE_BASE TRUE) -find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core) # special case +find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core) if(WASM) message(NOTICE "Skipping the build as the condition \"NOT WASM\" is not met.") @@ -27,11 +25,23 @@ # Need to search for positioning only after we make sure that it's not WASM. # Otherwise we'll get an "QtPositioning not found" error in WASM build. -find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS +find_package(Qt6 ${PROJECT_VERSION} CONFIG OPTIONAL_COMPONENTS Qml Quick Network Test QuickTest Positioning PositioningQuick QuickShapesPrivate ) + find_package(Qt6 ${PROJECT_VERSION} QUIET CONFIG OPTIONAL_COMPONENTS ShaderTools ) +macro(assertTargets) + foreach(qtTarget IN ITEMS ${ARGN}) + if(NOT TARGET Qt::${qtTarget}) + message(NOTICE "Skipping the build as the condition \"TARGET Qt::${qtTarget}\" is not met.") + return() + endif() + endforeach() +endmacro() + +assertTargets(Qml Quick Network Test QuickTest Positioning PositioningQuick QuickShapesPrivate) + qt_build_repo() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/dependencies.yaml new/qtlocation-everywhere-src-6.5.1/dependencies.yaml --- old/qtlocation-everywhere-src-6.5.0/dependencies.yaml 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/dependencies.yaml 2023-05-16 12:32:21.000000000 +0200 @@ -1,10 +1,10 @@ dependencies: ../qtbase: - ref: aea92807be2567c4212b96ae67de7137075ba4ee + ref: 55aee8697512af105dfefabc1e2ec41d4df1e45e required: true ../qtdeclarative: - ref: 3238e18d6b0dc45d2e765fb0b93da5cbf3f396ec + ref: 65651dc1d333e2aded18b0d6f0b71c35e5b40c1c required: true ../qtpositioning: - ref: 6765596a400cfd1a082736b78dc30bcfd3712aaa + ref: 9e27d2e7a6e26d0afc6f8ecf0df0c4cc5db52c44 required: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/examples/location/minimal_map/main.qml new/qtlocation-everywhere-src-6.5.1/examples/location/minimal_map/main.qml --- old/qtlocation-everywhere-src-6.5.0/examples/location/minimal_map/main.qml 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/examples/location/minimal_map/main.qml 2023-05-16 12:32:21.000000000 +0200 @@ -43,6 +43,12 @@ } WheelHandler { id: wheel + // workaround for QTBUG-87646 / QTBUG-112394 / QTBUG-112432: + // Magic Mouse pretends to be a trackpad but doesn't work with PinchHandler + // and we don't yet distinguish mice and trackpads on Wayland either + acceptedDevices: Qt.platform.pluginName === "cocoa" || Qt.platform.pluginName === "wayland" + ? PointerDevice.Mouse | PointerDevice.TouchPad + : PointerDevice.Mouse rotationScale: 1/120 property: "zoomLevel" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/src/3rdparty/earcut/LICENSE new/qtlocation-everywhere-src-6.5.1/src/3rdparty/earcut/LICENSE --- old/qtlocation-everywhere-src-6.5.0/src/3rdparty/earcut/LICENSE 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/src/3rdparty/earcut/LICENSE 1970-01-01 01:00:00.000000000 +0100 @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2015, Mapbox - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/src/3rdparty/earcut/earcut.hpp new/qtlocation-everywhere-src-6.5.1/src/3rdparty/earcut/earcut.hpp --- old/qtlocation-everywhere-src-6.5.0/src/3rdparty/earcut/earcut.hpp 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/src/3rdparty/earcut/earcut.hpp 1970-01-01 01:00:00.000000000 +0100 @@ -1,837 +0,0 @@ -/**************************************************************************** -** earcut.hpp v2.2.1 -** -** ISC License -** -** Copyright (c) 2015, Mapbox -** -** Permission to use, copy, modify, and/or distribute this software for any purpose -** with or without fee is hereby granted, provided that the above copyright notice -** and this permission notice appear in all copies. -** -** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -** REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -** FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -** INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -** OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -** THIS SOFTWARE. -****************************************************************************/ - -#pragma once -#ifndef EARCUT_HPP -#define EARCUT_HPP - -#pragma once - -#include <algorithm> -#include <cassert> -#include <cmath> -#include <memory> -#include <vector> - -namespace qt_mapbox { - -namespace util { - -template <std::size_t I, typename T> struct nth { - inline static typename std::tuple_element<I, T>::type - get(const T& t) { return std::get<I>(t); }; -}; - -} - -namespace detail { - -template <typename N = uint32_t> -class Earcut { -public: - std::vector<N> indices; - std::size_t vertices = 0; - - template <typename Polygon> - void operator()(const Polygon& points); - -private: - struct Node { - Node(N index, double x_, double y_) : i(index), x(x_), y(y_) {} - Node(const Node&) = delete; - Node& operator=(const Node&) = delete; - Node(Node&&) = delete; - Node& operator=(Node&&) = delete; - - const N i; - const double x; - const double y; - - // previous and next vertice nodes in a polygon ring - Node* prev = nullptr; - Node* next = nullptr; - - // z-order curve value - int32_t z = 0; - - // previous and next nodes in z-order - Node* prevZ = nullptr; - Node* nextZ = nullptr; - - // indicates whether this is a steiner point - bool steiner = false; - }; - - template <typename Ring> Node* linkedList(const Ring& points, const bool clockwise); - Node* filterPoints(Node* start, Node* end = nullptr); - void earcutLinked(Node* ear, int pass = 0); - bool isEar(Node* ear); - bool isEarHashed(Node* ear); - Node* cureLocalIntersections(Node* start); - void splitEarcut(Node* start); - template <typename Polygon> Node* eliminateHoles(const Polygon& points, Node* outerNode); - void eliminateHole(Node* hole, Node* outerNode); - Node* findHoleBridge(Node* hole, Node* outerNode); - bool sectorContainsSector(const Node* m, const Node* p); - void indexCurve(Node* start); - Node* sortLinked(Node* list); - int32_t zOrder(const double x_, const double y_); - Node* getLeftmost(Node* start); - bool pointInTriangle(double ax, double ay, double bx, double by, double cx, double cy, double px, double py) const; - bool isValidDiagonal(Node* a, Node* b); - double area(const Node* p, const Node* q, const Node* r) const; - bool equals(const Node* p1, const Node* p2); - bool intersects(const Node* p1, const Node* q1, const Node* p2, const Node* q2); - bool onSegment(const Node* p, const Node* q, const Node* r); - int sign(double val); - bool intersectsPolygon(const Node* a, const Node* b); - bool locallyInside(const Node* a, const Node* b); - bool middleInside(const Node* a, const Node* b); - Node* splitPolygon(Node* a, Node* b); - template <typename Point> Node* insertNode(std::size_t i, const Point& p, Node* last); - void removeNode(Node* p); - - bool hashing; - double minX, maxX; - double minY, maxY; - double inv_size = 0; - - template <typename T, typename Alloc = std::allocator<T>> - class ObjectPool { - public: - ObjectPool() { } - ObjectPool(std::size_t blockSize_) { - reset(blockSize_); - } - ~ObjectPool() { - clear(); - } - template <typename... Args> - T* construct(Args&&... args) { - if (currentIndex >= blockSize) { - currentBlock = alloc_traits::allocate(alloc, blockSize); - allocations.emplace_back(currentBlock); - currentIndex = 0; - } - T* object = ¤tBlock[currentIndex++]; - alloc_traits::construct(alloc, object, std::forward<Args>(args)...); - return object; - } - void reset(std::size_t newBlockSize) { - for (auto allocation : allocations) { - alloc_traits::deallocate(alloc, allocation, blockSize); - } - allocations.clear(); - blockSize = std::max<std::size_t>(1, newBlockSize); - currentBlock = nullptr; - currentIndex = blockSize; - } - void clear() { reset(blockSize); } - private: - T* currentBlock = nullptr; - std::size_t currentIndex = 1; - std::size_t blockSize = 1; - std::vector<T*> allocations; - Alloc alloc; - typedef typename std::allocator_traits<Alloc> alloc_traits; - }; - ObjectPool<Node> nodes; -}; - -template <typename N> template <typename Polygon> -void Earcut<N>::operator()(const Polygon& points) { - // reset - indices.clear(); - vertices = 0; - - if (points.empty()) return; - - double x; - double y; - int threshold = 80; - std::size_t len = 0; - - for (size_t i = 0; threshold >= 0 && i < points.size(); i++) { - threshold -= static_cast<int>(points[i].size()); - len += points[i].size(); - } - - //estimate size of nodes and indices - nodes.reset(len * 3 / 2); - indices.reserve(len + points[0].size()); - - Node* outerNode = linkedList(points[0], true); - if (!outerNode || outerNode->prev == outerNode->next) return; - - if (points.size() > 1) outerNode = eliminateHoles(points, outerNode); - - // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox - hashing = threshold < 0; - if (hashing) { - Node* p = outerNode->next; - minX = maxX = outerNode->x; - minY = maxY = outerNode->y; - do { - x = p->x; - y = p->y; - minX = std::min<double>(minX, x); - minY = std::min<double>(minY, y); - maxX = std::max<double>(maxX, x); - maxY = std::max<double>(maxY, y); - p = p->next; - } while (p != outerNode); - - // minX, minY and size are later used to transform coords into integers for z-order calculation - inv_size = std::max<double>(maxX - minX, maxY - minY); - inv_size = inv_size != .0 ? (1. / inv_size) : .0; - } - - earcutLinked(outerNode); - - nodes.clear(); -} - -// create a circular doubly linked list from polygon points in the specified winding order -template <typename N> template <typename Ring> -typename Earcut<N>::Node* -Earcut<N>::linkedList(const Ring& points, const bool clockwise) { - using Point = typename Ring::value_type; - double sum = 0; - const std::size_t len = points.size(); - std::size_t i, j; - Node* last = nullptr; - - // calculate original winding order of a polygon ring - for (i = 0, j = len > 0 ? len - 1 : 0; i < len; j = i++) { - const auto& p1 = points[i]; - const auto& p2 = points[j]; - const double p20 = util::nth<0, Point>::get(p2); - const double p10 = util::nth<0, Point>::get(p1); - const double p11 = util::nth<1, Point>::get(p1); - const double p21 = util::nth<1, Point>::get(p2); - sum += (p20 - p10) * (p11 + p21); - } - - // link points into circular doubly-linked list in the specified winding order - if (clockwise == (sum > 0)) { - for (i = 0; i < len; i++) last = insertNode(vertices + i, points[i], last); - } else { - for (i = len; i-- > 0;) last = insertNode(vertices + i, points[i], last); - } - - if (last && equals(last, last->next)) { - removeNode(last); - last = last->next; - } - - vertices += len; - - return last; -} - -// eliminate colinear or duplicate points -template <typename N> -typename Earcut<N>::Node* -Earcut<N>::filterPoints(Node* start, Node* end) { - if (!end) end = start; - - Node* p = start; - bool again; - do { - again = false; - - if (!p->steiner && (equals(p, p->next) || area(p->prev, p, p->next) == 0)) { - removeNode(p); - p = end = p->prev; - - if (p == p->next) break; - again = true; - - } else { - p = p->next; - } - } while (again || p != end); - - return end; -} - -// main ear slicing loop which triangulates a polygon (given as a linked list) -template <typename N> -void Earcut<N>::earcutLinked(Node* ear, int pass) { - if (!ear) return; - - // interlink polygon nodes in z-order - if (!pass && hashing) indexCurve(ear); - - Node* stop = ear; - Node* prev; - Node* next; - - int iterations = 0; - - // iterate through ears, slicing them one by one - while (ear->prev != ear->next) { - iterations++; - prev = ear->prev; - next = ear->next; - - if (hashing ? isEarHashed(ear) : isEar(ear)) { - // cut off the triangle - indices.emplace_back(prev->i); - indices.emplace_back(ear->i); - indices.emplace_back(next->i); - - removeNode(ear); - - // skipping the next vertice leads to less sliver triangles - ear = next->next; - stop = next->next; - - continue; - } - - ear = next; - - // if we looped through the whole remaining polygon and can't find any more ears - if (ear == stop) { - // try filtering points and slicing again - if (!pass) earcutLinked(filterPoints(ear), 1); - - // if this didn't work, try curing all small self-intersections locally - else if (pass == 1) { - ear = cureLocalIntersections(filterPoints(ear)); - earcutLinked(ear, 2); - - // as a last resort, try splitting the remaining polygon into two - } else if (pass == 2) splitEarcut(ear); - - break; - } - } -} - -// check whether a polygon node forms a valid ear with adjacent nodes -template <typename N> -bool Earcut<N>::isEar(Node* ear) { - const Node* a = ear->prev; - const Node* b = ear; - const Node* c = ear->next; - - if (area(a, b, c) >= 0) return false; // reflex, can't be an ear - - // now make sure we don't have other points inside the potential ear - Node* p = ear->next->next; - - while (p != ear->prev) { - if (pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) && - area(p->prev, p, p->next) >= 0) return false; - p = p->next; - } - - return true; -} - -template <typename N> -bool Earcut<N>::isEarHashed(Node* ear) { - const Node* a = ear->prev; - const Node* b = ear; - const Node* c = ear->next; - - if (area(a, b, c) >= 0) return false; // reflex, can't be an ear - - // triangle bbox; min & max are calculated like this for speed - const double minTX = std::min<double>(a->x, std::min<double>(b->x, c->x)); - const double minTY = std::min<double>(a->y, std::min<double>(b->y, c->y)); - const double maxTX = std::max<double>(a->x, std::max<double>(b->x, c->x)); - const double maxTY = std::max<double>(a->y, std::max<double>(b->y, c->y)); - - // z-order range for the current triangle bbox; - const int32_t minZ = zOrder(minTX, minTY); - const int32_t maxZ = zOrder(maxTX, maxTY); - - // first look for points inside the triangle in increasing z-order - Node* p = ear->nextZ; - - while (p && p->z <= maxZ) { - if (p != ear->prev && p != ear->next && - pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) && - area(p->prev, p, p->next) >= 0) return false; - p = p->nextZ; - } - - // then look for points in decreasing z-order - p = ear->prevZ; - - while (p && p->z >= minZ) { - if (p != ear->prev && p != ear->next && - pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) && - area(p->prev, p, p->next) >= 0) return false; - p = p->prevZ; - } - - return true; -} - -// go through all polygon nodes and cure small local self-intersections -template <typename N> -typename Earcut<N>::Node* -Earcut<N>::cureLocalIntersections(Node* start) { - Node* p = start; - do { - Node* a = p->prev; - Node* b = p->next->next; - - // a self-intersection where edge (v[i-1],v[i]) intersects (v[i+1],v[i+2]) - if (!equals(a, b) && intersects(a, p, p->next, b) && locallyInside(a, b) && locallyInside(b, a)) { - indices.emplace_back(a->i); - indices.emplace_back(p->i); - indices.emplace_back(b->i); - - // remove two nodes involved - removeNode(p); - removeNode(p->next); - - p = start = b; - } - p = p->next; - } while (p != start); - - return filterPoints(p); -} - -// try splitting polygon into two and triangulate them independently -template <typename N> -void Earcut<N>::splitEarcut(Node* start) { - // look for a valid diagonal that divides the polygon into two - Node* a = start; - do { - Node* b = a->next->next; - while (b != a->prev) { - if (a->i != b->i && isValidDiagonal(a, b)) { - // split the polygon in two by the diagonal - Node* c = splitPolygon(a, b); - - // filter colinear points around the cuts - a = filterPoints(a, a->next); - c = filterPoints(c, c->next); - - // run earcut on each half - earcutLinked(a); - earcutLinked(c); - return; - } - b = b->next; - } - a = a->next; - } while (a != start); -} - -// link every hole into the outer loop, producing a single-ring polygon without holes -template <typename N> template <typename Polygon> -typename Earcut<N>::Node* -Earcut<N>::eliminateHoles(const Polygon& points, Node* outerNode) { - const size_t len = points.size(); - - std::vector<Node*> queue; - for (size_t i = 1; i < len; i++) { - Node* list = linkedList(points[i], false); - if (list) { - if (list == list->next) list->steiner = true; - queue.push_back(getLeftmost(list)); - } - } - std::sort(queue.begin(), queue.end(), [](const Node* a, const Node* b) { - return a->x < b->x; - }); - - // process holes from left to right - for (size_t i = 0; i < queue.size(); i++) { - eliminateHole(queue[i], outerNode); - outerNode = filterPoints(outerNode, outerNode->next); - } - - return outerNode; -} - -// find a bridge between vertices that connects hole with an outer ring and and link it -template <typename N> -void Earcut<N>::eliminateHole(Node* hole, Node* outerNode) { - outerNode = findHoleBridge(hole, outerNode); - if (outerNode) { - Node* b = splitPolygon(outerNode, hole); - filterPoints(b, b->next); - } -} - -// David Eberly's algorithm for finding a bridge between hole and outer polygon -template <typename N> -typename Earcut<N>::Node* -Earcut<N>::findHoleBridge(Node* hole, Node* outerNode) { - Node* p = outerNode; - double hx = hole->x; - double hy = hole->y; - double qx = -std::numeric_limits<double>::infinity(); - Node* m = nullptr; - - // find a segment intersected by a ray from the hole's leftmost Vertex to the left; - // segment's endpoint with lesser x will be potential connection Vertex - do { - if (hy <= p->y && hy >= p->next->y && p->next->y != p->y) { - double x = p->x + (hy - p->y) * (p->next->x - p->x) / (p->next->y - p->y); - if (x <= hx && x > qx) { - qx = x; - if (x == hx) { - if (hy == p->y) return p; - if (hy == p->next->y) return p->next; - } - m = p->x < p->next->x ? p : p->next; - } - } - p = p->next; - } while (p != outerNode); - - if (!m) return 0; - - if (hx == qx) return m; // hole touches outer segment; pick leftmost endpoint - - // look for points inside the triangle of hole Vertex, segment intersection and endpoint; - // if there are no points found, we have a valid connection; - // otherwise choose the Vertex of the minimum angle with the ray as connection Vertex - - const Node* stop = m; - double tanMin = std::numeric_limits<double>::infinity(); - double tanCur = 0; - - p = m; - double mx = m->x; - double my = m->y; - - do { - if (hx >= p->x && p->x >= mx && hx != p->x && - pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p->x, p->y)) { - - tanCur = std::abs(hy - p->y) / (hx - p->x); // tangential - - if (locallyInside(p, hole) && - (tanCur < tanMin || (tanCur == tanMin && (p->x > m->x || sectorContainsSector(m, p))))) { - m = p; - tanMin = tanCur; - } - } - - p = p->next; - } while (p != stop); - - return m; -} - -// whether sector in vertex m contains sector in vertex p in the same coordinates -template <typename N> -bool Earcut<N>::sectorContainsSector(const Node* m, const Node* p) { - return area(m->prev, m, p->prev) < 0 && area(p->next, m, m->next) < 0; -} - -// interlink polygon nodes in z-order -template <typename N> -void Earcut<N>::indexCurve(Node* start) { - assert(start); - Node* p = start; - - do { - p->z = p->z ? p->z : zOrder(p->x, p->y); - p->prevZ = p->prev; - p->nextZ = p->next; - p = p->next; - } while (p != start); - - p->prevZ->nextZ = nullptr; - p->prevZ = nullptr; - - sortLinked(p); -} - -// Simon Tatham's linked list merge sort algorithm -// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html -template <typename N> -typename Earcut<N>::Node* -Earcut<N>::sortLinked(Node* list) { - assert(list); - Node* p; - Node* q; - Node* e; - Node* tail; - int i, numMerges, pSize, qSize; - int inSize = 1; - - for (;;) { - p = list; - list = nullptr; - tail = nullptr; - numMerges = 0; - - while (p) { - numMerges++; - q = p; - pSize = 0; - for (i = 0; i < inSize; i++) { - pSize++; - q = q->nextZ; - if (!q) break; - } - - qSize = inSize; - - while (pSize > 0 || (qSize > 0 && q)) { - - if (pSize == 0) { - e = q; - q = q->nextZ; - qSize--; - } else if (qSize == 0 || !q) { - e = p; - p = p->nextZ; - pSize--; - } else if (p->z <= q->z) { - e = p; - p = p->nextZ; - pSize--; - } else { - e = q; - q = q->nextZ; - qSize--; - } - - if (tail) tail->nextZ = e; - else list = e; - - e->prevZ = tail; - tail = e; - } - - p = q; - } - - tail->nextZ = nullptr; - - if (numMerges <= 1) return list; - - inSize *= 2; - } -} - -// z-order of a Vertex given coords and size of the data bounding box -template <typename N> -int32_t Earcut<N>::zOrder(const double x_, const double y_) { - // coords are transformed into non-negative 15-bit integer range - int32_t x = static_cast<int32_t>(32767.0 * (x_ - minX) * inv_size); - int32_t y = static_cast<int32_t>(32767.0 * (y_ - minY) * inv_size); - - x = (x | (x << 8)) & 0x00FF00FF; - x = (x | (x << 4)) & 0x0F0F0F0F; - x = (x | (x << 2)) & 0x33333333; - x = (x | (x << 1)) & 0x55555555; - - y = (y | (y << 8)) & 0x00FF00FF; - y = (y | (y << 4)) & 0x0F0F0F0F; - y = (y | (y << 2)) & 0x33333333; - y = (y | (y << 1)) & 0x55555555; - - return x | (y << 1); -} - -// find the leftmost node of a polygon ring -template <typename N> -typename Earcut<N>::Node* -Earcut<N>::getLeftmost(Node* start) { - Node* p = start; - Node* leftmost = start; - do { - if (p->x < leftmost->x || (p->x == leftmost->x && p->y < leftmost->y)) - leftmost = p; - p = p->next; - } while (p != start); - - return leftmost; -} - -// check if a point lies within a convex triangle -template <typename N> -bool Earcut<N>::pointInTriangle(double ax, double ay, double bx, double by, double cx, double cy, double px, double py) const { - return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && - (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && - (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; -} - -// check if a diagonal between two polygon nodes is valid (lies in polygon interior) -template <typename N> -bool Earcut<N>::isValidDiagonal(Node* a, Node* b) { - return a->next->i != b->i && a->prev->i != b->i && !intersectsPolygon(a, b) && // dones't intersect other edges - ((locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible - (area(a->prev, a, b->prev) != 0.0 || area(a, b->prev, b) != 0.0)) || // does not create opposite-facing sectors - (equals(a, b) && area(a->prev, a, a->next) > 0 && area(b->prev, b, b->next) > 0)); // special zero-length case -} - -// signed area of a triangle -template <typename N> -double Earcut<N>::area(const Node* p, const Node* q, const Node* r) const { - return (q->y - p->y) * (r->x - q->x) - (q->x - p->x) * (r->y - q->y); -} - -// check if two points are equal -template <typename N> -bool Earcut<N>::equals(const Node* p1, const Node* p2) { - return p1->x == p2->x && p1->y == p2->y; -} - -// check if two segments intersect -template <typename N> -bool Earcut<N>::intersects(const Node* p1, const Node* q1, const Node* p2, const Node* q2) { - int o1 = sign(area(p1, q1, p2)); - int o2 = sign(area(p1, q1, q2)); - int o3 = sign(area(p2, q2, p1)); - int o4 = sign(area(p2, q2, q1)); - - if (o1 != o2 && o3 != o4) return true; // general case - - if (o1 == 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1 - if (o2 == 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1 - if (o3 == 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2 - if (o4 == 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2 - - return false; -} - -// for collinear points p, q, r, check if point q lies on segment pr -template <typename N> -bool Earcut<N>::onSegment(const Node* p, const Node* q, const Node* r) { - return q->x <= std::max<double>(p->x, r->x) && - q->x >= std::min<double>(p->x, r->x) && - q->y <= std::max<double>(p->y, r->y) && - q->y >= std::min<double>(p->y, r->y); -} - -template <typename N> -int Earcut<N>::sign(double val) { - return (0.0 < val) - (val < 0.0); -} - -// check if a polygon diagonal intersects any polygon segments -template <typename N> -bool Earcut<N>::intersectsPolygon(const Node* a, const Node* b) { - const Node* p = a; - do { - if (p->i != a->i && p->next->i != a->i && p->i != b->i && p->next->i != b->i && - intersects(p, p->next, a, b)) return true; - p = p->next; - } while (p != a); - - return false; -} - -// check if a polygon diagonal is locally inside the polygon -template <typename N> -bool Earcut<N>::locallyInside(const Node* a, const Node* b) { - return area(a->prev, a, a->next) < 0 ? - area(a, b, a->next) >= 0 && area(a, a->prev, b) >= 0 : - area(a, b, a->prev) < 0 || area(a, a->next, b) < 0; -} - -// check if the middle Vertex of a polygon diagonal is inside the polygon -template <typename N> -bool Earcut<N>::middleInside(const Node* a, const Node* b) { - const Node* p = a; - bool inside = false; - double px = (a->x + b->x) / 2; - double py = (a->y + b->y) / 2; - do { - if (((p->y > py) != (p->next->y > py)) && p->next->y != p->y && - (px < (p->next->x - p->x) * (py - p->y) / (p->next->y - p->y) + p->x)) - inside = !inside; - p = p->next; - } while (p != a); - - return inside; -} - -// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits -// polygon into two; if one belongs to the outer ring and another to a hole, it merges it into a -// single ring -template <typename N> -typename Earcut<N>::Node* -Earcut<N>::splitPolygon(Node* a, Node* b) { - Node* a2 = nodes.construct(a->i, a->x, a->y); - Node* b2 = nodes.construct(b->i, b->x, b->y); - Node* an = a->next; - Node* bp = b->prev; - - a->next = b; - b->prev = a; - - a2->next = an; - an->prev = a2; - - b2->next = a2; - a2->prev = b2; - - bp->next = b2; - b2->prev = bp; - - return b2; -} - -// create a node and util::optionally link it with previous one (in a circular doubly linked list) -template <typename N> template <typename Point> -typename Earcut<N>::Node* -Earcut<N>::insertNode(std::size_t i, const Point& pt, Node* last) { - Node* p = nodes.construct(static_cast<N>(i), util::nth<0, Point>::get(pt), util::nth<1, Point>::get(pt)); - - if (!last) { - p->prev = p; - p->next = p; - - } else { - assert(last); - p->next = last->next; - p->prev = last; - last->next->prev = p; - last->next = p; - } - return p; -} - -template <typename N> -void Earcut<N>::removeNode(Node* p) { - p->next->prev = p->prev; - p->prev->next = p->next; - - if (p->prevZ) p->prevZ->nextZ = p->nextZ; - if (p->nextZ) p->nextZ->prevZ = p->prevZ; -} -} - -template <typename N = uint32_t, typename Polygon> -std::vector<N> earcut(const Polygon& poly) { - qt_mapbox::detail::Earcut<N> earcut; - earcut(poly); - return std::move(earcut.indices); -} -} - -#endif //EARCUT_HPP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/src/3rdparty/earcut/qt_attribution.json new/qtlocation-everywhere-src-6.5.1/src/3rdparty/earcut/qt_attribution.json --- old/qtlocation-everywhere-src-6.5.0/src/3rdparty/earcut/qt_attribution.json 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/src/3rdparty/earcut/qt_attribution.json 1970-01-01 01:00:00.000000000 +0100 @@ -1,13 +0,0 @@ -{ - "Id": "earcut", - "Name": "Earcut Polygon Triangulation Library", - "QDocModule": "qtlocation", - "QtUsage": "Used in the QML plugin of Qt Location.", - - "Description": "A C++ port of earcut.js, a fast, header-only polygon triangulation library.", - "Homepage": "https://github.com/mapbox/earcut.hpp", - "LicenseId": "ISC", - "License": "ISC License", - "LicenseFile": "LICENSE", - "Copyright": "Copyright (c) 2015 Mapbox" -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/src/3rdparty/geosimplify.js/LICENSE new/qtlocation-everywhere-src-6.5.1/src/3rdparty/geosimplify.js/LICENSE --- old/qtlocation-everywhere-src-6.5.0/src/3rdparty/geosimplify.js/LICENSE 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/src/3rdparty/geosimplify.js/LICENSE 1970-01-01 01:00:00.000000000 +0100 @@ -1,27 +0,0 @@ -Qt port of geosimplify.js, https://github.com/mapbox/geosimplify-js - -Copyright (c) 2017, Daniel Patterson -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are -permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of - conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list - of conditions and the following disclaimer in the documentation and/or other materials - provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---------------------------------- -Based on simplify-js by Vladimir Agafonkin - http://mourner.github.io/simplify-js/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/src/3rdparty/geosimplify.js/qt_attribution.json new/qtlocation-everywhere-src-6.5.1/src/3rdparty/geosimplify.js/qt_attribution.json --- old/qtlocation-everywhere-src-6.5.0/src/3rdparty/geosimplify.js/qt_attribution.json 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/src/3rdparty/geosimplify.js/qt_attribution.json 1970-01-01 01:00:00.000000000 +0100 @@ -1,13 +0,0 @@ -{ - "Id": "geosimplify-js", - "Name": "geosimplify-js polyline simplification library", - "QDocModule": "qtlocation", - "QtUsage": "Used in the QML plugin of Qt Location.", - - "Description": "Based on https://github.com/mourner/simplify-js, geosimplify-js fixes the problem that the simple pythagorean measure used in simplify-js changes size if you simply give it longitude/latitude sequences to simplify.", - "Homepage": "https://github.com/mapbox/geosimplify-js", - "LicenseId": "geosimplify-js", - "License": "geosimplify-js License", - "LicenseFile": "LICENSE", - "Copyright": "Copyright (c) 2017 Daniel Patterson" -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/src/location/CMakeLists.txt new/qtlocation-everywhere-src-6.5.1/src/location/CMakeLists.txt --- old/qtlocation-everywhere-src-6.5.0/src/location/CMakeLists.txt 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/src/location/CMakeLists.txt 2023-05-16 12:32:21.000000000 +0200 @@ -76,7 +76,6 @@ declarativemaps declarativeplaces quickmapitems - ../3rdparty/earcut LIBRARIES Qt::CorePrivate Qt::Gui diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/src/location/maps/MapView.qml new/qtlocation-everywhere-src-6.5.1/src/location/maps/MapView.qml --- old/qtlocation-everywhere-src-6.5.0/src/location/maps/MapView.qml 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/src/location/maps/MapView.qml 2023-05-16 12:32:21.000000000 +0200 @@ -103,9 +103,25 @@ } WheelHandler { id: wheel + // workaround for QTBUG-87646 / QTBUG-112394 / QTBUG-112432: + // Magic Mouse pretends to be a trackpad but doesn't work with PinchHandler + // and we don't yet distinguish mice and trackpads on Wayland either + acceptedDevices: Qt.platform.pluginName === "cocoa" || Qt.platform.pluginName === "wayland" + ? PointerDevice.Mouse | PointerDevice.TouchPad + : PointerDevice.Mouse onWheel: (event) => { const loc = map.toCoordinate(wheel.point.position) - map.zoomLevel += event.angleDelta.y / 120 + switch (event.modifiers) { + case Qt.NoModifier: + map.zoomLevel += event.angleDelta.y / 120 + break + case Qt.ShiftModifier: + map.bearing += event.angleDelta.y / 15 + break + case Qt.ControlModifier: + map.tilt += event.angleDelta.y / 15 + break + } map.alignCoordinateToPoint(loc, wheel.point.position) } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/src/location/maps/qgeoprojection.cpp new/qtlocation-everywhere-src-6.5.1/src/location/maps/qgeoprojection.cpp --- old/qtlocation-everywhere-src-6.5.0/src/location/maps/qgeoprojection.cpp 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/src/location/maps/qgeoprojection.cpp 2023-05-16 12:32:21.000000000 +0200 @@ -808,15 +808,6 @@ m_visibleRegionExpanded.push_back(centroid + vc * 1.2); // fixing expansion factor to 1.2 } - QClipperUtils clipperExpanded; - clipperExpanded.clearClipper(); - clipperExpanded.addSubjectPath(m_visibleRegionExpanded, true); - clipperExpanded.addClipPolygon(m_projectableRegion); - const auto resVisibleExpanded = clipperExpanded.execute(QClipperUtils::Intersection); - if (resVisibleExpanded.size()) - m_visibleRegionExpanded = resVisibleExpanded[0]; // Intersection between two convex quadrilaterals should always be a single polygon - else - m_visibleRegionExpanded = m_visibleRegion; } QGeoCameraData QGeoProjectionWebMercator::cameraData() const diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/src/location/quickmapitems/qdeclarativecirclemapitem.cpp new/qtlocation-everywhere-src-6.5.1/src/location/quickmapitems/qdeclarativecirclemapitem.cpp --- old/qtlocation-everywhere-src-6.5.0/src/location/quickmapitems/qdeclarativecirclemapitem.cpp 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/src/location/quickmapitems/qdeclarativecirclemapitem.cpp 2023-05-16 12:32:21.000000000 +0200 @@ -371,7 +371,7 @@ [](const QDoubleVector2D &a, const QDoubleVector2D &b) -> bool {return a.x() < b.x();}); - const qreal newPoleLat = crossNorthPole ? 0.0 : 1.0; + const qreal newPoleLat = crossNorthPole ? -0.1 : 1.1; const QDoubleVector2D P1 = path.first() + QDoubleVector2D(1.0, 0.0); const QDoubleVector2D P2 = path.last() - QDoubleVector2D(1.0, 0.0); path.push_front(P2); @@ -478,13 +478,14 @@ QGeoMapPolygonGeometry::MapBorderBehaviour wrappingMode = QGeoMapPolygonGeometry::DrawOnce; QList<QDoubleVector2D> surroundingRect; if (cameraRect.contains(circleRect)){ - cameraRect = cameraRect.adjusted(-0.1, 0.0, 0.2, 0.0); + cameraRect = cameraRect.adjusted(-0.1, -0.1, 0.2, 0.2); surroundingRect = {{cameraRect.left(), cameraRect.top()}, {cameraRect.right(), cameraRect.top()}, {cameraRect.right(), cameraRect.bottom()}, {cameraRect.left() , cameraRect.bottom()}}; } else { const qreal anchorRect = centerX; - surroundingRect = {{anchorRect, 0.0}, {anchorRect + 1.0, 0.0}, - {anchorRect + 1.0, 1.0}, {anchorRect, 1.0}}; + + surroundingRect = {{anchorRect, -0.1}, {anchorRect + 1.0, -0.1}, + {anchorRect + 1.0, 1.1}, {anchorRect, 1.1}}; wrappingMode = QGeoMapPolygonGeometry::WrapAround; } m_geometry.updateSourcePoints(*m_circle.map(), {surroundingRect, circlePath}, wrappingMode); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtlocation-everywhere-src-6.5.0/src/location/quickmapitems/qdeclarativepolygonmapitem.cpp new/qtlocation-everywhere-src-6.5.1/src/location/quickmapitems/qdeclarativepolygonmapitem.cpp --- old/qtlocation-everywhere-src-6.5.0/src/location/quickmapitems/qdeclarativepolygonmapitem.cpp 2023-03-28 18:14:52.000000000 +0200 +++ new/qtlocation-everywhere-src-6.5.1/src/location/quickmapitems/qdeclarativepolygonmapitem.cpp 2023-05-16 12:32:21.000000000 +0200 @@ -16,10 +16,6 @@ #include <QtPositioning/private/qgeopolygon_p.h> #include <QtPositioning/private/qwebmercator_p.h> -/* poly2tri triangulator includes */ -#include <earcut.hpp> -#include <array> - QT_BEGIN_NAMESPACE /*!
