aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gis/libecwj2/README33
-rw-r--r--gis/libecwj2/libecwj2-3.3-NCSPhysicalMemorySize-Linux.patch16
-rw-r--r--gis/libecwj2/libecwj2-3.3-msvc90-fixes.patch239
-rw-r--r--gis/libecwj2/libecwj2-3.3-wcharfix.patch15
-rw-r--r--gis/libecwj2/libecwj2.SlackBuild126
-rw-r--r--gis/libecwj2/libecwj2.info10
-rw-r--r--gis/libecwj2/slack-desc19
7 files changed, 458 insertions, 0 deletions
diff --git a/gis/libecwj2/README b/gis/libecwj2/README
new file mode 100644
index 0000000000000..83bb4f895cefc
--- /dev/null
+++ b/gis/libecwj2/README
@@ -0,0 +1,33 @@
+libecwj2 is a library that gives support to GDAL for reading, import,
+and convert raster geospatial data in non-free ECW and JPEG 2000
+formats. This library was released as free and open source in 2006 by
+Earth Resource Mapping, formerly owner of ECW patents.
+
+ECW (Enhanced Compression Wavelet) is a full proprietary standard of
+compression image format.
+JPEG 2000 (or JP2) is a similar standard under free concession but
+protected by patents in some parts.
+
+Both the formats are more powerful than other formats in lossy
+compression of large image data without significant losses of quality,
+but are mainly accessible through proprietary software, specially to
+manage geospatial data.
+
+libecwj2 is the only one free and open source library that includes
+the support to these formats in GDAL and indirectly in platforms that
+require it as dependency (i.e. QGIS and Orfeo Toolbox). GDAL can be
+also used to convert ECW or JP2 files in other graphic formats.
+
+After the installation, to apply the support to ECW/JP2 formats, GDAL
+must be rebuilt without any other setting: libecwjp2 is an optional
+dependency autodetected.
+
+To verify if the plugin is enabled, you can launch the following
+command:
+
+ $ gdalinfo --formats | grep ECW
+
+If the plugin is successfully enabled, the command return
+
+ ECW -raster- (rw): ERDAS Compressed Wavelets (SDK 3.x)
+ JP2ECW -raster,vector- (rw+v): ERDAS JPEG2000 (SDK 3.x)
diff --git a/gis/libecwj2/libecwj2-3.3-NCSPhysicalMemorySize-Linux.patch b/gis/libecwj2/libecwj2-3.3-NCSPhysicalMemorySize-Linux.patch
new file mode 100644
index 0000000000000..5489030839331
--- /dev/null
+++ b/gis/libecwj2/libecwj2-3.3-NCSPhysicalMemorySize-Linux.patch
@@ -0,0 +1,16 @@
+--- Source/C/NCSUtil/malloc.c.ori 2010-02-02 00:09:24.000000000 +0100
++++ Source/C/NCSUtil/malloc.c 2010-02-02 00:17:13.000000000 +0100
+@@ -390,7 +390,12 @@
+ #else /* SOLARIS */
+
+ #ifdef LINUX
+- return(sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE));
++ long nPages = sysconf(_SC_PHYS_PAGES);
++ long nPageSize = sysconf(_SC_PAGESIZE);
++ if (nPages > INT_MAX / nPageSize)
++ return INT_MAX;
++ else
++ return (INT32)(nPages * nPageSize);
+ #elif defined MACOSX
+ return(128*1024*1024);
+
diff --git a/gis/libecwj2/libecwj2-3.3-msvc90-fixes.patch b/gis/libecwj2/libecwj2-3.3-msvc90-fixes.patch
new file mode 100644
index 0000000000000..b58cab10d62ff
--- /dev/null
+++ b/gis/libecwj2/libecwj2-3.3-msvc90-fixes.patch
@@ -0,0 +1,239 @@
+diff -r 486075d14769 -r d53918598fbf libecwj2-3.3/Source/C/NCSEcw/NCSJP2/NCSJP2File.cpp
+--- libecwj2-3.3/Source/C/NCSEcw/NCSJP2/NCSJP2File.cpp Wed Sep 30 11:55:26 2009 +0100
++++ libecwj2-3.3/Source/C/NCSEcw/NCSJP2/NCSJP2File.cpp Wed Sep 30 12:20:09 2009 +0100
+@@ -137,7 +137,7 @@
+ m_bCodestreamOnly = false;
+
+ m_eCompressionOrder = CNCSJPCProgressionOrderType::RPCL;
+- m_nDecompressionLayers = CNCSJPCBuffer::MAXUINT16;
++ m_nDecompressionLayers = CNCSJPCBuffer::NCS_MAXUINT16;
+
+ m_nNextLine = 0;
+ //Default geodata usage - was JP2_GEODATA_USE_WLD_GML_PCS
+diff -r 486075d14769 -r d53918598fbf libecwj2-3.3/Source/C/NCSEcw/NCSJP2/NCSJPCBuffer.cpp
+--- libecwj2-3.3/Source/C/NCSEcw/NCSJP2/NCSJPCBuffer.cpp Wed Sep 30 11:55:26 2009 +0100
++++ libecwj2-3.3/Source/C/NCSEcw/NCSJP2/NCSJPCBuffer.cpp Wed Sep 30 12:20:09 2009 +0100
+@@ -26,19 +26,19 @@
+
+ //void * memcpy_amd(void *dest, const void *src, size_t n);
+
+-const UINT32 CNCSJPCBuffer::MAXUINT8 = (unsigned)0xff;
+-const UINT32 CNCSJPCBuffer::MAXUINT16 = (unsigned)0xffff;
+-const UINT32 CNCSJPCBuffer::MAXUINT32 = (unsigned)0xffffffff;
+-const UINT32 CNCSJPCBuffer::MINUINT8 = 0;
+-const UINT32 CNCSJPCBuffer::MINUINT16 = 0;
+-const UINT32 CNCSJPCBuffer::MINUINT32 = 0;
++const UINT32 CNCSJPCBuffer::NCS_MAXUINT8 = (unsigned)0xff;
++const UINT32 CNCSJPCBuffer::NCS_MAXUINT16 = (unsigned)0xffff;
++const UINT32 CNCSJPCBuffer::NCS_MAXUINT32 = (unsigned)0xffffffff;
++const UINT32 CNCSJPCBuffer::NCS_MINUINT8 = 0;
++const UINT32 CNCSJPCBuffer::NCS_MINUINT16 = 0;
++const UINT32 CNCSJPCBuffer::NCS_MINUINT32 = 0;
+
+-const UINT32 CNCSJPCBuffer::MAXINT8 = 0x7f;
+-const UINT32 CNCSJPCBuffer::MAXINT16 = 0x7fff;
+-const UINT32 CNCSJPCBuffer::MAXINT32 = 0x7fffffff;
+-const INT32 CNCSJPCBuffer::MININT8 = (-1 * (signed)CNCSJPCBuffer::MAXINT8 - 1);
+-const INT32 CNCSJPCBuffer::MININT16 = (-1 * (signed)CNCSJPCBuffer::MAXINT16 - 1);
+-const INT32 CNCSJPCBuffer::MININT32 = (-1 * (signed)CNCSJPCBuffer::MAXINT32 - 1);
++const UINT32 CNCSJPCBuffer::NCS_MAXINT8 = 0x7f;
++const UINT32 CNCSJPCBuffer::NCS_MAXINT16 = 0x7fff;
++const UINT32 CNCSJPCBuffer::NCS_MAXINT32 = 0x7fffffff;
++const INT32 CNCSJPCBuffer::NCS_MININT8 = (-1 * (signed)CNCSJPCBuffer::NCS_MAXINT8 - 1);
++const INT32 CNCSJPCBuffer::NCS_MININT16 = (-1 * (signed)CNCSJPCBuffer::NCS_MAXINT16 - 1);
++const INT32 CNCSJPCBuffer::NCS_MININT32 = (-1 * (signed)CNCSJPCBuffer::NCS_MAXINT32 - 1);
+
+ const UINT32 CNCSJPCBuffer::AT_OWNER = (1 << 0);
+ const UINT32 CNCSJPCBuffer::AT_CHILD = (1 << 1);
+@@ -308,27 +308,27 @@
+ switch(m_eType) {
+ case CNCSJPCBuffer::BT_INT16:
+ // Optimise some common cases
+- if(nMin == MINUINT8 && nMax == MAXUINT8) {
++ if(nMin == NCS_MINUINT8 && nMax == NCS_MAXUINT8) {
+ // UINT8 range
+ for(x = 0; x < nWidth; x++) {
+ INT16 v = ((INT16*)m_pBuffer)[x];
+ if(v & 0xff00) { // Top bit is sign bit, so this tests for both >nMax & <nMin in one
+- if(v > (INT16)MAXUINT8) {
+- ((INT16*)m_pBuffer)[x] = MAXUINT8;
+- } else if(v < (INT16)MINUINT8) {
+- ((INT16*)m_pBuffer)[x] = MINUINT8;
++ if(v > (INT16)NCS_MAXUINT8) {
++ ((INT16*)m_pBuffer)[x] = NCS_MAXUINT8;
++ } else if(v < (INT16)NCS_MINUINT8) {
++ ((INT16*)m_pBuffer)[x] = NCS_MINUINT8;
+ }
+ }
+ }
+- } else if(nMin == MININT8 && nMax == MAXINT8) {
++ } else if(nMin == NCS_MININT8 && nMax == NCS_MAXINT8) {
+ // INT8 range
+ for(x = 0; x < nWidth; x++) {
+ INT16 v = ((INT16*)m_pBuffer)[x];
+ if(v & 0xff80) { // Top bit is sign bit, so this tests for both >nMax & <nMin in one
+- if(v > (INT16)MAXINT8) {
+- ((INT16*)m_pBuffer)[x] = MAXINT8;
+- } else if(v < (INT16)MININT8) {
+- ((INT16*)m_pBuffer)[x] = MININT8;
++ if(v > (INT16)NCS_MAXINT8) {
++ ((INT16*)m_pBuffer)[x] = NCS_MAXINT8;
++ } else if(v < (INT16)NCS_MININT8) {
++ ((INT16*)m_pBuffer)[x] = NCS_MININT8;
+ }
+ }
+ }
+@@ -345,27 +345,27 @@
+ break;
+ case CNCSJPCBuffer::BT_INT32:
+ // Optimise some common cases
+- if(nMin == MINUINT16 && nMax == MAXUINT16) {
++ if(nMin == NCS_MINUINT16 && nMax == NCS_MAXUINT16) {
+ // UINT16 range
+ for(x = 0; x < nWidth; x++) {
+ INT32 v = ((INT32*)m_pBuffer)[x];
+ if(v & 0xffff0000) { // Top bit is sign bit, so this tests for both >nMax & <nMin in one
+- if(v > (INT32)MAXUINT16) {
+- ((INT32*)m_pBuffer)[x] = MAXUINT16;
+- } else if(v < (INT32)MINUINT16) {
+- ((INT32*)m_pBuffer)[x] = MINUINT16;
++ if(v > (INT32)NCS_MAXUINT16) {
++ ((INT32*)m_pBuffer)[x] = NCS_MAXUINT16;
++ } else if(v < (INT32)NCS_MINUINT16) {
++ ((INT32*)m_pBuffer)[x] = NCS_MINUINT16;
+ }
+ }
+ }
+- } else if(nMin == MININT16 && nMax == MAXINT16) {
++ } else if(nMin == NCS_MININT16 && nMax == NCS_MAXINT16) {
+ // INT16 range
+ for(x = 0; x < nWidth; x++) {
+ INT32 v = ((INT32*)m_pBuffer)[x];
+ if(v & 0xffff8000) { // Top bit is sign bit, so this tests for both >nMax & <nMin in one
+- if(v > (INT32)MAXINT16) {
+- ((INT32*)m_pBuffer)[x] = MAXINT16;
+- } else if(v < (INT32)MININT16) {
+- ((INT32*)m_pBuffer)[x] = MININT16;
++ if(v > (INT32)NCS_MAXINT16) {
++ ((INT32*)m_pBuffer)[x] = NCS_MAXINT16;
++ } else if(v < (INT32)NCS_MININT16) {
++ ((INT32*)m_pBuffer)[x] = NCS_MININT16;
+ }
+ }
+ }
+@@ -403,13 +403,13 @@
+ return(Clip(NCSCeil(fMin), NCSFloor(fMax)));
+ break;
+ case CNCSJPCBuffer::BT_IEEE4:
+- if(fMin == MINUINT8 && fMax == MAXUINT8) {
++ if(fMin == NCS_MINUINT8 && fMax == NCS_MAXUINT8) {
+ for(x = 0; x < nWidth; x++) {
+ IEEE4 v = ((IEEE4*)m_pBuffer)[x];
+- if(v > MAXUINT8) {
+- ((IEEE4*)m_pBuffer)[x] = MAXUINT8;
+- } else if(v < MINUINT8) {
+- ((IEEE4*)m_pBuffer)[x] = MINUINT8;
++ if(v > NCS_MAXUINT8) {
++ ((IEEE4*)m_pBuffer)[x] = NCS_MAXUINT8;
++ } else if(v < NCS_MINUINT8) {
++ ((IEEE4*)m_pBuffer)[x] = NCS_MINUINT8;
+ }
+ }
+ } else {
+diff -r 486075d14769 -r d53918598fbf libecwj2-3.3/Source/C/NCSEcw/NCSJP2/NCSJPCPLTMarker.cpp
+--- libecwj2-3.3/Source/C/NCSEcw/NCSJP2/NCSJPCPLTMarker.cpp Wed Sep 30 11:55:26 2009 +0100
++++ libecwj2-3.3/Source/C/NCSEcw/NCSJP2/NCSJPCPLTMarker.cpp Wed Sep 30 12:20:09 2009 +0100
+@@ -173,7 +173,7 @@
+ nPrevHeaderLength = TMP.m_nHeaderLength;
+ TMP.m_nHeaderLength += (UINT32)nTotalHeaderLength;
+ }
+- if(nTotalHeaderLength > CNCSJPCBuffer::MAXUINT32) {
++ if(nTotalHeaderLength > CNCSJPCBuffer::NCS_MAXUINT32) {
+ // Too big to store cumulated length in the PacketLength struct, so
+ // set it back to false and reparse the entire PLT
+ m_bCumulativeLengths = false;
+@@ -202,7 +202,7 @@
+ nPrevHeaderLength = TMP.m_nHeaderLength;
+ TMP.m_nHeaderLength += nTotalHeaderLength;
+ }
+- if(nTotalHeaderLength > CNCSJPCBuffer::MAXUINT32) {
++ if(nTotalHeaderLength > CNCSJPCBuffer::NCS_MAXUINT32) {
+ // Too big to store cumulated length in the PacketLength struct, so
+ // set it back to false and reparse the entire PLT
+ m_bCumulativeLengths = false;
+diff -r 486075d14769 -r d53918598fbf libecwj2-3.3/Source/C/NCSEcw/NCSJP2/NCSJPCT1Coder.cpp
+--- libecwj2-3.3/Source/C/NCSEcw/NCSJP2/NCSJPCT1Coder.cpp Wed Sep 30 11:55:26 2009 +0100
++++ libecwj2-3.3/Source/C/NCSEcw/NCSJP2/NCSJPCT1Coder.cpp Wed Sep 30 12:20:09 2009 +0100
+@@ -917,7 +917,7 @@
+
+ int passno=0;
+ int passtype;
+- INT32 nMax = CNCSJPCBuffer::MININT32;
++ INT32 nMax = CNCSJPCBuffer::NCS_MININT32;
+
+ UINT32 nWidth = pDecBuf->GetWidth();
+ UINT32 nHeight = pDecBuf->GetHeight();
+@@ -956,7 +956,7 @@
+ UINT32 nSubWidth = nWidth / 8;
+
+ __m128 mm7 = _mm_set1_ps(fRatio);
+- __m128i mm4 = _mm_set1_epi16((short)CNCSJPCBuffer::MININT16);
++ __m128i mm4 = _mm_set1_epi16((short)CNCSJPCBuffer::NCS_MININT16);
+
+ for(UINT32 y = 0; y < nHeight; y++) {
+ INT16 *pSrc = (INT16*)pDecBuf->GetPtr() + y * nDecStep;
+@@ -1008,7 +1008,7 @@
+ UINT32 nSubWidth = nWidth / 4;
+
+ __m128 mm7 = _mm_set1_ps(fRatio);
+- __m64 mm4 = _mm_set1_pi16((short)CNCSJPCBuffer::MININT16);
++ __m64 mm4 = _mm_set1_pi16((short)CNCSJPCBuffer::NCS_MININT16);
+
+ for(UINT32 y = 0; y < nHeight; y++) {
+ INT16 *pSrc = (INT16*)pDecBuf->GetPtr() + y * nDecStep;
+diff -r 486075d14769 -r d53918598fbf libecwj2-3.3/Source/include/NCSJPCBuffer.h
+--- libecwj2-3.3/Source/include/NCSJPCBuffer.h Wed Sep 30 11:55:26 2009 +0100
++++ libecwj2-3.3/Source/include/NCSJPCBuffer.h Wed Sep 30 12:20:09 2009 +0100
+@@ -48,30 +48,30 @@
+ class NCSJPC_EXPORT_ALL CNCSJPCBuffer: public CNCSJPCRect {
+ public:
+ /** Maximum UINT8 value */
+- static const UINT32 MAXUINT8;
++ static const UINT32 NCS_MAXUINT8;
+ /** Maximum UINT16 value */
+- static const UINT32 MAXUINT16;
++ static const UINT32 NCS_MAXUINT16;
+ /** Maximum UINT32 value */
+- static const UINT32 MAXUINT32;
++ static const UINT32 NCS_MAXUINT32;
+ /** Minimum UINT8 value */
+- static const UINT32 MINUINT8;
++ static const UINT32 NCS_MINUINT8;
+ /** Minimum UINT16 value */
+- static const UINT32 MINUINT16;
++ static const UINT32 NCS_MINUINT16;
+ /** Minimum UINT32 value */
+- static const UINT32 MINUINT32;
++ static const UINT32 NCS_MINUINT32;
+
+ /** Maximum INT8 value */
+- static const UINT32 MAXINT8;
++ static const UINT32 NCS_MAXINT8;
+ /** Maximum INT16 value */
+- static const UINT32 MAXINT16;
++ static const UINT32 NCS_MAXINT16;
+ /** Maximum INT32 value */
+- static const UINT32 MAXINT32;
++ static const UINT32 NCS_MAXINT32;
+ /** Minimum INT8 value */
+- static const INT32 MININT8;
++ static const INT32 NCS_MININT8;
+ /** Minimum INT16 value */
+- static const INT32 MININT16;
++ static const INT32 NCS_MININT16;
+ /** Minimum INT32 value */
+- static const INT32 MININT32;
++ static const INT32 NCS_MININT32;
+
+ /**
+ * SystemInfo class - Some basic system capabilities we care about.
diff --git a/gis/libecwj2/libecwj2-3.3-wcharfix.patch b/gis/libecwj2/libecwj2-3.3-wcharfix.patch
new file mode 100644
index 0000000000000..b00729c47c0ca
--- /dev/null
+++ b/gis/libecwj2/libecwj2-3.3-wcharfix.patch
@@ -0,0 +1,15 @@
+diff -Nur libecwj2-3.3-orig/Source/C/NCSUtil/NCSPrefsXML.cpp libecwj2-3.3-wcharfix/Source/C/NCSUtil/NCSPrefsXML.cpp
+--- libecwj2-3.3-orig/Source/C/NCSUtil/NCSPrefsXML.cpp 2006-07-03 03:15:12.000000000 +0200
++++ libecwj2-3.3-wcharfix/Source/C/NCSUtil/NCSPrefsXML.cpp 2012-09-12 21:51:19.477487746 +0200
+@@ -32,7 +32,11 @@
+ } else {
+ char *pHomeDir = getenv("HOME");
+ if( pHomeDir ) {
++#ifdef NCS_BUILD_UNICODE
++ sUserPrefsFile.Format( NCS_T("%s%ls"), pHomeDir, NCS_T("/.erm/ncsuserprefs.xml") );
++#else
+ sUserPrefsFile.Format( NCS_T("%s%s"), pHomeDir, NCS_T("/.erm/ncsuserprefs.xml") );
++#endif
+ } else {
+ sUserPrefsFile = NCS_T("/etc/erm/ncsuserprefs.xml");
+ }
diff --git a/gis/libecwj2/libecwj2.SlackBuild b/gis/libecwj2/libecwj2.SlackBuild
new file mode 100644
index 0000000000000..7a6cfd26c4526
--- /dev/null
+++ b/gis/libecwj2/libecwj2.SlackBuild
@@ -0,0 +1,126 @@
+#!/bin/bash
+
+# Slackware build script for libecwj2
+
+# Copyright 2014-2022 Giancarlo Dessì, Cagliari IT
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 AUTHOR 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.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=libecwj2
+VERSION=${VERSION:-3.3}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+SRCVER=2006-09-06
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+
+# Create $PKG/usr/include because make install does not do it
+mkdir $PKG/usr
+mkdir $PKG/usr/include
+
+unzip $CWD/$PRGNAM-$VERSION-$SRCVER.zip
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+# Apply some patches to the original source code
+# thanks to Authors
+# see http://osgeo-org.1560.x6.nabble.com/ECW-support-on-Fedora-Linux-error-td4991388.html
+# and http://wiki.openstreetmap.org/wiki/ECW#Howto_install_gdal_with_ECW_support
+
+# Patch downloaded from http://trac.osgeo.org/gdal/raw-attachment/ticket/3162/libecwj2-3.3-msvc90-fixes.patch
+patch -p1 <$CWD/libecwj2-3.3-msvc90-fixes.patch
+
+# Patch downloaded from http://osgeo-org.1560.x6.nabble.com/attachment/5001530/0/libecwj2-3.3-wcharfix.patch
+patch -p0 <$CWD/libecwj2-3.3-NCSPhysicalMemorySize-Linux.patch
+
+# Patch downloaded from http://trac.osgeo.org/gdal/raw-attachment/ticket/3366/libecwj2-3.3-NCSPhysicalMemorySize-Linux.patch
+patch -p1 <$CWD/libecwj2-3.3-wcharfix.patch
+
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+./configure \
+ --prefix=/usr \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --sysconfdir=/etc \
+ --localstatedir=/var \
+ --mandir=/usr/man \
+ --disable-static \
+ --build=$ARCH-slackware-linux
+
+make
+make install DESTDIR=$PKG
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a License.txt Build.txt SDK.pdf $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/gis/libecwj2/libecwj2.info b/gis/libecwj2/libecwj2.info
new file mode 100644
index 0000000000000..259b0f701e659
--- /dev/null
+++ b/gis/libecwj2/libecwj2.info
@@ -0,0 +1,10 @@
+PRGNAM="libecwj2"
+VERSION="3.3"
+HOMEPAGE="https://sourceforge.net/projects/libecw-legacy/"
+DOWNLOAD="https://sourceforge.net/projects/libecw-legacy/files/libecwj2-3.3-2006-09-06.zip/download"
+MD5SUM="acc04e07153c2a2a6595b3e2ebf34432"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Giancarlo Dessì"
+EMAIL="slack@giand.it"
diff --git a/gis/libecwj2/slack-desc b/gis/libecwj2/slack-desc
new file mode 100644
index 0000000000000..eb8dd0fafab15
--- /dev/null
+++ b/gis/libecwj2/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+libecwj2: libecwj2 (translator library for raster geospatial data)
+libecwj2:
+libecwj2: libecwj2 is an old library and the only one that extends the support
+libecwj2: of GDAL to non-free graphic formats ECW and JPEG 2000.
+libecwj2:
+libecwj2:
+libecwj2:
+libecwj2:
+libecwj2: Repository: https://sourceforge.net/projects/libecw-legacy/
+libecwj2:
+libecwj2: