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"
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);
}