[Marble-devel] Review Request: GeoPainter: specific rendering for untesselated linestrings across IDL

Thibaut Gridel tgridel at free.fr
Sun Feb 5 21:11:49 UTC 2012


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://git.reviewboard.kde.org/r/103876/
-----------------------------------------------------------

Review request for Marble and Torsten Rahn.


Description
-------

Default linestrings and linerings have NoTessellation set.
A linestring which crosses the IDL is displayed while inserting fixed points on the IDL because of how current CrossesDateline in GeoData works.
This patch discards toDateLineCorrected for this case, and renders the screen straight line properly.

Also a performance boost not using toDateLineCorrected in the general case.

As a side note, the original bug could be alleviated while setting tesselation...


This addresses bug 247360.
    http://bugs.kde.org/show_bug.cgi?id=247360


Diffs
-----

  src/lib/Projections/AbstractProjection.cpp ed0488a 
  src/lib/geodata/data/GeoDataLineString.cpp 2900374 
  src/lib/geodata/data/GeoDataLinearRing.cpp d3d51df 

Diff: http://git.reviewboard.kde.org/r/103876/diff/diff


Testing
-------

Following code, inspired by original bug, with the 3 kinds of tesselation, works as expected.
compile with:
g++ -I /usr/include/qt4/ -I include/marble/ -o test test.cpp -Llib/ -lmarblewidget -lQtGui


#include <QtGui/QApplication>
#include <MarbleWidget.h>
#include <GeoPainter.h>
#include <GeoDataLinearRing.h>
#include <GeoDataCoordinates.h>

using namespace Marble;

class MyMarbleWidget : public MarbleWidget
{
public:
    virtual void customPaint(GeoPainter* painter);
};

void MyMarbleWidget::customPaint(GeoPainter* painter)
{
    const qreal lonWest  = -130;
    const qreal latNorth = 40;
    const qreal lonEast  = 160;
    const qreal latSouth = 30;

    Marble::GeoDataCoordinates coordTopLeft(lonWest, latNorth, 0, Marble::GeoDataCoordinates::Degree);
    Marble::GeoDataCoordinates coordTopRight(lonEast, latNorth + 20, 0, Marble::GeoDataCoordinates::Degree);
    Marble::GeoDataCoordinates coordBottomLeft(lonWest, latSouth, 0, Marble::GeoDataCoordinates::Degree);
    Marble::GeoDataCoordinates coordBottomRight(lonEast, latSouth, 0, Marble::GeoDataCoordinates::Degree);

    Marble::GeoDataLinearRing polyRingTesselated;
    polyRingTesselated.setTessellationFlags( Tessellate );
    polyRingTesselated << coordTopLeft << coordTopRight << coordBottomRight << coordBottomLeft;

    Marble::GeoDataLinearRing polyRingLatitude;
    polyRingLatitude.setTessellationFlags( Tessellate | RespectLatitudeCircle );
    polyRingLatitude << coordTopLeft << coordTopRight << coordBottomRight << coordBottomLeft;

    Marble::GeoDataLinearRing polyRingDefault;
    polyRingDefault << coordTopLeft << coordTopRight << coordBottomRight << coordBottomLeft;

    GeoDataLineString diag( Tessellate );
    diag << coordBottomLeft << coordTopRight;


    painter->setPen(Qt::blue);
    painter->drawPolygon(polyRingTesselated);
    painter->drawPolyline( diag );

    painter->setPen(Qt::green);
    painter->drawPolygon(polyRingLatitude);

    painter->setPen(Qt::red);
    painter->drawPolygon(polyRingDefault);
}

int main(int argc, char** argv)
{
    QApplication app(argc,argv);
    MyMarbleWidget *mapWidget = new MyMarbleWidget;
    mapWidget->setMapThemeId("earth/openstreetmap/openstreetmap.dgml");
    mapWidget->setProjection(Marble::Mercator);
    mapWidget->show();
    return app.exec();
}


Thanks,

Thibaut Gridel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/marble-devel/attachments/20120205/25c52cab/attachment-0001.html>


More information about the Marble-devel mailing list