Files
Renderive/Core/primitive/Fill_Area.h
T
2026-08-02 03:43:39 +08:00

92 lines
3.2 KiB
C++

#pragma once
#include <cstddef>
#include <cstdint>
#include <memory_resource>
#include <span>
#include <utility>
#include <vector>
#include "../architecture/Renderable.h"
#include "../Axis/Abs_Axis.h"
#include "../base/Geometry.h"
#include "../base/Memory.h"
#include "../base/Style.h"
namespace renderive {
struct Fill_Area_Private;
/// @brief 填充区域生成方式。
enum class Fill_Area_Mode : std::uint8_t {
/// @brief 按输入折线填充到基线。
To_Baseline,
/// @brief 按输入点直接组成多边形。
Polygon
};
/// @brief 填充区域构造属性。
struct Fill_Area_Prop {
std::weak_ptr<Abs_Axis> domain_axis{};
std::weak_ptr<Abs_Axis> value_axis{};
double baseline = 0.0;
Brush brush = Brush{};
Pen pen = Pen{.style = Line_Style::None};
bool antialias = false;
Fill_Area_Mode mode = Fill_Area_Mode::To_Baseline;
};
/// @brief 按坐标点绘制填充区域的图元。
class LIB_DECL Fill_Area : public Renderable {
public:
/// @brief 写入填充区域坐标点。
void update_points(std::span<const PointF> points);
/// @brief 移动写入填充区域坐标点。
void update_points(std::pmr::vector<PointF>&& points);
/// @brief 写入容器中的填充区域坐标点。
template <typename Points>
void update_points(const Points& points) {
update_points(std::span<const PointF>(points.data(), points.size()));
}
/// @brief 用 writer 填充并写入坐标点。
template <typename Writer>
void write_points(std::size_t count, Writer&& writer) {
std::pmr::vector<PointF> points(memory_resource(Memory_Domain::Curve));
points.resize(count);
std::forward<Writer>(writer)(std::span<PointF>(points.data(), points.size()));
update_points(std::move(points));
}
/// @brief 绑定 X 轴。
PROP(std::shared_ptr<Abs_Axis>, domain_axis)
/// @brief 绑定 Y 轴。
PROP(std::shared_ptr<Abs_Axis>, value_axis)
/// @brief To_Baseline 模式下的基线坐标。
PROP(double, baseline)
/// @brief 填充刷。
PROP(Brush, brush)
/// @brief 边界画笔。
PROP(Pen, pen)
/// @brief 是否启用抗锯齿。
PROP(bool, antialias)
/// @brief 填充生成方式。
PROP(Fill_Area_Mode, mode)
struct Builder;
/// @brief 创建填充区域图元。
Fill_Area();
private:
Fill_Area_Private* d();
Render_Object_Owner create_render_data() override;
Render_Object_Owner create_render_state() override;
Render_Object_Owner create_input_data() override;
};
/// @brief 填充区域构造器。
struct LIB_DECL Fill_Area::Builder : Fill_Area_Prop {
PROP_B(std::shared_ptr<Renderable>, parent)
PROP_B(std::shared_ptr<Abs_Axis>, domain_axis)
PROP_B(std::shared_ptr<Abs_Axis>, value_axis)
PROP_B(double, baseline)
PROP_B(Brush, brush)
PROP_B(Pen, pen)
PROP_B(bool, antialias)
PROP_B(Fill_Area_Mode, mode)
/// @brief 创建填充区域构造器。
Builder(std::shared_ptr<Renderable> parent, std::shared_ptr<Abs_Axis> domain_axis, std::shared_ptr<Abs_Axis> value_axis);
/// @brief 构建并返回填充区域对象。
std::shared_ptr<Fill_Area> build();
std::shared_ptr<Renderable> parent{};
};
} // namespace renderive