2016-11-23 00:29:38 -08:00
|
|
|
import eina_types;
|
|
|
|
import efl_gfx_types;
|
|
|
|
|
|
|
|
mixin Efl.Gfx.Path
|
|
|
|
{
|
|
|
|
[[EFL graphics path object interface]]
|
|
|
|
methods {
|
|
|
|
@property path {
|
|
|
|
[[Set the list of commands and points to be used to create the
|
2018-10-16 05:30:42 -07:00
|
|
|
content of path.
|
2016-11-23 00:29:38 -08:00
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
set {
|
|
|
|
}
|
|
|
|
get {
|
|
|
|
}
|
|
|
|
values {
|
2018-05-23 01:48:21 -07:00
|
|
|
op: ptr(const(Efl.Gfx.Path_Command_Type)); [[Command list]]
|
2016-11-23 00:29:38 -08:00
|
|
|
points: ptr(const(double)); [[Point list]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@property length {
|
|
|
|
[[Path length property]]
|
|
|
|
get {
|
|
|
|
}
|
|
|
|
values {
|
|
|
|
commands: uint; [[Commands]]
|
|
|
|
points: uint; [[Points]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@property current {
|
|
|
|
[[Current point coordinates]]
|
|
|
|
get {
|
|
|
|
}
|
|
|
|
values {
|
|
|
|
x: double; [[X co-ordinate of the current point.]]
|
|
|
|
y: double; [[Y co-ordinate of the current point.]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@property current_ctrl {
|
|
|
|
[[Current control point coordinates]]
|
|
|
|
get {
|
|
|
|
}
|
|
|
|
values {
|
|
|
|
x: double; [[X co-ordinate of control point.]]
|
|
|
|
y: double; [[Y co-ordinate of control point.]]
|
|
|
|
}
|
|
|
|
}
|
2017-11-29 03:03:16 -08:00
|
|
|
/* FIXME: Return a new object!!! */
|
|
|
|
copy_from {
|
2018-10-16 05:30:42 -07:00
|
|
|
[[Copy the path data from the object specified.
|
2016-11-23 00:29:38 -08:00
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
params {
|
|
|
|
@in dup_from: const(Efl.Object); [[Shape object from where data will be copied.]]
|
|
|
|
}
|
|
|
|
}
|
2018-04-17 11:09:44 -07:00
|
|
|
bounds_get @const {
|
2016-11-23 00:29:38 -08:00
|
|
|
[[Compute and return the bounding box of the currently set path
|
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
params {
|
2017-09-13 19:59:44 -07:00
|
|
|
@out r: Eina.Rect; [[Contain the bounding box of the currently set path]]
|
2016-11-23 00:29:38 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
reset {
|
2018-10-16 05:30:42 -07:00
|
|
|
[[Reset the path data of the path object.
|
2016-11-23 00:29:38 -08:00
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
}
|
|
|
|
append_move_to {
|
|
|
|
[[Moves the current point to the given point,
|
|
|
|
implicitly starting a new subpath and closing the previous one.
|
|
|
|
|
|
|
|
See also @.append_close.
|
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
params {
|
|
|
|
@in x: double; [[X co-ordinate of the current point.]]
|
|
|
|
@in y: double; [[Y co-ordinate of the current point.]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
append_line_to {
|
|
|
|
[[Adds a straight line from the current position to the given end point.
|
|
|
|
After the line is drawn, the current position is updated to be at the
|
|
|
|
end point of the line.
|
|
|
|
|
|
|
|
If no current position present, it draws a line to itself, basically
|
|
|
|
a point.
|
|
|
|
|
|
|
|
See also @.append_move_to.
|
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
params {
|
|
|
|
@in x: double; [[X co-ordinate of end point of the line.]]
|
|
|
|
@in y: double; [[Y co-ordinate of end point of the line.]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
append_quadratic_to {
|
|
|
|
[[Adds a quadratic Bezier curve between the current position and the
|
|
|
|
given end point (x,y) using the control points specified by (ctrl_x,
|
|
|
|
ctrl_y). After the path is drawn, the current position is updated to
|
|
|
|
be at the end point of the path.
|
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
params {
|
|
|
|
@in x: double; [[X co-ordinate of end point of the line.]]
|
|
|
|
@in y: double; [[Y co-ordinate of end point of the line.]]
|
|
|
|
@in ctrl_x: double; [[X co-ordinate of control point.]]
|
|
|
|
@in ctrl_y: double; [[Y co-ordinate of control point.]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
append_squadratic_to {
|
|
|
|
[[Same as efl_gfx_path_append_quadratic_to() api only difference is
|
|
|
|
that it uses the current control point to draw the bezier.
|
|
|
|
|
|
|
|
See also @.append_quadratic_to.
|
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
params {
|
|
|
|
@in x: double; [[X co-ordinate of end point of the line.]]
|
|
|
|
@in y: double; [[Y co-ordinate of end point of the line.]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
append_cubic_to {
|
|
|
|
[[Adds a cubic Bezier curve between the current position and the
|
|
|
|
given end point (x,y) using the control points specified by
|
|
|
|
(ctrl_x0, ctrl_y0), and (ctrl_x1, ctrl_y1). After the path is drawn,
|
|
|
|
the current position is updated to be at the end point of the path.
|
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
params {
|
|
|
|
@in ctrl_x0: double; [[X co-ordinate of 1st control point.]]
|
|
|
|
@in ctrl_y0: double; [[Y co-ordinate of 1st control point.]]
|
|
|
|
@in ctrl_x1: double; [[X co-ordinate of 2nd control point.]]
|
|
|
|
@in ctrl_y1: double; [[Y co-ordinate of 2nd control point.]]
|
|
|
|
@in x: double; [[X co-ordinate of end point of the line.]]
|
|
|
|
@in y: double; [[Y co-ordinate of end point of the line.]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
append_scubic_to {
|
|
|
|
[[Same as efl_gfx_path_append_cubic_to() api only difference is that it
|
|
|
|
uses the current control point to draw the bezier.
|
|
|
|
|
|
|
|
See also @.append_cubic_to.
|
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
params {
|
|
|
|
@in x: double; [[X co-ordinate of end point of the line.]]
|
|
|
|
@in y: double; [[Y co-ordinate of end point of the line.]]
|
|
|
|
@in ctrl_x: double; [[X co-ordinate of 2nd control point.]]
|
|
|
|
@in ctrl_y: double; [[Y co-ordinate of 2nd control point.]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
append_arc_to {
|
|
|
|
[[Append an arc that connects from the current point int the point list
|
|
|
|
to the given point (x,y). The arc is defined by the given radius in
|
|
|
|
x-direction (rx) and radius in y direction (ry).
|
|
|
|
|
|
|
|
Use this api if you know the end point's of the arc otherwise use
|
|
|
|
more convenient function @.append_arc.
|
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
params {
|
|
|
|
@in x: double; [[X co-ordinate of end point of the arc.]]
|
|
|
|
@in y: double; [[Y co-ordinate of end point of the arc.]]
|
|
|
|
@in rx: double; [[Radius of arc in x direction.]]
|
|
|
|
@in ry: double; [[Radius of arc in y direction.]]
|
|
|
|
@in angle: double; [[X-axis rotation , normally 0.]]
|
|
|
|
@in large_arc: bool; [[Defines whether to draw the larger arc or
|
|
|
|
smaller arc joining two point.]]
|
|
|
|
@in sweep: bool; [[Defines whether the arc will be drawn
|
|
|
|
counter-clockwise or clockwise from current point
|
|
|
|
to the end point taking into account the large_arc
|
|
|
|
property.]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
append_arc {
|
|
|
|
[[Append an arc that enclosed in the given rectangle (x, y, w, h).
|
|
|
|
The angle is defined in counter clock wise , use -ve angle for clockwise arc.
|
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
params {
|
|
|
|
@in x: double; [[X co-ordinate of the rect.]]
|
|
|
|
@in y: double; [[Y co-ordinate of the rect.]]
|
|
|
|
@in w: double; [[Width of the rect.]]
|
|
|
|
@in h: double; [[Height of the rect.]]
|
|
|
|
@in start_angle: double; [[Angle at which the arc will start]]
|
|
|
|
@in sweep_length: double; [[@ Length of the arc.]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
append_close {
|
|
|
|
[[Closes the current subpath by drawing a line to the beginning of the
|
|
|
|
subpath, automatically starting a new path. The current point of the
|
|
|
|
new path is (0, 0).
|
|
|
|
|
|
|
|
If the subpath does not contain any points, this function does nothing.
|
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
}
|
|
|
|
append_circle {
|
|
|
|
[[Append a circle with given center and radius.
|
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
params {
|
|
|
|
@in x: double; [[X co-ordinate of the center of the circle.]]
|
|
|
|
@in y: double; [[Y co-ordinate of the center of the circle.]]
|
|
|
|
@in radius: double; [[Radius of the circle.]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
append_rect {
|
|
|
|
[[Append the given rectangle with rounded corner to the path.
|
|
|
|
|
|
|
|
The xr and yr arguments specify the radii of the ellipses defining the
|
|
|
|
corners of the rounded rectangle.
|
|
|
|
|
|
|
|
xr and yr are specified in terms of width and height respectively.
|
|
|
|
|
|
|
|
If xr and yr are 0, then it will draw a rectangle without rounded
|
|
|
|
corner.
|
|
|
|
|
|
|
|
@since 1.18
|
|
|
|
]]
|
|
|
|
params {
|
|
|
|
@in x: double; [[X co-ordinate of the rectangle.]]
|
|
|
|
@in y: double; [[Y co-ordinate of the rectangle.]]
|
|
|
|
@in w: double; [[Width of the rectangle.]]
|
|
|
|
@in h: double; [[Height of the rectangle.]]
|
|
|
|
@in rx: double; [[The x radius of the rounded corner and should be
|
|
|
|
in range [ 0 to w/2 ]
|
|
|
|
]]
|
|
|
|
@in ry: double; [[The y radius of the rounded corner and should be
|
|
|
|
in range [ 0 to h/2 ]
|
|
|
|
]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
append_svg_path {
|
|
|
|
[[Append SVG path data]]
|
|
|
|
params {
|
|
|
|
@in svg_path_data: string; [[SVG path data to append]]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
interpolate {
|
2017-09-18 10:41:40 -07:00
|
|
|
[[Creates intermediary path part-way between two paths
|
|
|
|
|
|
|
|
Sets the points of the $obj as the linear interpolation of the points
|
2017-09-18 20:15:55 -07:00
|
|
|
in the $from and $to paths. The path's x,y position and control
|
2017-09-18 10:41:40 -07:00
|
|
|
point coordinates are likewise interpolated.
|
|
|
|
|
|
|
|
The $from and $to paths must not already have equivalent points,
|
|
|
|
and $to must contain at least as many points as $from, else the
|
|
|
|
function returns $false with no interpolation performed. If $to
|
|
|
|
has more points than $from, the excess points are ignored.
|
|
|
|
]]
|
2016-11-23 00:29:38 -08:00
|
|
|
return: bool; [[$true on success, $false otherwise]]
|
|
|
|
params {
|
2017-09-18 10:41:40 -07:00
|
|
|
@in from: const(Efl.Object); [[Source path]]
|
|
|
|
@in to: const(Efl.Object); [[Destination path]]
|
|
|
|
@in pos_map: double; [[Position map in range 0.0 to 1.0]]
|
2016-11-23 00:29:38 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
equal_commands {
|
|
|
|
[[Equal commands in object]]
|
|
|
|
return: bool; [[True on success, $false otherwise]]
|
|
|
|
params {
|
|
|
|
@in with: const(Efl.Object); [[Object]]
|
|
|
|
}
|
|
|
|
}
|
2018-12-23 20:52:13 -08:00
|
|
|
reserve {
|
|
|
|
[[Reserve path commands buffer in advance. If you know the count of
|
|
|
|
path commands coming, you can reserve commands buffer in advance
|
|
|
|
to avoid buffer growing job.
|
|
|
|
|
|
|
|
@since 1.22
|
|
|
|
]]
|
|
|
|
params {
|
|
|
|
@in cmd_count: uint; [[Commands count to reserve]]
|
|
|
|
@in pts_count: uint; [[Pointers count to reserve]]
|
|
|
|
}
|
|
|
|
}
|
efl gfx_path: remove EFL_GFX_PATH_EVENT_CHANGED
Summary:
Here is an additional optmization patch for removing
unnecessary updation of path,
For instance, let's assume this scenario:
If one vg object has 20 path nodes(shapes),
and every single nodes would have 50 path changes.
(like, append_cubic, append_rect, append_xxx ...);
There would 1000 events triggering.
Furthermore, if there are 20 vector objects in one view,
hese events would be triggered 20000 in one frame.
It's insane, actually I could figured out that happens.
and it took a lot of cpu consumption in some vector usages.
efl_gfx_path_commit() is my idea to avoid this.
When path is ready, the path need to get this api call in the last
to make object changed properly.
@feature
Reviewers: #committers, cedric
Subscribers: segfaultxavi, cedric, #reviewers, #committers
Tags: #efl
Differential Revision: https://phab.enlightenment.org/D7494
2018-12-23 21:31:05 -08:00
|
|
|
commit @pure_virtual {
|
|
|
|
[[Request to update the path object.
|
|
|
|
|
|
|
|
One path object may get appending several path calls (such as
|
|
|
|
append_cubic, append_rect, etc) to construct the final path data.
|
|
|
|
Here commit means all path data is prepared and now object
|
|
|
|
could update its own internal status based on the last path
|
|
|
|
information.
|
|
|
|
]]
|
|
|
|
}
|
2017-04-17 18:55:14 -07:00
|
|
|
}
|
2016-11-23 00:29:38 -08:00
|
|
|
}
|