[Marble-commits] KDE/kdeedu/marble/src/lib

Bernhard Beschow bbeschow at cs.tu-berlin.de
Mon Aug 2 18:45:32 CEST 2010


Am Freitag, 30. Juli 2010, 21:52:03 schrieb Torsten Rahn:
> 
> Hi Bernhard,

Hi Torsten,

> Hey, you are currently refactoring AbstractScanlineTextureMapper while I'm 
> currently working on a major refactoring as well. :-/
> 
> Could I convince you to hold off for a few more days with refactoring 
> AbstractScanlineTextureMapper until I'm done and until I have committed my part? 
> It would make life for me a lot more easy :-)

Sure. ;-)

When will you roughly commit? I'm so excited about the changes. :-)

Greetings,
Bernhard

> Thanks, 
> 
> Torsten
> 
> On Friday 30 July 2010 19:30:15 Bernhard Beschow wrote:
> > SVN commit 1157325 by beschow:
> > 
> > remove AbstractScanlineTextureMapper::resizeMap() and the therein updated
> > members
> > 
> > According to the single point of truth principle, calculate the respective
> > values dynamically rather than relying on an external entity to keep them
> > synchronized to the view parameters.
> > The performance impact should not be dramatic since they are computed once
> > before an expensive operation.
> > 
> >  M  +16 -23    AbstractScanlineTextureMapper.cpp
> >  M  +1 -7      AbstractScanlineTextureMapper.h
> >  M  +10 -8     EquirectScanlineTextureMapper.cpp
> >  M  +0 -3      MarbleModel.cpp
> >  M  +11 -9     MercatorScanlineTextureMapper.cpp
> >  M  +17 -15    SphericalScanlineTextureMapper.cpp
> > 
> > 
> > --- trunk/KDE/kdeedu/marble/src/lib/AbstractScanlineTextureMapper.cpp
> > #1157324:1157325 @@ -28,8 +28,6 @@
> > 
> >      : QObject( parent ),
> > 
> >        m_maxGlobalX( 0 ),
> >        m_maxGlobalY( 0 ),
> > -      m_imageHeight( 0 ),
> > -      m_imageWidth( 0 ),
> >        m_prevLat( 0.0 ),
> >        m_prevLon( 0.0 ),
> >        m_toTileCoordinatesLon( 0.0 ),
> > @@ -118,25 +116,6 @@
> >  }
> > 
> > 
> > -void AbstractScanlineTextureMapper::resizeMap(int width, int height)
> > -{
> > -    m_imageHeight = height;
> > -    m_imageWidth  = width;
> > -
> > -    // Find the optimal interpolation interval m_nBest for the
> > -    // current image canvas width
> > -    m_nBest = 2;
> > -
> > -    int  nEvalMin = m_imageWidth - 1;
> > -    for ( int it = 1; it < 48; ++it ) {
> > -        int nEval = ( m_imageWidth - 1 ) / it + ( m_imageWidth - 1 ) % it;
> > -        if ( nEval < nEvalMin ) {
> > -            nEvalMin = nEval;
> > -            m_nBest = it;
> > -        }
> > -    }
> > -}
> > -
> >  void AbstractScanlineTextureMapper::pixelValueF(qreal lon,
> >                                                 qreal lat,
> >                                                 QRgb* scanLine )
> > @@ -480,7 +459,7 @@
> >  }
> > 
> > 
> > -int AbstractScanlineTextureMapper::interpolationStep( ViewParams
> > *viewParams ) const +int AbstractScanlineTextureMapper::interpolationStep(
> > ViewParams *viewParams ) {
> >      if ( viewParams->mapQuality() == PrintQuality ) {
> >          return 1;    // Don't interpolate for print quality.
> > @@ -490,10 +469,24 @@
> >          return 8;
> >      }
> > 
> > -    return m_nBest;
> > +    // Find the optimal interpolation interval m_nBest for the
> > +    // current image canvas width
> > +    const int width = viewParams->canvasImage()->width();
> > +
> > +    int nBest = 2;
> > +    int nEvalMin = width - 1;
> > +    for ( int it = 1; it < 48; ++it ) {
> > +        int nEval = ( width - 1 ) / it + ( width - 1 ) % it;
> > +        if ( nEval < nEvalMin ) {
> > +            nEvalMin = nEval;
> > +            nBest = it;
> >  }
> > +    }
> > 
> > +    return nBest;
> > +}
> > 
> > +
> >  void AbstractScanlineTextureMapper::nextTile( int &posX, int &posY )
> >  {
> >      // Move from tile coordinates to global texture coordinates
> > --- trunk/KDE/kdeedu/marble/src/lib/AbstractScanlineTextureMapper.h
> > #1157324:1157325 @@ -41,7 +41,6 @@
> > 
> >      virtual void mapTexture( ViewParams *viewParams ) = 0;
> > 
> > -    virtual void resizeMap( int width, int height );
> >      bool interlaced() const;
> >      void setInterlaced( bool enabled );
> >      int tileZoomLevel() const;
> > @@ -65,7 +64,7 @@
> >      void pixelValueApprox(const qreal& lon, const qreal& lat,
> >                            QRgb *scanLine, int n );
> > 
> > -    int interpolationStep( ViewParams *viewParams ) const;
> > +    static int interpolationStep( ViewParams *viewParams );
> > 
> >      // method for fast integer calculation
> >      void nextTile( int& posx, int& posy );
> > @@ -100,9 +99,6 @@
> >      int     m_maxGlobalX;
> >      int     m_maxGlobalY; // could be private also
> > 
> > -    int     m_imageHeight;
> > -    int     m_imageWidth;
> > -
> >      // Previous coordinates
> >      qreal  m_prevLat;
> >      qreal  m_prevLon;
> > @@ -135,8 +131,6 @@
> >      StackedTile *m_tile;
> >      int         m_previousRadius;
> > 
> > -    int         m_nBest;
> > -
> >      int         m_tileLevel;
> >      int         m_maxTileLevel;
> >      int         m_globalWidth;
> > --- trunk/KDE/kdeedu/marble/src/lib/EquirectScanlineTextureMapper.cpp
> > #1157324:1157325 @@ -41,6 +41,8 @@
> >  void EquirectScanlineTextureMapper::mapTexture( ViewParams *viewParams )
> >  {
> >      QImage       *canvasImage = viewParams->canvasImage();
> > +    const int imageHeight = canvasImage->height();
> > +    const int imageWidth  = canvasImage->width();
> >      const qint64  radius      = viewParams->radius();
> > 
> >      const bool highQuality  = ( viewParams->mapQuality() == HighQuality
> > @@ -85,17 +87,17 @@
> > 
> >      // Calculate y-range the represented by the center point, yTop and
> >      // what actually can be painted
> > -    yPaintedTop    = yTop = m_imageHeight / 2 - radius + yCenterOffset;
> > -    yPaintedBottom = m_imageHeight / 2 + radius + yCenterOffset;
> > +    yPaintedTop    = yTop = imageHeight / 2 - radius + yCenterOffset;
> > +    yPaintedBottom = imageHeight / 2 + radius + yCenterOffset;
> > 
> >      if (yPaintedTop < 0)                yPaintedTop = 0;
> > -    if (yPaintedTop > m_imageHeight)    yPaintedTop = m_imageHeight;
> > +    if (yPaintedTop > imageHeight)    yPaintedTop = imageHeight;
> >      if (yPaintedBottom < 0)             yPaintedBottom = 0;
> > -    if (yPaintedBottom > m_imageHeight) yPaintedBottom = m_imageHeight;
> > +    if (yPaintedBottom > imageHeight) yPaintedBottom = imageHeight;
> > 
> >      const qreal pixel2Rad = 1.0/rad2Pixel;
> > 
> > -    qreal leftLon = + centerLon - ( m_imageWidth / 2 * pixel2Rad );
> > +    qreal leftLon = + centerLon - ( imageWidth / 2 * pixel2Rad );
> >      while ( leftLon < -M_PI ) leftLon += 2 * M_PI;
> >      while ( leftLon >  M_PI ) leftLon -= 2 * M_PI;
> > 
> > @@ -149,7 +151,7 @@
> >                  scanLine += ( n - 1 );
> >              }
> > 
> > -            if ( x < m_imageWidth ) {
> > +            if ( x < imageWidth ) {
> >                  if ( highQuality )
> >                      pixelValueF( lon, lat, scanLine );
> >                  else
> > @@ -165,7 +167,7 @@
> >          // copy scanline to improve performance
> >          if ( interlaced && y + 1 < yPaintedBottom ) {
> > 
> > -            int pixelByteSize = canvasImage->bytesPerLine() /
> > m_imageWidth; +            int pixelByteSize = canvasImage->bytesPerLine()
> > / imageWidth;
> > 
> >              memcpy( canvasImage->scanLine( y + 1 ) + xLeft *
> > pixelByteSize, canvasImage->scanLine( y ) + xLeft * pixelByteSize, @@
> > -176,7 +178,7 @@
> > 
> >      // Remove unused lines
> >      const int clearStart = ( yPaintedTop - m_oldYPaintedTop <= 0 ) ?
> > yPaintedBottom : 0; -    const int clearStop  = ( yPaintedTop -
> > m_oldYPaintedTop <= 0 ) ? m_imageHeight  : yTop; +    const int clearStop 
> > = ( yPaintedTop - m_oldYPaintedTop <= 0 ) ? imageHeight  : yTop;
> > 
> >      QRgb * const clearBegin = (QRgb*)( canvasImage->scanLine( clearStart )
> > ); QRgb * const clearEnd = (QRgb*)( canvasImage->scanLine( clearStop ) );
> > --- trunk/KDE/kdeedu/marble/src/lib/MarbleModel.cpp #1157324:1157325 @@
> > -543,9 +543,6 @@
> > 
> >  void MarbleModelPrivate::resize( int width, int height )
> >  {
> > -    if ( m_mapTheme->map()->hasTextureLayers() ) {
> > -        m_texmapper->resizeMap( width, height );
> > -    }
> >      if ( m_veccomposer ) {
> >          m_veccomposer->resizeMap( width, height );
> >      }
> > --- trunk/KDE/kdeedu/marble/src/lib/MercatorScanlineTextureMapper.cpp
> > #1157324:1157325 @@ -43,6 +43,8 @@
> >  void MercatorScanlineTextureMapper::mapTexture( ViewParams *viewParams )
> >  {
> >      QImage       *canvasImage = viewParams->canvasImage();
> > +    const int imageHeight = canvasImage->height();
> > +    const int imageWidth  = canvasImage->width();
> >      const qint64  radius      = viewParams->radius();
> > 
> >      const bool highQuality  = ( viewParams->mapQuality() == HighQuality
> > @@ -89,17 +91,17 @@
> > 
> >      // Calculate y-range the represented by the center point, yTop and
> >      // what actually can be painted
> > -    yPaintedTop    = yTop = m_imageHeight / 2 - 2 * radius +
> > yCenterOffset; -    yPaintedBottom        = m_imageHeight / 2 + 2 * radius
> > + yCenterOffset; +    yPaintedTop    = yTop = imageHeight / 2 - 2 * radius
> > + yCenterOffset; +    yPaintedBottom        = imageHeight / 2 + 2 * radius
> > + yCenterOffset;
> > 
> >      if (yPaintedTop < 0)                yPaintedTop = 0;
> > -    if (yPaintedTop > m_imageHeight)    yPaintedTop = m_imageHeight;
> > +    if (yPaintedTop > imageHeight)    yPaintedTop = imageHeight;
> >      if (yPaintedBottom < 0)             yPaintedBottom = 0;
> > -    if (yPaintedBottom > m_imageHeight) yPaintedBottom = m_imageHeight;
> > +    if (yPaintedBottom > imageHeight) yPaintedBottom = imageHeight;
> > 
> >      const qreal pixel2Rad = 1.0/rad2Pixel;
> > 
> > -    qreal leftLon = + centerLon - ( m_imageWidth / 2 * pixel2Rad );
> > +    qreal leftLon = + centerLon - ( imageWidth / 2 * pixel2Rad );
> >      while ( leftLon < -M_PI ) leftLon += 2 * M_PI;
> >      while ( leftLon >  M_PI ) leftLon -= 2 * M_PI;
> > 
> > @@ -127,7 +129,7 @@
> >          int  xIpRight = n * (int)( xRight / n - 1 ) + 1;
> > 
> >          lon = leftLon;
> > -        lat = atan( sinh( ( (m_imageHeight / 2 + yCenterOffset) - y )
> > +        lat = atan( sinh( ( (imageHeight / 2 + yCenterOffset) - y )
> >                      * pixel2Rad ) );
> > 
> >          for ( int x = xLeft; x < xRight; ++x ) {
> > @@ -154,7 +156,7 @@
> >                  scanLine += ( n - 1 );
> >              }
> > 
> > -            if ( x < m_imageWidth ) {
> > +            if ( x < imageWidth ) {
> >                  if ( highQuality )
> >                      pixelValueF( lon, lat, scanLine );
> >                  else
> > @@ -170,7 +172,7 @@
> >          // copy scanline to improve performance
> >          if ( interlaced && y + 1 < yPaintedBottom ) {
> > 
> > -            int pixelByteSize = canvasImage->bytesPerLine() /
> > m_imageWidth; +            int pixelByteSize = canvasImage->bytesPerLine()
> > / imageWidth;
> > 
> >              memcpy( canvasImage->scanLine( y + 1 ) + xLeft *
> > pixelByteSize, canvasImage->scanLine( y ) + xLeft * pixelByteSize, @@
> > -181,7 +183,7 @@
> > 
> >      // Remove unused lines
> >      const int clearStart = ( yPaintedTop - m_oldYPaintedTop <= 0 ) ?
> > yPaintedBottom : 0; -    const int clearStop  = ( yPaintedTop -
> > m_oldYPaintedTop <= 0 ) ? m_imageHeight  : yTop; +    const int clearStop 
> > = ( yPaintedTop - m_oldYPaintedTop <= 0 ) ? imageHeight  : yTop;
> > 
> >      QRgb * const clearBegin = (QRgb*)( canvasImage->scanLine( clearStart )
> > ); QRgb * const clearEnd = (QRgb*)( canvasImage->scanLine( clearStop ) );
> > --- trunk/KDE/kdeedu/marble/src/lib/SphericalScanlineTextureMapper.cpp
> > #1157324:1157325 @@ -38,6 +38,8 @@
> >  void SphericalScanlineTextureMapper::mapTexture( ViewParams *viewParams )
> >  {
> >      QImage       *canvasImage = viewParams->canvasImage();
> > +    const int imageHeight = canvasImage->height();
> > +    const int imageWidth  = canvasImage->width();
> >      const qint64  radius      = viewParams->radius();
> > 
> >      const bool highQuality  = ( viewParams->mapQuality() == HighQuality
> > @@ -80,22 +82,22 @@
> >      int skip = interlaced ? 1 : 0;
> > 
> >      // Calculate the actual y-range of the map on the screen
> > -    const int yTop = ( ( m_imageHeight / 2 - radius < 0 )
> > -                       ? 0 : m_imageHeight / 2 - radius );
> > +    const int yTop = ( ( imageHeight / 2 - radius < 0 )
> > +                       ? 0 : imageHeight / 2 - radius );
> >      const int yBottom = ( (yTop == 0)
> > -                          ? m_imageHeight - skip
> > +                          ? imageHeight - skip
> > 
> >                            : yTop + radius + radius - skip );
> > 
> >      for ( int y = yTop; y < yBottom ; ++y ) {
> > 
> >          // Evaluate coordinates for the 3D position vector of the current
> > pixel -        const qreal qy = inverseRadius * (qreal)( m_imageHeight / 2
> > - y ); +        const qreal qy = inverseRadius * (qreal)( imageHeight / 2
> > - y ); const qreal qr = 1.0 - qy * qy;
> > 
> >          // rx is the radius component in x direction
> >          int rx = (int)sqrt( (qreal)( radius * radius
> > -                                      - ( ( y - m_imageHeight / 2 )
> > -                                          * ( y - m_imageHeight / 2 ) ) )
> > ); +                                      - ( ( y - imageHeight / 2 ) +   
> >                                       * ( y - imageHeight / 2 ) ) ) );
> > 
> >          // Calculate the actual x-range of the map within the current
> > scanline. //
> > @@ -109,9 +111,9 @@
> >          // In that situation xLeft equals zero.
> >          // For xRight the situation is similar.
> > 
> > -        const int xLeft  = ( ( m_imageWidth / 2 - rx > 0 )
> > -                             ? m_imageWidth / 2 - rx : 0 );
> > -        const int xRight = ( ( m_imageWidth / 2 - rx > 0 )
> > +        const int xLeft  = ( ( imageWidth / 2 - rx > 0 )
> > +                             ? imageWidth / 2 - rx : 0 );
> > +        const int xRight = ( ( imageWidth / 2 - rx > 0 )
> >                               ? xLeft + rx + rx : canvasImage->width() );
> > 
> >          QRgb * scanLine = (QRgb*)( canvasImage->scanLine( y ) ) + xLeft;
> > @@ -119,14 +121,14 @@
> >          int  xIpLeft  = 1;
> >          int  xIpRight = n * (int)( xRight / n - 1 ) + 1;
> > 
> > -        if ( m_imageWidth / 2 - rx > 0 ) {
> > +        if ( imageWidth / 2 - rx > 0 ) {
> >              xIpLeft  = n * (int)( xLeft  / n + 1 );
> >              xIpRight = n * (int)( xRight / n - 1 );
> >          }
> > 
> >          // Decrease pole distortion due to linear approximation ( y-axis )
> >          bool crossingPoleArea = false;
> > -        int northPoleY = m_imageHeight / 2 - (int)( radius *
> > northPole.v[Q_Y] ); +        int northPoleY = imageHeight / 2 - (int)(
> > radius * northPole.v[Q_Y] ); if ( northPole.v[Q_Z] > 0
> >               && northPoleY - ( n * 0.75 ) <= y
> >               && northPoleY + ( n * 0.75 ) >= y )
> > @@ -145,7 +147,7 @@
> >              if ( x >= xIpLeft && x <= xIpRight ) {
> > 
> >                  // Decrease pole distortion due to linear approximation (
> > x-axis ) -                int northPoleX = m_imageWidth / 2 + (int)(
> > radius * northPole.v[Q_X] ); +                int northPoleX = imageWidth
> > / 2 + (int)( radius * northPole.v[Q_X] );
> > 
> >  //                mDebug() << QString("NorthPole X: %1, LeftInterval:
> > %2").arg( northPoleX ).arg( leftInterval ); if ( crossingPoleArea
> > @@ -166,7 +168,7 @@
> > 
> >              // Evaluate more coordinates for the 3D position vector of
> >              // the current pixel.
> > -            const qreal qx = (qreal)( x - m_imageWidth / 2 ) *
> > inverseRadius; +            const qreal qx = (qreal)( x - imageWidth / 2 )
> > * inverseRadius;
> > 
> >              const qreal qr2z = qr - qx * qx;
> >              const qreal qz = ( qr2z > 0.0 ) ? sqrt( qr2z ) : 0.0;
> > @@ -197,7 +199,7 @@
> >  //          rendering around north pole:
> > 
> >  //            if ( !crossingPoleArea )
> > -            if ( x < m_imageWidth ) {
> > +            if ( x < imageWidth ) {
> >                  if ( highQuality )
> >                      pixelValueF( lon, lat, scanLine );
> >                  else
> > @@ -212,7 +214,7 @@
> >          // copy scanline to improve performance
> >          if ( interlaced && y + 1 < yBottom ) {
> > 
> > -            int pixelByteSize = canvasImage->bytesPerLine() /
> > m_imageWidth; +            int pixelByteSize = canvasImage->bytesPerLine()
> > / imageWidth;
> > 
> >              memcpy( canvasImage->scanLine( y + 1 ) + xLeft *
> > pixelByteSize, canvasImage->scanLine( y ) + xLeft * pixelByteSize,
> > _______________________________________________
> > Marble-commits mailing list
> > Marble-commits at kde.org
> > https://mail.kde.org/mailman/listinfo/marble-commits
> 
> 



More information about the Marble-commits mailing list