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); } }