Mercurial > MadButterfly
changeset 278:a90fd749af82 mbtext
Implement the whole tspan attribute. Currently, we can accept font family/font style/font weight and font size.
author | wycc |
---|---|
date | Sat, 31 Jan 2009 09:41:04 +0800 |
parents | 5006e4abdda5 |
children | 86a5ae82ccf2 |
files | configure.ac examples/calculator/Makefile.am examples/calculator/calculator_scr.svg examples/calculator/main.c examples/drag/Makefile.am examples/dynamic/Makefile.am examples/dynamic/button.svg examples/dynamic/main.c examples/svg2code_ex/Makefile.am examples/tank/Makefile.am include/mb_shapes.h inkscape/MB_Frame.py src/Makefile.am src/X_main.c src/shape_text.c tools/mb_c_header.m4 tools/mb_c_source.m4 tools/svg2code.py |
diffstat | 18 files changed, 347 insertions(+), 51 deletions(-) [+] |
line wrap: on
line diff
--- a/configure.ac Sun Jan 04 12:01:41 2009 +0800 +++ b/configure.ac Sat Jan 31 09:41:04 2009 +0800 @@ -13,7 +13,8 @@ AC_PROG_LIBTOOL # Checks for libraries. -PKG_CHECK_MODULES([cairo], [cairo >= 1.6], , AC_MSG_ERROR([cairo >= 1.6 not found])) +PKG_CHECK_MODULES([cairo], [cairo >= 0.22], , AC_MSG_ERROR([cairo >= 0.22 not found])) +PKG_CHECK_MODULES([pangocairo], [pangocairo >= 0.22], , AC_MSG_ERROR([pangocairo >= 0.22 not found])) # Checks for header files. AC_PATH_X
--- a/examples/calculator/Makefile.am Sun Jan 04 12:01:41 2009 +0800 +++ b/examples/calculator/Makefile.am Sat Jan 31 09:41:04 2009 +0800 @@ -5,8 +5,8 @@ calc_SOURCES = main.c nodist_calc_SOURCES = calculator_scr.c calculator_scr.h -calc_CPPFLAGS = @cairo_CFLAGS@ $(INCLUDES) -calc_LDFLAGS = @cairo_LIBS@ +calc_CPPFLAGS = @pangocairo_CFLAGS@ $(INCLUDES) +calc_LDFLAGS = @pangocairo_LIBS@ calc_LDADD = $(top_builddir)/src/libmbfly.la BUILT_SOURCES = calculator_scr.c calculator_scr.h calculator_scr.mb CLEANFILES = calculator_scr.c calculator_scr.h calculator_scr.mb
--- a/examples/calculator/calculator_scr.svg Sun Jan 04 12:01:41 2009 +0800 +++ b/examples/calculator/calculator_scr.svg Sat Jan 31 09:41:04 2009 +0800 @@ -519,9 +519,9 @@ style="font-size:14px;font-style:normal;font-weight:normal;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans Mono" x="71.767807" y="78.100266" - id="text2238"><tspan + id="saved_text"><tspan sodipodi:role="line" - id="saved_text" + id="t2222" x="71.767807" y="78.100266">None</tspan></text> </g>
--- a/examples/calculator/main.c Sun Jan 04 12:01:41 2009 +0800 +++ b/examples/calculator/main.c Sat Jan 31 09:41:04 2009 +0800 @@ -66,8 +66,8 @@ rdman = X_MB_rdman(calc_data->rt); sprintf(buf, "%d%s", num, suffix); - sh_text_set_text(calc_data->code->screen_text, buf); - rdman_shape_changed(rdman, calc_data->code->screen_text); + sh_text_set_text(calc_data->code->screen_text_u, buf); + rdman_shape_changed(rdman, calc_data->code->screen_text_u); if(op == 'n') sprintf(buf, "None");
--- a/examples/drag/Makefile.am Sun Jan 04 12:01:41 2009 +0800 +++ b/examples/drag/Makefile.am Sat Jan 31 09:41:04 2009 +0800 @@ -5,8 +5,8 @@ ex1_SOURCES = main.c nodist_ex1_SOURCES = menu.c menu.h -ex1_CPPFLAGS = @cairo_CFLAGS@ -I$(top_srcdir) -ex1_LDFLAGS = @cairo_LIBS@ +ex1_CPPFLAGS = @pangocairo_CFLAGS@ -I$(top_srcdir) +ex1_LDFLAGS = @pangocairo_LIBS@ ex1_LDADD = $(top_builddir)/src/libmbfly.la BUILT_SOURCES = menu.c menu.h menu.mb CLEANFILES = menu.c menu.h menu.mb
--- a/examples/dynamic/Makefile.am Sun Jan 04 12:01:41 2009 +0800 +++ b/examples/dynamic/Makefile.am Sat Jan 31 09:41:04 2009 +0800 @@ -1,6 +1,6 @@ include $(top_srcdir)/config.mk -SUFFIXES=.svg .mbso +SUFFIXES=.svg .so %.so:%.svg $(top_srcdir)/tools/svg2code.py $< $<.mb @@ -9,24 +9,23 @@ make $(<:.svg=.o) gcc -shared -o $@ $(<:.svg=.o) -noinst_PROGRAMS = dynamic hello list button.so scene.so +noinst_PROGRAMS = dynamic hello list EXTRA_DIST = menu.svg button.svg dynamic_SOURCES = main.c mbapp.c mbapp.h mbbutton.c mbbutton.h nodist_dynamic_SOURCES = -CPPFLAGS = @cairo_CFLAGS@ $(INCLUDES) -dynamic_LDFLAGS = @cairo_LIBS@ +CPPFLAGS = @pangocairo_CFLAGS@ $(INCLUDES) +dynamic_LDFLAGS = @pangocairo_LIBS@ dynamic_LDADD = $(top_builddir)/src/libmbfly.la -BUILT_SOURCES = menu.c menu.h menu.mb button.c button.h button.mb -CLEANFILES = menu.c menu.h menu.mb button.c button.h button.mb +CLEANFILES = menu.c menu.h menu.mb button.c button.o button.mb button.so hello_SOURCES = hello.c mbapp.c mbapp.h -hello_LDFLAGS = @cairo_LIBS@ +hello_LDFLAGS = @pangocairo_LIBS@ hello_LDADD = $(top_builddir)/src/libmbfly.la list_SOURCES = list.c mbapp.c mbapp.h -list_LDFLAGS = @cairo_LIBS@ +list_LDFLAGS = @pangocairo_LIBS@ list_LDADD = $(top_builddir)/src/libmbfly.la
--- a/examples/dynamic/button.svg Sun Jan 04 12:01:41 2009 +0800 +++ b/examples/dynamic/button.svg Sat Jan 31 09:41:04 2009 +0800 @@ -198,6 +198,20 @@ sodipodi:role="line">Click Me</tspan></text> </g> </g> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="160" + y="77.14286" + id="text2405"><tspan + sodipodi:role="line" + id="tspan2407" + x="160" + y="77.14286">s<tspan + style="font-size:32" + id="tspan2409">ssss<tspan + style="font-size:40" + id="tspan2411">sssss</tspan></tspan></tspan></text> </g> <g inkscape:groupmode="layer"
--- a/examples/dynamic/main.c Sun Jan 04 12:01:41 2009 +0800 +++ b/examples/dynamic/main.c Sat Jan 31 09:41:04 2009 +0800 @@ -126,6 +126,11 @@ mb_button_add_onClick(b, test,NULL); } +void draw_text() +{ + +} + int main(int argc, char * const argv[]) { subject_t *subject; mb_obj_t *button; @@ -137,6 +142,7 @@ else myApp = MBApp_Init("scene"); data.currentscene=0; + draw_text(); MBApp_setData(myApp,&data); MyApp_InitContent(); get_now(&tmo);
--- a/examples/svg2code_ex/Makefile.am Sun Jan 04 12:01:41 2009 +0800 +++ b/examples/svg2code_ex/Makefile.am Sat Jan 31 09:41:04 2009 +0800 @@ -5,8 +5,8 @@ ex1_SOURCES = main.c nodist_ex1_SOURCES = svg2code_ex.c svg2code_ex.h -ex1_CPPFLAGS = @cairo_CFLAGS@ -I$(top_srcdir) -ex1_LDFLAGS = @cairo_LIBS@ +ex1_CPPFLAGS = @pangocairo_CFLAGS@ -I$(top_srcdir) +ex1_LDFLAGS = @pangocairo_LIBS@ ex1_LDADD = $(top_builddir)/src/libmbfly.la BUILT_SOURCES = svg2code_ex.c svg2code_ex.h svg2code_ex.mb CLEANFILES = svg2code_ex.c svg2code_ex.h svg2code_ex.mb
--- a/examples/tank/Makefile.am Sun Jan 04 12:01:41 2009 +0800 +++ b/examples/tank/Makefile.am Sat Jan 31 09:41:04 2009 +0800 @@ -7,8 +7,8 @@ tank_SOURCES = tank_main.c nodist_tank_SOURCES = svgs.h \ $(svg_sources) $(svg_sources:.c=.h) $(svg_sources:.c=.mb) -tank_CPPFLAGS = @cairo_CFLAGS@ -tank_LDFLAGS = @cairo_LIBS@ +tank_CPPFLAGS = @pangocairo_CFLAGS@ +tank_LDFLAGS = @pangocairo_LIBS@ tank_LDADD = $(top_builddir)/src/libmbfly.la BUILT_SOURCES = svgs.h \ $(svg_sources) $(svg_sources:.c=.h) $(svg_sources:.c=.mb)
--- a/include/mb_shapes.h Sun Jan 04 12:01:41 2009 +0800 +++ b/include/mb_shapes.h Sat Jan 31 09:41:04 2009 +0800 @@ -10,6 +10,7 @@ #include <cairo.h> #include "mb_types.h" #include "mb_redraw_man.h" +#include <pango/pangocairo.h> /*! \page define_shape How to Define Shapes * @@ -50,12 +51,97 @@ extern shape_t *rdman_shape_text_new(redraw_man_t *rdman, const char *txt, co_aix x, co_aix y, co_aix font_size, - cairo_font_face_t *face); + cairo_font_face_t *face,PangoAttrList *attrs); extern void sh_text_set_text(shape_t *shape, const char *txt); extern void sh_text_transform(shape_t *shape); extern void sh_text_draw(shape_t *shape, cairo_t *cr); /* @} */ +/*! \defgroup mb_text_t Shape of Text + * @{ + */ +#define TEXTSTYLE_BOLD 1 +#define TEXTSTYLE_ITALIC 2 +#define TEXTSTYLE_UNDERLINE 4 +#define TEXTSTYLE_COLOR 8 +#define TEXTSTYLE_FONT 0x10 +#define TEXTSTYLE_ALIGN 0x20 + +typedef struct { + int property; + unsigned int color; + unsigned int align; + char *font; +} mb_textstyle_t; + +typedef struct _textsegment { + int x; + int y; + mb_textstyle_t style; + int size; + char *buf; + struct _textsegment *next; +} mb_text_segment_t; + +#define MBTEXT_DIRTY 1 + +typedef struct { + int nseg; + mb_text_segment_t *segs; + int flag; + cairo_surface_t *surface; +} mb_text_t; + +extern void mb_textstyle_init(mb_textstyle_t *style); +extern void mb_textstyle_set_font(mb_textstyle_t *style, char *font); +static inline char *mb_textstyle_get_font(mb_textstyle_t *style) +{ + if (style->property & TEXTSTYLE_FONT) + return style->font; + else + return NULL; +} +extern void mb_textstyle_set_bold(mb_textstyle_t *style, int bold); +static inline int mb_textstyle_get_bold(mb_textstyle_t *style) +{ + return style->property & TEXTSTYLE_BOLD; +} +extern void mb_textstyle_set_italic(mb_textstyle_t *style, int italic); +static inline int mb_textstyle_get_italic(mb_textstyle_t *style) +{ + return style->property & TEXTSTYLE_ITALIC; +} +extern void mb_textstyle_set_underline(mb_textstyle_t *style, int underline); +static inline int mb_textstyle_get_undeline(mb_textstyle_t *style) +{ + return style->property & TEXTSTYLE_UNDERLINE; +} +extern void mb_textstyle_set_color(mb_textstyle_t *style, unsigned int color); +static inline unsigned int mb_textstyle_get_color(mb_textstyle_t *style) +{ + if (style->property & TEXTSTYLE_COLOR) + return style->color; + else + return 0; +} + +static inline int mb_textstyle_has_color(mb_textstyle_t *style) +{ + return style->property & TEXTSTYLE_COLOR; +} +extern void mb_textstyle_set_alignment(mb_textstyle_t *style, int alignment); +extern int mb_textstyle_get_alignment(mb_textstyle_t *style); + + + +extern void mb_text_set_style(mb_text_t *text, int begin,int end,mb_textstyle_t *style); +extern void mb_text_get_style(mb_text_t *text, int n,mb_textstyle_t *style); +extern void mb_text_set_text(mb_text_t *text, char *string,int begin,int end); +extern void mb_text_get_text(mb_text_t *text, int begin,int end, char *string); + + +/* @} */ + /*! \defgroup shape_rect Shape of Rectangle * @{ */
--- a/inkscape/MB_Frame.py Sun Jan 04 12:01:41 2009 +0800 +++ b/inkscape/MB_Frame.py Sat Jan 31 09:41:04 2009 +0800 @@ -494,7 +494,7 @@ def effect(self): - self.OK = False + self.OK = True self.parseScene() self.showGrid() self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
--- a/src/Makefile.am Sun Jan 04 12:01:41 2009 +0800 +++ b/src/Makefile.am Sat Jan 31 09:41:04 2009 +0800 @@ -9,10 +9,10 @@ shape_rect.c shape_text.c shift.c subtree_free.c timer.c \ timertool.c tools.c visibility.c X_supp.c prop.c sprite.c \ mouse.c -libmbfly_la_CPPFLAGS = @cairo_CFLAGS@ -libmbfly_la_LDFLAGS = @cairo_LIBS@ +libmbfly_la_CPPFLAGS = @cairo_CFLAGS@ `pkg-config --cflags pangocairo` +libmbfly_la_LDFLAGS = @cairo_LIBS@ `pkg-config --libs pangocairo` X_main_SOURCES = X_main.c X_main_LDADD = $(top_builddir)/src/libmbfly.la -X_main_CPPFLAGS = @cairo_CFLAGS@ -I$(top_builddir)/src -X_main_LDFLAGS = @cairo_LIBS@ +X_main_CPPFLAGS = @pangocairo_CFLAGS@ -I$(top_builddir)/src +X_main_LDFLAGS = @pangocairo_LIBS@
--- a/src/X_main.c Sun Jan 04 12:01:41 2009 +0800 +++ b/src/X_main.c Sat Jan 31 09:41:04 2009 +0800 @@ -6,6 +6,7 @@ #include <X11/Xutil.h> #include <cairo.h> #include <cairo-xlib.h> +#include <pango/pangocairo.h> #include <string.h> #include "mb_shapes.h" @@ -138,6 +139,7 @@ mb_progm_t *progm; mb_word_t *word; mb_action_t *act; + PangoAttrList *attrs = pango_attr_list_new(); tmpsuf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h); tmpcr = cairo_create(tmpsuf); @@ -155,7 +157,7 @@ face = cairo_get_font_face(tmpcr); text = rdman_shape_text_new(&rdman, "hello \xe6\xbc\xa2\xe5\xad\x97", - 10, h / 4, 36.0, face); + 10, h / 4, 36.0, face, attrs); text_fill = rdman_paint_radial_new(&rdman, 100, h / 4, 70); grad_stop_init(text_stops, 0, 0.2, 0.9, 0.2, 1); grad_stop_init(text_stops + 1, 1, 0.9, 0.2, 0.2, 0.1);
--- a/src/shape_text.c Sun Jan 04 12:01:41 2009 +0800 +++ b/src/shape_text.c Sat Jan 31 09:41:04 2009 +0800 @@ -3,6 +3,7 @@ #include <string.h> #include <math.h> #include <cairo.h> +#include <pango/pangocairo.h> #include "mb_types.h" #include "mb_shapes.h" @@ -20,6 +21,8 @@ cairo_font_face_t *face; cairo_scaled_font_t *scaled_font; int flags; + PangoLayout *layout; + PangoAttrList *attrs; } sh_text_t; #define TXF_SCALE_DIRTY 0x1 @@ -34,13 +37,14 @@ shape_t *rdman_shape_text_new(redraw_man_t *rdman, const char *txt, co_aix x, co_aix y, - co_aix font_size, cairo_font_face_t *face) { + co_aix font_size, cairo_font_face_t *face,PangoAttrList *attrs) { sh_text_t *text; text = (sh_text_t *)malloc(sizeof(sh_text_t)); if(text == NULL) return NULL; + memset(text, 0, sizeof(sh_text_t)); mb_obj_init(text, MBO_TEXT); text->data = strdup(txt); @@ -56,6 +60,8 @@ text->flags |= TXF_SCALE_DIRTY; text->shape.free = sh_text_free; + text->layout = NULL; + text->attrs = attrs; rdman_shape_man(rdman, (shape_t *)text); @@ -126,7 +132,7 @@ ASSERT(r == OK); text->d_x = x; - text->d_y = y; + text->d_y = y-text->font_size; shw = shape->stroke_width / 2; /* FIXME: It is unreasonable that a font exceed it's bbox. * We add 5 pixels in get right bbox. But, it is unreasonable. @@ -139,11 +145,29 @@ /*! \todo Support ratation for shape_text. */ } +static void sh_text_P_generate_layout(sh_text_t *text,cairo_t *cr) +{ + PangoAttribute *attr; + PangoAttrList *attrlist; + PangoFontDescription *desc; + if (text->layout) { + g_object_unref(text->layout); + } + text->layout = pango_cairo_create_layout(cr); + desc = pango_font_description_from_string("Sans Bold"); + pango_layout_set_font_description (text->layout, desc); + pango_cairo_update_layout(cr,text->layout); + pango_layout_set_text(text->layout,text->data,-1); + pango_layout_set_attributes(text->layout, text->attrs); + +} static void draw_text(sh_text_t *text, cairo_t *cr) { - cairo_set_scaled_font(cr, text->scaled_font); + if (text->layout==NULL) { + sh_text_P_generate_layout(text,cr); + } cairo_move_to(cr, text->d_x, text->d_y); - cairo_text_path(cr, text->data); + pango_cairo_show_layout(cr,text->layout); }
--- a/tools/mb_c_header.m4 Sun Jan 04 12:01:41 2009 +0800 +++ b/tools/mb_c_header.m4 Sat Jan 31 09:41:04 2009 +0800 @@ -20,6 +20,15 @@ define([ADD_TEXT],[ [ shape_t *$1; ]]) +define([PANGO_BEGIN_TEXT],[ +[ shape_t *$1; +]]) +define([PANGO_END_TEXT],[ +]) +define([PANGO_SIZE],[]) +define([PANGO_STYLE],[]) +define([PANGO_WEIGHT],[]) +define([PANGO_FAMILY],[]) define([COLOR_STOP],[ ]) define([REF_STOPS_RADIAL],)
--- a/tools/mb_c_source.m4 Sun Jan 04 12:01:41 2009 +0800 +++ b/tools/mb_c_source.m4 Sat Jan 31 09:41:04 2009 +0800 @@ -20,6 +20,12 @@ define([ADD_RECT]) define([ADD_COORD]) define([ADD_TEXT],) +define([PANGO_BEGIN_TEXT],) +define([PANGO_END_TEXT],) +define([PANGO_SIZE],) +define([PANGO_STYLE],) +define([PANGO_WEIGHT],) +define([PANGO_FAMILY],) define([FILL_SHAPE]) define([STROKE_SHAPE]) define([FILL_SHAPE_WITH_PAINT]) @@ -118,6 +124,42 @@ cairo_get_font_face(rdman->cr)); rdman_add_shape(rdman, obj->$1, obj->$6); ]]) +define([S_PANGO_BEGIN_TEXT],[[ + { + PangoAttribute *attr; + PangoAttrList *attrs = pango_attr_list_new(); + +]]) +define([S_PANGO_END_TEXT],[[ + obj->$1 = rdman_shape_text_new(rdman, "$2", $3, $4, $5, + cairo_get_font_face(rdman->cr),attrs); + rdman_add_shape(rdman, obj->$1, obj->$6); + } +]]) +define([S_PANGO_SIZE],[[ + attr = pango_attr_size_new($1); + attr->start_index = $2; + attr->end_index = $3; + pango_attr_list_insert(attrs,attr); +]]) +define([S_PANGO_WEIGHT],[[ + attr = pango_attr_weight_new($1); + attr->start_index = $2; + attr->end_index = $3; + pango_attr_list_insert(attrs,attr); +]]) +define([S_PANGO_FAMILY],[[ + attr = pango_attr_family_new("$1"); + attr->start_index = $2; + attr->end_index = $3; + pango_attr_list_insert(attrs,attr); +]]) +define([S_PANGO_STYLE],[[ + attr = pango_attr_style_new($1); + attr->start_index = $2; + attr->end_index = $3; + pango_attr_list_insert(attrs,attr); +]]) define([S_FILL_SHAPE_WITH_PAINT],[dnl [ rdman_paint_fill(rdman, obj->$2, obj->$1); @@ -203,6 +245,12 @@ SIMPORT([ADD_RECT]) SIMPORT([ADD_COORD]) SIMPORT([ADD_TEXT]) +SIMPORT([PANGO_BEGIN_TEXT]) +SIMPORT([PANGO_END_TEXT]) +SIMPORT([PANGO_SIZE]) +SIMPORT([PANGO_WEIGHT]) +SIMPORT([PANGO_FAMILY]) +SIMPORT([PANGO_STYLE]) SIMPORT([FILL_SHAPE]) SIMPORT([STROKE_SHAPE]) SIMPORT([FILL_SHAPE_WITH_PAINT]) @@ -240,6 +288,15 @@ define([F_ADD_TEXT],[[ rdman_shape_free(rdman, obj->$1); ]]) +define([F_PANGO_BEGIN_TEXT],[[ + rdman_shape_free(rdman, obj->$1); +]]) +define([F_PANGO_SIZE],[[ +]]) +define([F_PANGO_STYLE],[[ +]]) +define([F_PANGO_WEIGHT],[[ +]]) define([F_FILL_SHAPE],[[ rdman_paint_free(rdman, obj->$1_fill); @@ -257,6 +314,7 @@ FIMPORT([ADD_PATH],) FIMPORT([ADD_RECT]) FIMPORT([ADD_TEXT]) +FIMPORT([PANGO_BEGIN_TEXT]) FIMPORT([FILL_SHAPE]) FIMPORT([STROKE_SHAPE]) divert[]]) @@ -283,6 +341,7 @@ RIMPORT([ADD_RECT]) RIMPORT([ADD_COORD]) RIMPORT([ADD_TEXT]) +RIMPORT([PANGO_BEGIN_TEXT]) RIMPORT([FILL_SHAPE]) RIMPORT([STROKE_SHAPE]) RIMPORT([FILL_SHAPE_WITH_PAINT])
--- a/tools/svg2code.py Sun Jan 04 12:01:41 2009 +0800 +++ b/tools/svg2code.py Sat Jan 31 09:41:04 2009 +0800 @@ -128,6 +128,7 @@ style_str = node.getAttribute('style') prop_map = get_style_map(style_str) + print node_id,style_str try: opacity = float(node.getAttribute('opacity')) except: @@ -350,47 +351,139 @@ style_str = text.getAttribute('style') style_map = get_style_map(style_str) - font_sz = 10.0 - if style_map.has_key('font-size'): - if style_map['font-size'].endswith('px'): - font_sz = float(style_map['font-size'][:-2]) - print >> codefo, 'define([MB_FONT_SZ], %f)dnl' % (font_sz) + return style_map + + +def translate_tspan(tspan, coord_id, codefo, doc,txt_strs,attrs): + map = translate_font_style(tspan, codefo) + tspan.style_map = map + attr = [len(txt_strs),0, tspan] + attrs.append(attr) + for node in tspan.childNodes: + if node.localName == None: + txt_strs = txt_strs + node.data + elif node.localName == 'tspan': + txt_strs = translate_tspan(node,coord_id, codefo, doc,txt_strs,attrs) pass pass + attr[1] = len(txt_strs)-1 + return txt_strs - font_style = 'normal' - if style_map.has_key('font-style'): - font_style = style_map['font-style'].lower() + + +def generate_font_attributes(attrs,coord_id, codefo,doc): + for a in attrs: + start = a[0] + end = a[1] + node = a[2] + #print "generate attributes from %d to %d" %(start,end) + style_map = node.style_map + #print [style_map] + if style_map.has_key('font-size'): + # FIXME: Implement all units here + if style_map['font-size'].endswith('px'): + font_sz = float(style_map['font-size'][:-2]) + print >> codefo, 'PANGO_SIZE(%d,%d,%d)' % (font_sz,start,end) + else: + font_sz = float(style_map['font-size']) + print >> codefo, 'PANGO_SIZE(%d,%d,%d)' % (font_sz,start,end) + pass + + if style_map.has_key('font-style'): + font_style = style_map['font-style'].lower() + if font_style == 'normal': + print >> codefo, 'PANGO_STYLE(PANGO_STYLE_NORMAL,%d,%d)' % (start,end) + elif font_style == 'italic': + print >> codefo, 'PANGO_STYLE(PANGO_STYLE_ITALIC,%d,%d)' % (start,end) + elif font_style == 'oblique': + print >> codefo, 'PANGO_STYLE(PANGO_STYLE_OBLIQUE,%d,%d)' % (start,end) pass - font_family = 'Roman' - if style_map.has_key('font-family'): - font_family = style_map['font-family'].lower() + if style_map.has_key('font-family'): + font_family = style_map['font-family'].lower() + print >> codefo, 'PANGO_FAMILY(%s,%d,%d)' % (font_family,start,end) + pass + if style_map.has_key('text-anchor'): + text_anchor = style_map['text-anchor'].lower() + # FIXME: We need to implement a mb_text_set_aligment to implement SVG-styled alignment. + print "The text-anchor is not implemented yet" + pass + if style_map.has_key('font-variant'): + font_variant = style_map['font-variant'].lower() + print "The font-variant is not implemented yet" + pass + if style_map.has_key('font-weight'): + font_weight = style_map['font-weight'].lower() + if font_weight == 'normal': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_NORMAL,%d,%d)' % (start,end) + elif font_weight == 'bold': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_BOLD,%d,%d)' % (start,end) + elif font_weight == 'bolder': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_HEAVY,%d,%d)' % (start,end) + elif font_weight == 'lighter': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_ULTRALIGHT,%d,%d)' % (start,end) + elif font_weight == '100': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_ULTRALIGHT,%d,%d)' % (start,end) + elif font_weight == '200': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_ULTRALIGHT,%d,%d)' % (start,end) + elif font_weight == '300': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_LIGHT,%d,%d)' % (start,end) + elif font_weight == '400': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_NORMAL,%d,%d)' % (start,end) + elif font_weight == '500': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_NORMAL,%d,%d)' % (start,end) + elif font_weight == '600': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_SEMIBOLD,%d,%d)' % (start,end) + elif font_weight == '700': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_BOLD,%d,%d)' % (start,end) + elif font_weight == '800': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_ULTRABOLD,%d,%d)' % (start,end) + elif font_weight == '900': + print >> codefo, 'PANGO_STYLE(PANGO_WEIGHT_HEAVY,%d,%d)' % (start,end) + else: + print "The font-weight %s is not supported" % font_weight + pass + if style_map.has_key('direction'): + direction = style_map['direction'].lower() + print "The direction is not implemented yet" + pass + if style_map.has_key('unicode-bidi'): + bidi = style_map['unicode-bidi'].lower() + print "The bidi is not implemented yet" pass pass - + def translate_text(text, coord_id, codefo, doc): - translate_font_style(text, codefo) + map = translate_font_style(text, codefo) + attrs = [] + text.style_map = map + attr = [0,0, text] + attrs.append(attr) - txt_strs = [] + txt_strs = '' for node in text.childNodes: if node.localName == None: - txt_strs.append(node.data) + txt_strs = txt_strs + node.data elif node.localName == 'tspan': - node.setAttribute('style', text.getAttribute('style')) - translate_text(node, coord_id, codefo, doc) + txt_strs = translate_tspan(node,coord_id, codefo, doc,txt_strs,attrs) pass pass + attr[1] = len(txt_strs)-1 if txt_strs: text_id = _get_id(text) x = float(text.getAttribute('x')) y = float(text.getAttribute('y')) print >> codefo, 'dnl' print >> codefo, \ - 'ADD_TEXT([%s], [%s], %f, %f, MB_FONT_SZ, [%s])dnl' % ( + 'PANGO_BEGIN_TEXT([%s], [%s], %f, %f, 16, [%s])dnl' % ( text_id.encode('utf8'), u''.join(txt_strs).encode('utf8'), x, y, coord_id.encode('utf8')) - translate_style(text, coord_id, codefo, doc, 'TEXT_') + generate_font_attributes(attrs, coord_id, codefo, doc) + print >> codefo, \ + 'PANGO_END_TEXT([%s], [%s], %f, %f, 16, [%s])dnl' % ( + text_id.encode('utf8'), u''.join(txt_strs).encode('utf8'), + x, y, coord_id.encode('utf8')) + translate_style(text, coord_id, codefo, doc, 'TEXT_') pass pass @@ -449,6 +542,9 @@ elif node.localName == 'text': translate_text(node, group_id, codefo, doc) pass + elif node.localName == 'textarea': + translate_textarea(node, group_id, codefo, doc) + pass pass pass