include curve control points in extents
this makes results consistent with FT also optimized handling of path end points
This commit is contained in:
parent
98b94f8ba5
commit
e75e7224c9
|
@ -408,21 +408,21 @@ struct PathProcs
|
|||
const Number &dy = env.argStack.pop ();
|
||||
const Number &dx = env.argStack.pop ();
|
||||
pt1.move (dx, dy);
|
||||
env.moveto (pt1);
|
||||
PATH::moveto (env, param, pt1);
|
||||
}
|
||||
|
||||
static inline void hmoveto (ENV &env, PARAM& param)
|
||||
{
|
||||
Point pt1 = env.get_pt ();
|
||||
pt1.move_x (env.argStack.pop ());
|
||||
env.moveto (pt1);
|
||||
PATH::moveto (env, param, pt1);
|
||||
}
|
||||
|
||||
static inline void vmoveto (ENV &env, PARAM& param)
|
||||
{
|
||||
Point pt1 = env.get_pt ();
|
||||
pt1.move_y (env.argStack.pop ());
|
||||
env.moveto (pt1);
|
||||
PATH::moveto (env, param, pt1);
|
||||
}
|
||||
|
||||
static inline void rlineto (ENV &env, PARAM& param)
|
||||
|
|
|
@ -136,12 +136,17 @@ struct ExtentsParam
|
|||
{
|
||||
inline void init (void)
|
||||
{
|
||||
path_open = false;
|
||||
min_x.set_int (0x7FFFFFFF);
|
||||
min_y.set_int (0x7FFFFFFF);
|
||||
max_x.set_int (-0x80000000);
|
||||
max_y.set_int (-0x80000000);
|
||||
}
|
||||
|
||||
inline void start_path (void) { path_open = true; }
|
||||
inline void end_path (void) { path_open = false; }
|
||||
inline bool is_path_open (void) const { return path_open; }
|
||||
|
||||
inline void update_bounds (const Point &pt)
|
||||
{
|
||||
if (pt.x < min_x) min_x = pt.x;
|
||||
|
@ -150,6 +155,7 @@ struct ExtentsParam
|
|||
if (pt.y > max_y) max_y = pt.y;
|
||||
}
|
||||
|
||||
bool path_open;
|
||||
Number min_x;
|
||||
Number min_y;
|
||||
Number max_x;
|
||||
|
@ -158,16 +164,33 @@ struct ExtentsParam
|
|||
|
||||
struct CFF1PathProcs_Extents : PathProcs<CFF1PathProcs_Extents, CFF1CSInterpEnv, ExtentsParam>
|
||||
{
|
||||
static inline void moveto (CFF1CSInterpEnv &env, ExtentsParam& param, const Point &pt)
|
||||
{
|
||||
param.end_path ();
|
||||
env.moveto (pt);
|
||||
}
|
||||
|
||||
static inline void line (CFF1CSInterpEnv &env, ExtentsParam& param, const Point &pt1)
|
||||
{
|
||||
param.update_bounds (env.get_pt ());
|
||||
if (!param.is_path_open ())
|
||||
{
|
||||
param.start_path ();
|
||||
param.update_bounds (env.get_pt ());
|
||||
}
|
||||
env.moveto (pt1);
|
||||
param.update_bounds (env.get_pt ());
|
||||
}
|
||||
|
||||
static inline void curve (CFF1CSInterpEnv &env, ExtentsParam& param, const Point &pt1, const Point &pt2, const Point &pt3)
|
||||
{
|
||||
param.update_bounds (env.get_pt ());
|
||||
if (!param.is_path_open ())
|
||||
{
|
||||
param.start_path ();
|
||||
param.update_bounds (env.get_pt ());
|
||||
}
|
||||
/* include control points */
|
||||
param.update_bounds (pt1);
|
||||
param.update_bounds (pt2);
|
||||
env.moveto (pt3);
|
||||
param.update_bounds (env.get_pt ());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue