summaryrefslogtreecommitdiff
path: root/src/lib/evas/canvas
diff options
context:
space:
mode:
authorHermet Park <chuneon.park@samsung.com>2020-08-24 13:04:43 +0900
committerHermet Park <chuneon.park@samsung.com>2020-08-24 13:04:43 +0900
commit382246544c3fe2951f27ec35dc87aae8136ada16 (patch)
treebf89eb8952a8bcad4b759dd95ba6c61de8682966 /src/lib/evas/canvas
parent41b2ca8f22654d532e142f48703731e535d8da32 (diff)
parente2944780fad775de31f99fc8dd6d93528bbdc7ae (diff)
downloadefl-382246544c3fe2951f27ec35dc87aae8136ada16.tar.gz
Merge branch 'master' into devs/hermet/lottie
Diffstat (limited to 'src/lib/evas/canvas')
-rw-r--r--src/lib/evas/canvas/evas_object_textblock.c81
-rw-r--r--src/lib/evas/canvas/evas_render.c20
2 files changed, 74 insertions, 27 deletions
diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c
index e9b89dec98..d50592cc5d 100644
--- a/src/lib/evas/canvas/evas_object_textblock.c
+++ b/src/lib/evas/canvas/evas_object_textblock.c
@@ -1489,11 +1489,15 @@ _style_string_split(const char *str, char* part1, char* part2)
*temp = 0;
}
-#define FORMAT_SHADOW_SET(evas, efl) {fmt->style = evas; if (set_default) _FMT_INFO(effect) = efl;}
+#define FORMAT_SHADOW_SET(evas, efl) { \
+ if (fmt->style != evas) { fmt->style = evas; changed = EINA_TRUE; } \
+ if (set_default && (_FMT_INFO(effect) != efl)) {_FMT_INFO(effect) = efl; changed = EINA_TRUE;}}
-void
+Eina_Bool
_format_shadow_set(Evas_Object_Textblock_Format *fmt, char *str, Eina_Bool set_default, Efl_Canvas_Textblock_Data *o)
{
+ Eina_Bool changed = EINA_FALSE;
+
if (!strcmp(str, "shadow"))
FORMAT_SHADOW_SET(EVAS_TEXT_STYLE_SHADOW, EFL_TEXT_STYLE_EFFECT_TYPE_SHADOW)
else if (!strcmp(str, "outline"))
@@ -1514,13 +1518,22 @@ _format_shadow_set(Evas_Object_Textblock_Format *fmt, char *str, Eina_Bool set_d
FORMAT_SHADOW_SET(EVAS_TEXT_STYLE_FAR_SOFT_SHADOW, EFL_TEXT_STYLE_EFFECT_TYPE_FAR_SOFT_SHADOW)
else /*off none plain */
FORMAT_SHADOW_SET(EVAS_TEXT_STYLE_PLAIN, EFL_TEXT_STYLE_EFFECT_TYPE_NONE)
+
+ return changed;
}
-#define FORMAT_SHADOW_DIRECTION_SET(direction) {EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_##direction); if (set_default) _FMT_INFO(shadow_direction) = EFL_TEXT_STYLE_SHADOW_DIRECTION_##direction;}
+#define FORMAT_SHADOW_DIRECTION_SET(direction) { \
+ unsigned char temp = fmt->style; \
+ EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_##direction); \
+ changed = (fmt->style != temp); \
+ if (set_default && (_FMT_INFO(shadow_direction) != EFL_TEXT_STYLE_SHADOW_DIRECTION_##direction)) \
+ {_FMT_INFO(shadow_direction) = EFL_TEXT_STYLE_SHADOW_DIRECTION_##direction; changed = EINA_TRUE;}}
-void
+Eina_Bool
_format_shadow_direction_set(Evas_Object_Textblock_Format *fmt, char *str, Eina_Bool set_default, Efl_Canvas_Textblock_Data *o)
{
+ Eina_Bool changed = EINA_FALSE;
+
if (!strcmp(str, "bottom_right"))
FORMAT_SHADOW_DIRECTION_SET(BOTTOM_RIGHT)
else if (!strcmp(str, "bottom"))
@@ -1539,6 +1552,8 @@ _format_shadow_direction_set(Evas_Object_Textblock_Format *fmt, char *str, Eina_
FORMAT_SHADOW_DIRECTION_SET(RIGHT)
else
FORMAT_SHADOW_DIRECTION_SET(BOTTOM_RIGHT)
+
+ return changed;
}
/**
@@ -3169,10 +3184,10 @@ _default_format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt,
*part2 = 0;
_style_string_split(param, part1, part2);
- _format_shadow_set(fmt, part1, EINA_TRUE, o);
+ changed = _format_shadow_set(fmt, part1, EINA_TRUE, o);
if (*part2)
- _format_shadow_direction_set(fmt, part2, EINA_TRUE, o);
+ changed = _format_shadow_direction_set(fmt, part2, EINA_TRUE, o) || changed;
}
else
{
@@ -5421,6 +5436,27 @@ skip:
script = evas_common_language_script_type_get(str, script_len);
+ /* FIXME Workaround for Burmese Vowel E Rendering, caused by bug in Harfbuzz
+ breaking text run will fix the visual issue.
+ */
+ if (script == EVAS_SCRIPT_MYANMAR && script_len > 1)
+ {
+ int i;
+ for (i = 0 ; i < script_len - 1; i++)
+ {
+ if (str[i] == 0x200C)
+ {
+ if (str[i+1] == 0x1031)
+ {
+ cur_len += script_len;
+ script_len = i + 1;
+ cur_len -= script_len;
+ break;
+ }
+ }
+ }
+ }
+
Evas_Object_Protected_Data *obj = efl_data_scope_get(c->obj, EFL_CANVAS_OBJECT_CLASS);
while (script_len > 0)
{
@@ -8570,7 +8606,8 @@ _escaped_char_match(const char *s, int *adv)
int n_ret = _escaped_value_search(s, list, len);
if (n_ret != -1)
{
- *adv = (int) list[n_ret]->value_len;
+ if (adv)
+ *adv = (int) list[n_ret]->value_len;
return list[n_ret]->escape;
}
else
@@ -8579,7 +8616,8 @@ _escaped_char_match(const char *s, int *adv)
n_ret = _escaped_value_search(s, list, len);
if (n_ret != -1)
{
- *adv = (int)list[n_ret]->value_len;
+ if (adv)
+ *adv = (int)list[n_ret]->value_len;
return list[n_ret]->escape;
}
}
@@ -8996,6 +9034,7 @@ static void
_markup_get_text_utf8_append(Eina_Strbuf *sbuf, const char *text)
{
int ch, pos = 0, pos2 = 0;
+ const char * replacement;
for (;;)
{
@@ -9007,23 +9046,21 @@ _markup_get_text_utf8_append(Eina_Strbuf *sbuf, const char *text)
eina_strbuf_append(sbuf, "<br/>");
else if (ch == _TAB)
eina_strbuf_append(sbuf, "<tab/>");
- else if (ch == '<')
- eina_strbuf_append(sbuf, "&lt;");
- else if (ch == '>')
- eina_strbuf_append(sbuf, "&gt;");
- else if (ch == '&')
- eina_strbuf_append(sbuf, "&amp;");
- else if (ch == '"')
- eina_strbuf_append(sbuf, "&quot;");
- else if (ch == '\'')
- eina_strbuf_append(sbuf, "&apos;");
- else if (ch == _PARAGRAPH_SEPARATOR)
- eina_strbuf_append(sbuf, "<ps/>");
else if (ch == _REPLACEMENT_CHAR)
eina_strbuf_append(sbuf, "&#xfffc;");
- else if (ch != '\r')
+ else if (ch == _PARAGRAPH_SEPARATOR)
+ eina_strbuf_append(sbuf, "<ps/>");
+ else
{
- eina_strbuf_append_length(sbuf, text + pos, pos2 - pos);
+ replacement = _escaped_char_match(text + pos, NULL);
+ if (replacement)
+ {
+ eina_strbuf_append(sbuf, replacement);
+ }
+ else if (ch != '\r')
+ {
+ eina_strbuf_append_length(sbuf, text + pos, pos2 - pos);
+ }
}
}
}
diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c
index 18c872bd39..c356995b55 100644
--- a/src/lib/evas/canvas/evas_render.c
+++ b/src/lib/evas/canvas/evas_render.c
@@ -1,5 +1,6 @@
#include "evas_common_private.h"
#include "evas_private.h"
+#include <Ecore.h>
#include <math.h>
#include <assert.h>
@@ -2748,7 +2749,16 @@ _evas_render_cutout_add(Evas_Public_Data *evas, void *context,
void
evas_render_rendering_wait(Evas_Public_Data *evas)
{
- while (evas->rendering) evas_async_events_process_blocking();
+ double t0 = ecore_time_get();
+ while (evas->rendering)
+ {
+ evas_async_events_process_blocking();
+ if ((ecore_time_get() - t0) > 0.2)
+ {
+ ERR("timeout waiting for async rendering");
+ break;
+ }
+ }
}
/*
@@ -3939,6 +3949,10 @@ evas_render_wakeup(Evas *eo_e)
}
eina_spinlock_release(&(evas->render.lock));
+ /* post rendering */
+ _rendering_evases = eina_list_remove_list(_rendering_evases, evas->rendering);
+ evas->rendering = NULL;
+
/* flush redraws */
if (haveup)
{
@@ -3986,10 +4000,6 @@ evas_render_wakeup(Evas *eo_e)
free(job);
}
- /* post rendering */
- _rendering_evases = eina_list_remove_list(_rendering_evases, evas->rendering);
- evas->rendering = NULL;
-
post.updated_area = ret_updates;
_cb_always_call(eo_e, evas, EVAS_CALLBACK_RENDER_POST, &post);
evas->inside_post_render = EINA_FALSE;