Code

Remove 'default scale origin' from selector tool's preferences
[inkscape.git] / src / display / nr-arena-glyphs.cpp
index bd6a5707a064d0ffe0a44edf11b42200d90fae97..65c5b378f7a7ae18fb5bd770f8d88898197b6526 100644 (file)
 #endif
 #include <libnr/nr-blit.h>
 #include <libnr/nr-path.h>
+#include <libnr/n-art-bpath.h>
+#include <libnr/nr-matrix-ops.h>
+#include <libnr/nr-matrix-fns.h>
 #include "../style.h"
 #include "nr-arena.h"
 #include "nr-arena-glyphs.h"
+#include <cairo.h>
+#include "inkscape-cairo.h"
 
 #ifdef test_glyph_liv
 #include "../display/canvas-bpath.h"
@@ -308,7 +313,7 @@ static void nr_arena_glyphs_group_init(NRArenaGlyphsGroup *group);
 static void nr_arena_glyphs_group_finalize(NRObject *object);
 
 static guint nr_arena_glyphs_group_update(NRArenaItem *item, NRRectL *area, NRGC *gc, guint state, guint reset);
-static unsigned int nr_arena_glyphs_group_render(NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags);
+static unsigned int nr_arena_glyphs_group_render(cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags);
 static unsigned int nr_arena_glyphs_group_clip(NRArenaItem *item, NRRectL *area, NRPixBlock *pb);
 static NRArenaItem *nr_arena_glyphs_group_pick(NRArenaItem *item, NR::Point p, gdouble delta, unsigned int sticky);
 
@@ -423,10 +428,9 @@ nr_arena_glyphs_group_update(NRArenaItem *item, NRRectL *area, NRGC *gc, guint s
     return NR_ARENA_ITEM_STATE_ALL;
 }
 
-/* This sucks - as soon, as we have inheritable renderprops, do something with that opacity */
 
 static unsigned int
-nr_arena_glyphs_group_render(NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags)
+nr_arena_glyphs_group_render(cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags)
 {
     NRArenaItem *child;
 
@@ -436,13 +440,41 @@ nr_arena_glyphs_group_render(NRArenaItem *item, NRRectL *area, NRPixBlock *pb, u
 
     guint ret = item->state;
 
+    if (item->arena->rendermode == RENDERMODE_OUTLINE) {
+
+        if (!ct) 
+            return item->state;
+
+        guint32 rgba = item->arena->outlinecolor;
+        // FIXME: we use RGBA buffers but cairo writes BGRA (on i386), so we must cheat 
+        // by setting color channels in the "wrong" order
+        cairo_set_source_rgba(ct, SP_RGBA32_B_F(rgba), SP_RGBA32_G_F(rgba), SP_RGBA32_R_F(rgba), SP_RGBA32_A_F(rgba));
+        cairo_set_tolerance(ct, 1.25); // low quality, but good enough for outline mode
+
+        for (child = group->children; child != NULL; child = child->next) {
+            NRArenaGlyphs *g = NR_ARENA_GLYPHS(child);
+
+            NArtBpath *bpath = (NArtBpath *) g->font->ArtBPath(g->glyph);
+
+            cairo_new_path(ct);
+            NR::Matrix g_t(g->g_transform);
+            feed_curve_to_cairo (ct, bpath, g_t * group->ctm, (pb->area).upgrade(), false, 0);
+            cairo_fill(ct);
+            pb->empty = FALSE;
+        }
+
+        return ret;
+    }
+
+
+
     /* Fill */
     if (style->fill.type != SP_PAINT_TYPE_NONE || item->arena->rendermode == RENDERMODE_OUTLINE) {
         NRPixBlock m;
         nr_pixblock_setup_fast(&m, NR_PIXBLOCK_MODE_A8, area->x0, area->y0, area->x1, area->y1, TRUE);
 
         // if memory allocation failed, abort 
-        if (m.data.px == NULL) {
+        if (m.size != NR_PIXBLOCK_SIZE_TINY && m.data.px == NULL) {
             nr_pixblock_release (&m);
             return (item->state);
         }
@@ -489,7 +521,7 @@ nr_arena_glyphs_group_render(NRArenaItem *item, NRRectL *area, NRPixBlock *pb, u
         nr_pixblock_setup_fast(&m, NR_PIXBLOCK_MODE_A8, area->x0, area->y0, area->x1, area->y1, TRUE);
 
         // if memory allocation failed, abort 
-        if (m.data.px == NULL) {
+        if (m.size != NR_PIXBLOCK_SIZE_TINY && m.data.px == NULL) {
             nr_pixblock_release (&m);
             return (item->state);
         }