• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
ScanlineTextureMapperContext.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2007 Carlos Licea <carlos _licea@hotmail.com>
9 // Copyright 2011 Bernhard Beschow <bbeschow@cs.tu-berlin.de
10 //
11 
12 #include "ScanlineTextureMapperContext.h"
13 
14 #include <QImage>
15 
16 #include "MarbleDebug.h"
17 #include "StackedTile.h"
18 #include "StackedTileLoader.h"
19 #include "TileId.h"
20 #include "ViewParams.h"
21 #include "ViewportParams.h"
22 
23 using namespace Marble;
24 
25 ScanlineTextureMapperContext::ScanlineTextureMapperContext( StackedTileLoader * const tileLoader, int tileLevel )
26  : m_tileLoader( tileLoader ),
27  m_textureProjection( tileLoader->tileProjection() ), // cache texture projection
28  m_tileSize( tileLoader->tileSize() ), // cache tile size
29  m_tileLevel( tileLevel ),
30  m_globalWidth( m_tileSize.width() * m_tileLoader->tileColumnCount( m_tileLevel ) ),
31  m_globalHeight( m_tileSize.height() * m_tileLoader->tileRowCount( m_tileLevel ) ),
32  m_normGlobalWidth( m_globalWidth / ( 2 * M_PI ) ),
33  m_normGlobalHeight( m_globalHeight / M_PI ),
34  m_tile( 0 ),
35  m_deltaLevel( 0 ),
36  m_tilePosX( 65535 ),
37  m_tilePosY( 65535 ),
38  m_vTileStartX( 0 ),
39  m_vTileStartY( 0 ),
40  m_toTileCoordinatesLon( 0.5 * m_globalWidth - m_tilePosX ),
41  m_toTileCoordinatesLat( 0.5 * m_globalHeight - m_tilePosY ),
42  m_prevLat( 0.0 ),
43  m_prevLon( 0.0 )
44 {
45 }
46 
47 void ScanlineTextureMapperContext::pixelValueF( const qreal lon, const qreal lat,
48  QRgb* const scanLine )
49 {
50  // The same method using integers performs about 33% faster.
51  // However we need the qreal version to create the high quality mode.
52 
53  // Convert the lon and lat coordinates of the position on the scanline
54  // measured in radian to the pixel position of the requested
55  // coordinate on the current tile.
56 
57  qreal posX = m_toTileCoordinatesLon + rad2PixelX( lon );
58  qreal posY = m_toTileCoordinatesLat + rad2PixelY( lat );
59 
60  // Most of the time while moving along the scanLine we'll stay on the
61  // same tile. However at the tile border we might "fall off". If that
62  // happens we need to find out the next tile that needs to be loaded.
63 
64  if ( posX >= (qreal)( m_tileSize.width() )
65  || posX < 0.0
66  || posY >= (qreal)( m_tileSize.height() )
67  || posY < 0.0 )
68  {
69  nextTile( posX, posY );
70  }
71  if ( m_tile ) {
72  *scanLine = m_tile->pixelF( ( (int)posX + m_vTileStartX ) / ( 1 << m_deltaLevel ),
73  ( (int)posY + m_vTileStartY ) / ( 1 << m_deltaLevel ) );
74  }
75  else {
76  *scanLine = 0;
77  }
78 
79  m_prevLon = lon;
80  m_prevLat = lat; // preparing for interpolation
81 }
82 
83 void ScanlineTextureMapperContext::pixelValue( const qreal lon, const qreal lat,
84  QRgb* const scanLine )
85 {
86  // The same method using integers performs about 33% faster.
87  // However we need the qreal version to create the high quality mode.
88 
89  // Convert the lon and lat coordinates of the position on the scanline
90  // measured in radian to the pixel position of the requested
91  // coordinate on the current tile.
92 
93  int iPosX = (int)( m_toTileCoordinatesLon + rad2PixelX( lon ) );
94  int iPosY = (int)( m_toTileCoordinatesLat + rad2PixelY( lat ) );
95 
96  // Most of the time while moving along the scanLine we'll stay on the
97  // same tile. However at the tile border we might "fall off". If that
98  // happens we need to find out the next tile that needs to be loaded.
99 
100  if ( iPosX >= m_tileSize.width()
101  || iPosX < 0
102  || iPosY >= m_tileSize.height()
103  || iPosY < 0 )
104  {
105  nextTile( iPosX, iPosY );
106  }
107 
108  if ( m_tile ) {
109  *scanLine = m_tile->pixel( ( iPosX + m_vTileStartX ) >> m_deltaLevel,
110  ( iPosY + m_vTileStartY ) >> m_deltaLevel );
111  }
112  else {
113  *scanLine = 0;
114  }
115 
116  m_prevLon = lon;
117  m_prevLat = lat; // preparing for interpolation
118 }
119 
120 // This method interpolates color values for skipped pixels in a scanline.
121 //
122 // While moving along the scanline we don't move from pixel to pixel but
123 // leave out n pixels each time and calculate the exact position and
124 // color value for the new pixel. The pixel values in between get
125 // approximated through linear interpolation across the direct connecting
126 // line on the original tiles directly.
127 // This method will do by far most of the calculations for the
128 // texturemapping, so we move towards integer math to improve speed.
129 
130 void ScanlineTextureMapperContext::pixelValueApproxF( const qreal lon, const qreal lat,
131  QRgb *scanLine, const int n )
132 {
133  // stepLon/Lat: Distance between two subsequent approximated positions
134 
135  qreal stepLat = lat - m_prevLat;
136  qreal stepLon = lon - m_prevLon;
137 
138  // As long as the distance is smaller than 180 deg we can assume that
139  // we didn't cross the dateline.
140 
141  const qreal nInverse = 1.0 / (qreal)(n);
142 
143  if ( fabs(stepLon) < M_PI ) {
144  const qreal prevPixelX = rad2PixelX( m_prevLon );
145  const qreal prevPixelY = rad2PixelY( m_prevLat );
146 
147  const qreal itStepLon = ( rad2PixelX( lon ) - prevPixelX ) * nInverse;
148  const qreal itStepLat = ( rad2PixelY( lat ) - prevPixelY ) * nInverse;
149 
150  // To improve speed we unroll
151  // AbstractScanlineTextureMapper::pixelValue(...) here and
152  // calculate the performance critical issues via integers
153 
154  qreal itLon = prevPixelX + m_toTileCoordinatesLon;
155  qreal itLat = prevPixelY + m_toTileCoordinatesLat;
156 
157  const int tileWidth = m_tileSize.width();
158  const int tileHeight = m_tileSize.height();
159 
160  // int oldR = 0;
161  // int oldG = 0;
162  // int oldB = 0;
163 
164  QRgb oldRgb = qRgb( 0, 0, 0 );
165 
166  qreal oldPosX = -1;
167  qreal oldPosY = 0;
168 
169  const bool alwaysCheckTileRange =
170  isOutOfTileRangeF( itLon, itLat, itStepLon, itStepLat, n );
171 
172  for ( int j=1; j < n; ++j ) {
173  qreal posX = itLon + itStepLon * j;
174  qreal posY = itLat + itStepLat * j;
175  if ( alwaysCheckTileRange )
176  if ( posX >= tileWidth
177  || posX < 0.0
178  || posY >= tileHeight
179  || posY < 0.0 )
180  {
181  nextTile( posX, posY );
182  itLon = prevPixelX + m_toTileCoordinatesLon;
183  itLat = prevPixelY + m_toTileCoordinatesLat;
184  posX = qMax<qreal>( 0.0, qMin<qreal>( tileWidth-1.0, itLon + itStepLon * j ) );
185  posY = qMax<qreal>( 0.0, qMin<qreal>( tileHeight-1.0, itLat + itStepLat * j ) );
186  oldPosX = -1;
187  }
188 
189  *scanLine = m_tile->pixel( ( (int)posX + m_vTileStartX ) >> m_deltaLevel,
190  ( (int)posY + m_vTileStartY ) >> m_deltaLevel );
191 
192  // Just perform bilinear interpolation if there's a color change compared to the
193  // last pixel that was evaluated. This speeds up things greatly for maps like OSM
194  if ( *scanLine != oldRgb ) {
195  if ( oldPosX != -1 ) {
196  *(scanLine - 1) = m_tile->pixelF( ( oldPosX + m_vTileStartX ) / ( 1 << m_deltaLevel ),
197  ( oldPosY + m_vTileStartY ) / ( 1 << m_deltaLevel ),
198  *(scanLine - 1) );
199  oldPosX = -1;
200  }
201  oldRgb = m_tile->pixelF( ( posX + m_vTileStartX ) / ( 1 << m_deltaLevel ),
202  ( posY + m_vTileStartY ) / ( 1 << m_deltaLevel ),
203  *scanLine );
204  *scanLine = oldRgb;
205  }
206  else {
207  oldPosX = posX;
208  oldPosY = posY;
209  }
210 
211  // if ( needsFilter( *scanLine, oldR, oldB, oldG ) ) {
212  // *scanLine = m_tile->pixelF( posX, posY );
213  // }
214 
215  ++scanLine;
216  }
217  }
218 
219  // For the case where we cross the dateline between (lon, lat) and
220  // (prevlon, prevlat) we need a more sophisticated calculation.
221  // However as this will happen rather rarely, we use
222  // pixelValue(...) directly to make the code more readable.
223 
224  else {
225  stepLon = ( TWOPI - fabs(stepLon) ) * nInverse;
226  stepLat = stepLat * nInverse;
227  // We need to distinguish two cases:
228  // crossing the dateline from east to west ...
229 
230  if ( m_prevLon < lon ) {
231 
232  for ( int j = 1; j < n; ++j ) {
233  m_prevLat += stepLat;
234  m_prevLon -= stepLon;
235  if ( m_prevLon <= -M_PI )
236  m_prevLon += TWOPI;
237  pixelValueF( m_prevLon, m_prevLat, scanLine );
238  ++scanLine;
239  }
240  }
241 
242  // ... and vice versa: from west to east.
243 
244  else {
245  qreal curStepLon = lon - n * stepLon;
246 
247  for ( int j = 1; j < n; ++j ) {
248  m_prevLat += stepLat;
249  curStepLon += stepLon;
250  qreal evalLon = curStepLon;
251  if ( curStepLon <= -M_PI )
252  evalLon += TWOPI;
253  pixelValueF( evalLon, m_prevLat, scanLine );
254  ++scanLine;
255  }
256  }
257  }
258 }
259 
260 
261 bool ScanlineTextureMapperContext::isOutOfTileRangeF( const qreal itLon, const qreal itLat,
262  const qreal itStepLon, const qreal itStepLat,
263  const int n ) const
264 {
265  const qreal minIPosX = itLon + itStepLon;
266  const qreal minIPosY = itLat + itStepLat;
267  const qreal maxIPosX = itLon + itStepLon * ( n - 1 );
268  const qreal maxIPosY = itLat + itStepLat * ( n - 1 );
269  return ( maxIPosX >= m_tileSize.width() || maxIPosX < 0
270  || maxIPosY >= m_tileSize.height() || maxIPosY < 0
271  || minIPosX >= m_tileSize.width() || minIPosX < 0
272  || minIPosY >= m_tileSize.height() || minIPosY < 0 );
273 }
274 
275 
276 void ScanlineTextureMapperContext::pixelValueApprox( const qreal lon, const qreal lat,
277  QRgb *scanLine, const int n )
278 {
279  // stepLon/Lat: Distance between two subsequent approximated positions
280 
281  qreal stepLat = lat - m_prevLat;
282  qreal stepLon = lon - m_prevLon;
283 
284  // As long as the distance is smaller than 180 deg we can assume that
285  // we didn't cross the dateline.
286 
287  const qreal nInverse = 1.0 / (qreal)(n);
288 
289  if ( fabs(stepLon) < M_PI ) {
290  const qreal prevPixelX = rad2PixelX( m_prevLon );
291  const qreal prevPixelY = rad2PixelY( m_prevLat );
292 
293  const int itStepLon = (int)( ( rad2PixelX( lon ) - prevPixelX ) * nInverse * 128.0 );
294  const int itStepLat = (int)( ( rad2PixelY( lat ) - prevPixelY ) * nInverse * 128.0 );
295 
296  // To improve speed we unroll
297  // AbstractScanlineTextureMapper::pixelValue(...) here and
298  // calculate the performance critical issues via integers
299 
300  int itLon = (int)( ( prevPixelX + m_toTileCoordinatesLon ) * 128.0 );
301  int itLat = (int)( ( prevPixelY + m_toTileCoordinatesLat ) * 128.0 );
302 
303  const int tileWidth = m_tileSize.width();
304  const int tileHeight = m_tileSize.height();
305 
306  const bool alwaysCheckTileRange =
307  isOutOfTileRange( itLon, itLat, itStepLon, itStepLat, n );
308 
309  if ( !alwaysCheckTileRange ) {
310  int iPosXf = itLon;
311  int iPosYf = itLat;
312  for ( int j = 1; j < n; ++j ) {
313  iPosXf += itStepLon;
314  iPosYf += itStepLat;
315  *scanLine = m_tile->pixel( ( ( iPosXf >> 7 ) + m_vTileStartX ) >> m_deltaLevel,
316  ( ( iPosYf >> 7 ) + m_vTileStartY ) >> m_deltaLevel );
317  ++scanLine;
318  }
319  }
320  else {
321  for ( int j = 1; j < n; ++j ) {
322  int iPosX = ( itLon + itStepLon * j ) >> 7;
323  int iPosY = ( itLat + itStepLat * j ) >> 7;
324 
325  if ( iPosX >= tileWidth
326  || iPosX < 0
327  || iPosY >= tileHeight
328  || iPosY < 0 )
329  {
330  nextTile( iPosX, iPosY );
331  itLon = (int)( ( prevPixelX + m_toTileCoordinatesLon ) * 128.0 );
332  itLat = (int)( ( prevPixelY + m_toTileCoordinatesLat ) * 128.0 );
333  iPosX = ( itLon + itStepLon * j ) >> 7;
334  iPosY = ( itLat + itStepLat * j ) >> 7;
335  }
336 
337  *scanLine = m_tile->pixel( ( iPosX + m_vTileStartX ) >> m_deltaLevel,
338  ( iPosY + m_vTileStartY ) >> m_deltaLevel );
339  ++scanLine;
340  }
341  }
342  }
343 
344  // For the case where we cross the dateline between (lon, lat) and
345  // (prevlon, prevlat) we need a more sophisticated calculation.
346  // However as this will happen rather rarely, we use
347  // pixelValue(...) directly to make the code more readable.
348 
349  else {
350  stepLon = ( TWOPI - fabs(stepLon) ) * nInverse;
351  stepLat = stepLat * nInverse;
352  // We need to distinguish two cases:
353  // crossing the dateline from east to west ...
354 
355  if ( m_prevLon < lon ) {
356 
357  for ( int j = 1; j < n; ++j ) {
358  m_prevLat += stepLat;
359  m_prevLon -= stepLon;
360  if ( m_prevLon <= -M_PI )
361  m_prevLon += TWOPI;
362  pixelValue( m_prevLon, m_prevLat, scanLine );
363  ++scanLine;
364  }
365  }
366 
367  // ... and vice versa: from west to east.
368 
369  else {
370  qreal curStepLon = lon - n * stepLon;
371 
372  for ( int j = 1; j < n; ++j ) {
373  m_prevLat += stepLat;
374  curStepLon += stepLon;
375  qreal evalLon = curStepLon;
376  if ( curStepLon <= -M_PI )
377  evalLon += TWOPI;
378  pixelValue( evalLon, m_prevLat, scanLine );
379  ++scanLine;
380  }
381  }
382  }
383 }
384 
385 
386 bool ScanlineTextureMapperContext::isOutOfTileRange( const int itLon, const int itLat,
387  const int itStepLon, const int itStepLat,
388  const int n ) const
389 {
390  const int minIPosX = ( itLon + itStepLon ) >> 7;
391  const int minIPosY = ( itLat + itStepLat ) >> 7;
392  const int maxIPosX = ( itLon + itStepLon * ( n - 1 ) ) >> 7;
393  const int maxIPosY = ( itLat + itStepLat * ( n - 1 ) ) >> 7;
394  return ( maxIPosX >= m_tileSize.width() || maxIPosX < 0
395  || maxIPosY >= m_tileSize.height() || maxIPosY < 0
396  || minIPosX >= m_tileSize.width() || minIPosX < 0
397  || minIPosY >= m_tileSize.height() || minIPosY < 0 );
398 }
399 
400 
401 int ScanlineTextureMapperContext::interpolationStep( const ViewportParams *viewport, MapQuality mapQuality )
402 {
403  if ( mapQuality == PrintQuality ) {
404  return 1; // Don't interpolate for print quality.
405  }
406 
407  if ( ! viewport->mapCoversViewport() ) {
408  return 8;
409  }
410 
411  // Find the optimal interpolation interval m_nBest for the
412  // current image canvas width
413  const int width = viewport->width();
414 
415  int nBest = 2;
416  int nEvalMin = width - 1;
417  for ( int it = 1; it < 48; ++it ) {
418  int nEval = ( width - 1 ) / it + ( width - 1 ) % it;
419  if ( nEval < nEvalMin ) {
420  nEvalMin = nEval;
421  nBest = it;
422  }
423  }
424 
425  return nBest;
426 }
427 
428 
429 QImage::Format ScanlineTextureMapperContext::optimalCanvasImageFormat( const ViewportParams *viewport )
430 {
431  // If the globe covers fully the screen then we can use the faster
432  // RGB32 as there are no translucent areas involved.
433  QImage::Format imageFormat = ( viewport->mapCoversViewport() )
434  ? QImage::Format_RGB32
435  : QImage::Format_ARGB32_Premultiplied;
436 
437  return imageFormat;
438 }
439 
440 
441 void ScanlineTextureMapperContext::nextTile( int &posX, int &posY )
442 {
443  // Move from tile coordinates to global texture coordinates
444  // ( with origin in upper left corner, measured in pixel)
445 
446  int lon = posX + m_tilePosX;
447  if ( lon >= m_globalWidth )
448  lon -= m_globalWidth;
449  else if ( lon < 0 )
450  lon += m_globalWidth;
451 
452  int lat = posY + m_tilePosY;
453  if ( lat >= m_globalHeight )
454  lat -= m_globalHeight;
455  else if ( lat < 0 )
456  lat += m_globalHeight;
457 
458  // tileCol counts the tile columns left from the current tile.
459  // tileRow counts the tile rows on the top from the current tile.
460 
461  const int tileCol = lon / m_tileSize.width();
462  const int tileRow = lat / m_tileSize.height();
463 
464  m_deltaLevel = 0;
465  m_tile = m_tileLoader->loadTile( TileId( 0, m_tileLevel - m_deltaLevel, tileCol >> m_deltaLevel, tileRow >> m_deltaLevel ) );
466 
467  // Update position variables:
468  // m_tilePosX/Y stores the position of the tiles in
469  // global texture coordinates
470  // ( origin upper left, measured in pixels )
471 
472  m_tilePosX = tileCol * m_tileSize.width();
473  m_vTileStartX = ( tileCol - ( ( tileCol >> m_deltaLevel ) << m_deltaLevel ) ) * m_tileSize.width();
474  m_toTileCoordinatesLon = (qreal)(0.5 * m_globalWidth - m_tilePosX);
475  posX = lon - m_tilePosX;
476 
477  m_tilePosY = tileRow * m_tileSize.height();
478  m_vTileStartY = ( tileRow - ( ( tileRow >> m_deltaLevel ) << m_deltaLevel ) ) * m_tileSize.height();
479  m_toTileCoordinatesLat = (qreal)(0.5 * m_globalHeight - m_tilePosY);
480  posY = lat - m_tilePosY;
481 }
482 
483 void ScanlineTextureMapperContext::nextTile( qreal &posX, qreal &posY )
484 {
485  // Move from tile coordinates to global texture coordinates
486  // ( with origin in upper left corner, measured in pixel)
487 
488  int lon = (int)(posX + m_tilePosX);
489  if ( lon >= m_globalWidth )
490  lon -= m_globalWidth;
491  else if ( lon < 0 )
492  lon += m_globalWidth;
493 
494  int lat = (int)(posY + m_tilePosY);
495  if ( lat >= m_globalHeight )
496  lat -= m_globalHeight;
497  else if ( lat < 0 )
498  lat += m_globalHeight;
499 
500  // tileCol counts the tile columns left from the current tile.
501  // tileRow counts the tile rows on the top from the current tile.
502 
503  const int tileCol = lon / m_tileSize.width();
504  const int tileRow = lat / m_tileSize.height();
505 
506  m_deltaLevel = 0;
507  m_tile = m_tileLoader->loadTile( TileId( 0, m_tileLevel - m_deltaLevel, tileCol >> m_deltaLevel, tileRow >> m_deltaLevel ) );
508 
509  // Update position variables:
510  // m_tilePosX/Y stores the position of the tiles in
511  // global texture coordinates
512  // ( origin upper left, measured in pixels )
513 
514  m_tilePosX = tileCol * m_tileSize.width();
515  m_vTileStartX = ( tileCol - ( ( tileCol >> m_deltaLevel ) << m_deltaLevel ) ) * m_tileSize.width();
516  m_toTileCoordinatesLon = (qreal)(0.5 * m_globalWidth - m_tilePosX);
517  posX = lon - m_tilePosX;
518 
519  m_tilePosY = tileRow * m_tileSize.height();
520  m_vTileStartY = ( tileRow - ( ( tileRow >> m_deltaLevel ) << m_deltaLevel ) ) * m_tileSize.height();
521  m_toTileCoordinatesLat = (qreal)(0.5 * m_globalHeight - m_tilePosY);
522  posY = lat - m_tilePosY;
523 }
Marble::ScanlineTextureMapperContext::pixelValueApprox
void pixelValueApprox(const qreal lon, const qreal lat, QRgb *scanLine, const int n)
Definition: ScanlineTextureMapperContext.cpp:276
Marble::ScanlineTextureMapperContext::pixelValue
void pixelValue(const qreal lon, const qreal lat, QRgb *const scanLine)
Definition: ScanlineTextureMapperContext.cpp:83
TileId.h
QSize::width
int width() const
Marble::StackedTile::pixelF
uint pixelF(qreal x, qreal y) const
Returns the color value of the result tile at a given floating point position.
Definition: StackedTile.cpp:237
Marble::PrintQuality
Print quality.
Definition: MarbleGlobal.h:87
Marble::MapQuality
MapQuality
This enum is used to choose the map quality shown in the view.
Definition: MarbleGlobal.h:82
ScanlineTextureMapperContext.h
MarbleDebug.h
Marble::StackedTileLoader
Tile loading from a quad tree.
Definition: StackedTileLoader.h:59
Marble::ScanlineTextureMapperContext::ScanlineTextureMapperContext
ScanlineTextureMapperContext(StackedTileLoader *const tileLoader, int tileLevel)
Definition: ScanlineTextureMapperContext.cpp:25
ViewParams.h
This file contains the headers for ViewParameters.
Marble::ViewportParams::width
int width() const
Definition: ViewportParams.cpp:250
Marble::ViewportParams::mapCoversViewport
bool mapCoversViewport() const
Definition: ViewportParams.cpp:398
Marble::ScanlineTextureMapperContext::optimalCanvasImageFormat
static QImage::Format optimalCanvasImageFormat(const ViewportParams *viewport)
Definition: ScanlineTextureMapperContext.cpp:429
Marble::ScanlineTextureMapperContext::pixelValueApproxF
void pixelValueApproxF(const qreal lon, const qreal lat, QRgb *scanLine, const int n)
Definition: ScanlineTextureMapperContext.cpp:130
Marble::ViewportParams
A public class that controls what is visible in the viewport of a Marble map.
Definition: ViewportParams.h:44
Marble::TWOPI
const qreal TWOPI
Definition: GeoDataCoordinates.h:35
ViewportParams.h
This file contains the headers for ViewportParams.
Marble::ScanlineTextureMapperContext::pixelValueF
void pixelValueF(const qreal lon, const qreal lat, QRgb *const scanLine)
Definition: ScanlineTextureMapperContext.cpp:47
Marble::TileId
Definition: TileId.h:27
Marble::StackedTile::pixel
uint pixel(int x, int y) const
Returns the color value of the result tile at the given integer position.
Definition: StackedTile.cpp:83
Marble::ScanlineTextureMapperContext::interpolationStep
static int interpolationStep(const ViewportParams *viewport, MapQuality mapQuality)
Definition: ScanlineTextureMapperContext.cpp:401
StackedTile.h
QSize::height
int height() const
M_PI
#define M_PI
Definition: GeoDataCoordinates.h:26
Marble::StackedTileLoader::loadTile
const StackedTile * loadTile(TileId const &stackedTileId)
Loads a tile and returns it.
Definition: StackedTileLoader.cpp:118
StackedTileLoader.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:41 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal