Showing with 226 additions and 4 deletions.
  1. +16 −3 src/core/composer/qgspaperitem.cpp
  2. +3 −0 src/core/composer/qgspaperitem.h
  3. +29 −0 src/core/symbology-ng/qgsfillsymbollayerv2.cpp
  4. +8 −0 src/core/symbology-ng/qgsfillsymbollayerv2.h
  5. +10 −1 src/core/symbology-ng/qgslinesymbollayerv2.cpp
  6. +4 −0 src/core/symbology-ng/qgslinesymbollayerv2.h
  7. +6 −0 src/core/symbology-ng/qgssymbollayerv2.h
  8. +12 −0 src/core/symbology-ng/qgssymbollayerv2utils.cpp
  9. +3 −0 src/core/symbology-ng/qgssymbollayerv2utils.h
  10. +1 −0 tests/src/core/CMakeLists.txt
  11. +134 −0 tests/src/core/testqgscomposerpaper.cpp
  12. BIN tests/testdata/control_images/expected_atlas_autoscale1/expected_atlas_autoscale1.png
  13. BIN tests/testdata/control_images/expected_atlas_autoscale2/expected_atlas_autoscale2.png
  14. BIN tests/testdata/control_images/expected_atlas_filtering1/expected_atlas_filtering1.png
  15. BIN tests/testdata/control_images/expected_atlas_fixedscale1/expected_atlas_fixedscale1.png
  16. BIN tests/testdata/control_images/expected_atlas_fixedscale2/expected_atlas_fixedscale2.png
  17. BIN tests/testdata/control_images/expected_atlas_hiding1/expected_atlas_hiding1.png
  18. BIN tests/testdata/control_images/expected_atlas_hiding2/expected_atlas_hiding2.png
  19. BIN tests/testdata/control_images/expected_atlas_sorting1/expected_atlas_sorting1.png
  20. BIN tests/testdata/control_images/expected_atlas_sorting2/expected_atlas_sorting2.png
  21. BIN tests/testdata/control_images/expected_composereffects_blend/expected_composereffects_blend.png
  22. BIN ...ta/control_images/expected_composereffects_transparency/expected_composereffects_transparency.png
  23. BIN ...s/testdata/control_images/expected_composerhtml_multiframe1/expected_composerhtml_multiframe1.png
  24. BIN ...s/testdata/control_images/expected_composerhtml_multiframe2/expected_composerhtml_multiframe2.png
  25. BIN ...s/testdata/control_images/expected_composerhtml_multiframe3/expected_composerhtml_multiframe3.png
  26. BIN tests/testdata/control_images/expected_composerhtml_table/expected_composerhtml_table.png
  27. BIN tests/testdata/control_images/expected_composermap_grid/expected_composermap_grid.png
  28. BIN tests/testdata/control_images/expected_composermap_overview/expected_composermap_overview.png
  29. BIN .../control_images/expected_composermap_overview_blending/expected_composermap_overview_blending.png
  30. BIN ...data/control_images/expected_composermap_overview_center/expected_composermap_overview_center.png
  31. BIN ...data/control_images/expected_composermap_overview_invert/expected_composermap_overview_invert.png
  32. BIN tests/testdata/control_images/expected_composermap_render/expected_composermap_render.png
  33. BIN tests/testdata/control_images/expected_composermap_zebrastyle/expected_composermap_zebrastyle.png
  34. BIN tests/testdata/control_images/expected_composerpaper_bordered/expected_composerpaper_bordered.png
  35. BIN tests/testdata/control_images/expected_composerpaper_default/expected_composerpaper_default.png
  36. BIN ...stdata/control_images/expected_composerpaper_markerborder/expected_composerpaper_markerborder.png
  37. BIN ...testdata/control_images/expected_composerpaper_transparent/expected_composerpaper_transparent.png
  38. BIN tests/testdata/control_images/expected_composerrotation_label/expected_composerrotation_label.png
  39. BIN .../control_images/expected_composerrotation_label_oldapi/expected_composerrotation_label_oldapi.png
  40. BIN ...ol_images/expected_composerrotation_mapitemrotation/expected_composerrotation_mapitemrotation.png
  41. BIN ...ta/control_images/expected_composerrotation_maprotation/expected_composerrotation_maprotation.png
  42. BIN ...ges/expected_composerrotation_maprotation_oldapi/expected_composerrotation_maprotation_oldapi.png
  43. BIN ...s/expected_composerrotation_pictureitemrotation/expected_composerrotation_pictureitemrotation.png
  44. BIN ...ol_images/expected_composerrotation_picturerotation/expected_composerrotation_picturerotation.png
  45. BIN ...cted_composerrotation_picturerotation_oldapi/expected_composerrotation_picturerotation_oldapi.png
  46. BIN tests/testdata/control_images/expected_composerrotation_shape/expected_composerrotation_shape.png
  47. BIN .../control_images/expected_composerrotation_shape_oldapi/expected_composerrotation_shape_oldapi.png
  48. BIN ...stdata/control_images/expected_composerscalebar_doublebox/expected_composerscalebar_doublebox.png
  49. BIN ...s/testdata/control_images/expected_composerscalebar_numeric/expected_composerscalebar_numeric.png
  50. BIN ...stdata/control_images/expected_composerscalebar_singlebox/expected_composerscalebar_singlebox.png
  51. BIN tests/testdata/control_images/expected_composerscalebar_tick/expected_composerscalebar_tick.png
  52. BIN tests/testdata/control_images/expected_composershapes_ellipse/expected_composershapes_ellipse.png
  53. BIN ...s/testdata/control_images/expected_composershapes_rectangle/expected_composershapes_rectangle.png
  54. BIN ...stdata/control_images/expected_composershapes_roundedrect/expected_composershapes_roundedrect.png
  55. BIN tests/testdata/control_images/expected_composershapes_triangle/expected_composershapes_triangle.png
19 changes: 16 additions & 3 deletions src/core/composer/qgspaperitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,13 +128,13 @@ QgsPaperItem::QgsPaperItem( QgsComposition* c ): QgsComposerItem( c, false ),
}

QgsPaperItem::QgsPaperItem( qreal x, qreal y, qreal width, qreal height, QgsComposition* composition ): QgsComposerItem( x, y, width, height, composition, false ),
mPageGrid( 0 )
mPageGrid( 0 ), mPageMargin( 0 )
{
initialize();
}

QgsPaperItem::QgsPaperItem(): QgsComposerItem( 0, false ),
mPageGrid( 0 )
mPageGrid( 0 ), mPageMargin( 0 )
{
initialize();
}
Expand Down Expand Up @@ -167,15 +167,28 @@ void QgsPaperItem::paint( QPainter* painter, const QStyleOptionGraphicsItem* ite

painter->save();
painter->setRenderHint( QPainter::Antialiasing );
QPolygonF pagePolygon = QPolygonF( QRectF( 0, 0, rect().width(), rect().height() ) );
mComposition->pageStyleSymbol()->startRender( context );

calculatePageMargin();
QPolygonF pagePolygon = QPolygonF( QRectF( mPageMargin, mPageMargin, rect().width() - 2 * mPageMargin, rect().height() - 2 * mPageMargin ) );
QList<QPolygonF> rings; //empty list
mComposition->pageStyleSymbol()->renderPolygon( pagePolygon, &rings, 0, context );
mComposition->pageStyleSymbol()->stopRender( context );
painter->restore();

}

void QgsPaperItem::calculatePageMargin()
{
//get max bleed from symbol
double maxBleed = QgsSymbolLayerV2Utils::estimateMaxSymbolBleed( mComposition->pageStyleSymbol() );

//Now subtract 1 pixel to prevent semi-transparent borders at edge of solid page caused by
//anti-aliased painting. This may cause a pixel to be cropped from certain edge lines/symbols,
//but that can be counteracted by adding a dummy transparent line symbol layer with a wider line width
mPageMargin = maxBleed - ( 25.4 / mComposition->printResolution() );
}

bool QgsPaperItem::writeXML( QDomElement& elem, QDomDocument & doc ) const
{
Q_UNUSED( elem );
Expand Down
3 changes: 3 additions & 0 deletions src/core/composer/qgspaperitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,10 @@ class CORE_EXPORT QgsPaperItem: public QgsComposerItem
/**Set flags and z-value*/
void initialize();

void calculatePageMargin();

QgsPaperGrid* mPageGrid;
double mPageMargin;
};

#endif
29 changes: 29 additions & 0 deletions src/core/symbology-ng/qgsfillsymbollayerv2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,13 @@ QgsSymbolLayerV2* QgsSimpleFillSymbolLayerV2::createFromSld( QDomElement &elemen
return sl;
}

double QgsSimpleFillSymbolLayerV2::estimateMaxBleed() const
{
double penBleed = mBorderStyle == Qt::NoPen ? 0 : ( mBorderWidth / 2.0 );
double offsetBleed = mOffset.x() > mOffset.y() ? mOffset.x() : mOffset.y();
return penBleed + offsetBleed;
}

//QgsGradientFillSymbolLayer

QgsGradientFillSymbolLayerV2::QgsGradientFillSymbolLayerV2( QColor color, QColor color2,
Expand Down Expand Up @@ -729,6 +736,12 @@ QgsSymbolLayerV2* QgsGradientFillSymbolLayerV2::clone() const
return sl;
}

double QgsGradientFillSymbolLayerV2::estimateMaxBleed() const
{
double offsetBleed = mOffset.x() > mOffset.y() ? mOffset.x() : mOffset.y();
return offsetBleed;
}

//QgsImageFillSymbolLayer

QgsImageFillSymbolLayer::QgsImageFillSymbolLayer(): mOutlineWidth( 0.0 ), mOutlineWidthUnit( QgsSymbolV2::MM ), mOutline( 0 )
Expand Down Expand Up @@ -816,6 +829,14 @@ bool QgsImageFillSymbolLayer::setSubSymbol( QgsSymbolV2* symbol )
return false;
}


double QgsImageFillSymbolLayer::estimateMaxBleed() const
{
double subLayerBleed = mOutline->symbolLayer( 0 )->estimateMaxBleed();
return subLayerBleed;
}


//QgsSVGFillSymbolLayer

QgsSVGFillSymbolLayer::QgsSVGFillSymbolLayer( const QString& svgFilePath, double width, double angle ): QgsImageFillSymbolLayer(), mPatternWidth( width ),
Expand Down Expand Up @@ -1302,6 +1323,7 @@ void QgsSVGFillSymbolLayer::setDefaultSvgParams()
}
}


QgsLinePatternFillSymbolLayer::QgsLinePatternFillSymbolLayer(): QgsImageFillSymbolLayer(), mDistanceUnit( QgsSymbolV2::MM ), mLineWidthUnit( QgsSymbolV2::MM ),
mOffsetUnit( QgsSymbolV2::MM )
{
Expand Down Expand Up @@ -1741,6 +1763,7 @@ QgsSymbolLayerV2* QgsLinePatternFillSymbolLayer::createFromSld( QDomElement &ele
return sl;
}


////////////////////////

QgsPointPatternFillSymbolLayer::QgsPointPatternFillSymbolLayer(): QgsImageFillSymbolLayer(), mMarkerSymbol( 0 ), mDistanceX( 15 ),
Expand Down Expand Up @@ -2043,6 +2066,12 @@ void QgsPointPatternFillSymbolLayer::applyDataDefinedSettings( const QgsSymbolV2
applyPattern( context, mBrush, distanceX, distanceY, displacementX, displacementY );
}


double QgsPointPatternFillSymbolLayer::estimateMaxBleed() const
{
return 0;
}

//////////////


Expand Down
8 changes: 8 additions & 0 deletions src/core/symbology-ng/qgsfillsymbollayerv2.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ class CORE_EXPORT QgsSimpleFillSymbolLayerV2 : public QgsFillSymbolLayerV2
void setOutputUnit( QgsSymbolV2::OutputUnit unit );
QgsSymbolV2::OutputUnit outputUnit() const;

double estimateMaxBleed() const;

protected:
QBrush mBrush;
QBrush mSelBrush;
Expand Down Expand Up @@ -160,6 +162,8 @@ class CORE_EXPORT QgsGradientFillSymbolLayerV2 : public QgsFillSymbolLayerV2

QgsSymbolLayerV2* clone() const;

double estimateMaxBleed() const;

/**Type of gradient, eg linear or radial*/
GradientType gradientType() const { return mGradientType; };
void setGradientType( GradientType gradientType ) { mGradientType = gradientType; };
Expand Down Expand Up @@ -261,6 +265,8 @@ class CORE_EXPORT QgsImageFillSymbolLayer: public QgsFillSymbolLayerV2
void setOutlineWidthUnit( QgsSymbolV2::OutputUnit unit ) { mOutlineWidthUnit = unit; }
QgsSymbolV2::OutputUnit outlineWidthUnit() const { return mOutlineWidthUnit; }

double estimateMaxBleed() const;

protected:
QBrush mBrush;
double mNextAngle; // mAngle / data defined angle
Expand Down Expand Up @@ -445,6 +451,8 @@ class CORE_EXPORT QgsPointPatternFillSymbolLayer: public QgsImageFillSymbolLayer

void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const;

double estimateMaxBleed() const;

//getters and setters
double distanceX() const { return mDistanceX; }
void setDistanceX( double d ) { mDistanceX = d; }
Expand Down
11 changes: 10 additions & 1 deletion src/core/symbology-ng/qgslinesymbollayerv2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,10 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
}
}


double QgsSimpleLineSymbolLayerV2::estimateMaxBleed() const
{
return ( mWidth / 2.0 ) + mOffset;
}

/////////

Expand Down Expand Up @@ -1096,3 +1099,9 @@ QgsSymbolV2::OutputUnit QgsMarkerLineSymbolLayerV2::outputUnit() const
}
return unit;
}

double QgsMarkerLineSymbolLayerV2::estimateMaxBleed() const
{
return ( mMarker->size() / 2.0 ) + mOffset;
}

4 changes: 4 additions & 0 deletions src/core/symbology-ng/qgslinesymbollayerv2.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ class CORE_EXPORT QgsSimpleLineSymbolLayerV2 : public QgsLineSymbolLayerV2
void setOutputUnit( QgsSymbolV2::OutputUnit unit );
QgsSymbolV2::OutputUnit outputUnit() const;

double estimateMaxBleed() const;

// new stuff

Qt::PenStyle penStyle() const { return mPenStyle; }
Expand Down Expand Up @@ -161,6 +163,8 @@ class CORE_EXPORT QgsMarkerLineSymbolLayerV2 : public QgsLineSymbolLayerV2
virtual void setWidth( double width );
virtual double width() const;

double estimateMaxBleed() const;

// new stuff

bool rotateMarker() const { return mRotateMarker; }
Expand Down
6 changes: 6 additions & 0 deletions src/core/symbology-ng/qgssymbollayerv2.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,12 @@ class CORE_EXPORT QgsSymbolLayerV2
void setLocked( bool locked ) { mLocked = locked; }
bool isLocked() const { return mLocked; }

/**Returns the estimated maximum distance which the layer style will bleed outside
the drawn shape. Eg, polygons drawn with an outline will draw half the width
of the outline outside of the polygon. This amount is estimated, since it may
be affected by data defined symbology rules.*/
virtual double estimateMaxBleed() const { return 0; }

virtual void setOutputUnit( QgsSymbolV2::OutputUnit unit ) { Q_UNUSED( unit ); } //= 0;
virtual QgsSymbolV2::OutputUnit outputUnit() const { return QgsSymbolV2::Mixed; } //= 0;

Expand Down
12 changes: 12 additions & 0 deletions src/core/symbology-ng/qgssymbollayerv2utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,18 @@ QPixmap QgsSymbolLayerV2Utils::symbolPreviewPixmap( QgsSymbolV2* symbol, QSize s
return pixmap;
}

double QgsSymbolLayerV2Utils::estimateMaxSymbolBleed( QgsSymbolV2* symbol )
{
double maxBleed = 0;
for ( int i = 0; i < symbol->symbolLayerCount(); i++ )
{
QgsSymbolLayerV2* layer = symbol->symbolLayer( i );
double layerMaxBleed = layer->estimateMaxBleed();
maxBleed = layerMaxBleed > maxBleed ? layerMaxBleed : maxBleed;
}

return maxBleed;
}

QIcon QgsSymbolLayerV2Utils::symbolLayerPreviewIcon( QgsSymbolLayerV2* layer, QgsSymbolV2::OutputUnit u, QSize size )
{
Expand Down
3 changes: 3 additions & 0 deletions src/core/symbology-ng/qgssymbollayerv2utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,9 @@ class CORE_EXPORT QgsSymbolLayerV2Utils
static QPixmap symbolPreviewPixmap( QgsSymbolV2* symbol, QSize size );
static QPixmap colorRampPreviewPixmap( QgsVectorColorRampV2* ramp, QSize size );

/**Returns the maximum estimated bleed for the symbol */
static double estimateMaxSymbolBleed( QgsSymbolV2* symbol );

static QgsSymbolV2* loadSymbol( QDomElement& element );
static QgsSymbolLayerV2* loadSymbolLayer( QDomElement& element );
static QDomElement saveSymbol( QString symbolName, QgsSymbolV2* symbol, QDomDocument& doc );
Expand Down
1 change: 1 addition & 0 deletions tests/src/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ ADD_QGIS_TEST(vectorlayertest testqgsvectorlayer.cpp)
ADD_QGIS_TEST(rulebasedrenderertest testqgsrulebasedrenderer.cpp)
ADD_QGIS_TEST(ziplayertest testziplayer.cpp)
ADD_QGIS_TEST(dataitemtest testqgsdataitem.cpp)
ADD_QGIS_TEST(composerpapertest testqgscomposerpaper.cpp)
ADD_QGIS_TEST(composermaptest testqgscomposermap.cpp)
ADD_QGIS_TEST(composereffectstest testqgscomposereffects.cpp)
ADD_QGIS_TEST(composershapestest testqgscomposershapes.cpp)
Expand Down
134 changes: 134 additions & 0 deletions tests/src/core/testqgscomposerpaper.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
/***************************************************************************
testqgscomposerpaper.cpp
----------------------
begin : January 2014
copyright : (C) 2014 by Marco Hugentobler, Nyall Dawson
email : nyall dot dawson at gmail.com
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgsapplication.h"
#include "qgscomposition.h"
#include "qgscompositionchecker.h"
#include "qgscomposershape.h"
#include "qgssymbolv2.h"
#include "qgssinglesymbolrendererv2.h"
#include "qgsfillsymbollayerv2.h"
#include "qgslinesymbollayerv2.h"

#include <QObject>
#include <QtTest>
#include <QColor>
#include <QPainter>

class TestQgsComposerPaper: public QObject
{
Q_OBJECT;
private slots:
void initTestCase();// will be called before the first testfunction is executed.
void cleanupTestCase();// will be called after the last testfunction was executed.
void init();// will be called before each testfunction is executed.
void cleanup();// will be called after every testfunction.
void defaultPaper(); //test default paper style
void transparentPaper(); //test totally transparent paper style
void borderedPaper(); //test page with border
void markerLinePaper(); //test page with marker line border

private:
QgsComposition* mComposition;
QString mReport;
QgsSimpleFillSymbolLayerV2* mSimpleFill;
QgsMarkerLineSymbolLayerV2* mMarkerLine;
QgsFillSymbolV2* mFillSymbol;
QgsFillSymbolV2* mMarkerLineSymbol;
QgsSingleSymbolRendererV2* mSymbolRenderer;

};

void TestQgsComposerPaper::initTestCase()
{
QgsApplication::init();
QgsApplication::initQgis();

//create empty composition
mComposition = new QgsComposition( 0 );
mComposition->setPaperSize( 297, 210 ); //A4 landscape

//setup simple fill
mSimpleFill = new QgsSimpleFillSymbolLayerV2();
mFillSymbol = new QgsFillSymbolV2();
mFillSymbol->changeSymbolLayer( 0, mSimpleFill );

//setup marker line fill
mMarkerLine = new QgsMarkerLineSymbolLayerV2();
mMarkerLineSymbol = new QgsFillSymbolV2();
mMarkerLineSymbol->changeSymbolLayer( 0, mMarkerLine );

mReport = "<h1>Composer Paper Tests</h1>\n";
}

void TestQgsComposerPaper::cleanupTestCase()
{
delete mComposition;

QString myReportFile = QDir::tempPath() + QDir::separator() + "qgistest.html";
QFile myFile( myReportFile );
if ( myFile.open( QIODevice::WriteOnly | QIODevice::Append ) )
{
QTextStream myQTextStream( &myFile );
myQTextStream << mReport;
myFile.close();
}
}

void TestQgsComposerPaper::init()
{

}

void TestQgsComposerPaper::cleanup()
{

}

void TestQgsComposerPaper::defaultPaper()
{
QgsCompositionChecker checker( "composerpaper_default", mComposition );
QVERIFY( checker.testComposition( mReport ) );
}

void TestQgsComposerPaper::transparentPaper()
{
mSimpleFill->setColor( Qt::transparent );
mSimpleFill->setBorderColor( Qt::transparent );
mComposition->setPageStyleSymbol( mFillSymbol );
QgsCompositionChecker checker( "composerpaper_transparent", mComposition );
QVERIFY( checker.testComposition( mReport ) );
}

void TestQgsComposerPaper::borderedPaper()
{
mSimpleFill->setColor( Qt::white );
mSimpleFill->setBorderColor( Qt::black );
mSimpleFill->setBorderWidth( 6 );
QgsCompositionChecker checker( "composerpaper_bordered", mComposition );
QVERIFY( checker.testComposition( mReport ) );
}

void TestQgsComposerPaper::markerLinePaper()
{
mComposition->setPageStyleSymbol( mMarkerLineSymbol );
QgsCompositionChecker checker( "composerpaper_markerborder", mComposition );
QVERIFY( checker.testComposition( mReport ) );
}

QTEST_MAIN( TestQgsComposerPaper )
#include "moc_testqgscomposerpaper.cxx"
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.