changeset 279:86a5ae82ccf2 mbtext

* Modify svg2code_ex to use differnt font size at two test items to illustrate the function of the new text parser * Generate seperate text segments if the x is defined in the tspan. With this settings, we may be able to implement the text alignment already. * Be warnned that the text element may not be generated at all. We may need to convert the text element into a group for this situation. Currently, we leave it as it is.
author wycc
date Sat, 31 Jan 2009 11:51:19 +0800
parents a90fd749af82
children c8b6ca46950b
files examples/calculator/calculator_scr.svg examples/svg2code_ex/svg2code_ex.svg src/shape_text.c tools/svg2code.py
diffstat 4 files changed, 57 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/examples/calculator/calculator_scr.svg	Sat Jan 31 09:41:04 2009 +0800
+++ b/examples/calculator/calculator_scr.svg	Sat Jan 31 11:51:19 2009 +0800
@@ -509,9 +509,9 @@
        style="font-size:28px;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"
        x="36.939316"
        y="61.546173"
-       id="screen_text_u"><tspan
+       id="screen_text"><tspan
          sodipodi:role="line"
-         id="screen_text"
+         id="screen_text_u"
          x="36.939316"
          y="61.546173">0</tspan></text>
     <text
@@ -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="saved_text"><tspan
+       id="2222"><tspan
          sodipodi:role="line"
-         id="t2222"
+         id="saved_text"
          x="71.767807"
          y="78.100266">None</tspan></text>
   </g>
--- a/examples/svg2code_ex/svg2code_ex.svg	Sat Jan 31 09:41:04 2009 +0800
+++ b/examples/svg2code_ex/svg2code_ex.svg	Sat Jan 31 11:51:19 2009 +0800
@@ -329,7 +329,7 @@
      height="600px"
      showgrid="true"
      inkscape:window-width="822"
-     inkscape:window-height="695"
+     inkscape:window-height="721"
      inkscape:window-x="130"
      inkscape:window-y="120" />
   <metadata
@@ -415,6 +415,7 @@
     </g>
     <g
        id="file_menu"
+       display="none"
        style="display:none">
       <rect
          y="41.991447"
@@ -442,9 +443,10 @@
            id="tspan3136"
            sodipodi:role="line">test</tspan><tspan
            id="tspan3138"
-           y="106.36016"
+           y="118.32115"
            x="52.16227"
-           sodipodi:role="line">test</tspan></text>
+           sodipodi:role="line"
+           style="font-size:28px">test</tspan></text>
     </g>
     <path
        sodipodi:type="arc"
--- a/src/shape_text.c	Sat Jan 31 09:41:04 2009 +0800
+++ b/src/shape_text.c	Sat Jan 31 11:51:19 2009 +0800
@@ -35,6 +35,7 @@
     cairo_font_face_destroy(text->face);
 }
 
+static void sh_text_P_generate_layout(sh_text_t *text,cairo_t *cr);
 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,PangoAttrList *attrs) {
@@ -62,6 +63,7 @@
     text->shape.free = sh_text_free;
     text->layout = NULL;
     text->attrs = attrs;
+    sh_text_P_generate_layout(text, rdman->cr);
 
     rdman_shape_man(rdman, (shape_t *)text);
 
@@ -77,39 +79,14 @@
     text->data = buf;
 }
 
-static int get_extents(sh_text_t *text, cairo_text_extents_t *extents) {
+static int get_extents(sh_text_t *text, PangoRectangle *extents) {
     cairo_matrix_t fmatrix;
     cairo_matrix_t ctm;
     cairo_scaled_font_t *new_scaled;
     cairo_font_options_t *fopt;
 
-    if((text->flags & TXF_SCALE_DIRTY) ||
-       text->scaled_font == NULL) {
-	fopt = cairo_font_options_create();
-	if(fopt == NULL)
-	    return ERR;
-	memset(&fmatrix, 0, sizeof(cairo_matrix_t));
-	fmatrix.xx = text->d_font_size;
-	fmatrix.yy = text->d_font_size;
-	memset(&ctm, 0, sizeof(cairo_matrix_t));
-	ctm.xx = 1;
-	ctm.yy = 1;
-	new_scaled = cairo_scaled_font_create(text->face,
-					      &fmatrix,
-					      &ctm,
-					      fopt);
-	cairo_font_options_destroy(fopt);
-	if(new_scaled == NULL)
-	    return ERR;
-
-	if(text->scaled_font)
-	    cairo_scaled_font_destroy(text->scaled_font);
-	text->scaled_font = new_scaled;
-	text->flags &= ~TXF_SCALE_DIRTY;
-    }
-
-    cairo_scaled_font_text_extents(text->scaled_font,
-				   text->data, extents);
+    pango_layout_get_extents(text->layout, NULL, extents);
+    pango_extents_to_pixels(extents,NULL);
     return OK;
 }
 
@@ -117,7 +94,7 @@
     sh_text_t *text;
     co_aix x, y;
     co_aix shw;
-    cairo_text_extents_t extents;
+    PangoRectangle extents;
     co_aix poses[2][2];
     int r;
 
@@ -129,6 +106,8 @@
     y = text->y;
     coord_trans_pos(shape->coord, &x, &y);
     r = get_extents(text, &extents);
+
+    printf("x=%f y=%f text=%s ascent=%d,descent=%d,width=%d height=%d\n", x,y,text->data,PANGO_ASCENT(extents), PANGO_DESCENT(extents), extents.width, extents.height);
     ASSERT(r == OK);
 
     text->d_x = x;
@@ -137,8 +116,9 @@
     /* FIXME: It is unreasonable that a font exceed it's bbox.
      * We add 5 pixels in get right bbox.  But, it is unreasonable.
      */
-    poses[0][0] = x + extents.x_bearing - 5 - shw;
-    poses[0][1] = y + extents.y_bearing - 5 - shw;
+
+    poses[0][0] = x + extents.x - 5 - shw;
+    poses[0][1] = y + extents.y - 5 - shw;
     poses[1][0] = poses[0][0] + extents.width + 10 + shape->stroke_width;
     poses[1][1] = poses[0][1] + extents.height + 10 + shape->stroke_width;
     geo_from_positions(shape->geo, 2, poses);
@@ -158,14 +138,11 @@
     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_text(text->layout,text->data,strlen(text->data));
     pango_layout_set_attributes(text->layout, text->attrs);
-
 }
 static void draw_text(sh_text_t *text, cairo_t *cr) {
-    if (text->layout==NULL) {
-        sh_text_P_generate_layout(text,cr);
-    }
+    sh_text_P_generate_layout(text, cr);
     cairo_move_to(cr, text->d_x, text->d_y);
     pango_cairo_show_layout(cr,text->layout);
 }
