92 lines
3.2 KiB
C++
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
|