Sophie

Sophie

distrib > Mageia > 9 > armv7hl > media > core-release-src > by-pkgid > e4e15f252c8ec0252be4c46439801b55 > files > 10

xygrib-1.2.6.1-3.mga9.src.rpm

From 720a2db307f5c93c0079f9811a3c35cfe8bb12f5 Mon Sep 17 00:00:00 2001
From: didier <didier@users.sourceforge.net>
Date: Mon, 24 Jan 2022 13:13:42 +0100
Subject: [PATCH 2/2] Use new libproj API if available

---
 CMakeLists.txt                 | 12 ++---
 cmake/FindPROJ.cmake           | 96 ++++++++++++++++++++++++++++++++++
 cmake/FindPROJ8.cmake          | 76 ---------------------------
 src/CMakeLists.txt             |  2 +-
 src/map/Projection.h           |  9 ++++
 src/map/Projection_libproj.cpp | 32 +++++++++++-
 6 files changed, 143 insertions(+), 84 deletions(-)
 create mode 100644 cmake/FindPROJ.cmake
 delete mode 100644 cmake/FindPROJ8.cmake

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 77633a2..358a87a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -122,21 +122,21 @@ find_path(OPENJPEG_INCLUDE_DIR
 include_directories(${OPENJPEG_INCLUDE_DIR})
 
 if(NOT WIN32)
-    include(cmake/FindPROJ8.cmake)
-    if(NOT PROJ8_FOUND)
-      message(FATAL_ERROR "PROJ.8 library not found!")
+    include(cmake/FindPROJ.cmake)
+    if(NOT PROJ_FOUND)
+      message(FATAL_ERROR "PROJ library not found!")
     endif()
-    include_directories(${PROJ8_INCLUDE_DIRS})
+    include_directories(${PROJ_INCLUDE_DIRS})
 endif()
 if(WIN32)
-    find_library(PROJ8_LIBRARIES
+    find_library(PROJ_LIBRARIES
         NAME "libproj.a"
         PATHS
         $ENV{EXTERNLIBS}/lib
          /opt/lib
         REQUIRED
     )
-    find_path(PROJ8_INCLUDE_DIRS
+    find_path(PROJ_INCLUDE_DIRS
          NAMES "proj.h"
          PATHS
          $ENV{EXTERNLIBS}/include
diff --git a/cmake/FindPROJ.cmake b/cmake/FindPROJ.cmake
new file mode 100644
index 0000000..33b5300
--- /dev/null
+++ b/cmake/FindPROJ.cmake
@@ -0,0 +1,96 @@
+# - Find PROJ
+# Find the PROJ includes and library
+#
+#  PROJ_INCLUDE_DIR - Where to find PROJ includes
+#  PROJ_LIBRARIES   - List of libraries when using PROJ
+#  PROJ_FOUND       - True if PROJ was found
+
+IF(PROJ_INCLUDE_DIR)
+  SET(PROJ_FIND_QUIETLY TRUE)
+ENDIF(PROJ_INCLUDE_DIR)
+
+FIND_PATH(PROJ_INCLUDE_DIR "proj.h"
+  PATHS
+  $ENV{EXTERNLIBS}/include
+  $ENV{EXTERNLIBS}/PROJ/include
+  ~/Library/Frameworks/include
+  /Library/Frameworks/include
+  /usr/local/include
+  /usr/include
+  /sw/include # Fink
+  /opt/local/include # DarwinPorts
+  /opt/csw/include # Blastwave
+  /opt/include
+  DOC "PROJ - Headers"
+)
+
+IF(PROJ_INCLUDE_DIR)
+    SET(PROJ_NAMES PROJ proj proj_8_0)
+    SET(PROJ_DBG_NAMES PROJD projD proj_8_0_1)
+ELSE(PROJ_INCLUDE_DIR)
+    FIND_PATH(PROJ_INCLUDE_DIR "proj_api.h"
+      PATHS
+      $ENV{EXTERNLIBS}/include
+      $ENV{EXTERNLIBS}/PROJ/include
+      ~/Library/Frameworks/include
+      /Library/Frameworks/include
+      /usr/local/include
+      /usr/include
+      /sw/include # Fink
+      /opt/local/include # DarwinPorts
+      /opt/csw/include # Blastwave
+      /opt/include
+      DOC "PROJ - Headers"
+    )
+    ADD_DEFINITIONS(-DACCEPT_USE_OF_DEPRECATED_PROJ_API_H=1)
+    SET(PROJ_NAMES PROJ proj proj_4_9)
+    SET(PROJ_DBG_NAMES PROJD projD proj_4_9_D)
+ENDIF(PROJ_INCLUDE_DIR)
+
+FIND_LIBRARY(PROJ_LIBRARY NAMES ${PROJ_NAMES}
+  PATHS
+  $ENV{EXTERNLIBS}
+  $ENV{EXTERNLIBS}/PROJ
+  ~/Library/Frameworks
+  /Library/Frameworks
+  /usr/local
+  /usr
+  /sw
+  /opt/local
+  /opt/csw
+  /opt
+  PATH_SUFFIXES lib lib64
+  DOC "PROJ - Library"
+)
+
+INCLUDE(FindPackageHandleStandardArgs)
+
+IF(MSVC)
+  # VisualStudio needs a debug version
+  FIND_LIBRARY(PROJ_LIBRARY_DEBUG NAMES ${PROJ_DBG_NAMES}
+    PATHS
+    $ENV{EXTERNLIBS}/PROJ/lib
+    DOC "PROJ - Library (Debug)"
+  )
+  
+  IF(PROJ_LIBRARY_DEBUG AND PROJ_LIBRARY)
+    SET(PROJ_LIBRARIES optimized ${PROJ_LIBRARY} debug ${PROJ_LIBRARY_DEBUG})
+  ENDIF(PROJ_LIBRARY_DEBUG AND PROJ_LIBRARY)
+
+  FIND_PACKAGE_HANDLE_STANDARD_ARGS(PROJ DEFAULT_MSG PROJ_LIBRARY PROJ_LIBRARY_DEBUG PROJ_INCLUDE_DIR)
+
+  MARK_AS_ADVANCED(PROJ_LIBRARY PROJ_LIBRARY_DEBUG PROJ_INCLUDE_DIR)
+  
+ELSE(MSVC)
+  # rest of the world
+  SET(PROJ_LIBRARIES ${PROJ_LIBRARY})
+
+  FIND_PACKAGE_HANDLE_STANDARD_ARGS(PROJ DEFAULT_MSG PROJ_LIBRARY PROJ_INCLUDE_DIR)
+  
+  MARK_AS_ADVANCED(PROJ_LIBRARY PROJ_INCLUDE_DIR)
+  
+ENDIF(MSVC)
+
+IF(PROJ_FOUND)
+  SET(PROJ_INCLUDE_DIRS ${PROJ_INCLUDE_DIR})
+ENDIF(PROJ_FOUND)
diff --git a/cmake/FindPROJ8.cmake b/cmake/FindPROJ8.cmake
deleted file mode 100644
index 33470ac..0000000
--- a/cmake/FindPROJ8.cmake
+++ /dev/null
@@ -1,76 +0,0 @@
-# - Find PROJ8
-# Find the PROJ8 includes and library
-#
-#  PROJ8_INCLUDE_DIR - Where to find PROJ8 includes
-#  PROJ8_LIBRARIES   - List of libraries when using PROJ8
-#  PROJ8_FOUND       - True if PROJ8 was found
-
-IF(PROJ8_INCLUDE_DIR)
-  SET(PROJ8_FIND_QUIETLY TRUE)
-ENDIF(PROJ8_INCLUDE_DIR)
-
-FIND_PATH(PROJ8_INCLUDE_DIR "proj.h"
-  PATHS
-  $ENV{EXTERNLIBS}/include
-  $ENV{EXTERNLIBS}/PROJ8/include
-  ~/Library/Frameworks/include
-  /Library/Frameworks/include
-  /usr/local/include
-  /usr/include
-  /sw/include # Fink
-  /opt/local/include # DarwinPorts
-  /opt/csw/include # Blastwave
-  /opt/include
-  DOC "PROJ8 - Headers"
-)
-
-SET(PROJ8_NAMES PROJ8 proj proj_8_0)
-SET(PROJ8_DBG_NAMES PROJ8D projD proj_8_0_1)
-
-FIND_LIBRARY(PROJ8_LIBRARY NAMES ${PROJ8_NAMES}
-  PATHS
-  $ENV{EXTERNLIBS}
-  $ENV{EXTERNLIBS}/PROJ8
-  ~/Library/Frameworks
-  /Library/Frameworks
-  /usr/local
-  /usr
-  /sw
-  /opt/local
-  /opt/csw
-  /opt
-  PATH_SUFFIXES lib lib64
-  DOC "PROJ8 - Library"
-)
-
-INCLUDE(FindPackageHandleStandardArgs)
-
-IF(MSVC)
-  # VisualStudio needs a debug version
-  FIND_LIBRARY(PROJ8_LIBRARY_DEBUG NAMES ${PROJ8_DBG_NAMES}
-    PATHS
-    $ENV{EXTERNLIBS}/PROJ8/lib
-    DOC "PROJ8 - Library (Debug)"
-  )
-  
-  IF(PROJ8_LIBRARY_DEBUG AND PROJ8_LIBRARY)
-    SET(PROJ8_LIBRARIES optimized ${PROJ8_LIBRARY} debug ${PROJ8_LIBRARY_DEBUG})
-  ENDIF(PROJ8_LIBRARY_DEBUG AND PROJ8_LIBRARY)
-
-  FIND_PACKAGE_HANDLE_STANDARD_ARGS(PROJ8 DEFAULT_MSG PROJ8_LIBRARY PROJ8_LIBRARY_DEBUG PROJ8_INCLUDE_DIR)
-
-  MARK_AS_ADVANCED(PROJ8_LIBRARY PROJ8_LIBRARY_DEBUG PROJ8_INCLUDE_DIR)
-  
-ELSE(MSVC)
-  # rest of the world
-  SET(PROJ8_LIBRARIES ${PROJ8_LIBRARY})
-
-  FIND_PACKAGE_HANDLE_STANDARD_ARGS(PROJ8 DEFAULT_MSG PROJ8_LIBRARY PROJ8_INCLUDE_DIR)
-  
-  MARK_AS_ADVANCED(PROJ8_LIBRARY PROJ8_INCLUDE_DIR)
-  
-ENDIF(MSVC)
-
-IF(PROJ8_FOUND)
-  SET(PROJ8_INCLUDE_DIRS ${PROJ8_INCLUDE_DIR})
-ENDIF(PROJ8_FOUND)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 9c96d49..d1c42f9 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -118,7 +118,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/util)
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/map ${MAP_GENERATED_HEADERS})
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/GUI ${GUI_GENERATED_HEADERS})
 
-target_link_libraries(${CMAKE_PROJECT_NAME} g2clib gui util map ${LIBNOVA_LIBRARY} ${OPENJPEG_LIBRARIES} ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Network_LIBRARIES} ${Qt5Xml_LIBRARIES} ${Qt5PrintSupport_LIBRARIES} ${BZIP2_LIBRARIES} ${ZLIB_LIBRARIES} ${PROJ8_LIBRARIES} ${PNG_LIBRARIES})
+target_link_libraries(${CMAKE_PROJECT_NAME} g2clib gui util map ${LIBNOVA_LIBRARY} ${OPENJPEG_LIBRARIES} ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Network_LIBRARIES} ${Qt5Xml_LIBRARIES} ${Qt5PrintSupport_LIBRARIES} ${BZIP2_LIBRARIES} ${ZLIB_LIBRARIES} ${PROJ_LIBRARIES} ${PNG_LIBRARIES})
 
 # Sanitizers, part 2/2
 if ( CMAKE_VERSION VERSION_GREATER 3.4 )