--- a/tools/svg2code.py	Sat Jan 31 09:41:04 2009 +0800
+++ b/tools/svg2code.py	Sat Jan 31 11:51:19 2009 +0800
@@ -125,10 +125,12 @@
 
 def translate_style(node, coord_id, codefo, doc, prefix):
     node_id = node.getAttribute('id')
-    style_str = node.getAttribute('style')
-    prop_map = get_style_map(style_str)
+    try:
+	prop_map = node.style_map
+    except:
+        style_str = node.getAttribute('style')
+        prop_map = get_style_map(style_str)
 
-    print node_id,style_str
     try:
         opacity = float(node.getAttribute('opacity'))
     except:
@@ -353,11 +355,26 @@
 
     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]
+def merge_style(tspan,text):
+    newmap = tspan.style_map
+    map = text.style_map
+    for k,v in text.style_map.items():
+	    if not newmap.has_key(k):
+	        newmap[k] = v
+def translate_tspan(tspan, text,coord_id, codefo, doc,txt_strs,attrs):
+    try:
+   	map = tspan.style_map
+    except:
+        map = translate_font_style(tspan, codefo)
+        tspan.style_map = map
+    if tspan.hasAttribute('x'):
+	    # Render the tspan as an independent text if the x attribute is defined. All elements inside 
+	    # the tspan will be ignore by the outter text or tspan elements.
+	    # FIXME: We need to apply the style map recursively.
+	    merge_style(tspan,text)
+	    translate_text(tspan,coord_id,codefo,doc)
+	    return ''
+    attr = [len(txt_strs.encode('utf8'))-1,0, tspan]
     attrs.append(attr)
     for node in tspan.childNodes:
         if node.localName == None:
@@ -366,7 +383,7 @@
 	    txt_strs = translate_tspan(node,coord_id, codefo, doc,txt_strs,attrs)
             pass
         pass
-    attr[1] = len(txt_strs)-1
+    attr[1] = len(txt_strs.encode('utf8'))
     return txt_strs
 
     
@@ -383,10 +400,10 @@
     	    # 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)
+                print >> codefo, 'PANGO_SIZE(%d,%d,%d)' % (font_sz*1024,start,end)
 	    else:
                 font_sz = float(style_map['font-size'])
-                print >> codefo, 'PANGO_SIZE(%d,%d,%d)' % (font_sz,start,end)
+                print >> codefo, 'PANGO_SIZE(%d,%d,%d)' % (font_sz*1024,start,end)
             pass
 
         if style_map.has_key('font-style'):
@@ -454,9 +471,12 @@
     pass
 	    
 def translate_text(text, coord_id, codefo, doc):
-    map = translate_font_style(text, codefo)
+    try:
+        map = text.style_map
+    except:	
+        map = translate_font_style(text, codefo)
+        text.style_map = map
     attrs = []
-    text.style_map = map
     attr = [0,0, text]
     attrs.append(attr)
 
@@ -465,10 +485,10 @@
         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)
+	    txt_strs = translate_tspan(node,text,coord_id, codefo, doc,txt_strs,attrs)
             pass
         pass
-    attr[1] = len(txt_strs)-1
+    attr[1] = len(txt_strs.encode('utf8'))
     if txt_strs:
         text_id = _get_id(text)
         x = float(text.getAttribute('x'))