diff --git a/src/core/geometry/qgssfcgalengine.cpp b/src/core/geometry/qgssfcgalengine.cpp index daf6abbf12f..76b397b1cca 100644 --- a/src/core/geometry/qgssfcgalengine.cpp +++ b/src/core/geometry/qgssfcgalengine.cpp @@ -303,16 +303,16 @@ std::unique_ptr QgsSfcgalEngine::toAbstractGeometry( const sfcgal::errorHandler()->clearText( errorMsg ); CHECK_NOT_NULL( geom, out ); - QgsConstWkbPtr ptr = QgsSfcgalEngine::toWkb( geom, errorMsg ); + QByteArray wkbArray = QgsSfcgalEngine::toWkb( geom, errorMsg ); CHECK_SUCCESS( errorMsg, out ); - out = QgsGeometryFactory::geomFromWkb( ptr ); + QgsConstWkbPtr wkbPtr( wkbArray ); + out = QgsGeometryFactory::geomFromWkb( wkbPtr ); if ( !out ) { Qgis::WkbType sfcgalType = QgsSfcgalEngine::wkbType( geom ); - QgsConstWkbPtr ptrError = QgsSfcgalEngine::toWkb( geom ); sfcgal::errorHandler()->addText( QStringLiteral( "WKB contains unmanaged geometry type (WKB:%1 / SFCGAL:%2" ) // - .arg( static_cast( ptrError.readHeader() ) ) // + .arg( static_cast( wkbPtr.readHeader() ) ) // .arg( static_cast( sfcgalType ) ), __FILE__, __FUNCTION__, __LINE__ ); } @@ -380,17 +380,24 @@ sfcgal::shared_geom QgsSfcgalEngine::fromWkt( const QString &wkt, QString *error return sfcgal::unique_geom( out ); } -QgsConstWkbPtr QgsSfcgalEngine::toWkb( const sfcgal::geometry *geom, QString *errorMsg ) +QByteArray QgsSfcgalEngine::toWkb( const sfcgal::geometry *geom, QString *errorMsg ) { sfcgal::errorHandler()->clearText( errorMsg ); - CHECK_NOT_NULL( geom, QgsConstWkbPtr( nullptr, 0 ) ); + CHECK_NOT_NULL( geom, QByteArray() ); char *wkbHex; size_t len = 0; sfcgal_geometry_as_wkb( geom, &wkbHex, &len ); - CHECK_SUCCESS( errorMsg, QgsConstWkbPtr( nullptr, 0 ) ); + QByteArray wkbArray( wkbHex, static_cast( len ) ); - return QgsConstWkbPtr( reinterpret_cast( wkbHex ), static_cast( len ) ); +#if SFCGAL_VERSION_MAJOR_INT > 2 || ( SFCGAL_VERSION_MAJOR_INT == 2 && SFCGAL_VERSION_MINOR_INT >= 1 ) + sfcgal_free_buffer( wkbHex ); +#else + free( wkbHex ); +#endif + + CHECK_SUCCESS( errorMsg, QByteArray() ); + return wkbArray; } QString QgsSfcgalEngine::toWkt( const sfcgal::geometry *geom, int numDecimals, QString *errorMsg ) @@ -685,7 +692,8 @@ QgsPoint QgsSfcgalEngine::centroid( const sfcgal::geometry *geom, QString *error CHECK_SUCCESS( errorMsg, QgsPoint() ); CHECK_NOT_NULL( result, QgsPoint() ); - QgsConstWkbPtr wkbPtr = QgsSfcgalEngine::toWkb( result, errorMsg ); + QByteArray wkbArray = QgsSfcgalEngine::toWkb( result, errorMsg ); + QgsConstWkbPtr wkbPtr( wkbArray ); QgsPoint out; out.fromWkb( wkbPtr ); diff --git a/src/core/geometry/qgssfcgalengine.h b/src/core/geometry/qgssfcgalengine.h index 88184d67ac3..c2dfe6825ec 100644 --- a/src/core/geometry/qgssfcgalengine.h +++ b/src/core/geometry/qgssfcgalengine.h @@ -220,7 +220,7 @@ class CORE_EXPORT QgsSfcgalEngine * \param geom geometry to perform the operation * \param errorMsg Error message returned by SFGCAL */ - static QgsConstWkbPtr toWkb( const sfcgal::geometry *geom, QString *errorMsg = nullptr ); + static QByteArray toWkb( const sfcgal::geometry *geom, QString *errorMsg = nullptr ); /** * Computes WKT string from \a geom. diff --git a/src/core/geometry/qgssfcgalgeometry.cpp b/src/core/geometry/qgssfcgalgeometry.cpp index a1b0972817a..a9721028c7d 100644 --- a/src/core/geometry/qgssfcgalgeometry.cpp +++ b/src/core/geometry/qgssfcgalgeometry.cpp @@ -127,11 +127,10 @@ std::unique_ptr QgsSfcgalGeometry::fromWkb( const QgsConstWkb QByteArray QgsSfcgalGeometry::asWkb( QgsAbstractGeometry::WkbFlags ) const { sfcgal::errorHandler()->clearText( &mLastError ); - QgsConstWkbPtr ptr = QgsSfcgalEngine::toWkb( mSfcgalGeom.get(), &mLastError ); + QByteArray wkbArray = QgsSfcgalEngine::toWkb( mSfcgalGeom.get(), &mLastError ); CHECK_SUCCESS( &mLastError, QByteArray() ); - const unsigned char *wkbUnsignedPtr = ptr; - return QByteArray( reinterpret_cast( wkbUnsignedPtr ), ptr.remaining() ); + return wkbArray; } QString QgsSfcgalGeometry::asWkt( int precision ) const