Author: Carlos Lopez <genet...@gmail.com>
Date:   Wed Aug 29 23:44:11 2012 +0200

Layer_Freetype: add support for the Orientation parameter, allowing to align 
text horizontally and vertically. Add code to render on a second surface to 
allow use proper operator.

---

 .../src/modules/lyr_freetype/lyr_freetype.cpp      |   89 +++++++++++---------
 1 files changed, 49 insertions(+), 40 deletions(-)

diff --git a/synfig-core/src/modules/lyr_freetype/lyr_freetype.cpp 
b/synfig-core/src/modules/lyr_freetype/lyr_freetype.cpp
index 1d0bba7..27a0715 100644
--- a/synfig-core/src/modules/lyr_freetype/lyr_freetype.cpp
+++ b/synfig-core/src/modules/lyr_freetype/lyr_freetype.cpp
@@ -932,15 +932,20 @@ Layer_Freetype::accelerated_cairorender(Context 
context,cairo_surface_t *surface
        const double tx((-tl[0]+origin[0])*sx);
        const double ty((-tl[1]+origin[1])*sy);
 
-       // Initially render what's behind us
-       if(!context.accelerated_cairorender(surface,quality,renddesc,cb))
+       if(!is_solid_color())
        {
-               if(cb)cb->error(strprintf(__FILE__"%d: Accelerated Cairo 
Renderer Failure",__LINE__));
-               return false;
+               // Initially render what's behind us
+               
if(!context.accelerated_cairorender(surface,quality,renddesc,cb))
+               {
+                       if(cb)cb->error(strprintf(__FILE__"%d: Accelerated 
Cairo Renderer Failure",__LINE__));
+                       return false;
+               }
        }
 
        // Cairo context
-       cairo_t* cr=cairo_create(surface);
+       cairo_surface_t* subimage;
+       subimage=cairo_surface_create_similar(surface, 
CAIRO_CONTENT_COLOR_ALPHA, w, h);
+       cairo_t* subcr=cairo_create(subimage);
 
        // Pango
        PangoLayout *layout;
@@ -950,69 +955,73 @@ Layer_Freetype::accelerated_cairorender(Context 
context,cairo_surface_t *surface
        pango_font_description_set_family (font_description, font.c_str());
        pango_font_description_set_weight (font_description, 
PangoWeight(weight));
        pango_font_description_set_style (font_description, PangoStyle(style));
+       // The size is scaled to match Software render size (remove the scale?)
        float sizex=1.75*size[0]*sx;
        pango_font_description_set_absolute_size (font_description, sizex * 
PANGO_SCALE );
        //Pango Layout
-       layout = pango_cairo_create_layout (cr);
+       layout = pango_cairo_create_layout (subcr);
        pango_layout_set_font_description (layout, font_description);
        pango_layout_set_text (layout, text.c_str(), -1);
        pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
        pango_layout_set_single_paragraph_mode(layout, false);
-       PangoRectangle ink_rect;
-       PangoRectangle logical_rect;
-       pango_layout_get_pixel_extents(layout, &ink_rect, &logical_rect);
+       PangoRectangle ink_layout, logical_layout;
+       PangoRectangle ink_rect, logical_rect;
+       pango_layout_get_pixel_extents(layout, &ink_layout, &logical_layout);
        
        // Render text
-       cairo_save(cr);
-       cairo_set_source_rgba(cr, color.get_r(), color.get_g(), color.get_b(), 
color.get_a());
-       cairo_move_to(cr, tx, ty);
+       cairo_save(subcr);
+       cairo_set_source_rgba(subcr, color.get_r(), color.get_g(), 
color.get_b(), color.get_a());
+       cairo_move_to(subcr, tx, ty);
        int total_lines=pango_layout_get_line_count(layout), i;
-       //synfig::info("total lines %d", total_lines);
        PangoLayoutIter* layoutiter(pango_layout_get_iter(layout));
-       int sup=0, inf, wdiff, baseline;
+       int baseline;
        for(i=0;i<total_lines; i++)
        {
-               //synfig::info("i=%d", i);
                pango_layout_iter_get_line_extents(layoutiter, &ink_rect, 
&logical_rect);
                pango_extents_to_pixels(&ink_rect, NULL);
                pango_extents_to_pixels(&logical_rect, NULL);
-               sup=ink_rect.y-logical_rect.y;
-               wdiff=logical_rect.height-ink_rect.height;
-               inf=wdiff-sup;
-               //synfig::info("sup=%d", sup);
-               //synfig::info("inf=%d", inf);
                baseline=pango_layout_iter_get_baseline(layoutiter);
-               //synfig::info("baseline=%d", baseline);
-               cairo_move_to(cr, tx, ty+baseline/PANGO_SCALE);
-               cairo_rel_move_to(cr, 0, -ink_rect.y+logical_rect.y);
-               pango_cairo_show_layout_line(cr, 
pango_layout_get_line_readonly(layout, i));
-               //cairo_rel_move_to(cr, 0, inf);
+               // this will move the line to the text origin plus its baseline
+               cairo_move_to(subcr, tx, ty+baseline/PANGO_SCALE);
+               // these two will move horizontally and vertically the needed 
amount given by the orientation parameter
+               cairo_rel_move_to(subcr, 
-ink_layout.x+logical_layout.x-ink_rect.width*orient[0], 0);
+               cairo_rel_move_to(subcr, 0, 
-ink_layout.y+logical_layout.y-ink_layout.height*orient[1]);
+               // render the layout line on cairo context
+               pango_cairo_show_layout_line(subcr, 
pango_layout_get_line_readonly(layout, i));
+               // iter for the next line, break if reached the end of lines
                if(!pango_layout_iter_next_line(layoutiter))
                        break;
        }
-//     cairo_move_to (cr, 
tx-ink_rect.x+logical_rect.x-ink_rect.width*orient[0], 
ty-ink_rect.y+logical_rect.y-ink_rect.height*orient[1]);
-//     pango_cairo_show_layout (cr, layout);
+       // Render the text on the target surface with the proper operator
+       cairo_restore(subcr);
+       cairo_t* cr=cairo_create(surface);
+       cairo_save(cr);
+       cairo_set_source_surface(cr, subimage, 0, 0);
+       cairo_set_operator(cr, CAIRO_OPERATOR_OVER); // TODO: this has to be 
the real operator
+       cairo_paint_with_alpha(cr, get_amount());
        cairo_restore(cr);
+       // Debug ink and logical lines
        if(0)
        {
                pango_layout_get_pixel_extents(layout, &ink_rect, 
&logical_rect);       
                // Render logical and ink rectangles
-               cairo_save(cr);
-               cairo_set_source_rgb(cr, 0.0, 1.0, 0.0);
-               cairo_set_line_width(cr, 1.0);
-               cairo_rectangle(cr, tx+ink_rect.x-0.5, ty+ink_rect.y-0.5, 
ink_rect.width, ink_rect.height);
-               cairo_stroke(cr);
-               cairo_restore(cr);
-
-               cairo_save(cr);
-               cairo_set_line_width(cr, 1.0);
-               cairo_set_source_rgb(cr, 0.0, 0.0, 1.0);
-               cairo_rectangle(cr, tx+logical_rect.x-0.5, 
ty+logical_rect.y-0.5, logical_rect.width, logical_rect.height);
-               cairo_stroke(cr);
-               cairo_restore(cr);
+               cairo_save(subcr);
+               cairo_set_source_rgb(subcr, 0.0, 1.0, 0.0);
+               cairo_set_line_width(subcr, 1.0);
+               cairo_rectangle(subcr, tx+ink_rect.x-0.5, ty+ink_rect.y-0.5, 
ink_rect.width, ink_rect.height);
+               cairo_stroke(subcr);
+               cairo_restore(subcr);
+
+               cairo_save(subcr);
+               cairo_set_line_width(subcr, 1.0);
+               cairo_set_source_rgb(subcr, 0.0, 0.0, 1.0);
+               cairo_rectangle(subcr, tx+logical_rect.x-0.5, 
ty+logical_rect.y-0.5, logical_rect.width, logical_rect.height);
+               cairo_stroke(subcr);
+               cairo_restore(subcr);
        }
        // Destroy and return
        pango_layout_iter_free(layoutiter);
+       cairo_destroy(subcr);
        cairo_destroy(cr);
        g_object_unref (layout);
        pango_font_description_free (font_description);


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Synfig-devl mailing list
Synfig-devl@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to