aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHermet Park <hermetpark@gmail.com>2019-04-15 13:59:45 +0900
committerHermet Park <hermetpark@gmail.com>2019-04-15 13:59:45 +0900
commit75e9a15fc660c068aaeced23585f321eeb62d30e (patch)
tree66af6877ee3cb576bf914d8cb16f1daa3e5e66d6
parentMerge branch 'master' into devs/hermet/lottie (diff)
parentmono-docs: Allow derived classes to have external examples (diff)
downloadefl-75e9a15fc660c068aaeced23585f321eeb62d30e.tar.gz
Merge branch 'master' into devs/hermet/lottie
-rw-r--r--meson_options.txt6
-rw-r--r--src/bin/eolian_mono/eolian/mono/documentation.hh103
-rw-r--r--src/bin/eolian_mono/eolian/mono/generation_contexts.hh2
-rw-r--r--src/bin/eolian_mono/eolian/mono/klass.hh16
-rw-r--r--src/bin/eolian_mono/eolian_mono.cc13
-rw-r--r--src/bindings/luajit/eolian.lua140
-rw-r--r--src/bindings/mono/meson.build1
-rw-r--r--src/lib/ector/software/ector_software_rasterizer.c173
-rw-r--r--src/lib/elementary/Elementary.h4
-rw-r--r--src/lib/elementary/efl_ui_list.c6
-rw-r--r--src/lib/elementary/efl_ui_list.eo2
-rw-r--r--src/lib/elementary/efl_ui_widget.c10
-rw-r--r--src/lib/elementary/elementary_config.h2
-rw-r--r--src/lib/elementary/elm_module_helper.h2
-rw-r--r--src/lib/elementary/elm_priv.h2
-rw-r--r--src/lib/evas/canvas/efl_canvas_vg_container.c50
-rw-r--r--src/lib/evas/common/evas_convert_rgb_32.c32
-rw-r--r--src/lib/evas/common/evas_map_image.c2
-rw-r--r--src/modules/elementary/access_output/mod.c4
-rw-r--r--src/modules/elementary/clock_input_ctxpopup/clock_input_ctxpopup.c4
-rw-r--r--src/modules/elementary/prefs/prefs_iface.c4
-rw-r--r--src/modules/elementary/test_entry/mod.c4
-rw-r--r--src/modules/elementary/test_map/mod.c4
-rw-r--r--src/modules/elementary/web/none/elm_web_none.c4
-rw-r--r--src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c9
-rw-r--r--src/static_libs/vg_common/vg_common_svg.c1
26 files changed, 535 insertions, 65 deletions
diff --git a/meson_options.txt b/meson_options.txt
index 8266d0d8b0..ae1362889a 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -323,6 +323,12 @@ option('mono-beta',
description: 'Flag for enabling @beta Eo methods in the api'
)
+option('mono-examples-dir',
+ type: 'string',
+ value: '',
+ description: 'Directory where eolian_mono will search for examples to embed into the documentation'
+)
+
option('lua-interpreter',
type: 'combo',
choices: ['luajit', 'lua'],
diff --git a/src/bin/eolian_mono/eolian/mono/documentation.hh b/src/bin/eolian_mono/eolian/mono/documentation.hh
index 1d65bcb076..1cea16e9e8 100644
--- a/src/bin/eolian_mono/eolian/mono/documentation.hh
+++ b/src/bin/eolian_mono/eolian/mono/documentation.hh
@@ -104,8 +104,7 @@ struct documentation_generator
static std::string function_conversion(attributes::function_def const& func)
{
- attributes::klass_def klass(get_klass(func.klass, func.unit), func.unit);
- std::string name = name_helpers::klass_full_concrete_or_interface_name(klass);
+ std::string name = name_helpers::klass_full_concrete_or_interface_name(func.klass);
switch (func.type)
{
// managed_method_name takes care of reordering the function name so the get/set goes first
@@ -114,8 +113,8 @@ struct documentation_generator
case attributes::function_type::prop_set:
case attributes::function_type::prop_get:
if (blacklist::is_function_blacklisted(func.c_name))return "";
- name += ".";
- name += name_helpers::managed_method_name(klass.eolian_name, func.name);
+ if (!name.empty()) name += ".";
+ name += name_helpers::managed_method_name(func.klass.eolian_name, func.name);
break;
default:
// No need to deal with property as function_defs are converted to get/set when building a given klass_def.
@@ -245,7 +244,19 @@ struct documentation_generator
/// Tag generator helpers
template<typename OutputIterator, typename Context>
- bool generate_tag(OutputIterator sink, std::string const& tag, std::string const &text, Context const& context, std::string tag_params = "") const
+ bool generate_opening_tag(OutputIterator sink, std::string const& tag, Context const& context, std::string tag_params = "") const
+ {
+ return as_generator("<" << tag << tag_params << ">").generate(sink, attributes::unused, context);
+ }
+
+ template<typename OutputIterator, typename Context>
+ bool generate_closing_tag(OutputIterator sink, std::string const& tag, Context const& context) const
+ {
+ return as_generator("</" << tag << ">").generate(sink, attributes::unused, context);
+ }
+
+ template<typename OutputIterator, typename Context>
+ bool generate_escaped_content(OutputIterator sink, std::string const &text, Context const& context) const
{
std::string new_text;
if (!as_generator(html_escaped_string).generate(std::back_inserter(new_text), text, context))
@@ -257,14 +268,24 @@ struct documentation_generator
std::istringstream ss(new_text);
std::string para;
- std::string final_text = "<" + tag + tag_params + ">";
+ std::string final_text;
bool first = true;
while (std::getline(ss, para)) {
if (first) final_text += para;
else final_text += "\n" + tabs + para;
first = false;
}
- return as_generator(scope_tab(scope_size) << "/// " << final_text << "</" << tag << ">\n").generate(sink, attributes::unused, context);
+ return as_generator(final_text).generate(sink, attributes::unused, context);
+ }
+
+ template<typename OutputIterator, typename Context>
+ bool generate_tag(OutputIterator sink, std::string const& tag, std::string const &text, Context const& context, std::string tag_params = "") const
+ {
+ if (!as_generator(scope_tab(scope_size) << "/// ").generate(sink, attributes::unused, context)) return false;
+ if (!generate_opening_tag(sink, tag, context, tag_params)) return false;
+ if (!generate_escaped_content(sink, text, context)) return false;
+ if (!generate_closing_tag(sink, tag, context)) return false;
+ return as_generator("\n").generate(sink, attributes::unused, context);
}
template<typename OutputIterator, typename Context>
@@ -291,6 +312,47 @@ struct documentation_generator
return generate_tag(sink, "value", text, context);
}
+ template<typename OutputIterator, typename Context>
+ bool generate_tag_example(OutputIterator sink, std::string const& full_object_name, Context const& context) const
+ {
+ auto options = efl::eolian::grammar::context_find_tag<options_context>(context);
+ // Example embedding not requested
+ if (options.examples_dir.empty()) return true;
+ std::string file_name = options.examples_dir + full_object_name + ".cs";
+ std::ifstream exfile(file_name);
+ // There is no example file for this class or method, just return
+ if (!exfile.good()) return true;
+ std::stringstream example_buff;
+ // Start with a newline so the first line renders with same indentation as the rest
+ example_buff << std::endl << exfile.rdbuf();
+
+ if (!as_generator(scope_tab(scope_size) << "/// ").generate(sink, attributes::unused, context)) return false;
+ if (!generate_opening_tag(sink, "example", context)) return false;
+ if (!generate_opening_tag(sink, "code", context)) return false;
+ if (!generate_escaped_content(sink, example_buff.str(), context)) return false;
+ if (!generate_closing_tag(sink, "code", context)) return false;
+ if (!generate_closing_tag(sink, "example", context)) return false;
+ return as_generator("\n").generate(sink, attributes::unused, context);
+ }
+
+ template<typename OutputIterator, typename Context>
+ bool generate_all_tag_examples(OutputIterator sink, std::string const & full_class_name, std::string const& object_name, Context const& context) const
+ {
+ // Take example from derived class
+ auto derived_klass = efl::eolian::grammar::context_find_tag<class_context>(context);
+ std::string derived_full_name =
+ derived_klass.name.empty() ? object_name : derived_klass.name + "." + object_name;
+ std::string base_full_name =
+ full_class_name.empty() ? object_name : full_class_name + "." + object_name;
+ if (!derived_klass.name.empty())
+ {
+ if (!generate_tag_example(sink, derived_full_name, context)) return false;
+ }
+ if (derived_full_name.compare(base_full_name) == 0) return true;
+ // Take example from base class
+ return generate_tag_example(sink, base_full_name, context);
+ }
+
// Actual exported generators
template<typename OutputIterator, typename Attribute, typename Context>
bool generate(OutputIterator sink, Attribute const& attr, Context const& context) const
@@ -299,6 +361,15 @@ struct documentation_generator
}
template<typename OutputIterator, typename Context>
+ bool generate(OutputIterator sink, attributes::klass_def const& klass, Context const& context) const
+ {
+ if (!generate(sink, klass.documentation, context)) return false;
+
+ std::string klass_name = name_helpers::klass_full_concrete_or_interface_name(klass);
+ return generate_tag_example(sink, klass_name, context);
+ }
+
+ template<typename OutputIterator, typename Context>
bool generate(OutputIterator sink, attributes::property_def const& prop, Context const& context) const
{
if (!generate(sink, prop.documentation, context))
@@ -310,9 +381,13 @@ struct documentation_generator
else if (prop.getter.is_engaged())
text = prop.getter->return_documentation.full_text;
// If there are no docs at all, do not generate <value> tag
- else return true;
+ if (!text.empty())
+ if (!generate_tag_value(sink, text, context)) return false;
- return generate_tag_value(sink, text, context);
+ return generate_all_tag_examples(sink,
+ name_helpers::klass_full_concrete_or_interface_name(prop.klass),
+ name_helpers::property_managed_name(prop),
+ context);
}
template<typename OutputIterator, typename Context>
@@ -348,7 +423,10 @@ struct documentation_generator
if (!generate_tag_return(sink, func.return_documentation.full_text, context))
return false;
- return true;
+ return generate_all_tag_examples(sink,
+ name_helpers::klass_full_concrete_or_interface_name(func.klass),
+ name_helpers::managed_method_name(func.klass.eolian_name, func.name),
+ context);
}
template<typename OutputIterator, typename Context>
@@ -364,7 +442,10 @@ struct documentation_generator
if (!generate_tag_return(sink, func.return_documentation.full_text, context))
return false;
- return true;
+ return generate_all_tag_examples(sink,
+ name_helpers::klass_full_concrete_or_interface_name(func.klass),
+ name_helpers::managed_method_name(func.klass.eolian_name, func.name),
+ context);
}
template<typename OutputIterator, typename Context>
diff --git a/src/bin/eolian_mono/eolian/mono/generation_contexts.hh b/src/bin/eolian_mono/eolian/mono/generation_contexts.hh
index 25ac3098fb..dc72696342 100644
--- a/src/bin/eolian_mono/eolian/mono/generation_contexts.hh
+++ b/src/bin/eolian_mono/eolian/mono/generation_contexts.hh
@@ -20,6 +20,7 @@ struct class_context
variables,
};
wrapper_kind current_wrapper_kind;
+ std::string name;
};
struct indentation_context
@@ -78,6 +79,7 @@ struct eolian_state_context {
struct options_context {
bool want_beta;
+ std::string examples_dir;
};
}
diff --git a/src/bin/eolian_mono/eolian/mono/klass.hh b/src/bin/eolian_mono/eolian/mono/klass.hh
index 87ad1bd5a7..4664446dbf 100644
--- a/src/bin/eolian_mono/eolian/mono/klass.hh
+++ b/src/bin/eolian_mono/eolian/mono/klass.hh
@@ -117,7 +117,9 @@ struct klass
// Interface class
if(class_type == "interface")
{
- auto iface_cxt = context_add_tag(class_context{class_context::interface}, context);
+ auto iface_cxt = context_add_tag(class_context{class_context::interface,
+ name_helpers::klass_full_concrete_or_interface_name(cls)},
+ context);
if(!as_generator(documentation).generate(sink, cls, iface_cxt))
return false;
@@ -195,7 +197,9 @@ struct klass
// Concrete class for interfaces, mixins, etc.
if(class_type != "class" && class_type != "abstract class")
{
- auto concrete_cxt = context_add_tag(class_context{class_context::concrete}, context);
+ auto concrete_cxt = context_add_tag(class_context{class_context::concrete,
+ name_helpers::klass_full_concrete_or_interface_name(cls)},
+ context);
auto concrete_name = name_helpers::klass_concrete_name(cls);
auto interface_name = name_helpers::klass_interface_name(cls);
@@ -277,7 +281,9 @@ struct klass
// Inheritable class
if(class_type == "class" || class_type == "abstract class")
{
- auto inherit_cxt = context_add_tag(class_context{class_context::inherit}, context);
+ auto inherit_cxt = context_add_tag(class_context{class_context::inherit,
+ name_helpers::klass_full_concrete_or_interface_name(cls)},
+ context);
// Class header
if(!as_generator
@@ -351,7 +357,9 @@ struct klass
// Native Inherit class
//if(class_type == "class")
{
- auto inative_cxt = context_add_tag(class_context{class_context::inherit_native}, context);
+ auto inative_cxt = context_add_tag(class_context{class_context::inherit_native,
+ name_helpers::klass_full_concrete_or_interface_name(cls)},
+ context);
auto native_inherit_name = name_helpers::klass_native_inherit_name(cls);
auto inherit_name = name_helpers::klass_inherit_name(cls);
std::string base_name;
diff --git a/src/bin/eolian_mono/eolian_mono.cc b/src/bin/eolian_mono/eolian_mono.cc
index 0fcc63fa42..8f24f762f0 100644
--- a/src/bin/eolian_mono/eolian_mono.cc
+++ b/src/bin/eolian_mono/eolian_mono.cc
@@ -43,6 +43,7 @@ struct options_type
std::vector<std::string> include_dirs;
std::string in_file;
std::string out_file;
+ std::string examples_dir;
std::string dllimport;
mutable Eolian_State* state;
mutable Eolian_Unit const* unit;
@@ -145,7 +146,8 @@ run(options_type const& opts)
auto context = context_add_tag(eolian_mono::indentation_context{0},
context_add_tag(eolian_mono::eolian_state_context{opts.state},
- context_add_tag(eolian_mono::options_context{opts.want_beta},
+ context_add_tag(eolian_mono::options_context{opts.want_beta,
+ opts.examples_dir},
context_add_tag(eolian_mono::library_context{opts.dllimport,
opts.v_major,
opts.v_minor,
@@ -294,6 +296,7 @@ _usage(const char *progname)
<< " -r, --recurse Recurse input directories loading .eo files." << std::endl
<< " -v, --version Print the version." << std::endl
<< " -b, --beta Enable @beta methods." << std::endl
+ << " -e, --example-dir <dir> Folder to search for example files." << std::endl
<< " -h, --help Print this help." << std::endl;
exit(EXIT_FAILURE);
}
@@ -324,9 +327,10 @@ opts_get(int argc, char **argv)
{ "vmin", required_argument, 0, 'm' },
{ "references", required_argument, 0, 'r'},
{ "beta", no_argument, 0, 'b'},
+ { "example-dir", required_argument, 0, 'e' },
{ 0, 0, 0, 0 }
};
- const char* options = "I:D:o:c:M:m:ar:vhb";
+ const char* options = "I:D:o:c:M:m:ar:vhbe:";
int c, idx;
while ( (c = getopt_long(argc, argv, options, long_options, &idx)) != -1)
@@ -382,6 +386,11 @@ opts_get(int argc, char **argv)
{
opts.want_beta = true;
}
+ else if (c == 'e')
+ {
+ opts.examples_dir = optarg;
+ if (!opts.examples_dir.empty() && opts.examples_dir.back() != '/') opts.examples_dir += "/";
+ }
}
if (optind == argc-1)
{
diff --git a/src/bindings/luajit/eolian.lua b/src/bindings/luajit/eolian.lua
index 4d17e4790d..0b99715ed9 100644
--- a/src/bindings/luajit/eolian.lua
+++ b/src/bindings/luajit/eolian.lua
@@ -17,6 +17,7 @@ ffi.cdef [[
typedef struct _Eolian_Object Eolian_Object;
typedef struct _Eolian_Class Eolian_Class;
typedef struct _Eolian_Function Eolian_Function;
+ typedef struct _Eolian_Part Eolian_Part;
typedef struct _Eolian_Type Eolian_Type;
typedef struct _Eolian_Typedecl Eolian_Typedecl;
typedef struct _Eolian_Function_Parameter Eolian_Function_Parameter;
@@ -31,6 +32,9 @@ ffi.cdef [[
typedef struct _Eolian_Value Eolian_Value;
typedef struct _Eolian_Unit Eolian_Unit;
+ typedef void (*Eolian_Panic_Cb)(const Eolian_State *state, const char *msg);
+ typedef void (*Eolian_Error_Cb)(const Eolian_Object *obj, const char *msg, void *data);
+
typedef enum {
EOLIAN_OBJECT_UNKNOWN = 0,
EOLIAN_OBJECT_CLASS,
@@ -288,7 +292,11 @@ ffi.cdef [[
int eolian_shutdown(void);
Eolian_State *eolian_state_new(void);
void eolian_state_free(Eolian_State *state);
+ Eolian_Panic_Cb eolian_state_panic_cb_set(Eolian_State *state, Eolian_Panic_Cb cb);
+ Eolian_Error_Cb eolian_state_error_cb_set(Eolian_State *state, Eolian_Error_Cb cb);
+ void *eolian_state_error_data_set(Eolian_State *state, void *data);
Eolian_Object_Type eolian_object_type_get(const Eolian_Object *obj);
+ const Eolian_Unit *eolian_object_unit_get(const Eolian_Object *obj);
const char *eolian_object_file_get(const Eolian_Object *obj);
int eolian_object_line_get(const Eolian_Object *obj);
int eolian_object_column_get(const Eolian_Object *obj);
@@ -309,8 +317,10 @@ ffi.cdef [[
const Eolian_Unit *eolian_state_unit_by_file_get(const Eolian_State *state, const char *file_name);
Eina_Iterator *eolian_state_units_get(const Eolian_State *state);
+ const Eolian_State *eolian_unit_state_get(const Eolian_Unit *unit);
Eina_Iterator *eolian_unit_children_get(const Eolian_Unit *unit);
const char *eolian_unit_file_get(const Eolian_Unit *unit);
+ const char *eolian_unit_file_path_get(const Eolian_Unit *unit);
const Eolian_Object *eolian_unit_object_by_name_get(const Eolian_Unit *unit, const char *name);
Eina_Iterator *eolian_unit_objects_get(const Eolian_Unit *unit);
const Eolian_Class *eolian_unit_class_by_name_get(const Eolian_Unit *unit, const char *class_name);
@@ -336,8 +346,10 @@ ffi.cdef [[
Eolian_Class_Type eolian_class_type_get(const Eolian_Class *klass);
const Eolian_Documentation *eolian_class_documentation_get(const Eolian_Class *klass);
const char *eolian_class_eo_prefix_get(const Eolian_Class *klass);
+ const char *eolian_class_event_prefix_get(const Eolian_Class *klass);
const char *eolian_class_data_type_get(const Eolian_Class *klass);
const Eolian_Class *eolian_class_parent_get(const Eolian_Class *klass);
+ Eina_Iterator *eolian_class_requires_get(const Eolian_Class *klass);
Eina_Iterator *eolian_class_extensions_get(const Eolian_Class *klass);
Eina_Iterator *eolian_class_functions_get(const Eolian_Class *klass, Eolian_Function_Type func_type);
Eolian_Function_Type eolian_function_type_get(const Eolian_Function *function_id);
@@ -363,6 +375,7 @@ ffi.cdef [[
const Eolian_Documentation *eolian_function_return_documentation_get(const Eolian_Function *foo_id, Eolian_Function_Type ftype);
Eina_Bool eolian_function_return_is_warn_unused(const Eolian_Function *foo_id, Eolian_Function_Type ftype);
Eina_Bool eolian_function_object_is_const(const Eolian_Function *function_id);
+ const Eolian_Class *eolian_function_class_get(const Eolian_Function *function_id);
const Eolian_Class *eolian_implement_class_get(const Eolian_Implement *impl);
const Eolian_Class *eolian_implement_implementing_class_get(const Eolian_Implement *impl);
const Eolian_Function *eolian_implement_function_get(const Eolian_Implement *impl, Eolian_Function_Type *func_type);
@@ -376,6 +389,7 @@ ffi.cdef [[
const Eolian_Class *eolian_constructor_class_get(const Eolian_Constructor *ctor);
const Eolian_Function *eolian_constructor_function_get(const Eolian_Constructor *ctor);
Eina_Bool eolian_constructor_is_optional(const Eolian_Constructor *ctor);
+ Eina_Bool eolian_constructor_is_ctor_param(const Eolian_Constructor *ctor);
Eina_Iterator *eolian_class_constructors_get(const Eolian_Class *klass);
Eina_Iterator *eolian_class_events_get(const Eolian_Class *klass);
const Eolian_Type *eolian_event_type_get(const Eolian_Event *event);
@@ -384,12 +398,18 @@ ffi.cdef [[
Eolian_Object_Scope eolian_event_scope_get(const Eolian_Event *event);
Eina_Bool eolian_event_is_hot(const Eolian_Event *event);
Eina_Bool eolian_event_is_restart(const Eolian_Event *event);
+ Eina_Iterator *eolian_class_parts_get(const Eolian_Class *klass);
const char *eolian_event_c_name_get(const Eolian_Event *event);
+ const Eolian_Class *eolian_part_class_get(const Eolian_Part *part);
+ const Eolian_Documentation *eolian_part_documentation_get(const Eolian_Part *part);
+ const Eolian_Event *eolian_class_event_by_name_get(const Eolian_Class *klass, const char *event_name);
Eina_Bool eolian_class_ctor_enable_get(const Eolian_Class *klass);
Eina_Bool eolian_class_dtor_enable_get(const Eolian_Class *klass);
const char *eolian_class_c_get_function_name_get(const Eolian_Class *klass);
Eolian_Type_Type eolian_type_type_get(const Eolian_Type *tp);
Eolian_Type_Builtin_Type eolian_type_builtin_type_get(const Eolian_Type *tp);
+ const char *eolian_class_c_name_get(const Eolian_Class *klass);
+ const char *eolian_class_c_data_type_get(const Eolian_Class *klass);
Eolian_Typedecl_Type eolian_typedecl_type_get(const Eolian_Typedecl *tp);
Eina_Iterator *eolian_typedecl_struct_fields_get(const Eolian_Typedecl *tp);
const Eolian_Struct_Type_Field *eolian_typedecl_struct_field_get(const Eolian_Typedecl *tp, const char *field);
@@ -534,6 +554,14 @@ local object_idx, wrap_object = gen_wrap {
return tonumber(eolian.eolian_object_type_get(cast_obj(self)))
end,
+ unit_get = function(self)
+ local v = eolian.eolian_object_unit_get(cast_obj(self))
+ if v == nil then
+ return nil
+ end
+ return v
+ end,
+
line_get = function(self)
return tonumber(eolian.eolian_object_line_get(cast_obj(self)))
end,
@@ -579,6 +607,12 @@ local object_idx, wrap_object = gen_wrap {
ffi.metatype("Eolian_Object", { __index = object_idx })
local unit_idx, wrap_unit = gen_wrap {
+ state_get = function(self)
+ local v = eolian.eolian_unit_state_get(cast_unit(self))
+ if v == nil then return nil end
+ return v
+ end,
+
children_get = function(self)
return Ptr_Iterator("const Eolian_Unit*",
eolian.eolian_unit_children_get(cast_unit(self)))
@@ -590,6 +624,12 @@ local unit_idx, wrap_unit = gen_wrap {
return ffi.string(v)
end,
+ file_path_get = function(self)
+ local v = eolian.eolian_unit_file_path_get(cast_unit(self))
+ if v == nil then return nil end
+ return ffi.string(v)
+ end,
+
object_by_name_get = function(self, name)
local v = eolian.eolian_unit_object_by_name_get(cast_unit(self), name)
if v == nil then return nil end
@@ -670,8 +710,43 @@ local unit_idx, wrap_unit = gen_wrap {
ffi.metatype("Eolian_Unit", { __index = unit_idx })
+local panic_cbs = {}
+local error_cbs = {}
+
+local obj_to_idx = function(obj)
+ return tonumber(ffi.cast("size_t", obj))
+end
+
+local panic_cb, err_cb
+
+panic_cb = ffi.gc(ffi.cast("Eolian_Panic_Cb", function(state, msg)
+ local pcb = panic_cbs[obj_to_idx(self)]
+ assert(pcb, "internal error: no prror cb")
+ pcb(state, ffi.string(msg))
+end), function(cb)
+ cb:free()
+end)
+
+err_cb = ffi.gc(ffi.cast("Eolian_Panic_Cb", function(obj, msg, data)
+ local ecb = error_cbs[obj_to_idx(self)]
+ assert(ecb, "internal error: no error cb")
+ ecb(obj, ffi.string(msg))
+end), function(cb)
+ cb:free()
+end)
+
ffi.metatype("Eolian_State", {
__index = wrap_unit {
+ panic_cb_set = function(self, cb)
+ panic_cbs[obj_to_idx(self)] = cb
+ eolian.eolian_state_panic_cb_set(self, panic_cb)
+ end,
+
+ error_cb_set = function(self, cb)
+ error_cbs[obj_to_idx(self)] = cb
+ eolian.eolian_state_error_cb_set(self, err_cb)
+ end,
+
directory_add = function(self, dir)
return eolian.eolian_state_directory_add(self, dir) ~= 0
end,
@@ -770,6 +845,9 @@ ffi.metatype("Eolian_State", {
end
},
__gc = function(self)
+ local idx = obj_to_idx(self)
+ panic_cbs[idx] = nil
+ error_cbs[idx] = nil
eolian.eolian_state_free(self)
end
})
@@ -1127,6 +1205,12 @@ M.Function = ffi.metatype("Eolian_Function", {
is_const = function(self)
return eolian.eolian_function_object_is_const(self) ~= 0
+ end,
+
+ class_get = function(self)
+ local v = eolian.eolian_function_class_get(self)
+ if v == nil then return nil end
+ return v
end
}
})
@@ -1241,6 +1325,10 @@ ffi.metatype("Eolian_Constructor", {
is_optional = function(self)
return eolian.eolian_constructor_is_optional(self) ~= 0
+ end,
+
+ is_ctor_param = function(self)
+ return eolian.eolian_constructor_is_ctor_param(self) ~= 0
end
}
})
@@ -1285,6 +1373,22 @@ ffi.metatype("Eolian_Event", {
}
})
+ffi.metatype("Eolian_Part", {
+ __index = wrap_object {
+ class_get = function(self)
+ local v = eolian.eolian_part_class_get(self)
+ if v == nil then return nil end
+ return v
+ end,
+
+ documentation_get = function(self)
+ local v = eolian.eolian_part_documentation_get(self)
+ if v == nil then return nil end
+ return v
+ end
+ }
+})
+
M.class_type = {
UNKNOWN = 0,
REGULAR = 1,
@@ -1315,6 +1419,14 @@ M.Class = ffi.metatype("Eolian_Class", {
return ffi.string(v)
end,
+ event_prefix_get = function(self)
+ local v = eolian.eolian_class_event_prefix_get(self)
+ if v == nil then
+ return self:eo_prefix_get()
+ end
+ return ffi.string(v)
+ end,
+
data_type_get = function(self)
local v = eolian.eolian_class_data_type_get(self)
if v == nil then return nil end
@@ -1332,6 +1444,11 @@ M.Class = ffi.metatype("Eolian_Class", {
eolian.eolian_class_extensions_get(self))
end,
+ requires_get = function(self)
+ return Ptr_Iterator("const Eolian_Class*",
+ eolian.eolian_class_requires_get(self))
+ end,
+
functions_get = function(self, func_type)
return Ptr_Iterator("const Eolian_Function*",
eolian.eolian_class_functions_get(self, func_type))
@@ -1359,6 +1476,17 @@ M.Class = ffi.metatype("Eolian_Class", {
eolian.eolian_class_events_get(self))
end,
+ event_by_name_get = function(self, name)
+ local v = eolian.eolian_class_event_by_name_get(self, name)
+ if v == nil then return nil end
+ return v
+ end,
+
+ parts_get = function(self)
+ return Ptr_Iterator("const Eolian_Part*",
+ eolian.eolian_class_parts_get(self))
+ end,
+
ctor_enable_get = function(self)
return eolian.eolian_class_ctor_enable_get(self) ~= 0
end,
@@ -1371,6 +1499,18 @@ M.Class = ffi.metatype("Eolian_Class", {
local v = eolian.eolian_class_c_get_function_name_get(self)
if v == nil then return nil end
return ffi_stringshare(v)
+ end,
+
+ c_name_get = function(self)
+ local v = eolian.eolian_class_c_name_get(self)
+ if v == nil then return nil end
+ return ffi_stringshare(v)
+ end,
+
+ c_data_type_get = function(self)
+ local v = eolian.eolian_class_c_data_type_get(self)
+ if v == nil then return nil end
+ return ffi_stringshare(v)
end
}
})
diff --git a/src/bindings/mono/meson.build b/src/bindings/mono/meson.build
index dc2c856404..e7c5e00d9a 100644
--- a/src/bindings/mono/meson.build
+++ b/src/bindings/mono/meson.build
@@ -127,6 +127,7 @@ foreach lib : mono_sublibs
command : [eolian_mono_gen, beta_option, '-I', meson.current_source_dir(), eolian_include_directories,
'--dllimport', package_name,
'-o', join_paths(meson.current_build_dir(), mono_gen_file + '.cs'),
+ '-e', get_option('mono-examples-dir'),
'@INPUT@'])
endif
endforeach
diff --git a/src/lib/ector/software/ector_software_rasterizer.c b/src/lib/ector/software/ector_software_rasterizer.c
index d9b3351248..b2b5779f69 100644
--- a/src/lib/ector/software/ector_software_rasterizer.c
+++ b/src/lib/ector/software/ector_software_rasterizer.c
@@ -11,8 +11,23 @@
#include "draw.h"
+//FIXME: This enum add temporarily to help understanding of additional code
+//related to masking in prepare_mask.
+//This needs to be formally declared through the eo class.
+typedef enum _EFL_CANVAS_VG_NODE_BLEND_TYPE
+{
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_NONE = 0,
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_ALPHA,
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_ALPHA_INV,
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_ADD,
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_SUBSTRACT,
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_INTERSECT,
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_DIFFERENCE
+}EFL_CANVAS_VG_NODE_BLEND_TYPE;
+//
+
static void
-_blend_color_argb(int count, const SW_FT_Span *spans, void *user_data)
+_blend_argb(int count, const SW_FT_Span *spans, void *user_data)
{
Span_Data *sd = user_data;
uint32_t color, *buffer, *target;
@@ -34,7 +49,7 @@ _blend_color_argb(int count, const SW_FT_Span *spans, void *user_data)
}
static void
-_blend_color_argb_with_maskA(int count, const SW_FT_Span *spans, void *user_data)
+_blend_alpha(int count, const SW_FT_Span *spans, void *user_data)
{
Span_Data *sd = user_data;
const int pix_stride = sd->raster_buffer->stride / 4;
@@ -77,7 +92,7 @@ _blend_color_argb_with_maskA(int count, const SW_FT_Span *spans, void *user_data
}
static void
-_blend_color_argb_with_maskInvA(int count, const SW_FT_Span *spans, void *user_data)
+_blend_alpha_inv(int count, const SW_FT_Span *spans, void *user_data)
{
Span_Data *sd = user_data;
const int pix_stride = sd->raster_buffer->stride / 4;
@@ -120,6 +135,122 @@ _blend_color_argb_with_maskInvA(int count, const SW_FT_Span *spans, void *user_d
}
}
+static void
+_blend_mask_add(int count, const SW_FT_Span *spans, void *user_data)
+{
+ Span_Data *sd = user_data;
+ Ector_Software_Buffer_Base_Data *mask = sd->mask;
+
+ uint32_t color = DRAW_MUL4_SYM(sd->color, sd->mul_col);
+ RGBA_Comp_Func_Solid comp_func = efl_draw_func_solid_span_get(sd->op, color);
+ uint32_t *mbuffer = mask->pixels.u32;
+
+ while (count--)
+ {
+ uint32_t *ttarget = alloca(sizeof(uint32_t) * spans->len);
+ memset(ttarget, 0x00, sizeof(uint32_t) * spans->len);
+ uint32_t *mtarget = mbuffer + ((mask->generic->w * spans->y) + spans->x);
+ comp_func(ttarget, spans->len, color, spans->coverage);
+ for (int i = 0; i < spans->len; i++)
+ {
+ double adst = A_VAL(&mtarget[i]) == 0 ? 0 : (double)(A_VAL(&mtarget[i])) / (double)255;
+ double asrc = A_VAL(&ttarget[i]) == 0 ? 0 : (double)(A_VAL(&ttarget[i])) / (double)255;
+ uint32_t aout = (int)(((adst * (1 - asrc)) + asrc) * 255);
+ mtarget[i] = (aout<<24) + (0x00FFFFFF & mtarget[i]);
+ }
+ ++spans;
+ }
+}
+
+static void
+_blend_mask_sub(int count, const SW_FT_Span *spans, void *user_data)
+{
+ Span_Data *sd = user_data;
+ Ector_Software_Buffer_Base_Data *mask = sd->mask;
+
+ uint32_t color = DRAW_MUL4_SYM(sd->color, sd->mul_col);
+ RGBA_Comp_Func_Solid comp_func = efl_draw_func_solid_span_get(sd->op, color);
+ uint32_t *mtarget = mask->pixels.u32;
+
+ int tsize = sd->raster_buffer->generic->w * sd->raster_buffer->generic->h;
+ uint32_t *tbuffer = alloca(sizeof(uint32_t) * tsize);
+ memset(tbuffer, 0x00, sizeof(uint32_t) * tsize);
+
+ while (count--)
+ {
+ uint32_t *ttarget = tbuffer + ((mask->generic->w * spans->y) + spans->x);
+ comp_func(ttarget, spans->len, color, spans->coverage);
+ ++spans;
+ }
+
+ for(int i = 0; i < tsize; i++)
+ {
+ double adst = A_VAL(&mtarget[i]) == 0 ? 0 : (double)(A_VAL(&mtarget[i])) / (double)255;
+ double asrc = A_VAL(&tbuffer[i]) == 0 ? 0 : (double)(A_VAL(&tbuffer[i])) / (double)255;
+ uint32_t aout = (int)((adst * (1 - asrc)) * 255);
+ mtarget[i] = (aout<<24) + (0x00FFFFFF & mtarget[i]);
+ }
+}
+
+
+static void
+_blend_mask_ins(int count, const SW_FT_Span *spans, void *user_data)
+{
+ Span_Data *sd = user_data;
+ Ector_Software_Buffer_Base_Data *mask = sd->mask;
+
+ uint32_t color = DRAW_MUL4_SYM(sd->color, sd->mul_col);
+ RGBA_Comp_Func_Solid comp_func = efl_draw_func_solid_span_get(sd->op, color);
+ uint32_t *mtarget = mask->pixels.u32;
+
+ int tsize = sd->raster_buffer->generic->w * sd->raster_buffer->generic->h;
+ uint32_t *tbuffer = alloca(sizeof(uint32_t) * tsize);
+ memset(tbuffer, 0x00, sizeof(uint32_t) * tsize);
+
+ while (count--)
+ {
+ uint32_t *ttarget = tbuffer + ((mask->generic->w * spans->y) + spans->x);
+ comp_func(ttarget, spans->len, color, spans->coverage);
+ ++spans;
+ }
+
+ for(int i = 0; i < tsize; i++)
+ {
+ double adst = A_VAL(&mtarget[i]) == 0 ? 0 : (double)(A_VAL(&mtarget[i])) / (double)255;
+ double asrc = A_VAL(&tbuffer[i]) == 0 ? 0 : (double)(A_VAL(&tbuffer[i])) / (double)255;
+ uint32_t aout = (int)((adst * asrc) * 255);
+ mtarget[i] = (aout<<24) + (0x00FFFFFF & mtarget[i]);
+ }
+}
+
+
+static void
+_blend_mask_diff(int count, const SW_FT_Span *spans, void *user_data)
+{
+ Span_Data *sd = user_data;
+ Ector_Software_Buffer_Base_Data *mask = sd->mask;
+
+ uint32_t color = DRAW_MUL4_SYM(sd->color, sd->mul_col);
+ RGBA_Comp_Func_Solid comp_func = efl_draw_func_solid_span_get(sd->op, color);
+ uint32_t *mbuffer = mask->pixels.u32;
+
+ while (count--)
+ {
+ uint32_t *ttarget = alloca(sizeof(uint32_t) * spans->len);
+ memset(ttarget, 0x00, sizeof(uint32_t) * spans->len);
+ uint32_t *mtarget = mbuffer + ((mask->generic->w * spans->y) + spans->x);
+ comp_func(ttarget, spans->len, color, spans->coverage);
+ for (int i = 0; i < spans->len; i++)
+ {
+ double adst = A_VAL(&mtarget[i]) == 0 ? 0 : (double)(A_VAL(&mtarget[i])) / (double)255;
+ double asrc = A_VAL(&ttarget[i]) == 0 ? 0 : (double)(A_VAL(&ttarget[i])) / (double)255;
+ uint32_t aout = (int)((((1 - adst) * asrc) + ((1 - asrc) * adst)) * 255);
+ mtarget[i] = (aout<<24) + (0x00FFFFFF & mtarget[i]);
+ }
+ ++spans;
+ }
+}
+
#define BLEND_GRADIENT_BUFFER_SIZE 2048
typedef void (*src_fetch) (unsigned int *buffer, Span_Data *data, int y, int x, int length);
@@ -362,14 +493,32 @@ _adjust_span_fill_methods(Span_Data *spdata)
case Solid:
{
if (spdata->mask)
- {
- if (spdata->mask_op == 2)
- spdata->unclipped_blend = &_blend_color_argb_with_maskInvA;
- else
- spdata->unclipped_blend = &_blend_color_argb_with_maskA;
- }
+ {
+ switch (spdata->mask_op)
+ {
+ default:
+ case EFL_CANVAS_VG_NODE_BLEND_TYPE_ALPHA:
+ spdata->unclipped_blend = &_blend_alpha;
+ break;
+ case EFL_CANVAS_VG_NODE_BLEND_TYPE_ALPHA_INV:
+ spdata->unclipped_blend = &_blend_alpha_inv;
+ break;
+ case EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_ADD:
+ spdata->unclipped_blend = &_blend_mask_add;
+ break;
+ case EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_SUBSTRACT:
+ spdata->unclipped_blend = &_blend_mask_sub;
+ break;
+ case EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_INTERSECT:
+ spdata->unclipped_blend = &_blend_mask_ins;
+ break;
+ case EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_DIFFERENCE:
+ spdata->unclipped_blend = &_blend_mask_diff;
+ break;
+ }
+ }
else
- spdata->unclipped_blend = &_blend_color_argb;
+ spdata->unclipped_blend = &_blend_argb;
}
break;
case LinearGradient:
@@ -378,6 +527,10 @@ _adjust_span_fill_methods(Span_Data *spdata)
break;
}
+ //FIXME: Mask and mask case is not use clipping.
+ if (spdata->mask_op >= EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_ADD)
+ spdata->clip.enabled = EINA_FALSE;
+
// Clipping Function
if (spdata->clip.enabled)
{
diff --git a/src/lib/elementary/Elementary.h b/src/lib/elementary/Elementary.h
index a10b9e5299..96efada09e 100644
--- a/src/lib/elementary/Elementary.h
+++ b/src/lib/elementary/Elementary.h
@@ -87,7 +87,7 @@
#endif
#ifdef _WIN32
-# ifdef ELEMENTARY_BUILD
+# ifdef EFL_BUILD
# ifdef DLL_EXPORT
# define EAPI __declspec(dllexport)
# else
@@ -386,7 +386,7 @@ typedef Eo Efl_Ui_Pager;
}
#endif
-#ifndef ELEMENTARY_BUILD
+#ifndef EFL_BUILD
# undef EAPI
# define EAPI
#endif
diff --git a/src/lib/elementary/efl_ui_list.c b/src/lib/elementary/efl_ui_list.c
index 1cb6f1061e..978aae3271 100644
--- a/src/lib/elementary/efl_ui_list.c
+++ b/src/lib/elementary/efl_ui_list.c
@@ -467,7 +467,7 @@ _efl_ui_list_efl_object_finalize(Eo *obj,
}
EOLIAN static void
-_efl_ui_list_efl_object_destructor(Eo *obj, Efl_Ui_List_Data *pd)
+_efl_ui_list_efl_object_invalidate(Eo *obj, Efl_Ui_List_Data *pd)
{
_scroll_edje_object_detach(obj);
@@ -488,12 +488,14 @@ _efl_ui_list_efl_object_destructor(Eo *obj, Efl_Ui_List_Data *pd)
efl_del(pd->box);
pd->box = NULL;
+
efl_del(pd->pan);
pd->pan = NULL;
+
efl_del(pd->smanager);
pd->smanager = NULL;
- efl_destructor(efl_super(obj, MY_CLASS));
+ efl_invalidate(efl_super(obj, MY_CLASS));
}
EOLIAN static void
diff --git a/src/lib/elementary/efl_ui_list.eo b/src/lib/elementary/efl_ui_list.eo
index 988c78c5cc..8a77e37261 100644
--- a/src/lib/elementary/efl_ui_list.eo
+++ b/src/lib/elementary/efl_ui_list.eo
@@ -42,7 +42,7 @@ class @beta Efl.Ui.List extends Efl.Ui.Layout_Base implements
//Efl.Object
Efl.Object.constructor;
Efl.Object.finalize;
- Efl.Object.destructor;
+ Efl.Object.invalidate;
//Efl.Canvas
Efl.Canvas.Group.group_calculate;
diff --git a/src/lib/elementary/efl_ui_widget.c b/src/lib/elementary/efl_ui_widget.c
index 15585ca731..99da93aa3b 100644
--- a/src/lib/elementary/efl_ui_widget.c
+++ b/src/lib/elementary/efl_ui_widget.c
@@ -1373,8 +1373,16 @@ _disabled_counter_get(Eo *widget)
static void
_mirror_disabled_state(Eo *obj, Elm_Widget_Smart_Data *pd, int disabled_delta)
{
+ int prev_disabled = pd->disabled;
+
pd->disabled = (pd->parent_obj ? _disabled_counter_get(pd->parent_obj) : 0) + disabled_delta;
+ //The current disabled state is the same as the parent
+ //when the parent is assigned or changed, no further action is required.
+ if (((prev_disabled > 0 && pd->disabled > 0)) ||
+ ((prev_disabled <= 0 && pd->disabled <= 0)))
+ return;
+
//we should not call disabled_set when things are invalidated
//otherwise we will unleashe an amount of errors in efl_ui_layout
if (efl_invalidated_get(obj)) return;
@@ -1413,7 +1421,6 @@ _efl_ui_widget_widget_parent_set(Eo *obj, Elm_Widget_Smart_Data *pd, Efl_Ui_Widg
*/
double scale, prev_scale = efl_gfx_entity_scale_get(obj);
Elm_Theme *th, *prev_th = elm_widget_theme_get(obj);
- Eina_Bool mirrored, pmirrored = efl_ui_mirrored_get(parent);
int disabled_delta = pd->disabled - (pd->parent_obj ? _disabled_counter_get(pd->parent_obj) : 0);
old_parent = pd->parent_obj;
@@ -1422,6 +1429,7 @@ _efl_ui_widget_widget_parent_set(Eo *obj, Elm_Widget_Smart_Data *pd, Efl_Ui_Widg
// now lets sync up all states
if (pd->parent_obj)
{
+ Eina_Bool mirrored, pmirrored = efl_ui_mirrored_get(pd->parent_obj);
scale = efl_gfx_entity_scale_get(obj);
th = elm_widget_theme_get(obj);
mirrored = efl_ui_mirrored_get(obj);
diff --git a/src/lib/elementary/elementary_config.h b/src/lib/elementary/elementary_config.h
index 9bff045c04..6074510b0d 100644
--- a/src/lib/elementary/elementary_config.h
+++ b/src/lib/elementary/elementary_config.h
@@ -9,7 +9,7 @@
#define ELM_CONFIG_ICON_THEME_ELEMENTARY "_Elementary_Icon_Theme"
-#if defined(ELEMENTARY_BUILD) || defined(ELM_INTERNAL_API_ARGESFSDFEFC)
+#if defined(EFL_BUILD) || defined(ELM_INTERNAL_API_ARGESFSDFEFC)
#define EFL_UI_WIDGET_PROTECTED
#define EFL_CANVAS_OBJECT_PROTECTED
#define EFL_CANVAS_GROUP_PROTECTED
diff --git a/src/lib/elementary/elm_module_helper.h b/src/lib/elementary/elm_module_helper.h
index 8f882dabaa..eba3237266 100644
--- a/src/lib/elementary/elm_module_helper.h
+++ b/src/lib/elementary/elm_module_helper.h
@@ -13,7 +13,7 @@
#endif
#ifdef _WIN32
-# ifdef ELEMENTARY_BUILD
+# ifdef EFL_BUILD
# ifdef DLL_EXPORT
# define EAPI __declspec(dllexport)
# else
diff --git a/src/lib/elementary/elm_priv.h b/src/lib/elementary/elm_priv.h
index 54c32cf9a6..fa262e2646 100644
--- a/src/lib/elementary/elm_priv.h
+++ b/src/lib/elementary/elm_priv.h
@@ -35,7 +35,7 @@
# endif
# ifdef _WIN32
-# ifdef ELEMENTARY_BUILD
+# ifdef EFL_BUILD
# ifdef DLL_EXPORT
# define EAPI __declspec(dllexport)
# else
diff --git a/src/lib/evas/canvas/efl_canvas_vg_container.c b/src/lib/evas/canvas/efl_canvas_vg_container.c
index 699ea8dccc..7623401896 100644
--- a/src/lib/evas/canvas/efl_canvas_vg_container.c
+++ b/src/lib/evas/canvas/efl_canvas_vg_container.c
@@ -5,6 +5,23 @@
#define MY_CLASS EFL_CANVAS_VG_CONTAINER_CLASS
+
+//FIXME: This enum add temporarily to help understanding of additional code
+//related to masking in prepare_mask.
+//This needs to be formally declared through the eo class.
+//This is a list of blending supported via efl_canvas_vg_node_mask_set().
+typedef enum _EFL_CANVAS_VG_NODE_BLEND_TYPE
+{
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_NONE = 0,
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_ALPHA,
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_ALPHA_INV,
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_ADD,
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_SUBSTRACT,
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_INTERSECT,
+ EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_DIFFERENCE
+}EFL_CANVAS_VG_NODE_BLEND_TYPE;
+//
+
static void
_invalidate_cb(void *data EINA_UNUSED, const Efl_Event *event)
{
@@ -53,6 +70,7 @@ _prepare_mask(Evas_Object_Protected_Data *obj, //vector object
void *engine, void *output, void *context,
Ector_Surface *surface,
Eina_Matrix3 *ptransform,
+ Eina_Matrix3 *ctransform,
Ector_Buffer *mask,
int mask_op)
{
@@ -60,6 +78,7 @@ _prepare_mask(Evas_Object_Protected_Data *obj, //vector object
Efl_Canvas_Vg_Node_Data *nd =
efl_data_scope_get(mask_obj, EFL_CANVAS_VG_NODE_CLASS);
if (nd->flags == EFL_GFX_CHANGE_FLAG_NONE) return pd->mask.buffer;
+ uint32_t init_buffer = 0x0;
//1. Mask Size
Eina_Rect mbound;
@@ -68,7 +87,9 @@ _prepare_mask(Evas_Object_Protected_Data *obj, //vector object
mbound.w = obj->cur->geometry.w;
mbound.h = obj->cur->geometry.h;
-// efl_gfx_path_bounds_get(mask, &mbound);
+ //FIXME: If mask typs is SUBSTRACT or INTERSECT, buffer fills in white color(Full alpha color).
+ if (pd->mask.option == EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_SUBSTRACT || pd->mask.option == EFL_CANVAS_VG_NODE_BLEND_TYPE_MASK_INTERSECT)
+ init_buffer = 0xFFFFFFFF;
//2. Reusable ector buffer?
if (!pd->mask.buffer || (pd->mask.bound.w != mbound.w) ||
@@ -76,7 +97,8 @@ _prepare_mask(Evas_Object_Protected_Data *obj, //vector object
{
if (pd->mask.pixels) free(pd->mask.pixels);
if (pd->mask.buffer) efl_unref(pd->mask.buffer);
- pd->mask.pixels = calloc(sizeof(uint32_t), mbound.w * mbound.h);
+ pd->mask.pixels = malloc(sizeof(uint32_t) * (mbound.w * mbound.h));
+ memset(pd->mask.pixels, init_buffer, sizeof(uint32_t) * (mbound.w * mbound.h));
pd->mask.buffer = ENFN->ector_buffer_new(ENC, obj->layer->evas->evas,
mbound.w, mbound.h,
EFL_GFX_COLORSPACE_ARGB8888,
@@ -93,7 +115,7 @@ _prepare_mask(Evas_Object_Protected_Data *obj, //vector object
else
{
if (pd->mask.pixels)
- memset(pd->mask.pixels, 0x0, sizeof(uint32_t) * mbound.w * mbound.h);
+ memset(pd->mask.pixels, init_buffer, sizeof(uint32_t) * mbound.w * mbound.h);
}
pd->mask.bound.x = mbound.x;
@@ -101,6 +123,22 @@ _prepare_mask(Evas_Object_Protected_Data *obj, //vector object
if (!pd->mask.buffer) ERR("Mask Buffer is invalid");
+ //FIXME: This code means that there is another masking container.
+ if (pd->mask.option != EFL_CANVAS_VG_NODE_BLEND_TYPE_NONE)
+ {
+ Efl_Canvas_Vg_Container_Data *src_pd = pd;
+ mask = pd->mask.buffer;
+ for (Efl_VG *mask_src = pd->mask_src; mask_src; mask_src = src_pd->mask_src)
+ {
+ Efl_Canvas_Vg_Container_Data *target_pd = NULL;
+ src_pd = efl_data_scope_get(mask_src, MY_CLASS);
+ target_pd = efl_data_scope_get(eina_list_nth(src_pd->mask.target, 0), MY_CLASS);
+ _evas_vg_render_pre(obj, mask_src,
+ engine, output, context, surface,
+ ctransform, mask, target_pd->mask.option);
+ }
+ }
+
//3. Prepare Drawing shapes.
_evas_vg_render_pre(obj, mask_obj,
engine, output, context,
@@ -140,12 +178,12 @@ _efl_canvas_vg_container_render_pre(Evas_Object_Protected_Data *vg_pd,
EFL_CANVAS_VG_COMPUTE_MATRIX(ctransform, ptransform, nd);
//Container may have mask source.
- if (pd->mask_src)
+ if (pd->mask_src && !pd->mask.target)
{
+ mask_op = pd->mask.option;
mask = _prepare_mask(vg_pd, pd->mask_src,
engine, output, context, surface,
- ptransform, mask, mask_op);
- mask_op = pd->mask.option;
+ ptransform, ctransform, mask, mask_op);
}
EINA_LIST_FOREACH(pd->children, l, child)
diff --git a/src/lib/evas/common/evas_convert_rgb_32.c b/src/lib/evas/common/evas_convert_rgb_32.c
index 11671466b2..68d3a95b22 100644
--- a/src/lib/evas/common/evas_convert_rgb_32.c
+++ b/src/lib/evas/common/evas_convert_rgb_32.c
@@ -56,13 +56,13 @@ evas_common_convert_rgba_to_32bpp_rgb_8888_rot_180 (DATA32 *src, DATA8 *dst, int
for (y = 0; y < h; y++) { \
const pix_type *s = &(src[h - y - 1]); \
pix_type *d = &(dst[dst_stride * y]); \
- pix_type *ptr1 = s; \
- pix_type *ptr2 = ptr1 + src_stride; \
- pix_type *ptr3 = ptr2 + src_stride; \
- pix_type *ptr4 = ptr3 + src_stride; \
+ const pix_type *ptr1 = s; \
+ const pix_type *ptr2 = ptr1 + src_stride; \
+ const pix_type *ptr3 = ptr2 + src_stride; \
+ const pix_type *ptr4 = ptr3 + src_stride; \
for(x = 0; x < w; x += 4) { \
pix_type s_array[4] = { *ptr1, *ptr2, *ptr3, *ptr4 }; \
- vst1q_s32(d, vld1q_s32(s_array)); \
+ vst1q_u32(d, vld1q_u32(s_array)); \
d += 4; \
ptr1 += klght; \
ptr2 += klght; \
@@ -90,18 +90,18 @@ evas_common_convert_rgba_to_32bpp_rgb_8888_rot_180 (DATA32 *src, DATA8 *dst, int
for (y = 0; y < h; y++) { \
const pix_type *s = &(src[(src_stride * (w - 1)) + y]); \
pix_type *d = &(dst[dst_stride * y]); \
- pix_type *ptr1 = s; \
- pix_type *ptr2 = ptr1 + src_stride; \
- pix_type *ptr3 = ptr2 + src_stride; \
- pix_type *ptr4 = ptr3 + src_stride; \
- for(x = 0; x < w; x+=4) { \
+ const pix_type *ptr1 = s; \
+ const pix_type *ptr2 = ptr1 - src_stride; \
+ const pix_type *ptr3 = ptr2 - src_stride; \
+ const pix_type *ptr4 = ptr3 - src_stride; \
+ for(x = 0; x < w; x += 4) { \
pix_type s_array[4] = { *ptr1, *ptr2, *ptr3, *ptr4 }; \
- vst1q_s32(d, vld1q_s32(s_array)); \
+ vst1q_u32(d, vld1q_u32(s_array)); \
d += 4; \
- ptr1 += klght; \
- ptr2 += klght; \
- ptr3 += klght; \
- ptr4 += klght; \
+ ptr1 -= klght; \
+ ptr2 -= klght; \
+ ptr3 -= klght; \
+ ptr4 -= klght; \
} \
} \
} \
@@ -111,7 +111,7 @@ evas_common_convert_rgba_to_32bpp_rgb_8888_rot_180 (DATA32 *src, DATA8 *dst, int
pix_type *d = &(dst[dst_stride * y]); \
for (x = 0; x < w; x++) { \
*d++ = *s; \
- s += src_stride; \
+ s -= src_stride; \
} \
} \
} \
diff --git a/src/lib/evas/common/evas_map_image.c b/src/lib/evas/common/evas_map_image.c
index 5036841a98..115e77cafd 100644
--- a/src/lib/evas/common/evas_map_image.c
+++ b/src/lib/evas/common/evas_map_image.c
@@ -890,7 +890,7 @@ evas_common_map_rgba(RGBA_Image *src, RGBA_Image *dst,
}
EAPI void
-evas_common_map_rgba_draw(RGBA_Image *src, RGBA_Image *dst, int clip_x, int clip_y, int clip_w, int clip_h, DATA32 mul_col, int render_op, int npoints, RGBA_Map_Point *p, int smooth, Eina_Bool anti_alias, int level, RGBA_Image *mask_ie, int mask_x, int mask_y)
+evas_common_map_rgba_draw(RGBA_Image *src, RGBA_Image *dst, int clip_x, int clip_y, int clip_w, int clip_h, DATA32 mul_col, int render_op, int npoints EINA_UNUSED, RGBA_Map_Point *p, int smooth, Eina_Bool anti_alias, int level, RGBA_Image *mask_ie, int mask_x, int mask_y)
{
//The best quaility requsted.
if (anti_alias && smooth)
diff --git a/src/modules/elementary/access_output/mod.c b/src/modules/elementary/access_output/mod.c
index f1c9dafd46..f51b512a47 100644
--- a/src/modules/elementary/access_output/mod.c
+++ b/src/modules/elementary/access_output/mod.c
@@ -4,7 +4,9 @@
#include "Elementary.h"
-#define ELEMENTARY_BUILD
+#ifndef EFL_BUILD
+# define EFL_BUILD
+#endif
#undef ELM_MODULE_HELPER_H
#include "elm_module_helper.h"
diff --git a/src/modules/elementary/clock_input_ctxpopup/clock_input_ctxpopup.c b/src/modules/elementary/clock_input_ctxpopup/clock_input_ctxpopup.c
index 5daabebe0a..077bd7d14e 100644
--- a/src/modules/elementary/clock_input_ctxpopup/clock_input_ctxpopup.c
+++ b/src/modules/elementary/clock_input_ctxpopup/clock_input_ctxpopup.c
@@ -9,7 +9,9 @@
#include "elm_ctxpopup_item_eo.h"
#include "elm_ctxpopup_eo.h"
-#define ELEMENTARY_BUILD
+#ifndef EFL_BUILD
+# define EFL_BUILD
+#endif
#undef ELM_MODULE_HELPER_H
#include "elm_module_helper.h"
diff --git a/src/modules/elementary/prefs/prefs_iface.c b/src/modules/elementary/prefs/prefs_iface.c
index 4943cd4566..d09658a052 100644
--- a/src/modules/elementary/prefs/prefs_iface.c
+++ b/src/modules/elementary/prefs/prefs_iface.c
@@ -4,7 +4,9 @@
#include "Elementary.h"
-#define ELEMENTARY_BUILD
+#ifndef EFL_BUILD
+# define EFL_BUILD
+#endif
#undef ELM_MODULE_HELPER_H
#include "private.h"
diff --git a/src/modules/elementary/test_entry/mod.c b/src/modules/elementary/test_entry/mod.c
index 0d16e22226..b80cb182ce 100644
--- a/src/modules/elementary/test_entry/mod.c
+++ b/src/modules/elementary/test_entry/mod.c
@@ -4,7 +4,9 @@
#include "Elementary.h"
-#define ELEMENTARY_BUILD
+#ifndef EFL_BUILD
+# define EFL_BUILD
+#endif
#undef ELM_MODULE_HELPER_H
#include "elm_module_helper.h"
diff --git a/src/modules/elementary/test_map/mod.c b/src/modules/elementary/test_map/mod.c
index 4d7db03284..15c4ff3344 100644
--- a/src/modules/elementary/test_map/mod.c
+++ b/src/modules/elementary/test_map/mod.c
@@ -6,7 +6,9 @@
#include "elm_module_helper.h"
#include "elm_widget_map.h"
-#define ELEMENTARY_BUILD
+#ifndef EFL_BUILD
+# define EFL_BUILD
+#endif
#undef ELM_MODULE_HELPER_H
#include "elm_module_helper.h"
diff --git a/src/modules/elementary/web/none/elm_web_none.c b/src/modules/elementary/web/none/elm_web_none.c
index 6ac26507ed..d601460bda 100644
--- a/src/modules/elementary/web/none/elm_web_none.c
+++ b/src/modules/elementary/web/none/elm_web_none.c
@@ -9,7 +9,9 @@
#include "elm_priv.h"
#include "elm_widget_web.h"
-#define ELEMENTARY_BUILD
+#ifndef EFL_BUILD
+# define EFL_BUILD
+#endif
#undef ELM_MODULE_HELPER_H
#include "elm_module_helper.h"
#include "elm_web_none_eo.h"
diff --git a/src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c b/src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c
index 4d70b0ee5a..950db2bea1 100644
--- a/src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c
+++ b/src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c
@@ -2297,6 +2297,15 @@ evas_vg_load_file_open_svg(Eina_File *file,
defs = loader.doc->node.doc.defs;
if (defs)
_update_gradient(loader.doc, defs->node.defs.gradients);
+ else
+ {
+ if (loader.gradient)
+ {
+ Eina_List* gradient_list = eina_list_append(NULL, loader.gradient);
+ _update_gradient(loader.doc, gradient_list);
+ eina_list_free(gradient_list);
+ }
+ }
*error = EVAS_LOAD_ERROR_NONE;
}
diff --git a/src/static_libs/vg_common/vg_common_svg.c b/src/static_libs/vg_common/vg_common_svg.c
index d960d9d042..1c33e6454e 100644
--- a/src/static_libs/vg_common/vg_common_svg.c
+++ b/src/static_libs/vg_common/vg_common_svg.c
@@ -158,6 +158,7 @@ _eet_for_style_gradient(void)
EET_DATA_DESCRIPTOR_ADD_BASIC(_eet_style_gradient_node, Svg_Style_Gradient, "type", type, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(_eet_style_gradient_node, Svg_Style_Gradient, "id", id, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(_eet_style_gradient_node, Svg_Style_Gradient, "spread", spread, EET_T_INT);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(_eet_style_gradient_node, Svg_Style_Gradient, "user_space", user_space, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_LIST(_eet_style_gradient_node, Svg_Style_Gradient, "stops", stops, _eet_gradient_stops_node);
EET_DATA_DESCRIPTOR_ADD_SUB(_eet_style_gradient_node, Svg_Style_Gradient, "radial", radial, _eet_radial_gradient_node);
EET_DATA_DESCRIPTOR_ADD_SUB(_eet_style_gradient_node, Svg_Style_Gradient, "linear", linear, _eet_linear_gradient_node);