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

marble

  • sources
  • kde-4.12
  • kdeedu
  • marble
  • src
  • lib
  • marble
TileCreator.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Project.
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 2006-2007 Torsten Rahn <tackat@kde.org>
9 // Copyright 2007-2008 Inge Wallin <ingwa@kde.org>
10 // Copyright 2011 Niko Sams <niko.sams@gmail.com>
11 //
12 
13 #include "TileCreator.h"
14 
15 #include <cmath>
16 
17 #include <QDir>
18 #include <QRect>
19 #include <QSize>
20 #include <QVector>
21 #include <QApplication>
22 #include <QImage>
23 #include <QImageReader>
24 #include <QPainter>
25 
26 #include "MarbleGlobal.h"
27 #include "MarbleDirs.h"
28 #include "MarbleDebug.h"
29 #include "TileLoaderHelper.h"
30 
31 namespace Marble
32 {
33 
34 class TileCreatorPrivate
35 {
36  public:
37  TileCreatorPrivate( TileCreatorSource *source,
38  const QString& dem, const QString& targetDir=QString() )
39  : m_dem( dem ),
40  m_targetDir( targetDir ),
41  m_cancelled( false ),
42  m_tileFormat( "jpg" ),
43  m_resume( false ),
44  m_verify( false ),
45  m_source( source )
46  {
47  if ( m_dem == "true" ) {
48  m_tileQuality = 70;
49  } else {
50  m_tileQuality = 85;
51  }
52  }
53 
54  ~TileCreatorPrivate()
55  {
56  delete m_source;
57  }
58 
59  public:
60  QString m_dem;
61  QString m_targetDir;
62  bool m_cancelled;
63  QString m_tileFormat;
64  int m_tileQuality;
65  bool m_resume;
66  bool m_verify;
67 
68  TileCreatorSource *m_source;
69 };
70 
71 class TileCreatorSourceImage : public TileCreatorSource
72 {
73 public:
74  TileCreatorSourceImage( const QString &sourcePath )
75  : m_sourceImage( QImage( sourcePath ) ),
76  m_cachedRowNum( -1 )
77  {
78  }
79 
80  virtual QSize fullImageSize() const
81  {
82  if ( m_sourceImage.size().width() > 21600 || m_sourceImage.height() > 10800 ) {
83  qDebug("Install map too large!");
84  return QSize();
85  }
86  return m_sourceImage.size();
87  }
88 
89  virtual QImage tile(int n, int m, int maxTileLevel)
90  {
91  int mmax = TileLoaderHelper::levelToColumn( defaultLevelZeroColumns, maxTileLevel );
92  int nmax = TileLoaderHelper::levelToRow( defaultLevelZeroRows, maxTileLevel );
93 
94  int imageHeight = m_sourceImage.height();
95  int imageWidth = m_sourceImage.width();
96 
97  // If the image size of the image source does not match the expected
98  // geometry we need to smooth-scale the image in advance to match
99  // the required size
100  bool needsScaling = ( imageWidth != 2 * nmax * (int)( c_defaultTileSize )
101  || imageHeight != nmax * (int)( c_defaultTileSize ) );
102 
103  if ( needsScaling )
104  mDebug() << "Image Size doesn't match 2*n*TILEWIDTH x n*TILEHEIGHT geometry. Scaling ...";
105 
106  int stdImageWidth = 2 * nmax * c_defaultTileSize;
107  if ( stdImageWidth == 0 )
108  stdImageWidth = 2 * c_defaultTileSize;
109 
110  int stdImageHeight = nmax * c_defaultTileSize;
111  if ( stdImageWidth != imageWidth ) {
112  mDebug() <<
113  QString( "TileCreator::createTiles() The size of the final image will measure %1 x %2 pixels").arg(stdImageWidth).arg(stdImageHeight);
114  }
115 
116  QImage row;
117 
118  if ( m_cachedRowNum == n ) {
119 
120  row = m_rowCache;
121 
122  } else {
123 
124  QRect sourceRowRect( 0, (int)( (qreal)( n * imageHeight ) / (qreal)( nmax )),
125  imageWidth,(int)( (qreal)( imageHeight ) / (qreal)( nmax ) ) );
126 
127 
128  row = m_sourceImage.copy( sourceRowRect );
129 
130  if ( needsScaling ) {
131  // Pick the current row and smooth scale it
132  // to make it match the expected size
133  QSize destSize( stdImageWidth, c_defaultTileSize );
134  row = row.scaled( destSize,
135  Qt::IgnoreAspectRatio,
136  Qt::SmoothTransformation );
137  }
138 
139  m_cachedRowNum = n;
140  m_rowCache = row;
141  }
142 
143  if ( row.isNull() ) {
144  mDebug() << "Read-Error! Null QImage!";
145  return QImage();
146  }
147 
148  QImage tile = row.copy( m * stdImageWidth / mmax, 0, c_defaultTileSize, c_defaultTileSize );
149 
150  return tile;
151  }
152 
153 private:
154  QImage m_sourceImage;
155 
156  QImage m_rowCache;
157  int m_cachedRowNum;
158 };
159 
160 
161 TileCreator::TileCreator(const QString& sourceDir, const QString& installMap,
162  const QString& dem, const QString& targetDir)
163  : QThread(0),
164  d( new TileCreatorPrivate( 0, dem, targetDir ) )
165 
166 {
167  mDebug() << "Prefix: " << sourceDir
168  << "installmap:" << installMap;
169 
170  QString sourcePath;
171 
172  // If the sourceDir starts with a '/' assume an absolute path.
173  // Otherwise assume a relative marble data path
174  if ( QDir::isAbsolutePath( sourceDir ) ) {
175  sourcePath = sourceDir + '/' + installMap;
176  mDebug() << "Trying absolute path*:" << sourcePath;
177  }
178  else {
179  sourcePath = MarbleDirs::path( "maps/" + sourceDir
180  + '/' + installMap );
181  mDebug() << "Trying relative path*:"
182  << "maps/" + sourceDir + '/' + installMap;
183  }
184 
185  mDebug() << "Creating tiles from*: " << sourcePath;
186 
187  d->m_source = new TileCreatorSourceImage( sourcePath );
188 
189  if ( d->m_targetDir.isNull() )
190  d->m_targetDir = MarbleDirs::localPath() + "/maps/"
191  + sourcePath.section( '/', -3, -2 ) + '/';
192 
193  setTerminationEnabled( true );
194 }
195 
196 TileCreator::TileCreator( TileCreatorSource* source, const QString& dem, const QString& targetDir )
197  : QThread(0),
198  d( new TileCreatorPrivate( source, dem, targetDir ) )
199 {
200  setTerminationEnabled( true );
201 }
202 
203 TileCreator::~TileCreator()
204 {
205  delete d;
206 }
207 
208 void TileCreator::cancelTileCreation()
209 {
210  d->m_cancelled = true;
211 }
212 
213 void TileCreator::run()
214 {
215  if ( d->m_resume && d->m_tileFormat == "jpg" && d->m_tileQuality != 100 ) {
216  qWarning() << "Resuming jpegs is only supported with tileQuality 100";
217  return;
218  }
219 
220  if ( !d->m_targetDir.endsWith('/') )
221  d->m_targetDir += '/';
222 
223  mDebug() << "Installing tiles to: " << d->m_targetDir;
224 
225  QVector<QRgb> grayScalePalette;
226  for ( int cnt = 0; cnt <= 255; ++cnt ) {
227  grayScalePalette.insert(cnt, qRgb(cnt, cnt, cnt));
228  }
229 
230  QSize fullImageSize = d->m_source->fullImageSize();
231  int imageWidth = fullImageSize.width();
232  int imageHeight = fullImageSize.height();
233 
234  mDebug() << QString( "TileCreator::createTiles() image dimensions %1 x %2").arg(imageWidth).arg(imageHeight);
235 
236  if ( imageWidth < 1 || imageHeight < 1 ) {
237  qDebug("Invalid imagemap!");
238  return;
239  }
240 
241  // Calculating Maximum Tile Level
242  float approxMaxTileLevel = std::log( imageWidth / ( 2.0 * c_defaultTileSize ) ) / std::log( 2.0 );
243 
244  int maxTileLevel = 0;
245  if ( approxMaxTileLevel == int( approxMaxTileLevel ) )
246  maxTileLevel = static_cast<int>( approxMaxTileLevel );
247  else
248  maxTileLevel = static_cast<int>( approxMaxTileLevel + 1 );
249 
250  if ( maxTileLevel < 0 ) {
251  mDebug()
252  << QString( "TileCreator::createTiles(): Invalid Maximum Tile Level: %1" )
253  .arg( maxTileLevel );
254  }
255  mDebug() << "Maximum Tile Level: " << maxTileLevel;
256 
257 
258  if ( !QDir( d->m_targetDir ).exists() )
259  ( QDir::root() ).mkpath( d->m_targetDir );
260 
261  // Counting total amount of tiles to be generated for the progressbar
262  // to prevent compiler warnings this var should
263  // match the type of maxTileLevel
264  int tileLevel = 0;
265  int totalTileCount = 0;
266 
267  while ( tileLevel <= maxTileLevel ) {
268  totalTileCount += ( TileLoaderHelper::levelToRow( defaultLevelZeroRows, tileLevel )
269  * TileLoaderHelper::levelToColumn( defaultLevelZeroColumns, tileLevel ) );
270  tileLevel++;
271  }
272 
273  mDebug() << totalTileCount << " tiles to be created in total.";
274 
275  int mmax = TileLoaderHelper::levelToColumn( defaultLevelZeroColumns, maxTileLevel );
276  int nmax = TileLoaderHelper::levelToRow( defaultLevelZeroRows, maxTileLevel );
277 
278  // Loading each row at highest spatial resolution and cropping tiles
279  int percentCompleted = 0;
280  int createdTilesCount = 0;
281  QString tileName;
282 
283  // Creating directory structure for the highest level
284  QString dirName( d->m_targetDir
285  + QString("%1").arg(maxTileLevel) );
286  if ( !QDir( dirName ).exists() )
287  ( QDir::root() ).mkpath( dirName );
288 
289  for ( int n = 0; n < nmax; ++n ) {
290  QString dirName( d->m_targetDir
291  + QString("%1/%2").arg(maxTileLevel).arg( n, tileDigits, 10, QChar('0') ) );
292  if ( !QDir( dirName ).exists() )
293  ( QDir::root() ).mkpath( dirName );
294  }
295 
296  for ( int n = 0; n < nmax; ++n ) {
297 
298  for ( int m = 0; m < mmax; ++m ) {
299 
300  mDebug() << "** tile" << m << "x" << n;
301 
302  if ( d->m_cancelled )
303  return;
304 
305  tileName = d->m_targetDir + ( QString("%1/%2/%2_%3.%4")
306  .arg( maxTileLevel )
307  .arg( n, tileDigits, 10, QChar('0') )
308  .arg( m, tileDigits, 10, QChar('0') ) )
309  .arg( d->m_tileFormat );
310 
311  if ( QFile::exists( tileName ) && d->m_resume ) {
312 
313  //mDebug() << tileName << "exists already";
314 
315  } else {
316 
317  QImage tile = d->m_source->tile( n, m, maxTileLevel );
318 
319  if ( tile.isNull() ) {
320  mDebug() << "Read-Error! Null QImage!";
321  return;
322  }
323 
324  if ( d->m_dem == "true" ) {
325  tile = tile.convertToFormat(QImage::Format_Indexed8,
326  grayScalePalette,
327  Qt::ThresholdDither);
328  }
329 
330  bool ok = tile.save( tileName, d->m_tileFormat.toLatin1().data(), d->m_tileFormat == "jpg" ? 100 : d->m_tileQuality );
331  if ( !ok )
332  mDebug() << "Error while writing Tile: " << tileName;
333 
334  mDebug() << tileName << "size" << QFile( tileName ).size();
335 
336  if ( d->m_verify ) {
337  QImage writtenTile(tileName);
338  Q_ASSERT( writtenTile.size() == tile.size() );
339  for ( int i=0; i < writtenTile.size().width(); ++i) {
340  for ( int j=0; j < writtenTile.size().height(); ++j) {
341  if ( writtenTile.pixel( i, j ) != tile.pixel( i, j ) ) {
342  unsigned int pixel = tile.pixel( i, j);
343  unsigned int writtenPixel = writtenTile.pixel( i, j);
344  qWarning() << "***** pixel" << i << j << "is off by" << (pixel - writtenPixel) << "pixel" << pixel << "writtenPixel" << writtenPixel;
345  QByteArray baPixel((char*)&pixel, sizeof(unsigned int));
346  qWarning() << "pixel" << baPixel.size() << "0x" << baPixel.toHex();
347  QByteArray baWrittenPixel((char*)&writtenPixel, sizeof(unsigned int));
348  qWarning() << "writtenPixel" << baWrittenPixel.size() << "0x" << baWrittenPixel.toHex();
349  Q_ASSERT(false);
350  }
351  }
352  }
353  }
354 
355  }
356 
357  percentCompleted = (int) ( 90 * (qreal)(createdTilesCount)
358  / (qreal)(totalTileCount) );
359  createdTilesCount++;
360 
361  mDebug() << "percentCompleted" << percentCompleted;
362  emit progress( percentCompleted );
363  }
364  }
365 
366  mDebug() << "tileLevel: " << maxTileLevel << " successfully created.";
367 
368  tileLevel = maxTileLevel;
369 
370  // Now that we have the tiles at the highest resolution lets build
371  // them together four by four.
372 
373  while( tileLevel > 0 ) {
374  tileLevel--;
375 
376  int nmaxit = TileLoaderHelper::levelToRow( defaultLevelZeroRows, tileLevel );
377 
378  for ( int n = 0; n < nmaxit; ++n ) {
379  QString dirName( d->m_targetDir
380  + ( QString("%1/%2")
381  .arg(tileLevel)
382  .arg( n, tileDigits, 10, QChar('0') ) ) );
383 
384  // mDebug() << "dirName: " << dirName;
385  if ( !QDir( dirName ).exists() )
386  ( QDir::root() ).mkpath( dirName );
387 
388  int mmaxit = TileLoaderHelper::levelToColumn( defaultLevelZeroColumns, tileLevel );
389  for ( int m = 0; m < mmaxit; ++m ) {
390 
391  if ( d->m_cancelled )
392  return;
393 
394  QString newTileName = d->m_targetDir + ( QString("%1/%2/%2_%3.%4")
395  .arg( tileLevel )
396  .arg( n, tileDigits, 10, QChar('0') )
397  .arg( m, tileDigits, 10, QChar('0') ) )
398  .arg( d->m_tileFormat );
399 
400  if ( QFile::exists( newTileName ) && d->m_resume ) {
401  //mDebug() << newTileName << "exists already";
402  } else {
403  tileName = d->m_targetDir + ( QString("%1/%2/%2_%3.%4")
404  .arg( tileLevel + 1 )
405  .arg( 2*n, tileDigits, 10, QChar('0') )
406  .arg( 2*m, tileDigits, 10, QChar('0') ) )
407  .arg( d->m_tileFormat );
408  QImage img_topleft( tileName );
409 
410  tileName = d->m_targetDir + ( QString("%1/%2/%2_%3.%4")
411  .arg( tileLevel + 1 )
412  .arg( 2*n, tileDigits, 10, QChar('0') )
413  .arg( 2*m+1, tileDigits, 10, QChar('0') ) )
414  .arg( d->m_tileFormat );
415  QImage img_topright( tileName );
416 
417  tileName = d->m_targetDir + ( QString("%1/%2/%2_%3.%4")
418  .arg( tileLevel + 1 )
419  .arg( 2*n+1, tileDigits, 10, QChar('0') )
420  .arg( 2*m, tileDigits, 10, QChar('0') ) )
421  .arg( d->m_tileFormat );
422  QImage img_bottomleft( tileName );
423 
424  tileName = d->m_targetDir + ( QString("%1/%2/%2_%3.%4")
425  .arg( tileLevel + 1 )
426  .arg( 2*n+1, tileDigits, 10, QChar('0') )
427  .arg( 2*m+1, tileDigits, 10, QChar('0') ) )
428  .arg( d->m_tileFormat );
429  QImage img_bottomright( tileName );
430 
431  QSize const expectedSize( c_defaultTileSize, c_defaultTileSize );
432  if ( img_topleft.size() != expectedSize ||
433  img_topright.size() != expectedSize ||
434  img_bottomleft.size() != expectedSize ||
435  img_bottomright.size() != expectedSize ) {
436  mDebug() << "Tile write failure. Missing write permissions?";
437  emit progress( 100 );
438  return;
439  }
440  QImage tile = img_topleft;
441 
442  if ( d->m_dem == "true" ) {
443 
444  tile.setColorTable( grayScalePalette );
445  uchar* destLine;
446 
447  for ( uint y = 0; y < c_defaultTileSize / 2; ++y ) {
448  destLine = tile.scanLine( y );
449  const uchar* srcLine = img_topleft.scanLine( 2 * y );
450  for ( uint x = 0; x < c_defaultTileSize / 2; ++x )
451  destLine[x] = srcLine[ 2*x ];
452  }
453  for ( uint y = 0; y < c_defaultTileSize / 2; ++y ) {
454  destLine = tile.scanLine( y );
455  const uchar* srcLine = img_topright.scanLine( 2 * y );
456  for ( uint x = c_defaultTileSize / 2; x < c_defaultTileSize; ++x )
457  destLine[x] = srcLine[ 2 * ( x - c_defaultTileSize / 2 ) ];
458  }
459  for ( uint y = c_defaultTileSize / 2; y < c_defaultTileSize; ++y ) {
460  destLine = tile.scanLine( y );
461  const uchar* srcLine = img_bottomleft.scanLine( 2 * ( y - c_defaultTileSize / 2 ) );
462  for ( uint x = 0; x < c_defaultTileSize / 2; ++x )
463  destLine[ x ] = srcLine[ 2 * x ];
464  }
465  for ( uint y = c_defaultTileSize / 2; y < c_defaultTileSize; ++y ) {
466  destLine = tile.scanLine( y );
467  const uchar* srcLine = img_bottomright.scanLine( 2 * ( y - c_defaultTileSize/2 ) );
468  for ( uint x = c_defaultTileSize / 2; x < c_defaultTileSize; ++x )
469  destLine[x] = srcLine[ 2 * ( x - c_defaultTileSize / 2 ) ];
470  }
471  }
472  else {
473 
474  // tile.depth() != 8
475 
476  img_topleft = img_topleft.convertToFormat( QImage::Format_ARGB32 );
477  img_topright = img_topright.convertToFormat( QImage::Format_ARGB32 );
478  img_bottomleft = img_bottomleft.convertToFormat( QImage::Format_ARGB32 );
479  img_bottomright = img_bottomright.convertToFormat( QImage::Format_ARGB32 );
480  tile = img_topleft;
481 
482  QRgb* destLine;
483 
484  for ( uint y = 0; y < c_defaultTileSize / 2; ++y ) {
485  destLine = (QRgb*) tile.scanLine( y );
486  const QRgb* srcLine = (QRgb*) img_topleft.scanLine( 2 * y );
487  for ( uint x = 0; x < c_defaultTileSize / 2; ++x )
488  destLine[x] = srcLine[ 2 * x ];
489  }
490  for ( uint y = 0; y < c_defaultTileSize / 2; ++y ) {
491  destLine = (QRgb*) tile.scanLine( y );
492  const QRgb* srcLine = (QRgb*) img_topright.scanLine( 2 * y );
493  for ( uint x = c_defaultTileSize / 2; x < c_defaultTileSize; ++x )
494  destLine[x] = srcLine[ 2 * ( x - c_defaultTileSize / 2 ) ];
495  }
496  for ( uint y = c_defaultTileSize / 2; y < c_defaultTileSize; ++y ) {
497  destLine = (QRgb*) tile.scanLine( y );
498  const QRgb* srcLine = (QRgb*) img_bottomleft.scanLine( 2 * ( y-c_defaultTileSize/2 ) );
499  for ( uint x = 0; x < c_defaultTileSize / 2; ++x )
500  destLine[x] = srcLine[ 2 * x ];
501  }
502  for ( uint y = c_defaultTileSize / 2; y < c_defaultTileSize; ++y ) {
503  destLine = (QRgb*) tile.scanLine( y );
504  const QRgb* srcLine = (QRgb*) img_bottomright.scanLine( 2 * ( y-c_defaultTileSize / 2 ) );
505  for ( uint x = c_defaultTileSize / 2; x < c_defaultTileSize; ++x )
506  destLine[x] = srcLine[ 2*( x-c_defaultTileSize / 2 ) ];
507  }
508  }
509 
510  mDebug() << newTileName;
511 
512  // Saving at 100% JPEG quality to have a high-quality
513  // version to create the remaining needed tiles from.
514  bool ok = tile.save( newTileName, d->m_tileFormat.toLatin1().data(), d->m_tileFormat == "jpg" ? 100 : d->m_tileQuality );
515  if ( ! ok )
516  mDebug() << "Error while writing Tile: " << newTileName;
517  }
518 
519  percentCompleted = (int) ( 90 * (qreal)(createdTilesCount)
520  / (qreal)(totalTileCount) );
521  createdTilesCount++;
522 
523  emit progress( percentCompleted );
524  mDebug() << "percentCompleted" << percentCompleted;
525  }
526  }
527  mDebug() << "tileLevel: " << tileLevel << " successfully created.";
528  }
529  mDebug() << "Tile creation completed.";
530 
531  if ( d->m_tileFormat == "jpg" && d->m_tileQuality != 100 ) {
532 
533  // Applying correct lower JPEG compression now that we created all tiles
534  int savedTilesCount = 0;
535 
536  tileLevel = 0;
537  while ( tileLevel <= maxTileLevel ) {
538  int nmaxit = TileLoaderHelper::levelToRow( defaultLevelZeroRows, tileLevel );
539  for ( int n = 0; n < nmaxit; ++n) {
540  int mmaxit = TileLoaderHelper::levelToColumn( defaultLevelZeroColumns, tileLevel );
541  for ( int m = 0; m < mmaxit; ++m) {
542 
543  if ( d->m_cancelled )
544  return;
545 
546  savedTilesCount++;
547 
548  tileName = d->m_targetDir + ( QString("%1/%2/%2_%3.%4")
549  .arg( tileLevel )
550  .arg( n, tileDigits, 10, QChar('0') )
551  .arg( m, tileDigits, 10, QChar('0') ) )
552  .arg( d->m_tileFormat );
553  QImage tile( tileName );
554 
555  bool ok;
556 
557  ok = tile.save( tileName, d->m_tileFormat.toLatin1().data(), d->m_tileQuality );
558 
559  if ( !ok )
560  mDebug() << "Error while writing Tile: " << tileName;
561  // Don't exceed 99% as this would cancel the thread unexpectedly
562  percentCompleted = 90 + (int)( 9 * (qreal)(savedTilesCount)
563  / (qreal)(totalTileCount) );
564  emit progress( percentCompleted );
565  mDebug() << "percentCompleted" << percentCompleted;
566  //mDebug() << "Saving Tile #" << savedTilesCount
567  // << " of " << totalTileCount
568  // << " Percent: " << percentCompleted;
569  }
570  }
571  tileLevel++;
572  }
573  }
574 
575  percentCompleted = 100;
576  emit progress( percentCompleted );
577 
578  mDebug() << "percentCompleted: " << percentCompleted;
579 }
580 
581 void TileCreator::setTileFormat(const QString& format)
582 {
583  d->m_tileFormat = format;
584 }
585 
586 QString TileCreator::tileFormat() const
587 {
588  return d->m_tileFormat;
589 }
590 
591 void TileCreator::setTileQuality(int quality)
592 {
593  d->m_tileQuality = quality;
594 }
595 
596 int TileCreator::tileQuality() const
597 {
598  return d->m_tileQuality;
599 }
600 
601 void TileCreator::setResume(bool resume)
602 {
603  d->m_resume = resume;
604 }
605 
606 bool TileCreator::resume() const
607 {
608  return d->m_resume;
609 }
610 
611 void TileCreator::setVerifyExactResult(bool verify)
612 {
613  d->m_verify = verify;
614 }
615 
616 bool TileCreator::verifyExactResult() const
617 {
618  return d->m_verify;
619 }
620 
621 
622 }
623 
624 #include "TileCreator.moc"
Marble::TileCreator::tileQuality
int tileQuality() const
Definition: TileCreator.cpp:596
Marble::TileCreator::run
virtual void run()
Definition: TileCreator.cpp:213
Marble::MarbleDirs::path
static QString path(const QString &relativePath)
Definition: MarbleDirs.cpp:53
TileCreator.h
Marble::TileCreator::verifyExactResult
bool verifyExactResult() const
Definition: TileCreator.cpp:616
Marble::TileCreator::tileFormat
QString tileFormat() const
Definition: TileCreator.cpp:586
Marble::MarbleDirs::localPath
static QString localPath()
Definition: MarbleDirs.cpp:217
Marble::defaultLevelZeroColumns
const int defaultLevelZeroColumns
Definition: MarbleGlobal.h:184
MarbleDebug.h
Marble::TileCreatorSource
Base Class for custom tile source.
Definition: TileCreator.h:35
Marble::TileCreator::TileCreator
TileCreator(const QString &sourceDir, const QString &installMap, const QString &dem, const QString &targetDir=QString())
Constructor for standard Image source.
Definition: TileCreator.cpp:161
Marble::TileCreator::setVerifyExactResult
void setVerifyExactResult(bool verify)
Definition: TileCreator.cpp:611
Marble::c_defaultTileSize
const unsigned int c_defaultTileSize
Definition: MarbleGlobal.h:244
Marble::TileCreator::~TileCreator
virtual ~TileCreator()
Definition: TileCreator.cpp:203
MarbleDirs.h
Marble::TileCreator::resume
bool resume() const
Definition: TileCreator.cpp:606
MarbleGlobal.h
Marble::TileCreator::setTileFormat
void setTileFormat(const QString &format)
Definition: TileCreator.cpp:581
Marble::tileDigits
const int tileDigits
Definition: MarbleGlobal.h:234
Marble::TileLoaderHelper::levelToRow
MARBLE_EXPORT int levelToRow(int levelZeroRows, int level)
Get the maximum number of tile rows for a given tile level.
Definition: TileLoaderHelper.cpp:36
Marble::TileLoaderHelper::levelToColumn
MARBLE_EXPORT int levelToColumn(int levelZeroColumns, int level)
Get the maximum number of tile columns for a given tile level.
Definition: TileLoaderHelper.cpp:46
Marble::TileCreator::progress
void progress(int value)
Marble::TileCreator::setTileQuality
void setTileQuality(int quality)
Definition: TileCreator.cpp:591
Marble::TileCreator::cancelTileCreation
void cancelTileCreation()
Definition: TileCreator.cpp:208
TileLoaderHelper.h
QThread
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:31
Marble::TileCreator::setResume
void setResume(bool resume)
Definition: TileCreator.cpp:601
Marble::defaultLevelZeroRows
const int defaultLevelZeroRows
Definition: MarbleGlobal.h:185
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:53 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
  • kstars
  • libkdeedu
  •   keduvocdocument
  • 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