四个方向 分块渲染

This commit is contained in:
2026-08-12 09:01:25 +08:00
parent b34c0d31b1
commit 9331b4cbf6
24 changed files with 788 additions and 108 deletions
@@ -1,5 +1,6 @@
#include "Selection_Rectangle_Overlay.h"
#include "Plottable_Real_Time_Data.h"
#include "Heatmap_Utils.h"
#include "../render/Blend2D_Cache.h"
#include <algorithm>
#include <cmath>
@@ -14,12 +15,8 @@ struct Selection_Interaction {
PointF selection_current{};
};
using Selection_Interaction_State = Double_State_Strategy<Selection_Interaction_Base, Selection_Interaction>;
RectF axis_content_rect(const Axis_Transform& horizontal, const Axis_Transform& vertical) {
const double x1 = horizontal.coord_to_pixel(horizontal.coordinate_range.origin);
const double x2 = horizontal.coord_to_pixel(horizontal.coordinate_range.target);
const double y1 = vertical.coord_to_pixel(vertical.coordinate_range.origin);
const double y2 = vertical.coord_to_pixel(vertical.coordinate_range.target);
return {std::min(x1, x2), std::min(y1, y2), std::abs(x2 - x1), std::abs(y2 - y1)};
RectF axis_content_rect(const Axis_Transform& first, const Axis_Transform& second) {
return mapped_rect(first, second, first.coordinate_range, second.coordinate_range);
}
}
struct Selection_Rectangle_Overlay_Control::Impl {
@@ -88,9 +85,11 @@ void Selection_Rectangle_Overlay_Control::handle_event(const Event& event) {
return;
const Axis_Transform horizontal = impl_->horizontal_axis->transform();
const Axis_Transform vertical = impl_->vertical_axis->transform();
const RectF region{horizontal.pixel_to_coord(start.x), vertical.pixel_to_coord(start.y),
horizontal.pixel_to_coord(pointer.position.x) - horizontal.pixel_to_coord(start.x),
vertical.pixel_to_coord(pointer.position.y) - vertical.pixel_to_coord(start.y)};
const double first_start = horizontal.point_to_coord(start);
const double second_start = vertical.point_to_coord(start);
const RectF region{first_start, second_start,
horizontal.point_to_coord(pointer.position) - first_start,
vertical.point_to_coord(pointer.position) - second_start};
if(std::abs(region.width) > 1e-9 && std::abs(region.height) > 1e-9)
impl_->regions.update(region.normalized());
event.accept();
@@ -106,7 +105,9 @@ void Selection_Rectangle_Overlay_Control::paint(Painter& painter, const Render_S
const auto horizontal = impl_->horizontal_axis->transform(view);
const auto vertical = impl_->vertical_axis->transform(view);
for(const RectF& region : view.get(impl_->regions)) {
RectF pixels{horizontal.coord_to_pixel(region.x), vertical.coord_to_pixel(region.y), horizontal.coord_to_pixel(region.right()) - horizontal.coord_to_pixel(region.x), vertical.coord_to_pixel(region.bottom()) - vertical.coord_to_pixel(region.y)};
const RectF pixels = mapped_rect(horizontal, vertical,
{region.x, region.right()},
{region.y, region.bottom()});
painter.rect(pixels, state.selection_border_pen, state.selection_brush);
std::ostringstream text;
text << region.width << " x " << region.height;