コード例 #1
0
ファイル: layer_raster.cpp プロジェクト: bekzod786/brigantine
void layer_raster::draw(const std::vector<brig::variant>& row, const frame& fr, QPainter& painter)
{
  if (row.size() < 2|| row[0].type() != typeid(brig::blob_t)) return;
  const brig::blob_t& g(boost::get<brig::blob_t>(row[0]));
  const QRectF rect_rast(box_to_rect(brig::boost::envelope(brig::boost::geom_from_wkb(g)))); // todo: rotated raster
  QImage img_rast;
  if (row[1].type() != typeid(brig::blob_t)) return;
  const brig::blob_t& r(boost::get<brig::blob_t>(row[1]));
  if (!img_rast.loadFromData(r.data(), uint(r.size()))) return;
  projection pj_rast(get_pj());
  projection pj_fr(fr.get_pj());
  if (pj_rast == pj_fr)
    painter.drawImage(fr.proj_to_pixel(rect_rast).toAlignedRect(), img_rast);
  else
  {
    const QRectF rect_fr(transformer(pj_rast, pj_fr).transform(rect_rast));
    const QRect rect_fr_px(fr.proj_to_pixel(fr.prepare_rect().intersected(rect_fr)).toAlignedRect());
    if (!rect_fr_px.isValid()) return;
    QImage img_fr(rect_fr_px.size(), QImage::Format_ARGB32_Premultiplied);
    transformer tr(pj_fr, pj_rast);
    for (int j(0); j < img_fr.height(); ++j)
      for (int i(0); i < img_fr.width(); ++i)
      {
        const QPointF point_fr(static_cast<brig::qt::frame>(fr).pixel_to_proj(rect_fr_px.topLeft() + QPoint(i, j)));
        const QPointF point_rast(tr.transform(point_fr));
        if (rect_rast.contains(point_rast))
        {
          const double dx((point_rast.x() - rect_rast.left()) / rect_rast.width());
          const double dy((point_rast.y() - rect_rast.top()) / rect_rast.height());
          auto pixel(img_rast.pixel(int(dx * img_rast.width()), int((1 - dy) * img_rast.height())));
          img_fr.setPixel(i, j, pixel);
        }
        else
          img_fr.setPixel(i, j, QColor(0, 0, 0, 0).rgba());
      }
    painter.drawImage(rect_fr_px, img_fr);
  }
}