From ae3eacfd49646a2f254b3ff70db24d2a6d68f287 Mon Sep 17 00:00:00 2001 From: JucaBlues Date: Fri, 30 May 2008 04:49:54 +0000 Subject: [PATCH] * implemented text_to_glyphs, so that now we can have ligadure glyphs * Adapted example file to test this feature too --- share/examples/svgfont.svg | 11 ++---- src/display/nr-svgfonts.cpp | 74 ++++++++++++++++++++++++++----------- src/display/nr-svgfonts.h | 2 +- 3 files changed, 57 insertions(+), 30 deletions(-) diff --git a/share/examples/svgfont.svg b/share/examples/svgfont.svg index 6ac420df0..63b9668e0 100644 --- a/share/examples/svgfont.svg +++ b/share/examples/svgfont.svg @@ -14,14 +14,11 @@ - + - - - - - - + + + diff --git a/src/display/nr-svgfonts.cpp b/src/display/nr-svgfonts.cpp index ccce7edc5..6550daaf0 100644 --- a/src/display/nr-svgfonts.cpp +++ b/src/display/nr-svgfonts.cpp @@ -59,13 +59,14 @@ static cairo_status_t font_init_cb (cairo_scaled_font_t *scaled_font, return instance->scaled_font_init(scaled_font, metrics); } -static cairo_status_t font_unicode_to_glyph_cb (cairo_scaled_font_t *scaled_font, - unsigned long unicode, - unsigned long *glyph){ +static cairo_status_t font_text_to_glyphs_cb (cairo_scaled_font_t *scaled_font, + const char *utf8, + cairo_glyph_t **glyphs, + int *num_glyphs){ cairo_font_face_t* face; face = cairo_scaled_font_get_font_face(scaled_font); SvgFont* instance = (SvgFont*) cairo_font_face_get_user_data(face, &key); - return instance->scaled_font_unicode_to_glyph(scaled_font, unicode, glyph); + return instance->scaled_font_text_to_glyphs(scaled_font, utf8, glyphs, num_glyphs); } static cairo_status_t font_render_glyph_cb (cairo_scaled_font_t *scaled_font, @@ -80,9 +81,9 @@ static cairo_status_t font_render_glyph_cb (cairo_scaled_font_t *scaled_font, UserFont::UserFont(SvgFont* instance){ this->face = cairo_user_font_face_create (); - cairo_user_font_face_set_init_func (this->face, font_init_cb); - cairo_user_font_face_set_render_glyph_func (this->face, font_render_glyph_cb); - cairo_user_font_face_set_unicode_to_glyph_func (this->face, font_unicode_to_glyph_cb); + cairo_user_font_face_set_init_func (this->face, font_init_cb); + cairo_user_font_face_set_render_glyph_func (this->face, font_render_glyph_cb); + cairo_user_font_face_set_text_to_glyphs_func (this->face, font_text_to_glyphs_cb); cairo_font_face_set_user_data (this->face, &key, (void*)instance, (cairo_destroy_func_t) NULL); } @@ -115,22 +116,53 @@ SvgFont::scaled_font_init (cairo_scaled_font_t *scaled_font, return CAIRO_STATUS_SUCCESS; } +unsigned int compare_them(char* s1, char* s2){ + unsigned int p=0; + while((s1[p] == s2[p]) && s1[p] != '\0' && s2[p] != '\0') p++; + if (s1[p]=='\0') return p; + else return 0; +} + cairo_status_t -SvgFont::scaled_font_unicode_to_glyph (cairo_scaled_font_t *scaled_font, - unsigned long unicode, - unsigned long *glyph) +SvgFont::scaled_font_text_to_glyphs (cairo_scaled_font_t *scaled_font, + const char *utf8, + cairo_glyph_t **glyphs, + int *num_glyphs) { -//g_warning("scaled_font_unicode_to_glyph CALL. unicode=%c", (char)unicode); - unsigned long i; - for (i=0; i < (unsigned long) this->glyphs.size(); i++){ - //TODO: compare unicode strings for ligadure glyphs (i.e. scaled_font_text_to_glyph) - if ( ((unsigned long) this->glyphs[i]->unicode[0]) == unicode){ - *glyph = i; - return CAIRO_STATUS_SUCCESS; + int count = 0; + char* _utf8 = (char*) utf8; + unsigned int len; + + while(_utf8[0] != '\0'){ + _utf8++; + count++; + } + + *glyphs = (cairo_glyph_t*) malloc(count*sizeof(cairo_glyph_t)); + + + count=0; + _utf8 = (char*) utf8; + while(_utf8[0] != '\0'){ + len = 0; + for (i=0; i < (unsigned long) this->glyphs.size(); i++){ + if ( len = compare_them(this->glyphs[i]->unicode, _utf8) ){ + (*glyphs)[count].index = i; + (*glyphs)[count].x = count; //TODO + (*glyphs)[count++].y = 0; //TODO + _utf8+=len; + continue; + } } + if (!len){ + (*glyphs)[count].index = i; + (*glyphs)[count].x = count; //TODO + (*glyphs)[count++].y = 0; //TODO + _utf8++; + } } - *glyph = i; + *num_glyphs = count; return CAIRO_STATUS_SUCCESS; } @@ -140,8 +172,6 @@ SvgFont::scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, cairo_t *cr, cairo_text_extents_t *metrics) { -//g_warning("scaled_font_render_glyph CALL. glyph=%d", (int)glyph); - if (glyph > this->glyphs.size()) return CAIRO_STATUS_SUCCESS; SPObject* node; @@ -151,7 +181,7 @@ SvgFont::scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, g_warning("RENDER MISSING-GLYPH"); } else { node = (SPObject*) this->glyphs[glyph]; - g_warning("RENDER %c", this->glyphs[glyph]->unicode[0]); + g_warning("RENDER %s", this->glyphs[glyph]->unicode); } NArtBpath *bpath = NULL; @@ -176,7 +206,7 @@ SvgFont::get_font_face(){ if (!this->userfont) { for(SPObject* node = this->font->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]); + g_warning("glyphs.push_back((SPGlyph*)node); (node->unicode='%s')", ((SPGlyph*)node)->unicode); this->glyphs.push_back((SPGlyph*)node); } if (SP_IS_MISSING_GLYPH(node)){ diff --git a/src/display/nr-svgfonts.h b/src/display/nr-svgfonts.h index 3873d2324..a0cc56ccd 100644 --- a/src/display/nr-svgfonts.h +++ b/src/display/nr-svgfonts.h @@ -40,7 +40,7 @@ public: SvgFont(SPFont* spfont); cairo_font_face_t* get_font_face(); cairo_status_t scaled_font_init (cairo_scaled_font_t *scaled_font, cairo_font_extents_t *metrics); -cairo_status_t scaled_font_unicode_to_glyph (cairo_scaled_font_t *scaled_font, unsigned long unicode, unsigned long *glyph); +cairo_status_t scaled_font_text_to_glyphs (cairo_scaled_font_t *scaled_font, const char *utf8, cairo_glyph_t **glyphs, int *num_glyphs); cairo_status_t scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, unsigned long glyph, cairo_t *cr, cairo_text_extents_t *metrics); private: -- 2.30.2