[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [marble/gsoc-2012-replaceatlas] src/lib: Create a CylindricalProjection class which inherits Abstrac
From:       Cezar Mocan <mocancezar () gmail ! com>
Date:       2012-05-31 19:42:28
Message-ID: 20120531194228.9507EA60A9 () git ! kde ! org
[Download RAW message or body]

Git commit d785c637ec4b52c3425753a1823d4126a92b898b by Cezar Mocan.
Committed on 31/05/2012 at 21:40.
Pushed by mocan into branch 'gsoc-2012-replaceatlas'.

Create a CylindricalProjection class which inherits AbstractProjection and is \
inherited by MercatorProjection and EquirectProjection

M  +2    -0    src/lib/CMakeLists.txt
A  +61   -0    src/lib/Projections/CylindricalProjection.cpp     [License: LGPL]
A  +59   -0    src/lib/Projections/CylindricalProjection.h     [License: LGPL]
M  +13   -7    src/lib/Projections/EquirectProjection.cpp
M  +10   -7    src/lib/Projections/EquirectProjection.h
M  +12   -6    src/lib/Projections/MercatorProjection.cpp
M  +7    -7    src/lib/Projections/MercatorProjection.h
A  +242  -0    src/lib/Projections/provisionalPatch.diff

http://commits.kde.org/marble/d785c637ec4b52c3425753a1823d4126a92b898b

diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index 1208f5f..a7a4ad1 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -111,6 +111,7 @@ set(marblewidget_SRCS
     ViewportParams.cpp
     ViewParams.cpp
     Projections/AbstractProjection.cpp
+	Projections/CylindricalProjection.cpp
     Projections/SphericalProjection.cpp
     Projections/EquirectProjection.cpp
     Projections/MercatorProjection.cpp
@@ -348,6 +349,7 @@ else (APPLE AND QTONLY)
     TileCreatorDialog.h
     ViewportParams.h
     Projections/AbstractProjection.h
+	Projections/CylindricalProjection.h
     Projections/SphericalProjection.h
     Projections/EquirectProjection.h
     Projections/MercatorProjection.h
diff --git a/src/lib/Projections/CylindricalProjection.cpp \
b/src/lib/Projections/CylindricalProjection.cpp new file mode 100644
index 0000000..c103a68
--- /dev/null
+++ b/src/lib/Projections/CylindricalProjection.cpp
@@ -0,0 +1,61 @@
+//
+// This file is part of the Marble Virtual Globe.
+//
+// This program is free software licensed under the GNU LGPL. You can
+// find a copy of this license in LICENSE.txt in the top directory of
+// the source code.
+//
+// Copyright 2007       Inge Wallin  <ingwa@kde.org>
+// Copyright 2007-2009  Torsten Rahn  <rahn@kde.org>
+// Copyright 2012		Cezar Mocan	<mocancezar@gmail.com>
+//
+
+// Local
+#include "CylindricalProjection.h"
+
+// Marble
+#include "ViewportParams.h"
+
+using namespace Marble;
+
+CylindricalProjection::CylindricalProjection()
+    : AbstractProjection(),
+	d( 0 )
+{
+}
+
+
+CylindricalProjection::~CylindricalProjection()
+{
+}
+
+
+QPainterPath CylindricalProjection::mapShape( const ViewportParams *viewport ) const
+{
+    // Convenience variables
+    int  width  = viewport->width();
+    int  height = viewport->height();
+
+    qreal  yTop;
+    qreal  yBottom;
+    qreal  xDummy;
+
+    // Get the top and bottom coordinates of the projected map.
+    screenCoordinates( 0.0, maxLat(), viewport, xDummy, yTop );
+    screenCoordinates( 0.0, minLat(), viewport, xDummy, yBottom );
+
+    // Don't let the map area be outside the image
+	if ( yTop < 0 )
+        yTop = 0;
+    if ( yBottom > height )
+        yBottom =  height;
+
+    QPainterPath mapShape;
+    mapShape.addRect(
+                    0,
+                    yTop,
+                    width,
+                    yBottom - yTop );
+
+    return mapShape;
+}
diff --git a/src/lib/Projections/CylindricalProjection.h \
b/src/lib/Projections/CylindricalProjection.h new file mode 100644
index 0000000..affd1e6
--- /dev/null
+++ b/src/lib/Projections/CylindricalProjection.h
@@ -0,0 +1,59 @@
+//
+// This file is part of the Marble Virtual Globe.
+//
+// This program is free software licensed under the GNU LGPL. You can
+// find a copy of this license in LICENSE.txt in the top directory of
+// the source code.
+//
+// Copyright 2007       Inge Wallin  <ingwa@kde.org>
+// Copyright 2007-2009  Torsten Rahn  <rahn@kde.org>
+// Copyright 2012		Cezar Mocan	<mocancezar@gmail.com>
+//
+
+#ifndef MARBLE_CYLINDRICALPROJECTION_H
+#define MARBLE_CYLINDRICALPROJECTION_H
+
+/** @file
+ * This file contains the headers for CylindricalProjection.
+ *
+ */
+
+#include "AbstractProjection.h"
+
+namespace Marble 
+{
+
+class CylindricalProjectionPrivate;
+
+/**
+ * @short A base class for the Equirectangular and Mercator projections in Marble
+ */
+
+class CylindricalProjection : public AbstractProjection
+{
+    // Not a QObject so far because we don't need to send signals.	
+  public:
+	
+	CylindricalProjection();
+
+	virtual ~CylindricalProjection();
+
+    virtual bool repeatableX() const { return true; };
+
+    virtual bool traversablePoles()  const { return false; }
+    virtual bool traversableDateLine()  const { return false; }
+
+    virtual SurfaceType surfaceType() const { return Cylindrical; }
+
+    virtual QPainterPath mapShape( const ViewportParams *viewport ) const;
+
+ private:
+    Q_DISABLE_COPY( CylindricalProjection )
+    CylindricalProjectionPrivate  * d;
+
+};
+
+}
+
+#endif
+
diff --git a/src/lib/Projections/EquirectProjection.cpp \
b/src/lib/Projections/EquirectProjection.cpp index 3216f75..4566d4f 100644
--- a/src/lib/Projections/EquirectProjection.cpp
+++ b/src/lib/Projections/EquirectProjection.cpp
@@ -21,7 +21,7 @@ using namespace Marble;
 
 
 EquirectProjection::EquirectProjection()
-    : AbstractProjection(),
+    : CylindricalProjection(),
       d( 0 )
 {
     setRepeatX( repeatableX() );
@@ -33,10 +33,13 @@ EquirectProjection::~EquirectProjection()
 {
 }
 
+/*
 bool EquirectProjection::repeatableX() const
 {
     return true;
 }
+*/
+
 
 qreal EquirectProjection::maxValidLat() const
 {
@@ -62,7 +65,7 @@ bool EquirectProjection::screenCoordinates( const qreal lon, const \
qreal lat,  const qreal centerLat = viewport->centerLatitude();
 
     qreal  rad2Pixel = 2.0 * viewport->radius() / M_PI;
- 
+
     // Let (x, y) be the position on the screen of the point.
     x = ( width  / 2.0 + ( lon - centerLon ) * rad2Pixel );
     y = ( height / 2.0 - ( lat - centerLat ) * rad2Pixel );
@@ -341,6 +344,7 @@ bool EquirectProjection::mapCoversViewport( const ViewportParams \
*viewport ) con  return true;
 }
 
+/*
 QPainterPath EquirectProjection::mapShape( const ViewportParams *viewport ) const
 {
     // Convenience variables
@@ -348,12 +352,13 @@ QPainterPath EquirectProjection::mapShape( const ViewportParams \
*viewport ) cons  int  width  = viewport->width();
     int  height = viewport->height();
 
-    // Calculate translation of center point
-    const qreal centerLat = viewport->centerLatitude();
+	qreal  yTop; 
+	qreal  yBottom;
+	qreal  xDummy;
 
-    int yCenterOffset = (int)( centerLat * (qreal)( 2 * radius ) / M_PI );
-    int yTop          = height / 2 - radius + yCenterOffset;
-    int yBottom       = yTop + 2 * radius;
+	// Get the top and bottom coordinates of the projected map
+    screenCoordinates( 0.0, maxLat(), viewport, xDummy, yTop );
+    screenCoordinates( 0.0, minLat(), viewport, xDummy, yBottom );
 
     // Don't let the map area be outside the image
     if ( yTop < 0 )
@@ -370,3 +375,4 @@ QPainterPath EquirectProjection::mapShape( const ViewportParams \
*viewport ) cons  
     return mapShape;
 }
+*/
diff --git a/src/lib/Projections/EquirectProjection.h \
b/src/lib/Projections/EquirectProjection.h index ca22966..dbd990e 100644
--- a/src/lib/Projections/EquirectProjection.h
+++ b/src/lib/Projections/EquirectProjection.h
@@ -22,7 +22,7 @@
  */
 
 
-#include "AbstractProjection.h"
+#include "CylindricalProjection.h"
 
 
 namespace Marble
@@ -34,7 +34,7 @@ class EquirectProjectionPrivate;
  * @short A class to implement the Equirectangular projection used by the "Flat Map" \
                view.
  */
 
-class EquirectProjection : public AbstractProjection
+class EquirectProjection : public CylindricalProjection
 {
     // Not a QObject so far because we don't need to send signals.
  public:
@@ -46,14 +46,17 @@ class EquirectProjection : public AbstractProjection
 
     virtual ~EquirectProjection();
 
-    virtual bool repeatableX() const;
+//    virtual bool repeatableX() const;
     virtual qreal  maxValidLat() const;
     virtual qreal  minValidLat() const;
 
-    virtual bool traversablePoles()  const { return false; }
-    virtual bool traversableDateLine()  const { return false; }
+//    virtual bool traversablePoles()  const { return false; }
+//    virtual bool traversableDateLine()  const { return false; }
+
+
+//    virtual SurfaceType surfaceType() const { return Cylindrical; }
+
 
-    virtual SurfaceType surfaceType() const { return Cylindrical; }
 
     virtual PreservationType preservationType() const { return NoPreservation; }
 
@@ -103,7 +106,7 @@ class EquirectProjection : public AbstractProjection
 
     bool mapCoversViewport( const ViewportParams *viewport ) const;
 
-    virtual QPainterPath mapShape( const ViewportParams *viewport ) const;
+//    virtual QPainterPath mapShape( const ViewportParams *viewport ) const;
 
  private:
     Q_DISABLE_COPY( EquirectProjection )
diff --git a/src/lib/Projections/MercatorProjection.cpp \
b/src/lib/Projections/MercatorProjection.cpp index fb63e21..cc21206 100644
--- a/src/lib/Projections/MercatorProjection.cpp
+++ b/src/lib/Projections/MercatorProjection.cpp
@@ -23,7 +23,7 @@
 using namespace Marble;
 
 MercatorProjection::MercatorProjection()
-    : AbstractProjection(),
+    : CylindricalProjection(),
       d( 0 )
 {
     setRepeatX( repeatableX() );
@@ -35,10 +35,13 @@ MercatorProjection::~MercatorProjection()
 {
 }
 
+/*
 bool MercatorProjection::repeatableX() const
 {
     return true;
 }
+*/
+
 
 qreal MercatorProjection::maxValidLat() const
 {
@@ -314,8 +317,7 @@ GeoDataLatLonAltBox MercatorProjection::latLonAltBox( const \
QRect& screenRect,  }
     }
     else {
-        // We need a point on the screen at maxLat that definitely
-        // gets displayed:
+        // We need a point on the screen at maxLat that definitely gets displayed:
         qreal averageLatitude = ( latLonAltBox.north() + latLonAltBox.south() ) / \
2.0;  
         GeoDataCoordinates maxLonPoint( +M_PI, averageLatitude, \
GeoDataCoordinates::Radian ); @@ -359,10 +361,11 @@ bool \
MercatorProjection::mapCoversViewport( const ViewportParams *viewport ) con  return \
true;  }
 
+/*
 QPainterPath MercatorProjection::mapShape( const ViewportParams *viewport ) const
 {
     // Convenience variables
-    //int  radius = viewport->radius();
+    int  radius = viewport->radius();
     int  width  = viewport->width();
     int  height = viewport->height();
 
@@ -370,11 +373,12 @@ QPainterPath MercatorProjection::mapShape( const ViewportParams \
*viewport ) cons  qreal  yBottom;
     qreal  xDummy;
 
-    // Get the top and bottom y coordinates of the projected map.
+    // Get the top and bottom coordinates of the projected map.
     screenCoordinates( 0.0, maxLat(), viewport, xDummy, yTop );
     screenCoordinates( 0.0, minLat(), viewport, xDummy, yBottom );
 
-    if ( yTop < 0 )
+    // Don't let the map area be outside the image
+	if ( yTop < 0 )
         yTop = 0;
     if ( yBottom > height )
         yBottom =  height;
@@ -388,3 +392,5 @@ QPainterPath MercatorProjection::mapShape( const ViewportParams \
*viewport ) cons  
     return mapShape;
 }
+*/
+
diff --git a/src/lib/Projections/MercatorProjection.h \
b/src/lib/Projections/MercatorProjection.h index 9d1e736..30fbb0a 100644
--- a/src/lib/Projections/MercatorProjection.h
+++ b/src/lib/Projections/MercatorProjection.h
@@ -22,7 +22,7 @@
  */
 
 
-#include "AbstractProjection.h"
+#include "CylindricalProjection.h"
 
 namespace Marble
 {
@@ -33,7 +33,7 @@ class MercatorProjectionPrivate;
  * @short A class to implement the Mercator projection.
  */
 
-class MercatorProjection : public AbstractProjection
+class MercatorProjection : public CylindricalProjection
 {
     // Not a QObject so far because we don't need to send signals.
  public:
@@ -45,14 +45,14 @@ class MercatorProjection : public AbstractProjection
 
     virtual ~MercatorProjection();
 
-    virtual bool repeatableX() const;
+//    virtual bool repeatableX() const;
     virtual qreal  maxValidLat() const;
     virtual qreal  minValidLat() const;
 
-    virtual bool traversablePoles() const { return false; }
-    virtual bool traversableDateLine() const { return false; }
+//    virtual bool traversablePoles() const { return false; }
+//    virtual bool traversableDateLine() const { return false; }
 
-    virtual SurfaceType surfaceType() const { return Cylindrical; }
+//    virtual SurfaceType surfaceType() const { return Cylindrical; }	
 
     virtual PreservationType preservationType() const { return Conformal; }
 
@@ -102,7 +102,7 @@ class MercatorProjection : public AbstractProjection
 
     bool  mapCoversViewport( const ViewportParams *viewport ) const;
 
-    virtual QPainterPath mapShape( const ViewportParams *viewport ) const;
+//    virtual QPainterPath mapShape( const ViewportParams *viewport ) const;
 
  private:
     Q_DISABLE_COPY( MercatorProjection )
diff --git a/src/lib/Projections/provisionalPatch.diff \
b/src/lib/Projections/provisionalPatch.diff new file mode 100644
index 0000000..958d079
--- /dev/null
+++ b/src/lib/Projections/provisionalPatch.diff
@@ -0,0 +1,242 @@
+diff --git a/src/lib/Projections/EquirectProjection.cpp \
b/src/lib/Projections/EquirectProjection.cpp +index 3216f75..4566d4f 100644
+--- a/src/lib/Projections/EquirectProjection.cpp
++++ b/src/lib/Projections/EquirectProjection.cpp
+@@ -21,7 +21,7 @@ using namespace Marble;
+ 
+ 
+ EquirectProjection::EquirectProjection()
+-    : AbstractProjection(),
++    : CylindricalProjection(),
+       d( 0 )
+ {
+     setRepeatX( repeatableX() );
+@@ -33,10 +33,13 @@ EquirectProjection::~EquirectProjection()
+ {
+ }
+ 
++/*
+ bool EquirectProjection::repeatableX() const
+ {
+     return true;
+ }
++*/
++
+ 
+ qreal EquirectProjection::maxValidLat() const
+ {
+@@ -62,7 +65,7 @@ bool EquirectProjection::screenCoordinates( const qreal lon, const \
qreal lat, +     const qreal centerLat = viewport->centerLatitude();
+ 
+     qreal  rad2Pixel = 2.0 * viewport->radius() / M_PI;
+- 
++
+     // Let (x, y) be the position on the screen of the point.
+     x = ( width  / 2.0 + ( lon - centerLon ) * rad2Pixel );
+     y = ( height / 2.0 - ( lat - centerLat ) * rad2Pixel );
+@@ -341,6 +344,7 @@ bool EquirectProjection::mapCoversViewport( const ViewportParams \
*viewport ) con +     return true;
+ }
+ 
++/*
+ QPainterPath EquirectProjection::mapShape( const ViewportParams *viewport ) const
+ {
+     // Convenience variables
+@@ -348,12 +352,13 @@ QPainterPath EquirectProjection::mapShape( const \
ViewportParams *viewport ) cons +     int  width  = viewport->width();
+     int  height = viewport->height();
+ 
+-    // Calculate translation of center point
+-    const qreal centerLat = viewport->centerLatitude();
++	qreal  yTop; 
++	qreal  yBottom;
++	qreal  xDummy;
+ 
+-    int yCenterOffset = (int)( centerLat * (qreal)( 2 * radius ) / M_PI );
+-    int yTop          = height / 2 - radius + yCenterOffset;
+-    int yBottom       = yTop + 2 * radius;
++	// Get the top and bottom coordinates of the projected map
++    screenCoordinates( 0.0, maxLat(), viewport, xDummy, yTop );
++    screenCoordinates( 0.0, minLat(), viewport, xDummy, yBottom );
+ 
+     // Don't let the map area be outside the image
+     if ( yTop < 0 )
+@@ -370,3 +375,4 @@ QPainterPath EquirectProjection::mapShape( const ViewportParams \
*viewport ) cons + 
+     return mapShape;
+ }
++*/
+diff --git a/src/lib/Projections/EquirectProjection.h \
b/src/lib/Projections/EquirectProjection.h +index ca22966..dbd990e 100644
+--- a/src/lib/Projections/EquirectProjection.h
++++ b/src/lib/Projections/EquirectProjection.h
+@@ -22,7 +22,7 @@
+  */
+ 
+ 
+-#include "AbstractProjection.h"
++#include "CylindricalProjection.h"
+ 
+ 
+ namespace Marble
+@@ -34,7 +34,7 @@ class EquirectProjectionPrivate;
+  * @short A class to implement the Equirectangular projection used by the "Flat \
Map" view. +  */
+ 
+-class EquirectProjection : public AbstractProjection
++class EquirectProjection : public CylindricalProjection
+ {
+     // Not a QObject so far because we don't need to send signals.
+  public:
+@@ -46,14 +46,17 @@ class EquirectProjection : public AbstractProjection
+ 
+     virtual ~EquirectProjection();
+ 
+-    virtual bool repeatableX() const;
++//    virtual bool repeatableX() const;
+     virtual qreal  maxValidLat() const;
+     virtual qreal  minValidLat() const;
+ 
+-    virtual bool traversablePoles()  const { return false; }
+-    virtual bool traversableDateLine()  const { return false; }
++//    virtual bool traversablePoles()  const { return false; }
++//    virtual bool traversableDateLine()  const { return false; }
++
++
++//    virtual SurfaceType surfaceType() const { return Cylindrical; }
++
+ 
+-    virtual SurfaceType surfaceType() const { return Cylindrical; }
+ 
+     virtual PreservationType preservationType() const { return NoPreservation; }
+ 
+@@ -103,7 +106,7 @@ class EquirectProjection : public AbstractProjection
+ 
+     bool mapCoversViewport( const ViewportParams *viewport ) const;
+ 
+-    virtual QPainterPath mapShape( const ViewportParams *viewport ) const;
++//    virtual QPainterPath mapShape( const ViewportParams *viewport ) const;
+ 
+  private:
+     Q_DISABLE_COPY( EquirectProjection )
+diff --git a/src/lib/Projections/MercatorProjection.cpp \
b/src/lib/Projections/MercatorProjection.cpp +index fb63e21..cc21206 100644
+--- a/src/lib/Projections/MercatorProjection.cpp
++++ b/src/lib/Projections/MercatorProjection.cpp
+@@ -23,7 +23,7 @@
+ using namespace Marble;
+ 
+ MercatorProjection::MercatorProjection()
+-    : AbstractProjection(),
++    : CylindricalProjection(),
+       d( 0 )
+ {
+     setRepeatX( repeatableX() );
+@@ -35,10 +35,13 @@ MercatorProjection::~MercatorProjection()
+ {
+ }
+ 
++/*
+ bool MercatorProjection::repeatableX() const
+ {
+     return true;
+ }
++*/
++
+ 
+ qreal MercatorProjection::maxValidLat() const
+ {
+@@ -314,8 +317,7 @@ GeoDataLatLonAltBox MercatorProjection::latLonAltBox( const \
QRect& screenRect, +         }
+     }
+     else {
+-        // We need a point on the screen at maxLat that definitely
+-        // gets displayed:
++        // We need a point on the screen at maxLat that definitely gets displayed:
+         qreal averageLatitude = ( latLonAltBox.north() + latLonAltBox.south() ) / \
2.0; +     
+         GeoDataCoordinates maxLonPoint( +M_PI, averageLatitude, \
GeoDataCoordinates::Radian ); +@@ -359,10 +361,11 @@ bool \
MercatorProjection::mapCoversViewport( const ViewportParams *viewport ) con +     \
return true; + }
+ 
++/*
+ QPainterPath MercatorProjection::mapShape( const ViewportParams *viewport ) const
+ {
+     // Convenience variables
+-    //int  radius = viewport->radius();
++    int  radius = viewport->radius();
+     int  width  = viewport->width();
+     int  height = viewport->height();
+ 
+@@ -370,11 +373,12 @@ QPainterPath MercatorProjection::mapShape( const \
ViewportParams *viewport ) cons +     qreal  yBottom;
+     qreal  xDummy;
+ 
+-    // Get the top and bottom y coordinates of the projected map.
++    // Get the top and bottom coordinates of the projected map.
+     screenCoordinates( 0.0, maxLat(), viewport, xDummy, yTop );
+     screenCoordinates( 0.0, minLat(), viewport, xDummy, yBottom );
+ 
+-    if ( yTop < 0 )
++    // Don't let the map area be outside the image
++	if ( yTop < 0 )
+         yTop = 0;
+     if ( yBottom > height )
+         yBottom =  height;
+@@ -388,3 +392,5 @@ QPainterPath MercatorProjection::mapShape( const ViewportParams \
*viewport ) cons + 
+     return mapShape;
+ }
++*/
++
+diff --git a/src/lib/Projections/MercatorProjection.h \
b/src/lib/Projections/MercatorProjection.h +index 9d1e736..30fbb0a 100644
+--- a/src/lib/Projections/MercatorProjection.h
++++ b/src/lib/Projections/MercatorProjection.h
+@@ -22,7 +22,7 @@
+  */
+ 
+ 
+-#include "AbstractProjection.h"
++#include "CylindricalProjection.h"
+ 
+ namespace Marble
+ {
+@@ -33,7 +33,7 @@ class MercatorProjectionPrivate;
+  * @short A class to implement the Mercator projection.
+  */
+ 
+-class MercatorProjection : public AbstractProjection
++class MercatorProjection : public CylindricalProjection
+ {
+     // Not a QObject so far because we don't need to send signals.
+  public:
+@@ -45,14 +45,14 @@ class MercatorProjection : public AbstractProjection
+ 
+     virtual ~MercatorProjection();
+ 
+-    virtual bool repeatableX() const;
++//    virtual bool repeatableX() const;
+     virtual qreal  maxValidLat() const;
+     virtual qreal  minValidLat() const;
+ 
+-    virtual bool traversablePoles() const { return false; }
+-    virtual bool traversableDateLine() const { return false; }
++//    virtual bool traversablePoles() const { return false; }
++//    virtual bool traversableDateLine() const { return false; }
+ 
+-    virtual SurfaceType surfaceType() const { return Cylindrical; }
++//    virtual SurfaceType surfaceType() const { return Cylindrical; }	
+ 
+     virtual PreservationType preservationType() const { return Conformal; }
+ 
+@@ -102,7 +102,7 @@ class MercatorProjection : public AbstractProjection
+ 
+     bool  mapCoversViewport( const ViewportParams *viewport ) const;
+ 
+-    virtual QPainterPath mapShape( const ViewportParams *viewport ) const;
++//    virtual QPainterPath mapShape( const ViewportParams *viewport ) const;
+ 
+  private:
+     Q_DISABLE_COPY( MercatorProjection )


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic