* Fix shader binary saving to save with dir existing already.
-2012-04-26 Carsten Haitzler (The Rasterman)
+2012-04-26 Carsten Haitzler (The Rasterman)
1.2.0 release
+
+2012-04-26 Cedric Bail
+
+ * Lock less font rendering.
+Evas 1.3.0
+
+Changes since Evas 1.2.0:
+-------------------------
+
+Improvements:
+ * Lock less font rendering.
+
Evas 1.2.0
Changes since Evas 1.1.0:
EAPI RGBA_Font_Glyph *evas_common_font_int_cache_glyph_get (RGBA_Font_Int *fi, FT_UInt index);
EAPI FT_UInt evas_common_get_char_index (RGBA_Font_Int* fi, Eina_Unicode gl);
EAPI void evas_common_font_draw_init (void);
+EAPI void evas_common_font_draw_prepare (const Evas_Text_Props *text_props);
/* load */
EAPI void evas_common_font_dpi_set (int dpi);
* is on the right, and not on the left).
*/
static void
-evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn __UNUSED__, int x, int y,
+evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y,
const Evas_Text_Props *text_props, RGBA_Gfx_Func func, int ext_x, int ext_y, int ext_w,
int ext_h, int im_w, int im_h __UNUSED__)
{
idx = EVAS_FONT_WALK_INDEX;
- LKL(fi->ft_mutex);
fg = evas_common_font_int_cache_glyph_get(fi, idx);
- if (!fg)
- {
- LKU(fi->ft_mutex);
- continue;
- }
-
- LKU(fi->ft_mutex);
+ if (!fg) continue;
if (dc->font_ext.func.gl_new)
{
}
EAPI void
+evas_common_font_draw_prepare(const Evas_Text_Props *text_props)
+{
+ RGBA_Font_Int *fi;
+ EVAS_FONT_WALK_TEXT_INIT();
+
+ fi = text_props->font_instance;
+ if (!fi) return;
+
+ evas_common_font_int_reload(fi);
+
+ if (fi->src->current_size != fi->size)
+ {
+
+ FTLOCK();
+ FT_Activate_Size(fi->ft.size);
+ FTUNLOCK();
+ fi->src->current_size = fi->size;
+ }
+
+ EVAS_FONT_WALK_TEXT_START()
+ {
+ FT_UInt idx;
+ RGBA_Font_Glyph *fg;
+
+ if (!EVAS_FONT_WALK_IS_VISIBLE) continue;
+ idx = EVAS_FONT_WALK_INDEX;
+
+ fg = evas_common_font_int_cache_glyph_get(fi, idx);
+ }
+ EVAS_FONT_WALK_TEXT_END();
+}
+
+EAPI void
evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const Evas_Text_Props *text_props)
{
int ext_x, ext_y, ext_w, ext_h;
if (!dc->cutout.rects)
{
- evas_common_font_draw_internal(dst, dc, fn, x, y, text_props,
+ evas_common_font_draw_internal(dst, dc, x, y, text_props,
func, ext_x, ext_y, ext_w, ext_h,
im_w, im_h);
}
{
r = rects->rects + i;
evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
- evas_common_font_draw_internal(dst, dc, fn, x, y, text_props,
+ evas_common_font_draw_internal(dst, dc, x, y, text_props,
func, r->x, r->y, r->w, r->h,
im_w, im_h);
}
op->op_func = evas_common_pipe_text_draw_do;
op->free_func = evas_common_pipe_op_text_free;
evas_common_pipe_draw_context_copy(dc, op);
+ evas_common_pipe_text_prepare(intl_props);
}
/**************** IMAGE *****************/
}
#ifdef BUILD_PTHREAD
-static Eina_List *task = NULL;
+static Eina_List *im_task = NULL;
+static Eina_List *text_task = NULL;
static Thinfo task_thinfo[TH_MAX];
static pthread_barrier_t task_thbarrier[2];
-static LK(task_mutext);
+static LK(im_task_mutex);
+static LK(text_task_mutex);
#endif
#ifdef BUILD_PTHREAD
/* wait for start signal */
pthread_barrier_wait(&(tinfo->barrier[0]));
- while (task)
+ while (im_task)
{
RGBA_Image *im = NULL;
- LKL(task_mutext);
- im = eina_list_data_get(task);
- task = eina_list_remove_list(task, task);
- LKU(task_mutext);
+ LKL(im_task_mutex);
+ im = eina_list_data_get(im_task);
+ im_task = eina_list_remove_list(im_task, im_task);
+ LKU(im_task_mutex);
if (im)
{
}
}
+ while (text_task)
+ {
+ Evas_Text_Props *text_props;
+ RGBA_Font_Int *fi;
+
+ LKL(text_task_mutex);
+ fi = eina_list_data_get(text_task);
+ text_task = eina_list_remove_list(text_task, text_task);
+ LKU(text_task_mutex);
+
+ if (fi)
+ {
+ LKL(fi->ft_mutex);
+ EINA_LIST_FREE(fi->task, text_props)
+ {
+ evas_common_font_draw_prepare(text_props);
+ text_props->changed = EINA_FALSE;
+ }
+ LKU(fi->ft_mutex);
+ }
+ }
+
/* send finished signal */
pthread_barrier_wait(&(tinfo->barrier[1]));
}
static volatile int bval = 0;
static void
-evas_common_pipe_image_load_do(void)
+evas_common_pipe_load_do(void)
{
#ifdef BUILD_PTHREAD
/* Notify worker thread. */
cpunum = eina_cpu_count();
thread_num = cpunum;
+ fprintf(stderr, "number of cpu: %i\n", cpunum);
// on single cpu we still want this initted.. otherwise we block forever
// waiting onm pthread barriers for async rendering on a single core!
// if (thread_num == 1) return EINA_FALSE;
eina_threads_init();
- LKI(task_mutext);
+ LKI(im_task_mutex);
+ LKI(text_task_mutex);
pthread_barrier_init(&(thbarrier[0]), NULL, thread_num + 1);
pthread_barrier_init(&(thbarrier[1]), NULL, thread_num + 1);
return ;
add_task:
- task = eina_list_append(task, im);
+ LKL(im_task_mutex);
+ im_task = eina_list_append(im_task, im);
+ LKU(im_task_mutex);
im->flags |= RGBA_IMAGE_TODO_LOAD;
}
EAPI void
+evas_common_pipe_text_prepare(const Evas_Text_Props *text_props)
+{
+ RGBA_Font_Int *fi;
+ const Evas_Text_Props *tmp_props;
+ const Eina_List *l;
+
+ if (!text_props->changed) return ;
+
+ fi = text_props->font_instance;
+ if (!fi) return ;
+
+ LKL(fi->ft_mutex);
+
+ if (!fi->task)
+ {
+ LKL(text_task_mutex);
+ text_task = eina_list_append(text_task, fi);
+ LKU(text_task_mutex);
+ }
+
+ EINA_LIST_FOREACH(fi->task, l, tmp_props)
+ if (tmp_props == text_props)
+ goto end;
+
+ fi->task = eina_list_append(fi->task, text_props);
+
+ end:
+ LKU(fi->ft_mutex);
+}
+
+EAPI void
evas_common_pipe_map_begin(RGBA_Image *root)
{
if (!evas_common_pipe_init())
{
RGBA_Image *im;
- EINA_LIST_FREE(task, im)
+ EINA_LIST_FREE(im_task, im)
{
if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
evas_cache_image_load_data(&im->cache_entry);
}
}
- evas_common_pipe_image_load_do();
+ evas_common_pipe_load_do();
evas_common_pipe_map_render(root);
}
EAPI void evas_common_pipe_line_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1);
EAPI void evas_common_pipe_poly_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y);
EAPI void evas_common_pipe_text_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const Evas_Text_Props *intl_props);
+EAPI void evas_common_pipe_text_prepare(const Evas_Text_Props *text_props);
EAPI void evas_common_pipe_image_load(RGBA_Image *im);
EAPI void evas_common_pipe_image_draw(RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int smooth, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h);
EAPI void evas_common_pipe_map_begin(RGBA_Image *root);
#include "language/evas_language_utils.h"
#include "evas_font_ot.h"
+#define PROPS_CHANGE(Props) Props->changed = EINA_TRUE;
+
void
evas_common_text_props_bidi_set(Evas_Text_Props *props,
Evas_BiDi_Paragraph_Props *bidi_par_props, size_t start)
(void) bidi_par_props;
props->bidi.dir = EVAS_BIDI_DIRECTION_LTR;
#endif
+ PROPS_CHANGE(props);
}
void
evas_common_text_props_script_set(Evas_Text_Props *props, Evas_Script_Type scr)
{
props->script = scr;
+ PROPS_CHANGE(props);
}
void
}
ext->text_len = base->text_len - (ext->text_offset - base->text_offset);
base->text_len = (ext->text_offset - base->text_offset);
+ PROPS_CHANGE(base);
+ PROPS_CHANGE(ext);
}
/* Won't work in the middle of ligatures */
item1->len += item2->len;
item1->text_len += item2->text_len;
+ PROPS_CHANGE(item1);
}
EAPI Eina_Bool
fi->src->current_size = fi->size;
}
+ text_props->changed = EINA_TRUE;
+
#ifdef OT_SUPPORT
size_t char_index;
Evas_Font_Glyph_Info *gl_itr;
idx = evas_common_get_char_index(fi, REPLACEMENT_CHAR);
}
- LKL(fi->ft_mutex);
fg = evas_common_font_int_cache_glyph_get(fi, idx);
- if (!fg)
- {
- LKU(fi->ft_mutex);
- continue;
- }
+ if (!fg) continue;
kern = 0;
if ((use_kerning) && (prev_index) && (idx) &&
}
pface = fi->src->ft.face;
- LKU(fi->ft_mutex);
gl_itr->index = idx;
gl_itr->x_bear = fg->glyph_out->left;
Evas_Script_Type script;
Evas_Text_Props_Info *info;
void *font_instance;
+
+ Eina_Bool changed : 1;
};
struct _Evas_Text_Props_Info
Font_Rend_Flags wanted_rend; /* The wanted rendering style */
Font_Rend_Flags runtime_rend; /* The rendering we need to do on runtime
in order to comply with the wanted_rend. */
+
+ Eina_List *task;
unsigned char sizeok : 1;
unsigned char inuse : 1;
};