void QgsComposerLegendWidget::updateLegend()
{
  if ( mLegend )
  {
    mLegend->beginCommand( tr( "Legend updated" ) );
    QgisApp* app = QgisApp::instance();
    if ( !app )
    {
      return;
    }

    //get layer id list
    QStringList layerIdList;
    QgsMapCanvas* canvas = app->mapCanvas();
    if ( canvas )
    {
      QgsMapRenderer* renderer = canvas->mapRenderer();
      if ( renderer )
      {
        layerIdList = renderer->layerSet();
      }
    }

    //and also group info
    QgsAppLegendInterface legendIface( app->legend() );
    QList< GroupLayerInfo > groupInfo = legendIface.groupLayerRelationship();
    mLegend->model()->setLayerSetAndGroups( layerIdList, groupInfo );
    mLegend->endCommand();
  }
}
osg::Image* QgsOsgEarthTileSource::createImage( const TileKey& key, ProgressCallback* progress )
{
  Q_UNUSED( key );
  Q_UNUSED( progress );
  osg::ref_ptr<osg::Image> image;
  if ( intersects( &key ) )
  {
    //Get the extents of the tile
    double xmin, ymin, xmax, ymax;
    key.getExtent().getBounds( xmin, ymin, xmax, ymax );

    int tileSize = getPixelsPerTile();
    int target_width = tileSize;
    int target_height = tileSize;

    QgsDebugMsg( "QGIS: xmin:" + QString::number( xmin ) + " ymin:" + QString::number( ymin ) + " ymax:" + QString::number( ymax ) + " ymax " + QString::number( ymax ) );

    //Return if parameters are out of range.
    if ( target_width <= 0 || target_height <= 0 )
    {
      return 0;
    }

    QImage* qImage = createImage( target_width, target_height );
    if ( !qImage )
    {
      return 0;
    }

    QgsMapRenderer* mainRenderer = mQGisIface->mapCanvas()->mapRenderer();
    mMapRenderer->setLayerSet( mainRenderer->layerSet() );

    mMapRenderer->setOutputSize( QSize( qImage->width(), qImage->height() ), qImage->logicalDpiX() );

    QgsRectangle mapExtent( xmin, ymin, xmax, ymax );
    mMapRenderer->setExtent( mapExtent );

    QPainter thePainter( qImage );
    //thePainter.setRenderHint(QPainter::Antialiasing); //make it look nicer
    mMapRenderer->render( &thePainter );

    unsigned char* data = qImage->bits();

    image = new osg::Image;
    //The pixel format is always RGBA to support transparency
    image->setImage( qImage->width(), qImage->height(), 1,
                     4,
                     GL_BGRA, GL_UNSIGNED_BYTE, //Why not GL_RGBA - QGIS bug?
                     data,
                     osg::Image::NO_DELETE, 1 );
    image->flipVertical();
  }

  //Create a transparent image if we don't have an image
  if ( !image.valid() )
  {
    return ImageUtils::createEmptyImage();
  }
  return image.release();
}
QStringList QgsComposerLegend::layerIdList() const
{
  //take layer list from map renderer (to have legend order)
  if ( mComposition )
  {
    QgsMapRenderer* r = mComposition->mapRenderer();
    if ( r )
    {
      return r->layerSet();
    }
  }
  return QStringList();
}