📄 agg_path_storage.h
字号:
{
m_vertices.add_vertex(x, y, is_move_to(cmd) ?
unsigned(path_cmd_line_to) :
cmd);
}
}
}
// Concatenate polygon/polyline.
//--------------------------------------------------------------------
template<class T> void concat_poly(const T* data,
unsigned num_points,
bool closed)
{
poly_plain_adaptor<T> poly(data, num_points, closed);
concat_path(poly);
}
// Join polygon/polyline continuously.
//--------------------------------------------------------------------
template<class T> void join_poly(const T* data,
unsigned num_points,
bool closed)
{
poly_plain_adaptor<T> poly(data, num_points, closed);
join_path(poly);
}
//--------------------------------------------------------------------
void translate(double dx, double dy, unsigned path_id=0);
void translate_all_paths(double dx, double dy);
//--------------------------------------------------------------------
template<class Trans>
void transform(const Trans& trans, unsigned path_id=0)
{
unsigned num_ver = m_vertices.total_vertices();
for(; path_id < num_ver; path_id++)
{
double x, y;
unsigned cmd = m_vertices.vertex(path_id, &x, &y);
if(is_stop(cmd)) break;
if(is_vertex(cmd))
{
trans.transform(&x, &y);
m_vertices.modify_vertex(path_id, x, y);
}
}
}
//--------------------------------------------------------------------
template<class Trans>
void transform_all_paths(const Trans& trans)
{
unsigned idx;
unsigned num_ver = m_vertices.total_vertices();
for(idx = 0; idx < num_ver; idx++)
{
double x, y;
if(is_vertex(m_vertices.vertex(idx, &x, &y)))
{
trans.transform(&x, &y);
m_vertices.modify_vertex(idx, x, y);
}
}
}
private:
unsigned perceive_polygon_orientation(unsigned start, unsigned end);
void invert_polygon(unsigned start, unsigned end);
VertexContainer m_vertices;
unsigned m_iterator;
};
//------------------------------------------------------------------------
template<class VC>
unsigned path_base<VC>::start_new_path()
{
if(!is_stop(m_vertices.last_command()))
{
m_vertices.add_vertex(0.0, 0.0, path_cmd_stop);
}
return m_vertices.total_vertices();
}
//------------------------------------------------------------------------
template<class VC>
inline void path_base<VC>::rel_to_abs(double* x, double* y) const
{
if(m_vertices.total_vertices())
{
double x2;
double y2;
if(is_vertex(m_vertices.last_vertex(&x2, &y2)))
{
*x += x2;
*y += y2;
}
}
}
//------------------------------------------------------------------------
template<class VC>
inline void path_base<VC>::move_to(double x, double y)
{
m_vertices.add_vertex(x, y, path_cmd_move_to);
}
//------------------------------------------------------------------------
template<class VC>
inline void path_base<VC>::move_rel(double dx, double dy)
{
rel_to_abs(&dx, &dy);
m_vertices.add_vertex(dx, dy, path_cmd_move_to);
}
//------------------------------------------------------------------------
template<class VC>
inline void path_base<VC>::line_to(double x, double y)
{
m_vertices.add_vertex(x, y, path_cmd_line_to);
}
//------------------------------------------------------------------------
template<class VC>
inline void path_base<VC>::line_rel(double dx, double dy)
{
rel_to_abs(&dx, &dy);
m_vertices.add_vertex(dx, dy, path_cmd_line_to);
}
//------------------------------------------------------------------------
template<class VC>
inline void path_base<VC>::hline_to(double x)
{
m_vertices.add_vertex(x, last_y(), path_cmd_line_to);
}
//------------------------------------------------------------------------
template<class VC>
inline void path_base<VC>::hline_rel(double dx)
{
double dy = 0;
rel_to_abs(&dx, &dy);
m_vertices.add_vertex(dx, dy, path_cmd_line_to);
}
//------------------------------------------------------------------------
template<class VC>
inline void path_base<VC>::vline_to(double y)
{
m_vertices.add_vertex(last_x(), y, path_cmd_line_to);
}
//------------------------------------------------------------------------
template<class VC>
inline void path_base<VC>::vline_rel(double dy)
{
double dx = 0;
rel_to_abs(&dx, &dy);
m_vertices.add_vertex(dx, dy, path_cmd_line_to);
}
//------------------------------------------------------------------------
template<class VC>
void path_base<VC>::arc_to(double rx, double ry,
double angle,
bool large_arc_flag,
bool sweep_flag,
double x, double y)
{
if(m_vertices.total_vertices() && is_vertex(m_vertices.last_command()))
{
const double epsilon = 1e-30;
double x0 = 0.0;
double y0 = 0.0;
m_vertices.last_vertex(&x0, &y0);
rx = fabs(rx);
ry = fabs(ry);
// Ensure radii are valid
//-------------------------
if(rx < epsilon || ry < epsilon)
{
line_to(x, y);
return;
}
if(calc_distance(x0, y0, x, y) < epsilon)
{
// If the endpoints (x, y) and (x0, y0) are identical, then this
// is equivalent to omitting the elliptical arc segment entirely.
return;
}
bezier_arc_svg a(x0, y0, rx, ry, angle, large_arc_flag, sweep_flag, x, y);
if(a.radii_ok())
{
join_path(a);
}
else
{
line_to(x, y);
}
}
else
{
move_to(x, y);
}
}
//------------------------------------------------------------------------
template<class VC>
void path_base<VC>::arc_rel(double rx, double ry,
double angle,
bool large_arc_flag,
bool sweep_flag,
double dx, double dy)
{
rel_to_abs(&dx, &dy);
arc_to(rx, ry, angle, large_arc_flag, sweep_flag, dx, dy);
}
//------------------------------------------------------------------------
template<class VC>
void path_base<VC>::curve3(double x_ctrl, double y_ctrl,
double x_to, double y_to)
{
m_vertices.add_vertex(x_ctrl, y_ctrl, path_cmd_curve3);
m_vertices.add_vertex(x_to, y_to, path_cmd_curve3);
}
//------------------------------------------------------------------------
template<class VC>
void path_base<VC>::curve3_rel(double dx_ctrl, double dy_ctrl,
double dx_to, double dy_to)
{
rel_to_abs(&dx_ctrl, &dy_ctrl);
rel_to_abs(&dx_to, &dy_to);
m_vertices.add_vertex(dx_ctrl, dy_ctrl, path_cmd_curve3);
m_vertices.add_vertex(dx_to, dy_to, path_cmd_curve3);
}
//------------------------------------------------------------------------
template<class VC>
void path_base<VC>::curve3(double x_to, double y_to)
{
double x0;
double y0;
if(is_vertex(m_vertices.last_vertex(&x0, &y0)))
{
double x_ctrl;
double y_ctrl;
unsigned cmd = m_vertices.prev_vertex(&x_ctrl, &y_ctrl);
if(is_curve(cmd))
{
x_ctrl = x0 + x0 - x_ctrl;
y_ctrl = y0 + y0 - y_ctrl;
}
else
{
x_ctrl = x0;
y_ctrl = y0;
}
curve3(x_ctrl, y_ctrl, x_to, y_to);
}
}
//------------------------------------------------------------------------
template<class VC>
void path_base<VC>::curve3_rel(double dx_to, double dy_to)
{
rel_to_abs(&dx_to, &dy_to);
curve3(dx_to, dy_to);
}
//------------------------------------------------------------------------
template<class VC>
void path_base<VC>::curve4(double x_ctrl1, double y_ctrl1,
double x_ctrl2, double y_ctrl2,
double x_to, double y_to)
{
m_vertices.add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4);
m_vertices.add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4);
m_vertices.add_vertex(x_to, y_to, path_cmd_curve4);
}
//------------------------------------------------------------------------
template<class VC>
void path_base<VC>::curve4_rel(double dx_ctrl1, double dy_ctrl1,
double dx_ctrl2, double dy_ctrl2,
double dx_to, double dy_to)
{
rel_to_abs(&dx_ctrl1, &dy_ctrl1);
rel_to_abs(&dx_ctrl2, &dy_ctrl2);
rel_to_abs(&dx_to, &dy_to);
m_vertices.add_vertex(dx_ctrl1, dy_ctrl1, path_cmd_curve4);
m_vertices.add_vertex(dx_ctrl2, dy_ctrl2, path_cmd_curve4);
m_vertices.add_vertex(dx_to, dy_to, path_cmd_curve4);
}
//------------------------------------------------------------------------
template<class VC>
void path_base<VC>::curve4(double x_ctrl2, double y_ctrl2,
double x_to, double y_to)
{
double x0;
double y0;
if(is_vertex(last_vertex(&x0, &y0)))
{
double x_ctrl1;
double y_ctrl1;
unsigned cmd = prev_vertex(&x_ctrl1, &y_ctrl1);
if(is_curve(cmd))
{
x_ctrl1 = x0 + x0 - x_ctrl1;
y_ctrl1 = y0 + y0 - y_ctrl1;
}
else
{
x_ctrl1 = x0;
y_ctrl1 = y0;
}
curve4(x_ctrl1, y_ctrl1, x_ctrl2, y_ctrl2, x_to, y_to);
}
}
//------------------------------------------------------------------------
template<class VC>
void path_base<VC>::curve4_rel(double dx_ctrl2, double dy_ctrl2,
double dx_to, double dy_to)
{
rel_to_abs(&dx_ctrl2, &dy_ctrl2);
rel_to_abs(&dx_to, &dy_to);
curve4(dx_ctrl2, dy_ctrl2, dx_to, dy_to);
}
//------------------------------------------------------------------------
template<class VC>
inline void path_base<VC>::end_poly(unsigned flags)
{
if(is_vertex(m_vertices.last_command()))
{
m_vertices.add_vertex(0.0, 0.0, path_cmd_end_poly | flags);
}
}
//------------------------------------------------------------------------
template<class VC>
inline void path_base<VC>::close_polygon(unsigned flags)
{
end_poly(path_flags_close | flags);
}
//------------------------------------------------------------------------
template<class VC>
inline unsigned path_base<VC>::total_vertices() const
{
return m_vertices.total_vertices();
}
//------------------------------------------------------------------------
template<class VC>
inline unsigned path_base<VC>::last_vertex(double* x, double* y) const
{
return m_vertices.last_vertex(x, y);
}
//------------------------------------------------------------------------
template<class VC>
inline unsigned path_base<VC>::prev_vertex(double* x, double* y) const
{
return m_vertices.prev_vertex(x, y);
}
//------------------------------------------------------------------------
template<class VC>
inline double path_base<VC>::last_x() const
{
return m_vertices.last_x();
}
//------------------------------------------------------------------------
template<class VC>
inline double path_base<VC>::last_y() const
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -