diff options
| author | Felipe Corr??a da Silva Sanches <juca@members.fsf.org> | 2008-05-25 15:35:28 +0000 |
|---|---|---|
| committer | JucaBlues <JucaBlues@users.sourceforge.net> | 2008-05-25 15:35:28 +0000 |
| commit | c14ff7c7b9e4f564920cb37e89b2944aa9156f9a (patch) | |
| tree | 6cb0343c91d16b2dd93593c7b0a1a5459e076e9c /src/display | |
| parent | Fix some compile warnings (diff) | |
| download | inkscape-c14ff7c7b9e4f564920cb37e89b2944aa9156f9a.tar.gz inkscape-c14ff7c7b9e4f564920cb37e89b2944aa9156f9a.zip | |
* add rule in configure.ac so that only who has cairo > 1.6.4 (currently cairo git master branch) will compile SVGFonts (experimental) support.
* First code for SVGFonts rendering. Renders in a separate window because we still dont have pango integration.
(bzr r5753)
Diffstat (limited to 'src/display')
| -rw-r--r-- | src/display/Makefile_insert | 2 | ||||
| -rw-r--r-- | src/display/nr-arena-glyphs.cpp | 2 | ||||
| -rw-r--r-- | src/display/nr-svgfonts.cpp | 156 | ||||
| -rw-r--r-- | src/display/nr-svgfonts.h | 25 |
4 files changed, 185 insertions, 0 deletions
diff --git a/src/display/Makefile_insert b/src/display/Makefile_insert index 2e27cc188..5c7fd892e 100644 --- a/src/display/Makefile_insert +++ b/src/display/Makefile_insert @@ -55,6 +55,8 @@ display_libspdisplay_a_SOURCES = \ display/nr-plain-stuff-gdk.h \ display/nr-plain-stuff.cpp \ display/nr-plain-stuff.h \ + display/nr-svgfonts.cpp \ + display/nr-svgfonts.h \ display/rendermode.h \ display/snap-indicator.cpp \ display/snap-indicator.h \ diff --git a/src/display/nr-arena-glyphs.cpp b/src/display/nr-arena-glyphs.cpp index 6ee1be796..63af4787a 100644 --- a/src/display/nr-arena-glyphs.cpp +++ b/src/display/nr-arena-glyphs.cpp @@ -37,6 +37,8 @@ void nr_pixblock_render_shape_mask_or(NRPixBlock &m, Shape *theS); #endif +#include "nr-svgfonts.h" + static void nr_arena_glyphs_class_init(NRArenaGlyphsClass *klass); static void nr_arena_glyphs_init(NRArenaGlyphs *glyphs); static void nr_arena_glyphs_finalize(NRObject *object); diff --git a/src/display/nr-svgfonts.cpp b/src/display/nr-svgfonts.cpp new file mode 100644 index 000000000..472d232cf --- /dev/null +++ b/src/display/nr-svgfonts.cpp @@ -0,0 +1,156 @@ +#include "config.h" +#ifdef ENABLE_SVG_FONTS +/* + * SVGFonts rendering implementation + * + * Authors: + * Felipe C. da S. Sanches <felipe.sanches@gmail.com> + * + * Copyright (C) 2008 Felipe C. da S. Sanches + * + * Released under GNU GPL version 2 or later. + * Read the file 'COPYING' for more information. + */ + +#include <libnr/n-art-bpath.h> +#include "../style.h" +#include "../sp-glyph.h" +#include "../sp-missing-glyph.h" +#include "../sp-font.h" +#include <cairo.h> +#include <vector> +#include "svg/svg.h" +#include "inkscape-cairo.h" +#include <gtk/gtk.h> + +static std::vector<SPGlyph*> glyphs; +static SPMissingGlyph* missingglyph = NULL; +static std::vector<SPFont*> svgfonts; + +cairo_font_face_t* nr_svgfonts_get_user_font_face(); +void nr_svgfonts_append_spfont(SPFont* font); +static cairo_status_t scaled_font_init (cairo_scaled_font_t *scaled_font, cairo_font_extents_t *metrics); +static cairo_status_t scaled_font_unicode_to_glyph (cairo_scaled_font_t *scaled_font, unsigned long unicode, unsigned long *glyph); +static cairo_status_t scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, unsigned long glyph, cairo_t *cr, cairo_text_extents_t *metrics); + +void nr_svgfonts_append_spfont(SPFont* font){ + svgfonts.push_back(font); + nr_svgfonts_get_user_font_face(); +} + +static cairo_status_t +scaled_font_init (cairo_scaled_font_t *scaled_font, + cairo_font_extents_t *metrics) +{ +//TODO +// metrics->ascent = .75; +// metrics->descent = .25; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +scaled_font_unicode_to_glyph (cairo_scaled_font_t *scaled_font, + unsigned long unicode, + unsigned long *glyph) +{ +//g_warning("scaled_font_unicode_to_glyph CALL. unicode=%c", (char)unicode); + + unsigned long i; + for (i=0; i < (unsigned long) glyphs.size(); i++){ + //TODO: compare unicode strings for ligadure glyphs (i.e. scaled_font_text_to_glyph) + if ( ((unsigned long) glyphs[i]->unicode[0]) == unicode){ + *glyph = i; + return CAIRO_STATUS_SUCCESS; + } + } + *glyph = i; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, + unsigned long glyph, + cairo_t *cr, + cairo_text_extents_t *metrics) +{ +//g_warning("scaled_font_render_glyph CALL. glyph=%d", (int)glyph); + + if (glyph > glyphs.size()) return CAIRO_STATUS_SUCCESS; + + SPObject* node; + if (glyph == glyphs.size()){ + if (!missingglyph) return CAIRO_STATUS_SUCCESS; + node = (SPObject*) missingglyph; + g_warning("RENDER MISSING-GLYPH"); + } else { + node = (SPObject*) glyphs[glyph]; + g_warning("RENDER %c", glyphs[glyph]->unicode[0]); + } + + NArtBpath *bpath = NULL; + if (SP_IS_GLYPH(node)) bpath = sp_svg_read_path(((SPGlyph*)node)->d); + if (SP_IS_MISSING_GLYPH(node)) bpath = sp_svg_read_path(((SPMissingGlyph*)node)->d); + + cairo_new_path(cr); + + NR::scale s(1.0/((SPFont*) node->parent)->horiz_adv_x); + NR::Matrix t(s); + NRRect area(0,0,1,1); //I need help here! + feed_curve_to_cairo (cr, bpath, t, area.upgrade(), false, 0); + cairo_fill(cr); + + return CAIRO_STATUS_SUCCESS; +} + + +bool drawing_expose_cb (GtkWidget *widget, GdkEventExpose *event, gpointer data) +{ + cairo_t *cr = gdk_cairo_create (widget->window); + + cairo_set_font_face (cr, nr_svgfonts_get_user_font_face()); + cairo_set_font_size (cr, 200); + cairo_move_to (cr, 200, 200); + cairo_show_text (cr, "A@!A"); + + cairo_move_to (cr, 200, 400); + cairo_show_text (cr, "A!@A"); + + cairo_destroy (cr); + + return TRUE; +} + + +cairo_font_face_t * nr_svgfonts_get_user_font_face(){ + static cairo_font_face_t *user_font_face = NULL; + + if (!user_font_face) { + for(SPObject* node = svgfonts[0]->children;node;node=node->next){ + if (SP_IS_GLYPH(node)){ + g_warning("glyphs.push_back((SPGlyph*)node); (node->unicode[0]='%c')", ((SPGlyph*)node)->unicode[0]); + glyphs.push_back((SPGlyph*)node); + } + if (SP_IS_MISSING_GLYPH(node)){ + g_warning("missingglyph=(SPMissingGlyph*)node;"); + missingglyph=(SPMissingGlyph*)node; + } + } + user_font_face = cairo_user_font_face_create (); + cairo_user_font_face_set_init_func (user_font_face, scaled_font_init); + cairo_user_font_face_set_render_glyph_func (user_font_face, scaled_font_render_glyph); + cairo_user_font_face_set_unicode_to_glyph_func (user_font_face, scaled_font_unicode_to_glyph); + + GtkWidget *window; + GtkWidget *drawing; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size (GTK_WINDOW(window), 1200, 850); + drawing = gtk_drawing_area_new (); + gtk_container_add (GTK_CONTAINER (window), drawing); + gtk_widget_show_all (window); + g_signal_connect (drawing, "expose-event", G_CALLBACK (drawing_expose_cb), NULL); + } + return user_font_face; +} +#endif //#ifdef ENABLE_SVG_FONTS + diff --git a/src/display/nr-svgfonts.h b/src/display/nr-svgfonts.h new file mode 100644 index 000000000..f1671cb7d --- /dev/null +++ b/src/display/nr-svgfonts.h @@ -0,0 +1,25 @@ +#include "config.h" +#ifdef ENABLE_SVG_FONTS +#ifndef __SVGFONTS_H__ +#define __SVGFONTS_H__ +/* + * SVGFonts rendering headear + * + * Authors: + * Felipe C. da S. Sanches <felipe.sanches@gmail.com> + * + * Copyright (C) 2008 Felipe C. da S. Sanches + * + * Released under GNU GPL version 2 or later. + * Read the file 'COPYING' for more information. + */ + +#include "../sp-font.h" +#include "cairo.h" + +void nr_svgfonts_append_spfont(SPFont* font); +cairo_font_face_t* nr_svgfonts_get_user_font_face(); + +#endif //#ifndef __SVGFONTS_H__ +#endif //#ifdef ENABLE_SVG_FONTS + |