diff --git a/src/map/Projection.h b/src/map/Projection.h
index d482e0d..9ac1342 100644
--- a/src/map/Projection.h
+++ b/src/map/Projection.h
@@ -20,8 +20,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PROJECTION_H
 #include <QObject>
 #include <cstdio>
+//#define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
 
+#ifdef ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
+#include "proj_api.h"
+#else
 #include "proj.h"
+#endif
 
 class Projection : public QObject
 {
@@ -138,7 +143,11 @@ class Projection_libproj : public Projection
 		int   getProjection()   {return currentProj;}
 
 	private :
+#ifdef ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
+		projPJ libProj;
+#else
 		PJ * libProj;
+#endif
 		int  currentProj;
 };
 
diff --git a/src/map/Projection_libproj.cpp b/src/map/Projection_libproj.cpp
index 0299714..e2ea525 100644
--- a/src/map/Projection_libproj.cpp
+++ b/src/map/Projection_libproj.cpp
@@ -92,10 +92,15 @@ void Projection_libproj::setProjection(int code)
     params[nbpar++] = "ellps=WGS84";
     params[nbpar++] = "no_defs";
     params[nbpar++] = "over";	// allow longitude > 180°
-    // XXX ouch pj_init
+#ifdef ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
+    libProj = pj_init(nbpar, (char **)params);
+	if (!libProj)
+		printf("proj error: %s\n", pj_strerrno(pj_errno));
+#else
     libProj = proj_create_argv(PJ_DEFAULT_CTX, nbpar, (char **)params);
 	if (!libProj)
 		printf("proj error: %s\n", proj_errno_string(proj_errno(libProj)));
+#endif
 	assert(libProj);
 	currentProj = code;
 //	libProj->over = 1;		// allow longitude > 180°
@@ -106,23 +111,39 @@ void Projection_libproj::setProjection(int code)
 Projection_libproj::~Projection_libproj()
 {
     if (libProj != nullptr) {
+#ifdef ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
+		pj_free(libProj);
+#else
 		proj_destroy(libProj);
+#endif
 	}
 }
 
 //-------------------------------------------------------------------------------
 void Projection_libproj::map2screen(double x, double y, int *i, int *j) const
 {
+#ifdef ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
+	projUV data, res;
+#else
 	PJ_COORD data, res;
+#endif
 	if (y <= -90.0)
 		y = -90.0+1e-5;
 	if (y >= 90.0)
 		y = 90.0-1e-5;
+#ifdef ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
+	data.v =  y * DEG_TO_RAD;
+	data.u =  x * DEG_TO_RAD;
+	res = pj_fwd(data, libProj);
+	*i =  (int) (W/2.0 + scale * (res.u/111319.0-CX) + 0.5);
+	*j =  (int) (H/2.0 - scale * (res.v/111319.0-CY) + 0.5);
+#else
 	data.uv.v =  y;
 	data.uv.u =  x;
 	res = proj_trans(libProj, PJ_FWD, data);
 	*i =  (int) (W/2.0 + scale * (res.uv.u/111319.0-CX) + 0.5);
 	*j =  (int) (H/2.0 - scale * (res.uv.v/111319.0-CY) + 0.5);
+#endif
 	//printf("PROJ   map2screen (%f %f) -> (%3d %3d)\n", x,y, *i,*j);
 }
 
@@ -130,12 +151,21 @@ void Projection_libproj::map2screen(double x, double y, int *i, int *j) const
 //-------------------------------------------------------------------------------
 void Projection_libproj::screen2map(int i, int j, double *x, double *y) const
 {
+#ifdef ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
+	projUV data, res;
+	data.u =  ((i-W/2.0)/scale+ CX)*111319.0 ;
+	data.v =  ((H/2.0-j)/scale+ CY)*111319.0 ;
+	res = pj_inv(data, libProj);
+	*x = (double)(res.u*RAD_TO_DEG);
+	*y = (double)(res.v*RAD_TO_DEG);
+#else
 	PJ_COORD data, res;
 	data.uv.u =  ((i-W/2.0)/scale+ CX)*111319.0 ;
 	data.uv.v =  ((H/2.0-j)/scale+ CY)*111319.0 ;
 	res = proj_trans(libProj, PJ_INV, data);
 	*x = (double)(res.uv.u);
 	*y = (double)(res.uv.v);
+#endif
 	//printf("PROJ   screen2map (%3d %3d) -> (%f %f)\n", i,j, *x,*y);
 }
 //--------------------------------------------------------------
-- 
2.37.1